diff --git a/packages/create-payload-app/src/lib/init-next.ts b/packages/create-payload-app/src/lib/init-next.ts index ea5859fe6f..ebb0a96f80 100644 --- a/packages/create-payload-app/src/lib/init-next.ts +++ b/packages/create-payload-app/src/lib/init-next.ts @@ -32,13 +32,13 @@ type InitNextArgs = { } & Pick type InitNextResult = + | { isSrcDir: boolean; nextAppDir?: string; reason: string; success: false } | { isSrcDir: boolean nextAppDir: string payloadConfigPath: string success: true } - | { isSrcDir: boolean; nextAppDir?: string; reason: string; success: false } export async function initNext(args: InitNextArgs): Promise { const { dbType: dbType, packageManager, projectDir } = args diff --git a/packages/create-payload-app/src/lib/install-packages.ts b/packages/create-payload-app/src/lib/install-packages.ts index c147eda1b6..1dd7de5a15 100644 --- a/packages/create-payload-app/src/lib/install-packages.ts +++ b/packages/create-payload-app/src/lib/install-packages.ts @@ -15,15 +15,9 @@ export async function installPackages(args: { let stderr = '' switch (packageManager) { - case 'npm': { - ;({ exitCode, stderr } = await execa('npm', ['install', '--save', ...packagesToInstall], { - cwd: projectDir, - })) - break - } - case 'yarn': + case 'bun': case 'pnpm': - case 'bun': { + case 'yarn': { if (packageManager === 'bun') { warning('Bun support is untested.') } @@ -32,6 +26,12 @@ export async function installPackages(args: { })) break } + case 'npm': { + ;({ exitCode, stderr } = await execa('npm', ['install', '--save', ...packagesToInstall], { + cwd: projectDir, + })) + break + } } if (exitCode !== 0) { diff --git a/packages/create-payload-app/src/main.ts b/packages/create-payload-app/src/main.ts index 35228e4366..eea879c8f2 100644 --- a/packages/create-payload-app/src/main.ts +++ b/packages/create-payload-app/src/main.ts @@ -217,6 +217,16 @@ export class Main { } switch (template.type) { + case 'plugin': { + await createProject({ + cliArgs: this.args, + packageManager, + projectDir, + projectName, + template, + }) + break + } case 'starter': { const dbDetails = await selectDb(this.args, projectName) const payloadSecret = generateSecret() @@ -238,16 +248,6 @@ export class Main { }) break } - case 'plugin': { - await createProject({ - cliArgs: this.args, - packageManager, - projectDir, - projectName, - template, - }) - break - } } info('Payload project successfully created!') diff --git a/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts b/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts index 3df792b066..0b6b7eee10 100644 --- a/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts +++ b/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts @@ -104,34 +104,10 @@ const traverseFields = ({ } switch (field.type) { - case 'collapsible': - case 'row': - traverseFields({ - adapter, - databaseSchemaPath, - fields: field.fields, - projection, - select, - selectMode, - withinLocalizedField, - }) - break - - case 'tabs': - traverseFields({ - adapter, - databaseSchemaPath, - fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), - projection, - select, - selectMode, - withinLocalizedField, - }) - break - + case 'array': case 'group': - case 'tab': - case 'array': { + + case 'tab': { let fieldSelect: SelectType if (field.type === 'tab' && !tabHasName(field)) { @@ -206,6 +182,30 @@ const traverseFields = ({ break } + case 'collapsible': + case 'row': + traverseFields({ + adapter, + databaseSchemaPath, + fields: field.fields, + projection, + select, + selectMode, + withinLocalizedField, + }) + break + + case 'tabs': + traverseFields({ + adapter, + databaseSchemaPath, + fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), + projection, + select, + selectMode, + withinLocalizedField, + }) + break default: break diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts index d7b2a5b9e2..ad1e8a2122 100644 --- a/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts @@ -13,44 +13,6 @@ type Args = { export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => { fields.forEach((field) => { switch (field.type) { - case 'group': { - const newPath = `${path ? `${path}.` : ''}${field.name}` - const newDoc = doc?.[field.name] - - if (typeof newDoc === 'object' && newDoc !== null) { - if (field.localized) { - Object.entries(newDoc).forEach(([locale, localeDoc]) => { - return traverseFields({ - doc: localeDoc, - fields: field.fields, - locale, - path: newPath, - rows, - }) - }) - } else { - return traverseFields({ - doc: newDoc as Record, - fields: field.fields, - path: newPath, - rows, - }) - } - } - - break - } - - case 'row': - case 'collapsible': { - return traverseFields({ - doc, - fields: field.fields, - path, - rows, - }) - } - case 'array': { const rowData = doc?.[field.name] @@ -124,45 +86,47 @@ export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => { break } - - case 'tabs': { - return field.tabs.forEach((tab) => { - if (tabHasName(tab)) { - const newDoc = doc?.[tab.name] - const newPath = `${path ? `${path}.` : ''}${tab.name}` - - if (typeof newDoc === 'object' && newDoc !== null) { - if (tab.localized) { - Object.entries(newDoc).forEach(([locale, localeDoc]) => { - return traverseFields({ - doc: localeDoc, - fields: tab.fields, - locale, - path: newPath, - rows, - }) - }) - } else { - return traverseFields({ - doc: newDoc as Record, - fields: tab.fields, - path: newPath, - rows, - }) - } - } - } else { - traverseFields({ - doc, - fields: tab.fields, - path, - rows, - }) - } + case 'collapsible': + // falls through + case 'row': { + return traverseFields({ + doc, + fields: field.fields, + path, + rows, }) } + case 'group': { + const newPath = `${path ? `${path}.` : ''}${field.name}` + const newDoc = doc?.[field.name] + + if (typeof newDoc === 'object' && newDoc !== null) { + if (field.localized) { + Object.entries(newDoc).forEach(([locale, localeDoc]) => { + return traverseFields({ + doc: localeDoc, + fields: field.fields, + locale, + path: newPath, + rows, + }) + }) + } else { + return traverseFields({ + doc: newDoc as Record, + fields: field.fields, + path: newPath, + rows, + }) + } + } + + break + } + case 'relationship': + // falls through case 'upload': { if (typeof field.relationTo === 'string') { if (field.type === 'upload' || !field.hasMany) { @@ -211,6 +175,43 @@ export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => { } } } + break + } + case 'tabs': { + return field.tabs.forEach((tab) => { + if (tabHasName(tab)) { + const newDoc = doc?.[tab.name] + const newPath = `${path ? `${path}.` : ''}${tab.name}` + + if (typeof newDoc === 'object' && newDoc !== null) { + if (tab.localized) { + Object.entries(newDoc).forEach(([locale, localeDoc]) => { + return traverseFields({ + doc: localeDoc, + fields: tab.fields, + locale, + path: newPath, + rows, + }) + }) + } else { + return traverseFields({ + doc: newDoc as Record, + fields: tab.fields, + path: newPath, + rows, + }) + } + } + } else { + traverseFields({ + doc, + fields: tab.fields, + path, + rows, + }) + } + }) } } }) diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts index 5b751eaef3..a315922f2b 100644 --- a/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts @@ -27,30 +27,6 @@ type Args = { export const traverseFields = (args: Args) => { args.fields.forEach((field) => { switch (field.type) { - case 'group': { - let newTableName = `${args.newTableName}_${toSnakeCase(field.name)}` - - if (field.localized && args.payload.config.localization) { - newTableName += args.adapter.localesSuffix - } - - return traverseFields({ - ...args, - columnPrefix: `${args.columnPrefix}${toSnakeCase(field.name)}_`, - fields: field.fields, - newTableName, - path: `${args.path ? `${args.path}.` : ''}${field.name}`, - }) - } - - case 'row': - case 'collapsible': { - return traverseFields({ - ...args, - fields: field.fields, - }) - } - case 'array': { const newTableName = args.adapter.tableNameMap.get( `${args.newTableName}_${toSnakeCase(field.name)}`, @@ -82,7 +58,42 @@ export const traverseFields = (args: Args) => { }) }) } + case 'collapsible': + case 'row': { + return traverseFields({ + ...args, + fields: field.fields, + }) + } + + case 'group': { + let newTableName = `${args.newTableName}_${toSnakeCase(field.name)}` + + if (field.localized && args.payload.config.localization) { + newTableName += args.adapter.localesSuffix + } + + return traverseFields({ + ...args, + columnPrefix: `${args.columnPrefix}${toSnakeCase(field.name)}_`, + fields: field.fields, + newTableName, + path: `${args.path ? `${args.path}.` : ''}${field.name}`, + }) + } + + case 'relationship': + + case 'upload': { + if (typeof field.relationTo === 'string') { + if (field.type === 'upload' || !field.hasMany) { + args.pathsToQuery.add(`${args.path ? `${args.path}.` : ''}${field.name}`) + } + } + + return null + } case 'tabs': { return field.tabs.forEach((tab) => { if (tabHasName(tab)) { @@ -101,17 +112,6 @@ export const traverseFields = (args: Args) => { }) }) } - - case 'relationship': - case 'upload': { - if (typeof field.relationTo === 'string') { - if (field.type === 'upload' || !field.hasMany) { - args.pathsToQuery.add(`${args.path ? `${args.path}.` : ''}${field.name}`) - } - } - - return null - } } }) } diff --git a/packages/db-sqlite/src/schema/traverseFields.ts b/packages/db-sqlite/src/schema/traverseFields.ts index d59c358e82..ef2b692af5 100644 --- a/packages/db-sqlite/src/schema/traverseFields.ts +++ b/packages/db-sqlite/src/schema/traverseFields.ts @@ -179,183 +179,6 @@ export const traverseFields = ({ } switch (field.type) { - case 'text': { - if (field.hasMany) { - const isLocalized = - Boolean(field.localized && adapter.payload.config.localization) || - withinLocalizedArrayOrBlock || - forceLocalized - - if (isLocalized) { - hasLocalizedManyTextField = true - } - - if (field.index) { - hasManyTextField = 'index' - } else if (!hasManyTextField) { - hasManyTextField = true - } - - if (field.unique) { - throw new InvalidConfiguration( - 'Unique is not supported in SQLite for hasMany text fields.', - ) - } - } else { - targetTable[fieldName] = withDefault(text(columnName), field) - } - break - } - case 'email': - case 'code': - case 'textarea': { - targetTable[fieldName] = withDefault(text(columnName), field) - break - } - - case 'number': { - if (field.hasMany) { - const isLocalized = - Boolean(field.localized && adapter.payload.config.localization) || - withinLocalizedArrayOrBlock || - forceLocalized - - if (isLocalized) { - hasLocalizedManyNumberField = true - } - - if (field.index) { - hasManyNumberField = 'index' - } else if (!hasManyNumberField) { - hasManyNumberField = true - } - - if (field.unique) { - throw new InvalidConfiguration( - 'Unique is not supported in Postgres for hasMany number fields.', - ) - } - } else { - targetTable[fieldName] = withDefault(numeric(columnName), field) - } - break - } - - case 'richText': - case 'json': { - targetTable[fieldName] = withDefault(text(columnName, { mode: 'json' }), field) - break - } - - case 'date': { - targetTable[fieldName] = withDefault(text(columnName), field) - break - } - - case 'point': { - break - } - - case 'radio': - case 'select': { - const options = field.options.map((option) => { - if (optionIsObject(option)) { - return option.value - } - - return option - }) as [string, ...string[]] - - if (field.type === 'select' && field.hasMany) { - const selectTableName = createTableName({ - adapter, - config: field, - parentTableName: newTableName, - prefix: `${newTableName}_`, - versionsCustomName: versions, - }) - const baseColumns: Record = { - order: integer('order').notNull(), - parent: getIDColumn({ - name: 'parent_id', - type: parentIDColType, - notNull: true, - primaryKey: false, - }), - value: text('value', { enum: options }), - } - - const baseExtraConfig: BaseExtraConfig = { - orderIdx: (cols) => index(`${selectTableName}_order_idx`).on(cols.order), - parentFk: (cols) => - foreignKey({ - name: `${selectTableName}_parent_fk`, - columns: [cols.parent], - foreignColumns: [adapter.tables[parentTableName].id], - }).onDelete('cascade'), - parentIdx: (cols) => index(`${selectTableName}_parent_idx`).on(cols.parent), - } - - const isLocalized = - Boolean(field.localized && adapter.payload.config.localization) || - withinLocalizedArrayOrBlock || - forceLocalized - - if (isLocalized) { - baseColumns.locale = text('locale', { enum: locales }).notNull() - baseExtraConfig.localeIdx = (cols) => - index(`${selectTableName}_locale_idx`).on(cols.locale) - } - - if (field.index) { - baseExtraConfig.value = (cols) => index(`${selectTableName}_value_idx`).on(cols.value) - } - - buildTable({ - adapter, - baseColumns, - baseExtraConfig, - disableNotNull, - disableUnique, - fields: [], - rootTableName, - tableName: selectTableName, - versions, - }) - - relationsToBuild.set(fieldName, { - type: 'many', - // selects have their own localized table, independent of the base table. - localized: false, - target: selectTableName, - }) - - adapter.relations[`relations_${selectTableName}`] = relations( - adapter.tables[selectTableName], - ({ one }) => ({ - parent: one(adapter.tables[parentTableName], { - fields: [adapter.tables[selectTableName].parent], - references: [adapter.tables[parentTableName].id], - relationName: fieldName, - }), - }), - ) - } else { - targetTable[fieldName] = withDefault( - text(columnName, { - enum: options, - }), - field, - ) - } - break - } - - case 'checkbox': { - targetTable[fieldName] = withDefault(integer(columnName, { mode: 'boolean' }), field) - break - } - case 'array': { const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull @@ -493,7 +316,6 @@ export const traverseFields = ({ break } - case 'blocks': { const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull @@ -646,9 +468,82 @@ export const traverseFields = ({ break } + case 'checkbox': { + targetTable[fieldName] = withDefault(integer(columnName, { mode: 'boolean' }), field) + break + } + case 'code': - case 'tab': - case 'group': { + case 'email': + + case 'textarea': { + targetTable[fieldName] = withDefault(text(columnName), field) + break + } + case 'collapsible': + + case 'row': { + const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + const { + hasLocalizedField: rowHasLocalizedField, + hasLocalizedManyNumberField: rowHasLocalizedManyNumberField, + hasLocalizedManyTextField: rowHasLocalizedManyTextField, + hasLocalizedRelationshipField: rowHasLocalizedRelationshipField, + hasManyNumberField: rowHasManyNumberField, + hasManyTextField: rowHasManyTextField, + } = traverseFields({ + adapter, + columnPrefix, + columns, + disableNotNull: disableNotNullFromHere, + disableUnique, + fieldPrefix, + fields: field.fields, + forceLocalized, + indexes, + locales, + localesColumns, + localesIndexes, + newTableName, + parentTableName, + relationships, + relationsToBuild, + rootRelationsToBuild, + rootTableIDColType, + rootTableName, + uniqueRelationships, + versions, + withinLocalizedArrayOrBlock, + }) + + if (rowHasLocalizedField) { + hasLocalizedField = true + } + if (rowHasLocalizedRelationshipField) { + hasLocalizedRelationshipField = true + } + if (rowHasManyTextField) { + hasManyTextField = true + } + if (rowHasLocalizedManyTextField) { + hasLocalizedManyTextField = true + } + if (rowHasManyNumberField) { + hasManyNumberField = true + } + if (rowHasLocalizedManyNumberField) { + hasLocalizedManyNumberField = true + } + break + } + + case 'date': { + targetTable[fieldName] = withDefault(text(columnName), field) + break + } + + case 'group': + case 'tab': { if (!('name' in field)) { const { hasLocalizedField: groupHasLocalizedField, @@ -758,114 +653,136 @@ export const traverseFields = ({ break } - case 'tabs': { - const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + case 'json': - const { - hasLocalizedField: tabHasLocalizedField, - hasLocalizedManyNumberField: tabHasLocalizedManyNumberField, - hasLocalizedManyTextField: tabHasLocalizedManyTextField, - hasLocalizedRelationshipField: tabHasLocalizedRelationshipField, - hasManyNumberField: tabHasManyNumberField, - hasManyTextField: tabHasManyTextField, - } = traverseFields({ - adapter, - columnPrefix, - columns, - disableNotNull: disableNotNullFromHere, - disableUnique, - fieldPrefix, - fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), - forceLocalized, - indexes, - locales, - localesColumns, - localesIndexes, - newTableName, - parentTableName, - relationships, - relationsToBuild, - rootRelationsToBuild, - rootTableIDColType, - rootTableName, - uniqueRelationships, - versions, - withinLocalizedArrayOrBlock, - }) + case 'richText': { + targetTable[fieldName] = withDefault(text(columnName, { mode: 'json' }), field) + break + } - if (tabHasLocalizedField) { - hasLocalizedField = true - } - if (tabHasLocalizedRelationshipField) { - hasLocalizedRelationshipField = true - } - if (tabHasManyTextField) { - hasManyTextField = true - } - if (tabHasLocalizedManyTextField) { - hasLocalizedManyTextField = true - } - if (tabHasManyNumberField) { - hasManyNumberField = true - } - if (tabHasLocalizedManyNumberField) { - hasLocalizedManyNumberField = true + case 'number': { + if (field.hasMany) { + const isLocalized = + Boolean(field.localized && adapter.payload.config.localization) || + withinLocalizedArrayOrBlock || + forceLocalized + + if (isLocalized) { + hasLocalizedManyNumberField = true + } + + if (field.index) { + hasManyNumberField = 'index' + } else if (!hasManyNumberField) { + hasManyNumberField = true + } + + if (field.unique) { + throw new InvalidConfiguration( + 'Unique is not supported in Postgres for hasMany number fields.', + ) + } + } else { + targetTable[fieldName] = withDefault(numeric(columnName), field) } break } - case 'row': - case 'collapsible': { - const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull - const { - hasLocalizedField: rowHasLocalizedField, - hasLocalizedManyNumberField: rowHasLocalizedManyNumberField, - hasLocalizedManyTextField: rowHasLocalizedManyTextField, - hasLocalizedRelationshipField: rowHasLocalizedRelationshipField, - hasManyNumberField: rowHasManyNumberField, - hasManyTextField: rowHasManyTextField, - } = traverseFields({ - adapter, - columnPrefix, - columns, - disableNotNull: disableNotNullFromHere, - disableUnique, - fieldPrefix, - fields: field.fields, - forceLocalized, - indexes, - locales, - localesColumns, - localesIndexes, - newTableName, - parentTableName, - relationships, - relationsToBuild, - rootRelationsToBuild, - rootTableIDColType, - rootTableName, - uniqueRelationships, - versions, - withinLocalizedArrayOrBlock, - }) + case 'point': { + break + } + case 'radio': - if (rowHasLocalizedField) { - hasLocalizedField = true - } - if (rowHasLocalizedRelationshipField) { - hasLocalizedRelationshipField = true - } - if (rowHasManyTextField) { - hasManyTextField = true - } - if (rowHasLocalizedManyTextField) { - hasLocalizedManyTextField = true - } - if (rowHasManyNumberField) { - hasManyNumberField = true - } - if (rowHasLocalizedManyNumberField) { - hasLocalizedManyNumberField = true + case 'select': { + const options = field.options.map((option) => { + if (optionIsObject(option)) { + return option.value + } + + return option + }) as [string, ...string[]] + + if (field.type === 'select' && field.hasMany) { + const selectTableName = createTableName({ + adapter, + config: field, + parentTableName: newTableName, + prefix: `${newTableName}_`, + versionsCustomName: versions, + }) + const baseColumns: Record = { + order: integer('order').notNull(), + parent: getIDColumn({ + name: 'parent_id', + type: parentIDColType, + notNull: true, + primaryKey: false, + }), + value: text('value', { enum: options }), + } + + const baseExtraConfig: BaseExtraConfig = { + orderIdx: (cols) => index(`${selectTableName}_order_idx`).on(cols.order), + parentFk: (cols) => + foreignKey({ + name: `${selectTableName}_parent_fk`, + columns: [cols.parent], + foreignColumns: [adapter.tables[parentTableName].id], + }).onDelete('cascade'), + parentIdx: (cols) => index(`${selectTableName}_parent_idx`).on(cols.parent), + } + + const isLocalized = + Boolean(field.localized && adapter.payload.config.localization) || + withinLocalizedArrayOrBlock || + forceLocalized + + if (isLocalized) { + baseColumns.locale = text('locale', { enum: locales }).notNull() + baseExtraConfig.localeIdx = (cols) => + index(`${selectTableName}_locale_idx`).on(cols.locale) + } + + if (field.index) { + baseExtraConfig.value = (cols) => index(`${selectTableName}_value_idx`).on(cols.value) + } + + buildTable({ + adapter, + baseColumns, + baseExtraConfig, + disableNotNull, + disableUnique, + fields: [], + rootTableName, + tableName: selectTableName, + versions, + }) + + relationsToBuild.set(fieldName, { + type: 'many', + // selects have their own localized table, independent of the base table. + localized: false, + target: selectTableName, + }) + + adapter.relations[`relations_${selectTableName}`] = relations( + adapter.tables[selectTableName], + ({ one }) => ({ + parent: one(adapter.tables[parentTableName], { + fields: [adapter.tables[selectTableName].parent], + references: [adapter.tables[parentTableName].id], + relationName: fieldName, + }), + }), + ) + } else { + targetTable[fieldName] = withDefault( + text(columnName, { + enum: options, + }), + field, + ) } break } @@ -931,6 +848,89 @@ export const traverseFields = ({ break + case 'tabs': { + const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + + const { + hasLocalizedField: tabHasLocalizedField, + hasLocalizedManyNumberField: tabHasLocalizedManyNumberField, + hasLocalizedManyTextField: tabHasLocalizedManyTextField, + hasLocalizedRelationshipField: tabHasLocalizedRelationshipField, + hasManyNumberField: tabHasManyNumberField, + hasManyTextField: tabHasManyTextField, + } = traverseFields({ + adapter, + columnPrefix, + columns, + disableNotNull: disableNotNullFromHere, + disableUnique, + fieldPrefix, + fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), + forceLocalized, + indexes, + locales, + localesColumns, + localesIndexes, + newTableName, + parentTableName, + relationships, + relationsToBuild, + rootRelationsToBuild, + rootTableIDColType, + rootTableName, + uniqueRelationships, + versions, + withinLocalizedArrayOrBlock, + }) + + if (tabHasLocalizedField) { + hasLocalizedField = true + } + if (tabHasLocalizedRelationshipField) { + hasLocalizedRelationshipField = true + } + if (tabHasManyTextField) { + hasManyTextField = true + } + if (tabHasLocalizedManyTextField) { + hasLocalizedManyTextField = true + } + if (tabHasManyNumberField) { + hasManyNumberField = true + } + if (tabHasLocalizedManyNumberField) { + hasLocalizedManyNumberField = true + } + break + } + case 'text': { + if (field.hasMany) { + const isLocalized = + Boolean(field.localized && adapter.payload.config.localization) || + withinLocalizedArrayOrBlock || + forceLocalized + + if (isLocalized) { + hasLocalizedManyTextField = true + } + + if (field.index) { + hasManyTextField = 'index' + } else if (!hasManyTextField) { + hasManyTextField = true + } + + if (field.unique) { + throw new InvalidConfiguration( + 'Unique is not supported in SQLite for hasMany text fields.', + ) + } + } else { + targetTable[fieldName] = withDefault(text(columnName), field) + } + break + } + default: break } diff --git a/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts b/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts index d7b2a5b9e2..ad1e8a2122 100644 --- a/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts +++ b/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts @@ -13,44 +13,6 @@ type Args = { export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => { fields.forEach((field) => { switch (field.type) { - case 'group': { - const newPath = `${path ? `${path}.` : ''}${field.name}` - const newDoc = doc?.[field.name] - - if (typeof newDoc === 'object' && newDoc !== null) { - if (field.localized) { - Object.entries(newDoc).forEach(([locale, localeDoc]) => { - return traverseFields({ - doc: localeDoc, - fields: field.fields, - locale, - path: newPath, - rows, - }) - }) - } else { - return traverseFields({ - doc: newDoc as Record, - fields: field.fields, - path: newPath, - rows, - }) - } - } - - break - } - - case 'row': - case 'collapsible': { - return traverseFields({ - doc, - fields: field.fields, - path, - rows, - }) - } - case 'array': { const rowData = doc?.[field.name] @@ -124,45 +86,47 @@ export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => { break } - - case 'tabs': { - return field.tabs.forEach((tab) => { - if (tabHasName(tab)) { - const newDoc = doc?.[tab.name] - const newPath = `${path ? `${path}.` : ''}${tab.name}` - - if (typeof newDoc === 'object' && newDoc !== null) { - if (tab.localized) { - Object.entries(newDoc).forEach(([locale, localeDoc]) => { - return traverseFields({ - doc: localeDoc, - fields: tab.fields, - locale, - path: newPath, - rows, - }) - }) - } else { - return traverseFields({ - doc: newDoc as Record, - fields: tab.fields, - path: newPath, - rows, - }) - } - } - } else { - traverseFields({ - doc, - fields: tab.fields, - path, - rows, - }) - } + case 'collapsible': + // falls through + case 'row': { + return traverseFields({ + doc, + fields: field.fields, + path, + rows, }) } + case 'group': { + const newPath = `${path ? `${path}.` : ''}${field.name}` + const newDoc = doc?.[field.name] + + if (typeof newDoc === 'object' && newDoc !== null) { + if (field.localized) { + Object.entries(newDoc).forEach(([locale, localeDoc]) => { + return traverseFields({ + doc: localeDoc, + fields: field.fields, + locale, + path: newPath, + rows, + }) + }) + } else { + return traverseFields({ + doc: newDoc as Record, + fields: field.fields, + path: newPath, + rows, + }) + } + } + + break + } + case 'relationship': + // falls through case 'upload': { if (typeof field.relationTo === 'string') { if (field.type === 'upload' || !field.hasMany) { @@ -211,6 +175,43 @@ export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => { } } } + break + } + case 'tabs': { + return field.tabs.forEach((tab) => { + if (tabHasName(tab)) { + const newDoc = doc?.[tab.name] + const newPath = `${path ? `${path}.` : ''}${tab.name}` + + if (typeof newDoc === 'object' && newDoc !== null) { + if (tab.localized) { + Object.entries(newDoc).forEach(([locale, localeDoc]) => { + return traverseFields({ + doc: localeDoc, + fields: tab.fields, + locale, + path: newPath, + rows, + }) + }) + } else { + return traverseFields({ + doc: newDoc as Record, + fields: tab.fields, + path: newPath, + rows, + }) + } + } + } else { + traverseFields({ + doc, + fields: tab.fields, + path, + rows, + }) + } + }) } } }) diff --git a/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts b/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts index 1d37595b8f..2c9eeadb5b 100644 --- a/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts +++ b/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts @@ -27,30 +27,6 @@ type Args = { export const traverseFields = (args: Args) => { args.fields.forEach((field) => { switch (field.type) { - case 'group': { - let newTableName = `${args.newTableName}_${toSnakeCase(field.name)}` - - if (field.localized && args.payload.config.localization) { - newTableName += args.adapter.localesSuffix - } - - return traverseFields({ - ...args, - columnPrefix: `${args.columnPrefix}${toSnakeCase(field.name)}_`, - fields: field.fields, - newTableName, - path: `${args.path ? `${args.path}.` : ''}${field.name}`, - }) - } - - case 'row': - case 'collapsible': { - return traverseFields({ - ...args, - fields: field.fields, - }) - } - case 'array': { const newTableName = args.adapter.tableNameMap.get( `${args.newTableName}_${toSnakeCase(field.name)}`, @@ -82,7 +58,42 @@ export const traverseFields = (args: Args) => { }) }) } + case 'collapsible': + case 'row': { + return traverseFields({ + ...args, + fields: field.fields, + }) + } + + case 'group': { + let newTableName = `${args.newTableName}_${toSnakeCase(field.name)}` + + if (field.localized && args.payload.config.localization) { + newTableName += args.adapter.localesSuffix + } + + return traverseFields({ + ...args, + columnPrefix: `${args.columnPrefix}${toSnakeCase(field.name)}_`, + fields: field.fields, + newTableName, + path: `${args.path ? `${args.path}.` : ''}${field.name}`, + }) + } + + case 'relationship': + + case 'upload': { + if (typeof field.relationTo === 'string') { + if (field.type === 'upload' || !field.hasMany) { + args.pathsToQuery.add(`${args.path ? `${args.path}.` : ''}${field.name}`) + } + } + + return null + } case 'tabs': { return field.tabs.forEach((tab) => { if (tabHasName(tab)) { @@ -101,17 +112,6 @@ export const traverseFields = (args: Args) => { }) }) } - - case 'relationship': - case 'upload': { - if (typeof field.relationTo === 'string') { - if (field.type === 'upload' || !field.hasMany) { - args.pathsToQuery.add(`${args.path ? `${args.path}.` : ''}${field.name}`) - } - } - - return null - } } }) } diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index 0222536395..152a0510fb 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -218,32 +218,6 @@ export const traverseFields = ({ break } - case 'select': { - if (field.hasMany) { - if (select) { - if ( - (selectMode === 'include' && !select[field.name]) || - (selectMode === 'exclude' && select[field.name] === false) - ) { - break - } - } - - const withSelect: Result = { - columns: { - id: false, - order: false, - parent: false, - }, - orderBy: ({ order }, { asc }) => [asc(order)], - } - - currentArgs.with[`${path}${field.name}`] = withSelect - } - - break - } - case 'blocks': { const blocksSelect = selectAllOnCurrentLevel ? true : select?.[field.name] @@ -356,6 +330,7 @@ export const traverseFields = ({ } case 'group': + case 'tab': { const fieldSelect = select?.[field.name] @@ -389,47 +364,6 @@ export const traverseFields = ({ break } - - case 'point': { - if (adapter.name === 'sqlite') { - break - } - - const args = field.localized ? _locales : currentArgs - if (!args.columns) { - args.columns = {} - } - - if (!args.extras) { - args.extras = {} - } - - const name = `${path}${field.name}` - - // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526 - // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON - args.columns[name] = false - - let shouldSelect = false - - if (select || selectAllOnCurrentLevel) { - if ( - selectAllOnCurrentLevel || - (selectMode === 'include' && select[field.name] === true) || - (selectMode === 'exclude' && typeof select[field.name] === 'undefined') - ) { - shouldSelect = true - } - } else { - shouldSelect = true - } - - if (shouldSelect) { - args.extras[name] = sql.raw(`ST_AsGeoJSON(${toSnakeCase(name)})::jsonb`).as(name) - } - break - } - case 'join': { // when `joinsQuery` is false, do not join if (joinQuery === false) { @@ -621,6 +555,72 @@ export const traverseFields = ({ break } + case 'point': { + if (adapter.name === 'sqlite') { + break + } + + const args = field.localized ? _locales : currentArgs + if (!args.columns) { + args.columns = {} + } + + if (!args.extras) { + args.extras = {} + } + + const name = `${path}${field.name}` + + // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526 + // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON + args.columns[name] = false + + let shouldSelect = false + + if (select || selectAllOnCurrentLevel) { + if ( + selectAllOnCurrentLevel || + (selectMode === 'include' && select[field.name] === true) || + (selectMode === 'exclude' && typeof select[field.name] === 'undefined') + ) { + shouldSelect = true + } + } else { + shouldSelect = true + } + + if (shouldSelect) { + args.extras[name] = sql.raw(`ST_AsGeoJSON(${toSnakeCase(name)})::jsonb`).as(name) + } + break + } + + case 'select': { + if (field.hasMany) { + if (select) { + if ( + (selectMode === 'include' && !select[field.name]) || + (selectMode === 'exclude' && select[field.name] === false) + ) { + break + } + } + + const withSelect: Result = { + columns: { + id: false, + order: false, + parent: false, + }, + orderBy: ({ order }, { asc }) => [asc(order)], + } + + currentArgs.with[`${path}${field.name}`] = withSelect + } + + break + } + default: { if (!select && !selectAllOnCurrentLevel) { break diff --git a/packages/drizzle/src/postgres/schema/traverseFields.ts b/packages/drizzle/src/postgres/schema/traverseFields.ts index 250a25a40d..f670e0f39f 100644 --- a/packages/drizzle/src/postgres/schema/traverseFields.ts +++ b/packages/drizzle/src/postgres/schema/traverseFields.ts @@ -182,197 +182,6 @@ export const traverseFields = ({ } switch (field.type) { - case 'text': { - if (field.hasMany) { - const isLocalized = - Boolean(field.localized && adapter.payload.config.localization) || - withinLocalizedArrayOrBlock || - forceLocalized - - if (isLocalized) { - hasLocalizedManyTextField = true - } - - if (field.index) { - hasManyTextField = 'index' - } else if (!hasManyTextField) { - hasManyTextField = true - } - - if (field.unique) { - throw new InvalidConfiguration( - 'Unique is not supported in Postgres for hasMany text fields.', - ) - } - } else { - targetTable[fieldName] = withDefault(varchar(columnName), field) - } - break - } - case 'email': - case 'code': - case 'textarea': { - targetTable[fieldName] = withDefault(varchar(columnName), field) - break - } - - case 'number': { - if (field.hasMany) { - const isLocalized = - Boolean(field.localized && adapter.payload.config.localization) || - withinLocalizedArrayOrBlock || - forceLocalized - - if (isLocalized) { - hasLocalizedManyNumberField = true - } - - if (field.index) { - hasManyNumberField = 'index' - } else if (!hasManyNumberField) { - hasManyNumberField = true - } - - if (field.unique) { - throw new InvalidConfiguration( - 'Unique is not supported in Postgres for hasMany number fields.', - ) - } - } else { - targetTable[fieldName] = withDefault(numeric(columnName), field) - } - break - } - - case 'richText': - case 'json': { - targetTable[fieldName] = withDefault(jsonb(columnName), field) - break - } - - case 'date': { - targetTable[fieldName] = withDefault( - timestamp(columnName, { - mode: 'string', - precision: 3, - withTimezone: true, - }), - field, - ) - break - } - - case 'point': { - targetTable[fieldName] = withDefault(geometryColumn(columnName), field) - if (!adapter.extensions.postgis) { - adapter.extensions.postgis = true - } - break - } - - case 'radio': - case 'select': { - const enumName = createTableName({ - adapter, - config: field, - parentTableName: newTableName, - prefix: `enum_${newTableName}_`, - target: 'enumName', - throwValidationError, - }) - - adapter.enums[enumName] = adapter.pgSchema.enum( - enumName, - field.options.map((option) => { - if (optionIsObject(option)) { - return option.value - } - - return option - }) as [string, ...string[]], - ) - - if (field.type === 'select' && field.hasMany) { - const selectTableName = createTableName({ - adapter, - config: field, - parentTableName: newTableName, - prefix: `${newTableName}_`, - throwValidationError, - versionsCustomName: versions, - }) - const baseColumns: Record = { - order: integer('order').notNull(), - parent: parentIDColumnMap[parentIDColType]('parent_id').notNull(), - value: adapter.enums[enumName]('value'), - } - - const baseExtraConfig: BaseExtraConfig = { - orderIdx: (cols) => index(`${selectTableName}_order_idx`).on(cols.order), - parentFk: (cols) => - foreignKey({ - name: `${selectTableName}_parent_fk`, - columns: [cols.parent], - foreignColumns: [adapter.tables[parentTableName].id], - }).onDelete('cascade'), - parentIdx: (cols) => index(`${selectTableName}_parent_idx`).on(cols.parent), - } - - const isLocalized = - Boolean(field.localized && adapter.payload.config.localization) || - withinLocalizedArrayOrBlock || - forceLocalized - - if (isLocalized) { - baseColumns.locale = adapter.enums.enum__locales('locale').notNull() - baseExtraConfig.localeIdx = (cols) => - index(`${selectTableName}_locale_idx`).on(cols.locale) - } - - if (field.index) { - baseExtraConfig.value = (cols) => index(`${selectTableName}_value_idx`).on(cols.value) - } - - buildTable({ - adapter, - baseColumns, - baseExtraConfig, - disableNotNull, - disableUnique, - fields: [], - rootTableName, - tableName: selectTableName, - versions, - }) - - relationsToBuild.set(fieldName, { - type: 'many', - // selects have their own localized table, independent of the base table. - localized: false, - target: selectTableName, - }) - - adapter.relations[`relations_${selectTableName}`] = relations( - adapter.tables[selectTableName], - ({ one }) => ({ - parent: one(adapter.tables[parentTableName], { - fields: [adapter.tables[selectTableName].parent], - references: [adapter.tables[parentTableName].id], - relationName: fieldName, - }), - }), - ) - } else { - targetTable[fieldName] = withDefault(adapter.enums[enumName](columnName), field) - } - break - } - - case 'checkbox': { - targetTable[fieldName] = withDefault(boolean(columnName), field) - break - } - case 'array': { const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull @@ -506,7 +315,6 @@ export const traverseFields = ({ break } - case 'blocks': { const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull @@ -655,9 +463,88 @@ export const traverseFields = ({ break } + case 'checkbox': { + targetTable[fieldName] = withDefault(boolean(columnName), field) + break + } + case 'code': - case 'tab': - case 'group': { + case 'email': + + case 'textarea': { + targetTable[fieldName] = withDefault(varchar(columnName), field) + break + } + case 'collapsible': + + case 'row': { + const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + const { + hasLocalizedField: rowHasLocalizedField, + hasLocalizedManyNumberField: rowHasLocalizedManyNumberField, + hasLocalizedManyTextField: rowHasLocalizedManyTextField, + hasLocalizedRelationshipField: rowHasLocalizedRelationshipField, + hasManyNumberField: rowHasManyNumberField, + hasManyTextField: rowHasManyTextField, + } = traverseFields({ + adapter, + columnPrefix, + columns, + disableNotNull: disableNotNullFromHere, + disableUnique, + fieldPrefix, + fields: field.fields, + forceLocalized, + indexes, + localesColumns, + localesIndexes, + newTableName, + parentTableName, + relationships, + relationsToBuild, + rootRelationsToBuild, + rootTableIDColType, + rootTableName, + uniqueRelationships, + versions, + withinLocalizedArrayOrBlock, + }) + + if (rowHasLocalizedField) { + hasLocalizedField = true + } + if (rowHasLocalizedRelationshipField) { + hasLocalizedRelationshipField = true + } + if (rowHasManyTextField) { + hasManyTextField = true + } + if (rowHasLocalizedManyTextField) { + hasLocalizedManyTextField = true + } + if (rowHasManyNumberField) { + hasManyNumberField = true + } + if (rowHasLocalizedManyNumberField) { + hasLocalizedManyNumberField = true + } + break + } + + case 'date': { + targetTable[fieldName] = withDefault( + timestamp(columnName, { + mode: 'string', + precision: 3, + withTimezone: true, + }), + field, + ) + break + } + + case 'group': + case 'tab': { if (!('name' in field)) { const { hasLocalizedField: groupHasLocalizedField, @@ -765,112 +652,143 @@ export const traverseFields = ({ break } - case 'tabs': { - const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + case 'json': - const { - hasLocalizedField: tabHasLocalizedField, - hasLocalizedManyNumberField: tabHasLocalizedManyNumberField, - hasLocalizedManyTextField: tabHasLocalizedManyTextField, - hasLocalizedRelationshipField: tabHasLocalizedRelationshipField, - hasManyNumberField: tabHasManyNumberField, - hasManyTextField: tabHasManyTextField, - } = traverseFields({ - adapter, - columnPrefix, - columns, - disableNotNull: disableNotNullFromHere, - disableUnique, - fieldPrefix, - fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), - forceLocalized, - indexes, - localesColumns, - localesIndexes, - newTableName, - parentTableName, - relationships, - relationsToBuild, - rootRelationsToBuild, - rootTableIDColType, - rootTableName, - uniqueRelationships, - versions, - withinLocalizedArrayOrBlock, - }) + case 'richText': { + targetTable[fieldName] = withDefault(jsonb(columnName), field) + break + } - if (tabHasLocalizedField) { - hasLocalizedField = true - } - if (tabHasLocalizedRelationshipField) { - hasLocalizedRelationshipField = true - } - if (tabHasManyTextField) { - hasManyTextField = true - } - if (tabHasLocalizedManyTextField) { - hasLocalizedManyTextField = true - } - if (tabHasManyNumberField) { - hasManyNumberField = true - } - if (tabHasLocalizedManyNumberField) { - hasLocalizedManyNumberField = true + case 'number': { + if (field.hasMany) { + const isLocalized = + Boolean(field.localized && adapter.payload.config.localization) || + withinLocalizedArrayOrBlock || + forceLocalized + + if (isLocalized) { + hasLocalizedManyNumberField = true + } + + if (field.index) { + hasManyNumberField = 'index' + } else if (!hasManyNumberField) { + hasManyNumberField = true + } + + if (field.unique) { + throw new InvalidConfiguration( + 'Unique is not supported in Postgres for hasMany number fields.', + ) + } + } else { + targetTable[fieldName] = withDefault(numeric(columnName), field) } break } - case 'row': - case 'collapsible': { - const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull - const { - hasLocalizedField: rowHasLocalizedField, - hasLocalizedManyNumberField: rowHasLocalizedManyNumberField, - hasLocalizedManyTextField: rowHasLocalizedManyTextField, - hasLocalizedRelationshipField: rowHasLocalizedRelationshipField, - hasManyNumberField: rowHasManyNumberField, - hasManyTextField: rowHasManyTextField, - } = traverseFields({ + case 'point': { + targetTable[fieldName] = withDefault(geometryColumn(columnName), field) + if (!adapter.extensions.postgis) { + adapter.extensions.postgis = true + } + break + } + case 'radio': + + case 'select': { + const enumName = createTableName({ adapter, - columnPrefix, - columns, - disableNotNull: disableNotNullFromHere, - disableUnique, - fieldPrefix, - fields: field.fields, - forceLocalized, - indexes, - localesColumns, - localesIndexes, - newTableName, - parentTableName, - relationships, - relationsToBuild, - rootRelationsToBuild, - rootTableIDColType, - rootTableName, - uniqueRelationships, - versions, - withinLocalizedArrayOrBlock, + config: field, + parentTableName: newTableName, + prefix: `enum_${newTableName}_`, + target: 'enumName', + throwValidationError, }) - if (rowHasLocalizedField) { - hasLocalizedField = true - } - if (rowHasLocalizedRelationshipField) { - hasLocalizedRelationshipField = true - } - if (rowHasManyTextField) { - hasManyTextField = true - } - if (rowHasLocalizedManyTextField) { - hasLocalizedManyTextField = true - } - if (rowHasManyNumberField) { - hasManyNumberField = true - } - if (rowHasLocalizedManyNumberField) { - hasLocalizedManyNumberField = true + adapter.enums[enumName] = adapter.pgSchema.enum( + enumName, + field.options.map((option) => { + if (optionIsObject(option)) { + return option.value + } + + return option + }) as [string, ...string[]], + ) + + if (field.type === 'select' && field.hasMany) { + const selectTableName = createTableName({ + adapter, + config: field, + parentTableName: newTableName, + prefix: `${newTableName}_`, + throwValidationError, + versionsCustomName: versions, + }) + const baseColumns: Record = { + order: integer('order').notNull(), + parent: parentIDColumnMap[parentIDColType]('parent_id').notNull(), + value: adapter.enums[enumName]('value'), + } + + const baseExtraConfig: BaseExtraConfig = { + orderIdx: (cols) => index(`${selectTableName}_order_idx`).on(cols.order), + parentFk: (cols) => + foreignKey({ + name: `${selectTableName}_parent_fk`, + columns: [cols.parent], + foreignColumns: [adapter.tables[parentTableName].id], + }).onDelete('cascade'), + parentIdx: (cols) => index(`${selectTableName}_parent_idx`).on(cols.parent), + } + + const isLocalized = + Boolean(field.localized && adapter.payload.config.localization) || + withinLocalizedArrayOrBlock || + forceLocalized + + if (isLocalized) { + baseColumns.locale = adapter.enums.enum__locales('locale').notNull() + baseExtraConfig.localeIdx = (cols) => + index(`${selectTableName}_locale_idx`).on(cols.locale) + } + + if (field.index) { + baseExtraConfig.value = (cols) => index(`${selectTableName}_value_idx`).on(cols.value) + } + + buildTable({ + adapter, + baseColumns, + baseExtraConfig, + disableNotNull, + disableUnique, + fields: [], + rootTableName, + tableName: selectTableName, + versions, + }) + + relationsToBuild.set(fieldName, { + type: 'many', + // selects have their own localized table, independent of the base table. + localized: false, + target: selectTableName, + }) + + adapter.relations[`relations_${selectTableName}`] = relations( + adapter.tables[selectTableName], + ({ one }) => ({ + parent: one(adapter.tables[parentTableName], { + fields: [adapter.tables[selectTableName].parent], + references: [adapter.tables[parentTableName].id], + relationName: fieldName, + }), + }), + ) + } else { + targetTable[fieldName] = withDefault(adapter.enums[enumName](columnName), field) } break } @@ -936,6 +854,88 @@ export const traverseFields = ({ break + case 'tabs': { + const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + + const { + hasLocalizedField: tabHasLocalizedField, + hasLocalizedManyNumberField: tabHasLocalizedManyNumberField, + hasLocalizedManyTextField: tabHasLocalizedManyTextField, + hasLocalizedRelationshipField: tabHasLocalizedRelationshipField, + hasManyNumberField: tabHasManyNumberField, + hasManyTextField: tabHasManyTextField, + } = traverseFields({ + adapter, + columnPrefix, + columns, + disableNotNull: disableNotNullFromHere, + disableUnique, + fieldPrefix, + fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), + forceLocalized, + indexes, + localesColumns, + localesIndexes, + newTableName, + parentTableName, + relationships, + relationsToBuild, + rootRelationsToBuild, + rootTableIDColType, + rootTableName, + uniqueRelationships, + versions, + withinLocalizedArrayOrBlock, + }) + + if (tabHasLocalizedField) { + hasLocalizedField = true + } + if (tabHasLocalizedRelationshipField) { + hasLocalizedRelationshipField = true + } + if (tabHasManyTextField) { + hasManyTextField = true + } + if (tabHasLocalizedManyTextField) { + hasLocalizedManyTextField = true + } + if (tabHasManyNumberField) { + hasManyNumberField = true + } + if (tabHasLocalizedManyNumberField) { + hasLocalizedManyNumberField = true + } + break + } + case 'text': { + if (field.hasMany) { + const isLocalized = + Boolean(field.localized && adapter.payload.config.localization) || + withinLocalizedArrayOrBlock || + forceLocalized + + if (isLocalized) { + hasLocalizedManyTextField = true + } + + if (field.index) { + hasManyTextField = 'index' + } else if (!hasManyTextField) { + hasManyTextField = true + } + + if (field.unique) { + throw new InvalidConfiguration( + 'Unique is not supported in Postgres for hasMany text fields.', + ) + } + } else { + targetTable[fieldName] = withDefault(varchar(columnName), field) + } + break + } + default: break } diff --git a/packages/drizzle/src/queries/getTableColumnFromPath.ts b/packages/drizzle/src/queries/getTableColumnFromPath.ts index 6ec9103d35..67a804f3d7 100644 --- a/packages/drizzle/src/queries/getTableColumnFromPath.ts +++ b/packages/drizzle/src/queries/getTableColumnFromPath.ts @@ -121,185 +121,6 @@ export const getTableColumnFromPath = ({ } switch (field.type) { - case 'tabs': { - return getTableColumnFromPath({ - adapter, - aliasTable, - collectionPath, - columnPrefix, - constraintPath, - constraints, - fields: field.tabs.map((tab) => ({ - ...tab, - type: 'tab', - })), - joins, - locale, - pathSegments: pathSegments.slice(1), - rootTableName, - selectFields, - tableName: newTableName, - tableNameSuffix, - value, - }) - } - case 'tab': { - if (tabHasName(field)) { - return getTableColumnFromPath({ - adapter, - aliasTable, - collectionPath, - columnPrefix: `${columnPrefix}${field.name}_`, - constraintPath: `${constraintPath}${field.name}.`, - constraints, - fields: field.fields, - joins, - locale, - pathSegments: pathSegments.slice(1), - rootTableName, - selectFields, - tableName: newTableName, - tableNameSuffix: `${tableNameSuffix}${toSnakeCase(field.name)}_`, - value, - }) - } - return getTableColumnFromPath({ - adapter, - aliasTable, - collectionPath, - columnPrefix, - constraintPath, - constraints, - fields: field.fields, - joins, - locale, - pathSegments: pathSegments.slice(1), - rootTableName, - selectFields, - tableName: newTableName, - tableNameSuffix, - value, - }) - } - - case 'group': { - if (locale && field.localized && adapter.payload.config.localization) { - newTableName = `${tableName}${adapter.localesSuffix}` - - let condition = eq(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID) - - if (locale !== 'all') { - condition = and(condition, eq(adapter.tables[newTableName]._locale, locale)) - } - - addJoinTable({ - condition, - joins, - table: adapter.tables[newTableName], - }) - } - return getTableColumnFromPath({ - adapter, - aliasTable, - collectionPath, - columnPrefix: `${columnPrefix}${field.name}_`, - constraintPath: `${constraintPath}${field.name}.`, - constraints, - fields: field.fields, - joins, - locale, - pathSegments: pathSegments.slice(1), - rootTableName, - selectFields, - tableName: newTableName, - tableNameSuffix: `${tableNameSuffix}${toSnakeCase(field.name)}_`, - value, - }) - } - - case 'select': { - if (field.hasMany) { - const newTableName = adapter.tableNameMap.get( - `${tableName}_${tableNameSuffix}${toSnakeCase(field.name)}`, - ) - - if (locale && field.localized && adapter.payload.config.localization) { - const conditions = [ - eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent), - eq(adapter.tables[newTableName]._locale, locale), - ] - - if (locale !== 'all') { - conditions.push(eq(adapter.tables[newTableName]._locale, locale)) - } - - addJoinTable({ - condition: and(...conditions), - joins, - table: adapter.tables[newTableName], - }) - } else { - addJoinTable({ - condition: eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent), - joins, - table: adapter.tables[newTableName], - }) - } - - return { - columnName: 'value', - constraints, - field, - table: adapter.tables[newTableName], - } - } - break - } - - case 'text': - case 'number': { - if (field.hasMany) { - let tableType = 'texts' - let columnName = 'text' - if (field.type === 'number') { - tableType = 'numbers' - columnName = 'number' - } - newTableName = `${rootTableName}_${tableType}` - const joinConstraints = [ - eq(adapter.tables[rootTableName].id, adapter.tables[newTableName].parent), - like(adapter.tables[newTableName].path, `${constraintPath}${field.name}`), - ] - - if (locale && field.localized && adapter.payload.config.localization) { - const conditions = [...joinConstraints] - - if (locale !== 'all') { - conditions.push(eq(adapter.tables[newTableName]._locale, locale)) - } - addJoinTable({ - condition: and(...conditions), - joins, - table: adapter.tables[newTableName], - }) - } else { - addJoinTable({ - condition: and(...joinConstraints), - joins, - table: adapter.tables[newTableName], - }) - } - - return { - columnName, - constraints, - field, - table: adapter.tables[newTableName], - } - } - break - } - case 'array': { newTableName = adapter.tableNameMap.get( `${tableName}_${tableNameSuffix}${toSnakeCase(field.name)}`, @@ -341,7 +162,6 @@ export const getTableColumnFromPath = ({ value, }) } - case 'blocks': { let blockTableColumn: TableColumn let newTableName: string @@ -447,7 +267,87 @@ export const getTableColumnFromPath = ({ break } + case 'group': { + if (locale && field.localized && adapter.payload.config.localization) { + newTableName = `${tableName}${adapter.localesSuffix}` + + let condition = eq(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID) + + if (locale !== 'all') { + condition = and(condition, eq(adapter.tables[newTableName]._locale, locale)) + } + + addJoinTable({ + condition, + joins, + table: adapter.tables[newTableName], + }) + } + return getTableColumnFromPath({ + adapter, + aliasTable, + collectionPath, + columnPrefix: `${columnPrefix}${field.name}_`, + constraintPath: `${constraintPath}${field.name}.`, + constraints, + fields: field.fields, + joins, + locale, + pathSegments: pathSegments.slice(1), + rootTableName, + selectFields, + tableName: newTableName, + tableNameSuffix: `${tableNameSuffix}${toSnakeCase(field.name)}_`, + value, + }) + } + + case 'number': + + case 'text': { + if (field.hasMany) { + let tableType = 'texts' + let columnName = 'text' + if (field.type === 'number') { + tableType = 'numbers' + columnName = 'number' + } + newTableName = `${rootTableName}_${tableType}` + const joinConstraints = [ + eq(adapter.tables[rootTableName].id, adapter.tables[newTableName].parent), + like(adapter.tables[newTableName].path, `${constraintPath}${field.name}`), + ] + + if (locale && field.localized && adapter.payload.config.localization) { + const conditions = [...joinConstraints] + + if (locale !== 'all') { + conditions.push(eq(adapter.tables[newTableName]._locale, locale)) + } + addJoinTable({ + condition: and(...conditions), + joins, + table: adapter.tables[newTableName], + }) + } else { + addJoinTable({ + condition: and(...joinConstraints), + joins, + table: adapter.tables[newTableName], + }) + } + + return { + columnName, + constraints, + field, + table: adapter.tables[newTableName], + } + } + break + } case 'relationship': + case 'upload': { const newCollectionPath = pathSegments.slice(1).join('.') if (Array.isArray(field.relationTo) || field.hasMany) { @@ -692,6 +592,106 @@ export const getTableColumnFromPath = ({ break } + case 'select': { + if (field.hasMany) { + const newTableName = adapter.tableNameMap.get( + `${tableName}_${tableNameSuffix}${toSnakeCase(field.name)}`, + ) + + if (locale && field.localized && adapter.payload.config.localization) { + const conditions = [ + eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent), + eq(adapter.tables[newTableName]._locale, locale), + ] + + if (locale !== 'all') { + conditions.push(eq(adapter.tables[newTableName]._locale, locale)) + } + + addJoinTable({ + condition: and(...conditions), + joins, + table: adapter.tables[newTableName], + }) + } else { + addJoinTable({ + condition: eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent), + joins, + table: adapter.tables[newTableName], + }) + } + + return { + columnName: 'value', + constraints, + field, + table: adapter.tables[newTableName], + } + } + break + } + + case 'tab': { + if (tabHasName(field)) { + return getTableColumnFromPath({ + adapter, + aliasTable, + collectionPath, + columnPrefix: `${columnPrefix}${field.name}_`, + constraintPath: `${constraintPath}${field.name}.`, + constraints, + fields: field.fields, + joins, + locale, + pathSegments: pathSegments.slice(1), + rootTableName, + selectFields, + tableName: newTableName, + tableNameSuffix: `${tableNameSuffix}${toSnakeCase(field.name)}_`, + value, + }) + } + return getTableColumnFromPath({ + adapter, + aliasTable, + collectionPath, + columnPrefix, + constraintPath, + constraints, + fields: field.fields, + joins, + locale, + pathSegments: pathSegments.slice(1), + rootTableName, + selectFields, + tableName: newTableName, + tableNameSuffix, + value, + }) + } + case 'tabs': { + return getTableColumnFromPath({ + adapter, + aliasTable, + collectionPath, + columnPrefix, + constraintPath, + constraints, + fields: field.tabs.map((tab) => ({ + ...tab, + type: 'tab', + })), + joins, + locale, + pathSegments: pathSegments.slice(1), + rootTableName, + selectFields, + tableName: newTableName, + tableNameSuffix, + value, + }) + } + default: { // fall through break diff --git a/packages/drizzle/src/queries/parseParams.ts b/packages/drizzle/src/queries/parseParams.ts index 7de9eba643..f01bac9a52 100644 --- a/packages/drizzle/src/queries/parseParams.ts +++ b/packages/drizzle/src/queries/parseParams.ts @@ -295,6 +295,13 @@ export function parseParams({ if (field.type === 'point' && adapter.name === 'postgres') { switch (operator) { + case 'intersects': { + constraints.push( + sql`ST_Intersects(${table[columnName]}, ST_GeomFromGeoJSON(${JSON.stringify(queryValue)}))`, + ) + break + } + case 'near': { const [lng, lat, maxDistance, minDistance] = queryValue as number[] @@ -313,13 +320,6 @@ export function parseParams({ break } - case 'intersects': { - constraints.push( - sql`ST_Intersects(${table[columnName]}, ST_GeomFromGeoJSON(${JSON.stringify(queryValue)}))`, - ) - break - } - default: break } diff --git a/packages/drizzle/src/transform/read/traverseFields.ts b/packages/drizzle/src/transform/read/traverseFields.ts index 4f7feacdac..5950d37a43 100644 --- a/packages/drizzle/src/transform/read/traverseFields.ts +++ b/packages/drizzle/src/transform/read/traverseFields.ts @@ -593,8 +593,16 @@ export const traverseFields = >({ let val = fieldData switch (field.type) { - case 'tab': - case 'group': { + case 'date': { + if (typeof fieldData === 'string') { + val = new Date(fieldData).toISOString() + } + + break + } + case 'group': + + case 'tab': { const groupFieldPrefix = `${fieldPrefix || ''}${field.name}_` const groupData = {} const locale = table._locale as string @@ -626,14 +634,6 @@ export const traverseFields = >({ return } - case 'text': { - if (typeof fieldData === 'string') { - val = String(fieldData) - } - - break - } - case 'number': { if (typeof fieldData === 'string') { val = Number.parseFloat(fieldData) @@ -642,15 +642,8 @@ export const traverseFields = >({ break } - case 'date': { - if (typeof fieldData === 'string') { - val = new Date(fieldData).toISOString() - } - - break - } - case 'relationship': + case 'upload': { if ( val && @@ -662,6 +655,13 @@ export const traverseFields = >({ break } + case 'text': { + if (typeof fieldData === 'string') { + val = String(fieldData) + } + + break + } default: { break diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 1dec8d7787..b4f84da69c 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -17,23 +17,23 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "@eslint-react/eslint-plugin": "1.12.3", - "@eslint/js": "9.9.1", + "@eslint-react/eslint-plugin": "1.16.1", + "@eslint/js": "9.14.0", "@payloadcms/eslint-plugin": "workspace:*", "@types/eslint": "9.6.1", "@types/eslint__js": "8.42.3", - "@typescript-eslint/parser": "8.3.0", - "eslint": "9.9.1", + "@typescript-eslint/parser": "8.14.0", + "eslint": "9.14.0", "eslint-config-prettier": "9.1.0", - "eslint-plugin-import-x": "4.1.1", - "eslint-plugin-jest": "28.8.1", + "eslint-plugin-import-x": "4.4.2", + "eslint-plugin-jest": "28.9.0", "eslint-plugin-jest-dom": "5.4.0", - "eslint-plugin-jsx-a11y": "6.9.0", - "eslint-plugin-perfectionist": "3.3.0", - "eslint-plugin-react-hooks": "5.1.0-rc-a19a8ab4-20240829", + "eslint-plugin-jsx-a11y": "6.10.2", + "eslint-plugin-perfectionist": "3.9.1", + "eslint-plugin-react-hooks": "5.0.0", "eslint-plugin-regexp": "2.6.0", - "globals": "15.9.0", + "globals": "15.12.0", "typescript": "5.6.3", - "typescript-eslint": "8.3.0" + "typescript-eslint": "8.14.0" } } diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index d48bde9baf..c96d4bfe12 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -17,22 +17,22 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "@eslint-react/eslint-plugin": "1.12.3", - "@eslint/js": "9.9.1", + "@eslint-react/eslint-plugin": "1.16.1", + "@eslint/js": "9.14.0", "@types/eslint": "9.6.1", "@types/eslint__js": "8.42.3", - "@typescript-eslint/parser": "8.3.0", - "eslint": "9.9.1", + "@typescript-eslint/parser": "8.14.0", + "eslint": "9.14.0", "eslint-config-prettier": "9.1.0", - "eslint-plugin-import-x": "4.1.1", - "eslint-plugin-jest": "28.8.1", + "eslint-plugin-import-x": "4.4.2", + "eslint-plugin-jest": "28.9.0", "eslint-plugin-jest-dom": "5.4.0", - "eslint-plugin-jsx-a11y": "6.9.0", - "eslint-plugin-perfectionist": "3.3.0", - "eslint-plugin-react-hooks": "5.1.0-rc-a19a8ab4-20240829", + "eslint-plugin-jsx-a11y": "6.10.2", + "eslint-plugin-perfectionist": "3.9.1", + "eslint-plugin-react-hooks": "5.0.0", "eslint-plugin-regexp": "2.6.0", - "globals": "15.9.0", + "globals": "15.12.0", "typescript": "5.6.3", - "typescript-eslint": "8.3.0" + "typescript-eslint": "8.14.0" } } diff --git a/packages/graphql/src/packages/graphql-query-complexity/QueryComplexity.ts b/packages/graphql/src/packages/graphql-query-complexity/QueryComplexity.ts index ff6fd611db..84579ae5b6 100644 --- a/packages/graphql/src/packages/graphql-query-complexity/QueryComplexity.ts +++ b/packages/graphql/src/packages/graphql-query-complexity/QueryComplexity.ts @@ -394,15 +394,15 @@ export class QueryComplexity { this.variableValues = coerced switch (operation.operation) { - case 'query': - this.complexity += this.nodeComplexity(operation, this.context.getSchema().getQueryType()) - break case 'mutation': this.complexity += this.nodeComplexity( operation, this.context.getSchema().getMutationType(), ) break + case 'query': + this.complexity += this.nodeComplexity(operation, this.context.getSchema().getQueryType()) + break case 'subscription': this.complexity += this.nodeComplexity( operation, diff --git a/packages/graphql/src/packages/graphql-type-json/index.ts b/packages/graphql/src/packages/graphql-type-json/index.ts index c6fe7ad9df..f7a8b89805 100644 --- a/packages/graphql/src/packages/graphql-type-json/index.ts +++ b/packages/graphql/src/packages/graphql-type-json/index.ts @@ -24,18 +24,18 @@ function parseObject(typeName, ast, variables) { function parseLiteral(typeName, ast, variables) { switch (ast.kind) { - case Kind.STRING: case Kind.BOOLEAN: + case Kind.STRING: return ast.value - case Kind.INT: case Kind.FLOAT: + case Kind.INT: return parseFloat(ast.value) - case Kind.OBJECT: - return parseObject(typeName, ast, variables) case Kind.LIST: return ast.values.map((n) => parseLiteral(typeName, n, variables)) case Kind.NULL: return null + case Kind.OBJECT: + return parseObject(typeName, ast, variables) case Kind.VARIABLE: return variables ? variables[ast.name.value] : undefined default: diff --git a/packages/live-preview/src/traverseFields.ts b/packages/live-preview/src/traverseFields.ts index fa7b722c1b..271ff5f00b 100644 --- a/packages/live-preview/src/traverseFields.ts +++ b/packages/live-preview/src/traverseFields.ts @@ -24,16 +24,6 @@ export const traverseFields = (args: { const fieldName = fieldSchema.name switch (fieldSchema.type) { - case 'richText': - result[fieldName] = traverseRichText({ - externallyUpdatedRelationship, - incomingData: incomingData[fieldName], - populationsByCollection, - result: result[fieldName], - }) - - break - case 'array': if (Array.isArray(incomingData[fieldName])) { result[fieldName] = incomingData[fieldName].map((incomingRow, i) => { @@ -94,8 +84,9 @@ export const traverseFields = (args: { break - case 'tabs': case 'group': + + case 'tabs': if (!result[fieldName]) { result[fieldName] = {} } @@ -109,9 +100,9 @@ export const traverseFields = (args: { }) break + case 'relationship': case 'upload': - case 'relationship': // Handle `hasMany` relationships if (fieldSchema.hasMany && Array.isArray(incomingData[fieldName])) { if (!result[fieldName] || !incomingData[fieldName].length) { @@ -271,6 +262,15 @@ export const traverseFields = (args: { } } + break + case 'richText': + result[fieldName] = traverseRichText({ + externallyUpdatedRelationship, + incomingData: incomingData[fieldName], + populationsByCollection, + result: result[fieldName], + }) + break default: diff --git a/packages/next/package.json b/packages/next/package.json index d62366bbf1..36d1ca5a13 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -106,7 +106,7 @@ "babel-plugin-react-compiler": "0.0.0-experimental-24ec0eb-20240918", "esbuild": "0.23.1", "esbuild-sass-plugin": "3.3.1", - "eslint-plugin-react-compiler": "0.0.0-experimental-7670337-20240918", + "eslint-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110", "payload": "workspace:*", "swc-plugin-transform-remove-imports": "1.15.0" }, diff --git a/packages/next/src/fetchAPI-multipart/isEligibleRequest.ts b/packages/next/src/fetchAPI-multipart/isEligibleRequest.ts index 316b347e50..3bc5c7652b 100644 --- a/packages/next/src/fetchAPI-multipart/isEligibleRequest.ts +++ b/packages/next/src/fetchAPI-multipart/isEligibleRequest.ts @@ -1,5 +1,5 @@ const ACCEPTABLE_CONTENT_TYPE = /multipart\/['"()+-_]+(?:; ?['"()+-_]*)+$/i -const UNACCEPTABLE_METHODS = new Set(['GET', 'HEAD', 'DELETE', 'OPTIONS', 'CONNECT', 'TRACE']) +const UNACCEPTABLE_METHODS = new Set(['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'TRACE']) const hasBody = (req: Request): boolean => { return Boolean( diff --git a/packages/next/src/views/LivePreview/Context/sizeReducer.ts b/packages/next/src/views/LivePreview/Context/sizeReducer.ts index 8606008c38..34e287ee2b 100644 --- a/packages/next/src/views/LivePreview/Context/sizeReducer.ts +++ b/packages/next/src/views/LivePreview/Context/sizeReducer.ts @@ -29,10 +29,10 @@ export type SizeReducerAction = export const sizeReducer = (state: SizeReducerState, action: SizeReducerAction) => { switch (action.type) { - case 'width': - return { ...state, width: action.value } case 'height': return { ...state, height: action.value } + case 'width': + return { ...state, width: action.value } default: return { ...state, ...(action?.value || {}) } } diff --git a/packages/payload/src/admin/fields/Tabs.ts b/packages/payload/src/admin/fields/Tabs.ts index dfaa49fca0..7a8c38adb8 100644 --- a/packages/payload/src/admin/fields/Tabs.ts +++ b/packages/payload/src/admin/fields/Tabs.ts @@ -22,8 +22,8 @@ import type { } from '../types.js' export type ClientTab = - | ({ fields: ClientField[] } & Omit) | ({ fields: ClientField[]; readonly path?: string } & Omit) + | ({ fields: ClientField[] } & Omit) type TabsFieldBaseClientProps = {} & Pick diff --git a/packages/payload/src/admin/views/types.ts b/packages/payload/src/admin/views/types.ts index b4a5ef46d2..0aae8c3c63 100644 --- a/packages/payload/src/admin/views/types.ts +++ b/packages/payload/src/admin/views/types.ts @@ -28,9 +28,9 @@ export type AdminViewProps = { readonly initialData?: Data readonly initPageResult: InitPageResult readonly params?: { [key: string]: string | string[] | undefined } - readonly searchParams: { [key: string]: string | string[] | undefined } readonly redirectAfterDelete?: boolean readonly redirectAfterDuplicate?: boolean + readonly searchParams: { [key: string]: string | string[] | undefined } } export type AdminViewComponent = PayloadComponent diff --git a/packages/payload/src/auth/getFieldsToSign.ts b/packages/payload/src/auth/getFieldsToSign.ts index f1b3cc3e22..1cbef07344 100644 --- a/packages/payload/src/auth/getFieldsToSign.ts +++ b/packages/payload/src/auth/getFieldsToSign.ts @@ -17,8 +17,8 @@ const traverseFields = ({ }: TraverseFieldsArgs) => { fields.forEach((field) => { switch (field.type) { - case 'row': - case 'collapsible': { + case 'collapsible': + case 'row': { traverseFields({ data, fields: field.fields, @@ -47,14 +47,6 @@ const traverseFields = ({ }) break } - case 'tabs': { - traverseFields({ - data, - fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), - result, - }) - break - } case 'tab': { if (tabHasName(field)) { let targetResult @@ -84,6 +76,14 @@ const traverseFields = ({ } break } + case 'tabs': { + traverseFields({ + data, + fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), + result, + }) + break + } default: if (fieldAffectsData(field)) { if (field.saveToJWT) { diff --git a/packages/payload/src/bin/migrate.ts b/packages/payload/src/bin/migrate.ts index 6c636a526c..daec12ee27 100644 --- a/packages/payload/src/bin/migrate.ts +++ b/packages/payload/src/bin/migrate.ts @@ -65,21 +65,6 @@ export const migrate = async ({ config, parsedArgs }: Args): Promise => { case 'migrate': await adapter.migrate() break - case 'migrate:status': - await adapter.migrateStatus() - break - case 'migrate:down': - await adapter.migrateDown() - break - case 'migrate:refresh': - await adapter.migrateRefresh() - break - case 'migrate:reset': - await adapter.migrateReset() - break - case 'migrate:fresh': - await adapter.migrateFresh({ forceAcceptWarning }) - break case 'migrate:create': try { await adapter.createMigration({ @@ -92,6 +77,21 @@ export const migrate = async ({ config, parsedArgs }: Args): Promise => { throw new Error(`Error creating migration: ${err.message}`) } break + case 'migrate:down': + await adapter.migrateDown() + break + case 'migrate:fresh': + await adapter.migrateFresh({ forceAcceptWarning }) + break + case 'migrate:refresh': + await adapter.migrateRefresh() + break + case 'migrate:reset': + await adapter.migrateReset() + break + case 'migrate:status': + await adapter.migrateStatus() + break default: payload.logger.error({ diff --git a/packages/payload/src/database/getLocalizedPaths.ts b/packages/payload/src/database/getLocalizedPaths.ts index 07e731ef79..b8898cfaf5 100644 --- a/packages/payload/src/database/getLocalizedPaths.ts +++ b/packages/payload/src/database/getLocalizedPaths.ts @@ -92,8 +92,8 @@ export async function getLocalizedPaths({ switch (matchedField.type) { case 'blocks': - case 'richText': - case 'json': { + case 'json': + case 'richText': { const upcomingSegments = pathSegments.slice(i + 1).join('.') lastIncompletePath.complete = true lastIncompletePath.path = upcomingSegments diff --git a/packages/payload/src/fields/config/client.ts b/packages/payload/src/fields/config/client.ts index ac35fa3b5f..8038990eb8 100644 --- a/packages/payload/src/fields/config/client.ts +++ b/packages/payload/src/fields/config/client.ts @@ -111,8 +111,8 @@ export const createClientField = ({ switch (incomingField.type) { case 'array': - case 'group': case 'collapsible': + case 'group': case 'row': { const field = clientField as unknown as RowFieldClient @@ -182,6 +182,31 @@ export const createClientField = ({ break } + case 'radio': + + case 'select': { + const field = clientField as RadioFieldClient | SelectFieldClient + + if (incomingField.options?.length) { + for (let i = 0; i < incomingField.options.length; i++) { + const option = incomingField.options[i] + + if (typeof option === 'object' && typeof option.label === 'function') { + if (!field.options) { + field.options = [] + } + + field.options[i] = { + label: option.label({ t: i18n.t }), + value: option.value, + } + } + } + } + + break + } + case 'richText': { if (!incomingField?.editor) { throw new MissingEditorProp(incomingField) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor @@ -193,7 +218,6 @@ export const createClientField = ({ break } - case 'tabs': { const field = clientField as unknown as TabsFieldClient @@ -221,30 +245,6 @@ export const createClientField = ({ break } - case 'select': - case 'radio': { - const field = clientField as RadioFieldClient | SelectFieldClient - - if (incomingField.options?.length) { - for (let i = 0; i < incomingField.options.length; i++) { - const option = incomingField.options[i] - - if (typeof option === 'object' && typeof option.label === 'function') { - if (!field.options) { - field.options = [] - } - - field.options[i] = { - label: option.label({ t: i18n.t }), - value: option.value, - } - } - } - } - - break - } - default: break } diff --git a/packages/payload/src/fields/hooks/afterChange/promise.ts b/packages/payload/src/fields/hooks/afterChange/promise.ts index 0d2f598f83..318476f765 100644 --- a/packages/payload/src/fields/hooks/afterChange/promise.ts +++ b/packages/payload/src/fields/hooks/afterChange/promise.ts @@ -97,27 +97,6 @@ export const promise = async ({ // Traverse subfields switch (field.type) { - case 'group': { - await traverseFields({ - collection, - context, - data, - doc, - fields: field.fields, - global, - operation, - path: fieldPath, - previousDoc, - previousSiblingDoc: previousDoc[field.name] as JsonObject, - req, - schemaPath: fieldSchemaPath, - siblingData: (siblingData?.[field.name] as JsonObject) || {}, - siblingDoc: siblingDoc[field.name] as JsonObject, - }) - - break - } - case 'array': { const rows = siblingDoc[field.name] @@ -185,8 +164,9 @@ export const promise = async ({ break } - case 'row': - case 'collapsible': { + case 'collapsible': + + case 'row': { await traverseFields({ collection, context, @@ -206,6 +186,66 @@ export const promise = async ({ break } + case 'group': { + await traverseFields({ + collection, + context, + data, + doc, + fields: field.fields, + global, + operation, + path: fieldPath, + previousDoc, + previousSiblingDoc: previousDoc[field.name] as JsonObject, + req, + schemaPath: fieldSchemaPath, + siblingData: (siblingData?.[field.name] as JsonObject) || {}, + siblingDoc: siblingDoc[field.name] as JsonObject, + }) + + break + } + + case 'richText': { + if (!field?.editor) { + throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor + } + if (typeof field?.editor === 'function') { + throw new Error('Attempted to access unsanitized rich text editor.') + } + + const editor: RichTextAdapter = field?.editor + + if (editor?.hooks?.afterChange?.length) { + await editor.hooks.afterChange.reduce(async (priorHook, currentHook) => { + await priorHook + + const hookedValue = await currentHook({ + collection, + context, + data, + field, + global, + operation, + originalDoc: doc, + path: fieldPath, + previousDoc, + previousSiblingDoc, + previousValue: previousDoc[field.name], + req, + schemaPath: fieldSchemaPath, + siblingData, + value: siblingDoc[field.name], + }) + + if (hookedValue !== undefined) { + siblingDoc[field.name] = hookedValue + } + }, Promise.resolve()) + } + break + } case 'tab': { let tabSiblingData = siblingData @@ -258,46 +298,6 @@ export const promise = async ({ break } - case 'richText': { - if (!field?.editor) { - throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor - } - if (typeof field?.editor === 'function') { - throw new Error('Attempted to access unsanitized rich text editor.') - } - - const editor: RichTextAdapter = field?.editor - - if (editor?.hooks?.afterChange?.length) { - await editor.hooks.afterChange.reduce(async (priorHook, currentHook) => { - await priorHook - - const hookedValue = await currentHook({ - collection, - context, - data, - field, - global, - operation, - originalDoc: doc, - path: fieldPath, - previousDoc, - previousSiblingDoc, - previousValue: previousDoc[field.name], - req, - schemaPath: fieldSchemaPath, - siblingData, - value: siblingDoc[field.name], - }) - - if (hookedValue !== undefined) { - siblingDoc[field.name] = hookedValue - } - }, Promise.resolve()) - } - break - } - default: { break } diff --git a/packages/payload/src/fields/hooks/afterRead/promise.ts b/packages/payload/src/fields/hooks/afterRead/promise.ts index 9503518cab..25a22d5160 100644 --- a/packages/payload/src/fields/hooks/afterRead/promise.ts +++ b/packages/payload/src/fields/hooks/afterRead/promise.ts @@ -181,15 +181,13 @@ export const promise = async ({ break } - case 'tabs': { - field.tabs.forEach((tab) => { - if ( - tabHasName(tab) && - (typeof siblingDoc[tab.name] === 'undefined' || siblingDoc[tab.name] === null) - ) { - siblingDoc[tab.name] = {} - } - }) + case 'point': { + const pointDoc = siblingDoc[field.name] as Record + if (Array.isArray(pointDoc?.coordinates) && pointDoc.coordinates.length === 2) { + siblingDoc[field.name] = pointDoc.coordinates + } else { + siblingDoc[field.name] = undefined + } break } @@ -206,13 +204,15 @@ export const promise = async ({ break } - case 'point': { - const pointDoc = siblingDoc[field.name] as Record - if (Array.isArray(pointDoc?.coordinates) && pointDoc.coordinates.length === 2) { - siblingDoc[field.name] = pointDoc.coordinates - } else { - siblingDoc[field.name] = undefined - } + case 'tabs': { + field.tabs.forEach((tab) => { + if ( + tabHasName(tab) && + (typeof siblingDoc[tab.name] === 'undefined' || siblingDoc[tab.name] === null) + ) { + siblingDoc[tab.name] = {} + } + }) break } @@ -347,45 +347,6 @@ export const promise = async ({ } switch (field.type) { - case 'group': { - let groupDoc = siblingDoc[field.name] as JsonObject - if (typeof siblingDoc[field.name] !== 'object') { - groupDoc = {} - } - - const groupSelect = select?.[field.name] - - traverseFields({ - collection, - context, - currentDepth, - depth, - doc, - draft, - fallbackLocale, - fieldPromises, - fields: field.fields, - findMany, - flattenLocales, - global, - locale, - overrideAccess, - path: fieldPath, - populate, - populationPromises, - req, - schemaPath: fieldSchemaPath, - select: typeof groupSelect === 'object' ? groupSelect : undefined, - selectMode, - showHiddenFields, - siblingDoc: groupDoc, - triggerAccessControl, - triggerHooks, - }) - - break - } - case 'array': { const rows = siblingDoc[field.name] as JsonObject @@ -573,8 +534,9 @@ export const promise = async ({ break } - case 'row': - case 'collapsible': { + case 'collapsible': + + case 'row': { traverseFields({ collection, context, @@ -605,23 +567,14 @@ export const promise = async ({ break } - - case 'tab': { - let tabDoc = siblingDoc - let tabSelect: SelectType | undefined - if (tabHasName(field)) { - tabDoc = siblingDoc[field.name] as JsonObject - if (typeof siblingDoc[field.name] !== 'object') { - tabDoc = {} - } - - if (typeof select?.[field.name] === 'object') { - tabSelect = select?.[field.name] as SelectType - } - } else { - tabSelect = select + case 'group': { + let groupDoc = siblingDoc[field.name] as JsonObject + if (typeof siblingDoc[field.name] !== 'object') { + groupDoc = {} } + const groupSelect = select?.[field.name] + traverseFields({ collection, context, @@ -642,10 +595,10 @@ export const promise = async ({ populationPromises, req, schemaPath: fieldSchemaPath, - select: tabSelect, + select: typeof groupSelect === 'object' ? groupSelect : undefined, selectMode, showHiddenFields, - siblingDoc: tabDoc, + siblingDoc: groupDoc, triggerAccessControl, triggerHooks, }) @@ -653,37 +606,6 @@ export const promise = async ({ break } - case 'tabs': { - traverseFields({ - collection, - context, - currentDepth, - depth, - doc, - draft, - fallbackLocale, - fieldPromises, - fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), - findMany, - flattenLocales, - global, - locale, - overrideAccess, - path: fieldPath, - populate, - populationPromises, - req, - schemaPath: fieldSchemaPath, - select, - selectMode, - showHiddenFields, - siblingDoc, - triggerAccessControl, - triggerHooks, - }) - break - } - case 'richText': { if (!field?.editor) { throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor @@ -781,6 +703,84 @@ export const promise = async ({ break } + case 'tab': { + let tabDoc = siblingDoc + let tabSelect: SelectType | undefined + if (tabHasName(field)) { + tabDoc = siblingDoc[field.name] as JsonObject + if (typeof siblingDoc[field.name] !== 'object') { + tabDoc = {} + } + + if (typeof select?.[field.name] === 'object') { + tabSelect = select?.[field.name] as SelectType + } + } else { + tabSelect = select + } + + traverseFields({ + collection, + context, + currentDepth, + depth, + doc, + draft, + fallbackLocale, + fieldPromises, + fields: field.fields, + findMany, + flattenLocales, + global, + locale, + overrideAccess, + path: fieldPath, + populate, + populationPromises, + req, + schemaPath: fieldSchemaPath, + select: tabSelect, + selectMode, + showHiddenFields, + siblingDoc: tabDoc, + triggerAccessControl, + triggerHooks, + }) + + break + } + + case 'tabs': { + traverseFields({ + collection, + context, + currentDepth, + depth, + doc, + draft, + fallbackLocale, + fieldPromises, + fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), + findMany, + flattenLocales, + global, + locale, + overrideAccess, + path: fieldPath, + populate, + populationPromises, + req, + schemaPath: fieldSchemaPath, + select, + selectMode, + showHiddenFields, + siblingDoc, + triggerAccessControl, + triggerHooks, + }) + break + } + default: { break } diff --git a/packages/payload/src/fields/hooks/beforeChange/promise.ts b/packages/payload/src/fields/hooks/beforeChange/promise.ts index 89c41f8ddb..3d38bb8604 100644 --- a/packages/payload/src/fields/hooks/beforeChange/promise.ts +++ b/packages/payload/src/fields/hooks/beforeChange/promise.ts @@ -2,9 +2,9 @@ import type { RichTextAdapter } from '../../../admin/RichText.js' import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { ValidationFieldError } from '../../../errors/index.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' +import type { RequestContext } from '../../../index.js' import type { JsonObject, Operation, PayloadRequest } from '../../../types/index.js' import type { Field, TabAsField } from '../../config/types.js' -import type { RequestContext } from '../../../index.js' import { MissingEditorProp } from '../../../errors/index.js' import { deepMergeWithSourceArrays } from '../../../utilities/deepMerge.js' @@ -200,60 +200,6 @@ export const promise = async ({ } switch (field.type) { - case 'point': { - // Transform point data for storage - if ( - Array.isArray(siblingData[field.name]) && - siblingData[field.name][0] !== null && - siblingData[field.name][1] !== null - ) { - siblingData[field.name] = { - type: 'Point', - coordinates: [ - parseFloat(siblingData[field.name][0]), - parseFloat(siblingData[field.name][1]), - ], - } - } - - break - } - - case 'group': { - if (typeof siblingData[field.name] !== 'object') { - siblingData[field.name] = {} - } - if (typeof siblingDoc[field.name] !== 'object') { - siblingDoc[field.name] = {} - } - if (typeof siblingDocWithLocales[field.name] !== 'object') { - siblingDocWithLocales[field.name] = {} - } - - await traverseFields({ - id, - collection, - context, - data, - doc, - docWithLocales, - errors, - fields: field.fields, - global, - mergeLocaleActions, - operation, - path: fieldPath, - req, - schemaPath: fieldSchemaPath, - siblingData: siblingData[field.name] as JsonObject, - siblingDoc: siblingDoc[field.name] as JsonObject, - siblingDocWithLocales: siblingDocWithLocales[field.name] as JsonObject, - skipValidation: skipValidationFromHere, - }) - - break - } - case 'array': { const rows = siblingData[field.name] @@ -339,8 +285,9 @@ export const promise = async ({ break } - case 'row': - case 'collapsible': { + case 'collapsible': + + case 'row': { await traverseFields({ id, collection, @@ -365,6 +312,104 @@ export const promise = async ({ break } + case 'group': { + if (typeof siblingData[field.name] !== 'object') { + siblingData[field.name] = {} + } + if (typeof siblingDoc[field.name] !== 'object') { + siblingDoc[field.name] = {} + } + if (typeof siblingDocWithLocales[field.name] !== 'object') { + siblingDocWithLocales[field.name] = {} + } + + await traverseFields({ + id, + collection, + context, + data, + doc, + docWithLocales, + errors, + fields: field.fields, + global, + mergeLocaleActions, + operation, + path: fieldPath, + req, + schemaPath: fieldSchemaPath, + siblingData: siblingData[field.name] as JsonObject, + siblingDoc: siblingDoc[field.name] as JsonObject, + siblingDocWithLocales: siblingDocWithLocales[field.name] as JsonObject, + skipValidation: skipValidationFromHere, + }) + + break + } + case 'point': { + // Transform point data for storage + if ( + Array.isArray(siblingData[field.name]) && + siblingData[field.name][0] !== null && + siblingData[field.name][1] !== null + ) { + siblingData[field.name] = { + type: 'Point', + coordinates: [ + parseFloat(siblingData[field.name][0]), + parseFloat(siblingData[field.name][1]), + ], + } + } + + break + } + + case 'richText': { + if (!field?.editor) { + throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor + } + if (typeof field?.editor === 'function') { + throw new Error('Attempted to access unsanitized rich text editor.') + } + + const editor: RichTextAdapter = field?.editor + + if (editor?.hooks?.beforeChange?.length) { + await editor.hooks.beforeChange.reduce(async (priorHook, currentHook) => { + await priorHook + + const hookedValue = await currentHook({ + collection, + context, + data, + docWithLocales, + errors, + field, + global, + mergeLocaleActions, + operation, + originalDoc: doc, + path: fieldPath, + previousSiblingDoc: siblingDoc, + previousValue: siblingDoc[field.name], + req, + schemaPath: parentSchemaPath, + siblingData, + siblingDocWithLocales, + skipValidation, + value: siblingData[field.name], + }) + + if (hookedValue !== undefined) { + siblingData[field.name] = hookedValue + } + }, Promise.resolve()) + } + + break + } + case 'tab': { let tabSiblingData = siblingData let tabSiblingDoc = siblingDoc @@ -435,51 +480,6 @@ export const promise = async ({ break } - case 'richText': { - if (!field?.editor) { - throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor - } - if (typeof field?.editor === 'function') { - throw new Error('Attempted to access unsanitized rich text editor.') - } - - const editor: RichTextAdapter = field?.editor - - if (editor?.hooks?.beforeChange?.length) { - await editor.hooks.beforeChange.reduce(async (priorHook, currentHook) => { - await priorHook - - const hookedValue = await currentHook({ - collection, - context, - data, - docWithLocales, - errors, - field, - global, - mergeLocaleActions, - operation, - originalDoc: doc, - path: fieldPath, - previousSiblingDoc: siblingDoc, - previousValue: siblingDoc[field.name], - req, - schemaPath: parentSchemaPath, - siblingData, - siblingDocWithLocales, - skipValidation, - value: siblingData[field.name], - }) - - if (hookedValue !== undefined) { - siblingData[field.name] = hookedValue - } - }, Promise.resolve()) - } - - break - } - default: { break } diff --git a/packages/payload/src/fields/hooks/beforeDuplicate/promise.ts b/packages/payload/src/fields/hooks/beforeDuplicate/promise.ts index c799014631..9c3d43e092 100644 --- a/packages/payload/src/fields/hooks/beforeDuplicate/promise.ts +++ b/packages/payload/src/fields/hooks/beforeDuplicate/promise.ts @@ -145,26 +145,6 @@ export const promise = async ({ localization.localeCodes.forEach((locale) => { if (fieldData[locale]) { switch (field.type) { - case 'tab': - case 'group': { - promises.push( - traverseFields({ - id, - collection, - context, - doc, - fields: field.fields, - overrideAccess, - path: fieldSchemaPath, - req, - schemaPath: fieldSchemaPath, - siblingDoc: fieldData[locale], - }), - ) - - break - } - case 'array': { const rows = fieldData[locale] @@ -189,7 +169,6 @@ export const promise = async ({ } break } - case 'blocks': { const rows = fieldData[locale] @@ -220,6 +199,27 @@ export const promise = async ({ } break } + + case 'group': + + case 'tab': { + promises.push( + traverseFields({ + id, + collection, + context, + doc, + fields: field.fields, + overrideAccess, + path: fieldSchemaPath, + req, + schemaPath: fieldSchemaPath, + siblingDoc: fieldData[locale], + }), + ) + + break + } } } }) @@ -230,30 +230,6 @@ export const promise = async ({ // we need to further traverse its children // so the child fields can run beforeDuplicate hooks switch (field.type) { - case 'tab': - case 'group': { - if (typeof siblingDoc[field.name] !== 'object') { - siblingDoc[field.name] = {} - } - - const groupDoc = siblingDoc[field.name] as Record - - await traverseFields({ - id, - collection, - context, - doc, - fields: field.fields, - overrideAccess, - path: fieldPath, - req, - schemaPath: fieldSchemaPath, - siblingDoc: groupDoc as JsonObject, - }) - - break - } - case 'array': { const rows = siblingDoc[field.name] @@ -279,7 +255,6 @@ export const promise = async ({ } break } - case 'blocks': { const rows = siblingDoc[field.name] @@ -313,13 +288,38 @@ export const promise = async ({ break } + + case 'group': + + case 'tab': { + if (typeof siblingDoc[field.name] !== 'object') { + siblingDoc[field.name] = {} + } + + const groupDoc = siblingDoc[field.name] as Record + + await traverseFields({ + id, + collection, + context, + doc, + fields: field.fields, + overrideAccess, + path: fieldPath, + req, + schemaPath: fieldSchemaPath, + siblingDoc: groupDoc as JsonObject, + }) + + break + } } } } else { // Finally, we traverse fields which do not affect data here switch (field.type) { - case 'row': - case 'collapsible': { + case 'collapsible': + case 'row': { await traverseFields({ id, collection, diff --git a/packages/payload/src/fields/hooks/beforeValidate/promise.ts b/packages/payload/src/fields/hooks/beforeValidate/promise.ts index e10ef0fa49..75308cbd89 100644 --- a/packages/payload/src/fields/hooks/beforeValidate/promise.ts +++ b/packages/payload/src/fields/hooks/beforeValidate/promise.ts @@ -90,6 +90,31 @@ export const promise = async ({ // Sanitize incoming data switch (field.type) { + case 'array': + + case 'blocks': { + // Handle cases of arrays being intentionally set to 0 + if (siblingData[field.name] === '0' || siblingData[field.name] === 0) { + siblingData[field.name] = [] + } + + break + } + + case 'checkbox': { + if (siblingData[field.name] === 'true') { + siblingData[field.name] = true + } + if (siblingData[field.name] === 'false') { + siblingData[field.name] = false + } + if (siblingData[field.name] === '') { + siblingData[field.name] = false + } + + break + } + case 'number': { if (typeof siblingData[field.name] === 'string') { const value = siblingData[field.name] as string @@ -114,36 +139,8 @@ export const promise = async ({ break } - - case 'checkbox': { - if (siblingData[field.name] === 'true') { - siblingData[field.name] = true - } - if (siblingData[field.name] === 'false') { - siblingData[field.name] = false - } - if (siblingData[field.name] === '') { - siblingData[field.name] = false - } - - break - } - - case 'richText': { - if (typeof siblingData[field.name] === 'string') { - try { - const richTextJSON = JSON.parse(siblingData[field.name] as string) - siblingData[field.name] = richTextJSON - } catch { - // Disregard this data as it is not valid. - // Will be reported to user by field validation - } - } - - break - } - case 'relationship': + case 'upload': { if ( siblingData[field.name] === '' || @@ -230,12 +227,15 @@ export const promise = async ({ } break } - - case 'array': - case 'blocks': { - // Handle cases of arrays being intentionally set to 0 - if (siblingData[field.name] === '0' || siblingData[field.name] === 0) { - siblingData[field.name] = [] + case 'richText': { + if (typeof siblingData[field.name] === 'string') { + try { + const richTextJSON = JSON.parse(siblingData[field.name] as string) + siblingData[field.name] = richTextJSON + } catch { + // Disregard this data as it is not valid. + // Will be reported to user by field validation + } } break @@ -305,37 +305,6 @@ export const promise = async ({ // Traverse subfields switch (field.type) { - case 'group': { - if (typeof siblingData[field.name] !== 'object') { - siblingData[field.name] = {} - } - if (typeof siblingDoc[field.name] !== 'object') { - siblingDoc[field.name] = {} - } - - const groupData = siblingData[field.name] as Record - const groupDoc = siblingDoc[field.name] as Record - - await traverseFields({ - id, - collection, - context, - data, - doc, - fields: field.fields, - global, - operation, - overrideAccess, - path: fieldPath, - req, - schemaPath: fieldSchemaPath, - siblingData: groupData as JsonObject, - siblingDoc: groupDoc as JsonObject, - }) - - break - } - case 'array': { const rows = siblingData[field.name] @@ -405,8 +374,9 @@ export const promise = async ({ break } - case 'row': - case 'collapsible': { + case 'collapsible': + + case 'row': { await traverseFields({ id, collection, @@ -426,6 +396,76 @@ export const promise = async ({ break } + case 'group': { + if (typeof siblingData[field.name] !== 'object') { + siblingData[field.name] = {} + } + if (typeof siblingDoc[field.name] !== 'object') { + siblingDoc[field.name] = {} + } + + const groupData = siblingData[field.name] as Record + const groupDoc = siblingDoc[field.name] as Record + + await traverseFields({ + id, + collection, + context, + data, + doc, + fields: field.fields, + global, + operation, + overrideAccess, + path: fieldPath, + req, + schemaPath: fieldSchemaPath, + siblingData: groupData as JsonObject, + siblingDoc: groupDoc as JsonObject, + }) + + break + } + + case 'richText': { + if (!field?.editor) { + throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor + } + if (typeof field?.editor === 'function') { + throw new Error('Attempted to access unsanitized rich text editor.') + } + + const editor: RichTextAdapter = field?.editor + + if (editor?.hooks?.beforeValidate?.length) { + await editor.hooks.beforeValidate.reduce(async (priorHook, currentHook) => { + await priorHook + + const hookedValue = await currentHook({ + collection, + context, + data, + field, + global, + operation, + originalDoc: doc, + overrideAccess, + path: fieldPath, + previousSiblingDoc: siblingDoc, + previousValue: siblingData[field.name], + req, + schemaPath: fieldSchemaPath, + siblingData, + value: siblingData[field.name], + }) + + if (hookedValue !== undefined) { + siblingData[field.name] = hookedValue + } + }, Promise.resolve()) + } + break + } case 'tab': { let tabSiblingData @@ -486,46 +526,6 @@ export const promise = async ({ break } - case 'richText': { - if (!field?.editor) { - throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor - } - if (typeof field?.editor === 'function') { - throw new Error('Attempted to access unsanitized rich text editor.') - } - - const editor: RichTextAdapter = field?.editor - - if (editor?.hooks?.beforeValidate?.length) { - await editor.hooks.beforeValidate.reduce(async (priorHook, currentHook) => { - await priorHook - - const hookedValue = await currentHook({ - collection, - context, - data, - field, - global, - operation, - originalDoc: doc, - overrideAccess, - path: fieldPath, - previousSiblingDoc: siblingDoc, - previousValue: siblingData[field.name], - req, - schemaPath: fieldSchemaPath, - siblingData, - value: siblingData[field.name], - }) - - if (hookedValue !== undefined) { - siblingData[field.name] = hookedValue - } - }, Promise.resolve()) - } - break - } - default: { break } diff --git a/packages/payload/src/utilities/configToJSONSchema.ts b/packages/payload/src/utilities/configToJSONSchema.ts index 15d351652a..d9ceb5cc4f 100644 --- a/packages/payload/src/utilities/configToJSONSchema.ts +++ b/packages/payload/src/utilities/configToJSONSchema.ts @@ -239,123 +239,125 @@ export function fieldsToJSONSchema( let fieldSchema: JSONSchema4 switch (field.type) { - case 'text': - if (field.hasMany === true) { - fieldSchema = { - type: withNullableJSONSchemaType('array', isRequired), - items: { type: 'string' }, - } - } else { - fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) } + case 'array': { + fieldSchema = { + type: withNullableJSONSchemaType('array', isRequired), + items: { + type: 'object', + additionalProperties: false, + ...fieldsToJSONSchema( + collectionIDFieldTypes, + field.fields, + interfaceNameDefinitions, + config, + ), + }, } - break - case 'textarea': - case 'code': - case 'email': - case 'date': { - fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) } - break - } - case 'number': { - if (field.hasMany === true) { + if (field.interfaceName) { + interfaceNameDefinitions.set(field.interfaceName, fieldSchema) + fieldSchema = { - type: withNullableJSONSchemaType('array', isRequired), - items: { type: 'number' }, + $ref: `#/definitions/${field.interfaceName}`, } - } else { - fieldSchema = { type: withNullableJSONSchemaType('number', isRequired) } } break } + case 'blocks': { + // Check for a case where no blocks are provided. + // We need to generate an empty array for this case, note that JSON schema 4 doesn't support empty arrays + // so the best we can get is `unknown[]` + const hasBlocks = Boolean(field.blocks.length) + fieldSchema = { + type: withNullableJSONSchemaType('array', isRequired), + items: hasBlocks + ? { + oneOf: field.blocks.map((block) => { + const blockFieldSchemas = fieldsToJSONSchema( + collectionIDFieldTypes, + block.fields, + interfaceNameDefinitions, + config, + ) + + const blockSchema: JSONSchema4 = { + type: 'object', + additionalProperties: false, + properties: { + ...blockFieldSchemas.properties, + blockType: { + const: block.slug, + }, + }, + required: ['blockType', ...blockFieldSchemas.required], + } + + if (block.interfaceName) { + interfaceNameDefinitions.set(block.interfaceName, blockSchema) + + return { + $ref: `#/definitions/${block.interfaceName}`, + } + } + + return blockSchema + }), + } + : {}, + } + break + } case 'checkbox': { fieldSchema = { type: withNullableJSONSchemaType('boolean', isRequired) } break } + case 'code': + case 'date': - case 'json': { - fieldSchema = field.jsonSchema?.schema || { - type: ['object', 'array', 'string', 'number', 'boolean', 'null'], - } + case 'email': + + case 'textarea': { + fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) } break } - case 'richText': { - if (!field?.editor) { - throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor - } - if (typeof field.editor === 'function') { - throw new Error('Attempted to access unsanitized rich text editor.') - } - if (field.editor.outputSchema) { - fieldSchema = field.editor.outputSchema({ + case 'collapsible': + + case 'row': { + const childSchema = fieldsToJSONSchema( + collectionIDFieldTypes, + field.fields, + interfaceNameDefinitions, + config, + ) + Object.entries(childSchema.properties).forEach(([propName, propSchema]) => { + fieldSchemas.set(propName, propSchema) + }) + childSchema.required.forEach((propName) => { + requiredFieldNames.add(propName) + }) + break + } + + case 'group': { + fieldSchema = { + type: 'object', + additionalProperties: false, + ...fieldsToJSONSchema( collectionIDFieldTypes, - config, - field, + field.fields, interfaceNameDefinitions, - isRequired, - }) - } else { - // Maintain backwards compatibility with existing rich text editors - fieldSchema = { - type: withNullableJSONSchemaType('array', isRequired), - items: { - type: 'object', - }, - } + config, + ), } - break - } + if (field.interfaceName) { + interfaceNameDefinitions.set(field.interfaceName, fieldSchema) - case 'radio': { - fieldSchema = { - type: withNullableJSONSchemaType('string', isRequired), - enum: buildOptionEnums(field.options), - } - - break - } - - case 'select': { - const optionEnums = buildOptionEnums(field.options) - - if (field.hasMany) { fieldSchema = { - type: withNullableJSONSchemaType('array', isRequired), - items: { - type: 'string', - }, + $ref: `#/definitions/${field.interfaceName}`, } - if (optionEnums?.length) { - ;(fieldSchema.items as JSONSchema4).enum = optionEnums - } - } else { - fieldSchema = { - type: withNullableJSONSchemaType('string', isRequired), - } - if (optionEnums?.length) { - fieldSchema.enum = optionEnums - } - } - - break - } - - case 'point': { - fieldSchema = { - type: withNullableJSONSchemaType('array', isRequired), - items: [ - { - type: 'number', - }, - { - type: 'number', - }, - ], - maxItems: 2, - minItems: 2, } break } @@ -384,8 +386,53 @@ export function fieldsToJSONSchema( break } - case 'upload': - case 'relationship': { + case 'json': { + fieldSchema = field.jsonSchema?.schema || { + type: ['object', 'array', 'string', 'number', 'boolean', 'null'], + } + break + } + + case 'number': { + if (field.hasMany === true) { + fieldSchema = { + type: withNullableJSONSchemaType('array', isRequired), + items: { type: 'number' }, + } + } else { + fieldSchema = { type: withNullableJSONSchemaType('number', isRequired) } + } + break + } + + case 'point': { + fieldSchema = { + type: withNullableJSONSchemaType('array', isRequired), + items: [ + { + type: 'number', + }, + { + type: 'number', + }, + ], + maxItems: 2, + minItems: 2, + } + break + } + case 'radio': { + fieldSchema = { + type: withNullableJSONSchemaType('string', isRequired), + enum: buildOptionEnums(field.options), + } + + break + } + + case 'relationship': + + case 'upload': { if (Array.isArray(field.relationTo)) { if (field.hasMany) { fieldSchema = { @@ -474,91 +521,55 @@ export function fieldsToJSONSchema( break } - case 'blocks': { - // Check for a case where no blocks are provided. - // We need to generate an empty array for this case, note that JSON schema 4 doesn't support empty arrays - // so the best we can get is `unknown[]` - const hasBlocks = Boolean(field.blocks.length) - - fieldSchema = { - type: withNullableJSONSchemaType('array', isRequired), - items: hasBlocks - ? { - oneOf: field.blocks.map((block) => { - const blockFieldSchemas = fieldsToJSONSchema( - collectionIDFieldTypes, - block.fields, - interfaceNameDefinitions, - config, - ) - - const blockSchema: JSONSchema4 = { - type: 'object', - additionalProperties: false, - properties: { - ...blockFieldSchemas.properties, - blockType: { - const: block.slug, - }, - }, - required: ['blockType', ...blockFieldSchemas.required], - } - - if (block.interfaceName) { - interfaceNameDefinitions.set(block.interfaceName, blockSchema) - - return { - $ref: `#/definitions/${block.interfaceName}`, - } - } - - return blockSchema - }), - } - : {}, + case 'richText': { + if (!field?.editor) { + throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor } - break - } - - case 'array': { - fieldSchema = { - type: withNullableJSONSchemaType('array', isRequired), - items: { - type: 'object', - additionalProperties: false, - ...fieldsToJSONSchema( - collectionIDFieldTypes, - field.fields, - interfaceNameDefinitions, - config, - ), - }, + if (typeof field.editor === 'function') { + throw new Error('Attempted to access unsanitized rich text editor.') } - - if (field.interfaceName) { - interfaceNameDefinitions.set(field.interfaceName, fieldSchema) - + if (field.editor.outputSchema) { + fieldSchema = field.editor.outputSchema({ + collectionIDFieldTypes, + config, + field, + interfaceNameDefinitions, + isRequired, + }) + } else { + // Maintain backwards compatibility with existing rich text editors fieldSchema = { - $ref: `#/definitions/${field.interfaceName}`, + type: withNullableJSONSchemaType('array', isRequired), + items: { + type: 'object', + }, } } + break } + case 'select': { + const optionEnums = buildOptionEnums(field.options) + + if (field.hasMany) { + fieldSchema = { + type: withNullableJSONSchemaType('array', isRequired), + items: { + type: 'string', + }, + } + if (optionEnums?.length) { + ;(fieldSchema.items as JSONSchema4).enum = optionEnums + } + } else { + fieldSchema = { + type: withNullableJSONSchemaType('string', isRequired), + } + if (optionEnums?.length) { + fieldSchema.enum = optionEnums + } + } - case 'row': - case 'collapsible': { - const childSchema = fieldsToJSONSchema( - collectionIDFieldTypes, - field.fields, - interfaceNameDefinitions, - config, - ) - Object.entries(childSchema.properties).forEach(([propName, propSchema]) => { - fieldSchemas.set(propName, propSchema) - }) - childSchema.required.forEach((propName) => { - requiredFieldNames.add(propName) - }) break } @@ -596,27 +607,16 @@ export function fieldsToJSONSchema( break } - case 'group': { - fieldSchema = { - type: 'object', - additionalProperties: false, - ...fieldsToJSONSchema( - collectionIDFieldTypes, - field.fields, - interfaceNameDefinitions, - config, - ), - } - - if (field.interfaceName) { - interfaceNameDefinitions.set(field.interfaceName, fieldSchema) - + case 'text': + if (field.hasMany === true) { fieldSchema = { - $ref: `#/definitions/${field.interfaceName}`, + type: withNullableJSONSchemaType('array', isRequired), + items: { type: 'string' }, } + } else { + fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) } } break - } default: { break @@ -704,15 +704,6 @@ export function fieldsToSelectJSONSchema({ fields }: { fields: Field[] }): JSONS for (const field of fields) { switch (field.type) { - case 'row': - case 'collapsible': - schema.properties = { - ...schema.properties, - ...fieldsToSelectJSONSchema({ fields: field.fields }).properties, - } - - break - case 'array': case 'group': schema.properties[field.name] = { @@ -725,27 +716,6 @@ export function fieldsToSelectJSONSchema({ fields }: { fields: Field[] }): JSONS } break - case 'tabs': - for (const tab of field.tabs) { - if (tabHasName(tab)) { - schema.properties[tab.name] = { - oneOf: [ - { - type: 'boolean', - }, - fieldsToSelectJSONSchema({ fields: tab.fields }), - ], - } - continue - } - - schema.properties = { - ...schema.properties, - ...fieldsToSelectJSONSchema({ fields: tab.fields }).properties, - } - } - break - case 'blocks': { const blocksSchema: JSONSchema4 = { type: 'object', @@ -775,6 +745,36 @@ export function fieldsToSelectJSONSchema({ fields }: { fields: Field[] }): JSONS break } + case 'collapsible': + + case 'row': + schema.properties = { + ...schema.properties, + ...fieldsToSelectJSONSchema({ fields: field.fields }).properties, + } + + break + + case 'tabs': + for (const tab of field.tabs) { + if (tabHasName(tab)) { + schema.properties[tab.name] = { + oneOf: [ + { + type: 'boolean', + }, + fieldsToSelectJSONSchema({ fields: tab.fields }), + ], + } + continue + } + + schema.properties = { + ...schema.properties, + ...fieldsToSelectJSONSchema({ fields: tab.fields }).properties, + } + } + break default: schema.properties[field.name] = { @@ -800,6 +800,34 @@ const generateAuthFieldTypes = ({ }): JSONSchema4 => { if (loginWithUsername) { switch (type) { + case 'forgotOrUnlock': { + if (loginWithUsername.allowEmailLogin) { + // allow email or username for unlock/forgot-password + return { + additionalProperties: false, + oneOf: [ + { + additionalProperties: false, + properties: { email: fieldType }, + required: ['email'], + }, + { + additionalProperties: false, + properties: { username: fieldType }, + required: ['username'], + }, + ], + } + } else { + // allow only username for unlock/forgot-password + return { + additionalProperties: false, + properties: { username: fieldType }, + required: ['username'], + } + } + } + case 'login': { if (loginWithUsername.allowEmailLogin) { // allow username or email and require password for login @@ -858,34 +886,6 @@ const generateAuthFieldTypes = ({ required: requiredFields, } } - - case 'forgotOrUnlock': { - if (loginWithUsername.allowEmailLogin) { - // allow email or username for unlock/forgot-password - return { - additionalProperties: false, - oneOf: [ - { - additionalProperties: false, - properties: { email: fieldType }, - required: ['email'], - }, - { - additionalProperties: false, - properties: { username: fieldType }, - required: ['username'], - }, - ], - } - } else { - // allow only username for unlock/forgot-password - return { - additionalProperties: false, - properties: { username: fieldType }, - required: ['username'], - } - } - } } } diff --git a/packages/payload/src/utilities/fieldSchemaToJSON.ts b/packages/payload/src/utilities/fieldSchemaToJSON.ts index 2accd364ed..37511f8c9f 100644 --- a/packages/payload/src/utilities/fieldSchemaToJSON.ts +++ b/packages/payload/src/utilities/fieldSchemaToJSON.ts @@ -16,15 +16,6 @@ export const fieldSchemaToJSON = (fields: ClientField[]): FieldSchemaJSON => { let result = acc switch (field.type) { - case 'group': - acc.push({ - name: field.name, - type: field.type, - fields: fieldSchemaToJSON(field.fields), - }) - - break - case 'array': acc.push({ name: field.name, @@ -61,11 +52,31 @@ export const fieldSchemaToJSON = (fields: ClientField[]): FieldSchemaJSON => { break - case 'row': case 'collapsible': + + case 'row': result = result.concat(fieldSchemaToJSON(field.fields)) break + case 'group': + acc.push({ + name: field.name, + type: field.type, + fields: fieldSchemaToJSON(field.fields), + }) + break + + case 'relationship': + + case 'upload': + acc.push({ + name: field.name, + type: field.type, + hasMany: 'hasMany' in field ? Boolean(field.hasMany) : false, // TODO: type this + relationTo: field.relationTo, + }) + + break case 'tabs': { let tabFields = [] @@ -87,17 +98,6 @@ export const fieldSchemaToJSON = (fields: ClientField[]): FieldSchemaJSON => { break } - case 'relationship': - case 'upload': - acc.push({ - name: field.name, - type: field.type, - hasMany: 'hasMany' in field ? Boolean(field.hasMany) : false, // TODO: type this - relationTo: field.relationTo, - }) - - break - default: if ('name' in field) { acc.push({ diff --git a/packages/payload/src/utilities/telemetry/conf/index.ts b/packages/payload/src/utilities/telemetry/conf/index.ts index 37660de532..ceda54e339 100644 --- a/packages/payload/src/utilities/telemetry/conf/index.ts +++ b/packages/payload/src/utilities/telemetry/conf/index.ts @@ -21,7 +21,7 @@ import { envPaths } from './envPaths.js' const createPlainObject = >(): T => Object.create(null) const checkValueType = (key: string, value: unknown): void => { - const nonJsonTypes = new Set(['undefined', 'symbol', 'function']) + const nonJsonTypes = new Set(['function', 'symbol', 'undefined']) const type = typeof value diff --git a/packages/plugin-form-builder/src/utilities/getPaymentTotal.ts b/packages/plugin-form-builder/src/utilities/getPaymentTotal.ts index 6b74c02ae9..45556d2111 100644 --- a/packages/plugin-form-builder/src/utilities/getPaymentTotal.ts +++ b/packages/plugin-form-builder/src/utilities/getPaymentTotal.ts @@ -28,16 +28,16 @@ export const getPaymentTotal = ( total += valueToUse break } - case 'subtract': { - total -= valueToUse + case 'divide': { + total /= valueToUse break } case 'multiply': { total *= valueToUse break } - case 'divide': { - total /= valueToUse + case 'subtract': { + total -= valueToUse break } default: { diff --git a/packages/plugin-form-builder/src/utilities/slate/serializeSlate.ts b/packages/plugin-form-builder/src/utilities/slate/serializeSlate.ts index 674a030b57..1b359b1902 100644 --- a/packages/plugin-form-builder/src/utilities/slate/serializeSlate.ts +++ b/packages/plugin-form-builder/src/utilities/slate/serializeSlate.ts @@ -91,6 +91,30 @@ export const serializeSlate = (children?: Node[], submissionData?: any): string
${serializeSlate(node.children, submissionData)}
+ ` + case 'indent': + return ` +

+ ${serializeSlate(node.children, submissionData)} +

+ ` + case 'li': + return ` +
  • + ${serializeSlate(node.children, submissionData)} +
  • + ` + case 'link': + return ` + + ${serializeSlate(node.children, submissionData)} + + ` + case 'ol': + return ` +
      + ${serializeSlate(node.children, submissionData)} +
    ` case 'quote': return ` @@ -104,30 +128,6 @@ export const serializeSlate = (children?: Node[], submissionData?: any): string ${serializeSlate(node.children, submissionData)} ` - case 'ol': - return ` -
      - ${serializeSlate(node.children, submissionData)} -
    - ` - case 'li': - return ` -
  • - ${serializeSlate(node.children, submissionData)} -
  • - ` - case 'indent': - return ` -

    - ${serializeSlate(node.children, submissionData)} -

    - ` - case 'link': - return ` - - ${serializeSlate(node.children, submissionData)} - - ` default: return ` diff --git a/packages/plugin-stripe/src/webhooks/index.ts b/packages/plugin-stripe/src/webhooks/index.ts index ec035d7374..efa486924e 100644 --- a/packages/plugin-stripe/src/webhooks/index.ts +++ b/packages/plugin-stripe/src/webhooks/index.ts @@ -30,8 +30,8 @@ export const handleWebhooks: StripeWebhookHandler = (args) => { }) break } - case 'updated': { - void handleCreatedOrUpdated({ + case 'deleted': { + void handleDeleted({ ...args, pluginConfig, resourceType, @@ -39,8 +39,8 @@ export const handleWebhooks: StripeWebhookHandler = (args) => { }) break } - case 'deleted': { - void handleDeleted({ + case 'updated': { + void handleCreatedOrUpdated({ ...args, pluginConfig, resourceType, diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index a7b744aa94..770b931ffd 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -93,7 +93,7 @@ "babel-plugin-transform-remove-imports": "^1.8.0", "esbuild": "0.23.1", "esbuild-sass-plugin": "3.3.1", - "eslint-plugin-react-compiler": "0.0.0-experimental-7670337-20240918", + "eslint-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110", "payload": "workspace:*", "swc-plugin-transform-remove-imports": "1.15.0" }, diff --git a/packages/richtext-lexical/src/features/debug/testRecorder/client/plugin/index.tsx b/packages/richtext-lexical/src/features/debug/testRecorder/client/plugin/index.tsx index 50f9c74193..565abb9dc5 100644 --- a/packages/richtext-lexical/src/features/debug/testRecorder/client/plugin/index.tsx +++ b/packages/richtext-lexical/src/features/debug/testRecorder/client/plugin/index.tsx @@ -45,17 +45,14 @@ const formatStep = (step: Step) => { case 'click': { return ` await page.mouse.click(${value.x}, ${value.y});` } - case 'press': { - return ` await page.keyboard.press('${value}');` - } case 'keydown': { return ` await page.keyboard.keydown('${value}');` } case 'keyup': { return ` await page.keyboard.keyup('${value}');` } - case 'type': { - return ` await page.keyboard.type('${value}');` + case 'press': { + return ` await page.keyboard.press('${value}');` } case 'selectAll': { return ` await selectAll(page);` @@ -70,6 +67,9 @@ const formatStep = (step: Step) => { }); ` } + case 'type': { + return ` await page.keyboard.type('${value}');` + } default: return `` } @@ -119,14 +119,14 @@ function getPathFromNodeToEditor(node: Node, rootElement: HTMLElement | null) { } const keyPresses = new Set([ - 'Enter', - 'Backspace', - 'Delete', - 'Escape', + 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp', - 'ArrowDown', + 'Backspace', + 'Delete', + 'Enter', + 'Escape', ]) type Step = { diff --git a/packages/richtext-lexical/src/features/toolbars/shared/ToolbarButton/index.tsx b/packages/richtext-lexical/src/features/toolbars/shared/ToolbarButton/index.tsx index 6a8be0a99f..1ab09fb252 100644 --- a/packages/richtext-lexical/src/features/toolbars/shared/ToolbarButton/index.tsx +++ b/packages/richtext-lexical/src/features/toolbars/shared/ToolbarButton/index.tsx @@ -84,7 +84,7 @@ export const ToolbarButton = ({ className={className} onClick={() => { if (enabled !== false) { - editor._updateTags = new Set([...editor._updateTags, 'toolbar']) // without setting the tags, our onSelect will not be able to trigger our onChange as focus onChanges are ignored. + editor._updateTags = new Set(['toolbar', ...editor._updateTags]) // without setting the tags, our onSelect will not be able to trigger our onChange as focus onChanges are ignored. editor.focus(() => { // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called. diff --git a/packages/richtext-lexical/src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx b/packages/richtext-lexical/src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx index 883871cd81..4d9d585d39 100644 --- a/packages/richtext-lexical/src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx +++ b/packages/richtext-lexical/src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx @@ -65,7 +65,7 @@ export function DropDownItem({ className={className} onClick={() => { if (enabled !== false) { - editor._updateTags = new Set([...editor._updateTags, 'toolbar']) // without setting the tags, our onSelect will not be able to trigger our onChange as focus onChanges are ignored. + editor._updateTags = new Set(['toolbar', ...editor._updateTags]) // without setting the tags, our onSelect will not be able to trigger our onChange as focus onChanges are ignored. editor.focus(() => { // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called. diff --git a/packages/richtext-slate/src/field/RichText.tsx b/packages/richtext-slate/src/field/RichText.tsx index 069f5453ff..79538812e4 100644 --- a/packages/richtext-slate/src/field/RichText.tsx +++ b/packages/richtext-slate/src/field/RichText.tsx @@ -124,27 +124,27 @@ const RichTextField: React.FC = (props) => { if (element.textAlign) { if (element.type === 'relationship' || element.type === 'upload') { switch (element.textAlign) { + case 'center': + attr = { ...attr, style: { marginLeft: 'auto', marginRight: 'auto' } } + break case 'left': attr = { ...attr, style: { marginRight: 'auto' } } break case 'right': attr = { ...attr, style: { marginLeft: 'auto' } } break - case 'center': - attr = { ...attr, style: { marginLeft: 'auto', marginRight: 'auto' } } - break default: attr = { ...attr, style: { textAlign: element.textAlign } } break } } else if (element.type === 'li') { switch (element.textAlign) { - case 'right': - attr = { ...attr, style: { listStylePosition: 'inside', textAlign: 'right' } } - break case 'center': attr = { ...attr, style: { listStylePosition: 'inside', textAlign: 'center' } } break + case 'right': + attr = { ...attr, style: { listStylePosition: 'inside', textAlign: 'right' } } + break case 'left': default: attr = { ...attr, style: { listStylePosition: 'outside', textAlign: 'left' } } diff --git a/packages/richtext-slate/src/field/rscEntry.tsx b/packages/richtext-slate/src/field/rscEntry.tsx index eef4cb99c4..c68c14cab5 100644 --- a/packages/richtext-slate/src/field/rscEntry.tsx +++ b/packages/richtext-slate/src/field/rscEntry.tsx @@ -150,6 +150,9 @@ export const RscEntrySlateField: React.FC< break } + case 'relationship': + break + case 'upload': { const uploadEnabledCollections = payload.config.collections.filter( ({ admin: { enableRichTextRelationship, hidden }, upload }) => { @@ -179,9 +182,6 @@ export const RscEntrySlateField: React.FC< break } - - case 'relationship': - break } } }) diff --git a/packages/richtext-slate/src/generateSchemaMap.ts b/packages/richtext-slate/src/generateSchemaMap.ts index 0763c8e14b..7c94eb46bd 100644 --- a/packages/richtext-slate/src/generateSchemaMap.ts +++ b/packages/richtext-slate/src/generateSchemaMap.ts @@ -42,6 +42,9 @@ export const getGenerateSchemaMap = break } + case 'relationship': + break + case 'upload': { const uploadEnabledCollections = config.collections.filter( ({ admin: { enableRichTextRelationship, hidden }, upload }) => { @@ -73,9 +76,6 @@ export const getGenerateSchemaMap = break } - - case 'relationship': - break } } }) diff --git a/packages/translations/src/types.ts b/packages/translations/src/types.ts index bb86375c47..9729d43e98 100644 --- a/packages/translations/src/types.ts +++ b/packages/translations/src/types.ts @@ -161,12 +161,12 @@ export type InitTFunction< } export type InitI18n = + | ((args: { config: I18nOptions; context: 'api'; language: AcceptedLanguages }) => Promise) | ((args: { config: I18nOptions context: 'client' language: AcceptedLanguages }) => Promise>) - | ((args: { config: I18nOptions; context: 'api'; language: AcceptedLanguages }) => Promise) export type LanguagePreference = { language: AcceptedLanguages diff --git a/packages/ui/package.json b/packages/ui/package.json index 02e9807141..118153b00d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -122,7 +122,7 @@ "babel-plugin-react-compiler": "0.0.0-experimental-24ec0eb-20240918", "esbuild": "0.23.1", "esbuild-sass-plugin": "3.3.1", - "eslint-plugin-react-compiler": "0.0.0-experimental-7670337-20240918", + "eslint-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/ui/src/elements/Banner/index.tsx b/packages/ui/src/elements/Banner/index.tsx index 18e6736ae7..d694aeff2e 100644 --- a/packages/ui/src/elements/Banner/index.tsx +++ b/packages/ui/src/elements/Banner/index.tsx @@ -1,7 +1,7 @@ 'use client' -import LinkImport from 'next/link.js' // TODO: abstract this out to support all routers import type { MouseEvent } from 'react' +import LinkImport from 'next/link.js' // TODO: abstract this out to support all routers import React from 'react' import './index.scss' diff --git a/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx b/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx index bfccdff413..a81ed6c247 100644 --- a/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx +++ b/packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx @@ -26,11 +26,11 @@ export function AddingFilesView() { activeIndex, collectionSlug, docPermissions, + documentSlots, forms, hasPublishPermission, hasSavePermission, hasSubmitted, - documentSlots, } = useFormsManager() const activeForm = forms[activeIndex] const { getEntityConfig } = useConfig() diff --git a/packages/ui/src/elements/BulkUpload/FormsManager/reducer.ts b/packages/ui/src/elements/BulkUpload/FormsManager/reducer.ts index 4cbbc37c01..e7a2b78cec 100644 --- a/packages/ui/src/elements/BulkUpload/FormsManager/reducer.ts +++ b/packages/ui/src/elements/BulkUpload/FormsManager/reducer.ts @@ -35,18 +35,6 @@ type Action = export function formsManagementReducer(state: State, action: Action): State { switch (action.type) { - case 'REPLACE': { - return { - ...state, - ...action.state, - } - } - case 'SET_ACTIVE_INDEX': { - return { - ...state, - activeIndex: action.index, - } - } case 'ADD_FORMS': { const newForms: State['forms'] = [] for (let i = 0; i < action.files.length; i++) { @@ -89,6 +77,18 @@ export function formsManagementReducer(state: State, action: Action): State { totalErrorCount: state.totalErrorCount - removedForm.errorCount, } } + case 'REPLACE': { + return { + ...state, + ...action.state, + } + } + case 'SET_ACTIVE_INDEX': { + return { + ...state, + activeIndex: action.index, + } + } case 'UPDATE_ERROR_COUNT': { const forms = [...state.forms] forms[action.index].errorCount = action.count diff --git a/packages/ui/src/elements/DuplicateDocument/index.tsx b/packages/ui/src/elements/DuplicateDocument/index.tsx index d0903deb7b..23af6e4d1c 100644 --- a/packages/ui/src/elements/DuplicateDocument/index.tsx +++ b/packages/ui/src/elements/DuplicateDocument/index.tsx @@ -8,6 +8,8 @@ import { useRouter } from 'next/navigation.js' import React, { useCallback, useState } from 'react' import { toast } from 'sonner' +import type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js' + import { useForm, useFormModified } from '../../forms/Form/context.js' import { useConfig } from '../../providers/Config/index.js' import { useEditDepth } from '../../providers/EditDepth/index.js' @@ -18,7 +20,6 @@ import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { Button } from '../Button/index.js' import { drawerZBase } from '../Drawer/index.js' import { PopupList } from '../Popup/index.js' -import { DocumentDrawerContextType } from '../DocumentDrawer/Provider.jsx' import './index.scss' const baseClass = 'duplicate' diff --git a/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx b/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx index f839c8702b..1caf14cdc2 100644 --- a/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx +++ b/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx @@ -119,8 +119,8 @@ export const RelationshipCell: React.FC = ({ if (previewAllowed && document) { fileField = ( = (props) => { diff --git a/packages/ui/src/elements/Table/RelationshipProvider/reducer.ts b/packages/ui/src/elements/Table/RelationshipProvider/reducer.ts index 7cc2111296..defebbc98f 100644 --- a/packages/ui/src/elements/Table/RelationshipProvider/reducer.ts +++ b/packages/ui/src/elements/Table/RelationshipProvider/reducer.ts @@ -18,19 +18,6 @@ type Action = AddLoadedDocuments | RequestDocuments export function reducer(state: Documents, action: Action): Documents { switch (action.type) { - case 'REQUEST': { - const newState = { ...state } - - action.docs.forEach(({ relationTo, value }) => { - if (typeof newState[relationTo] !== 'object') { - newState[relationTo] = {} - } - newState[relationTo][value] = null - }) - - return newState - } - case 'ADD_LOADED': { const newState = { ...state } if (typeof newState[action.relationTo] !== 'object') { @@ -52,6 +39,19 @@ export function reducer(state: Documents, action: Action): Documents { return newState } + case 'REQUEST': { + const newState = { ...state } + + action.docs.forEach(({ relationTo, value }) => { + if (typeof newState[relationTo] !== 'object') { + newState[relationTo] = {} + } + newState[relationTo][value] = null + }) + + return newState + } + default: { return state } diff --git a/packages/ui/src/elements/WhereBuilder/Condition/DefaultFilter/index.tsx b/packages/ui/src/elements/WhereBuilder/Condition/DefaultFilter/index.tsx index a21dd9aadb..a1e31b3f7c 100644 --- a/packages/ui/src/elements/WhereBuilder/Condition/DefaultFilter/index.tsx +++ b/packages/ui/src/elements/WhereBuilder/Condition/DefaultFilter/index.tsx @@ -43,9 +43,9 @@ export const DefaultFilter: React.FC = ({ } switch (internalField?.field?.type) { - case 'number': { + case 'date': { return ( - = ({ ) } - case 'date': { + case 'number': { return ( - const optionsReducer = (state: Option[], action: Action): Option[] => { switch (action.type) { - case 'CLEAR': { - return action.required ? [] : [{ label: action.i18n.t('general:none'), value: 'null' }] - } - case 'ADD': { const { collection, data, hasMultipleRelations, i18n, relation } = action @@ -79,6 +75,10 @@ const optionsReducer = (state: Option[], action: Action): Option[] => { return newOptions } + case 'CLEAR': { + return action.required ? [] : [{ label: action.i18n.t('general:none'), value: 'null' }] + } + default: { return state } diff --git a/packages/ui/src/fields/Relationship/optionsReducer.ts b/packages/ui/src/fields/Relationship/optionsReducer.ts index c8efa3b21f..8a91fa8cb0 100644 --- a/packages/ui/src/fields/Relationship/optionsReducer.ts +++ b/packages/ui/src/fields/Relationship/optionsReducer.ts @@ -28,61 +28,6 @@ const sortOptions = (options: Option[]): Option[] => export const optionsReducer = (state: OptionGroup[], action: Action): OptionGroup[] => { switch (action.type) { - case 'CLEAR': { - const exemptValues = action.exemptValues - ? Array.isArray(action.exemptValues) - ? action.exemptValues - : [action.exemptValues] - : [] - - const clearedStateWithExemptValues = state.filter((optionGroup) => { - const clearedOptions = optionGroup.options.filter((option) => { - if (exemptValues) { - return exemptValues.some((exemptValue) => { - return ( - exemptValue && - option.value === (typeof exemptValue === 'object' ? exemptValue.value : exemptValue) - ) - }) - } - - return false - }) - - optionGroup.options = clearedOptions - - return clearedOptions.length > 0 - }) - - return clearedStateWithExemptValues - } - - case 'UPDATE': { - const { collection, config, doc, i18n } = action - const relation = collection.slug - const newOptions = [...state] - - const docTitle = formatDocTitle({ - collectionConfig: collection, - data: doc, - dateFormat: config.admin.dateFormat, - fallback: `${i18n.t('general:untitled')} - ID: ${doc.id}`, - i18n, - }) - - const foundOptionGroup = newOptions.find( - (optionGroup) => optionGroup.label === collection.labels.plural, - ) - const foundOption = foundOptionGroup?.options?.find((option) => option.value === doc.id) - - if (foundOption) { - foundOption.label = docTitle - foundOption.relationTo = relation - } - - return newOptions - } - case 'ADD': { const { collection, config, docs, i18n, ids = [], sort } = action const relation = collection.slug @@ -146,6 +91,35 @@ export const optionsReducer = (state: OptionGroup[], action: Action): OptionGrou return newOptions } + case 'CLEAR': { + const exemptValues = action.exemptValues + ? Array.isArray(action.exemptValues) + ? action.exemptValues + : [action.exemptValues] + : [] + + const clearedStateWithExemptValues = state.filter((optionGroup) => { + const clearedOptions = optionGroup.options.filter((option) => { + if (exemptValues) { + return exemptValues.some((exemptValue) => { + return ( + exemptValue && + option.value === (typeof exemptValue === 'object' ? exemptValue.value : exemptValue) + ) + }) + } + + return false + }) + + optionGroup.options = clearedOptions + + return clearedOptions.length > 0 + }) + + return clearedStateWithExemptValues + } + case 'REMOVE': { const { id, collection } = action @@ -167,6 +141,32 @@ export const optionsReducer = (state: OptionGroup[], action: Action): OptionGrou return newOptions } + case 'UPDATE': { + const { collection, config, doc, i18n } = action + const relation = collection.slug + const newOptions = [...state] + + const docTitle = formatDocTitle({ + collectionConfig: collection, + data: doc, + dateFormat: config.admin.dateFormat, + fallback: `${i18n.t('general:untitled')} - ID: ${doc.id}`, + i18n, + }) + + const foundOptionGroup = newOptions.find( + (optionGroup) => optionGroup.label === collection.labels.plural, + ) + const foundOption = foundOptionGroup?.options?.find((option) => option.value === doc.id) + + if (foundOption) { + foundOption.label = docTitle + foundOption.relationTo = relation + } + + return newOptions + } + default: { return state } diff --git a/packages/ui/src/forms/Form/fieldReducer.ts b/packages/ui/src/forms/Form/fieldReducer.ts index fb4146250d..689123f462 100644 --- a/packages/ui/src/forms/Form/fieldReducer.ts +++ b/packages/ui/src/forms/Form/fieldReducer.ts @@ -17,36 +17,53 @@ const ObjectId = (ObjectIdImport.default || */ export function fieldReducer(state: FormState, action: FieldAction): FormState { switch (action.type) { - case 'REPLACE_STATE': { - if (action.optimize !== false) { - // Only update fields that have changed - // by comparing old value / initialValue to new - // .. - // This is a performance enhancement for saving - // large documents with hundreds of fields - const newState = {} + case 'ADD_ROW': { + const { blockType, path, rowIndex: rowIndexFromArgs, subFieldState = {} } = action - Object.entries(action.state).forEach(([path, field]) => { - const oldField = state[path] - const newField = field + const rowIndex = + typeof rowIndexFromArgs === 'number' ? rowIndexFromArgs : state[path]?.rows?.length || 0 - if (!dequal(oldField, newField)) { - newState[path] = newField - } else if (oldField) { - newState[path] = oldField - } - }) - return newState + const withNewRow = [...(state[path]?.rows || [])] + + const newRow: Row = { + id: (subFieldState?.id?.value as string) || new ObjectId().toHexString(), + blockType: blockType || undefined, + collapsed: false, } - // If we're not optimizing, just set the state to the new state - return action.state - } - case 'REMOVE': { - const newState = { ...state } - if (newState[action.path]) { - delete newState[action.path] + withNewRow.splice(rowIndex, 0, newRow) + + if (blockType) { + subFieldState.blockType = { + initialValue: blockType, + valid: true, + value: blockType, + } } + + // add new row to array _field state_ + const { remainingFields, rows: siblingRows } = separateRows(path, state) + siblingRows.splice(rowIndex, 0, subFieldState) + + const newState: FormState = { + ...remainingFields, + ...flattenRows(path, siblingRows), + [`${path}.${rowIndex}.id`]: { + initialValue: newRow.id, + passesCondition: true, + requiresRender: true, + valid: true, + value: newRow.id, + }, + [path]: { + ...state[path], + disableFormData: true, + requiresRender: true, + rows: withNewRow, + value: siblingRows.length, + }, + } + return newState } @@ -112,160 +129,6 @@ export function fieldReducer(state: FormState, action: FieldAction): FormState { return newState } - case 'UPDATE': { - const newField = Object.entries(action).reduce( - (field, [key, value]) => { - if ( - [ - 'disableFormData', - 'errorMessage', - 'initialValue', - 'rows', - 'valid', - 'validate', - 'value', - ].includes(key) - ) { - return { - ...field, - [key]: value, - } - } - - return field - }, - state[action.path] || ({} as FormField), - ) - - const newState = { - ...state, - [action.path]: newField, - } - - return newState - } - - case 'UPDATE_MANY': { - const newState = { ...state } - - Object.entries(action.formState).forEach(([path, field]) => { - newState[path] = field - }) - - return newState - } - - case 'REMOVE_ROW': { - const { path, rowIndex } = action - const { remainingFields, rows } = separateRows(path, state) - const rowsMetadata = [...(state[path]?.rows || [])] - - rows.splice(rowIndex, 1) - rowsMetadata.splice(rowIndex, 1) - - const newState: FormState = { - ...remainingFields, - [path]: { - ...state[path], - disableFormData: rows.length > 0, - requiresRender: true, - rows: rowsMetadata, - value: rows.length, - }, - ...flattenRows(path, rows), - } - - return newState - } - - case 'ADD_ROW': { - const { blockType, path, rowIndex: rowIndexFromArgs, subFieldState = {} } = action - - const rowIndex = - typeof rowIndexFromArgs === 'number' ? rowIndexFromArgs : state[path]?.rows?.length || 0 - - const withNewRow = [...(state[path]?.rows || [])] - - const newRow: Row = { - id: (subFieldState?.id?.value as string) || new ObjectId().toHexString(), - blockType: blockType || undefined, - collapsed: false, - } - - withNewRow.splice(rowIndex, 0, newRow) - - if (blockType) { - subFieldState.blockType = { - initialValue: blockType, - valid: true, - value: blockType, - } - } - - // add new row to array _field state_ - const { remainingFields, rows: siblingRows } = separateRows(path, state) - siblingRows.splice(rowIndex, 0, subFieldState) - - const newState: FormState = { - ...remainingFields, - ...flattenRows(path, siblingRows), - [`${path}.${rowIndex}.id`]: { - initialValue: newRow.id, - passesCondition: true, - requiresRender: true, - valid: true, - value: newRow.id, - }, - [path]: { - ...state[path], - disableFormData: true, - requiresRender: true, - rows: withNewRow, - value: siblingRows.length, - }, - } - - return newState - } - - case 'REPLACE_ROW': { - const { blockType, path, rowIndex: rowIndexArg, subFieldState = {} } = action - - const { remainingFields, rows: siblingRows } = separateRows(path, state) - const rowIndex = Math.max(0, Math.min(rowIndexArg, siblingRows?.length - 1 || 0)) - - const rowsMetadata = [...(state[path]?.rows || [])] - rowsMetadata[rowIndex] = { - id: new ObjectId().toHexString(), - blockType: blockType || undefined, - collapsed: false, - } - - if (blockType) { - subFieldState.blockType = { - initialValue: blockType, - valid: true, - value: blockType, - } - } - - // replace form _field state_ - siblingRows[rowIndex] = subFieldState - - const newState: FormState = { - ...remainingFields, - ...flattenRows(path, siblingRows), - [path]: { - ...state[path], - disableFormData: true, - rows: rowsMetadata, - value: siblingRows.length, - }, - } - - return newState - } - case 'DUPLICATE_ROW': { const { path, rowIndex } = action const { remainingFields, rows } = separateRows(path, state) @@ -342,20 +205,100 @@ export function fieldReducer(state: FormState, action: FieldAction): FormState { return newState } - case 'SET_ROW_COLLAPSED': { - const { path, updatedRows } = action + case 'REMOVE': { + const newState = { ...state } + if (newState[action.path]) { + delete newState[action.path] + } + return newState + } - const newState = { - ...state, + case 'REMOVE_ROW': { + const { path, rowIndex } = action + const { remainingFields, rows } = separateRows(path, state) + const rowsMetadata = [...(state[path]?.rows || [])] + + rows.splice(rowIndex, 1) + rowsMetadata.splice(rowIndex, 1) + + const newState: FormState = { + ...remainingFields, [path]: { ...state[path], - rows: updatedRows, + disableFormData: rows.length > 0, + requiresRender: true, + rows: rowsMetadata, + value: rows.length, + }, + ...flattenRows(path, rows), + } + + return newState + } + + case 'REPLACE_ROW': { + const { blockType, path, rowIndex: rowIndexArg, subFieldState = {} } = action + + const { remainingFields, rows: siblingRows } = separateRows(path, state) + const rowIndex = Math.max(0, Math.min(rowIndexArg, siblingRows?.length - 1 || 0)) + + const rowsMetadata = [...(state[path]?.rows || [])] + rowsMetadata[rowIndex] = { + id: new ObjectId().toHexString(), + blockType: blockType || undefined, + collapsed: false, + } + + if (blockType) { + subFieldState.blockType = { + initialValue: blockType, + valid: true, + value: blockType, + } + } + + // replace form _field state_ + siblingRows[rowIndex] = subFieldState + + const newState: FormState = { + ...remainingFields, + ...flattenRows(path, siblingRows), + [path]: { + ...state[path], + disableFormData: true, + rows: rowsMetadata, + value: siblingRows.length, }, } return newState } + case 'REPLACE_STATE': { + if (action.optimize !== false) { + // Only update fields that have changed + // by comparing old value / initialValue to new + // .. + // This is a performance enhancement for saving + // large documents with hundreds of fields + const newState = {} + + Object.entries(action.state).forEach(([path, field]) => { + const oldField = state[path] + const newField = field + + if (!dequal(oldField, newField)) { + newState[path] = newField + } else if (oldField) { + newState[path] = oldField + } + }) + return newState + } + // If we're not optimizing, just set the state to the new state + return action.state + } + case 'SET_ALL_ROWS_COLLAPSED': { const { path, updatedRows } = action @@ -368,6 +311,63 @@ export function fieldReducer(state: FormState, action: FieldAction): FormState { } } + case 'SET_ROW_COLLAPSED': { + const { path, updatedRows } = action + + const newState = { + ...state, + [path]: { + ...state[path], + rows: updatedRows, + }, + } + + return newState + } + + case 'UPDATE': { + const newField = Object.entries(action).reduce( + (field, [key, value]) => { + if ( + [ + 'disableFormData', + 'errorMessage', + 'initialValue', + 'rows', + 'valid', + 'validate', + 'value', + ].includes(key) + ) { + return { + ...field, + [key]: value, + } + } + + return field + }, + state[action.path] || ({} as FormField), + ) + + const newState = { + ...state, + [action.path]: newField, + } + + return newState + } + + case 'UPDATE_MANY': { + const newState = { ...state } + + Object.entries(action.formState).forEach(([path, field]) => { + newState[path] = field + }) + + return newState + } + default: { return state } diff --git a/packages/ui/src/forms/RenderFields/RenderField.tsx b/packages/ui/src/forms/RenderFields/RenderField.tsx index edc40383b0..2b397d85fc 100644 --- a/packages/ui/src/forms/RenderFields/RenderField.tsx +++ b/packages/ui/src/forms/RenderFields/RenderField.tsx @@ -78,18 +78,18 @@ export function RenderField({ return case 'blocks': return - case 'group': - return - case 'tabs': - return - - // unnamed fields with subfields - case 'row': - return case 'collapsible': return ( ) + case 'group': + return + + // unnamed fields with subfields + case 'row': + return + case 'tabs': + return default: return DefaultField ? : null diff --git a/packages/ui/src/forms/fieldSchemasToFormState/addFieldStatePromise.ts b/packages/ui/src/forms/fieldSchemasToFormState/addFieldStatePromise.ts index 91e09c39a6..1b99bcbbee 100644 --- a/packages/ui/src/forms/fieldSchemasToFormState/addFieldStatePromise.ts +++ b/packages/ui/src/forms/fieldSchemasToFormState/addFieldStatePromise.ts @@ -473,8 +473,8 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom break } - case 'upload': - case 'relationship': { + case 'relationship': + case 'upload': { if (field.filterOptions) { if (typeof field.filterOptions === 'object') { if (typeof field.relationTo === 'string') { diff --git a/packages/ui/src/forms/fieldSchemasToFormState/calculateDefaultValues/promise.ts b/packages/ui/src/forms/fieldSchemasToFormState/calculateDefaultValues/promise.ts index 221afef719..e9637a5f10 100644 --- a/packages/ui/src/forms/fieldSchemasToFormState/calculateDefaultValues/promise.ts +++ b/packages/ui/src/forms/fieldSchemasToFormState/calculateDefaultValues/promise.ts @@ -39,25 +39,6 @@ export const defaultValuePromise = async ({ // Traverse subfields switch (field.type) { - case 'group': { - if (typeof siblingData[field.name] !== 'object') { - siblingData[field.name] = {} - } - - const groupData = siblingData[field.name] as Record - - await iterateFields({ - id, - data, - fields: field.fields, - locale, - siblingData: groupData, - user, - }) - - break - } - case 'array': { const rows = siblingData[field.name] @@ -112,8 +93,9 @@ export const defaultValuePromise = async ({ break } - case 'row': - case 'collapsible': { + case 'collapsible': + + case 'row': { await iterateFields({ id, data, @@ -125,6 +107,24 @@ export const defaultValuePromise = async ({ break } + case 'group': { + if (typeof siblingData[field.name] !== 'object') { + siblingData[field.name] = {} + } + + const groupData = siblingData[field.name] as Record + + await iterateFields({ + id, + data, + fields: field.fields, + locale, + siblingData: groupData, + user, + }) + + break + } case 'tab': { let tabSiblingData diff --git a/packages/ui/src/utilities/buildFieldSchemaMap/traverseFields.ts b/packages/ui/src/utilities/buildFieldSchemaMap/traverseFields.ts index 583c9bf5ee..3fd6ee115d 100644 --- a/packages/ui/src/utilities/buildFieldSchemaMap/traverseFields.ts +++ b/packages/ui/src/utilities/buildFieldSchemaMap/traverseFields.ts @@ -33,8 +33,8 @@ export const traverseFields = ({ schemaMap.set(schemaPath, field) switch (field.type) { - case 'group': case 'array': + case 'group': traverseFields({ config, fields: field.fields, @@ -46,19 +46,6 @@ export const traverseFields = ({ break - case 'collapsible': - case 'row': - traverseFields({ - config, - fields: field.fields, - i18n, - parentIndexPath: indexPath, - parentSchemaPath, - schemaMap, - }) - - break - case 'blocks': field.blocks.map((block) => { const blockSchemaPath = `${schemaPath}.${block.slug}` @@ -74,6 +61,19 @@ export const traverseFields = ({ }) }) + break + case 'collapsible': + + case 'row': + traverseFields({ + config, + fields: field.fields, + i18n, + parentIndexPath: indexPath, + parentSchemaPath, + schemaMap, + }) + break case 'richText': diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 73c29b9066..9a7c21d22e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -500,11 +500,11 @@ importers: packages/eslint-config: dependencies: '@eslint-react/eslint-plugin': - specifier: 1.12.3 - version: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 1.16.1 + version: 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@eslint/js': - specifier: 9.9.1 - version: 9.9.1 + specifier: 9.14.0 + version: 9.14.0 '@payloadcms/eslint-plugin': specifier: workspace:* version: link:../eslint-plugin @@ -515,53 +515,53 @@ importers: specifier: 8.42.3 version: 8.42.3 '@typescript-eslint/parser': - specifier: 8.3.0 - version: 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 8.14.0 + version: 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) eslint: - specifier: 9.9.1 - version: 9.9.1(jiti@1.21.6) + specifier: 9.14.0 + version: 9.14.0(jiti@1.21.6) eslint-config-prettier: specifier: 9.1.0 - version: 9.1.0(eslint@9.9.1(jiti@1.21.6)) + version: 9.1.0(eslint@9.14.0(jiti@1.21.6)) eslint-plugin-import-x: - specifier: 4.1.1 - version: 4.1.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 4.4.2 + version: 4.4.2(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) eslint-plugin-jest: - specifier: 28.8.1 - version: 28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3) + specifier: 28.9.0 + version: 28.9.0(@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3) eslint-plugin-jest-dom: specifier: 5.4.0 - version: 5.4.0(eslint@9.9.1(jiti@1.21.6)) + version: 5.4.0(eslint@9.14.0(jiti@1.21.6)) eslint-plugin-jsx-a11y: - specifier: 6.9.0 - version: 6.9.0(eslint@9.9.1(jiti@1.21.6)) + specifier: 6.10.2 + version: 6.10.2(eslint@9.14.0(jiti@1.21.6)) eslint-plugin-perfectionist: - specifier: 3.3.0 - version: 3.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 3.9.1 + version: 3.9.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) eslint-plugin-react-hooks: - specifier: 5.1.0-rc-a19a8ab4-20240829 - version: 5.1.0-rc-a19a8ab4-20240829(eslint@9.9.1(jiti@1.21.6)) + specifier: 5.0.0 + version: 5.0.0(eslint@9.14.0(jiti@1.21.6)) eslint-plugin-regexp: specifier: 2.6.0 - version: 2.6.0(eslint@9.9.1(jiti@1.21.6)) + version: 2.6.0(eslint@9.14.0(jiti@1.21.6)) globals: - specifier: 15.9.0 - version: 15.9.0 + specifier: 15.12.0 + version: 15.12.0 typescript: specifier: 5.6.3 version: 5.6.3 typescript-eslint: - specifier: 8.3.0 - version: 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 8.14.0 + version: 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) packages/eslint-plugin: dependencies: '@eslint-react/eslint-plugin': - specifier: 1.12.3 - version: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 1.16.1 + version: 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@eslint/js': - specifier: 9.9.1 - version: 9.9.1 + specifier: 9.14.0 + version: 9.14.0 '@types/eslint': specifier: 9.6.1 version: 9.6.1 @@ -569,44 +569,44 @@ importers: specifier: 8.42.3 version: 8.42.3 '@typescript-eslint/parser': - specifier: 8.3.0 - version: 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 8.14.0 + version: 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) eslint: - specifier: 9.9.1 - version: 9.9.1(jiti@1.21.6) + specifier: 9.14.0 + version: 9.14.0(jiti@1.21.6) eslint-config-prettier: specifier: 9.1.0 - version: 9.1.0(eslint@9.9.1(jiti@1.21.6)) + version: 9.1.0(eslint@9.14.0(jiti@1.21.6)) eslint-plugin-import-x: - specifier: 4.1.1 - version: 4.1.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 4.4.2 + version: 4.4.2(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) eslint-plugin-jest: - specifier: 28.8.1 - version: 28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3) + specifier: 28.9.0 + version: 28.9.0(@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3) eslint-plugin-jest-dom: specifier: 5.4.0 - version: 5.4.0(eslint@9.9.1(jiti@1.21.6)) + version: 5.4.0(eslint@9.14.0(jiti@1.21.6)) eslint-plugin-jsx-a11y: - specifier: 6.9.0 - version: 6.9.0(eslint@9.9.1(jiti@1.21.6)) + specifier: 6.10.2 + version: 6.10.2(eslint@9.14.0(jiti@1.21.6)) eslint-plugin-perfectionist: - specifier: 3.3.0 - version: 3.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 3.9.1 + version: 3.9.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) eslint-plugin-react-hooks: - specifier: 5.1.0-rc-a19a8ab4-20240829 - version: 5.1.0-rc-a19a8ab4-20240829(eslint@9.9.1(jiti@1.21.6)) + specifier: 5.0.0 + version: 5.0.0(eslint@9.14.0(jiti@1.21.6)) eslint-plugin-regexp: specifier: 2.6.0 - version: 2.6.0(eslint@9.9.1(jiti@1.21.6)) + version: 2.6.0(eslint@9.14.0(jiti@1.21.6)) globals: - specifier: 15.9.0 - version: 15.9.0 + specifier: 15.12.0 + version: 15.12.0 typescript: specifier: 5.6.3 version: 5.6.3 typescript-eslint: - specifier: 8.3.0 - version: 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + specifier: 8.14.0 + version: 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) packages/graphql: dependencies: @@ -792,8 +792,8 @@ importers: specifier: 3.3.1 version: 3.3.1(esbuild@0.23.1)(sass-embedded@1.80.6) eslint-plugin-react-compiler: - specifier: 0.0.0-experimental-7670337-20240918 - version: 0.0.0-experimental-7670337-20240918(eslint@9.9.1(jiti@1.21.6)) + specifier: 19.0.0-beta-a7bf2bd-20241110 + version: 19.0.0-beta-a7bf2bd-20241110(eslint@9.14.0(jiti@1.21.6)) payload: specifier: workspace:* version: link:../payload @@ -1276,7 +1276,7 @@ importers: version: 7.26.0(@babel/core@7.26.0) '@lexical/eslint-plugin': specifier: 0.20.0 - version: 0.20.0(eslint@9.9.1(jiti@1.21.6)) + version: 0.20.0(eslint@9.14.0(jiti@1.21.6)) '@payloadcms/eslint-config': specifier: workspace:* version: link:../eslint-config @@ -1308,8 +1308,8 @@ importers: specifier: 3.3.1 version: 3.3.1(esbuild@0.23.1)(sass-embedded@1.80.6) eslint-plugin-react-compiler: - specifier: 0.0.0-experimental-7670337-20240918 - version: 0.0.0-experimental-7670337-20240918(eslint@9.9.1(jiti@1.21.6)) + specifier: 19.0.0-beta-a7bf2bd-20241110 + version: 19.0.0-beta-a7bf2bd-20241110(eslint@9.14.0(jiti@1.21.6)) payload: specifier: workspace:* version: link:../payload @@ -1595,8 +1595,8 @@ importers: specifier: 3.3.1 version: 3.3.1(esbuild@0.23.1)(sass-embedded@1.80.6) eslint-plugin-react-compiler: - specifier: 0.0.0-experimental-7670337-20240918 - version: 0.0.0-experimental-7670337-20240918(eslint@9.9.1(jiti@1.21.6)) + specifier: 19.0.0-beta-a7bf2bd-20241110 + version: 19.0.0-beta-a7bf2bd-20241110(eslint@9.14.0(jiti@1.21.6)) payload: specifier: workspace:* version: link:../payload @@ -1734,7 +1734,7 @@ importers: version: 0.28.0 eslint-plugin-playwright: specifier: 1.7.0 - version: 1.7.0(eslint-plugin-jest@28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6)) + version: 1.7.0(eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6)) execa: specifier: 5.1.1 version: 5.1.1 @@ -3209,14 +3209,14 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@1.12.3': - resolution: {integrity: sha512-3uRe9EBiaLpyzHKyhvm4ZXGo3h+hp9kvhRBE6mjU5up2RmUkD4qtaTVwKoHrYECADNSvzBtwHH2URARXKQ7oHg==} + '@eslint-react/ast@1.16.1': + resolution: {integrity: sha512-IzJnMy+70w8k1ek06vqdk8g/vxVffOII3c65ggtlQwj2ZBZB/cgUABzNkDV7Hi3VtE0kChZSVSDV6MR76gt5Sg==} - '@eslint-react/core@1.12.3': - resolution: {integrity: sha512-MKwkzrgouFyxdI01GzHY1iifK0KPeGnThqHiRc+IGk+Dgg/8Rq2T0glUx+15J10hRbIg1bl4Cja12R/dv4R9jA==} + '@eslint-react/core@1.16.1': + resolution: {integrity: sha512-QTuROazb1gILdV1h4iON38HbxQpOUMpEPg3etoFrLeH1a9yJIfnsb2t1ryrJh2pqQ+Rw5Lz6za+sJknbuDYxOg==} - '@eslint-react/eslint-plugin@1.12.3': - resolution: {integrity: sha512-S9Y3mdvbZLKH5ah1LHvAiSd9tc8ijzKjAENMPvfW5WWzyfs6+oRfUrmlrJS3u4k16Fi6zweIlV5hk7gjaFWniQ==} + '@eslint-react/eslint-plugin@1.16.1': + resolution: {integrity: sha512-QTpBKDbe6DZCsczFkFjqVFRuwbUlMV+FF0XdZLrMRuHEvmcs/6G70wHL/hCe2CruARnGiAQRWnA+IenFw+gAuw==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3225,37 +3225,45 @@ packages: typescript: optional: true - '@eslint-react/jsx@1.12.3': - resolution: {integrity: sha512-aKuJRjcwEPUbeAXu7VLKICFeVZk/NhbeQIwIRdjw0JAmfNtEO5QD2wqWDZLCb4+f1moR2W3+QD8e9t0opo70QQ==} + '@eslint-react/jsx@1.16.1': + resolution: {integrity: sha512-VrlCeVpRkAK5t8tpJRa+IOIdQQ9qTCnS1UOZOSV/SDcgBdsyGFkYzzY1EHUCR9MSxpsS/NPaXBfvrgMJ+llMow==} - '@eslint-react/shared@1.12.3': - resolution: {integrity: sha512-4zBS9ISXbb/1OM6W0x5FH2Bu2+ULmfWLQRGc3GFcWiIcHMVBB4bQGK8CsYAcxSIUxaERh3PgPKMx4aZDwBNIhQ==} + '@eslint-react/shared@1.16.1': + resolution: {integrity: sha512-A+R590q0UQuHVlz9YHs+g6HQZ/cyKK/bWw0ykyEAoTNXCDz8lpbxW02dH4iC/9eMEnYs2dQn4as1qkwm9GhrfQ==} - '@eslint-react/tools@1.12.3': - resolution: {integrity: sha512-Q5HRbzY0lkJwdeatPkFsPgmBhP9KPGaVxtRKazsGcCO3edg2wTJP0C8khw2fplaIAce+Tj3I3YasUlp1uKQeCw==} + '@eslint-react/tools@1.16.1': + resolution: {integrity: sha512-X/VbkpltsfLLM14SqAThFEEsvQOCopyFXRwnAJp6HU9SdZEy7CkqRdPz/EQl8w7SEl70/DVFI2kvx0FN8YP3bw==} - '@eslint-react/types@1.12.3': - resolution: {integrity: sha512-Ph6vXLz/NDeGE0/EvDTfWOrqtlE/qLcMhITCdt+ynGOP0HtRn1E8jrEZ0zTH6ri8wng6tlSHEPDnsZMNwe4hOg==} + '@eslint-react/types@1.16.1': + resolution: {integrity: sha512-0vNdbVtebCtlGZBFWmZaYvXYhgakKrvQz1WYeSmEMKLSebIgReSrvjqVOhQOvoz41lGIuNYUKfYVSWwj41lyDg==} - '@eslint-react/var@1.12.3': - resolution: {integrity: sha512-K9lBA5Ap3bFfH2OxcpZYyK7HieWmJOtyjAmvC2E2StsPcQlBci+ID82xQEqrPvdL1qdRYWKpSzvSd8Xu4cJf/w==} + '@eslint-react/var@1.16.1': + resolution: {integrity: sha512-CZ1fMQPkr60pwx8PLHsn75cl1Ovw/GHo2v6nhdWyhW8VhbBwJ1d1VdjSxPZjHJ4KCZFTuVVunWn7W9gDZmK+ow==} '@eslint/config-array@0.18.0': resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.9.1': - resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==} + '@eslint/js@9.14.0': + resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.2': + resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@faceless-ui/modal@3.0.0-beta.2': resolution: {integrity: sha512-UmXvz7Iw3KMO4Pm3llZczU4uc5pPQDb6rdqwoBvYDFgWvkraOAHKx0HxSZgwqQvqOhn8joEFBfFp6/Do2562ow==} peerDependencies: @@ -3315,6 +3323,14 @@ packages: resolution: {integrity: sha512-H41bPL2cMfSi4EEnFzKvg7XSb7T67ocSXrmF7MPjfgFB0L6CKGzfIYJheAZi1iqXjz6XaCT1OBf6HCG5vDBTOQ==} engines: {node: '>=14'} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -3323,6 +3339,10 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + '@hyrious/esbuild-plugin-commonjs@0.2.4': resolution: {integrity: sha512-NKR8bsDbNP7EpM//cjoo8Bpihmc97gPpnwrggG+18iSGow6oaJpfmy3Bv+oBgPkPlxcGzC9SXh+6szoCoKFvCw==} engines: {node: '>=14'} @@ -4904,8 +4924,8 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.3.0': - resolution: {integrity: sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==} + '@typescript-eslint/eslint-plugin@8.14.0': + resolution: {integrity: sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -4915,8 +4935,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.3.0': - resolution: {integrity: sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==} + '@typescript-eslint/parser@8.14.0': + resolution: {integrity: sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4929,8 +4949,8 @@ packages: resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.3.0': - resolution: {integrity: sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==} + '@typescript-eslint/scope-manager@8.14.0': + resolution: {integrity: sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.13.0': @@ -4942,8 +4962,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.3.0': - resolution: {integrity: sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==} + '@typescript-eslint/type-utils@8.14.0': + resolution: {integrity: sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -4955,8 +4975,8 @@ packages: resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.3.0': - resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==} + '@typescript-eslint/types@8.14.0': + resolution: {integrity: sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.13.0': @@ -4968,8 +4988,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.3.0': - resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==} + '@typescript-eslint/typescript-estree@8.14.0': + resolution: {integrity: sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -4983,8 +5003,8 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/utils@8.3.0': - resolution: {integrity: sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==} + '@typescript-eslint/utils@8.14.0': + resolution: {integrity: sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4993,8 +5013,8 @@ packages: resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.3.0': - resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==} + '@typescript-eslint/visitor-keys@8.14.0': + resolution: {integrity: sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@uploadthing/mime-types@0.2.10': @@ -5203,8 +5223,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} @@ -5271,8 +5292,9 @@ packages: axios@1.4.0: resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} - axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -5810,10 +5832,6 @@ packages: babel-plugin-macros: optional: true - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -6103,13 +6121,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} - engines: {node: '>= 0.4'} - es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} @@ -6187,8 +6198,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-plugin-import-x@4.1.1: - resolution: {integrity: sha512-dBEM8fACIFNt4H7GoOaRmnH6evJW6JSTJTYYgmRd3vI4geBTjgDM/JyUDKUwIw0HDSyI+u7Vs3vFRXUo/BOAtA==} + eslint-plugin-import-x@4.4.2: + resolution: {integrity: sha512-mDRXPSLQ0UQZQw91QdG4/qZT6hgeW2MJTczAbgPseUZuPEtIjjdPOolXroRkulnOn3fzj6gNgvk+wchMJiHElg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6203,8 +6214,8 @@ packages: '@testing-library/dom': optional: true - eslint-plugin-jest@28.8.1: - resolution: {integrity: sha512-G46XMyYu6PtSNJUkQ0hsPjzXYpzq/O4vpCciMizTKRJG8kNsRreGoMRDG6H9FIB/xVgfFuclVnuX4XRvFUzrZQ==} + eslint-plugin-jest@28.9.0: + resolution: {integrity: sha512-rLu1s1Wf96TgUUxSw6loVIkNtUjq1Re7A9QdCCHSohnvXEBAjuL420h0T/fMmkQlNsQP2GhQzEUpYHPfxBkvYQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -6216,20 +6227,20 @@ packages: jest: optional: true - eslint-plugin-jsx-a11y@6.9.0: - resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} engines: {node: '>=4.0'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-perfectionist@3.3.0: - resolution: {integrity: sha512-sGgShkEqDBqIZ3WlenGHwLe1cl3vHKTfeh9b1XXAamaxSC7AY4Os0jdNCXnGJW4l0TlpismT5t2r7CXY7sfKlw==} + eslint-plugin-perfectionist@3.9.1: + resolution: {integrity: sha512-9WRzf6XaAxF4Oi5t/3TqKP5zUjERhasHmLFHin2Yw6ZAp/EP/EVA2dr3BhQrrHWCm5SzTMZf0FcjDnBkO2xFkA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: astro-eslint-parser: ^1.0.2 eslint: '>=8.0.0' svelte: '>=3.0.0' - svelte-eslint-parser: ^0.41.0 + svelte-eslint-parser: ^0.41.1 vue-eslint-parser: '>=9.0.0' peerDependenciesMeta: astro-eslint-parser: @@ -6251,14 +6262,14 @@ packages: eslint-plugin-jest: optional: true - eslint-plugin-react-compiler@0.0.0-experimental-7670337-20240918: - resolution: {integrity: sha512-FZXoYqGK3BiJw2BFQIUL0C9GgEF2QS+y6oiVPm4GooX6SXrg/UVtCi1nMAaBhqTpsF/KF2RjobgePY8KgbqXow==} + eslint-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110: + resolution: {integrity: sha512-b5/hRnOQlnH9CEnJQ6UrPoIAG4y/wIGv+OVEHTeAkbq+1uojfcuQyLToYvK1T9a6vz5WQHeMjQqFOZk3mtWorg==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} peerDependencies: eslint: '>=7' - eslint-plugin-react-debug@1.12.3: - resolution: {integrity: sha512-rtKsmDWFz1aG5EMj27fNfbVIxsdhqA1MIv9G4CSRhXWgqlIdg4NMWvk+2yRJjBzLWfAh1TlpLeXjuLd0PDmreQ==} + eslint-plugin-react-debug@1.16.1: + resolution: {integrity: sha512-AijumibZ+3hBYCGBEeD3GQse5TPnq9z6bX0qfsFwCwWjkW+siL2EEGvaxT7UZp2mcFMvoRJT3E4Jsemn6g0AGw==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6267,8 +6278,8 @@ packages: typescript: optional: true - eslint-plugin-react-dom@1.12.3: - resolution: {integrity: sha512-bZOcY1Dew7WqYrdn9FLQPTL9U0qeBIpSpC2mOXKxgsvGC/B+BYQKp89K05WeRBubmqDfDKVdrqVcAku2f7BU7w==} + eslint-plugin-react-dom@1.16.1: + resolution: {integrity: sha512-qJFfCR2Rofd5/V9/8EE4sg6a829HcI07DeK7qqTosYRPBYkwbfUUjvizzlTxneMAcPQuFfPZa1UMDTaejKStyg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6277,8 +6288,8 @@ packages: typescript: optional: true - eslint-plugin-react-hooks-extra@1.12.3: - resolution: {integrity: sha512-QdTOf+GddxSBA3UBme+2DwUaUJA4YzYIP+JYI3AD8Ja04nEoMqvSu4SOXVtmRr1aLWeWgR/fC3SNFXgGZUaI9A==} + eslint-plugin-react-hooks-extra@1.16.1: + resolution: {integrity: sha512-OJ4RJZ7n25XnF6+NaFC9dzrec2C+/o4zb4Brs+v6fVVbvQQZirgWamKZMOJo+I1HsHdOULtBo1uwopLfnVBihQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6287,14 +6298,14 @@ packages: typescript: optional: true - eslint-plugin-react-hooks@5.1.0-rc-a19a8ab4-20240829: - resolution: {integrity: sha512-lWHTnMQqgAvQ4S5VVyXSxdNnfqbSiH4VAb7hbN1scbQaB9DmXkE2r1EOi2RigeA3x994TOcrFb73l1UZD4PvXQ==} + eslint-plugin-react-hooks@5.0.0: + resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-naming-convention@1.12.3: - resolution: {integrity: sha512-PKKXx3Wvh/KUftE7nh+imyOrUzkIyF41i9TaPbDxuEt+ggIY0cuvYOE/bcDCVJBDq0ROb2ZhERe9i46RaJoG/Q==} + eslint-plugin-react-naming-convention@1.16.1: + resolution: {integrity: sha512-qyZ6YW82vLHHQEboc0LhE+9Uga2koCtwEV0XYEWxq3DI3Wg1SlwsfchPYQc7skRh2c/Jh9YG2gzRmNXG4Ul2Ww==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6303,8 +6314,8 @@ packages: typescript: optional: true - eslint-plugin-react-web-api@1.12.3: - resolution: {integrity: sha512-I5UgttFfAUYQ4lSWoHs02pHb0Pp2ou3xJ4L3xRv7Uce2s8sRPKazYOt7frxqfvBMxdzStS4/g0Gu7k5/PtPypA==} + eslint-plugin-react-web-api@1.16.1: + resolution: {integrity: sha512-kQp8NlJESf87tVPyQnzyziVUwbqYhn0Xsrwj8joA8Bxnkt2bsylmDuMoBV0VntNYnfgoUvBj8D/OuZgb1IfLVQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6313,8 +6324,8 @@ packages: typescript: optional: true - eslint-plugin-react-x@1.12.3: - resolution: {integrity: sha512-LfmjFDiqleIEFqOOcAbsPqQnTkkT68tlYEpeXZBa+IWUtQVC4jxIRTmus+m/h9Td6wf2XGVEzwwSqmYQQzcb7w==} + eslint-plugin-react-x@1.16.1: + resolution: {integrity: sha512-Oqu3DMLHXEisvXrAzk7lyZ57W6MlP8nOo3/PkcKtxImB5fCGYILKJY22Jz6hfWZ3MhTzEuVZru8x26Mev+9thQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6345,8 +6356,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.9.1: - resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==} + eslint@9.14.0: + resolution: {integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -6764,8 +6775,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.9.0: - resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -6997,10 +7008,6 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -7011,10 +7018,6 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} @@ -7062,9 +7065,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -7081,10 +7081,6 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -7106,10 +7102,6 @@ packages: engines: {node: '>=14.16'} hasBin: true - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -7152,10 +7144,6 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} @@ -7188,17 +7176,9 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - is-whitespace@0.3.0: resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} engines: {node: '>=0.10.0'} @@ -7253,10 +7233,6 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - iterator.prototype@1.1.3: - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} - engines: {node: '>= 0.4'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -7987,10 +7963,6 @@ packages: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -8534,10 +8506,6 @@ packages: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.2.0: resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} @@ -9090,10 +9058,6 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} @@ -9534,8 +9498,8 @@ packages: types-react@19.0.0-rc.1: resolution: {integrity: sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ==} - typescript-eslint@8.3.0: - resolution: {integrity: sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==} + typescript-eslint@8.14.0: + resolution: {integrity: sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -9757,14 +9721,6 @@ packages: which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - which-typed-array@1.1.15: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} @@ -11824,20 +11780,20 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.9.1(jiti@1.21.6))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.14.0(jiti@1.21.6))': dependencies: - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint-react/ast@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@eslint-react/ast@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/types': 8.13.0 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) birecord: 0.1.1 string-ts: 2.2.0 ts-pattern: 5.5.0 @@ -11846,18 +11802,18 @@ snapshots: - supports-color - typescript - '@eslint-react/core@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@eslint-react/core@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/type-utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) birecord: 0.1.1 short-unique-id: 5.2.0 ts-pattern: 5.5.0 @@ -11866,72 +11822,72 @@ snapshots: - supports-color - typescript - '@eslint-react/eslint-plugin@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@eslint-react/eslint-plugin@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/type-utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) - eslint-plugin-react-debug: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint-plugin-react-dom: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint-plugin-react-hooks-extra: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint-plugin-react-naming-convention: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint-plugin-react-web-api: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint-plugin-react-x: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) + eslint-plugin-react-debug: 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint-plugin-react-dom: 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint-plugin-react-hooks-extra: 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint-plugin-react-naming-convention: 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint-plugin-react-web-api: 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint-plugin-react-x: 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@eslint-react/jsx@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) ts-pattern: 5.5.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@eslint-react/shared@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.12.3 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) picomatch: 4.0.2 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/tools@1.12.3': {} + '@eslint-react/tools@1.16.1': {} - '@eslint-react/types@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@eslint-react/types@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-react/tools': 1.12.3 + '@eslint-react/tools': 1.16.1 '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/var@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@eslint-react/var@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) ts-pattern: 5.5.0 transitivePeerDependencies: - eslint @@ -11946,6 +11902,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/core@0.7.0': {} + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 @@ -11960,10 +11918,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.9.1': {} + '@eslint/js@9.14.0': {} '@eslint/object-schema@2.1.4': {} + '@eslint/plugin-kit@0.2.2': + dependencies: + levn: 0.4.1 + '@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)': dependencies: body-scroll-lock: 4.0.0-beta.0 @@ -12039,10 +12001,19 @@ snapshots: - encoding - supports-color + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/retry@0.4.1': {} + '@hyrious/esbuild-plugin-commonjs@0.2.4(cjs-module-lexer@1.4.1)(esbuild@0.23.1)': dependencies: esbuild: 0.23.1 @@ -12374,9 +12345,9 @@ snapshots: dependencies: lexical: 0.20.0 - '@lexical/eslint-plugin@0.20.0(eslint@9.9.1(jiti@1.21.6))': + '@lexical/eslint-plugin@0.20.0(eslint@9.14.0(jiti@1.21.6))': dependencies: - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) '@lexical/hashtag@0.20.0': dependencies: @@ -14071,15 +14042,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.3.0 - '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.3.0 - eslint: 9.9.1(jiti@1.21.6) + '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.14.0 + '@typescript-eslint/type-utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.14.0 + eslint: 9.14.0(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -14089,14 +14060,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.3.0 - '@typescript-eslint/types': 8.3.0 - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.3.0 + '@typescript-eslint/scope-manager': 8.14.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.14.0 debug: 4.3.7 - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -14107,15 +14078,15 @@ snapshots: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/visitor-keys': 8.13.0 - '@typescript-eslint/scope-manager@8.3.0': + '@typescript-eslint/scope-manager@8.14.0': dependencies: - '@typescript-eslint/types': 8.3.0 - '@typescript-eslint/visitor-keys': 8.3.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/visitor-keys': 8.14.0 - '@typescript-eslint/type-utils@8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) debug: 4.3.7 ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: @@ -14124,10 +14095,10 @@ snapshots: - eslint - supports-color - '@typescript-eslint/type-utils@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) debug: 4.3.7 ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: @@ -14138,7 +14109,7 @@ snapshots: '@typescript-eslint/types@8.13.0': {} - '@typescript-eslint/types@8.3.0': {} + '@typescript-eslint/types@8.14.0': {} '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': dependencies: @@ -14155,10 +14126,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.3.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.14.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.3.0 - '@typescript-eslint/visitor-keys': 8.3.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/visitor-keys': 8.14.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -14170,24 +14141,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/utils@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.9.1(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0(jiti@1.21.6)) '@typescript-eslint/scope-manager': 8.13.0 '@typescript-eslint/types': 8.13.0 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.9.1(jiti@1.21.6)) - '@typescript-eslint/scope-manager': 8.3.0 - '@typescript-eslint/types': 8.3.0 - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.14.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript @@ -14197,9 +14168,9 @@ snapshots: '@typescript-eslint/types': 8.13.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.3.0': + '@typescript-eslint/visitor-keys@8.14.0': dependencies: - '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/types': 8.14.0 eslint-visitor-keys: 3.4.3 '@uploadthing/mime-types@0.2.10': {} @@ -14471,9 +14442,7 @@ snapshots: argparse@2.0.1: {} - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.1: dependencies: @@ -14552,9 +14521,7 @@ snapshots: transitivePeerDependencies: - debug - axobject-query@3.1.1: - dependencies: - deep-equal: 2.2.3 + axobject-query@4.1.0: {} b4a@1.6.7: {} @@ -15151,27 +15118,6 @@ snapshots: optionalDependencies: babel-plugin-macros: 3.1.0 - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -15416,36 +15362,6 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - - es-iterator-helpers@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.3 - safe-array-concat: 1.1.2 - es-module-lexer@1.5.4: {} es-object-atoms@1.0.0: @@ -15579,9 +15495,9 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.0(eslint@9.9.1(jiti@1.21.6)): + eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@1.21.6)): dependencies: - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) eslint-import-resolver-node@0.3.9: dependencies: @@ -15591,13 +15507,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.1.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + eslint-plugin-import-x@4.4.2(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) debug: 4.3.7 doctrine: 3.0.0 - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.8.1 is-glob: 4.0.3 @@ -15609,35 +15524,34 @@ snapshots: - supports-color - typescript - eslint-plugin-jest-dom@5.4.0(eslint@9.9.1(jiti@1.21.6)): + eslint-plugin-jest-dom@5.4.0(eslint@9.14.0(jiti@1.21.6)): dependencies: '@babel/runtime': 7.26.0 - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) requireindex: 1.2.0 - eslint-plugin-jest@28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3): + eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3): dependencies: - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) jest: 29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsx-a11y@6.9.0(eslint@9.9.1(jiti@1.21.6)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.14.0(jiti@1.21.6)): dependencies: - aria-query: 5.1.3 + aria-query: 5.3.2 array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.8 axe-core: 4.10.2 - axobject-query: 3.1.1 + axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.2.0 - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -15646,50 +15560,50 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 - eslint-plugin-perfectionist@3.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + eslint-plugin-perfectionist@3.9.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) - minimatch: 10.0.1 + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) + minimatch: 9.0.5 natural-compare-lite: 1.4.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-playwright@1.7.0(eslint-plugin-jest@28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6)): + eslint-plugin-playwright@1.7.0(eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6)): dependencies: - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) globals: 13.24.0 optionalDependencies: - eslint-plugin-jest: 28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3) + eslint-plugin-jest: 28.9.0(@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(jest@29.7.0(@types/node@22.5.4)(babel-plugin-macros@3.1.0))(typescript@5.6.3) - eslint-plugin-react-compiler@0.0.0-experimental-7670337-20240918(eslint@9.9.1(jiti@1.21.6)): + eslint-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110(eslint@9.14.0(jiti@1.21.6)): dependencies: '@babel/core': 7.26.0 '@babel/parser': 7.26.2 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.0) - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) hermes-parser: 0.20.1 zod: 3.23.8 zod-validation-error: 3.4.0(zod@3.23.8) transitivePeerDependencies: - supports-color - eslint-plugin-react-debug@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + eslint-plugin-react-debug@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/type-utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) string-ts: 2.2.0 ts-pattern: 5.5.0 optionalDependencies: @@ -15697,115 +15611,115 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + eslint-plugin-react-dom@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + eslint-plugin-react-hooks-extra@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/type-utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.1.0-rc-a19a8ab4-20240829(eslint@9.9.1(jiti@1.21.6)): + eslint-plugin-react-hooks@5.0.0(eslint@9.14.0(jiti@1.21.6)): dependencies: - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) - eslint-plugin-react-naming-convention@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + eslint-plugin-react-naming-convention@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/type-utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + eslint-plugin-react-web-api@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) birecord: 0.1.1 - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + eslint-plugin-react-x@1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/tools': 1.12.3 - '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/ast': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/core': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/jsx': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/shared': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/tools': 1.16.1 + '@eslint-react/types': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@eslint-react/var': 1.16.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/type-utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) - is-immutable-type: 5.0.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) + is-immutable-type: 5.0.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) ts-pattern: 5.5.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - eslint-plugin-regexp@2.6.0(eslint@9.9.1(jiti@1.21.6)): + eslint-plugin-regexp@2.6.0(eslint@9.14.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.9.1(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 - eslint: 9.9.1(jiti@1.21.6) + eslint: 9.14.0(jiti@1.21.6) jsdoc-type-pratt-parser: 4.1.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 @@ -15825,16 +15739,20 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.9.1(jiti@1.21.6): + eslint@9.14.0(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.9.1(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.18.0 + '@eslint/core': 0.7.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.9.1 + '@eslint/js': 9.14.0 + '@eslint/plugin-kit': 0.2.2 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.1 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.5 @@ -15852,14 +15770,11 @@ snapshots: ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 text-table: 0.2.0 optionalDependencies: jiti: 1.21.6 @@ -16316,7 +16231,7 @@ snapshots: globals@14.0.0: {} - globals@15.9.0: {} + globals@15.12.0: {} globalthis@1.0.4: dependencies: @@ -16571,11 +16486,6 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -16585,10 +16495,6 @@ snapshots: is-arrayish@0.3.2: {} - is-async-function@2.0.0: - dependencies: - has-tostringtag: 1.0.2 - is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 @@ -16626,10 +16532,6 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.7 - is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} @@ -16640,10 +16542,6 @@ snapshots: is-generator-fn@2.1.0: {} - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -16652,10 +16550,10 @@ snapshots: is-hotkey@0.2.0: {} - is-immutable-type@5.0.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + is-immutable-type@5.0.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@typescript-eslint/type-utils': 8.13.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.9.1(jiti@1.21.6) + '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.14.0(jiti@1.21.6) ts-api-utils: 1.4.0(typescript@5.6.3) ts-declaration-location: 1.0.4(typescript@5.6.3) typescript: 5.6.3 @@ -16666,8 +16564,6 @@ snapshots: dependencies: is-docker: 3.0.0 - is-map@2.0.3: {} - is-negative-zero@2.0.3: {} is-number-object@1.0.7: @@ -16697,8 +16593,6 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 @@ -16723,17 +16617,10 @@ snapshots: is-unicode-supported@2.1.0: {} - is-weakmap@2.0.2: {} - is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-whitespace@0.3.0: {} is-windows@1.0.2: {} @@ -16800,14 +16687,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.3: - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 - set-function-name: 2.0.2 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -17773,11 +17652,6 @@ snapshots: object-inspect@1.13.2: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - object-keys@1.1.1: {} object-to-formdata@4.5.1: {} @@ -18354,16 +18228,6 @@ snapshots: dependencies: '@eslint-community/regexpp': 4.12.1 - reflect.getprototypeof@1.0.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.4 - regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -18914,10 +18778,6 @@ snapshots: std-env@3.7.0: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - stream-browserify@3.0.0: dependencies: inherits: 2.0.4 @@ -19377,11 +19237,11 @@ snapshots: dependencies: csstype: 3.1.3 - typescript-eslint@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3): + typescript-eslint@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/parser': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -19604,28 +19464,6 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 - which-builtin-type@1.1.4: - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7