@payloadcms/drizzle 4.0.0-internal.40de3ec → 4.0.0-internal.4cbdd50
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.
- package/dist/exports/postgres.d.ts +1 -0
- package/dist/exports/postgres.d.ts.map +1 -1
- package/dist/exports/postgres.js +1 -0
- package/dist/exports/postgres.js.map +1 -1
- package/dist/exports/sqlite.d.ts +1 -0
- package/dist/exports/sqlite.d.ts.map +1 -1
- package/dist/exports/sqlite.js +1 -0
- package/dist/exports/sqlite.js.map +1 -1
- package/dist/find/traverseFields.js +0 -1
- package/dist/find/traverseFields.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/postgres/predefinedMigrations/localize-status/index.d.ts +11 -0
- package/dist/postgres/predefinedMigrations/localize-status/index.d.ts.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/index.js +296 -0
- package/dist/postgres/predefinedMigrations/localize-status/index.js.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.d.ts +13 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.d.ts.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.js +51 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.js.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.d.ts +13 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.d.ts.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.js +54 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.js.map +1 -0
- package/dist/schema/traverseFields.js.map +1 -1
- package/dist/sqlite/predefinedMigrations/localize-status/index.d.ts +28 -0
- package/dist/sqlite/predefinedMigrations/localize-status/index.d.ts.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/index.js +198 -0
- package/dist/sqlite/predefinedMigrations/localize-status/index.js.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.d.ts +12 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.d.ts.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.js +24 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.js.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.d.ts +12 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.d.ts.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.js +28 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.js.map +1 -0
- package/dist/transform/write/traverseFields.js +0 -1
- package/dist/transform/write/traverseFields.js.map +1 -1
- package/dist/types.d.ts +0 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -3
- package/dist/types.js.map +1 -1
- package/dist/upsertRow/handleUpsertError.d.ts.map +1 -1
- package/dist/upsertRow/handleUpsertError.js +2 -1
- package/dist/upsertRow/handleUpsertError.js.map +1 -1
- package/dist/upsertRow/handleUpsertError.spec.js +42 -0
- package/dist/upsertRow/handleUpsertError.spec.js.map +1 -0
- package/dist/upsertRow/index.d.ts.map +1 -1
- package/dist/upsertRow/index.js +5 -2
- package/dist/upsertRow/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/find/chainMethods.d.ts +0 -20
- package/dist/find/chainMethods.d.ts.map +0 -1
- package/dist/find/chainMethods.js +0 -16
- package/dist/find/chainMethods.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/schema/traverseFields.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport { InvalidConfiguration } from 'payload'\nimport {\n fieldAffectsData,\n fieldIsVirtual,\n fieldShouldBeLocalized,\n optionIsObject,\n} from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type {\n DrizzleAdapter,\n IDType,\n RawColumn,\n RawForeignKey,\n RawIndex,\n RawRelation,\n RelationMap,\n SetColumnID,\n} from '../types.js'\n\nimport { createTableName } from '../createTableName.js'\nimport { buildIndexName } from '../utilities/buildIndexName.js'\nimport { getArrayRelationName } from '../utilities/getArrayRelationName.js'\nimport { hasLocalesTable } from '../utilities/hasLocalesTable.js'\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport {\n InternalBlockTableNameIndex,\n setInternalBlockIndex,\n validateExistingBlockIsIdentical,\n} from '../utilities/validateExistingBlockIsIdentical.js'\nimport { buildTable } from './build.js'\nimport { idToUUID } from './idToUUID.js'\nimport { withDefault } from './withDefault.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n blocksTableNameMap: Record<string, number>\n columnPrefix?: string\n columns: Record<string, RawColumn>\n disableNotNull: boolean\n disableRelsTableUnique?: boolean\n disableUnique?: boolean\n fieldPrefix?: string\n fields: FlattenedField[]\n forceLocalized?: boolean\n indexes: Record<string, RawIndex>\n localesColumns: Record<string, RawColumn>\n localesIndexes: Record<string, RawIndex>\n newTableName: string\n parentIsLocalized: boolean\n parentTableName: string\n relationships: Set<string>\n relationsToBuild: RelationMap\n rootRelationsToBuild?: RelationMap\n rootTableIDColType: IDType\n rootTableName: string\n setColumnID: SetColumnID\n uniqueRelationships: Set<string>\n versions: boolean\n /**\n * Tracks whether or not this table is built\n * from the result of a localized array or block field at some point\n */\n withinLocalizedArrayOrBlock?: boolean\n}\n\ntype Result = {\n hasLocalizedField: boolean\n hasLocalizedManyNumberField: boolean\n hasLocalizedManyTextField: boolean\n hasLocalizedRelationshipField: boolean\n hasManyNumberField: 'index' | boolean\n hasManyTextField: 'index' | boolean\n}\n\nexport const traverseFields = ({\n adapter,\n blocksTableNameMap,\n columnPrefix,\n columns,\n disableNotNull,\n disableRelsTableUnique,\n disableUnique = false,\n fieldPrefix,\n fields,\n forceLocalized,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName,\n parentIsLocalized,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n}: Args): Result => {\n const throwValidationError = true\n let hasLocalizedField = false\n let hasLocalizedRelationshipField = false\n let hasManyTextField: 'index' | boolean = false\n let hasLocalizedManyTextField = false\n let hasManyNumberField: 'index' | boolean = false\n let hasLocalizedManyNumberField = false\n\n let parentIDColType: IDType = 'integer'\n\n const idColumn = columns.id\n\n if (idColumn && ['numeric', 'text', 'uuid', 'varchar'].includes(idColumn.type)) {\n parentIDColType = idColumn.type as IDType\n }\n\n fields.forEach((field) => {\n if ('name' in field && field.name === 'id') {\n return\n }\n if (fieldIsVirtual(field)) {\n return\n }\n\n let targetTable = columns\n let targetIndexes = indexes\n\n const columnName = `${columnPrefix || ''}${field.name[0] === '_' ? '_' : ''}${toSnakeCase(\n field.name,\n )}`\n const fieldName = `${fieldPrefix?.replace('.', '_') || ''}${field.name}`\n\n const isFieldLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n // If field is localized,\n // add the column to the locale table instead of main table\n if (\n adapter.payload.config.localization &&\n (isFieldLocalized || forceLocalized) &&\n field.type !== 'array' &&\n (field.type !== 'blocks' || adapter.blocksAsJSON) &&\n (('hasMany' in field && field.hasMany !== true) || !('hasMany' in field))\n ) {\n hasLocalizedField = true\n targetTable = localesColumns\n targetIndexes = localesIndexes\n }\n\n if (\n (field.unique || field.index || ['relationship', 'upload'].includes(field.type)) &&\n !['array', 'blocks', 'group'].includes(field.type) &&\n !('hasMany' in field && field.hasMany === true) &&\n !('relationTo' in field && Array.isArray(field.relationTo))\n ) {\n const unique = disableUnique !== true && field.unique\n if (unique) {\n const constraintValue = `${fieldPrefix || ''}${field.name}`\n if (!adapter.fieldConstraints?.[rootTableName]) {\n adapter.fieldConstraints[rootTableName] = {}\n }\n adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue\n }\n\n const indexName = buildIndexName({ name: `${newTableName}_${columnName}`, adapter })\n\n targetIndexes[indexName] = {\n name: indexName,\n on: isFieldLocalized ? [fieldName, '_locale'] : fieldName,\n unique,\n }\n }\n\n switch (field.type) {\n case 'array': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const arrayTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, RawColumn> = {\n _order: {\n name: '_order',\n type: 'integer',\n notNull: true,\n },\n _parentID: {\n name: '_parent_id',\n type: parentIDColType,\n notNull: true,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n _orderIdx: {\n name: `${arrayTableName}_order_idx`,\n on: ['_order'],\n },\n _parentIDIdx: {\n name: `${arrayTableName}_parent_id_idx`,\n on: '_parentID',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n _parentIDFk: {\n name: `${arrayTableName}_parent_id_fk`,\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: parentTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes._localeIdx = {\n name: `${arrayTableName}_locale_idx`,\n on: '_locale',\n }\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(field.flattenedFields) : field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n setColumnID,\n tableName: arrayTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n const relationName = getArrayRelationName({\n field,\n path: fieldName,\n tableName: arrayTableName,\n })\n\n relationsToBuild.set(relationName, {\n type: 'many',\n // arrays have their own localized table, independent of the base table.\n localized: false,\n target: arrayTableName,\n })\n\n const arrayRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: arrayTableName,\n },\n ],\n references: ['id'],\n relationName,\n to: parentTableName,\n },\n }\n\n if (\n hasLocalesTable({\n fields: field.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n ) {\n arrayRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: `${arrayTableName}${adapter.localesSuffix}`,\n }\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const arrayWithLocalized = localized\n ? `${arrayTableName}${adapter.localesSuffix}`\n : arrayTableName\n\n arrayRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: arrayWithLocalized,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n\n if (type === 'many') {\n arrayRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n\n adapter.rawRelations[arrayTableName] = arrayRelations\n\n break\n }\n case 'blocks': {\n if (adapter.blocksAsJSON) {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'jsonb',\n },\n field,\n )\n break\n }\n\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n ;field.blocks.forEach((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n\n let blockTableName = createTableName({\n adapter,\n config: block,\n parentTableName: rootTableName,\n prefix: `${rootTableName}_blocks_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n if (typeof blocksTableNameMap[blockTableName] === 'undefined') {\n blocksTableNameMap[blockTableName] = 1\n } else if (\n !adapter.rawTables[blockTableName] ||\n !validateExistingBlockIsIdentical({\n block,\n localized: field.localized,\n rootTableName,\n table: adapter.rawTables[blockTableName],\n tableLocales: adapter.rawTables[`${blockTableName}${adapter.localesSuffix}`],\n })\n ) {\n blocksTableNameMap[blockTableName]++\n setInternalBlockIndex(block, blocksTableNameMap[blockTableName])\n blockTableName = `${blockTableName}_${blocksTableNameMap[blockTableName]}`\n }\n let relationName = `_blocks_${block.slug}`\n if (typeof block[InternalBlockTableNameIndex] !== 'undefined') {\n relationName = `_blocks_${block.slug}_${block[InternalBlockTableNameIndex]}`\n }\n\n if (!adapter.rawTables[blockTableName]) {\n const baseColumns: Record<string, RawColumn> = {\n _order: {\n name: '_order',\n type: 'integer',\n notNull: true,\n },\n _parentID: {\n name: '_parent_id',\n type: rootTableIDColType,\n notNull: true,\n },\n _path: {\n name: '_path',\n type: 'text',\n notNull: true,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n _orderIdx: {\n name: `${blockTableName}_order_idx`,\n on: '_order',\n },\n _parentIDIdx: {\n name: `${blockTableName}_parent_id_idx`,\n on: ['_parentID'],\n },\n _pathIdx: {\n name: `${blockTableName}_path_idx`,\n on: '_path',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n _parentIdFk: {\n name: `${blockTableName}_parent_id_fk`,\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: rootTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes._localeIdx = {\n name: `${blockTableName}_locale_idx`,\n on: '_locale',\n }\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(block.flattenedFields) : block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n setColumnID,\n tableName: blockTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n const blockRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: blockTableName,\n },\n ],\n references: ['id'],\n relationName,\n to: rootTableName,\n },\n }\n\n if (\n hasLocalesTable({\n fields: block.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n ) {\n blockRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: `${blockTableName}${adapter.localesSuffix}`,\n }\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const blockWithLocalized = localized\n ? `${blockTableName}${adapter.localesSuffix}`\n : blockTableName\n\n blockRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: blockWithLocalized,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n\n if (type === 'many') {\n blockRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n\n adapter.rawRelations[blockTableName] = blockRelations\n }\n\n // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks\n rootRelationsToBuild.set(relationName, {\n type: 'many',\n // blocks are not localized on the parent table\n localized: false,\n target: blockTableName,\n })\n })\n\n break\n }\n case 'checkbox': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'boolean',\n },\n field,\n )\n\n break\n }\n\n case 'code':\n case 'email':\n case 'textarea': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'varchar',\n },\n field,\n )\n\n break\n }\n\n case 'date': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'timestamp',\n mode: 'string',\n precision: 3,\n withTimezone: true,\n },\n field,\n )\n\n break\n }\n\n case 'group':\n case 'tab': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const {\n hasLocalizedField: groupHasLocalizedField,\n hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,\n hasLocalizedManyTextField: groupHasLocalizedManyTextField,\n hasLocalizedRelationshipField: groupHasLocalizedRelationshipField,\n hasManyNumberField: groupHasManyNumberField,\n hasManyTextField: groupHasManyTextField,\n } = traverseFields({\n adapter,\n blocksTableNameMap,\n columnPrefix: `${columnName}_`,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix: `${fieldName}.`,\n fields: field.flattenedFields,\n forceLocalized: isFieldLocalized || Boolean(forceLocalized),\n indexes,\n localesColumns,\n localesIndexes,\n newTableName: `${parentTableName}_${columnName}`,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock: withinLocalizedArrayOrBlock || isFieldLocalized,\n })\n\n if (groupHasLocalizedField) {\n hasLocalizedField = true\n }\n if (groupHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (groupHasManyTextField) {\n hasManyTextField = true\n }\n if (groupHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (groupHasManyNumberField) {\n hasManyNumberField = true\n }\n if (groupHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'json':\n case 'richText': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'jsonb',\n },\n field,\n )\n\n break\n }\n\n case 'number': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyNumberField = true\n }\n\n if (field.index) {\n hasManyNumberField = 'index'\n } else if (!hasManyNumberField) {\n hasManyNumberField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany number fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'numeric',\n },\n field,\n )\n }\n\n break\n }\n\n case 'point': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'geometry',\n },\n field,\n )\n\n break\n }\n\n case 'radio':\n case 'select': {\n const enumName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n })\n\n const options = field.options.map((option) => {\n if (optionIsObject(option)) {\n return option.value\n }\n\n return option\n })\n\n if (field.type === 'select' && field.hasMany) {\n const selectTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, RawColumn> = {\n order: {\n name: 'order',\n type: 'integer',\n notNull: true,\n },\n parent: {\n name: 'parent_id',\n type: parentIDColType,\n notNull: true,\n },\n value: {\n name: 'value',\n type: 'enum',\n enumName: createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n }),\n options,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n orderIdx: {\n name: `${selectTableName}_order_idx`,\n on: 'order',\n },\n parentIdx: {\n name: `${selectTableName}_parent_idx`,\n on: 'parent',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n parentFk: {\n name: `${selectTableName}_parent_fk`,\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: parentTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes.localeIdx = {\n name: `${selectTableName}_locale_idx`,\n on: 'locale',\n }\n }\n\n if (field.index) {\n baseIndexes.value = {\n name: `${selectTableName}_value_idx`,\n on: 'value',\n }\n }\n\n buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull,\n disableUnique,\n fields: [],\n parentIsLocalized: parentIsLocalized || field.localized,\n rootTableName,\n setColumnID,\n tableName: selectTableName,\n versions,\n })\n\n relationsToBuild.set(fieldName, {\n type: 'many',\n // selects have their own localized table, independent of the base table.\n localized: false,\n target: selectTableName,\n })\n\n adapter.rawRelations[selectTableName] = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: selectTableName,\n },\n ],\n references: ['id'],\n relationName: fieldName,\n to: parentTableName,\n },\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'enum',\n enumName,\n options,\n },\n field,\n )\n }\n break\n }\n\n case 'relationship':\n case 'upload':\n if (Array.isArray(field.relationTo)) {\n field.relationTo.forEach((relation) => {\n relationships.add(relation)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(relation)\n }\n })\n } else if (field.hasMany) {\n relationships.add(field.relationTo)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(field.relationTo)\n }\n } else {\n // simple relationships get a column on the targetTable with a foreign key to the relationTo table\n const relationshipConfig = adapter.payload.collections[field.relationTo].config\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo))\n\n // get the id type of the related collection\n let colType: IDType = isUUIDType(adapter.idType) ? 'uuid' : 'integer'\n const relatedCollectionCustomID = relationshipConfig.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n if (relatedCollectionCustomID?.type === 'number') {\n colType = 'numeric'\n }\n if (relatedCollectionCustomID?.type === 'text') {\n colType = 'varchar'\n }\n\n // make the foreign key column for relationship using the correct id column type\n targetTable[fieldName] = {\n name: `${columnName}_id`,\n type: colType,\n reference: {\n name: 'id',\n onDelete: 'set null',\n table: tableName,\n },\n }\n\n // add relationship to table\n relationsToBuild.set(fieldName, {\n type: 'one',\n localized: adapter.payload.config.localization && (isFieldLocalized || forceLocalized),\n target: tableName,\n })\n\n // add notNull when not required\n if (!disableNotNull && field.required && !field.admin?.condition) {\n targetTable[fieldName].notNull = true\n }\n break\n }\n\n if (\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n ) {\n hasLocalizedRelationshipField = true\n }\n\n break\n\n case 'text': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyTextField = true\n }\n\n if (field.index) {\n hasManyTextField = 'index'\n } else if (!hasManyTextField) {\n hasManyTextField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany text fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'varchar',\n },\n field,\n )\n }\n break\n }\n\n default:\n break\n }\n\n const condition = field.admin && field.admin.condition\n\n if (\n !disableNotNull &&\n targetTable[fieldName] &&\n 'required' in field &&\n field.required &&\n !condition\n ) {\n targetTable[fieldName].notNull = true\n }\n })\n\n return {\n hasLocalizedField,\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n }\n}\n"],"names":["InvalidConfiguration","fieldAffectsData","fieldIsVirtual","fieldShouldBeLocalized","optionIsObject","toSnakeCase","createTableName","buildIndexName","getArrayRelationName","hasLocalesTable","isUUIDType","InternalBlockTableNameIndex","setInternalBlockIndex","validateExistingBlockIsIdentical","buildTable","idToUUID","withDefault","traverseFields","adapter","blocksTableNameMap","columnPrefix","columns","disableNotNull","disableRelsTableUnique","disableUnique","fieldPrefix","fields","forceLocalized","indexes","localesColumns","localesIndexes","newTableName","parentIsLocalized","parentTableName","relationships","relationsToBuild","rootRelationsToBuild","rootTableIDColType","rootTableName","setColumnID","uniqueRelationships","versions","withinLocalizedArrayOrBlock","throwValidationError","hasLocalizedField","hasLocalizedRelationshipField","hasManyTextField","hasLocalizedManyTextField","hasManyNumberField","hasLocalizedManyNumberField","parentIDColType","idColumn","id","includes","type","forEach","field","name","targetTable","targetIndexes","columnName","fieldName","replace","isFieldLocalized","payload","config","localization","blocksAsJSON","hasMany","unique","index","Array","isArray","relationTo","constraintValue","fieldConstraints","indexName","on","disableNotNullFromHere","Boolean","admin","condition","arrayTableName","prefix","versionsCustomName","baseColumns","_order","notNull","_parentID","baseIndexes","_orderIdx","_parentIDIdx","baseForeignKeys","_parentIDFk","foreignColumns","table","onDelete","isLocalized","_locale","locale","_localeIdx","subHasLocalizedManyNumberField","subHasLocalizedManyTextField","subHasLocalizedRelationshipField","subHasManyNumberField","subHasManyTextField","subRelationsToBuild","flattenedFields","localized","rootRelationships","rootUniqueRelationships","tableName","relationName","path","set","target","arrayRelations","references","to","_locales","localesSuffix","key","arrayWithLocalized","rawRelations","blocks","_block","block","blockTableName","rawTables","tableLocales","slug","_path","_pathIdx","_parentIdFk","blockRelations","blockWithLocalized","mode","precision","withTimezone","groupHasLocalizedField","groupHasLocalizedManyNumberField","groupHasLocalizedManyTextField","groupHasLocalizedRelationshipField","groupHasManyNumberField","groupHasManyTextField","enumName","options","map","option","value","selectTableName","order","parent","orderIdx","parentIdx","parentFk","localeIdx","relation","add","relationshipConfig","collections","tableNameMap","get","colType","idType","relatedCollectionCustomID","find","reference","required"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/schema/traverseFields.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport { InvalidConfiguration } from 'payload'\nimport {\n fieldAffectsData,\n fieldIsVirtual,\n fieldShouldBeLocalized,\n optionIsObject,\n} from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type {\n DrizzleAdapter,\n IDType,\n RawColumn,\n RawForeignKey,\n RawIndex,\n RawRelation,\n RelationMap,\n SetColumnID,\n} from '../types.js'\n\nimport { createTableName } from '../createTableName.js'\nimport { buildIndexName } from '../utilities/buildIndexName.js'\nimport { getArrayRelationName } from '../utilities/getArrayRelationName.js'\nimport { hasLocalesTable } from '../utilities/hasLocalesTable.js'\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport {\n InternalBlockTableNameIndex,\n setInternalBlockIndex,\n validateExistingBlockIsIdentical,\n} from '../utilities/validateExistingBlockIsIdentical.js'\nimport { buildTable } from './build.js'\nimport { idToUUID } from './idToUUID.js'\nimport { withDefault } from './withDefault.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n blocksTableNameMap: Record<string, number>\n columnPrefix?: string\n columns: Record<string, RawColumn>\n disableNotNull: boolean\n disableRelsTableUnique?: boolean\n disableUnique?: boolean\n fieldPrefix?: string\n fields: FlattenedField[]\n forceLocalized?: boolean\n indexes: Record<string, RawIndex>\n localesColumns: Record<string, RawColumn>\n localesIndexes: Record<string, RawIndex>\n newTableName: string\n parentIsLocalized: boolean\n parentTableName: string\n relationships: Set<string>\n relationsToBuild: RelationMap\n rootRelationsToBuild?: RelationMap\n rootTableIDColType: IDType\n rootTableName: string\n setColumnID: SetColumnID\n uniqueRelationships: Set<string>\n versions: boolean\n /**\n * Tracks whether or not this table is built\n * from the result of a localized array or block field at some point\n */\n withinLocalizedArrayOrBlock?: boolean\n}\n\ntype Result = {\n hasLocalizedField: boolean\n hasLocalizedManyNumberField: boolean\n hasLocalizedManyTextField: boolean\n hasLocalizedRelationshipField: boolean\n hasManyNumberField: 'index' | boolean\n hasManyTextField: 'index' | boolean\n}\n\nexport const traverseFields = ({\n adapter,\n blocksTableNameMap,\n columnPrefix,\n columns,\n disableNotNull,\n disableRelsTableUnique,\n disableUnique = false,\n fieldPrefix,\n fields,\n forceLocalized,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName,\n parentIsLocalized,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n}: Args): Result => {\n const throwValidationError = true\n let hasLocalizedField = false\n let hasLocalizedRelationshipField = false\n let hasManyTextField: 'index' | boolean = false\n let hasLocalizedManyTextField = false\n let hasManyNumberField: 'index' | boolean = false\n let hasLocalizedManyNumberField = false\n\n let parentIDColType: IDType = 'integer'\n\n const idColumn = columns.id\n\n if (idColumn && ['numeric', 'text', 'uuid', 'varchar'].includes(idColumn.type)) {\n parentIDColType = idColumn.type as IDType\n }\n\n fields.forEach((field) => {\n if ('name' in field && field.name === 'id') {\n return\n }\n if (fieldIsVirtual(field)) {\n return\n }\n\n let targetTable = columns\n let targetIndexes = indexes\n\n const columnName = `${columnPrefix || ''}${field.name[0] === '_' ? '_' : ''}${toSnakeCase(\n field.name,\n )}`\n const fieldName = `${fieldPrefix?.replace('.', '_') || ''}${field.name}`\n\n const isFieldLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n // If field is localized,\n // add the column to the locale table instead of main table\n if (\n adapter.payload.config.localization &&\n (isFieldLocalized || forceLocalized) &&\n field.type !== 'array' &&\n (field.type !== 'blocks' || adapter.blocksAsJSON) &&\n (('hasMany' in field && field.hasMany !== true) || !('hasMany' in field))\n ) {\n hasLocalizedField = true\n targetTable = localesColumns\n targetIndexes = localesIndexes\n }\n\n if (\n (field.unique || field.index || ['relationship', 'upload'].includes(field.type)) &&\n !['array', 'blocks', 'group'].includes(field.type) &&\n !('hasMany' in field && field.hasMany === true) &&\n !('relationTo' in field && Array.isArray(field.relationTo))\n ) {\n const unique = disableUnique !== true && field.unique\n if (unique) {\n const constraintValue = `${fieldPrefix || ''}${field.name}`\n if (!adapter.fieldConstraints?.[rootTableName]) {\n adapter.fieldConstraints[rootTableName] = {}\n }\n adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue\n }\n\n const indexName = buildIndexName({ name: `${newTableName}_${columnName}`, adapter })\n\n targetIndexes[indexName] = {\n name: indexName,\n on: isFieldLocalized ? [fieldName, '_locale'] : fieldName,\n unique,\n }\n }\n\n switch (field.type) {\n case 'array': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const arrayTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, RawColumn> = {\n _order: {\n name: '_order',\n type: 'integer',\n notNull: true,\n },\n _parentID: {\n name: '_parent_id',\n type: parentIDColType,\n notNull: true,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n _orderIdx: {\n name: `${arrayTableName}_order_idx`,\n on: ['_order'],\n },\n _parentIDIdx: {\n name: `${arrayTableName}_parent_id_idx`,\n on: '_parentID',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n _parentIDFk: {\n name: `${arrayTableName}_parent_id_fk`,\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: parentTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes._localeIdx = {\n name: `${arrayTableName}_locale_idx`,\n on: '_locale',\n }\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(field.flattenedFields) : field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n setColumnID,\n tableName: arrayTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n const relationName = getArrayRelationName({\n field,\n path: fieldName,\n tableName: arrayTableName,\n })\n\n relationsToBuild.set(relationName, {\n type: 'many',\n // arrays have their own localized table, independent of the base table.\n localized: false,\n target: arrayTableName,\n })\n\n const arrayRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: arrayTableName,\n },\n ],\n references: ['id'],\n relationName,\n to: parentTableName,\n },\n }\n\n if (\n hasLocalesTable({\n fields: field.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n ) {\n arrayRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: `${arrayTableName}${adapter.localesSuffix}`,\n }\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const arrayWithLocalized = localized\n ? `${arrayTableName}${adapter.localesSuffix}`\n : arrayTableName\n\n arrayRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: arrayWithLocalized,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n\n if (type === 'many') {\n arrayRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n\n adapter.rawRelations[arrayTableName] = arrayRelations\n\n break\n }\n case 'blocks': {\n if (adapter.blocksAsJSON) {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'jsonb',\n },\n field,\n )\n break\n }\n\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n field.blocks.forEach((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n\n let blockTableName = createTableName({\n adapter,\n config: block,\n parentTableName: rootTableName,\n prefix: `${rootTableName}_blocks_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n if (typeof blocksTableNameMap[blockTableName] === 'undefined') {\n blocksTableNameMap[blockTableName] = 1\n } else if (\n !adapter.rawTables[blockTableName] ||\n !validateExistingBlockIsIdentical({\n block,\n localized: field.localized,\n rootTableName,\n table: adapter.rawTables[blockTableName],\n tableLocales: adapter.rawTables[`${blockTableName}${adapter.localesSuffix}`],\n })\n ) {\n blocksTableNameMap[blockTableName]++\n setInternalBlockIndex(block, blocksTableNameMap[blockTableName])\n blockTableName = `${blockTableName}_${blocksTableNameMap[blockTableName]}`\n }\n let relationName = `_blocks_${block.slug}`\n if (typeof block[InternalBlockTableNameIndex] !== 'undefined') {\n relationName = `_blocks_${block.slug}_${block[InternalBlockTableNameIndex]}`\n }\n\n if (!adapter.rawTables[blockTableName]) {\n const baseColumns: Record<string, RawColumn> = {\n _order: {\n name: '_order',\n type: 'integer',\n notNull: true,\n },\n _parentID: {\n name: '_parent_id',\n type: rootTableIDColType,\n notNull: true,\n },\n _path: {\n name: '_path',\n type: 'text',\n notNull: true,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n _orderIdx: {\n name: `${blockTableName}_order_idx`,\n on: '_order',\n },\n _parentIDIdx: {\n name: `${blockTableName}_parent_id_idx`,\n on: ['_parentID'],\n },\n _pathIdx: {\n name: `${blockTableName}_path_idx`,\n on: '_path',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n _parentIdFk: {\n name: `${blockTableName}_parent_id_fk`,\n columns: ['_parentID'],\n foreignColumns: [\n {\n name: 'id',\n table: rootTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns._locale = {\n name: '_locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes._localeIdx = {\n name: `${blockTableName}_locale_idx`,\n on: '_locale',\n }\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(block.flattenedFields) : block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n setColumnID,\n tableName: blockTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n const blockRelations: Record<string, RawRelation> = {\n _parentID: {\n type: 'one',\n fields: [\n {\n name: '_parentID',\n table: blockTableName,\n },\n ],\n references: ['id'],\n relationName,\n to: rootTableName,\n },\n }\n\n if (\n hasLocalesTable({\n fields: block.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n ) {\n blockRelations._locales = {\n type: 'many',\n relationName: '_locales',\n to: `${blockTableName}${adapter.localesSuffix}`,\n }\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const blockWithLocalized = localized\n ? `${blockTableName}${adapter.localesSuffix}`\n : blockTableName\n\n blockRelations[key] = {\n type: 'one',\n fields: [\n {\n name: key,\n table: blockWithLocalized,\n },\n ],\n references: ['id'],\n relationName: key,\n to: target,\n }\n }\n\n if (type === 'many') {\n blockRelations[key] = {\n type: 'many',\n relationName: key,\n to: target,\n }\n }\n })\n\n adapter.rawRelations[blockTableName] = blockRelations\n }\n\n // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks\n rootRelationsToBuild.set(relationName, {\n type: 'many',\n // blocks are not localized on the parent table\n localized: false,\n target: blockTableName,\n })\n })\n\n break\n }\n case 'checkbox': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'boolean',\n },\n field,\n )\n\n break\n }\n\n case 'code':\n case 'email':\n case 'textarea': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'varchar',\n },\n field,\n )\n\n break\n }\n\n case 'date': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'timestamp',\n mode: 'string',\n precision: 3,\n withTimezone: true,\n },\n field,\n )\n\n break\n }\n\n case 'group':\n case 'tab': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const {\n hasLocalizedField: groupHasLocalizedField,\n hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,\n hasLocalizedManyTextField: groupHasLocalizedManyTextField,\n hasLocalizedRelationshipField: groupHasLocalizedRelationshipField,\n hasManyNumberField: groupHasManyNumberField,\n hasManyTextField: groupHasManyTextField,\n } = traverseFields({\n adapter,\n blocksTableNameMap,\n columnPrefix: `${columnName}_`,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix: `${fieldName}.`,\n fields: field.flattenedFields,\n forceLocalized: isFieldLocalized || Boolean(forceLocalized),\n indexes,\n localesColumns,\n localesIndexes,\n newTableName: `${parentTableName}_${columnName}`,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n setColumnID,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock: withinLocalizedArrayOrBlock || isFieldLocalized,\n })\n\n if (groupHasLocalizedField) {\n hasLocalizedField = true\n }\n if (groupHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (groupHasManyTextField) {\n hasManyTextField = true\n }\n if (groupHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (groupHasManyNumberField) {\n hasManyNumberField = true\n }\n if (groupHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'json':\n case 'richText': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'jsonb',\n },\n field,\n )\n\n break\n }\n\n case 'number': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyNumberField = true\n }\n\n if (field.index) {\n hasManyNumberField = 'index'\n } else if (!hasManyNumberField) {\n hasManyNumberField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany number fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'numeric',\n },\n field,\n )\n }\n\n break\n }\n\n case 'point': {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'geometry',\n },\n field,\n )\n\n break\n }\n\n case 'radio':\n case 'select': {\n const enumName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n })\n\n const options = field.options.map((option) => {\n if (optionIsObject(option)) {\n return option.value\n }\n\n return option\n })\n\n if (field.type === 'select' && field.hasMany) {\n const selectTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, RawColumn> = {\n order: {\n name: 'order',\n type: 'integer',\n notNull: true,\n },\n parent: {\n name: 'parent_id',\n type: parentIDColType,\n notNull: true,\n },\n value: {\n name: 'value',\n type: 'enum',\n enumName: createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n }),\n options,\n },\n }\n\n const baseIndexes: Record<string, RawIndex> = {\n orderIdx: {\n name: `${selectTableName}_order_idx`,\n on: 'order',\n },\n parentIdx: {\n name: `${selectTableName}_parent_idx`,\n on: 'parent',\n },\n }\n\n const baseForeignKeys: Record<string, RawForeignKey> = {\n parentFk: {\n name: `${selectTableName}_parent_fk`,\n columns: ['parent'],\n foreignColumns: [\n {\n name: 'id',\n table: parentTableName,\n },\n ],\n onDelete: 'cascade',\n },\n }\n\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns.locale = {\n name: 'locale',\n type: 'enum',\n locale: true,\n notNull: true,\n }\n\n baseIndexes.localeIdx = {\n name: `${selectTableName}_locale_idx`,\n on: 'locale',\n }\n }\n\n if (field.index) {\n baseIndexes.value = {\n name: `${selectTableName}_value_idx`,\n on: 'value',\n }\n }\n\n buildTable({\n adapter,\n baseColumns,\n baseForeignKeys,\n baseIndexes,\n blocksTableNameMap,\n disableNotNull,\n disableUnique,\n fields: [],\n parentIsLocalized: parentIsLocalized || field.localized,\n rootTableName,\n setColumnID,\n tableName: selectTableName,\n versions,\n })\n\n relationsToBuild.set(fieldName, {\n type: 'many',\n // selects have their own localized table, independent of the base table.\n localized: false,\n target: selectTableName,\n })\n\n adapter.rawRelations[selectTableName] = {\n parent: {\n type: 'one',\n fields: [\n {\n name: 'parent',\n table: selectTableName,\n },\n ],\n references: ['id'],\n relationName: fieldName,\n to: parentTableName,\n },\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'enum',\n enumName,\n options,\n },\n field,\n )\n }\n break\n }\n\n case 'relationship':\n case 'upload':\n if (Array.isArray(field.relationTo)) {\n field.relationTo.forEach((relation) => {\n relationships.add(relation)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(relation)\n }\n })\n } else if (field.hasMany) {\n relationships.add(field.relationTo)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(field.relationTo)\n }\n } else {\n // simple relationships get a column on the targetTable with a foreign key to the relationTo table\n const relationshipConfig = adapter.payload.collections[field.relationTo].config\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo))\n\n // get the id type of the related collection\n let colType: IDType = isUUIDType(adapter.idType) ? 'uuid' : 'integer'\n const relatedCollectionCustomID = relationshipConfig.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n if (relatedCollectionCustomID?.type === 'number') {\n colType = 'numeric'\n }\n if (relatedCollectionCustomID?.type === 'text') {\n colType = 'varchar'\n }\n\n // make the foreign key column for relationship using the correct id column type\n targetTable[fieldName] = {\n name: `${columnName}_id`,\n type: colType,\n reference: {\n name: 'id',\n onDelete: 'set null',\n table: tableName,\n },\n }\n\n // add relationship to table\n relationsToBuild.set(fieldName, {\n type: 'one',\n localized: adapter.payload.config.localization && (isFieldLocalized || forceLocalized),\n target: tableName,\n })\n\n // add notNull when not required\n if (!disableNotNull && field.required && !field.admin?.condition) {\n targetTable[fieldName].notNull = true\n }\n break\n }\n\n if (\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n ) {\n hasLocalizedRelationshipField = true\n }\n\n break\n\n case 'text': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(isFieldLocalized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyTextField = true\n }\n\n if (field.index) {\n hasManyTextField = 'index'\n } else if (!hasManyTextField) {\n hasManyTextField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany text fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(\n {\n name: columnName,\n type: 'varchar',\n },\n field,\n )\n }\n break\n }\n\n default:\n break\n }\n\n const condition = field.admin && field.admin.condition\n\n if (\n !disableNotNull &&\n targetTable[fieldName] &&\n 'required' in field &&\n field.required &&\n !condition\n ) {\n targetTable[fieldName].notNull = true\n }\n })\n\n return {\n hasLocalizedField,\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n }\n}\n"],"names":["InvalidConfiguration","fieldAffectsData","fieldIsVirtual","fieldShouldBeLocalized","optionIsObject","toSnakeCase","createTableName","buildIndexName","getArrayRelationName","hasLocalesTable","isUUIDType","InternalBlockTableNameIndex","setInternalBlockIndex","validateExistingBlockIsIdentical","buildTable","idToUUID","withDefault","traverseFields","adapter","blocksTableNameMap","columnPrefix","columns","disableNotNull","disableRelsTableUnique","disableUnique","fieldPrefix","fields","forceLocalized","indexes","localesColumns","localesIndexes","newTableName","parentIsLocalized","parentTableName","relationships","relationsToBuild","rootRelationsToBuild","rootTableIDColType","rootTableName","setColumnID","uniqueRelationships","versions","withinLocalizedArrayOrBlock","throwValidationError","hasLocalizedField","hasLocalizedRelationshipField","hasManyTextField","hasLocalizedManyTextField","hasManyNumberField","hasLocalizedManyNumberField","parentIDColType","idColumn","id","includes","type","forEach","field","name","targetTable","targetIndexes","columnName","fieldName","replace","isFieldLocalized","payload","config","localization","blocksAsJSON","hasMany","unique","index","Array","isArray","relationTo","constraintValue","fieldConstraints","indexName","on","disableNotNullFromHere","Boolean","admin","condition","arrayTableName","prefix","versionsCustomName","baseColumns","_order","notNull","_parentID","baseIndexes","_orderIdx","_parentIDIdx","baseForeignKeys","_parentIDFk","foreignColumns","table","onDelete","isLocalized","_locale","locale","_localeIdx","subHasLocalizedManyNumberField","subHasLocalizedManyTextField","subHasLocalizedRelationshipField","subHasManyNumberField","subHasManyTextField","subRelationsToBuild","flattenedFields","localized","rootRelationships","rootUniqueRelationships","tableName","relationName","path","set","target","arrayRelations","references","to","_locales","localesSuffix","key","arrayWithLocalized","rawRelations","blocks","_block","block","blockTableName","rawTables","tableLocales","slug","_path","_pathIdx","_parentIdFk","blockRelations","blockWithLocalized","mode","precision","withTimezone","groupHasLocalizedField","groupHasLocalizedManyNumberField","groupHasLocalizedManyTextField","groupHasLocalizedRelationshipField","groupHasManyNumberField","groupHasManyTextField","enumName","options","map","option","value","selectTableName","order","parent","orderIdx","parentIdx","parentFk","localeIdx","relation","add","relationshipConfig","collections","tableNameMap","get","colType","idType","relatedCollectionCustomID","find","reference","required"],"mappings":"AAEA,SAASA,oBAAoB,QAAQ,UAAS;AAC9C,SACEC,gBAAgB,EAChBC,cAAc,EACdC,sBAAsB,EACtBC,cAAc,QACT,iBAAgB;AACvB,OAAOC,iBAAiB,gBAAe;AAavC,SAASC,eAAe,QAAQ,wBAAuB;AACvD,SAASC,cAAc,QAAQ,iCAAgC;AAC/D,SAASC,oBAAoB,QAAQ,uCAAsC;AAC3E,SAASC,eAAe,QAAQ,kCAAiC;AACjE,SAASC,UAAU,QAAQ,6BAA4B;AACvD,SACEC,2BAA2B,EAC3BC,qBAAqB,EACrBC,gCAAgC,QAC3B,mDAAkD;AACzD,SAASC,UAAU,QAAQ,aAAY;AACvC,SAASC,QAAQ,QAAQ,gBAAe;AACxC,SAASC,WAAW,QAAQ,mBAAkB;AA2C9C,OAAO,MAAMC,iBAAiB,CAAC,EAC7BC,OAAO,EACPC,kBAAkB,EAClBC,YAAY,EACZC,OAAO,EACPC,cAAc,EACdC,sBAAsB,EACtBC,gBAAgB,KAAK,EACrBC,WAAW,EACXC,MAAM,EACNC,cAAc,EACdC,OAAO,EACPC,cAAc,EACdC,cAAc,EACdC,YAAY,EACZC,iBAAiB,EACjBC,eAAe,EACfC,aAAa,EACbC,gBAAgB,EAChBC,oBAAoB,EACpBC,kBAAkB,EAClBC,aAAa,EACbC,WAAW,EACXC,mBAAmB,EACnBC,QAAQ,EACRC,2BAA2B,EACtB;IACL,MAAMC,uBAAuB;IAC7B,IAAIC,oBAAoB;IACxB,IAAIC,gCAAgC;IACpC,IAAIC,mBAAsC;IAC1C,IAAIC,4BAA4B;IAChC,IAAIC,qBAAwC;IAC5C,IAAIC,8BAA8B;IAElC,IAAIC,kBAA0B;IAE9B,MAAMC,WAAW9B,QAAQ+B,EAAE;IAE3B,IAAID,YAAY;QAAC;QAAW;QAAQ;QAAQ;KAAU,CAACE,QAAQ,CAACF,SAASG,IAAI,GAAG;QAC9EJ,kBAAkBC,SAASG,IAAI;IACjC;IAEA5B,OAAO6B,OAAO,CAAC,CAACC;QACd,IAAI,UAAUA,SAASA,MAAMC,IAAI,KAAK,MAAM;YAC1C;QACF;QACA,IAAIvD,eAAesD,QAAQ;YACzB;QACF;QAEA,IAAIE,cAAcrC;QAClB,IAAIsC,gBAAgB/B;QAEpB,MAAMgC,aAAa,GAAGxC,gBAAgB,KAAKoC,MAAMC,IAAI,CAAC,EAAE,KAAK,MAAM,MAAM,KAAKpD,YAC5EmD,MAAMC,IAAI,GACT;QACH,MAAMI,YAAY,GAAGpC,aAAaqC,QAAQ,KAAK,QAAQ,KAAKN,MAAMC,IAAI,EAAE;QAExE,MAAMM,mBAAmB5D,uBAAuB;YAAEqD;YAAOxB;QAAkB;QAE3E,yBAAyB;QACzB,2DAA2D;QAC3D,IACEd,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,IAClCH,CAAAA,oBAAoBpC,cAAa,KAClC6B,MAAMF,IAAI,KAAK,WACdE,CAAAA,MAAMF,IAAI,KAAK,YAAYpC,QAAQiD,YAAY,AAAD,KAC9C,CAAA,AAAC,aAAaX,SAASA,MAAMY,OAAO,KAAK,QAAS,CAAE,CAAA,aAAaZ,KAAI,CAAC,GACvE;YACAZ,oBAAoB;YACpBc,cAAc7B;YACd8B,gBAAgB7B;QAClB;QAEA,IACE,AAAC0B,CAAAA,MAAMa,MAAM,IAAIb,MAAMc,KAAK,IAAI;YAAC;YAAgB;SAAS,CAACjB,QAAQ,CAACG,MAAMF,IAAI,CAAA,KAC9E,CAAC;YAAC;YAAS;YAAU;SAAQ,CAACD,QAAQ,CAACG,MAAMF,IAAI,KACjD,CAAE,CAAA,aAAaE,SAASA,MAAMY,OAAO,KAAK,IAAG,KAC7C,CAAE,CAAA,gBAAgBZ,SAASe,MAAMC,OAAO,CAAChB,MAAMiB,UAAU,CAAA,GACzD;YACA,MAAMJ,SAAS7C,kBAAkB,QAAQgC,MAAMa,MAAM;YACrD,IAAIA,QAAQ;gBACV,MAAMK,kBAAkB,GAAGjD,eAAe,KAAK+B,MAAMC,IAAI,EAAE;gBAC3D,IAAI,CAACvC,QAAQyD,gBAAgB,EAAE,CAACrC,cAAc,EAAE;oBAC9CpB,QAAQyD,gBAAgB,CAACrC,cAAc,GAAG,CAAC;gBAC7C;gBACApB,QAAQyD,gBAAgB,CAACrC,cAAc,CAAC,GAAGsB,WAAW,IAAI,CAAC,CAAC,GAAGc;YACjE;YAEA,MAAME,YAAYrE,eAAe;gBAAEkD,MAAM,GAAG1B,aAAa,CAAC,EAAE6B,YAAY;gBAAE1C;YAAQ;YAElFyC,aAAa,CAACiB,UAAU,GAAG;gBACzBnB,MAAMmB;gBACNC,IAAId,mBAAmB;oBAACF;oBAAW;iBAAU,GAAGA;gBAChDQ;YACF;QACF;QAEA,OAAQb,MAAMF,IAAI;YAChB,KAAK;gBAAS;oBACZ,MAAMwB,yBAAyBC,QAAQvB,MAAMwB,KAAK,EAAEC,cAAc3D;oBAElE,MAAM4D,iBAAiB5E,gBAAgB;wBACrCY;wBACA+C,QAAQT;wBACRvB,iBAAiBF;wBACjBoD,QAAQ,GAAGpD,aAAa,CAAC,CAAC;wBAC1BY;wBACAyC,oBAAoB3C;oBACtB;oBAEA,MAAM4C,cAAyC;wBAC7CC,QAAQ;4BACN7B,MAAM;4BACNH,MAAM;4BACNiC,SAAS;wBACX;wBACAC,WAAW;4BACT/B,MAAM;4BACNH,MAAMJ;4BACNqC,SAAS;wBACX;oBACF;oBAEA,MAAME,cAAwC;wBAC5CC,WAAW;4BACTjC,MAAM,GAAGyB,eAAe,UAAU,CAAC;4BACnCL,IAAI;gCAAC;6BAAS;wBAChB;wBACAc,cAAc;4BACZlC,MAAM,GAAGyB,eAAe,cAAc,CAAC;4BACvCL,IAAI;wBACN;oBACF;oBAEA,MAAMe,kBAAiD;wBACrDC,aAAa;4BACXpC,MAAM,GAAGyB,eAAe,aAAa,CAAC;4BACtC7D,SAAS;gCAAC;6BAAY;4BACtByE,gBAAgB;gCACd;oCACErC,MAAM;oCACNsC,OAAO9D;gCACT;6BACD;4BACD+D,UAAU;wBACZ;oBACF;oBAEA,MAAMC,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;oBAEF,IAAIsE,aAAa;wBACfZ,YAAYa,OAAO,GAAG;4BACpBzC,MAAM;4BACNH,MAAM;4BACN6C,QAAQ;4BACRZ,SAAS;wBACX;wBAEAE,YAAYW,UAAU,GAAG;4BACvB3C,MAAM,GAAGyB,eAAe,WAAW,CAAC;4BACpCL,IAAI;wBACN;oBACF;oBAEA,MAAM,EACJ5B,6BAA6BoD,8BAA8B,EAC3DtD,2BAA2BuD,4BAA4B,EACvDzD,+BAA+B0D,gCAAgC,EAC/DvD,oBAAoBwD,qBAAqB,EACzC1D,kBAAkB2D,mBAAmB,EACrCtE,kBAAkBuE,mBAAmB,EACtC,GAAG5F,WAAW;wBACbI;wBACAmE;wBACAO;wBACAH;wBACAtE;wBACAG,gBAAgBwD;wBAChBvD,wBAAwB;wBACxBC;wBACAE,QAAQF,gBAAgBT,SAASyC,MAAMmD,eAAe,IAAInD,MAAMmD,eAAe;wBAC/E3E,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;wBACvDC,mBAAmB3E;wBACnBE;wBACAC;wBACAC;wBACAwE,yBAAyBtE;wBACzBD;wBACAwE,WAAW7B;wBACXzC;wBACAC,6BAA6BuD;oBAC/B;oBAEA,IAAII,gCAAgC;wBAClCpD,8BAA8BoD;oBAChC;oBAEA,IAAIE,kCAAkC;wBACpC1D,gCAAgC0D;oBAClC;oBAEA,IAAID,8BAA8B;wBAChCvD,4BAA4BuD;oBAC9B;oBAEA,IAAIG,qBAAqB;wBACvB,IAAI,CAAC3D,oBAAoB2D,wBAAwB,SAAS;4BACxD3D,mBAAmB2D;wBACrB;oBACF;oBACA,IAAID,uBAAuB;wBACzB,IAAI,CAACxD,sBAAsBwD,0BAA0B,SAAS;4BAC5DxD,qBAAqBwD;wBACvB;oBACF;oBAEA,MAAMQ,eAAexG,qBAAqB;wBACxCgD;wBACAyD,MAAMpD;wBACNkD,WAAW7B;oBACb;oBAEA/C,iBAAiB+E,GAAG,CAACF,cAAc;wBACjC1D,MAAM;wBACN,wEAAwE;wBACxEsD,WAAW;wBACXO,QAAQjC;oBACV;oBAEA,MAAMkC,iBAA8C;wBAClD5B,WAAW;4BACTlC,MAAM;4BACN5B,QAAQ;gCACN;oCACE+B,MAAM;oCACNsC,OAAOb;gCACT;6BACD;4BACDmC,YAAY;gCAAC;6BAAK;4BAClBL;4BACAM,IAAIrF;wBACN;oBACF;oBAEA,IACExB,gBAAgB;wBACdiB,QAAQ8B,MAAM9B,MAAM;wBACpBM,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;oBACzD,IACA;wBACAQ,eAAeG,QAAQ,GAAG;4BACxBjE,MAAM;4BACN0D,cAAc;4BACdM,IAAI,GAAGpC,iBAAiBhE,QAAQsG,aAAa,EAAE;wBACjD;oBACF;oBAEAd,oBAAoBnD,OAAO,CAAC,CAAC,EAAED,IAAI,EAAEsD,SAAS,EAAEO,MAAM,EAAE,EAAEM;wBACxD,IAAInE,SAAS,OAAO;4BAClB,MAAMoE,qBAAqBd,YACvB,GAAG1B,iBAAiBhE,QAAQsG,aAAa,EAAE,GAC3CtC;4BAEJkC,cAAc,CAACK,IAAI,GAAG;gCACpBnE,MAAM;gCACN5B,QAAQ;oCACN;wCACE+B,MAAMgE;wCACN1B,OAAO2B;oCACT;iCACD;gCACDL,YAAY;oCAAC;iCAAK;gCAClBL,cAAcS;gCACdH,IAAIH;4BACN;wBACF;wBAEA,IAAI7D,SAAS,QAAQ;4BACnB8D,cAAc,CAACK,IAAI,GAAG;gCACpBnE,MAAM;gCACN0D,cAAcS;gCACdH,IAAIH;4BACN;wBACF;oBACF;oBAEAjG,QAAQyG,YAAY,CAACzC,eAAe,GAAGkC;oBAEvC;gBACF;YACA,KAAK;gBAAU;oBACb,IAAIlG,QAAQiD,YAAY,EAAE;wBACxBT,WAAW,CAACG,UAAU,GAAG7C,YACvB;4BACEyC,MAAMG;4BACNN,MAAM;wBACR,GACAE;wBAEF;oBACF;oBAEA,MAAMsB,yBAAyBC,QAAQvB,MAAMwB,KAAK,EAAEC,cAAc3D;oBAElEkC,MAAMoE,MAAM,CAACrE,OAAO,CAAC,CAACsE;wBACpB,MAAMC,QAAQ,OAAOD,WAAW,WAAW3G,QAAQ8C,OAAO,CAAC4D,MAAM,CAACC,OAAO,GAAGA;wBAE5E,IAAIE,iBAAiBzH,gBAAgB;4BACnCY;4BACA+C,QAAQ6D;4BACR7F,iBAAiBK;4BACjB6C,QAAQ,GAAG7C,cAAc,QAAQ,CAAC;4BAClCK;4BACAyC,oBAAoB3C;wBACtB;wBAEA,IAAI,OAAOtB,kBAAkB,CAAC4G,eAAe,KAAK,aAAa;4BAC7D5G,kBAAkB,CAAC4G,eAAe,GAAG;wBACvC,OAAO,IACL,CAAC7G,QAAQ8G,SAAS,CAACD,eAAe,IAClC,CAAClH,iCAAiC;4BAChCiH;4BACAlB,WAAWpD,MAAMoD,SAAS;4BAC1BtE;4BACAyD,OAAO7E,QAAQ8G,SAAS,CAACD,eAAe;4BACxCE,cAAc/G,QAAQ8G,SAAS,CAAC,GAAGD,iBAAiB7G,QAAQsG,aAAa,EAAE,CAAC;wBAC9E,IACA;4BACArG,kBAAkB,CAAC4G,eAAe;4BAClCnH,sBAAsBkH,OAAO3G,kBAAkB,CAAC4G,eAAe;4BAC/DA,iBAAiB,GAAGA,eAAe,CAAC,EAAE5G,kBAAkB,CAAC4G,eAAe,EAAE;wBAC5E;wBACA,IAAIf,eAAe,CAAC,QAAQ,EAAEc,MAAMI,IAAI,EAAE;wBAC1C,IAAI,OAAOJ,KAAK,CAACnH,4BAA4B,KAAK,aAAa;4BAC7DqG,eAAe,CAAC,QAAQ,EAAEc,MAAMI,IAAI,CAAC,CAAC,EAAEJ,KAAK,CAACnH,4BAA4B,EAAE;wBAC9E;wBAEA,IAAI,CAACO,QAAQ8G,SAAS,CAACD,eAAe,EAAE;4BACtC,MAAM1C,cAAyC;gCAC7CC,QAAQ;oCACN7B,MAAM;oCACNH,MAAM;oCACNiC,SAAS;gCACX;gCACAC,WAAW;oCACT/B,MAAM;oCACNH,MAAMjB;oCACNkD,SAAS;gCACX;gCACA4C,OAAO;oCACL1E,MAAM;oCACNH,MAAM;oCACNiC,SAAS;gCACX;4BACF;4BAEA,MAAME,cAAwC;gCAC5CC,WAAW;oCACTjC,MAAM,GAAGsE,eAAe,UAAU,CAAC;oCACnClD,IAAI;gCACN;gCACAc,cAAc;oCACZlC,MAAM,GAAGsE,eAAe,cAAc,CAAC;oCACvClD,IAAI;wCAAC;qCAAY;gCACnB;gCACAuD,UAAU;oCACR3E,MAAM,GAAGsE,eAAe,SAAS,CAAC;oCAClClD,IAAI;gCACN;4BACF;4BAEA,MAAMe,kBAAiD;gCACrDyC,aAAa;oCACX5E,MAAM,GAAGsE,eAAe,aAAa,CAAC;oCACtC1G,SAAS;wCAAC;qCAAY;oCACtByE,gBAAgB;wCACd;4CACErC,MAAM;4CACNsC,OAAOzD;wCACT;qCACD;oCACD0D,UAAU;gCACZ;4BACF;4BAEA,MAAMC,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;4BAEF,IAAIsE,aAAa;gCACfZ,YAAYa,OAAO,GAAG;oCACpBzC,MAAM;oCACNH,MAAM;oCACN6C,QAAQ;oCACRZ,SAAS;gCACX;gCAEAE,YAAYW,UAAU,GAAG;oCACvB3C,MAAM,GAAGsE,eAAe,WAAW,CAAC;oCACpClD,IAAI;gCACN;4BACF;4BAEA,MAAM,EACJ5B,6BAA6BoD,8BAA8B,EAC3DtD,2BAA2BuD,4BAA4B,EACvDzD,+BAA+B0D,gCAAgC,EAC/DvD,oBAAoBwD,qBAAqB,EACzC1D,kBAAkB2D,mBAAmB,EACrCtE,kBAAkBuE,mBAAmB,EACtC,GAAG5F,WAAW;gCACbI;gCACAmE;gCACAO;gCACAH;gCACAtE;gCACAG,gBAAgBwD;gCAChBvD,wBAAwB;gCACxBC;gCACAE,QAAQF,gBAAgBT,SAAS+G,MAAMnB,eAAe,IAAImB,MAAMnB,eAAe;gCAC/E3E,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;gCACvDC,mBAAmB3E;gCACnBE;gCACAC;gCACAC;gCACAwE,yBAAyBtE;gCACzBD;gCACAwE,WAAWgB;gCACXtF;gCACAC,6BAA6BuD;4BAC/B;4BAEA,IAAII,gCAAgC;gCAClCpD,8BAA8BoD;4BAChC;4BAEA,IAAIE,kCAAkC;gCACpC1D,gCAAgC0D;4BAClC;4BAEA,IAAID,8BAA8B;gCAChCvD,4BAA4BuD;4BAC9B;4BAEA,IAAIG,qBAAqB;gCACvB,IAAI,CAAC3D,oBAAoB2D,wBAAwB,SAAS;oCACxD3D,mBAAmB2D;gCACrB;4BACF;4BAEA,IAAID,uBAAuB;gCACzB,IAAI,CAACxD,sBAAsBwD,0BAA0B,SAAS;oCAC5DxD,qBAAqBwD;gCACvB;4BACF;4BAEA,MAAM8B,iBAA8C;gCAClD9C,WAAW;oCACTlC,MAAM;oCACN5B,QAAQ;wCACN;4CACE+B,MAAM;4CACNsC,OAAOgC;wCACT;qCACD;oCACDV,YAAY;wCAAC;qCAAK;oCAClBL;oCACAM,IAAIhF;gCACN;4BACF;4BAEA,IACE7B,gBAAgB;gCACdiB,QAAQoG,MAAMpG,MAAM;gCACpBM,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;4BACzD,IACA;gCACA0B,eAAef,QAAQ,GAAG;oCACxBjE,MAAM;oCACN0D,cAAc;oCACdM,IAAI,GAAGS,iBAAiB7G,QAAQsG,aAAa,EAAE;gCACjD;4BACF;4BAEAd,oBAAoBnD,OAAO,CAAC,CAAC,EAAED,IAAI,EAAEsD,SAAS,EAAEO,MAAM,EAAE,EAAEM;gCACxD,IAAInE,SAAS,OAAO;oCAClB,MAAMiF,qBAAqB3B,YACvB,GAAGmB,iBAAiB7G,QAAQsG,aAAa,EAAE,GAC3CO;oCAEJO,cAAc,CAACb,IAAI,GAAG;wCACpBnE,MAAM;wCACN5B,QAAQ;4CACN;gDACE+B,MAAMgE;gDACN1B,OAAOwC;4CACT;yCACD;wCACDlB,YAAY;4CAAC;yCAAK;wCAClBL,cAAcS;wCACdH,IAAIH;oCACN;gCACF;gCAEA,IAAI7D,SAAS,QAAQ;oCACnBgF,cAAc,CAACb,IAAI,GAAG;wCACpBnE,MAAM;wCACN0D,cAAcS;wCACdH,IAAIH;oCACN;gCACF;4BACF;4BAEAjG,QAAQyG,YAAY,CAACI,eAAe,GAAGO;wBACzC;wBAEA,mHAAmH;wBACnHlG,qBAAqB8E,GAAG,CAACF,cAAc;4BACrC1D,MAAM;4BACN,+CAA+C;4BAC/CsD,WAAW;4BACXO,QAAQY;wBACV;oBACF;oBAEA;gBACF;YACA,KAAK;gBAAY;oBACfrE,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;oBACR,GACAE;oBAGF;gBACF;YAEA,KAAK;YACL,KAAK;YACL,KAAK;gBAAY;oBACfE,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;oBACR,GACAE;oBAGF;gBACF;YAEA,KAAK;gBAAQ;oBACXE,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;wBACNkF,MAAM;wBACNC,WAAW;wBACXC,cAAc;oBAChB,GACAlF;oBAGF;gBACF;YAEA,KAAK;YACL,KAAK;gBAAO;oBACV,MAAMsB,yBAAyBC,QAAQvB,MAAMwB,KAAK,EAAEC,cAAc3D;oBAElE,MAAM,EACJsB,mBAAmB+F,sBAAsB,EACzC1F,6BAA6B2F,gCAAgC,EAC7D7F,2BAA2B8F,8BAA8B,EACzDhG,+BAA+BiG,kCAAkC,EACjE9F,oBAAoB+F,uBAAuB,EAC3CjG,kBAAkBkG,qBAAqB,EACxC,GAAG/H,eAAe;wBACjBC;wBACAC;wBACAC,cAAc,GAAGwC,WAAW,CAAC,CAAC;wBAC9BvC;wBACAC,gBAAgBwD;wBAChBtD;wBACAC,aAAa,GAAGoC,UAAU,CAAC,CAAC;wBAC5BnC,QAAQ8B,MAAMmD,eAAe;wBAC7BhF,gBAAgBoC,oBAAoBgB,QAAQpD;wBAC5CC;wBACAC;wBACAC;wBACAC,cAAc,GAAGE,gBAAgB,CAAC,EAAE2B,YAAY;wBAChD5B,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;wBACvD3E;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC,6BAA6BA,+BAA+BqB;oBAC9D;oBAEA,IAAI4E,wBAAwB;wBAC1B/F,oBAAoB;oBACtB;oBACA,IAAIkG,oCAAoC;wBACtCjG,gCAAgC;oBAClC;oBACA,IAAImG,uBAAuB;wBACzBlG,mBAAmB;oBACrB;oBACA,IAAI+F,gCAAgC;wBAClC9F,4BAA4B;oBAC9B;oBACA,IAAIgG,yBAAyB;wBAC3B/F,qBAAqB;oBACvB;oBACA,IAAI4F,kCAAkC;wBACpC3F,8BAA8B;oBAChC;oBACA;gBACF;YAEA,KAAK;YACL,KAAK;gBAAY;oBACfS,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;oBACR,GACAE;oBAGF;gBACF;YAEA,KAAK;gBAAU;oBACb,IAAIA,MAAMY,OAAO,EAAE;wBACjB,MAAM6B,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;wBAEF,IAAIsE,aAAa;4BACfhD,8BAA8B;wBAChC;wBAEA,IAAIO,MAAMc,KAAK,EAAE;4BACftB,qBAAqB;wBACvB,OAAO,IAAI,CAACA,oBAAoB;4BAC9BA,qBAAqB;wBACvB;wBAEA,IAAIQ,MAAMa,MAAM,EAAE;4BAChB,MAAM,IAAIrE,qBACR;wBAEJ;oBACF,OAAO;wBACL0D,WAAW,CAACG,UAAU,GAAG7C,YACvB;4BACEyC,MAAMG;4BACNN,MAAM;wBACR,GACAE;oBAEJ;oBAEA;gBACF;YAEA,KAAK;gBAAS;oBACZE,WAAW,CAACG,UAAU,GAAG7C,YACvB;wBACEyC,MAAMG;wBACNN,MAAM;oBACR,GACAE;oBAGF;gBACF;YAEA,KAAK;YACL,KAAK;gBAAU;oBACb,MAAMyF,WAAW3I,gBAAgB;wBAC/BY;wBACA+C,QAAQT;wBACRvB,iBAAiBF;wBACjBoD,QAAQ,CAAC,KAAK,EAAEpD,aAAa,CAAC,CAAC;wBAC/BoF,QAAQ;wBACRxE;oBACF;oBAEA,MAAMuG,UAAU1F,MAAM0F,OAAO,CAACC,GAAG,CAAC,CAACC;wBACjC,IAAIhJ,eAAegJ,SAAS;4BAC1B,OAAOA,OAAOC,KAAK;wBACrB;wBAEA,OAAOD;oBACT;oBAEA,IAAI5F,MAAMF,IAAI,KAAK,YAAYE,MAAMY,OAAO,EAAE;wBAC5C,MAAMkF,kBAAkBhJ,gBAAgB;4BACtCY;4BACA+C,QAAQT;4BACRvB,iBAAiBF;4BACjBoD,QAAQ,GAAGpD,aAAa,CAAC,CAAC;4BAC1BY;4BACAyC,oBAAoB3C;wBACtB;wBAEA,MAAM4C,cAAyC;4BAC7CkE,OAAO;gCACL9F,MAAM;gCACNH,MAAM;gCACNiC,SAAS;4BACX;4BACAiE,QAAQ;gCACN/F,MAAM;gCACNH,MAAMJ;gCACNqC,SAAS;4BACX;4BACA8D,OAAO;gCACL5F,MAAM;gCACNH,MAAM;gCACN2F,UAAU3I,gBAAgB;oCACxBY;oCACA+C,QAAQT;oCACRvB,iBAAiBF;oCACjBoD,QAAQ,CAAC,KAAK,EAAEpD,aAAa,CAAC,CAAC;oCAC/BoF,QAAQ;oCACRxE;gCACF;gCACAuG;4BACF;wBACF;wBAEA,MAAMzD,cAAwC;4BAC5CgE,UAAU;gCACRhG,MAAM,GAAG6F,gBAAgB,UAAU,CAAC;gCACpCzE,IAAI;4BACN;4BACA6E,WAAW;gCACTjG,MAAM,GAAG6F,gBAAgB,WAAW,CAAC;gCACrCzE,IAAI;4BACN;wBACF;wBAEA,MAAMe,kBAAiD;4BACrD+D,UAAU;gCACRlG,MAAM,GAAG6F,gBAAgB,UAAU,CAAC;gCACpCjI,SAAS;oCAAC;iCAAS;gCACnByE,gBAAgB;oCACd;wCACErC,MAAM;wCACNsC,OAAO9D;oCACT;iCACD;gCACD+D,UAAU;4BACZ;wBACF;wBAEA,MAAMC,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;wBAEF,IAAIsE,aAAa;4BACfZ,YAAYc,MAAM,GAAG;gCACnB1C,MAAM;gCACNH,MAAM;gCACN6C,QAAQ;gCACRZ,SAAS;4BACX;4BAEAE,YAAYmE,SAAS,GAAG;gCACtBnG,MAAM,GAAG6F,gBAAgB,WAAW,CAAC;gCACrCzE,IAAI;4BACN;wBACF;wBAEA,IAAIrB,MAAMc,KAAK,EAAE;4BACfmB,YAAY4D,KAAK,GAAG;gCAClB5F,MAAM,GAAG6F,gBAAgB,UAAU,CAAC;gCACpCzE,IAAI;4BACN;wBACF;wBAEA/D,WAAW;4BACTI;4BACAmE;4BACAO;4BACAH;4BACAtE;4BACAG;4BACAE;4BACAE,QAAQ,EAAE;4BACVM,mBAAmBA,qBAAqBwB,MAAMoD,SAAS;4BACvDtE;4BACAC;4BACAwE,WAAWuC;4BACX7G;wBACF;wBAEAN,iBAAiB+E,GAAG,CAACrD,WAAW;4BAC9BP,MAAM;4BACN,yEAAyE;4BACzEsD,WAAW;4BACXO,QAAQmC;wBACV;wBAEApI,QAAQyG,YAAY,CAAC2B,gBAAgB,GAAG;4BACtCE,QAAQ;gCACNlG,MAAM;gCACN5B,QAAQ;oCACN;wCACE+B,MAAM;wCACNsC,OAAOuD;oCACT;iCACD;gCACDjC,YAAY;oCAAC;iCAAK;gCAClBL,cAAcnD;gCACdyD,IAAIrF;4BACN;wBACF;oBACF,OAAO;wBACLyB,WAAW,CAACG,UAAU,GAAG7C,YACvB;4BACEyC,MAAMG;4BACNN,MAAM;4BACN2F;4BACAC;wBACF,GACA1F;oBAEJ;oBACA;gBACF;YAEA,KAAK;YACL,KAAK;gBACH,IAAIe,MAAMC,OAAO,CAAChB,MAAMiB,UAAU,GAAG;oBACnCjB,MAAMiB,UAAU,CAAClB,OAAO,CAAC,CAACsG;wBACxB3H,cAAc4H,GAAG,CAACD;wBAClB,IAAIrG,MAAMa,MAAM,IAAI,CAAC7C,iBAAiB,CAACD,wBAAwB;4BAC7DiB,oBAAoBsH,GAAG,CAACD;wBAC1B;oBACF;gBACF,OAAO,IAAIrG,MAAMY,OAAO,EAAE;oBACxBlC,cAAc4H,GAAG,CAACtG,MAAMiB,UAAU;oBAClC,IAAIjB,MAAMa,MAAM,IAAI,CAAC7C,iBAAiB,CAACD,wBAAwB;wBAC7DiB,oBAAoBsH,GAAG,CAACtG,MAAMiB,UAAU;oBAC1C;gBACF,OAAO;oBACL,kGAAkG;oBAClG,MAAMsF,qBAAqB7I,QAAQ8C,OAAO,CAACgG,WAAW,CAACxG,MAAMiB,UAAU,CAAC,CAACR,MAAM;oBAE/E,MAAM8C,YAAY7F,QAAQ+I,YAAY,CAACC,GAAG,CAAC7J,YAAYmD,MAAMiB,UAAU;oBAEvE,4CAA4C;oBAC5C,IAAI0F,UAAkBzJ,WAAWQ,QAAQkJ,MAAM,IAAI,SAAS;oBAC5D,MAAMC,4BAA4BN,mBAAmBrI,MAAM,CAAC4I,IAAI,CAC9D,CAAC9G,QAAUvD,iBAAiBuD,UAAUA,MAAMC,IAAI,KAAK;oBAEvD,IAAI4G,2BAA2B/G,SAAS,UAAU;wBAChD6G,UAAU;oBACZ;oBACA,IAAIE,2BAA2B/G,SAAS,QAAQ;wBAC9C6G,UAAU;oBACZ;oBAEA,gFAAgF;oBAChFzG,WAAW,CAACG,UAAU,GAAG;wBACvBJ,MAAM,GAAGG,WAAW,GAAG,CAAC;wBACxBN,MAAM6G;wBACNI,WAAW;4BACT9G,MAAM;4BACNuC,UAAU;4BACVD,OAAOgB;wBACT;oBACF;oBAEA,4BAA4B;oBAC5B5E,iBAAiB+E,GAAG,CAACrD,WAAW;wBAC9BP,MAAM;wBACNsD,WAAW1F,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,IAAKH,CAAAA,oBAAoBpC,cAAa;wBACpFwF,QAAQJ;oBACV;oBAEA,gCAAgC;oBAChC,IAAI,CAACzF,kBAAkBkC,MAAMgH,QAAQ,IAAI,CAAChH,MAAMwB,KAAK,EAAEC,WAAW;wBAChEvB,WAAW,CAACG,UAAU,CAAC0B,OAAO,GAAG;oBACnC;oBACA;gBACF;gBAEA,IACER,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,6BACA;oBACAG,gCAAgC;gBAClC;gBAEA;YAEF,KAAK;gBAAQ;oBACX,IAAIW,MAAMY,OAAO,EAAE;wBACjB,MAAM6B,cACJlB,QAAQhB,oBAAoB7C,QAAQ8C,OAAO,CAACC,MAAM,CAACC,YAAY,KAC/DxB,+BACAf;wBAEF,IAAIsE,aAAa;4BACflD,4BAA4B;wBAC9B;wBAEA,IAAIS,MAAMc,KAAK,EAAE;4BACfxB,mBAAmB;wBACrB,OAAO,IAAI,CAACA,kBAAkB;4BAC5BA,mBAAmB;wBACrB;wBAEA,IAAIU,MAAMa,MAAM,EAAE;4BAChB,MAAM,IAAIrE,qBACR;wBAEJ;oBACF,OAAO;wBACL0D,WAAW,CAACG,UAAU,GAAG7C,YACvB;4BACEyC,MAAMG;4BACNN,MAAM;wBACR,GACAE;oBAEJ;oBACA;gBACF;YAEA;gBACE;QACJ;QAEA,MAAMyB,YAAYzB,MAAMwB,KAAK,IAAIxB,MAAMwB,KAAK,CAACC,SAAS;QAEtD,IACE,CAAC3D,kBACDoC,WAAW,CAACG,UAAU,IACtB,cAAcL,SACdA,MAAMgH,QAAQ,IACd,CAACvF,WACD;YACAvB,WAAW,CAACG,UAAU,CAAC0B,OAAO,GAAG;QACnC;IACF;IAEA,OAAO;QACL3C;QACAK;QACAF;QACAF;QACAG;QACAF;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Payload } from 'payload';
|
|
2
|
+
export type LocalizeStatusArgs = {
|
|
3
|
+
collectionSlug?: string;
|
|
4
|
+
db: any;
|
|
5
|
+
globalSlug?: string;
|
|
6
|
+
payload: Payload;
|
|
7
|
+
req?: any;
|
|
8
|
+
};
|
|
9
|
+
export declare function migrateSqliteLocalizeStatus(args: LocalizeStatusArgs): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Drops a column, first removing any indexes that reference it. SQLite refuses to
|
|
12
|
+
* drop a column that is still referenced by an index.
|
|
13
|
+
*/
|
|
14
|
+
export declare function dropColumn({ columnName, db, tableName, }: {
|
|
15
|
+
columnName: string;
|
|
16
|
+
db: any;
|
|
17
|
+
tableName: string;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
export declare function columnExists({ columnName, db, tableName, }: {
|
|
20
|
+
columnName: string;
|
|
21
|
+
db: any;
|
|
22
|
+
tableName: string;
|
|
23
|
+
}): Promise<boolean>;
|
|
24
|
+
export declare function tableExists({ db, tableName, }: {
|
|
25
|
+
db: any;
|
|
26
|
+
tableName: string;
|
|
27
|
+
}): Promise<boolean>;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sqlite/predefinedMigrations/localize-status/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAStC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,EAAE,EAAE,GAAG,CAAA;IACP,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,GAAG,CAAA;CACV,CAAA;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2LzF;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,EAC/B,UAAU,EACV,EAAE,EACF,SAAS,GACV,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,GAAG,CAAA;IACP,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhB;AAED,wBAAsB,YAAY,CAAC,EACjC,UAAU,EACV,EAAE,EACF,SAAS,GACV,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,GAAG,CAAA;IACP,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnB;AAED,wBAAsB,WAAW,CAAC,EAChC,EAAE,EACF,SAAS,GACV,EAAE;IACD,EAAE,EAAE,GAAG,CAAA;IACP,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnB"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
import { calculateVersionLocaleStatuses } from 'payload/migrations';
|
|
3
|
+
import toSnakeCase from 'to-snake-case';
|
|
4
|
+
import { migrateMainCollectionStatus } from './migrateMainCollection.js';
|
|
5
|
+
import { migrateMainGlobalStatus } from './migrateMainGlobal.js';
|
|
6
|
+
export async function migrateSqliteLocalizeStatus(args) {
|
|
7
|
+
const { collectionSlug, db, globalSlug, payload, req } = args;
|
|
8
|
+
if (!collectionSlug && !globalSlug) {
|
|
9
|
+
throw new Error('Either collectionSlug or globalSlug must be provided');
|
|
10
|
+
}
|
|
11
|
+
if (collectionSlug && globalSlug) {
|
|
12
|
+
throw new Error('Cannot provide both collectionSlug and globalSlug');
|
|
13
|
+
}
|
|
14
|
+
const entitySlug = collectionSlug || globalSlug;
|
|
15
|
+
const versionsTable = collectionSlug ? `_${toSnakeCase(collectionSlug)}_v` : `_${toSnakeCase(globalSlug)}_v`;
|
|
16
|
+
const localesTable = `${versionsTable}_locales`;
|
|
17
|
+
if (!payload.config.localization) {
|
|
18
|
+
throw new Error('Localization is not enabled in payload config');
|
|
19
|
+
}
|
|
20
|
+
// Check if versions are enabled on this collection/global
|
|
21
|
+
let entityConfig;
|
|
22
|
+
if (collectionSlug) {
|
|
23
|
+
entityConfig = payload.config.collections.find((c)=>c.slug === collectionSlug);
|
|
24
|
+
} else if (globalSlug) {
|
|
25
|
+
entityConfig = payload.config.globals.find((g)=>g.slug === globalSlug);
|
|
26
|
+
}
|
|
27
|
+
if (!entityConfig) {
|
|
28
|
+
throw new Error(`${collectionSlug ? 'Collection' : 'Global'} not found: ${collectionSlug || globalSlug}`);
|
|
29
|
+
}
|
|
30
|
+
payload.logger.info({
|
|
31
|
+
msg: `Starting _status localization migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug}`
|
|
32
|
+
});
|
|
33
|
+
// Get filtered locales if filterAvailableLocales is defined
|
|
34
|
+
let locales = payload.config.localization.localeCodes;
|
|
35
|
+
if (typeof payload.config.localization.filterAvailableLocales === 'function') {
|
|
36
|
+
const filteredLocaleObjects = await payload.config.localization.filterAvailableLocales({
|
|
37
|
+
locales: payload.config.localization.locales,
|
|
38
|
+
req
|
|
39
|
+
});
|
|
40
|
+
locales = filteredLocaleObjects.map((locale)=>typeof locale === 'string' ? locale : locale.code);
|
|
41
|
+
}
|
|
42
|
+
payload.logger.info({
|
|
43
|
+
msg: `Locales: ${locales.join(', ')}`
|
|
44
|
+
});
|
|
45
|
+
// Check if versions are enabled in config (skip if not)
|
|
46
|
+
if (!entityConfig.versions) {
|
|
47
|
+
payload.logger.info({
|
|
48
|
+
msg: `Skipping migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug} - versions not enabled`
|
|
49
|
+
});
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Validate that version__status column exists before proceeding
|
|
53
|
+
if (!await columnExists({
|
|
54
|
+
columnName: 'version__status',
|
|
55
|
+
db,
|
|
56
|
+
tableName: versionsTable
|
|
57
|
+
})) {
|
|
58
|
+
throw new Error(`Migration aborted: version__status column not found in ${versionsTable} table. ` + `This migration should only run on schemas that have NOT yet been migrated to per-locale status. ` + `If you've already run this migration, no action is needed.`);
|
|
59
|
+
}
|
|
60
|
+
const localesTableExists = await tableExists({
|
|
61
|
+
db,
|
|
62
|
+
tableName: localesTable
|
|
63
|
+
});
|
|
64
|
+
if (!localesTableExists) {
|
|
65
|
+
// SCENARIO 1: Create the locales table (first localized field in versions)
|
|
66
|
+
payload.logger.info({
|
|
67
|
+
msg: `Creating new locales table: ${localesTable}`
|
|
68
|
+
});
|
|
69
|
+
await db.run(sql.raw(`CREATE TABLE "${localesTable}" (
|
|
70
|
+
id INTEGER PRIMARY KEY,
|
|
71
|
+
_locale TEXT NOT NULL,
|
|
72
|
+
_parent_id INTEGER NOT NULL,
|
|
73
|
+
version__status TEXT,
|
|
74
|
+
UNIQUE(_locale, _parent_id),
|
|
75
|
+
FOREIGN KEY (_parent_id) REFERENCES "${versionsTable}"(id) ON DELETE CASCADE
|
|
76
|
+
)`));
|
|
77
|
+
for (const locale of locales){
|
|
78
|
+
const inserted = await db.all(sql.raw(`INSERT INTO "${localesTable}" (_locale, _parent_id, version__status) SELECT '${locale}', id, version__status FROM "${versionsTable}" RETURNING id`));
|
|
79
|
+
payload.logger.info({
|
|
80
|
+
msg: `Inserted ${inserted.length} rows for locale: ${locale}`
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
// SCENARIO 2: Add version__status column to existing locales table
|
|
85
|
+
payload.logger.info({
|
|
86
|
+
msg: `Adding version__status column to existing table: ${localesTable}`
|
|
87
|
+
});
|
|
88
|
+
await db.run(sql.raw(`ALTER TABLE "${localesTable}" ADD COLUMN version__status TEXT`));
|
|
89
|
+
payload.logger.info({
|
|
90
|
+
msg: 'Processing version history to determine status per locale...'
|
|
91
|
+
});
|
|
92
|
+
const existingLocaleRows = await db.all(sql.raw(`SELECT DISTINCT _locale FROM "${localesTable}" ORDER BY _locale`));
|
|
93
|
+
const existingLocales = existingLocaleRows.map((row)=>row._locale);
|
|
94
|
+
payload.logger.info({
|
|
95
|
+
msg: `Found existing locales in table: ${existingLocales.join(', ')}`
|
|
96
|
+
});
|
|
97
|
+
// Check if the snapshot column exists (only present on DBs that used publishSpecificLocale)
|
|
98
|
+
const hasSnapshotColumn = await columnExists({
|
|
99
|
+
columnName: 'snapshot',
|
|
100
|
+
db,
|
|
101
|
+
tableName: versionsTable
|
|
102
|
+
});
|
|
103
|
+
const versionRows = await db.all(sql.raw(hasSnapshotColumn ? `SELECT id, parent_id as parent, version__status as _status, published_locale, snapshot, created_at FROM "${versionsTable}" ORDER BY parent_id, created_at ASC` : `SELECT id, parent_id as parent, version__status as _status, published_locale, created_at FROM "${versionsTable}" ORDER BY parent_id, created_at ASC`));
|
|
104
|
+
const versionLocaleStatus = calculateVersionLocaleStatuses(versionRows, existingLocales, payload);
|
|
105
|
+
payload.logger.info({
|
|
106
|
+
msg: 'Updating locales table with calculated statuses...'
|
|
107
|
+
});
|
|
108
|
+
let updateCount = 0;
|
|
109
|
+
for (const [versionId, localeMap] of versionLocaleStatus.entries()){
|
|
110
|
+
for (const [locale, status] of localeMap.entries()){
|
|
111
|
+
await db.run(sql.raw(`UPDATE "${localesTable}" SET version__status = '${status}' WHERE _parent_id = ${versionId} AND _locale = '${locale}'`));
|
|
112
|
+
updateCount++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
payload.logger.info({
|
|
116
|
+
msg: `Updated ${updateCount} locale rows with status`
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Drop the old version__status column from the versions table
|
|
120
|
+
await dropColumn({
|
|
121
|
+
columnName: 'version__status',
|
|
122
|
+
db,
|
|
123
|
+
tableName: versionsTable
|
|
124
|
+
});
|
|
125
|
+
// Migrate main table _status to locales table
|
|
126
|
+
const mainTable = collectionSlug ? toSnakeCase(collectionSlug) : toSnakeCase(globalSlug);
|
|
127
|
+
const mainLocalesTable = `${mainTable}_locales`;
|
|
128
|
+
if (await tableExists({
|
|
129
|
+
db,
|
|
130
|
+
tableName: mainLocalesTable
|
|
131
|
+
})) {
|
|
132
|
+
if (!await columnExists({
|
|
133
|
+
columnName: '_status',
|
|
134
|
+
db,
|
|
135
|
+
tableName: mainLocalesTable
|
|
136
|
+
})) {
|
|
137
|
+
await db.run(sql.raw(`ALTER TABLE "${mainLocalesTable}" ADD COLUMN _status TEXT DEFAULT 'draft'`));
|
|
138
|
+
}
|
|
139
|
+
if (collectionSlug) {
|
|
140
|
+
await migrateMainCollectionStatus({
|
|
141
|
+
collectionSlug,
|
|
142
|
+
db,
|
|
143
|
+
locales,
|
|
144
|
+
payload,
|
|
145
|
+
versionsTable
|
|
146
|
+
});
|
|
147
|
+
} else if (globalSlug) {
|
|
148
|
+
await migrateMainGlobalStatus({
|
|
149
|
+
db,
|
|
150
|
+
globalSlug,
|
|
151
|
+
locales,
|
|
152
|
+
payload,
|
|
153
|
+
versionsTable
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
} else {
|
|
157
|
+
payload.logger.info({
|
|
158
|
+
msg: `No locales table found: ${mainLocalesTable} (collection/global not localized)`
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
// Drop _status from main table if it exists (it will be in locales table now)
|
|
162
|
+
if (await columnExists({
|
|
163
|
+
columnName: '_status',
|
|
164
|
+
db,
|
|
165
|
+
tableName: mainTable
|
|
166
|
+
})) {
|
|
167
|
+
await dropColumn({
|
|
168
|
+
columnName: '_status',
|
|
169
|
+
db,
|
|
170
|
+
tableName: mainTable
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
payload.logger.info({
|
|
174
|
+
msg: 'Migration completed successfully'
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Drops a column, first removing any indexes that reference it. SQLite refuses to
|
|
179
|
+
* drop a column that is still referenced by an index.
|
|
180
|
+
*/ export async function dropColumn({ columnName, db, tableName }) {
|
|
181
|
+
const indexes = await db.all(sql.raw(`SELECT name, sql FROM sqlite_master WHERE type='index' AND tbl_name='${tableName}'`));
|
|
182
|
+
for (const index of indexes){
|
|
183
|
+
if (typeof index.sql === 'string' && index.sql.includes(columnName)) {
|
|
184
|
+
await db.run(sql.raw(`DROP INDEX IF EXISTS "${index.name}"`));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
await db.run(sql.raw(`ALTER TABLE "${tableName}" DROP COLUMN ${columnName}`));
|
|
188
|
+
}
|
|
189
|
+
export async function columnExists({ columnName, db, tableName }) {
|
|
190
|
+
const result = await db.all(sql.raw(`SELECT COUNT(*) as count FROM pragma_table_info('${tableName}') WHERE name = '${columnName}'`));
|
|
191
|
+
return Number(result[0]?.count ?? 0) > 0;
|
|
192
|
+
}
|
|
193
|
+
export async function tableExists({ db, tableName }) {
|
|
194
|
+
const result = await db.all(sql.raw(`SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name='${tableName}'`));
|
|
195
|
+
return Number(result[0]?.count ?? 0) > 0;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/sqlite/predefinedMigrations/localize-status/index.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport { sql } from 'drizzle-orm'\nimport { calculateVersionLocaleStatuses } from 'payload/migrations'\nimport toSnakeCase from 'to-snake-case'\n\nimport { migrateMainCollectionStatus } from './migrateMainCollection.js'\nimport { migrateMainGlobalStatus } from './migrateMainGlobal.js'\n\nexport type LocalizeStatusArgs = {\n collectionSlug?: string\n db: any\n globalSlug?: string\n payload: Payload\n req?: any\n}\n\nexport async function migrateSqliteLocalizeStatus(args: LocalizeStatusArgs): Promise<void> {\n const { collectionSlug, db, globalSlug, payload, req } = args\n\n if (!collectionSlug && !globalSlug) {\n throw new Error('Either collectionSlug or globalSlug must be provided')\n }\n\n if (collectionSlug && globalSlug) {\n throw new Error('Cannot provide both collectionSlug and globalSlug')\n }\n\n const entitySlug = collectionSlug || globalSlug\n const versionsTable = collectionSlug\n ? `_${toSnakeCase(collectionSlug)}_v`\n : `_${toSnakeCase(globalSlug)}_v`\n const localesTable = `${versionsTable}_locales`\n\n if (!payload.config.localization) {\n throw new Error('Localization is not enabled in payload config')\n }\n\n // Check if versions are enabled on this collection/global\n let entityConfig\n if (collectionSlug) {\n entityConfig = payload.config.collections.find((c) => c.slug === collectionSlug)\n } else if (globalSlug) {\n entityConfig = payload.config.globals.find((g) => g.slug === globalSlug)\n }\n\n if (!entityConfig) {\n throw new Error(\n `${collectionSlug ? 'Collection' : 'Global'} not found: ${collectionSlug || globalSlug}`,\n )\n }\n\n payload.logger.info({\n msg: `Starting _status localization migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug}`,\n })\n\n // Get filtered locales if filterAvailableLocales is defined\n let locales = payload.config.localization.localeCodes\n if (typeof payload.config.localization.filterAvailableLocales === 'function') {\n const filteredLocaleObjects = await payload.config.localization.filterAvailableLocales({\n locales: payload.config.localization.locales,\n req,\n })\n locales = filteredLocaleObjects.map((locale) =>\n typeof locale === 'string' ? locale : locale.code,\n )\n }\n payload.logger.info({ msg: `Locales: ${locales.join(', ')}` })\n\n // Check if versions are enabled in config (skip if not)\n if (!entityConfig.versions) {\n payload.logger.info({\n msg: `Skipping migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug} - versions not enabled`,\n })\n return\n }\n\n // Validate that version__status column exists before proceeding\n if (!(await columnExists({ columnName: 'version__status', db, tableName: versionsTable }))) {\n throw new Error(\n `Migration aborted: version__status column not found in ${versionsTable} table. ` +\n `This migration should only run on schemas that have NOT yet been migrated to per-locale status. ` +\n `If you've already run this migration, no action is needed.`,\n )\n }\n\n const localesTableExists = await tableExists({ db, tableName: localesTable })\n\n if (!localesTableExists) {\n // SCENARIO 1: Create the locales table (first localized field in versions)\n payload.logger.info({ msg: `Creating new locales table: ${localesTable}` })\n\n await db.run(\n sql.raw(`CREATE TABLE \"${localesTable}\" (\n id INTEGER PRIMARY KEY,\n _locale TEXT NOT NULL,\n _parent_id INTEGER NOT NULL,\n version__status TEXT,\n UNIQUE(_locale, _parent_id),\n FOREIGN KEY (_parent_id) REFERENCES \"${versionsTable}\"(id) ON DELETE CASCADE\n )`),\n )\n\n for (const locale of locales) {\n const inserted: any[] = await db.all(\n sql.raw(\n `INSERT INTO \"${localesTable}\" (_locale, _parent_id, version__status) SELECT '${locale}', id, version__status FROM \"${versionsTable}\" RETURNING id`,\n ),\n )\n payload.logger.info({\n msg: `Inserted ${inserted.length} rows for locale: ${locale}`,\n })\n }\n } else {\n // SCENARIO 2: Add version__status column to existing locales table\n payload.logger.info({ msg: `Adding version__status column to existing table: ${localesTable}` })\n\n await db.run(sql.raw(`ALTER TABLE \"${localesTable}\" ADD COLUMN version__status TEXT`))\n\n payload.logger.info({ msg: 'Processing version history to determine status per locale...' })\n\n const existingLocaleRows: any[] = await db.all(\n sql.raw(`SELECT DISTINCT _locale FROM \"${localesTable}\" ORDER BY _locale`),\n )\n const existingLocales = existingLocaleRows.map((row: any) => row._locale as string)\n payload.logger.info({\n msg: `Found existing locales in table: ${existingLocales.join(', ')}`,\n })\n\n // Check if the snapshot column exists (only present on DBs that used publishSpecificLocale)\n const hasSnapshotColumn = await columnExists({\n columnName: 'snapshot',\n db,\n tableName: versionsTable,\n })\n\n const versionRows: any[] = await db.all(\n sql.raw(\n hasSnapshotColumn\n ? `SELECT id, parent_id as parent, version__status as _status, published_locale, snapshot, created_at FROM \"${versionsTable}\" ORDER BY parent_id, created_at ASC`\n : `SELECT id, parent_id as parent, version__status as _status, published_locale, created_at FROM \"${versionsTable}\" ORDER BY parent_id, created_at ASC`,\n ),\n )\n\n const versionLocaleStatus = calculateVersionLocaleStatuses(\n versionRows,\n existingLocales,\n payload,\n )\n\n payload.logger.info({ msg: 'Updating locales table with calculated statuses...' })\n\n let updateCount = 0\n for (const [versionId, localeMap] of versionLocaleStatus.entries()) {\n for (const [locale, status] of localeMap.entries()) {\n await db.run(\n sql.raw(\n `UPDATE \"${localesTable}\" SET version__status = '${status}' WHERE _parent_id = ${versionId} AND _locale = '${locale}'`,\n ),\n )\n updateCount++\n }\n }\n\n payload.logger.info({ msg: `Updated ${updateCount} locale rows with status` })\n }\n\n // Drop the old version__status column from the versions table\n await dropColumn({ columnName: 'version__status', db, tableName: versionsTable })\n\n // Migrate main table _status to locales table\n const mainTable = collectionSlug ? toSnakeCase(collectionSlug) : toSnakeCase(globalSlug)\n const mainLocalesTable = `${mainTable}_locales`\n\n if (await tableExists({ db, tableName: mainLocalesTable })) {\n if (!(await columnExists({ columnName: '_status', db, tableName: mainLocalesTable }))) {\n await db.run(\n sql.raw(`ALTER TABLE \"${mainLocalesTable}\" ADD COLUMN _status TEXT DEFAULT 'draft'`),\n )\n }\n\n if (collectionSlug) {\n await migrateMainCollectionStatus({\n collectionSlug,\n db,\n locales,\n payload,\n versionsTable,\n })\n } else if (globalSlug) {\n await migrateMainGlobalStatus({ db, globalSlug, locales, payload, versionsTable })\n }\n } else {\n payload.logger.info({\n msg: `No locales table found: ${mainLocalesTable} (collection/global not localized)`,\n })\n }\n\n // Drop _status from main table if it exists (it will be in locales table now)\n if (await columnExists({ columnName: '_status', db, tableName: mainTable })) {\n await dropColumn({ columnName: '_status', db, tableName: mainTable })\n }\n\n payload.logger.info({ msg: 'Migration completed successfully' })\n}\n\n/**\n * Drops a column, first removing any indexes that reference it. SQLite refuses to\n * drop a column that is still referenced by an index.\n */\nexport async function dropColumn({\n columnName,\n db,\n tableName,\n}: {\n columnName: string\n db: any\n tableName: string\n}): Promise<void> {\n const indexes = await db.all(\n sql.raw(`SELECT name, sql FROM sqlite_master WHERE type='index' AND tbl_name='${tableName}'`),\n )\n\n for (const index of indexes as Array<{ name: string; sql: null | string }>) {\n if (typeof index.sql === 'string' && index.sql.includes(columnName)) {\n await db.run(sql.raw(`DROP INDEX IF EXISTS \"${index.name}\"`))\n }\n }\n\n await db.run(sql.raw(`ALTER TABLE \"${tableName}\" DROP COLUMN ${columnName}`))\n}\n\nexport async function columnExists({\n columnName,\n db,\n tableName,\n}: {\n columnName: string\n db: any\n tableName: string\n}): Promise<boolean> {\n const result = await db.all(\n sql.raw(\n `SELECT COUNT(*) as count FROM pragma_table_info('${tableName}') WHERE name = '${columnName}'`,\n ),\n )\n return Number(result[0]?.count ?? 0) > 0\n}\n\nexport async function tableExists({\n db,\n tableName,\n}: {\n db: any\n tableName: string\n}): Promise<boolean> {\n const result = await db.all(\n sql.raw(\n `SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name='${tableName}'`,\n ),\n )\n return Number(result[0]?.count ?? 0) > 0\n}\n"],"names":["sql","calculateVersionLocaleStatuses","toSnakeCase","migrateMainCollectionStatus","migrateMainGlobalStatus","migrateSqliteLocalizeStatus","args","collectionSlug","db","globalSlug","payload","req","Error","entitySlug","versionsTable","localesTable","config","localization","entityConfig","collections","find","c","slug","globals","g","logger","info","msg","locales","localeCodes","filterAvailableLocales","filteredLocaleObjects","map","locale","code","join","versions","columnExists","columnName","tableName","localesTableExists","tableExists","run","raw","inserted","all","length","existingLocaleRows","existingLocales","row","_locale","hasSnapshotColumn","versionRows","versionLocaleStatus","updateCount","versionId","localeMap","entries","status","dropColumn","mainTable","mainLocalesTable","indexes","index","includes","name","result","Number","count"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Payload } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Migrates main collection documents from _status to per-locale status object
|
|
4
|
+
*/
|
|
5
|
+
export declare function migrateMainCollectionStatus({ collectionSlug, db, locales, payload, versionsTable, }: {
|
|
6
|
+
collectionSlug: string;
|
|
7
|
+
db: any;
|
|
8
|
+
locales: string[];
|
|
9
|
+
payload: Payload;
|
|
10
|
+
versionsTable: string;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=migrateMainCollection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrateMainCollection.d.ts","sourceRoot":"","sources":["../../../../src/sqlite/predefinedMigrations/localize-status/migrateMainCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAKtC;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,EAChD,cAAc,EACd,EAAE,EACF,OAAO,EACP,OAAO,EACP,aAAa,GACd,EAAE;IACD,cAAc,EAAE,MAAM,CAAA;IACtB,EAAE,EAAE,GAAG,CAAA;IACP,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
import toSnakeCase from 'to-snake-case';
|
|
3
|
+
/**
|
|
4
|
+
* Migrates main collection documents from _status to per-locale status object
|
|
5
|
+
*/ export async function migrateMainCollectionStatus({ collectionSlug, db, locales, payload, versionsTable }) {
|
|
6
|
+
const mainTable = toSnakeCase(collectionSlug);
|
|
7
|
+
const mainLocalesTable = `${mainTable}_locales`;
|
|
8
|
+
payload.logger.info({
|
|
9
|
+
msg: `Migrating main collection locales for: ${mainLocalesTable}`
|
|
10
|
+
});
|
|
11
|
+
const documents = await db.all(sql.raw(`SELECT DISTINCT id FROM "${mainTable}"`));
|
|
12
|
+
for (const doc of documents){
|
|
13
|
+
for (const locale of locales){
|
|
14
|
+
const latestVersionRows = await db.all(sql.raw(`SELECT l.version__status as _status FROM "${versionsTable}" v JOIN "${versionsTable}_locales" l ON l._parent_id = v.id WHERE v.parent_id = ${doc.id} AND l._locale = '${locale}' ORDER BY v.created_at DESC LIMIT 1`));
|
|
15
|
+
const status = latestVersionRows[0]?._status || 'draft';
|
|
16
|
+
await db.run(sql.raw(`UPDATE "${mainLocalesTable}" SET _status = '${status}' WHERE _parent_id = ${doc.id} AND _locale = '${locale}'`));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
payload.logger.info({
|
|
20
|
+
msg: `Migrated ${documents.length} collection documents`
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=migrateMainCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/sqlite/predefinedMigrations/localize-status/migrateMainCollection.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport { sql } from 'drizzle-orm'\nimport toSnakeCase from 'to-snake-case'\n\n/**\n * Migrates main collection documents from _status to per-locale status object\n */\nexport async function migrateMainCollectionStatus({\n collectionSlug,\n db,\n locales,\n payload,\n versionsTable,\n}: {\n collectionSlug: string\n db: any\n locales: string[]\n payload: Payload\n versionsTable: string\n}): Promise<void> {\n const mainTable = toSnakeCase(collectionSlug)\n const mainLocalesTable = `${mainTable}_locales`\n\n payload.logger.info({ msg: `Migrating main collection locales for: ${mainLocalesTable}` })\n\n const documents: any[] = await db.all(sql.raw(`SELECT DISTINCT id FROM \"${mainTable}\"`))\n\n for (const doc of documents) {\n for (const locale of locales) {\n const latestVersionRows: any[] = await db.all(\n sql.raw(\n `SELECT l.version__status as _status FROM \"${versionsTable}\" v JOIN \"${versionsTable}_locales\" l ON l._parent_id = v.id WHERE v.parent_id = ${doc.id} AND l._locale = '${locale}' ORDER BY v.created_at DESC LIMIT 1`,\n ),\n )\n\n const status = latestVersionRows[0]?._status || 'draft'\n\n await db.run(\n sql.raw(\n `UPDATE \"${mainLocalesTable}\" SET _status = '${status}' WHERE _parent_id = ${doc.id} AND _locale = '${locale}'`,\n ),\n )\n }\n }\n\n payload.logger.info({ msg: `Migrated ${documents.length} collection documents` })\n}\n"],"names":["sql","toSnakeCase","migrateMainCollectionStatus","collectionSlug","db","locales","payload","versionsTable","mainTable","mainLocalesTable","logger","info","msg","documents","all","raw","doc","locale","latestVersionRows","id","status","_status","run","length"],"mappings":"AAEA,SAASA,GAAG,QAAQ,cAAa;AACjC,OAAOC,iBAAiB,gBAAe;AAEvC;;CAEC,GACD,OAAO,eAAeC,4BAA4B,EAChDC,cAAc,EACdC,EAAE,EACFC,OAAO,EACPC,OAAO,EACPC,aAAa,EAOd;IACC,MAAMC,YAAYP,YAAYE;IAC9B,MAAMM,mBAAmB,GAAGD,UAAU,QAAQ,CAAC;IAE/CF,QAAQI,MAAM,CAACC,IAAI,CAAC;QAAEC,KAAK,CAAC,uCAAuC,EAAEH,kBAAkB;IAAC;IAExF,MAAMI,YAAmB,MAAMT,GAAGU,GAAG,CAACd,IAAIe,GAAG,CAAC,CAAC,yBAAyB,EAAEP,UAAU,CAAC,CAAC;IAEtF,KAAK,MAAMQ,OAAOH,UAAW;QAC3B,KAAK,MAAMI,UAAUZ,QAAS;YAC5B,MAAMa,oBAA2B,MAAMd,GAAGU,GAAG,CAC3Cd,IAAIe,GAAG,CACL,CAAC,0CAA0C,EAAER,cAAc,UAAU,EAAEA,cAAc,uDAAuD,EAAES,IAAIG,EAAE,CAAC,kBAAkB,EAAEF,OAAO,oCAAoC,CAAC;YAIzN,MAAMG,SAASF,iBAAiB,CAAC,EAAE,EAAEG,WAAW;YAEhD,MAAMjB,GAAGkB,GAAG,CACVtB,IAAIe,GAAG,CACL,CAAC,QAAQ,EAAEN,iBAAiB,iBAAiB,EAAEW,OAAO,qBAAqB,EAAEJ,IAAIG,EAAE,CAAC,gBAAgB,EAAEF,OAAO,CAAC,CAAC;QAGrH;IACF;IAEAX,QAAQI,MAAM,CAACC,IAAI,CAAC;QAAEC,KAAK,CAAC,SAAS,EAAEC,UAAUU,MAAM,CAAC,qBAAqB,CAAC;IAAC;AACjF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Payload } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Migrates main global document from _status to per-locale status object
|
|
4
|
+
*/
|
|
5
|
+
export declare function migrateMainGlobalStatus({ db, globalSlug, locales, payload, versionsTable, }: {
|
|
6
|
+
db: any;
|
|
7
|
+
globalSlug: string;
|
|
8
|
+
locales: string[];
|
|
9
|
+
payload: Payload;
|
|
10
|
+
versionsTable: string;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=migrateMainGlobal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrateMainGlobal.d.ts","sourceRoot":"","sources":["../../../../src/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAKtC;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,EAC5C,EAAE,EACF,UAAU,EACV,OAAO,EACP,OAAO,EACP,aAAa,GACd,EAAE;IACD,EAAE,EAAE,GAAG,CAAA;IACP,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
import toSnakeCase from 'to-snake-case';
|
|
3
|
+
/**
|
|
4
|
+
* Migrates main global document from _status to per-locale status object
|
|
5
|
+
*/ export async function migrateMainGlobalStatus({ db, globalSlug, locales, payload, versionsTable }) {
|
|
6
|
+
const globalTable = toSnakeCase(globalSlug);
|
|
7
|
+
const globalLocalesTable = `${globalTable}_locales`;
|
|
8
|
+
payload.logger.info({
|
|
9
|
+
msg: `Migrating main global locales for: ${globalLocalesTable}`
|
|
10
|
+
});
|
|
11
|
+
const globalDoc = await db.get(sql.raw(`SELECT id FROM "${globalTable}" LIMIT 1`));
|
|
12
|
+
if (!globalDoc) {
|
|
13
|
+
payload.logger.warn({
|
|
14
|
+
msg: `No global document found for ${globalSlug}, skipping`
|
|
15
|
+
});
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
for (const locale of locales){
|
|
19
|
+
const latestVersionRows = await db.all(sql.raw(`SELECT l.version__status as _status FROM "${versionsTable}" v JOIN "${versionsTable}_locales" l ON l._parent_id = v.id WHERE l._locale = '${locale}' ORDER BY v.created_at DESC LIMIT 1`));
|
|
20
|
+
const status = latestVersionRows[0]?._status || 'draft';
|
|
21
|
+
await db.run(sql.raw(`UPDATE "${globalLocalesTable}" SET _status = '${status}' WHERE _parent_id = ${globalDoc.id} AND _locale = '${locale}'`));
|
|
22
|
+
}
|
|
23
|
+
payload.logger.info({
|
|
24
|
+
msg: 'Migrated global document'
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=migrateMainGlobal.js.map
|