diff --git a/packages/create-payload-app/src/lib/create-project.spec.ts b/packages/create-payload-app/src/lib/create-project.spec.ts index aa3b00cd7f..01dad6e8cd 100644 --- a/packages/create-payload-app/src/lib/create-project.spec.ts +++ b/packages/create-payload-app/src/lib/create-project.spec.ts @@ -1,18 +1,20 @@ +import { jest } from '@jest/globals' +import fs from 'fs' import fse from 'fs-extra' +import globby from 'globby' +import * as os from 'node:os' import path from 'path' + import type { CliArgs, DbType, ProjectTemplate } from '../types.js' + import { createProject } from './create-project.js' import { dbReplacements } from './replacements.js' import { getValidTemplates } from './templates.js' -import globby from 'globby' -import { jest } from '@jest/globals' -import fs from 'fs' -import * as os from 'node:os' describe('createProject', () => { let projectDir: string beforeAll(() => { - console.log = jest.fn() + jest.spyOn(console, 'log').mockImplementation() }) beforeEach(() => { @@ -27,7 +29,6 @@ describe('createProject', () => { }) describe('#createProject', () => { - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const args = { _: ['project-name'], '--db': 'mongodb', @@ -41,15 +42,15 @@ describe('createProject', () => { const template: ProjectTemplate = { name: 'plugin', type: 'plugin', - url: 'https://github.com/payloadcms/payload-plugin-template', description: 'Template for creating a Payload plugin', + url: 'https://github.com/payloadcms/payload-plugin-template', } await createProject({ cliArgs: args, - projectName, - projectDir, - template, packageManager, + projectDir, + projectName, + template, }) const packageJsonPath = path.resolve(projectDir, 'package.json') @@ -84,14 +85,14 @@ describe('createProject', () => { await createProject({ cliArgs, - projectName, - projectDir, - template: template as ProjectTemplate, - packageManager, dbDetails: { - dbUri: `${db}://localhost:27017/create-project-test`, type: db as DbType, + dbUri: `${db}://localhost:27017/create-project-test`, }, + packageManager, + projectDir, + projectName, + template: template as ProjectTemplate, }) const dbReplacement = dbReplacements[db as DbType] diff --git a/packages/create-payload-app/src/lib/init-next.ts b/packages/create-payload-app/src/lib/init-next.ts index 2bb162144f..eeb82615a9 100644 --- a/packages/create-payload-app/src/lib/init-next.ts +++ b/packages/create-payload-app/src/lib/init-next.ts @@ -24,13 +24,13 @@ const writeFile = promisify(fs.writeFile) const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) -type InitNextArgs = Pick & { +type InitNextArgs = { dbType: DbType nextAppDetails?: NextAppDetails packageManager: PackageManager projectDir: string useDistFiles?: boolean -} +} & Pick type InitNextResult = | { @@ -144,11 +144,11 @@ async function addPayloadConfigToTsConfig(projectDir: string, isSrcDir: boolean) } function installAndConfigurePayload( - args: InitNextArgs & { + args: { nextAppDetails: NextAppDetails nextConfigType: NextConfigType useDistFiles?: boolean - }, + } & InitNextArgs, ): | { payloadConfigPath: string; success: true } | { payloadConfigPath?: string; reason: string; success: false } { diff --git a/packages/create-payload-app/src/lib/wrap-next-config.spec.ts b/packages/create-payload-app/src/lib/wrap-next-config.spec.ts index 14871cccf0..4f67b5e3d9 100644 --- a/packages/create-payload-app/src/lib/wrap-next-config.spec.ts +++ b/packages/create-payload-app/src/lib/wrap-next-config.spec.ts @@ -1,11 +1,16 @@ -import { parseAndModifyConfigContent, withPayloadStatement } from './wrap-next-config.js' import * as p from '@clack/prompts' import { jest } from '@jest/globals' +import { parseAndModifyConfigContent, withPayloadStatement } from './wrap-next-config.js' + const esmConfigs = { defaultNextConfig: `/** @type {import('next').NextConfig} */ const nextConfig = {}; export default nextConfig; +`, + nextConfigExportNamedDefault: `const nextConfig = {}; +const wrapped = someFunc(asdf); +export { wrapped as default }; `, nextConfigWithFunc: `const nextConfig = {}; export default someFunc(nextConfig); @@ -14,10 +19,6 @@ export default someFunc(nextConfig); export default someFunc( nextConfig ); -`, - nextConfigExportNamedDefault: `const nextConfig = {}; -const wrapped = someFunc(asdf); -export { wrapped as default }; `, nextConfigWithSpread: `const nextConfig = { ...someConfig, @@ -27,12 +28,16 @@ export default nextConfig; } const cjsConfigs = { + anonConfig: `module.exports = {};`, defaultNextConfig: ` /** @type {import('next').NextConfig} */ const nextConfig = {}; module.exports = nextConfig; `, - anonConfig: `module.exports = {};`, + nextConfigExportNamedDefault: `const nextConfig = {}; +const wrapped = someFunc(asdf); +module.exports = wrapped; +`, nextConfigWithFunc: `const nextConfig = {}; module.exports = someFunc(nextConfig); `, @@ -40,10 +45,6 @@ module.exports = someFunc(nextConfig); module.exports = someFunc( nextConfig ); -`, - nextConfigExportNamedDefault: `const nextConfig = {}; -const wrapped = someFunc(asdf); -module.exports = wrapped; `, nextConfigWithSpread: `const nextConfig = { ...someConfig }; module.exports = nextConfig; @@ -76,7 +77,7 @@ describe('parseAndInsertWithPayload', () => { configType, ) expect(modifiedConfigContent).toContain(importStatement) - expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/) + expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n {2}nextConfig\n\)\)/) }) it('should parse the config with a spread', () => { @@ -137,7 +138,7 @@ describe('parseAndInsertWithPayload', () => { configType, ) expect(modifiedConfigContent).toContain(requireStatement) - expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/) + expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n {2}nextConfig\n\)\)/) }) it('should parse the config with a named export as default', () => { const { modifiedConfigContent } = parseAndModifyConfigContent( diff --git a/packages/create-payload-app/src/utils/log.ts b/packages/create-payload-app/src/utils/log.ts index ac90478c6a..18c8a9fa5e 100644 --- a/packages/create-payload-app/src/utils/log.ts +++ b/packages/create-payload-app/src/utils/log.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import * as p from '@clack/prompts' import chalk from 'chalk' diff --git a/packages/db-mongodb/src/connect.ts b/packages/db-mongodb/src/connect.ts index aab57c894f..4d17766c7f 100644 --- a/packages/db-mongodb/src/connect.ts +++ b/packages/db-mongodb/src/connect.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ import type { ConnectOptions } from 'mongoose' import type { Connect } from 'payload' @@ -24,7 +23,7 @@ export const connect: Connect = async function connect( const urlToConnect = this.url - const connectionOptions: ConnectOptions & { useFacet: undefined } = { + const connectionOptions: { useFacet: undefined } & ConnectOptions = { autoIndex: true, ...this.connectOptions, useFacet: undefined, diff --git a/packages/db-mongodb/src/createMigration.ts b/packages/db-mongodb/src/createMigration.ts index a1d3efe7e3..73093a8939 100644 --- a/packages/db-mongodb/src/createMigration.ts +++ b/packages/db-mongodb/src/createMigration.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-restricted-syntax, no-await-in-loop */ import type { CreateMigration, MigrationTemplateArgs } from 'payload' import fs from 'fs' diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index 7ae16d907e..5c931327ff 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -86,7 +86,6 @@ export const find: Find = async function find( return { ...result, docs: docs.map((doc) => { - // eslint-disable-next-line no-param-reassign doc.id = doc._id return sanitizeInternalFields(doc) }), diff --git a/packages/db-mongodb/src/findGlobalVersions.ts b/packages/db-mongodb/src/findGlobalVersions.ts index e8475eef6d..bc15156339 100644 --- a/packages/db-mongodb/src/findGlobalVersions.ts +++ b/packages/db-mongodb/src/findGlobalVersions.ts @@ -104,7 +104,6 @@ export const findGlobalVersions: FindGlobalVersions = async function findGlobalV return { ...result, docs: docs.map((doc) => { - // eslint-disable-next-line no-param-reassign doc.id = doc._id return sanitizeInternalFields(doc) }), diff --git a/packages/db-mongodb/src/findVersions.ts b/packages/db-mongodb/src/findVersions.ts index ebbf3049db..48569a7d81 100644 --- a/packages/db-mongodb/src/findVersions.ts +++ b/packages/db-mongodb/src/findVersions.ts @@ -101,7 +101,6 @@ export const findVersions: FindVersions = async function findVersions( return { ...result, docs: docs.map((doc) => { - // eslint-disable-next-line no-param-reassign doc.id = doc._id return sanitizeInternalFields(doc) }), diff --git a/packages/db-mongodb/src/index.ts b/packages/db-mongodb/src/index.ts index 0a6fa72a5f..4eda9e3c5b 100644 --- a/packages/db-mongodb/src/index.ts +++ b/packages/db-mongodb/src/index.ts @@ -43,10 +43,10 @@ export interface Args { /** Set to false to disable auto-pluralization of collection names, Defaults to true */ autoPluralization?: boolean /** Extra configuration options */ - connectOptions?: ConnectOptions & { + connectOptions?: { /** Set false to disable $facet aggregation in non-supporting databases, Defaults to true */ useFacet?: boolean - } + } & ConnectOptions /** Set to true to disable hinting to MongoDB to use 'id' as index. This is currently done when counting documents for pagination. Disabling this optimization might fix some problems with AWS DocumentDB. Defaults to false */ disableIndexHints?: boolean migrationDir?: string @@ -59,19 +59,19 @@ export interface Args { url: false | string } -export type MongooseAdapter = BaseDatabaseAdapter & - Args & { - collections: { - [slug: string]: CollectionModel - } - connection: Connection - globals: GlobalModel - mongoMemoryServer: MongoMemoryReplSet - sessions: Record - versions: { - [slug: string]: CollectionModel - } +export type MongooseAdapter = { + collections: { + [slug: string]: CollectionModel } + connection: Connection + globals: GlobalModel + mongoMemoryServer: MongoMemoryReplSet + sessions: Record + versions: { + [slug: string]: CollectionModel + } +} & Args & + BaseDatabaseAdapter declare module 'payload' { export interface DatabaseAdapter diff --git a/packages/db-mongodb/src/init.ts b/packages/db-mongodb/src/init.ts index 740e62a324..ee1f9fe386 100644 --- a/packages/db-mongodb/src/init.ts +++ b/packages/db-mongodb/src/init.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import type { PaginateOptions } from 'mongoose' import type { Init, SanitizedCollectionConfig } from 'payload' diff --git a/packages/db-mongodb/src/models/buildSchema.ts b/packages/db-mongodb/src/models/buildSchema.ts index a7ea67cb45..54388ecb90 100644 --- a/packages/db-mongodb/src/models/buildSchema.ts +++ b/packages/db-mongodb/src/models/buildSchema.ts @@ -1,6 +1,3 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -/* eslint-disable class-methods-use-this */ -/* eslint-disable @typescript-eslint/no-use-before-define */ import type { IndexOptions, Schema, SchemaOptions, SchemaTypeOptions } from 'mongoose' import type { ArrayField, @@ -196,12 +193,10 @@ const fieldToSchemaMap: Record = { if (field.localized && config.localization) { config.localization.localeCodes.forEach((localeCode) => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error Possible incorrect typing in mongoose types, this works schema.path(`${field.name}.${localeCode}`).discriminator(blockItem.slug, blockSchema) }) } else { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error Possible incorrect typing in mongoose types, this works schema.path(field.name).discriminator(blockItem.slug, blockSchema) } diff --git a/packages/db-mongodb/src/queries/buildAndOrConditions.ts b/packages/db-mongodb/src/queries/buildAndOrConditions.ts index 1ff5746fcb..05e6039b3e 100644 --- a/packages/db-mongodb/src/queries/buildAndOrConditions.ts +++ b/packages/db-mongodb/src/queries/buildAndOrConditions.ts @@ -20,11 +20,10 @@ export async function buildAndOrConditions({ const completedConditions = [] // Loop over all AND / OR operations and add them to the AND / OR query param // Operations should come through as an array - // eslint-disable-next-line no-restricted-syntax + for (const condition of where) { // If the operation is properly formatted as an object if (typeof condition === 'object') { - // eslint-disable-next-line no-await-in-loop const result = await parseParams({ collectionSlug, fields, diff --git a/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts b/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts index cfc6302be6..f4e2e653fd 100644 --- a/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts +++ b/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts @@ -1,22 +1,23 @@ -import { SanitizedConfig, sanitizeConfig } from 'payload' -import { Config } from 'payload' +import type { Config, SanitizedConfig } from 'payload' + +import { sanitizeConfig } from 'payload' + import { getLocalizedSortProperty } from './getLocalizedSortProperty.js' let config: SanitizedConfig describe('get localized sort property', () => { beforeAll(async () => { - config = (await sanitizeConfig({ + config = await sanitizeConfig({ localization: { - locales: ['en', 'es'], defaultLocale: 'en', fallback: true, + locales: ['en', 'es'], }, - } as Config)) as SanitizedConfig + } as Config) }) it('passes through a non-localized sort property', async () => { const result = getLocalizedSortProperty({ - segments: ['title'], config, fields: [ { @@ -25,6 +26,7 @@ describe('get localized sort property', () => { }, ], locale: 'en', + segments: ['title'], }) expect(result).toStrictEqual('title') @@ -32,7 +34,6 @@ describe('get localized sort property', () => { it('properly localizes an un-localized sort property', () => { const result = getLocalizedSortProperty({ - segments: ['title'], config, fields: [ { @@ -42,6 +43,7 @@ describe('get localized sort property', () => { }, ], locale: 'en', + segments: ['title'], }) expect(result).toStrictEqual('title.en') @@ -49,7 +51,6 @@ describe('get localized sort property', () => { it('keeps specifically asked-for localized sort properties', () => { const result = getLocalizedSortProperty({ - segments: ['title', 'es'], config, fields: [ { @@ -59,6 +60,7 @@ describe('get localized sort property', () => { }, ], locale: 'en', + segments: ['title', 'es'], }) expect(result).toStrictEqual('title.es') @@ -66,7 +68,6 @@ describe('get localized sort property', () => { it('properly localizes nested sort properties', () => { const result = getLocalizedSortProperty({ - segments: ['group', 'title'], config, fields: [ { @@ -82,6 +83,7 @@ describe('get localized sort property', () => { }, ], locale: 'en', + segments: ['group', 'title'], }) expect(result).toStrictEqual('group.title.en') @@ -89,7 +91,6 @@ describe('get localized sort property', () => { it('keeps requested locale with nested sort properties', () => { const result = getLocalizedSortProperty({ - segments: ['group', 'title', 'es'], config, fields: [ { @@ -105,6 +106,7 @@ describe('get localized sort property', () => { }, ], locale: 'en', + segments: ['group', 'title', 'es'], }) expect(result).toStrictEqual('group.title.es') @@ -112,7 +114,6 @@ describe('get localized sort property', () => { it('properly localizes field within row', () => { const result = getLocalizedSortProperty({ - segments: ['title'], config, fields: [ { @@ -127,6 +128,7 @@ describe('get localized sort property', () => { }, ], locale: 'en', + segments: ['title'], }) expect(result).toStrictEqual('title.en') @@ -134,7 +136,6 @@ describe('get localized sort property', () => { it('properly localizes field within named tab', () => { const result = getLocalizedSortProperty({ - segments: ['tab', 'title'], config, fields: [ { @@ -154,6 +155,7 @@ describe('get localized sort property', () => { }, ], locale: 'en', + segments: ['tab', 'title'], }) expect(result).toStrictEqual('tab.title.en') @@ -161,14 +163,12 @@ describe('get localized sort property', () => { it('properly localizes field within unnamed tab', () => { const result = getLocalizedSortProperty({ - segments: ['title'], config, fields: [ { type: 'tabs', tabs: [ { - label: 'Tab', fields: [ { name: 'title', @@ -176,11 +176,13 @@ describe('get localized sort property', () => { localized: true, }, ], + label: 'Tab', }, ], }, ], locale: 'en', + segments: ['title'], }) expect(result).toStrictEqual('title.en') diff --git a/packages/db-mongodb/src/queries/parseParams.ts b/packages/db-mongodb/src/queries/parseParams.ts index 1b6dd82dec..272be27b8d 100644 --- a/packages/db-mongodb/src/queries/parseParams.ts +++ b/packages/db-mongodb/src/queries/parseParams.ts @@ -1,5 +1,3 @@ -/* eslint-disable no-restricted-syntax */ -/* eslint-disable no-await-in-loop */ import type { FilterQuery } from 'mongoose' import type { Field, Operator, Payload, Where } from 'payload' diff --git a/packages/db-mongodb/src/queryDrafts.ts b/packages/db-mongodb/src/queryDrafts.ts index 3bd515250a..ce884b5aa8 100644 --- a/packages/db-mongodb/src/queryDrafts.ts +++ b/packages/db-mongodb/src/queryDrafts.ts @@ -87,7 +87,6 @@ export const queryDrafts: QueryDrafts = async function queryDrafts( return { ...result, docs: docs.map((doc) => { - // eslint-disable-next-line no-param-reassign doc = { _id: doc.parent, id: doc.parent, diff --git a/packages/email-resend/src/email-resend.spec.ts b/packages/email-resend/src/email-resend.spec.ts index 48c1f4f359..531933e3dd 100644 --- a/packages/email-resend/src/email-resend.spec.ts +++ b/packages/email-resend/src/email-resend.spec.ts @@ -1,7 +1,9 @@ -import { resendAdapter } from './index.js' -import { Payload } from 'payload' +import type { Payload } from 'payload' + import { jest } from '@jest/globals' +import { resendAdapter } from './index.js' + describe('email-resend', () => { const defaultFromAddress = 'dev@payloadcms.com' const defaultFromName = 'Payload CMS' @@ -29,16 +31,16 @@ describe('email-resend', () => { ) as jest.Mock const adapter = resendAdapter({ + apiKey, defaultFromAddress, defaultFromName, - apiKey, }) await adapter({ payload: mockPayload }).sendEmail({ from, - to, subject, text, + to, }) // @ts-expect-error @@ -48,16 +50,16 @@ describe('email-resend', () => { expect(request.headers.Authorization).toStrictEqual(`Bearer ${apiKey}`) expect(JSON.parse(request.body)).toMatchObject({ from, - to, subject, text, + to, }) }) it('should throw an error if the email fails to send', async () => { const errorResponse = { - message: 'error information', name: 'validation_error', + message: 'error information', statusCode: 403, } global.fetch = jest.spyOn(global, 'fetch').mockImplementation( @@ -69,17 +71,17 @@ describe('email-resend', () => { ) as jest.Mock const adapter = resendAdapter({ + apiKey, defaultFromAddress, defaultFromName, - apiKey, }) await expect(() => adapter({ payload: mockPayload }).sendEmail({ from, - to, subject, text, + to, }), ).rejects.toThrow( `Error sending email: ${errorResponse.statusCode} ${errorResponse.name} - ${errorResponse.message}`, diff --git a/packages/eslint-config/configs/jest/index.mjs b/packages/eslint-config/configs/jest/index.mjs index 0ebdb96e8c..da12e5bd58 100644 --- a/packages/eslint-config/configs/jest/index.mjs +++ b/packages/eslint-config/configs/jest/index.mjs @@ -4,21 +4,20 @@ import jestDom from 'eslint-plugin-jest-dom' import jest from 'eslint-plugin-jest' import { deepMerge } from '../../deepMerge.js' - /** @type {import('eslint').Linter.FlatConfig} */ export const index = deepMerge( { - rules: jestRules + rules: jestRules, }, { - rules: jestDomRules + rules: jestDomRules, }, { plugins: { jest, 'jest-dom': jestDom, }, - } + }, ) export default index diff --git a/packages/eslint-config/configs/react/index.mjs b/packages/eslint-config/configs/react/index.mjs index 0edb174eb0..d86db87175 100644 --- a/packages/eslint-config/configs/react/index.mjs +++ b/packages/eslint-config/configs/react/index.mjs @@ -1,19 +1,19 @@ import reactRules from './rules/react.mjs' import reactA11yRules from './rules/react-a11y.mjs' import jsxA11y from 'eslint-plugin-jsx-a11y' -import react from "@eslint-react/eslint-plugin"; +import react from '@eslint-react/eslint-plugin' import reactHooks from 'eslint-plugin-react-hooks' -import globals from 'globals'; +import globals from 'globals' import { deepMerge } from '../../deepMerge.js' /** @type {import('eslint').Linter.FlatConfig} */ export const index = deepMerge( - react.configs["recommended-type-checked"], + react.configs['recommended-type-checked'], { - rules: reactRules + rules: reactRules, }, { - rules: reactA11yRules + rules: reactA11yRules, }, { languageOptions: { @@ -23,8 +23,8 @@ export const index = deepMerge( parserOptions: { ecmaFeatures: { jsx: true, - } - } + }, + }, }, plugins: { 'jsx-a11y': jsxA11y, @@ -35,6 +35,6 @@ export const index = deepMerge( version: 'detect', }, }, - } + }, ) export default index diff --git a/packages/eslint-config/configs/react/rules/react-a11y.mjs b/packages/eslint-config/configs/react/rules/react-a11y.mjs index 9c0ef38331..53232733bd 100644 --- a/packages/eslint-config/configs/react/rules/react-a11y.mjs +++ b/packages/eslint-config/configs/react/rules/react-a11y.mjs @@ -1,4 +1,3 @@ - // Sourced from https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb/rules/react-a11y.js /** @type {import('eslint').Linter.FlatConfig} */ diff --git a/packages/eslint-config/index.mjs b/packages/eslint-config/index.mjs index 5c9da8cf28..a14a319839 100644 --- a/packages/eslint-config/index.mjs +++ b/packages/eslint-config/index.mjs @@ -2,11 +2,11 @@ import js from '@eslint/js' import tseslint from 'typescript-eslint' import perfectionistNatural from 'eslint-plugin-perfectionist/configs/recommended-natural' import { configs as regexpPluginConfigs } from 'eslint-plugin-regexp' -import eslintConfigPrettier from 'eslint-config-prettier'; +import eslintConfigPrettier from 'eslint-config-prettier' import payloadPlugin from '@payloadcms/eslint-plugin' import reactExtends from './configs/react/index.mjs' import jestExtends from './configs/jest/index.mjs' -import globals from 'globals'; +import globals from 'globals' import importX from 'eslint-plugin-import-x' import typescriptParser from '@typescript-eslint/parser' import { deepMerge } from './deepMerge.js' @@ -102,9 +102,11 @@ const typescriptRules = { let FlatConfig /** @type {FlatConfig} */ -const baseExtends = deepMerge(js.configs.recommended, perfectionistNatural , regexpPluginConfigs['flat/recommended']) - - +const baseExtends = deepMerge( + js.configs.recommended, + perfectionistNatural, + regexpPluginConfigs['flat/recommended'], +) /** @type {FlatConfig[]} */ export const rootEslintConfig = [ @@ -144,7 +146,7 @@ export const rootEslintConfig = [ ...baseRules, ...typescriptRules, }, - } + }, ), files: ['**/*.ts'], }, @@ -166,31 +168,28 @@ export const rootEslintConfig = [ ...typescriptRules, ...reactA11yRules, }, - } + }, ), files: ['**/*.tsx'], }, { name: 'Unit Tests', - ...deepMerge( - jestExtends, - { - plugins: { - payload: payloadPlugin - }, - rules: { - ...baseRules, - ...typescriptRules, - '@typescript-eslint/unbound-method': 'off', - }, - } - ), + ...deepMerge(jestExtends, { + plugins: { + payload: payloadPlugin, + }, + rules: { + ...baseRules, + ...typescriptRules, + '@typescript-eslint/unbound-method': 'off', + }, + }), files: ['**/*.spec.ts'], }, { name: 'Payload Config', plugins: { - payload: payloadPlugin + payload: payloadPlugin, }, rules: { ...baseRules, diff --git a/packages/eslint-plugin/index.mjs b/packages/eslint-plugin/index.mjs index 0e48a95dbe..1f54e274c1 100644 --- a/packages/eslint-plugin/index.mjs +++ b/packages/eslint-plugin/index.mjs @@ -4,7 +4,6 @@ import noRelativeMonorepoImports from './customRules/no-relative-monorepo-import import noImportsFromExportsDir from './customRules/no-imports-from-exports-dir.js' import noFlakyAssertions from './customRules/no-flaky-assertions.js' - /** * @type {import('eslint').ESLint.Plugin} */ diff --git a/packages/graphql/src/bin/generateSchema.ts b/packages/graphql/src/bin/generateSchema.ts index 0bbb870d58..6df445f987 100644 --- a/packages/graphql/src/bin/generateSchema.ts +++ b/packages/graphql/src/bin/generateSchema.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ import type { SanitizedConfig } from 'payload' import fs from 'fs' diff --git a/packages/graphql/src/index.ts b/packages/graphql/src/index.ts index 7081012e22..7cf4c64c12 100644 --- a/packages/graphql/src/index.ts +++ b/packages/graphql/src/index.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import type { OperationArgs } from 'graphql-http' import type { GraphQLInfo, SanitizedConfig } from 'payload' diff --git a/packages/graphql/src/packages/graphql-query-complexity/QueryComplexity.ts b/packages/graphql/src/packages/graphql-query-complexity/QueryComplexity.ts index 4c28a862f0..4d96a0ebdd 100644 --- a/packages/graphql/src/packages/graphql-query-complexity/QueryComplexity.ts +++ b/packages/graphql/src/packages/graphql-query-complexity/QueryComplexity.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-use-before-define */ + /* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */ /** * Created by Ivo Meißner on 28.07.17. diff --git a/packages/graphql/src/packages/graphql-type-json/index.ts b/packages/graphql/src/packages/graphql-type-json/index.ts index 88d7d45260..c6fe7ad9df 100644 --- a/packages/graphql/src/packages/graphql-type-json/index.ts +++ b/packages/graphql/src/packages/graphql-type-json/index.ts @@ -16,7 +16,6 @@ function ensureObject(value) { function parseObject(typeName, ast, variables) { const value = Object.create(null) ast.fields.forEach((field) => { - // eslint-disable-next-line no-use-before-define value[field.name.value] = parseLiteral(typeName, field.value, variables) }) diff --git a/packages/graphql/src/resolvers/collections/count.ts b/packages/graphql/src/resolvers/collections/count.ts index faf781688e..0a928b464b 100644 --- a/packages/graphql/src/resolvers/collections/count.ts +++ b/packages/graphql/src/resolvers/collections/count.ts @@ -14,7 +14,6 @@ export type Resolver = ( context: { req: PayloadRequest }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any ) => Promise<{ totalDocs: number }> export function countResolver(collection: Collection): Resolver { diff --git a/packages/graphql/src/schema/buildObjectType.ts b/packages/graphql/src/schema/buildObjectType.ts index a718e8c741..e17d87aab2 100644 --- a/packages/graphql/src/schema/buildObjectType.ts +++ b/packages/graphql/src/schema/buildObjectType.ts @@ -1,6 +1,3 @@ -/* eslint-disable @typescript-eslint/no-use-before-define */ -/* eslint-disable no-await-in-loop */ -/* eslint-disable no-restricted-syntax */ import type { GraphQLFieldConfig, GraphQLType } from 'graphql' import type { ArrayField, diff --git a/packages/graphql/src/schema/buildWhereInputType.ts b/packages/graphql/src/schema/buildWhereInputType.ts index 9a14337fd0..36627f7f95 100644 --- a/packages/graphql/src/schema/buildWhereInputType.ts +++ b/packages/graphql/src/schema/buildWhereInputType.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-use-before-define */ import type { Field, FieldAffectingData } from 'payload' import { GraphQLInputObjectType, GraphQLList } from 'graphql' diff --git a/packages/graphql/src/schema/initCollections.ts b/packages/graphql/src/schema/initCollections.ts index 913480e05e..c682de2fe9 100644 --- a/packages/graphql/src/schema/initCollections.ts +++ b/packages/graphql/src/schema/initCollections.ts @@ -1,6 +1,10 @@ -/* eslint-disable no-param-reassign */ -import type { GraphQLInfo } from 'payload' -import type { Collection, Field, SanitizedCollectionConfig, SanitizedConfig } from 'payload' +import type { + Collection, + Field, + GraphQLInfo, + SanitizedCollectionConfig, + SanitizedConfig, +} from 'payload' import { GraphQLBoolean, diff --git a/packages/graphql/src/schema/initGlobals.ts b/packages/graphql/src/schema/initGlobals.ts index 808e7515a0..1c8604d8ab 100644 --- a/packages/graphql/src/schema/initGlobals.ts +++ b/packages/graphql/src/schema/initGlobals.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import { GraphQLBoolean, GraphQLInt, GraphQLNonNull, GraphQLString } from 'graphql' import pluralize from 'pluralize' const { singular } = pluralize diff --git a/packages/graphql/src/schema/withOperators.ts b/packages/graphql/src/schema/withOperators.ts index 8e0d153d54..f1e7b9dcdb 100644 --- a/packages/graphql/src/schema/withOperators.ts +++ b/packages/graphql/src/schema/withOperators.ts @@ -45,19 +45,19 @@ const GeoJSONObject = new GraphQLInputObjectType({ }) type DefaultsType = { - [key in staticTypes]: { - operators: { - name: string - type: ((field: FieldAffectingData, parentName: string) => GraphQLType) | GraphQLType - }[] - } -} & { [key in dynamicTypes]: { operators: { name: string type: (field: FieldAffectingData, parentName: string) => GraphQLType }[] } +} & { + [key in staticTypes]: { + operators: { + name: string + type: ((field: FieldAffectingData, parentName: string) => GraphQLType) | GraphQLType + }[] + } } const defaults: DefaultsType = { diff --git a/packages/graphql/src/utilities/formatName.spec.ts b/packages/graphql/src/utilities/formatName.spec.ts index dc8e050848..8ebb4a332e 100644 --- a/packages/graphql/src/utilities/formatName.spec.ts +++ b/packages/graphql/src/utilities/formatName.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable indent */ /* eslint-disable jest/prefer-strict-equal */ import formatName from './formatName' diff --git a/packages/live-preview/src/mergeData.ts b/packages/live-preview/src/mergeData.ts index a40a2e2d11..fe099355ad 100644 --- a/packages/live-preview/src/mergeData.ts +++ b/packages/live-preview/src/mergeData.ts @@ -34,9 +34,9 @@ export const mergeData = async (args: { returnNumberOfRequests?: boolean serverURL: string }): Promise< - T & { + { _numberOfRequests?: number - } + } & T > => { const { apiRoute, diff --git a/packages/next/src/elements/DocumentHeader/Tabs/Tab/index.tsx b/packages/next/src/elements/DocumentHeader/Tabs/Tab/index.tsx index 46b48e442a..121aabc66d 100644 --- a/packages/next/src/elements/DocumentHeader/Tabs/Tab/index.tsx +++ b/packages/next/src/elements/DocumentHeader/Tabs/Tab/index.tsx @@ -7,7 +7,7 @@ import './index.scss' export const baseClass = 'doc-tab' -export const DocumentTab: React.FC = (props) => { +export const DocumentTab: React.FC = (props) => { const { Pill, apiURL, diff --git a/packages/next/src/elements/DocumentHeader/Tabs/tabs/index.tsx b/packages/next/src/elements/DocumentHeader/Tabs/tabs/index.tsx index 913945ad59..e2c414f71b 100644 --- a/packages/next/src/elements/DocumentHeader/Tabs/tabs/index.tsx +++ b/packages/next/src/elements/DocumentHeader/Tabs/tabs/index.tsx @@ -16,9 +16,9 @@ export type DocumentViewKey = (typeof documentViewKeys)[number] export const tabs: Record< DocumentViewKey, - DocumentTabConfig & { + { order?: number // TODO: expose this to the globalConfig config - } + } & DocumentTabConfig > = { API: { condition: ({ collectionConfig, globalConfig }) => diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index 8d440c75e7..56f11ad588 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -109,7 +109,6 @@ export const RootLayout = async ({ fallbackLang={clientConfig.i18n.fallbackLanguage} languageCode={languageCode} languageOptions={languageOptions} - // eslint-disable-next-line react/jsx-no-bind switchLanguageServerAction={switchLanguageServerAction} theme={theme} translations={i18n.translations} diff --git a/packages/next/src/routes/graphql/handler.ts b/packages/next/src/routes/graphql/handler.ts index be83957522..7609d0654f 100644 --- a/packages/next/src/routes/graphql/handler.ts +++ b/packages/next/src/routes/graphql/handler.ts @@ -50,7 +50,6 @@ const handleError = async ( let cached = global._payload_graphql if (!cached) { - // eslint-disable-next-line no-multi-assign cached = global._payload_graphql = { graphql: null, promise: null } } diff --git a/packages/next/src/templates/Default/index.tsx b/packages/next/src/templates/Default/index.tsx index 7c7b21aa1a..5d3dff9094 100644 --- a/packages/next/src/templates/Default/index.tsx +++ b/packages/next/src/templates/Default/index.tsx @@ -11,11 +11,11 @@ import './index.scss' const baseClass = 'template-default' -export type DefaultTemplateProps = ServerProps & { +export type DefaultTemplateProps = { children?: React.ReactNode className?: string visibleEntities: VisibleEntities -} +} & ServerProps export const DefaultTemplate: React.FC = ({ children, diff --git a/packages/next/src/utilities/getPayloadHMR.ts b/packages/next/src/utilities/getPayloadHMR.ts index 9ffb722ff6..30a27664c4 100644 --- a/packages/next/src/utilities/getPayloadHMR.ts +++ b/packages/next/src/utilities/getPayloadHMR.ts @@ -10,7 +10,6 @@ let cached: { } = global._payload if (!cached) { - // eslint-disable-next-line no-multi-assign cached = global._payload = { payload: null, promise: null, reload: false } } diff --git a/packages/next/src/utilities/meta.ts b/packages/next/src/utilities/meta.ts index a2852bbcfd..df27015cbc 100644 --- a/packages/next/src/utilities/meta.ts +++ b/packages/next/src/utilities/meta.ts @@ -12,7 +12,7 @@ const defaultOpenGraph = { title: 'Payload App', } -export const meta = async (args: MetaConfig & { serverURL: string }): Promise => { +export const meta = async (args: { serverURL: string } & MetaConfig): Promise => { const { defaultOGImageType, description, diff --git a/packages/next/src/views/Dashboard/Default/index.tsx b/packages/next/src/views/Dashboard/Default/index.tsx index 8232ce3bd6..b0e26c5c9c 100644 --- a/packages/next/src/views/Dashboard/Default/index.tsx +++ b/packages/next/src/views/Dashboard/Default/index.tsx @@ -10,12 +10,12 @@ import './index.scss' const baseClass = 'dashboard' -export type DashboardProps = ServerProps & { +export type DashboardProps = { Link: React.ComponentType navGroups?: ReturnType permissions: Permissions visibleEntities: VisibleEntities -} +} & ServerProps export const DefaultDashboard: React.FC = (props) => { const { diff --git a/packages/next/src/views/Document/getMetaBySegment.tsx b/packages/next/src/views/Document/getMetaBySegment.tsx index 119ca1db59..d5afad7e50 100644 --- a/packages/next/src/views/Document/getMetaBySegment.tsx +++ b/packages/next/src/views/Document/getMetaBySegment.tsx @@ -12,10 +12,10 @@ import { generateMetadata as versionMeta } from '../Version/meta.js' import { generateMetadata as versionsMeta } from '../Versions/meta.js' export type GenerateEditViewMetadata = ( - args: Parameters[0] & { + args: { collectionConfig?: SanitizedCollectionConfig | null globalConfig?: SanitizedGlobalConfig | null - }, + } & Parameters[0], ) => Promise export const getMetaBySegment: GenerateEditViewMetadata = async ({ diff --git a/packages/next/src/views/Document/getViewsFromConfig.tsx b/packages/next/src/views/Document/getViewsFromConfig.tsx index a9f4399fe6..3bc468ac12 100644 --- a/packages/next/src/views/Document/getViewsFromConfig.tsx +++ b/packages/next/src/views/Document/getViewsFromConfig.tsx @@ -28,7 +28,7 @@ export const getViewsFromConfig = ({ }: { collectionConfig?: SanitizedCollectionConfig config: SanitizedConfig - // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents + docPermissions: CollectionPermission | GlobalPermission globalConfig?: SanitizedGlobalConfig routeSegments: string[] diff --git a/packages/next/src/views/List/meta.ts b/packages/next/src/views/List/meta.ts index 0b499dc577..0f5c300ed3 100644 --- a/packages/next/src/views/List/meta.ts +++ b/packages/next/src/views/List/meta.ts @@ -8,9 +8,9 @@ import type { GenerateViewMetadata } from '../Root/index.js' import { meta } from '../../utilities/meta.js' export const generateListMetadata = async ( - args: Parameters[0] & { + args: { collectionConfig: SanitizedCollectionConfig - }, + } & Parameters[0], ): Promise => { const { collectionConfig, config, i18n } = args diff --git a/packages/next/src/views/LivePreview/Toolbar/index.tsx b/packages/next/src/views/LivePreview/Toolbar/index.tsx index a3cf974ae5..a4c0cddfb6 100644 --- a/packages/next/src/views/LivePreview/Toolbar/index.tsx +++ b/packages/next/src/views/LivePreview/Toolbar/index.tsx @@ -56,9 +56,9 @@ const StaticToolbar: React.FC = (props) => { } export const LivePreviewToolbar: React.FC< - EditViewProps & { + { draggable?: boolean - } + } & EditViewProps > = (props) => { const { draggable } = props diff --git a/packages/next/src/views/LivePreview/usePopupWindow.ts b/packages/next/src/views/LivePreview/usePopupWindow.ts index 1947190eec..d018a6712c 100644 --- a/packages/next/src/views/LivePreview/usePopupWindow.ts +++ b/packages/next/src/views/LivePreview/usePopupWindow.ts @@ -14,7 +14,7 @@ export interface PopupMessage { export const usePopupWindow = (props: { eventType?: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any + onMessage?: (searchParams: PopupMessage['searchParams']) => Promise url: string }): { diff --git a/packages/next/src/views/Logout/index.tsx b/packages/next/src/views/Logout/index.tsx index cb3c3dbe92..315bb8771e 100644 --- a/packages/next/src/views/Logout/index.tsx +++ b/packages/next/src/views/Logout/index.tsx @@ -10,9 +10,9 @@ const baseClass = 'logout' export { generateLogoutMetadata } from './meta.js' export const LogoutView: React.FC< - AdminViewProps & { + { inactivity?: boolean - } + } & AdminViewProps > = ({ inactivity, initPageResult, searchParams }) => { const { req: { diff --git a/packages/next/src/views/NotFound/index.tsx b/packages/next/src/views/NotFound/index.tsx index 0c5a9959da..5abe6e54fa 100644 --- a/packages/next/src/views/NotFound/index.tsx +++ b/packages/next/src/views/NotFound/index.tsx @@ -15,7 +15,6 @@ export const generatePageMetadata = async ({ }: { config: Promise | SanitizedConfig params?: { [key: string]: string | string[] } - //eslint-disable-next-line @typescript-eslint/require-await }): Promise => { const config = await configPromise diff --git a/packages/next/src/views/Version/RenderFieldsToDiff/fields/Select/index.tsx b/packages/next/src/views/Version/RenderFieldsToDiff/fields/Select/index.tsx index febb9ba466..85b294cdfc 100644 --- a/packages/next/src/views/Version/RenderFieldsToDiff/fields/Select/index.tsx +++ b/packages/next/src/views/Version/RenderFieldsToDiff/fields/Select/index.tsx @@ -47,9 +47,9 @@ const getTranslatedOptions = ( } const Select: React.FC< - Omit & { + { field: MappedField & SelectFieldProps - } + } & Omit > = ({ comparison, diffMethod, field, i18n, locale, version }) => { let placeholder = '' diff --git a/packages/next/src/views/Version/RenderFieldsToDiff/fields/Tabs/index.tsx b/packages/next/src/views/Version/RenderFieldsToDiff/fields/Tabs/index.tsx index 9a87f95d25..adc5a689a5 100644 --- a/packages/next/src/views/Version/RenderFieldsToDiff/fields/Tabs/index.tsx +++ b/packages/next/src/views/Version/RenderFieldsToDiff/fields/Tabs/index.tsx @@ -10,9 +10,9 @@ import Nested from '../Nested/index.js' const baseClass = 'tabs-diff' const Tabs: React.FC< - Omit & { + { field: MappedField & TabsFieldProps - } + } & Omit > = ({ comparison, diffComponents, field, i18n, locale, locales, permissions, version }) => { return (
diff --git a/packages/next/src/views/Version/RenderFieldsToDiff/types.ts b/packages/next/src/views/Version/RenderFieldsToDiff/types.ts index c62610780d..a9205769ef 100644 --- a/packages/next/src/views/Version/RenderFieldsToDiff/types.ts +++ b/packages/next/src/views/Version/RenderFieldsToDiff/types.ts @@ -15,8 +15,8 @@ export type Props = { version: Record } -export type FieldDiffProps = Props & { +export type FieldDiffProps = { diffMethod: DiffMethod field: MappedField isRichText: boolean -} +} & Props diff --git a/packages/payload/src/admin/RichText.ts b/packages/payload/src/admin/RichText.ts index ee62c4776e..8675f437e0 100644 --- a/packages/payload/src/admin/RichText.ts +++ b/packages/payload/src/admin/RichText.ts @@ -9,13 +9,9 @@ import type { SanitizedGlobalConfig } from '../globals/config/types.js' import type { PayloadRequest, RequestContext } from '../types/index.js' import type { WithServerSidePropsComponentProps } from './elements/WithServerSideProps.js' -export type RichTextFieldProps< - Value extends object, - AdapterProps, - ExtraFieldProperties = {}, -> = Omit, 'type'> & { +export type RichTextFieldProps = { path?: string -} +} & Omit, 'type'> export type AfterReadRichTextHookArgs< TData extends TypeWithID = any, @@ -146,8 +142,8 @@ export type AfterReadRichTextHook< TValue = any, TSiblingData = any, > = ( - args: BaseRichTextHookArgs & - AfterReadRichTextHookArgs, + args: AfterReadRichTextHookArgs & + BaseRichTextHookArgs, ) => Promise | TValue export type AfterChangeRichTextHook< @@ -155,8 +151,8 @@ export type AfterChangeRichTextHook< TValue = any, TSiblingData = any, > = ( - args: BaseRichTextHookArgs & - AfterChangeRichTextHookArgs, + args: AfterChangeRichTextHookArgs & + BaseRichTextHookArgs, ) => Promise | TValue export type BeforeChangeRichTextHook< @@ -252,10 +248,10 @@ export type RichTextAdapter< Value extends object = object, AdapterProps = any, ExtraFieldProperties = {}, -> = RichTextAdapterBase & { +> = { CellComponent: React.FC FieldComponent: React.FC> -} +} & RichTextAdapterBase export type RichTextAdapterProvider< Value extends object = object, diff --git a/packages/payload/src/admin/elements/Cell.ts b/packages/payload/src/admin/elements/Cell.ts index c857cbc3f5..97fc349f29 100644 --- a/packages/payload/src/admin/elements/Cell.ts +++ b/packages/payload/src/admin/elements/Cell.ts @@ -35,11 +35,11 @@ export type CellComponentProps = { schemaPath: string } -export type DefaultCellComponentProps = CellComponentProps & { +export type DefaultCellComponentProps = { cellData: T customCellContext?: { collectionSlug?: SanitizedCollectionConfig['slug'] uploadConfig?: SanitizedCollectionConfig['upload'] } rowData: RowData -} +} & CellComponentProps diff --git a/packages/payload/src/admin/elements/DatePicker.ts b/packages/payload/src/admin/elements/DatePicker.ts index 084cbe5a95..2a44319c91 100644 --- a/packages/payload/src/admin/elements/DatePicker.ts +++ b/packages/payload/src/admin/elements/DatePicker.ts @@ -25,23 +25,23 @@ export type MonthPickerProps = { } export type ConditionalDateProps = - | (SharedProps & - DayPickerProps & - TimePickerProps & { - pickerAppearance?: 'dayAndTime' - }) - | (SharedProps & - DayPickerProps & { - pickerAppearance: 'dayOnly' - }) - | (SharedProps & - MonthPickerProps & { - pickerAppearance: 'monthOnly' - }) - | (SharedProps & - TimePickerProps & { - pickerAppearance: 'timeOnly' - }) - | (SharedProps & { + | ({ + pickerAppearance: 'dayOnly' + } & DayPickerProps & + SharedProps) + | ({ + pickerAppearance: 'monthOnly' + } & MonthPickerProps & + SharedProps) + | ({ + pickerAppearance: 'timeOnly' + } & SharedProps & + TimePickerProps) + | ({ + pickerAppearance?: 'dayAndTime' + } & DayPickerProps & + SharedProps & + TimePickerProps) + | ({ pickerAppearance?: 'default' - }) + } & SharedProps) diff --git a/packages/payload/src/auth/getFieldsToSign.ts b/packages/payload/src/auth/getFieldsToSign.ts index a9fa9646f0..f1b3cc3e22 100644 --- a/packages/payload/src/auth/getFieldsToSign.ts +++ b/packages/payload/src/auth/getFieldsToSign.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import type { CollectionConfig } from '../collections/config/types.js' import type { Field, TabAsField } from '../fields/config/types.js' import type { PayloadRequest } from '../types/index.js' diff --git a/packages/payload/src/auth/index.ts b/packages/payload/src/auth/index.ts index 6b6bbec0db..9fb0a6f3f6 100644 --- a/packages/payload/src/auth/index.ts +++ b/packages/payload/src/auth/index.ts @@ -1,4 +1,4 @@ -export * from './types.js' +export * from './cookies.js' export { extractJWT } from './extractJWT.js' -export * from './cookies.js' +export * from './types.js' diff --git a/packages/payload/src/auth/operations/local/login.ts b/packages/payload/src/auth/operations/local/login.ts index ad839710ed..5192dfaadc 100644 --- a/packages/payload/src/auth/operations/local/login.ts +++ b/packages/payload/src/auth/operations/local/login.ts @@ -27,7 +27,7 @@ export type Options = { async function localLogin( payload: Payload, options: Options, -): Promise }> { +): Promise<{ user: DataFromCollectionSlug } & Result> { const { collection: collectionSlug, data, diff --git a/packages/payload/src/auth/operations/login.ts b/packages/payload/src/auth/operations/login.ts index 550405d605..00d814604e 100644 --- a/packages/payload/src/auth/operations/login.ts +++ b/packages/payload/src/auth/operations/login.ts @@ -39,7 +39,7 @@ export type Arguments = { export const loginOperation = async ( incomingArgs: Arguments, -): Promise }> => { +): Promise<{ user: DataFromCollectionSlug } & Result> => { let args = incomingArgs try { @@ -253,7 +253,7 @@ export const loginOperation = async ( })) || user }, Promise.resolve()) - let result: Result & { user: DataFromCollectionSlug } = { + let result: { user: DataFromCollectionSlug } & Result = { exp: (jwt.decode(token) as jwt.JwtPayload).exp, token, user, diff --git a/packages/payload/src/auth/operations/registerFirstUser.ts b/packages/payload/src/auth/operations/registerFirstUser.ts index bc8a7f8c8a..90b3514816 100644 --- a/packages/payload/src/auth/operations/registerFirstUser.ts +++ b/packages/payload/src/auth/operations/registerFirstUser.ts @@ -14,8 +14,8 @@ import { killTransaction } from '../../utilities/killTransaction.js' export type Arguments = { collection: Collection - data: RequiredDataFromCollectionSlug & - AuthOperationsFromCollectionSlug['registerFirstUser'] + data: AuthOperationsFromCollectionSlug['registerFirstUser'] & + RequiredDataFromCollectionSlug req: PayloadRequest } diff --git a/packages/payload/src/auth/strategies/jwt.ts b/packages/payload/src/auth/strategies/jwt.ts index 1b3ec2783b..2d77fba60c 100644 --- a/packages/payload/src/auth/strategies/jwt.ts +++ b/packages/payload/src/auth/strategies/jwt.ts @@ -16,7 +16,7 @@ export const JWTAuthentication: AuthStrategyFunction = async ({ }) => { try { const token = extractJWT({ headers, payload }) - const decodedPayload = jwt.verify(token, payload.secret) as jwt.JwtPayload & JWTToken + const decodedPayload = jwt.verify(token, payload.secret) as JWTToken & jwt.JwtPayload const collection = payload.collections[decodedPayload.collection] diff --git a/packages/payload/src/auth/strategies/local/authenticate.ts b/packages/payload/src/auth/strategies/local/authenticate.ts index 03d742023f..16df3213fe 100644 --- a/packages/payload/src/auth/strategies/local/authenticate.ts +++ b/packages/payload/src/auth/strategies/local/authenticate.ts @@ -3,7 +3,7 @@ import scmp from 'scmp' import type { TypeWithID } from '../../../collections/config/types.js' -type Doc = TypeWithID & Record +type Doc = Record & TypeWithID type Args = { doc: Doc diff --git a/packages/payload/src/auth/strategies/local/incrementLoginAttempts.ts b/packages/payload/src/auth/strategies/local/incrementLoginAttempts.ts index 7538b79d45..df0311f77f 100644 --- a/packages/payload/src/auth/strategies/local/incrementLoginAttempts.ts +++ b/packages/payload/src/auth/strategies/local/incrementLoginAttempts.ts @@ -4,7 +4,7 @@ import type { PayloadRequest } from '../../../types/index.js' type Args = { collection: SanitizedCollectionConfig - doc: TypeWithID & Record + doc: Record & TypeWithID payload: Payload req: PayloadRequest } diff --git a/packages/payload/src/auth/strategies/local/resetLoginAttempts.ts b/packages/payload/src/auth/strategies/local/resetLoginAttempts.ts index 142fa31a3f..7393234476 100644 --- a/packages/payload/src/auth/strategies/local/resetLoginAttempts.ts +++ b/packages/payload/src/auth/strategies/local/resetLoginAttempts.ts @@ -4,7 +4,7 @@ import type { PayloadRequest } from '../../../types/index.js' type Args = { collection: SanitizedCollectionConfig - doc: TypeWithID & Record + doc: Record & TypeWithID payload: Payload req: PayloadRequest } diff --git a/packages/payload/src/bin/loader/compile.ts b/packages/payload/src/bin/loader/compile.ts index a2895d7d75..3c4812550b 100644 --- a/packages/payload/src/bin/loader/compile.ts +++ b/packages/payload/src/bin/loader/compile.ts @@ -26,7 +26,7 @@ const injectInlineSourceMap = ({ export async function compile( sourcecode: string, filename: string, - options: ts.CompilerOptions & { fallbackToTs?: (filename: string) => boolean }, + options: { fallbackToTs?: (filename: string) => boolean } & ts.CompilerOptions, ): Promise { if (filename.endsWith('.d.ts')) { return '' diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index 5ca0f26469..3358117dde 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -10,18 +10,15 @@ export type ServerOnlyCollectionAdminProperties = keyof Pick< 'components' | 'hidden' | 'preview' > -export type ClientCollectionConfig = Omit< - SanitizedCollectionConfig, - 'admin' | 'fields' | ServerOnlyCollectionProperties -> & { - admin: Omit< +export type ClientCollectionConfig = { + admin: { + livePreview?: Omit + } & Omit< SanitizedCollectionConfig['admin'], 'fields' | 'livePreview' | ServerOnlyCollectionAdminProperties - > & { - livePreview?: Omit - } + > fields: ClientFieldConfig[] -} +} & Omit import type { TFunction } from '@payloadcms/translations' diff --git a/packages/payload/src/collections/operations/delete.ts b/packages/payload/src/collections/operations/delete.ts index 780fdc2a68..1682a368bb 100644 --- a/packages/payload/src/collections/operations/delete.ts +++ b/packages/payload/src/collections/operations/delete.ts @@ -111,7 +111,6 @@ export const deleteOperation = async ( const errors = [] - /* eslint-disable no-param-reassign */ const promises = docs.map(async (doc) => { let result diff --git a/packages/payload/src/collections/operations/findByID.ts b/packages/payload/src/collections/operations/findByID.ts index 75ed4fefe7..8c3a5bdd18 100644 --- a/packages/payload/src/collections/operations/findByID.ts +++ b/packages/payload/src/collections/operations/findByID.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-underscore-dangle */ import type { FindOneArgs } from '../../database/types.js' import type { CollectionSlug } from '../../index.js' import type { PayloadRequest } from '../../types/index.js' diff --git a/packages/payload/src/collections/operations/findVersionByID.ts b/packages/payload/src/collections/operations/findVersionByID.ts index 46b771ca47..8bb78f75b0 100644 --- a/packages/payload/src/collections/operations/findVersionByID.ts +++ b/packages/payload/src/collections/operations/findVersionByID.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-underscore-dangle */ import httpStatus from 'http-status' import type { PayloadRequest } from '../../types/index.js' diff --git a/packages/payload/src/collections/operations/local/delete.ts b/packages/payload/src/collections/operations/local/delete.ts index 33cc1f26f5..bdde6be8d3 100644 --- a/packages/payload/src/collections/operations/local/delete.ts +++ b/packages/payload/src/collections/operations/local/delete.ts @@ -22,15 +22,15 @@ export type BaseOptions = { user?: Document } -export type ByIDOptions = BaseOptions & { +export type ByIDOptions = { id: number | string where?: never -} +} & BaseOptions -export type ManyOptions = BaseOptions & { +export type ManyOptions = { id?: never where: Where -} +} & BaseOptions export type Options = ByIDOptions | ManyOptions diff --git a/packages/payload/src/collections/operations/local/update.ts b/packages/payload/src/collections/operations/local/update.ts index eb9ef34102..31ea589d7f 100644 --- a/packages/payload/src/collections/operations/local/update.ts +++ b/packages/payload/src/collections/operations/local/update.ts @@ -36,15 +36,15 @@ export type BaseOptions = { user?: Document } -export type ByIDOptions = BaseOptions & { +export type ByIDOptions = { id: number | string where?: never -} +} & BaseOptions -export type ManyOptions = BaseOptions & { +export type ManyOptions = { id?: never where: Where -} +} & BaseOptions export type Options = ByIDOptions | ManyOptions diff --git a/packages/payload/src/collections/operations/restoreVersion.ts b/packages/payload/src/collections/operations/restoreVersion.ts index fba874a023..353e9e2142 100644 --- a/packages/payload/src/collections/operations/restoreVersion.ts +++ b/packages/payload/src/collections/operations/restoreVersion.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-underscore-dangle */ import httpStatus from 'http-status' import type { FindOneArgs } from '../../database/types.js' diff --git a/packages/payload/src/collections/operations/utils.ts b/packages/payload/src/collections/operations/utils.ts index eeceb9aa31..80b747de87 100644 --- a/packages/payload/src/collections/operations/utils.ts +++ b/packages/payload/src/collections/operations/utils.ts @@ -98,7 +98,7 @@ export const buildAfterOperation = async < TOperationGeneric extends CollectionSlug, O extends keyof AfterOperationMap = keyof AfterOperationMap, >( - operationArgs: Omit, 'req'> & { operation: O }, + operationArgs: { operation: O } & Omit, 'req'>, ): Promise | any> => { const { args, collection, operation, result } = operationArgs diff --git a/packages/payload/src/config/client.ts b/packages/payload/src/config/client.ts index 76e2701216..01fa5a3416 100644 --- a/packages/payload/src/config/client.ts +++ b/packages/payload/src/config/client.ts @@ -34,17 +34,14 @@ export type ServerOnlyRootProperties = keyof Pick< export type ServerOnlyRootAdminProperties = keyof Pick -export type ClientConfig = Omit< - SanitizedConfig, - 'admin' | 'collections' | 'globals' | ServerOnlyRootProperties -> & { - admin: Omit & { +export type ClientConfig = { + admin: { livePreview?: Omit - } + } & Omit collections: ClientCollectionConfig[] custom?: Record globals: ClientGlobalConfig[] -} +} & Omit export const createClientConfig = async ({ config, diff --git a/packages/payload/src/config/find.ts b/packages/payload/src/config/find.ts index 637a4130c4..e4745ff83e 100644 --- a/packages/payload/src/config/find.ts +++ b/packages/payload/src/config/find.ts @@ -73,7 +73,6 @@ export const findConfig = (): string => { ? [configPath, outPath, srcPath, rootPath] : [configPath, srcPath, rootPath] - // eslint-disable-next-line no-restricted-syntax for (const searchPath of searchPaths) { if (!searchPath) continue diff --git a/packages/payload/src/config/types.ts b/packages/payload/src/config/types.ts index 520c53bf24..e95caf3e2b 100644 --- a/packages/payload/src/config/types.ts +++ b/packages/payload/src/config/types.ts @@ -41,7 +41,6 @@ type Prettify = { [K in keyof T]: T[K] } & NonNullable -// eslint-disable-next-line no-use-before-define export type Plugin = (config: Config) => Config | Promise export type LivePreviewConfig = { @@ -347,7 +346,7 @@ export const serverProps: (keyof ServerProps)[] = [ ] export type CustomComponent = React.ComponentType< - TAdditionalProps & Partial + Partial & TAdditionalProps > export type Locale = { @@ -382,17 +381,17 @@ export type BaseLocalizationConfig = { } export type LocalizationConfigWithNoLabels = Prettify< - BaseLocalizationConfig & { + { /** * List of supported locales * @example `["en", "es", "fr", "nl", "de", "jp"]` */ locales: string[] - } + } & BaseLocalizationConfig > export type LocalizationConfigWithLabels = Prettify< - BaseLocalizationConfig & { + { /** * List of supported locales with labels * @example { @@ -402,17 +401,17 @@ export type LocalizationConfigWithLabels = Prettify< * } */ locales: Locale[] - } + } & BaseLocalizationConfig > export type SanitizedLocalizationConfig = Prettify< - LocalizationConfigWithLabels & { + { /** * List of supported locales * @example `["en", "es", "fr", "nl", "de", "jp"]` */ localeCodes: string[] - } + } & LocalizationConfigWithLabels > /** @@ -547,10 +546,10 @@ export type Config = { dateFormat?: string /** If set to true, the entire Admin panel will be disabled. */ disable?: boolean - livePreview?: LivePreviewConfig & { + livePreview?: { collections?: string[] globals?: string[] - } + } & LivePreviewConfig /** Base meta data to use for the Admin Panel. Included properties are titleSuffix, ogImage, and favicon. */ meta?: MetaConfig routes?: { @@ -758,10 +757,7 @@ export type Config = { upload?: ExpressFileUploadOptions } -export type SanitizedConfig = Omit< - DeepRequired, - 'collections' | 'editor' | 'endpoint' | 'globals' | 'i18n' | 'localization' | 'upload' -> & { +export type SanitizedConfig = { collections: SanitizedCollectionConfig[] /** Default richtext editor to use for richText fields */ editor?: RichTextAdapter @@ -774,13 +770,16 @@ export type SanitizedConfig = Omit< configDir: string rawConfig: string } - upload: ExpressFileUploadOptions & { + upload: { /** * Deduped list of adapters used in the project */ adapters: string[] - } -} + } & ExpressFileUploadOptions +} & Omit< + DeepRequired, + 'collections' | 'editor' | 'endpoint' | 'globals' | 'i18n' | 'localization' | 'upload' +> export type EditConfig = | ( diff --git a/packages/payload/src/database/createDatabaseAdapter.ts b/packages/payload/src/database/createDatabaseAdapter.ts index 3445930264..1879e8a105 100644 --- a/packages/payload/src/database/createDatabaseAdapter.ts +++ b/packages/payload/src/database/createDatabaseAdapter.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import type { MarkOptional } from 'ts-essentials' import type { diff --git a/packages/payload/src/database/getLocalizedPaths.ts b/packages/payload/src/database/getLocalizedPaths.ts index 453146db34..f920b74350 100644 --- a/packages/payload/src/database/getLocalizedPaths.ts +++ b/packages/payload/src/database/getLocalizedPaths.ts @@ -129,7 +129,6 @@ export async function getLocalizedPaths({ if (nestedPathToQuery) { const relatedCollection = payload.collections[matchedField.relationTo].config - // eslint-disable-next-line no-await-in-loop const remainingPaths = await getLocalizedPaths({ collectionSlug: relatedCollection.slug, fields: relatedCollection.fields, diff --git a/packages/payload/src/database/migrations/createMigration.ts b/packages/payload/src/database/migrations/createMigration.ts index 17266c1073..423141873a 100644 --- a/packages/payload/src/database/migrations/createMigration.ts +++ b/packages/payload/src/database/migrations/createMigration.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-restricted-syntax, no-await-in-loop */ import fs from 'fs' import type { CreateMigration } from '../types.js' diff --git a/packages/payload/src/database/migrations/migrate.ts b/packages/payload/src/database/migrations/migrate.ts index 505345b6a8..2bddddf3ad 100644 --- a/packages/payload/src/database/migrations/migrate.ts +++ b/packages/payload/src/database/migrations/migrate.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-restricted-syntax, no-await-in-loop */ import type { PayloadRequest } from '../../types/index.js' import type { BaseDatabaseAdapter } from '../types.js' @@ -23,7 +22,7 @@ export async function migrate(this: BaseDatabaseAdapter): Promise { // Run migration if not found in database if (existingMigration) { - continue // eslint-disable-line no-continue + continue } const start = Date.now() diff --git a/packages/payload/src/database/migrations/migrateDown.ts b/packages/payload/src/database/migrations/migrateDown.ts index d7f1210256..352a765b32 100644 --- a/packages/payload/src/database/migrations/migrateDown.ts +++ b/packages/payload/src/database/migrations/migrateDown.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-restricted-syntax, no-await-in-loop */ import type { PayloadRequest } from '../../types/index.js' import type { BaseDatabaseAdapter } from '../types.js' diff --git a/packages/payload/src/database/migrations/migrateRefresh.ts b/packages/payload/src/database/migrations/migrateRefresh.ts index 363b31fdea..82d90191db 100644 --- a/packages/payload/src/database/migrations/migrateRefresh.ts +++ b/packages/payload/src/database/migrations/migrateRefresh.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-restricted-syntax, no-await-in-loop */ import type { PayloadRequest } from '../../types/index.js' import type { BaseDatabaseAdapter } from '../types.js' diff --git a/packages/payload/src/database/migrations/migrateReset.ts b/packages/payload/src/database/migrations/migrateReset.ts index 6a40bb1d02..070a357163 100644 --- a/packages/payload/src/database/migrations/migrateReset.ts +++ b/packages/payload/src/database/migrations/migrateReset.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-restricted-syntax, no-await-in-loop */ import type { PayloadRequest } from '../../types/index.js' import type { BaseDatabaseAdapter } from '../types.js' diff --git a/packages/payload/src/database/migrations/migrateStatus.ts b/packages/payload/src/database/migrations/migrateStatus.ts index dd6525ff22..3a717fee87 100644 --- a/packages/payload/src/database/migrations/migrateStatus.ts +++ b/packages/payload/src/database/migrations/migrateStatus.ts @@ -25,7 +25,7 @@ export async function migrateStatus(this: BaseDatabaseAdapter): Promise { const existingMigration = existingMigrations.find((m) => m.name === migration.name) return { Name: migration.name, - // eslint-disable-next-line perfectionist/sort-objects + Batch: existingMigration?.batch, Ran: existingMigration ? 'Yes' : 'No', } diff --git a/packages/payload/src/database/queryValidation/validateQueryPaths.ts b/packages/payload/src/database/queryValidation/validateQueryPaths.ts index 3021023139..1639fb4256 100644 --- a/packages/payload/src/database/queryValidation/validateQueryPaths.ts +++ b/packages/payload/src/database/queryValidation/validateQueryPaths.ts @@ -1,8 +1,6 @@ -/* eslint-disable no-restricted-syntax */ import type { SanitizedCollectionConfig } from '../../collections/config/types.js' import type { Field, FieldAffectingData } from '../../fields/config/types.js' import type { SanitizedGlobalConfig } from '../../globals/config/types.js' -/* eslint-disable no-await-in-loop */ import type { Operator, PayloadRequest, Where, WhereField } from '../../types/index.js' import type { EntityPolicies } from './types.js' diff --git a/packages/payload/src/database/queryValidation/validateSearchParams.ts b/packages/payload/src/database/queryValidation/validateSearchParams.ts index 6709a6a915..f188458344 100644 --- a/packages/payload/src/database/queryValidation/validateSearchParams.ts +++ b/packages/payload/src/database/queryValidation/validateSearchParams.ts @@ -51,10 +51,8 @@ export async function validateSearchParam({ const { slug } = collectionConfig || globalConfig if (globalConfig && !policies.globals[slug]) { - // eslint-disable-next-line no-param-reassign globalConfig.fields = fields - // eslint-disable-next-line no-param-reassign policies.globals[slug] = await getEntityPolicies({ type: 'global', entity: globalConfig, @@ -85,7 +83,6 @@ export async function validateSearchParam({ if (!overrideAccess && fieldAffectsData(field)) { if (collectionSlug) { if (!policies.collections[collectionSlug]) { - // eslint-disable-next-line no-param-reassign policies.collections[collectionSlug] = await getEntityPolicies({ type: 'collection', entity: req.payload.collections[collectionSlug].config, diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 28096296f4..b0a92ba56e 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -222,17 +222,17 @@ type BaseVersionArgs = { where?: Where } -export type FindVersionsArgs = BaseVersionArgs & { +export type FindVersionsArgs = { collection: string -} +} & BaseVersionArgs export type FindVersions = ( args: FindVersionsArgs, ) => Promise>> -export type FindGlobalVersionsArgs = BaseVersionArgs & { +export type FindGlobalVersionsArgs = { global: string -} +} & BaseVersionArgs export type FindGlobalArgs = { locale?: string @@ -395,10 +395,10 @@ export type DeleteManyArgs = { export type DeleteMany = (args: DeleteManyArgs) => Promise -export type Migration = MigrationData & { +export type Migration = { down: ({ payload, req }: { payload: Payload; req: PayloadRequest }) => Promise up: ({ payload, req }: { payload: Payload; req: PayloadRequest }) => Promise -} +} & MigrationData export type MigrationData = { batch?: number diff --git a/packages/payload/src/errors/APIError.ts b/packages/payload/src/errors/APIError.ts index eb77ec1568..369f178695 100644 --- a/packages/payload/src/errors/APIError.ts +++ b/packages/payload/src/errors/APIError.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-classes-per-file */ import httpStatus from 'http-status' class ExtendableError extends Error { diff --git a/packages/payload/src/exports/shared.ts b/packages/payload/src/exports/shared.ts index bc03fb8f67..e4c429beda 100644 --- a/packages/payload/src/exports/shared.ts +++ b/packages/payload/src/exports/shared.ts @@ -1,7 +1,5 @@ -export * from '../fields/validations.js' export { defaults as collectionDefaults } from '../collections/config/defaults.js' export { serverProps } from '../config/types.js' - export { fieldAffectsData, fieldHasMaxDepth, @@ -19,6 +17,8 @@ export { valueIsValueWithRelation, } from '../fields/config/types.js' +export * from '../fields/validations.js' + export { validOperators } from '../types/constants.js' export { formatFilesize } from '../uploads/formatFilesize.js' diff --git a/packages/payload/src/fields/config/sanitize.spec.ts b/packages/payload/src/fields/config/sanitize.spec.ts index 9007f3638a..623aabbe87 100644 --- a/packages/payload/src/fields/config/sanitize.spec.ts +++ b/packages/payload/src/fields/config/sanitize.spec.ts @@ -1,6 +1,4 @@ -import { Config } from '../../config/types.js' -import { InvalidFieldName, InvalidFieldRelationship, MissingFieldType } from '../../errors/index.js' -import { sanitizeFields } from './sanitize.js' +import type { Config } from '../../config/types.js' import type { ArrayField, Block, @@ -11,14 +9,17 @@ import type { TextField, } from './types.js' +import { InvalidFieldName, InvalidFieldRelationship, MissingFieldType } from '../../errors/index.js' +import { sanitizeFields } from './sanitize.js' + describe('sanitizeFields', () => { const config = {} as Config it('should throw on missing type field', async () => { const fields: Field[] = [ // @ts-expect-error { - label: 'some-collection', name: 'Some Collection', + label: 'some-collection', }, ] await expect(async () => { @@ -32,9 +33,9 @@ describe('sanitizeFields', () => { it('should throw on invalid field name', async () => { const fields: Field[] = [ { - label: 'some.collection', name: 'some.collection', type: 'text', + label: 'some.collection', }, ] await expect(async () => { @@ -68,9 +69,9 @@ describe('sanitizeFields', () => { it('should allow auto-label override', async () => { const fields: Field[] = [ { - label: 'Do not label', name: 'someField', type: 'text', + label: 'Do not label', }, ] const sanitizedField = ( @@ -89,9 +90,9 @@ describe('sanitizeFields', () => { it('should allow label opt-out', async () => { const fields: Field[] = [ { - label: false, name: 'someField', type: 'text', + label: false, }, ] const sanitizedField = ( @@ -108,6 +109,8 @@ describe('sanitizeFields', () => { it('should allow label opt-out for arrays', async () => { const arrayField: ArrayField = { + name: 'items', + type: 'array', fields: [ { name: 'itemName', @@ -115,8 +118,6 @@ describe('sanitizeFields', () => { }, ], label: false, - name: 'items', - type: 'array', } const sanitizedField = ( await sanitizeFields({ @@ -133,20 +134,20 @@ describe('sanitizeFields', () => { it('should allow label opt-out for blocks', async () => { const fields: Field[] = [ { + name: 'noLabelBlock', + type: 'blocks', blocks: [ { + slug: 'number', fields: [ { name: 'testNumber', type: 'number', }, ], - slug: 'number', }, ], label: false, - name: 'noLabelBlock', - type: 'blocks', }, ] const sanitizedField = ( @@ -166,14 +167,14 @@ describe('sanitizeFields', () => { it('should label arrays with plural and singular', async () => { const fields: Field[] = [ { + name: 'items', + type: 'array', fields: [ { name: 'itemName', type: 'text', }, ], - name: 'items', - type: 'array', }, ] const sanitizedField = ( @@ -192,14 +193,14 @@ describe('sanitizeFields', () => { it('should label blocks with plural and singular', async () => { const fields: Field[] = [ { - blocks: [ - { - fields: [{ name: 'testNumber', type: 'number' }], - slug: 'number', - }, - ], name: 'specialBlock', type: 'blocks', + blocks: [ + { + slug: 'number', + fields: [{ name: 'testNumber', type: 'number' }], + }, + ], }, ] const sanitizedField = ( @@ -225,10 +226,10 @@ describe('sanitizeFields', () => { const validRelationships = ['some-collection'] const fields: Field[] = [ { - label: 'my-relationship', name: 'My Relationship', - relationTo: 'some-collection', type: 'relationship', + label: 'my-relationship', + relationTo: 'some-collection', }, ] await expect(async () => { @@ -240,10 +241,10 @@ describe('sanitizeFields', () => { const validRelationships = ['some-collection', 'another-collection'] const fields: Field[] = [ { - label: 'my-relationship', name: 'My Relationship', - relationTo: ['some-collection', 'another-collection'], type: 'relationship', + label: 'my-relationship', + relationTo: ['some-collection', 'another-collection'], }, ] await expect(async () => { @@ -254,22 +255,22 @@ describe('sanitizeFields', () => { it('should not throw on valid relationship inside blocks', async () => { const validRelationships = ['some-collection'] const relationshipBlock: Block = { + slug: 'relationshipBlock', fields: [ { - label: 'my-relationship', name: 'My Relationship', - relationTo: 'some-collection', type: 'relationship', + label: 'my-relationship', + relationTo: 'some-collection', }, ], - slug: 'relationshipBlock', } const fields: Field[] = [ { - blocks: [relationshipBlock], - label: 'Layout Blocks', name: 'layout', type: 'blocks', + blocks: [relationshipBlock], + label: 'Layout Blocks', }, ] await expect(async () => { @@ -281,10 +282,10 @@ describe('sanitizeFields', () => { const validRelationships = ['some-collection'] const fields: Field[] = [ { - label: 'my-relationship', name: 'My Relationship', - relationTo: 'not-valid', type: 'relationship', + label: 'my-relationship', + relationTo: 'not-valid', }, ] await expect(async () => { @@ -296,10 +297,10 @@ describe('sanitizeFields', () => { const validRelationships = ['some-collection', 'another-collection'] const fields: Field[] = [ { - label: 'my-relationship', name: 'My Relationship', - relationTo: ['some-collection', 'not-valid'], type: 'relationship', + label: 'my-relationship', + relationTo: ['some-collection', 'not-valid'], }, ] await expect(async () => { @@ -310,22 +311,22 @@ describe('sanitizeFields', () => { it('should throw on invalid relationship inside blocks', async () => { const validRelationships = ['some-collection'] const relationshipBlock: Block = { + slug: 'relationshipBlock', fields: [ { - label: 'my-relationship', name: 'My Relationship', - relationTo: 'not-valid', type: 'relationship', + label: 'my-relationship', + relationTo: 'not-valid', }, ], - slug: 'relationshipBlock', } const fields: Field[] = [ { - blocks: [relationshipBlock], - label: 'Layout Blocks', name: 'layout', type: 'blocks', + blocks: [relationshipBlock], + label: 'Layout Blocks', }, ] await expect(async () => { @@ -337,8 +338,8 @@ describe('sanitizeFields', () => { const fields: Field[] = [ { name: 'My Checkbox', - required: true, type: 'checkbox', + required: true, }, ] diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index bd27233733..6883982c6a 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable no-use-before-define */ + import type { EditorProps } from '@monaco-editor/react' import type { CSSProperties } from 'react' @@ -241,8 +241,8 @@ export interface FieldBase { validate?: Validate } -export type NumberField = FieldBase & { - admin?: Admin & { +export type NumberField = { + admin?: { /** Set this property to a string that will be used for browser autocomplete. */ autoComplete?: string components?: { @@ -255,33 +255,34 @@ export type NumberField = FieldBase & { placeholder?: Record | string /** Set a value for the number field to increment / decrement using browser controls. */ step?: number - } + } & Admin /** Maximum value accepted. Used in the default `validation` function. */ max?: number /** Minimum value accepted. Used in the default `validation` function. */ min?: number type: 'number' } & ( - | { - /** Makes this field an ordered array of numbers instead of just a single number. */ - hasMany: true - /** Maximum number of numbers in the numbers array, if `hasMany` is set to true. */ - maxRows?: number - /** Minimum number of numbers in the numbers array, if `hasMany` is set to true. */ - minRows?: number - } - | { - /** Makes this field an ordered array of numbers instead of just a single number. */ - hasMany?: false | undefined - /** Maximum number of numbers in the numbers array, if `hasMany` is set to true. */ - maxRows?: undefined - /** Minimum number of numbers in the numbers array, if `hasMany` is set to true. */ - minRows?: undefined - } - ) + | { + /** Makes this field an ordered array of numbers instead of just a single number. */ + hasMany: true + /** Maximum number of numbers in the numbers array, if `hasMany` is set to true. */ + maxRows?: number + /** Minimum number of numbers in the numbers array, if `hasMany` is set to true. */ + minRows?: number + } + | { + /** Makes this field an ordered array of numbers instead of just a single number. */ + hasMany?: false | undefined + /** Maximum number of numbers in the numbers array, if `hasMany` is set to true. */ + maxRows?: undefined + /** Minimum number of numbers in the numbers array, if `hasMany` is set to true. */ + minRows?: undefined + } +) & + FieldBase -export type TextField = FieldBase & { - admin?: Admin & { +export type TextField = { + admin?: { autoComplete?: string components?: { Error?: CustomComponent @@ -291,31 +292,32 @@ export type TextField = FieldBase & { } placeholder?: Record | string rtl?: boolean - } + } & Admin maxLength?: number minLength?: number type: 'text' } & ( - | { - /** Makes this field an ordered array of strings instead of just a single string. */ - hasMany: true - /** Maximum number of strings in the strings array, if `hasMany` is set to true. */ - maxRows?: number - /** Minimum number of strings in the strings array, if `hasMany` is set to true. */ - minRows?: number - } - | { - /** Makes this field an ordered array of strings instead of just a single string. */ - hasMany?: false | undefined - /** Maximum number of strings in the strings array, if `hasMany` is set to true. */ - maxRows?: undefined - /** Minimum number of strings in the strings array, if `hasMany` is set to true. */ - minRows?: undefined - } - ) + | { + /** Makes this field an ordered array of strings instead of just a single string. */ + hasMany: true + /** Maximum number of strings in the strings array, if `hasMany` is set to true. */ + maxRows?: number + /** Minimum number of strings in the strings array, if `hasMany` is set to true. */ + minRows?: number + } + | { + /** Makes this field an ordered array of strings instead of just a single string. */ + hasMany?: false | undefined + /** Maximum number of strings in the strings array, if `hasMany` is set to true. */ + maxRows?: undefined + /** Minimum number of strings in the strings array, if `hasMany` is set to true. */ + minRows?: undefined + } +) & + FieldBase -export type EmailField = FieldBase & { - admin?: Admin & { +export type EmailField = { + admin?: { autoComplete?: string components?: { Error?: CustomComponent @@ -324,12 +326,12 @@ export type EmailField = FieldBase & { beforeInput?: CustomComponent[] } placeholder?: Record | string - } + } & Admin type: 'email' -} +} & FieldBase -export type TextareaField = FieldBase & { - admin?: Admin & { +export type TextareaField = { + admin?: { components?: { Error?: CustomComponent Label?: CustomComponent @@ -339,26 +341,26 @@ export type TextareaField = FieldBase & { placeholder?: Record | string rows?: number rtl?: boolean - } + } & Admin maxLength?: number minLength?: number type: 'textarea' -} +} & FieldBase -export type CheckboxField = FieldBase & { - admin?: Admin & { +export type CheckboxField = { + admin?: { components?: { Error?: CustomComponent Label?: CustomComponent afterInput?: CustomComponent[] beforeInput?: CustomComponent[] } - } + } & Admin type: 'checkbox' -} +} & FieldBase -export type DateField = FieldBase & { - admin?: Admin & { +export type DateField = { + admin?: { components?: { Error?: CustomComponent Label?: CustomComponent @@ -367,14 +369,14 @@ export type DateField = FieldBase & { } date?: ConditionalDateProps placeholder?: Record | string - } + } & Admin type: 'date' -} +} & FieldBase -export type GroupField = Omit & { - admin?: Admin & { +export type GroupField = { + admin?: { hideGutter?: boolean - } + } & Admin fields: Field[] /** Customize generated GraphQL and Typescript schema names. * By default, it is bound to the collection. @@ -384,47 +386,48 @@ export type GroupField = Omit & { */ interfaceName?: string type: 'group' -} +} & Omit export type RowAdmin = Omit -export type RowField = Omit & { +export type RowField = { admin?: RowAdmin fields: Field[] type: 'row' -} +} & Omit -export type CollapsibleField = Omit & { +export type CollapsibleField = { fields: Field[] type: 'collapsible' } & ( - | { - admin: Admin & { - components: { - RowLabel: RowLabelComponent - } & Admin['components'] - initCollapsed?: boolean - } - label?: Required - } - | { - admin?: Admin & { - initCollapsed?: boolean - } - label: Required - } - ) + | { + admin: { + components: { + RowLabel: RowLabelComponent + } & Admin['components'] + initCollapsed?: boolean + } & Admin + label?: Required + } + | { + admin?: { + initCollapsed?: boolean + } & Admin + label: Required + } +) & + Omit export type TabsAdmin = Omit -type TabBase = Omit & { +type TabBase = { description?: Description fields: Field[] interfaceName?: string saveToJWT?: boolean | string -} +} & Omit -export type NamedTab = TabBase & { +export type NamedTab = { /** Customize generated GraphQL and Typescript schema names. * The slug is used by default. * @@ -432,9 +435,9 @@ export type NamedTab = TabBase & { * **Note**: Top level types can collide, ensure they are unique amongst collections, arrays, groups, blocks, tabs. */ interfaceName?: string -} +} & TabBase -export type UnnamedTab = Omit & { +export type UnnamedTab = { interfaceName?: never /** * Can be either: @@ -448,20 +451,20 @@ export type UnnamedTab = Omit & { | LabelFunction | string localized?: never -} +} & Omit export type Tab = NamedTab | UnnamedTab -export type TabsField = Omit & { +export type TabsField = { admin?: TabsAdmin tabs: Tab[] type: 'tabs' -} +} & Omit -export type TabAsField = Tab & { +export type TabAsField = { name?: string type: 'tab' -} +} & Tab export type UIField = { admin: { @@ -492,7 +495,7 @@ export type UIField = { type: 'ui' } -export type UploadField = FieldBase & { +export type UploadField = { admin?: { components?: { Error?: CustomComponent @@ -508,33 +511,33 @@ export type UploadField = FieldBase & { maxDepth?: number relationTo: CollectionSlug type: 'upload' -} +} & FieldBase -type CodeAdmin = Admin & { +type CodeAdmin = { components?: { Error?: CustomComponent Label?: CustomComponent } editorOptions?: EditorProps['options'] language?: string -} +} & Admin -export type CodeField = Omit & { +export type CodeField = { admin?: CodeAdmin maxLength?: number minLength?: number type: 'code' -} +} & Omit -type JSONAdmin = Admin & { +type JSONAdmin = { components?: { Error?: CustomComponent Label?: CustomComponent } editorOptions?: EditorProps['options'] -} +} & Admin -export type JSONField = Omit & { +export type JSONField = { admin?: JSONAdmin jsonSchema?: { fileMatch: string[] @@ -542,17 +545,17 @@ export type JSONField = Omit & { uri: string } type: 'json' -} +} & Omit -export type SelectField = FieldBase & { - admin?: Admin & { +export type SelectField = { + admin?: { components?: { Error?: CustomComponent Label?: CustomComponent } isClearable?: boolean isSortable?: boolean - } + } & Admin /** * Customize the SQL table name */ @@ -564,9 +567,9 @@ export type SelectField = FieldBase & { hasMany?: boolean options: Option[] type: 'select' -} +} & FieldBase -type SharedRelationshipProperties = FieldBase & { +type SharedRelationshipProperties = { filterOptions?: FilterOptions hasMany?: boolean /** @@ -577,54 +580,55 @@ type SharedRelationshipProperties = FieldBase & { maxDepth?: number type: 'relationship' } & ( - | { - hasMany: true - /** - * @deprecated Use 'maxRows' instead - */ - max?: number - maxRows?: number - /** - * @deprecated Use 'minRows' instead - */ - min?: number - minRows?: number - } - | { - hasMany?: false | undefined - /** - * @deprecated Use 'maxRows' instead - */ - max?: undefined - maxRows?: undefined - /** - * @deprecated Use 'minRows' instead - */ - min?: undefined - minRows?: undefined - } - ) + | { + hasMany: true + /** + * @deprecated Use 'maxRows' instead + */ + max?: number + maxRows?: number + /** + * @deprecated Use 'minRows' instead + */ + min?: number + minRows?: number + } + | { + hasMany?: false | undefined + /** + * @deprecated Use 'maxRows' instead + */ + max?: undefined + maxRows?: undefined + /** + * @deprecated Use 'minRows' instead + */ + min?: undefined + minRows?: undefined + } +) & + FieldBase -type RelationshipAdmin = Admin & { +type RelationshipAdmin = { allowCreate?: boolean components?: { Error?: CustomComponent Label?: CustomComponent } isSortable?: boolean -} -export type PolymorphicRelationshipField = SharedRelationshipProperties & { - admin?: RelationshipAdmin & { +} & Admin +export type PolymorphicRelationshipField = { + admin?: { sortOptions?: { [collectionSlug: CollectionSlug]: string } - } + } & RelationshipAdmin relationTo: CollectionSlug[] -} -export type SingleRelationshipField = SharedRelationshipProperties & { - admin?: RelationshipAdmin & { +} & SharedRelationshipProperties +export type SingleRelationshipField = { + admin?: { sortOptions?: string - } + } & RelationshipAdmin relationTo: CollectionSlug -} +} & SharedRelationshipProperties export type RelationshipField = PolymorphicRelationshipField | SingleRelationshipField export type ValueWithRelation = { @@ -646,13 +650,13 @@ export type RichTextField< Value extends object = any, AdapterProps = any, ExtraProperties = object, -> = FieldBase & { - admin?: Admin & { +> = { + admin?: { components?: { Error?: CustomComponent Label?: CustomComponent } - } + } & Admin editor?: | RichTextAdapter | RichTextAdapterProvider @@ -663,10 +667,11 @@ export type RichTextField< */ maxDepth?: number type: 'richText' -} & ExtraProperties +} & ExtraProperties & + FieldBase -export type ArrayField = FieldBase & { - admin?: Admin & { +export type ArrayField = { + admin?: { components?: { RowLabel?: RowLabelComponent } & Admin['components'] @@ -675,7 +680,7 @@ export type ArrayField = FieldBase & { * Disable drag and drop sorting */ isSortable?: boolean - } + } & Admin /** * Customize the SQL table name */ @@ -692,16 +697,16 @@ export type ArrayField = FieldBase & { maxRows?: number minRows?: number type: 'array' -} +} & FieldBase -export type RadioField = FieldBase & { - admin?: Admin & { +export type RadioField = { + admin?: { components?: { Error?: CustomComponent Label?: CustomComponent } layout?: 'horizontal' | 'vertical' - } + } & Admin /** * Customize the SQL table name */ @@ -712,7 +717,7 @@ export type RadioField = FieldBase & { enumName?: DBIdentifierName options: Option[] type: 'radio' -} +} & FieldBase export type Block = { admin?: { @@ -743,25 +748,25 @@ export type Block = { slug: string } -export type BlockField = FieldBase & { - admin?: Admin & { +export type BlockField = { + admin?: { initCollapsed?: boolean /** * Disable drag and drop sorting */ isSortable?: boolean - } + } & Admin blocks: Block[] defaultValue?: unknown labels?: Labels maxRows?: number minRows?: number type: 'blocks' -} +} & FieldBase -export type PointField = FieldBase & { +export type PointField = { type: 'point' -} +} & FieldBase export type Field = | ArrayField @@ -828,9 +833,9 @@ export type NonPresentationalField = | TextareaField | UploadField -export type FieldWithPath = Field & { +export type FieldWithPath = { path?: string -} +} & Field export type FieldWithSubFields = ArrayField | CollapsibleField | GroupField | RowField diff --git a/packages/payload/src/fields/hooks/afterChange/promise.ts b/packages/payload/src/fields/hooks/afterChange/promise.ts index 6af7cd845c..a0f43b4860 100644 --- a/packages/payload/src/fields/hooks/afterChange/promise.ts +++ b/packages/payload/src/fields/hooks/afterChange/promise.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import type { RichTextAdapter } from '../../../admin/RichText.js' import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' diff --git a/packages/payload/src/fields/hooks/afterRead/promise.ts b/packages/payload/src/fields/hooks/afterRead/promise.ts index 3a60aa7158..c38beff645 100644 --- a/packages/payload/src/fields/hooks/afterRead/promise.ts +++ b/packages/payload/src/fields/hooks/afterRead/promise.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import type { RichTextAdapter } from '../../../admin/RichText.js' import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' diff --git a/packages/payload/src/fields/hooks/beforeValidate/promise.ts b/packages/payload/src/fields/hooks/beforeValidate/promise.ts index b569afe5a1..b1553b31f1 100644 --- a/packages/payload/src/fields/hooks/beforeValidate/promise.ts +++ b/packages/payload/src/fields/hooks/beforeValidate/promise.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import type { RichTextAdapter } from '../../../admin/RichText.js' import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' diff --git a/packages/payload/src/fields/validations.spec.ts b/packages/payload/src/fields/validations.spec.ts index f3331e7c4c..bda65e215c 100644 --- a/packages/payload/src/fields/validations.spec.ts +++ b/packages/payload/src/fields/validations.spec.ts @@ -1,6 +1,7 @@ -import type { ValidateOptions } from './config/types.js' import { jest } from '@jest/globals' +import type { ValidateOptions } from './config/types.js' + import { number, password, point, relationship, select, text, textarea } from './validations.js' const t = jest.fn((string) => string) @@ -8,9 +9,7 @@ const t = jest.fn((string) => string) let options: ValidateOptions = { data: undefined, operation: 'create', - siblingData: undefined, req: { - t, context: {}, payload: { config: { @@ -20,7 +19,9 @@ let options: ValidateOptions = { }, }, }, + t, }, + siblingData: undefined, } describe('Field Validations', () => { @@ -216,32 +217,32 @@ describe('Field Validations', () => { describe('relationship', () => { const relationCollection = { + slug: 'relation', fields: [ { name: 'id', type: 'text', }, ], - slug: 'relation', } const relationshipOptions = { ...options, + relationTo: 'relation', req: { ...options.req, payload: { ...options.req.payload, - config: { - collections: [relationCollection], - }, collections: { relation: { config: relationCollection, }, }, + config: { + collections: [relationCollection], + }, }, }, - relationTo: 'relation', } it('should handle required', async () => { const val = undefined @@ -292,8 +293,8 @@ describe('Field Validations', () => { describe('select', () => { const selectOptions = { ...options, - options: ['one', 'two', 'three'], type: 'select', + options: ['one', 'two', 'three'], } const optionsRequired = { ...selectOptions, diff --git a/packages/payload/src/fields/validations.ts b/packages/payload/src/fields/validations.ts index c1bd2aaea9..af4050f938 100644 --- a/packages/payload/src/fields/validations.ts +++ b/packages/payload/src/fields/validations.ts @@ -168,7 +168,7 @@ export const code: Validate = ( return true } -export const json: Validate = async ( +export const json: Validate = async ( value, { jsonError, jsonSchema, req: { t }, required }, ) => { @@ -250,7 +250,6 @@ export const date: Validate = ( { req: { t }, required }, ) => { if (value && !isNaN(Date.parse(value.toString()))) { - /* eslint-disable-line */ return true } diff --git a/packages/payload/src/globals/config/client.ts b/packages/payload/src/globals/config/client.ts index dc3b12c69b..2c65d75d8c 100644 --- a/packages/payload/src/globals/config/client.ts +++ b/packages/payload/src/globals/config/client.ts @@ -19,18 +19,15 @@ export type ServerOnlyGlobalAdminProperties = keyof Pick< 'components' | 'hidden' | 'preview' > -export type ClientGlobalConfig = Omit< - SanitizedGlobalConfig, - 'admin' | 'fields' | ServerOnlyGlobalProperties -> & { - admin: Omit< - SanitizedGlobalConfig['admin'], - ServerOnlyGlobalAdminProperties & 'fields' & 'livePreview' - > & { +export type ClientGlobalConfig = { + admin: { livePreview?: Omit - } + } & Omit< + SanitizedGlobalConfig['admin'], + 'fields' & 'livePreview' & ServerOnlyGlobalAdminProperties + > fields: ClientFieldConfig[] -} +} & Omit export const createClientGlobalConfig = ({ global, diff --git a/packages/payload/src/globals/operations/findVersionByID.ts b/packages/payload/src/globals/operations/findVersionByID.ts index 6cd2710d14..7bc29606f0 100644 --- a/packages/payload/src/globals/operations/findVersionByID.ts +++ b/packages/payload/src/globals/operations/findVersionByID.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-underscore-dangle */ import type { FindGlobalVersionsArgs } from '../../database/types.js' import type { PayloadRequest } from '../../types/index.js' import type { TypeWithVersion } from '../../versions/types.js' diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index 58c15a013f..856e0ee691 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -83,7 +83,7 @@ export interface GeneratedTypes { } } collectionsUntyped: { - [slug: string]: TypeWithID & Record + [slug: string]: Record & TypeWithID } globalsUntyped: { [slug: string]: Record @@ -293,7 +293,7 @@ export class BasePayload { login = async ( options: LoginOptions, - ): Promise }> => { + ): Promise<{ user: DataFromCollectionSlug } & LoginResult> => { const { login } = localOperations.auth return login(this, options) } @@ -632,7 +632,6 @@ export default initialized let cached = global._payload if (!cached) { - // eslint-disable-next-line no-multi-assign cached = global._payload = { payload: null, promise: null } } @@ -669,14 +668,52 @@ export interface DatabaseAdapter extends BaseDatabaseAdapter {} export type { Payload, RequestContext } -export * from './types/index.js' +export type { FieldTypes } from './admin/forms/FieldTypes.js' export type * from './admin/types.js' -export type * from './uploads/types.js' +export { default as executeAccess } from './auth/executeAccess.js' + +export { executeAuthStrategies } from './auth/executeAuthStrategies.js' + +export { getAccessResults } from './auth/getAccessResults.js' + +export { getFieldsToSign } from './auth/getFieldsToSign.js' + +export * from './auth/index.js' + +export { accessOperation } from './auth/operations/access.js' +export { forgotPasswordOperation } from './auth/operations/forgotPassword.js' +export { initOperation } from './auth/operations/init.js' + +export { loginOperation } from './auth/operations/login.js' + +export { logoutOperation } from './auth/operations/logout.js' export type { MeOperationResult } from './auth/operations/me.js' +export { meOperation } from './auth/operations/me.js' +export { refreshOperation } from './auth/operations/refresh.js' + +export { registerFirstUserOperation } from './auth/operations/registerFirstUser.js' +export { resetPasswordOperation } from './auth/operations/resetPassword.js' +export { unlockOperation } from './auth/operations/unlock.js' +export { verifyEmailOperation } from './auth/operations/verifyEmail.js' + +export type { + AuthStrategyFunction, + AuthStrategyFunctionArgs, + CollectionPermission, + DocumentPermissions, + FieldPermissions, + GlobalPermission, + IncomingAuthType, + Permission, + Permissions, + User, + VerifyConfig, +} from './auth/types.js' export type { ClientCollectionConfig } from './collections/config/client.js' +export { createClientCollectionConfig } from './collections/config/client.js' export type { AfterChangeHook as CollectionAfterChangeHook, AfterDeleteHook as CollectionAfterDeleteHook, @@ -712,9 +749,30 @@ export type { } from './collections/config/types.js' export { createDataloaderCacheKey, getDataLoader } from './collections/dataloader.js' +export { countOperation } from './collections/operations/count.js' +export { createOperation } from './collections/operations/create.js' + +export { deleteOperation } from './collections/operations/delete.js' +export { deleteByIDOperation } from './collections/operations/deleteByID.js' +export { docAccessOperation } from './collections/operations/docAccess.js' + +export { duplicateOperation } from './collections/operations/duplicate.js' + +export { findOperation } from './collections/operations/find.js' + +export { findByIDOperation } from './collections/operations/findByID.js' +export { findVersionByIDOperation } from './collections/operations/findVersionByID.js' +export { findVersionsOperation } from './collections/operations/findVersions.js' +export { restoreVersionOperation } from './collections/operations/restoreVersion.js' +export { updateOperation } from './collections/operations/update.js' +export { updateByIDOperation } from './collections/operations/updateByID.js' export { buildConfig } from './config/build.js' + export type { ClientConfig } from './config/client.js' +export { createClientConfig } from './config/client.js' +export { defaults } from './config/defaults.js' +export { sanitizeConfig } from './config/sanitize.js' export type { Access, AccessArgs, @@ -724,7 +782,85 @@ export type { EntityDescriptionFunction, SanitizedConfig, } from './config/types.js' +export * from './config/types.js' +export { combineQueries } from './database/combineQueries.js' +export { createDatabaseAdapter } from './database/createDatabaseAdapter.js' +export { default as flattenWhereToOperators } from './database/flattenWhereToOperators.js' +export { getLocalizedPaths } from './database/getLocalizedPaths.js' +export { createMigration } from './database/migrations/createMigration.js' + +export { getMigrations } from './database/migrations/getMigrations.js' +export { getPredefinedMigration } from './database/migrations/getPredefinedMigration.js' +export { migrate } from './database/migrations/migrate.js' +export { migrateDown } from './database/migrations/migrateDown.js' + +export { migrateRefresh } from './database/migrations/migrateRefresh.js' +export { migrateReset } from './database/migrations/migrateReset.js' +export { migrateStatus } from './database/migrations/migrateStatus.js' +export { migrationTemplate } from './database/migrations/migrationTemplate.js' +export { migrationsCollection } from './database/migrations/migrationsCollection.js' +export { readMigrationFiles } from './database/migrations/readMigrationFiles.js' + +export type * from './database/queryValidation/types.js' + +export type { EntityPolicies, PathToQuery } from './database/queryValidation/types.js' + +export { validateQueryPaths } from './database/queryValidation/validateQueryPaths.js' +export { validateSearchParam } from './database/queryValidation/validateSearchParams.js' +export type { + BaseDatabaseAdapter, + BeginTransaction, + CommitTransaction, + Connect, + Count, + CountArgs, + Create, + CreateArgs, + CreateGlobal, + CreateGlobalArgs, + CreateGlobalVersion, + CreateGlobalVersionArgs, + CreateMigration, + CreateVersion, + CreateVersionArgs, + DBIdentifierName, + DatabaseAdapterResult as DatabaseAdapterObj, + DeleteMany, + DeleteManyArgs, + DeleteOne, + DeleteOneArgs, + DeleteVersions, + DeleteVersionsArgs, + Destroy, + Find, + FindArgs, + FindGlobal, + FindGlobalArgs, + FindGlobalVersions, + FindGlobalVersionsArgs, + FindOne, + FindOneArgs, + FindVersions, + FindVersionsArgs, + Init, + Migration, + MigrationData, + MigrationTemplateArgs, + PaginatedDocs, + QueryDrafts, + QueryDraftsArgs, + RollbackTransaction, + Transaction, + UpdateGlobal, + UpdateGlobalArgs, + UpdateGlobalVersion, + UpdateGlobalVersionArgs, + UpdateOne, + UpdateOneArgs, + UpdateVersion, + UpdateVersionArgs, +} from './database/types.js' export type { EmailAdapter as PayloadEmailAdapter, SendEmailOptions } from './email/types.js' export { @@ -750,9 +886,11 @@ export { QueryError, ValidationError, } from './errors/index.js' - +export { baseBlockFields } from './fields/baseFields/baseBlockFields.js' +export { baseIDField } from './fields/baseFields/baseIDField.js' export type { ClientFieldConfig } from './fields/config/client.js' - +export { createClientFieldConfig } from './fields/config/client.js' +export { sanitizeFields } from './fields/config/sanitize.js' export type { ArrayField, Block, @@ -809,14 +947,16 @@ export type { ValidateOptions, ValueWithRelation, } from './fields/config/types.js' +export { default as getDefaultValue } from './fields/getDefaultValue.js' export { traverseFields as afterChangeTraverseFields } from './fields/hooks/afterChange/traverseFields.js' - export { promise as afterReadPromise } from './fields/hooks/afterRead/promise.js' export { traverseFields as afterReadTraverseFields } from './fields/hooks/afterRead/traverseFields.js' export { traverseFields as beforeChangeTraverseFields } from './fields/hooks/beforeChange/traverseFields.js' -export { traverseFields as beforeValidateTraverseFields } from './fields/hooks/beforeValidate/traverseFields.js' +export { traverseFields as beforeValidateTraverseFields } from './fields/hooks/beforeValidate/traverseFields.js' +export { default as sortableFieldTypes } from './fields/sortableFieldTypes.js' export type { ClientGlobalConfig } from './globals/config/client.js' +export { createClientGlobalConfig } from './globals/config/client.js' export type { AfterChangeHook as GlobalAfterChangeHook, AfterReadHook as GlobalAfterReadHook, @@ -828,7 +968,12 @@ export type { GlobalConfig, SanitizedGlobalConfig, } from './globals/config/types.js' - +export { docAccessOperation as docAccessOperationGlobal } from './globals/operations/docAccess.js' +export { findOneOperation } from './globals/operations/findOne.js' +export { findVersionByIDOperation as findVersionByIDOperationGlobal } from './globals/operations/findVersionByID.js' +export { findVersionsOperation as findVersionsOperationGlobal } from './globals/operations/findVersions.js' +export { restoreVersionOperation as restoreVersionOperationGlobal } from './globals/operations/restoreVersion.js' +export { updateOperation as updateOperationGlobal } from './globals/operations/update.js' export type { CollapsedPreferences, DocumentPreferences, @@ -838,210 +983,64 @@ export type { PreferenceUpdateRequest, TabsPreferences, } from './preferences/types.js' -export { getLocalI18n } from './translations/getLocalI18n.js' +export { getLocalI18n } from './translations/getLocalI18n.js' +export * from './types/index.js' +export { getFileByPath } from './uploads/getFileByPath.js' +export type * from './uploads/types.js' export { combineMerge } from './utilities/combineMerge.js' +export { commitTransaction } from './utilities/commitTransaction.js' + export { configToJSONSchema, entityToJSONSchema, fieldsToJSONSchema, withNullableJSONSchemaType, } from './utilities/configToJSONSchema.js' - export { createArrayFromCommaDelineated } from './utilities/createArrayFromCommaDelineated.js' - export { createLocalReq } from './utilities/createLocalReq.js' export { deepCopyObject } from './utilities/deepCopyObject.js' export { deepMerge } from './utilities/deepMerge.js' - export { default as flattenTopLevelFields } from './utilities/flattenTopLevelFields.js' export { formatLabels, formatNames, toWords } from './utilities/formatLabels.js' export { getCollectionIDFieldTypes } from './utilities/getCollectionIDFieldTypes.js' + export { getObjectDotNotation } from './utilities/getObjectDotNotation.js' -export { isEntityHidden } from './utilities/isEntityHidden.js' -export { isPlainObject } from './utilities/isPlainObject.js' -export { isValidID } from './utilities/isValidID.js' -export { default as isolateObjectProperty } from './utilities/isolateObjectProperty.js' -export { mapAsync } from './utilities/mapAsync.js' - -export { mergeListSearchAndWhere } from './utilities/mergeListSearchAndWhere.js' -export { buildVersionCollectionFields } from './versions/buildCollectionFields.js' -export { buildVersionGlobalFields } from './versions/buildGlobalFields.js' -export { versionDefaults } from './versions/defaults.js' -export { deleteCollectionVersions } from './versions/deleteCollectionVersions.js' -export { enforceMaxVersions } from './versions/enforceMaxVersions.js' -export { getLatestCollectionVersion } from './versions/getLatestCollectionVersion.js' -export { getLatestGlobalVersion } from './versions/getLatestGlobalVersion.js' - -export { saveVersion } from './versions/saveVersion.js' -export type { TypeWithVersion } from './versions/types.js' -export * from './config/types.js' - -export type { FieldTypes } from './admin/forms/FieldTypes.js' -export type { - AuthStrategyFunction, - AuthStrategyFunctionArgs, - CollectionPermission, - DocumentPermissions, - FieldPermissions, - GlobalPermission, - IncomingAuthType, - Permission, - Permissions, - User, - VerifyConfig, -} from './auth/types.js' -export { createClientCollectionConfig } from './collections/config/client.js' -export { createClientConfig } from './config/client.js' - -export { defaults } from './config/defaults.js' -export type { - BaseDatabaseAdapter, - BeginTransaction, - CommitTransaction, - Connect, - Count, - CountArgs, - Create, - CreateArgs, - CreateGlobal, - CreateGlobalArgs, - CreateGlobalVersion, - CreateGlobalVersionArgs, - CreateMigration, - CreateVersion, - CreateVersionArgs, - DBIdentifierName, - DatabaseAdapterResult as DatabaseAdapterObj, - DeleteMany, - DeleteManyArgs, - DeleteOne, - DeleteOneArgs, - DeleteVersions, - DeleteVersionsArgs, - Destroy, - Find, - FindArgs, - FindGlobal, - FindGlobalArgs, - FindGlobalVersions, - FindGlobalVersionsArgs, - FindOne, - FindOneArgs, - FindVersions, - FindVersionsArgs, - Init, - Migration, - MigrationData, - MigrationTemplateArgs, - PaginatedDocs, - QueryDrafts, - QueryDraftsArgs, - RollbackTransaction, - Transaction, - UpdateGlobal, - UpdateGlobalArgs, - UpdateGlobalVersion, - UpdateGlobalVersionArgs, - UpdateOne, - UpdateOneArgs, - UpdateVersion, - UpdateVersionArgs, -} from './database/types.js' -export { baseBlockFields } from './fields/baseFields/baseBlockFields.js' -export { baseIDField } from './fields/baseFields/baseIDField.js' -export { createClientFieldConfig } from './fields/config/client.js' -export { sanitizeFields } from './fields/config/sanitize.js' - -export { createClientGlobalConfig } from './globals/config/client.js' - -export type * from './database/queryValidation/types.js' - -export { accessOperation } from './auth/operations/access.js' -export { forgotPasswordOperation } from './auth/operations/forgotPassword.js' -export { initOperation } from './auth/operations/init.js' -export { loginOperation } from './auth/operations/login.js' - -export { logoutOperation } from './auth/operations/logout.js' -export { meOperation } from './auth/operations/me.js' -export { refreshOperation } from './auth/operations/refresh.js' -export { registerFirstUserOperation } from './auth/operations/registerFirstUser.js' -export { resetPasswordOperation } from './auth/operations/resetPassword.js' -export { unlockOperation } from './auth/operations/unlock.js' -export { verifyEmailOperation } from './auth/operations/verifyEmail.js' -export { countOperation } from './collections/operations/count.js' -export { createOperation } from './collections/operations/create.js' -export { deleteOperation } from './collections/operations/delete.js' -export { deleteByIDOperation } from './collections/operations/deleteByID.js' -export { docAccessOperation } from './collections/operations/docAccess.js' - -export { duplicateOperation } from './collections/operations/duplicate.js' -export { findOperation } from './collections/operations/find.js' -export { findByIDOperation } from './collections/operations/findByID.js' -export { findVersionByIDOperation } from './collections/operations/findVersionByID.js' -export { findVersionsOperation } from './collections/operations/findVersions.js' -export { restoreVersionOperation } from './collections/operations/restoreVersion.js' -export { updateOperation } from './collections/operations/update.js' -export { updateByIDOperation } from './collections/operations/updateByID.js' -export { sanitizeConfig } from './config/sanitize.js' -export type { EntityPolicies, PathToQuery } from './database/queryValidation/types.js' -export { default as getDefaultValue } from './fields/getDefaultValue.js' -export { default as sortableFieldTypes } from './fields/sortableFieldTypes.js' - -export { docAccessOperation as docAccessOperationGlobal } from './globals/operations/docAccess.js' -export { findOneOperation } from './globals/operations/findOne.js' -export { findVersionByIDOperation as findVersionByIDOperationGlobal } from './globals/operations/findVersionByID.js' -export { findVersionsOperation as findVersionsOperationGlobal } from './globals/operations/findVersions.js' -export { restoreVersionOperation as restoreVersionOperationGlobal } from './globals/operations/restoreVersion.js' -export { updateOperation as updateOperationGlobal } from './globals/operations/update.js' - -export * from './auth/index.js' -export { default as executeAccess } from './auth/executeAccess.js' -export { executeAuthStrategies } from './auth/executeAuthStrategies.js' -export { getAccessResults } from './auth/getAccessResults.js' -export { getFieldsToSign } from './auth/getFieldsToSign.js' -export { combineQueries } from './database/combineQueries.js' - -export { createDatabaseAdapter } from './database/createDatabaseAdapter.js' - -export { default as flattenWhereToOperators } from './database/flattenWhereToOperators.js' - -export { getLocalizedPaths } from './database/getLocalizedPaths.js' - -export { createMigration } from './database/migrations/createMigration.js' - -export { getMigrations } from './database/migrations/getMigrations.js' - -export { getPredefinedMigration } from './database/migrations/getPredefinedMigration.js' - -export { migrate } from './database/migrations/migrate.js' - -export { migrateDown } from './database/migrations/migrateDown.js' - -export { migrateRefresh } from './database/migrations/migrateRefresh.js' - -export { migrateReset } from './database/migrations/migrateReset.js' - -export { migrateStatus } from './database/migrations/migrateStatus.js' - -export { migrationTemplate } from './database/migrations/migrationTemplate.js' - -export { migrationsCollection } from './database/migrations/migrationsCollection.js' - -export { readMigrationFiles } from './database/migrations/readMigrationFiles.js' - -export { validateQueryPaths } from './database/queryValidation/validateQueryPaths.js' - -export { validateSearchParam } from './database/queryValidation/validateSearchParams.js' - -export { getFileByPath } from './uploads/getFileByPath.js' - -export { commitTransaction } from './utilities/commitTransaction.js' - -export { getDependencies } export { initTransaction } from './utilities/initTransaction.js' +export { isEntityHidden } from './utilities/isEntityHidden.js' + +export { isPlainObject } from './utilities/isPlainObject.js' + +export { isValidID } from './utilities/isValidID.js' + +export { default as isolateObjectProperty } from './utilities/isolateObjectProperty.js' + export { killTransaction } from './utilities/killTransaction.js' + +export { mapAsync } from './utilities/mapAsync.js' + +export { mergeListSearchAndWhere } from './utilities/mergeListSearchAndWhere.js' + +export { buildVersionCollectionFields } from './versions/buildCollectionFields.js' + +export { buildVersionGlobalFields } from './versions/buildGlobalFields.js' + +export { versionDefaults } from './versions/defaults.js' + +export { deleteCollectionVersions } from './versions/deleteCollectionVersions.js' + +export { enforceMaxVersions } from './versions/enforceMaxVersions.js' + +export { getLatestCollectionVersion } from './versions/getLatestCollectionVersion.js' + +export { getLatestGlobalVersion } from './versions/getLatestGlobalVersion.js' + +export { getDependencies } + +export { saveVersion } from './versions/saveVersion.js' + +export type { TypeWithVersion } from './versions/types.js' diff --git a/packages/payload/src/preferences/types.ts b/packages/payload/src/preferences/types.ts index b1819b961e..754e55adb8 100644 --- a/packages/payload/src/preferences/types.ts +++ b/packages/payload/src/preferences/types.ts @@ -8,7 +8,7 @@ export type PreferenceRequest = { user: PayloadRequest['user'] } -export type PreferenceUpdateRequest = PreferenceRequest & { value: unknown } +export type PreferenceUpdateRequest = { value: unknown } & PreferenceRequest export type CollapsedPreferences = string[] diff --git a/packages/payload/src/types/index.ts b/packages/payload/src/types/index.ts index 92719317a4..72042eb233 100644 --- a/packages/payload/src/types/index.ts +++ b/packages/payload/src/types/index.ts @@ -78,10 +78,10 @@ type PayloadRequestData = { tempFilePath?: string } } -export type PayloadRequest = Partial & - Required> & - CustomPayloadRequestProperties & - PayloadRequestData +export type PayloadRequest = CustomPayloadRequestProperties & + Partial & + PayloadRequestData & + Required> export interface RequestContext { [key: string]: unknown diff --git a/packages/payload/src/uploads/deleteAssociatedFiles.ts b/packages/payload/src/uploads/deleteAssociatedFiles.ts index 0cb8dbd58c..b4ce6d3dbe 100644 --- a/packages/payload/src/uploads/deleteAssociatedFiles.ts +++ b/packages/payload/src/uploads/deleteAssociatedFiles.ts @@ -43,11 +43,10 @@ export const deleteAssociatedFiles: (args: Args) => Promise = async ({ // Since forEach will not wait until unlink is finished it could // happen that two operations will try to delete the same file. // To avoid this it is recommended to use "sync" instead - // eslint-disable-next-line no-restricted-syntax + for (const size of sizes) { const sizeToDelete = `${staticPath}/${size.filename}` try { - // eslint-disable-next-line no-await-in-loop if (await fileExists(sizeToDelete)) { fs.unlinkSync(sizeToDelete) } diff --git a/packages/payload/src/uploads/getSafeFilename.ts b/packages/payload/src/uploads/getSafeFilename.ts index a33697f38a..1b2e100eee 100644 --- a/packages/payload/src/uploads/getSafeFilename.ts +++ b/packages/payload/src/uploads/getSafeFilename.ts @@ -37,7 +37,6 @@ export async function getSafeFileName({ }: Args): Promise { let modifiedFilename = desiredFilename - // eslint-disable-next-line no-await-in-loop while ( (await docWithFilenameExists({ collectionSlug, diff --git a/packages/payload/src/utilities/configToJSONSchema.spec.ts b/packages/payload/src/utilities/configToJSONSchema.spec.ts index b8238c2c49..a50446efed 100644 --- a/packages/payload/src/utilities/configToJSONSchema.spec.ts +++ b/packages/payload/src/utilities/configToJSONSchema.spec.ts @@ -1,8 +1,9 @@ +import type { JSONSchema4 } from 'json-schema' + import type { Config } from '../config/types.js' import { sanitizeConfig } from '../config/sanitize.js' import { configToJSONSchema } from './configToJSONSchema.js' -import { JSONSchema4 } from 'json-schema' describe('configToJSONSchema', () => { it('should handle optional arrays with required fields', async () => { @@ -10,6 +11,7 @@ describe('configToJSONSchema', () => { const config: Config = { collections: [ { + slug: 'test', fields: [ { name: 'someRequiredField', @@ -17,13 +19,12 @@ describe('configToJSONSchema', () => { fields: [ { name: 'someRequiredField', - required: true, type: 'text', + required: true, }, ], }, ], - slug: 'test', timestamps: false, }, ], @@ -33,13 +34,16 @@ describe('configToJSONSchema', () => { const schema = configToJSONSchema(sanitizedConfig, 'text') expect(schema?.definitions?.test).toStrictEqual({ + type: 'object', additionalProperties: false, properties: { id: { type: 'string', }, someRequiredField: { + type: ['array', 'null'], items: { + type: 'object', additionalProperties: false, properties: { id: { @@ -50,14 +54,11 @@ describe('configToJSONSchema', () => { }, }, required: ['someRequiredField'], - type: 'object', }, - type: ['array', 'null'], }, }, required: ['id'], title: 'Test', - type: 'object', }) }) @@ -66,44 +67,44 @@ describe('configToJSONSchema', () => { const config: Config = { collections: [ { + slug: 'test', fields: [ { type: 'tabs', tabs: [ { - label: 'unnamedTab', fields: [ { - type: 'text', name: 'fieldInUnnamedTab', + type: 'text', }, ], + label: 'unnamedTab', }, { - label: 'namedTab', name: 'namedTab', fields: [ { - type: 'text', name: 'fieldInNamedTab', + type: 'text', }, ], + label: 'namedTab', }, { - label: 'namedTabWithRequired', name: 'namedTabWithRequired', fields: [ { - type: 'text', name: 'fieldInNamedTab', + type: 'text', required: true, }, ], + label: 'namedTabWithRequired', }, ], }, ], - slug: 'test', timestamps: false, }, ], @@ -113,6 +114,7 @@ describe('configToJSONSchema', () => { const schema = configToJSONSchema(sanitizedConfig, 'text') expect(schema?.definitions?.test).toStrictEqual({ + type: 'object', additionalProperties: false, properties: { id: { @@ -122,8 +124,8 @@ describe('configToJSONSchema', () => { type: ['string', 'null'], }, namedTab: { - additionalProperties: false, type: 'object', + additionalProperties: false, properties: { fieldInNamedTab: { type: ['string', 'null'], @@ -132,8 +134,8 @@ describe('configToJSONSchema', () => { required: [], }, namedTabWithRequired: { - additionalProperties: false, type: 'object', + additionalProperties: false, properties: { fieldInNamedTab: { type: 'string', @@ -144,7 +146,6 @@ describe('configToJSONSchema', () => { }, required: ['id', 'namedTabWithRequired'], title: 'Test', - type: 'object', }) }) @@ -162,23 +163,23 @@ describe('configToJSONSchema', () => { const config: Partial = { collections: [ { + slug: 'test', fields: [ { - type: 'text', name: 'withCustom', + type: 'text', typescriptSchema: [() => customSchema], }, { - type: 'json', name: 'jsonWithSchema', + type: 'json', jsonSchema: { - uri: 'a://b/foo.json', fileMatch: ['a://b/foo.json'], schema: customSchema, + uri: 'a://b/foo.json', }, }, ], - slug: 'test', timestamps: false, }, ], @@ -188,17 +189,17 @@ describe('configToJSONSchema', () => { const schema = configToJSONSchema(sanitizedConfig, 'text') expect(schema?.definitions?.test).toStrictEqual({ + type: 'object', additionalProperties: false, properties: { id: { type: 'string', }, - withCustom: customSchema, jsonWithSchema: customSchema, + withCustom: customSchema, }, required: ['id'], title: 'Test', - type: 'object', }) }) }) diff --git a/packages/payload/src/utilities/convertData.ts b/packages/payload/src/utilities/convertData.ts index 3ee427f60c..d86d1ab94c 100644 --- a/packages/payload/src/utilities/convertData.ts +++ b/packages/payload/src/utilities/convertData.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ const convertArrayToObject = (arr, key) => arr.reduce((obj, item) => { if (key) { diff --git a/packages/payload/src/utilities/getEntityPolicies.ts b/packages/payload/src/utilities/getEntityPolicies.ts index f5452cc537..4ae8b6371e 100644 --- a/packages/payload/src/utilities/getEntityPolicies.ts +++ b/packages/payload/src/utilities/getEntityPolicies.ts @@ -40,7 +40,7 @@ export async function getEntityPolicies(args: T): Promise { + async function getEntityDoc({ where }: { where?: Where } = {}): Promise { if (entity.slug) { if (type === 'global') { return payload.findGlobal({ diff --git a/packages/payload/src/versions/drafts/replaceWithDraftIfAvailable.ts b/packages/payload/src/versions/drafts/replaceWithDraftIfAvailable.ts index 01eea49a23..494a045b3b 100644 --- a/packages/payload/src/versions/drafts/replaceWithDraftIfAvailable.ts +++ b/packages/payload/src/versions/drafts/replaceWithDraftIfAvailable.ts @@ -60,7 +60,7 @@ const replaceWithDraftIfAvailable = async ({ versionAccessResult = appendVersionToQueryKey(accessResult) } - const findVersionsArgs: FindVersionsArgs & FindGlobalVersionsArgs = { + const findVersionsArgs: FindGlobalVersionsArgs & FindVersionsArgs = { collection: entity.slug, global: entity.slug, limit: 1, diff --git a/packages/payload/src/versions/getLatestGlobalVersion.ts b/packages/payload/src/versions/getLatestGlobalVersion.ts index 534fb98d66..42303c0595 100644 --- a/packages/payload/src/versions/getLatestGlobalVersion.ts +++ b/packages/payload/src/versions/getLatestGlobalVersion.ts @@ -23,7 +23,6 @@ export const getLatestGlobalVersion = async ({ let latestVersion if (config.versions?.drafts) { - // eslint-disable-next-line prefer-destructuring latestVersion = ( await payload.db.findGlobalVersions({ global: slug, diff --git a/packages/plugin-cloud-storage/src/adapters/azure/staticHandler.ts b/packages/plugin-cloud-storage/src/adapters/azure/staticHandler.ts index ece33650eb..d8997bbaa0 100644 --- a/packages/plugin-cloud-storage/src/adapters/azure/staticHandler.ts +++ b/packages/plugin-cloud-storage/src/adapters/azure/staticHandler.ts @@ -24,7 +24,7 @@ export const getHandler = ({ collection, getStorageClient }: Args): StaticHandle const { end, start } = await getRangeFromHeader(blockBlobClient, req.headers.get('range')) const blob = await blockBlobClient.download(start, end) - // eslint-disable-next-line no-underscore-dangle + const response = blob._response // Manually create a ReadableStream for the web from a Node.js stream. diff --git a/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleUpload.ts b/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleUpload.ts index 9d127f4174..a7f877a6b8 100644 --- a/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleUpload.ts +++ b/packages/plugin-cloud-storage/src/adapters/vercelBlob/handleUpload.ts @@ -5,11 +5,11 @@ import path from 'path' import type { VercelBlobAdapterUploadOptions } from './index.js' -type HandleUploadArgs = VercelBlobAdapterUploadOptions & { +type HandleUploadArgs = { baseUrl: string prefix?: string token: string -} +} & VercelBlobAdapterUploadOptions export const getHandleUpload = ({ access = 'public', diff --git a/packages/plugin-cloud-storage/src/types.ts b/packages/plugin-cloud-storage/src/types.ts index 568b4e4ff2..c9019a0e3a 100644 --- a/packages/plugin-cloud-storage/src/types.ts +++ b/packages/plugin-cloud-storage/src/types.ts @@ -28,7 +28,7 @@ export interface TypeWithPrefix { export type HandleDelete = (args: { collection: CollectionConfig - doc: TypeWithID & FileData & TypeWithPrefix + doc: FileData & TypeWithID & TypeWithPrefix filename: string req: PayloadRequest }) => Promise | void diff --git a/packages/plugin-cloud/src/email.spec.ts b/packages/plugin-cloud/src/email.spec.ts index 8e01eb5feb..9dbc5bf28a 100644 --- a/packages/plugin-cloud/src/email.spec.ts +++ b/packages/plugin-cloud/src/email.spec.ts @@ -1,8 +1,7 @@ -import type { Config } from 'payload' -import type { Payload } from 'payload' -import nodemailer from 'nodemailer' -import { jest } from '@jest/globals' +import type { Config, Payload } from 'payload' +import { jest } from '@jest/globals' +import nodemailer from 'nodemailer' import { defaults } from 'payload' import { payloadCloudEmail } from './email.js' @@ -70,9 +69,9 @@ describe('email', () => { apiKey, config: configWithFrom, defaultDomain, - skipVerify, - defaultFromName, defaultFromAddress, + defaultFromName, + skipVerify, }) const initializedEmail = email({ payload: mockedPayload }) diff --git a/packages/plugin-cloud/src/plugin.spec.ts b/packages/plugin-cloud/src/plugin.spec.ts index ee99dc5e5d..cb2a4d1e21 100644 --- a/packages/plugin-cloud/src/plugin.spec.ts +++ b/packages/plugin-cloud/src/plugin.spec.ts @@ -1,12 +1,11 @@ -import type { Config } from 'payload' -import type { Payload } from 'payload' -import { jest } from '@jest/globals' +import type { Config, Payload } from 'payload' +import { jest } from '@jest/globals' +import { nodemailerAdapter } from '@payloadcms/email-nodemailer' import nodemailer from 'nodemailer' import { defaults } from 'payload' import { payloadCloudPlugin } from './plugin.js' -import { nodemailerAdapter } from '@payloadcms/email-nodemailer' const mockedPayload: Payload = jest.fn() as unknown as Payload @@ -18,10 +17,10 @@ describe('plugin', () => { beforeEach(() => { createTransportSpy = jest.spyOn(nodemailer, 'createTransport').mockImplementationOnce(() => { return { - verify: jest.fn(), transporter: { name: 'Nodemailer - SMTP', }, + verify: jest.fn(), } as unknown as ReturnType }) @@ -33,7 +32,6 @@ describe('plugin', () => { }) describe('not in Payload Cloud', () => { - // eslint-disable-next-line jest/expect-expect it('should return unmodified config', async () => { const plugin = payloadCloudPlugin() const config = await plugin(createConfig()) @@ -69,7 +67,6 @@ describe('plugin', () => { }) describe('email', () => { - // eslint-disable-next-line jest/expect-expect it('should default to using payload cloud email', async () => { const plugin = payloadCloudPlugin() const config = await plugin(createConfig()) @@ -81,7 +78,6 @@ describe('plugin', () => { ) }) - // eslint-disable-next-line jest/expect-expect it('should allow opt-out', async () => { const plugin = payloadCloudPlugin({ email: false }) const config = await plugin(createConfig()) @@ -89,7 +85,6 @@ describe('plugin', () => { expect(config.email).toBeUndefined() }) - // eslint-disable-next-line jest/expect-expect it('should allow PAYLOAD_CLOUD_EMAIL_* env vars to be unset', async () => { delete process.env.PAYLOAD_CLOUD_EMAIL_API_KEY delete process.env.PAYLOAD_CLOUD_DEFAULT_DOMAIN @@ -116,8 +111,8 @@ describe('plugin', () => { email: await nodemailerAdapter({ defaultFromAddress: 'test@test.com', defaultFromName: 'Test', - transport: existingTransport, skipVerify, + transport: existingTransport, }), }) diff --git a/packages/plugin-cloud/src/types.ts b/packages/plugin-cloud/src/types.ts index f067b25366..7665a7556d 100644 --- a/packages/plugin-cloud/src/types.ts +++ b/packages/plugin-cloud/src/types.ts @@ -21,7 +21,7 @@ export interface TypeWithPrefix { export type HandleDelete = (args: { collection: CollectionConfig - doc: TypeWithID & FileData & TypeWithPrefix + doc: FileData & TypeWithID & TypeWithPrefix filename: string req: PayloadRequest }) => Promise | void diff --git a/packages/plugin-form-builder/src/collections/Forms/fields.ts b/packages/plugin-form-builder/src/collections/Forms/fields.ts index 8b393b8734..c3e528094c 100644 --- a/packages/plugin-form-builder/src/collections/Forms/fields.ts +++ b/packages/plugin-form-builder/src/collections/Forms/fields.ts @@ -572,7 +572,7 @@ const Message: Block = { }, } -// eslint-disable-next-line @typescript-eslint/consistent-type-assertions + export const fields = { checkbox: Checkbox, country: Country, diff --git a/packages/plugin-form-builder/src/types.ts b/packages/plugin-form-builder/src/types.ts index e8090eb0a1..86b3237c7d 100644 --- a/packages/plugin-form-builder/src/types.ts +++ b/packages/plugin-form-builder/src/types.ts @@ -17,9 +17,9 @@ export interface FieldValues { [key: string]: boolean | null | number | string | undefined } -export type PaymentFieldConfig = Partial & { +export type PaymentFieldConfig = { paymentProcessor: Partial -} +} & Partial export type FieldConfig = Partial | PaymentFieldConfig @@ -44,8 +44,8 @@ export type FieldsOverride = (args: { defaultFields: Field[] }) => Field[] export type FormBuilderPluginConfig = { beforeEmail?: BeforeEmail fields?: FieldsConfig - formOverrides?: Partial> & { fields?: FieldsOverride } - formSubmissionOverrides?: Partial> & { fields?: FieldsOverride } + formOverrides?: { fields?: FieldsOverride } & Partial> + formSubmissionOverrides?: { fields?: FieldsOverride } & Partial> handlePayment?: HandlePayment redirectRelationships?: string[] } diff --git a/packages/plugin-form-builder/src/utilities/getPaymentTotal.ts b/packages/plugin-form-builder/src/utilities/getPaymentTotal.ts index 0250a65343..6b74c02ae9 100644 --- a/packages/plugin-form-builder/src/utilities/getPaymentTotal.ts +++ b/packages/plugin-form-builder/src/utilities/getPaymentTotal.ts @@ -1,9 +1,9 @@ import type { FieldValues, PaymentField, PriceCondition } from '../types.js' export const getPaymentTotal = ( - args: Partial & { + args: { fieldValues: FieldValues - }, + } & Partial, ): number => { const { basePrice = 0, fieldValues, priceConditions } = args diff --git a/packages/plugin-form-builder/src/utilities/lexical/types.ts b/packages/plugin-form-builder/src/utilities/lexical/types.ts index d6f95fdb53..d22aae1fcf 100644 --- a/packages/plugin-form-builder/src/utilities/lexical/types.ts +++ b/packages/plugin-form-builder/src/utilities/lexical/types.ts @@ -15,6 +15,6 @@ export type HTMLConverter = { nodeTypes: string[] } -export type SerializedLexicalNodeWithParent = any & { +export type SerializedLexicalNodeWithParent = { parent?: any -} +} & any diff --git a/packages/plugin-form-builder/src/utilities/slate/serializeSlate.ts b/packages/plugin-form-builder/src/utilities/slate/serializeSlate.ts index 83c913939e..493c7ba3b0 100644 --- a/packages/plugin-form-builder/src/utilities/slate/serializeSlate.ts +++ b/packages/plugin-form-builder/src/utilities/slate/serializeSlate.ts @@ -12,7 +12,7 @@ interface Node { url?: string } -const isTextNode = (node: Node): node is Node & { text: string } => { +const isTextNode = (node: Node): node is { text: string } & Node => { return 'text' in node } diff --git a/packages/plugin-nested-docs/src/fields/parent.ts b/packages/plugin-nested-docs/src/fields/parent.ts index 3e982d1ec7..422f6b0ce1 100644 --- a/packages/plugin-nested-docs/src/fields/parent.ts +++ b/packages/plugin-nested-docs/src/fields/parent.ts @@ -3,9 +3,9 @@ import type { SingleRelationshipField } from 'payload' export const createParentField = ( relationTo: string, overrides?: Partial< - SingleRelationshipField & { + { hasMany: false - } + } & SingleRelationshipField >, ): SingleRelationshipField => ({ name: 'parent', diff --git a/packages/plugin-nested-docs/src/utilities/populateBreadcrumbs.ts b/packages/plugin-nested-docs/src/utilities/populateBreadcrumbs.ts index 671db1d51c..c024553804 100644 --- a/packages/plugin-nested-docs/src/utilities/populateBreadcrumbs.ts +++ b/packages/plugin-nested-docs/src/utilities/populateBreadcrumbs.ts @@ -33,7 +33,7 @@ export const populateBreadcrumbs = async ( const breadcrumbs = breadcrumbDocs.map((_, i) => formatBreadcrumb(pluginConfig, collection, breadcrumbDocs.slice(0, i + 1)), - ) // eslint-disable-line function-paren-newline + ) return { ...newData, diff --git a/packages/plugin-redirects/src/types.ts b/packages/plugin-redirects/src/types.ts index b75008011b..3a6d90af49 100644 --- a/packages/plugin-redirects/src/types.ts +++ b/packages/plugin-redirects/src/types.ts @@ -4,5 +4,5 @@ export type FieldsOverride = (args: { defaultFields: Field[] }) => Field[] export type RedirectsPluginConfig = { collections?: string[] - overrides?: Partial> & { fields?: FieldsOverride } + overrides?: { fields?: FieldsOverride } & Partial> } diff --git a/packages/plugin-search/src/Search/ui/index.client.tsx b/packages/plugin-search/src/Search/ui/index.client.tsx index 9b06f7e773..1e0b956c1c 100644 --- a/packages/plugin-search/src/Search/ui/index.client.tsx +++ b/packages/plugin-search/src/Search/ui/index.client.tsx @@ -7,14 +7,14 @@ import React from 'react' // TODO: fix this import to work in dev mode within the monorepo in a way that is backwards compatible with 1.x // import CopyToClipboard from 'payload/dist/admin/components/elements/CopyToClipboard' -type FieldsWithDoc = FormState & { +type FieldsWithDoc = { doc: { value: { relationTo: string value: string } } -} +} & FormState export const LinkToDocClient: React.FC = () => { const form = useWatchForm() diff --git a/packages/plugin-sentry/src/plugin.spec.ts b/packages/plugin-sentry/src/plugin.spec.ts index 8961c0a003..9c6dd96f7e 100644 --- a/packages/plugin-sentry/src/plugin.spec.ts +++ b/packages/plugin-sentry/src/plugin.spec.ts @@ -1,11 +1,12 @@ import type { Config } from 'payload' + import { defaults } from 'payload' import { sentryPlugin } from './plugin' describe('plugin', () => { it('should run the plugin', () => { - const plugin = sentryPlugin({ enabled: true, dsn: 'asdf' }) + const plugin = sentryPlugin({ dsn: 'asdf', enabled: true }) const config = plugin(createConfig()) assertPluginRan(config) @@ -19,14 +20,14 @@ describe('plugin', () => { }) it('should not run if dsn is not provided', () => { - const plugin = sentryPlugin({ enabled: true, dsn: null }) + const plugin = sentryPlugin({ dsn: null, enabled: true }) const config = plugin(createConfig()) assertPluginDidNotRun(config) }) it('should respect enabled: false', () => { - const plugin = sentryPlugin({ enabled: false, dsn: null }) + const plugin = sentryPlugin({ dsn: null, enabled: false }) const config = plugin(createConfig()) assertPluginDidNotRun(config) diff --git a/packages/plugin-sentry/src/plugin.ts b/packages/plugin-sentry/src/plugin.ts index 4761623dde..26c0e5afd8 100644 --- a/packages/plugin-sentry/src/plugin.ts +++ b/packages/plugin-sentry/src/plugin.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import type { Config } from 'payload' import type { PluginOptions } from './types.js' diff --git a/packages/plugin-sentry/src/startSentry.ts b/packages/plugin-sentry/src/startSentry.ts index fbaf726d67..ab9eadbc1f 100644 --- a/packages/plugin-sentry/src/startSentry.ts +++ b/packages/plugin-sentry/src/startSentry.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ import type { NextFunction, Request, Response } from 'express' import type express from 'express' import type { Payload } from 'payload' @@ -50,7 +49,7 @@ export const startSentry = (pluginOptions: PluginOptions, payload: Payload): voi app.use(function onError( _err: unknown, _req: Request, - res: Response & { sentry?: string }, + res: { sentry?: string } & Response, _next: NextFunction, ) { res.statusCode = 500 diff --git a/packages/plugin-seo/src/fields/MetaDescription/MetaDescriptionComponent.tsx b/packages/plugin-seo/src/fields/MetaDescription/MetaDescriptionComponent.tsx index 71cc934cce..826e7c0ab4 100644 --- a/packages/plugin-seo/src/fields/MetaDescription/MetaDescriptionComponent.tsx +++ b/packages/plugin-seo/src/fields/MetaDescription/MetaDescriptionComponent.tsx @@ -22,11 +22,10 @@ import { LengthIndicator } from '../../ui/LengthIndicator.js' const { maxLength, minLength } = defaults.description -// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents -type MetaDescriptionProps = FormFieldBase & { +type MetaDescriptionProps = { hasGenerateDescriptionFn: boolean path: string -} +} & FormFieldBase export const MetaDescriptionComponent: React.FC = (props) => { const { CustomLabel, hasGenerateDescriptionFn, label, labelProps, required } = props diff --git a/packages/plugin-seo/src/fields/MetaImage/MetaImageComponent.tsx b/packages/plugin-seo/src/fields/MetaImage/MetaImageComponent.tsx index b3b11c605d..d162e1639b 100644 --- a/packages/plugin-seo/src/fields/MetaImage/MetaImageComponent.tsx +++ b/packages/plugin-seo/src/fields/MetaImage/MetaImageComponent.tsx @@ -20,10 +20,9 @@ import type { GenerateImage } from '../../types.js' import { Pill } from '../../ui/Pill.js' -// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents -type MetaImageProps = UploadInputProps & { +type MetaImageProps = { hasGenerateImageFn: boolean -} +} & UploadInputProps export const MetaImageComponent: React.FC = (props) => { const { CustomLabel, hasGenerateImageFn, label, labelProps, relationTo, required } = props || {} diff --git a/packages/plugin-seo/src/fields/MetaTitle/MetaTitleComponent.tsx b/packages/plugin-seo/src/fields/MetaTitle/MetaTitleComponent.tsx index 3b071ea580..aec97f4f0b 100644 --- a/packages/plugin-seo/src/fields/MetaTitle/MetaTitleComponent.tsx +++ b/packages/plugin-seo/src/fields/MetaTitle/MetaTitleComponent.tsx @@ -23,10 +23,9 @@ import '../index.scss' const { maxLength, minLength } = defaults.title -// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents -type MetaTitleProps = FormFieldBase & { +type MetaTitleProps = { hasGenerateTitleFn: boolean -} +} & FormFieldBase export const MetaTitleComponent: React.FC = (props) => { const { CustomLabel, hasGenerateTitleFn, label, labelProps, required } = props || {} diff --git a/packages/plugin-seo/src/fields/Overview/OverviewComponent.tsx b/packages/plugin-seo/src/fields/Overview/OverviewComponent.tsx index 9e79cf87f1..57ac51c00c 100644 --- a/packages/plugin-seo/src/fields/Overview/OverviewComponent.tsx +++ b/packages/plugin-seo/src/fields/Overview/OverviewComponent.tsx @@ -14,11 +14,11 @@ const { title: { maxLength: maxTitle, minLength: minTitle }, } = defaults -type OverviewProps = UIField & { +type OverviewProps = { descriptionPath?: string imagePath?: string titlePath?: string -} +} & UIField export const OverviewComponent: React.FC = ({ descriptionPath: descriptionPathFromContext, diff --git a/packages/plugin-seo/src/fields/Preview/PreviewComponent.tsx b/packages/plugin-seo/src/fields/Preview/PreviewComponent.tsx index 3f081be2cf..18be062540 100644 --- a/packages/plugin-seo/src/fields/Preview/PreviewComponent.tsx +++ b/packages/plugin-seo/src/fields/Preview/PreviewComponent.tsx @@ -15,11 +15,11 @@ import React, { useEffect, useState } from 'react' import type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations/index.js' import type { GenerateURL } from '../../types.js' -type PreviewProps = UIField & { +type PreviewProps = { descriptionPath?: string hasGenerateURLFn: boolean titlePath?: string -} +} & UIField export const PreviewComponent: React.FC = ({ descriptionPath: descriptionPathFromContext, diff --git a/packages/plugin-seo/src/index.tsx b/packages/plugin-seo/src/index.tsx index b030223c6a..407c7dba5d 100644 --- a/packages/plugin-seo/src/index.tsx +++ b/packages/plugin-seo/src/index.tsx @@ -74,7 +74,6 @@ export const seoPlugin = }, ...(pluginConfig?.uploadsCollection ? [ - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions { name: 'image', type: 'upload', diff --git a/packages/plugin-seo/src/types.ts b/packages/plugin-seo/src/types.ts index dd376a1670..932e811ddb 100644 --- a/packages/plugin-seo/src/types.ts +++ b/packages/plugin-seo/src/types.ts @@ -2,22 +2,22 @@ import type { DocumentInfoContext } from '@payloadcms/ui' import type { Field, TextField, TextareaField, UploadField } from 'payload' export type GenerateTitle = ( - args: DocumentInfoContext & { doc: T; locale?: string }, + args: { doc: T; locale?: string } & DocumentInfoContext, ) => Promise | string export type GenerateDescription = ( - args: DocumentInfoContext & { + args: { doc: T locale?: string - }, + } & DocumentInfoContext, ) => Promise | string export type GenerateImage = ( - args: DocumentInfoContext & { doc: T; locale?: string }, + args: { doc: T; locale?: string } & DocumentInfoContext, ) => Promise | string export type GenerateURL = ( - args: DocumentInfoContext & { doc: T; locale?: string }, + args: { doc: T; locale?: string } & DocumentInfoContext, ) => Promise | string export type SEOPluginConfig = { diff --git a/packages/plugin-stripe/src/hooks/createNewInStripe.ts b/packages/plugin-stripe/src/hooks/createNewInStripe.ts index c6e67c3d4f..5ee18aee5f 100644 --- a/packages/plugin-stripe/src/hooks/createNewInStripe.ts +++ b/packages/plugin-stripe/src/hooks/createNewInStripe.ts @@ -11,18 +11,15 @@ const stripeSecretKey = process.env.STRIPE_SECRET_KEY // api version can only be the latest, stripe recommends ts ignoring it const stripe = new Stripe(stripeSecretKey || '', { apiVersion: '2022-08-01' }) -type HookArgsWithCustomCollection = Omit< - Parameters[0], - 'collection' -> & { +type HookArgsWithCustomCollection = { collection: CollectionConfig -} +} & Omit[0], 'collection'> export type CollectionBeforeValidateHookWithArgs = ( - args: HookArgsWithCustomCollection & { + args: { collection?: CollectionConfig pluginConfig?: StripePluginConfig - }, + } & HookArgsWithCustomCollection, ) => void export const createNewInStripe: CollectionBeforeValidateHookWithArgs = async (args) => { diff --git a/packages/plugin-stripe/src/hooks/deleteFromStripe.ts b/packages/plugin-stripe/src/hooks/deleteFromStripe.ts index 8b6cee68ee..1f739aa72a 100644 --- a/packages/plugin-stripe/src/hooks/deleteFromStripe.ts +++ b/packages/plugin-stripe/src/hooks/deleteFromStripe.ts @@ -9,15 +9,15 @@ const stripeSecretKey = process.env.STRIPE_SECRET_KEY // api version can only be the latest, stripe recommends ts ignoring it const stripe = new Stripe(stripeSecretKey || '', { apiVersion: '2022-08-01' }) -type HookArgsWithCustomCollection = Omit[0], 'collection'> & { +type HookArgsWithCustomCollection = { collection: CollectionConfig -} +} & Omit[0], 'collection'> export type CollectionAfterDeleteHookWithArgs = ( - args: HookArgsWithCustomCollection & { + args: { collection?: CollectionConfig pluginConfig?: StripePluginConfig - }, + } & HookArgsWithCustomCollection, ) => void export const deleteFromStripe: CollectionAfterDeleteHookWithArgs = async (args) => { diff --git a/packages/plugin-stripe/src/hooks/syncExistingWithStripe.ts b/packages/plugin-stripe/src/hooks/syncExistingWithStripe.ts index 12ceae8873..1b1446d98a 100644 --- a/packages/plugin-stripe/src/hooks/syncExistingWithStripe.ts +++ b/packages/plugin-stripe/src/hooks/syncExistingWithStripe.ts @@ -11,18 +11,15 @@ const stripeSecretKey = process.env.STRIPE_SECRET_KEY // api version can only be the latest, stripe recommends ts ignoring it const stripe = new Stripe(stripeSecretKey || '', { apiVersion: '2022-08-01' }) -type HookArgsWithCustomCollection = Omit< - Parameters[0], - 'collection' -> & { +type HookArgsWithCustomCollection = { collection: CollectionConfig -} +} & Omit[0], 'collection'> export type CollectionBeforeChangeHookWithArgs = ( - args: HookArgsWithCustomCollection & { + args: { collection?: CollectionConfig pluginConfig?: StripePluginConfig - }, + } & HookArgsWithCustomCollection, ) => void export const syncExistingWithStripe: CollectionBeforeChangeHookWithArgs = async (args) => { diff --git a/packages/plugin-stripe/src/types.ts b/packages/plugin-stripe/src/types.ts index f1901e5560..fd4056f107 100644 --- a/packages/plugin-stripe/src/types.ts +++ b/packages/plugin-stripe/src/types.ts @@ -37,9 +37,9 @@ export type StripePluginConfig = { webhooks?: StripeWebhookHandler | StripeWebhookHandlers } -export type SanitizedStripePluginConfig = StripePluginConfig & { +export type SanitizedStripePluginConfig = { sync: SyncConfig[] // convert to required -} +} & StripePluginConfig export type StripeProxy = (args: { stripeArgs: any[] diff --git a/packages/plugin-stripe/src/webhooks/handleCreatedOrUpdated.ts b/packages/plugin-stripe/src/webhooks/handleCreatedOrUpdated.ts index fd03f262ab..0b6a215521 100644 --- a/packages/plugin-stripe/src/webhooks/handleCreatedOrUpdated.ts +++ b/packages/plugin-stripe/src/webhooks/handleCreatedOrUpdated.ts @@ -5,10 +5,10 @@ import type { SanitizedStripePluginConfig, StripeWebhookHandler } from '../types import { deepen } from '../utilities/deepen.js' type HandleCreatedOrUpdated = ( - args: Parameters[0] & { + args: { resourceType: string syncConfig: SanitizedStripePluginConfig['sync'][0] - }, + } & Parameters[0], ) => void export const handleCreatedOrUpdated: HandleCreatedOrUpdated = async (args) => { diff --git a/packages/plugin-stripe/src/webhooks/handleDeleted.ts b/packages/plugin-stripe/src/webhooks/handleDeleted.ts index e90a65eae3..7dc3ddab7c 100644 --- a/packages/plugin-stripe/src/webhooks/handleDeleted.ts +++ b/packages/plugin-stripe/src/webhooks/handleDeleted.ts @@ -1,10 +1,10 @@ import type { SanitizedStripePluginConfig, StripeWebhookHandler } from '../types.js' type HandleDeleted = ( - args: Parameters[0] & { + args: { resourceType: string syncConfig: SanitizedStripePluginConfig['sync'][0] - }, + } & Parameters[0], ) => void export const handleDeleted: HandleDeleted = async (args) => { diff --git a/packages/richtext-lexical/src/features/converters/html/converter/types.ts b/packages/richtext-lexical/src/features/converters/html/converter/types.ts index 925467c374..a9d7a3e08c 100644 --- a/packages/richtext-lexical/src/features/converters/html/converter/types.ts +++ b/packages/richtext-lexical/src/features/converters/html/converter/types.ts @@ -21,6 +21,6 @@ export type HTMLConverter({}) + const [stateData, setStateData] = useState<({ id?: string; text: string } & LinkFields) | {}>({}) const { closeModal, toggleModal } = useModal() const editDepth = useEditDepth() @@ -102,7 +102,7 @@ export function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.R } // Initial state: - const data: LinkFields & { text: string } = { + const data: { text: string } & LinkFields = { doc: undefined, linkType: undefined, newTab: undefined, @@ -321,7 +321,7 @@ export function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.R handleDrawerSubmit={(fields: FormState, data: Data) => { closeModal(drawerSlug) - const newLinkPayload = data as LinkFields & { text: string } + const newLinkPayload = data as { text: string } & LinkFields const bareLinkFields: LinkFields = { ...newLinkPayload, diff --git a/packages/richtext-lexical/src/features/link/validate.ts b/packages/richtext-lexical/src/features/link/validate.ts index aa01d8e0c8..43addabbf6 100644 --- a/packages/richtext-lexical/src/features/link/validate.ts +++ b/packages/richtext-lexical/src/features/link/validate.ts @@ -9,7 +9,6 @@ import type { SerializedAutoLinkNode, SerializedLinkNode } from './nodes/types.j export const linkValidation = ( props: LinkFeatureServerProps, sanitizedFieldsWithoutText: Field[], - // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents ): NodeValidation => { return async ({ node, diff --git a/packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/types.ts b/packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/types.ts index e0cdce061b..388882f0a2 100644 --- a/packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/types.ts +++ b/packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/types.ts @@ -10,7 +10,7 @@ export type LexicalPluginNodeConverter T nodeTypes: string[] diff --git a/packages/richtext-lexical/src/features/relationship/feature.server.ts b/packages/richtext-lexical/src/features/relationship/feature.server.ts index bfacbd41ba..91d72e9d21 100644 --- a/packages/richtext-lexical/src/features/relationship/feature.server.ts +++ b/packages/richtext-lexical/src/features/relationship/feature.server.ts @@ -31,7 +31,7 @@ export type ExclusiveRelationshipFeatureProps = enabledCollections?: CollectionSlug[] } -export type RelationshipFeatureProps = ExclusiveRelationshipFeatureProps & { +export type RelationshipFeatureProps = { /** * Sets a maximum population depth for this relationship, regardless of the remaining depth when the respective field is reached. * This behaves exactly like the maxDepth properties of relationship and upload fields. @@ -39,7 +39,7 @@ export type RelationshipFeatureProps = ExclusiveRelationshipFeatureProps & { * {@link https://payloadcms.com/docs/getting-started/concepts#field-level-max-depth} */ maxDepth?: number -} +} & ExclusiveRelationshipFeatureProps export const RelationshipFeature = createServerFeature< RelationshipFeatureProps, diff --git a/packages/richtext-lexical/src/features/relationship/nodes/RelationshipNode.tsx b/packages/richtext-lexical/src/features/relationship/nodes/RelationshipNode.tsx index 4110ebba90..adb766aefb 100644 --- a/packages/richtext-lexical/src/features/relationship/nodes/RelationshipNode.tsx +++ b/packages/richtext-lexical/src/features/relationship/nodes/RelationshipNode.tsx @@ -27,10 +27,10 @@ export type RelationshipData = { value: number | string } -export type SerializedRelationshipNode = Spread & { +export type SerializedRelationshipNode = { children?: never // required so that our typed editor state doesn't automatically add children type: 'relationship' -} +} & Spread function $relationshipElementToNode(domNode: HTMLDivElement): DOMConversionOutput | null { const id = domNode.getAttribute('data-lexical-relationship-id') 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 7f4bf78dc8..58b7c58850 100644 --- a/packages/richtext-lexical/src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx +++ b/packages/richtext-lexical/src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx @@ -216,7 +216,6 @@ export function DropDown({ const handle = (event: MouseEvent): void => { const { target } = event if (stopCloseOnClickSelf != null) { - // eslint-disable-next-line @typescript-eslint/prefer-optional-chain if (dropDownRef.current != null && dropDownRef.current.contains(target as Node)) { return } diff --git a/packages/richtext-lexical/src/features/typesClient.ts b/packages/richtext-lexical/src/features/typesClient.ts index 7ff4697189..96997fee18 100644 --- a/packages/richtext-lexical/src/features/typesClient.ts +++ b/packages/richtext-lexical/src/features/typesClient.ts @@ -153,10 +153,10 @@ export type ClientComponentProps = ClientFeatureProps extend order: number } & ClientFeatureProps -export type ResolvedClientFeature = ClientFeature & { +export type ResolvedClientFeature = { key: string order: number -} +} & ClientFeature export type ResolvedClientFeatureMap = Map> @@ -208,12 +208,7 @@ export type SanitizedPlugin = position: 'belowContainer' } -export type SanitizedClientFeatures = Required< - Pick< - ResolvedClientFeature, - 'markdownTransformers' | 'nodes' | 'providers' | 'toolbarFixed' | 'toolbarInline' - > -> & { +export type SanitizedClientFeatures = { /** The keys of all enabled features */ enabledFeatures: string[] hooks: { @@ -252,4 +247,9 @@ export type SanitizedClientFeatures = Required< */ groups: SlashMenuGroup[] } -} +} & Required< + Pick< + ResolvedClientFeature, + 'markdownTransformers' | 'nodes' | 'providers' | 'toolbarFixed' | 'toolbarInline' + > +> diff --git a/packages/richtext-lexical/src/features/typesServer.ts b/packages/richtext-lexical/src/features/typesServer.ts index 9b35c8e7f5..54dec607a4 100644 --- a/packages/richtext-lexical/src/features/typesServer.ts +++ b/packages/richtext-lexical/src/features/typesServer.ts @@ -211,11 +211,11 @@ export type AfterChangeNodeHook = ( ) => Promise | T export type BeforeChangeNodeHook = ( - args: BeforeChangeNodeHookArgs & BaseNodeHookArgs, + args: BaseNodeHookArgs & BeforeChangeNodeHookArgs, ) => Promise | T export type BeforeValidateNodeHook = ( - args: BeforeValidateNodeHookArgs & BaseNodeHookArgs, + args: BaseNodeHookArgs & BeforeValidateNodeHookArgs, ) => Promise | T // Define the node with hooks that use the node's exportJSON return type @@ -343,26 +343,21 @@ export type ServerFeature = { sanitizedServerFeatureProps?: ServerProps } -export type ResolvedServerFeature = ServerFeature< - ServerProps, - ClientFeatureProps +export type ResolvedServerFeature = { + order: number +} & Required< + Pick< + FeatureProviderServer, + 'dependencies' | 'dependenciesPriority' | 'dependenciesSoft' | 'key' + > > & - Required< - Pick< - FeatureProviderServer, - 'dependencies' | 'dependenciesPriority' | 'dependenciesSoft' | 'key' - > - > & { - order: number - } + ServerFeature export type ResolvedServerFeatureMap = Map> export type ServerFeatureProviderMap = Map> -export type SanitizedServerFeatures = Required< - Pick, 'i18n' | 'markdownTransformers' | 'nodes'> -> & { +export type SanitizedServerFeatures = { /** The node types mapped to their converters */ converters: { html: HTMLConverter[] @@ -413,4 +408,4 @@ export type SanitizedServerFeatures = Required< } /** The node types mapped to their populationPromises */ /** The node types mapped to their validations */ validations: Map> -} +} & Required, 'i18n' | 'markdownTransformers' | 'nodes'>> diff --git a/packages/richtext-lexical/src/features/upload/feature.server.ts b/packages/richtext-lexical/src/features/upload/feature.server.ts index a404769ffc..388a775940 100644 --- a/packages/richtext-lexical/src/features/upload/feature.server.ts +++ b/packages/richtext-lexical/src/features/upload/feature.server.ts @@ -105,7 +105,7 @@ export const UploadFeature = createServerFeature< if (req?.payload) { const uploadDocument: { - value?: TypeWithID & FileData + value?: FileData & TypeWithID } = {} try { @@ -158,9 +158,9 @@ export const UploadFeature = createServerFeature< // Iterate through each size in the data.sizes object for (const size in uploadDocument.value?.sizes) { - const imageSize: FileSize & { + const imageSize: { url?: string - } = uploadDocument.value?.sizes[size] + } & FileSize = uploadDocument.value?.sizes[size] // Skip if any property of the size object is null if ( diff --git a/packages/richtext-lexical/src/features/upload/nodes/UploadNode.tsx b/packages/richtext-lexical/src/features/upload/nodes/UploadNode.tsx index b78361479f..c42cef8019 100644 --- a/packages/richtext-lexical/src/features/upload/nodes/UploadNode.tsx +++ b/packages/richtext-lexical/src/features/upload/nodes/UploadNode.tsx @@ -67,10 +67,10 @@ function $convertUploadElement(domNode: HTMLImageElement): DOMConversionOutput | return null } -export type SerializedUploadNode = Spread & { +export type SerializedUploadNode = { children?: never // required so that our typed editor state doesn't automatically add children type: 'upload' -} +} & Spread export class UploadNode extends DecoratorBlockNode { __data: UploadData @@ -166,7 +166,6 @@ export class UploadNode extends DecoratorBlockNode { writable.__data = data } - // eslint-disable-next-line class-methods-use-this updateDOM(): false { return false } diff --git a/packages/richtext-lexical/src/field/Field.tsx b/packages/richtext-lexical/src/field/Field.tsx index be407d05a2..b0710cb4be 100644 --- a/packages/richtext-lexical/src/field/Field.tsx +++ b/packages/richtext-lexical/src/field/Field.tsx @@ -22,12 +22,12 @@ import './index.scss' const baseClass = 'rich-text-lexical' const _RichText: React.FC< - FormFieldBase & { + { editorConfig: SanitizedClientEditorConfig // With rendered features n stuff name: string richTextComponentMap: Map width?: string - } + } & FormFieldBase > = (props) => { const { name, diff --git a/packages/richtext-lexical/src/lexical/LexicalEditor.tsx b/packages/richtext-lexical/src/lexical/LexicalEditor.tsx index e305ff2282..66c0521f1d 100644 --- a/packages/richtext-lexical/src/lexical/LexicalEditor.tsx +++ b/packages/richtext-lexical/src/lexical/LexicalEditor.tsx @@ -22,9 +22,9 @@ import { DraggableBlockPlugin } from './plugins/handles/DraggableBlockPlugin/ind import { LexicalContentEditable } from './ui/ContentEditable.js' export const LexicalEditor: React.FC< - Pick & { + { editorContainerRef: React.RefObject - } + } & Pick > = (props) => { const { editorConfig, editorContainerRef, onChange } = props const editorConfigContext = useEditorConfigContext() diff --git a/packages/richtext-lexical/src/lexical/LexicalProvider.tsx b/packages/richtext-lexical/src/lexical/LexicalProvider.tsx index edef3d104b..60837ea4b2 100644 --- a/packages/richtext-lexical/src/lexical/LexicalProvider.tsx +++ b/packages/richtext-lexical/src/lexical/LexicalProvider.tsx @@ -18,11 +18,11 @@ import { getEnabledNodes } from './nodes/index.js' export type LexicalProviderProps = { editorConfig: SanitizedClientEditorConfig - fieldProps: FormFieldBase & { + fieldProps: { editorConfig: SanitizedClientEditorConfig // With rendered features n stuff name: string richTextComponentMap: Map - } + } & FormFieldBase onChange: (editorState: EditorState, editor: LexicalEditor, tags: Set) => void path: string readOnly: boolean diff --git a/packages/richtext-lexical/src/lexical/config/client/EditorConfigProvider.tsx b/packages/richtext-lexical/src/lexical/config/client/EditorConfigProvider.tsx index 1ecd9b38ac..e1a9ce2083 100644 --- a/packages/richtext-lexical/src/lexical/config/client/EditorConfigProvider.tsx +++ b/packages/richtext-lexical/src/lexical/config/client/EditorConfigProvider.tsx @@ -21,11 +21,11 @@ export interface EditorConfigContextType { editor: LexicalEditor editorConfig: SanitizedClientEditorConfig editorContainerRef: React.RefObject - field: FormFieldBase & { + field: { editorConfig: SanitizedClientEditorConfig // With rendered features n stuff name: string richTextComponentMap: Map - } + } & FormFieldBase // Editor focus handling focusEditor: (editorContext: EditorConfigContextType) => void focusedEditor: EditorConfigContextType | null @@ -51,11 +51,11 @@ export const EditorConfigProvider = ({ children: React.ReactNode editorConfig: SanitizedClientEditorConfig editorContainerRef: React.RefObject - fieldProps: FormFieldBase & { + fieldProps: { editorConfig: SanitizedClientEditorConfig // With rendered features n stuff name: string richTextComponentMap: Map - } + } & FormFieldBase parentContext?: EditorConfigContextType }): React.ReactNode => { const [editor] = useLexicalComposerContext() diff --git a/packages/richtext-lexical/src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.ts b/packages/richtext-lexical/src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.ts index f1c556eac0..483aa34258 100644 --- a/packages/richtext-lexical/src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.ts +++ b/packages/richtext-lexical/src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.ts @@ -33,10 +33,10 @@ export type SlashMenuGroup = { label?: (({ i18n }: { i18n: I18nClient<{}, string> }) => string) | string } -export type SlashMenuItemInternal = SlashMenuItem & { +export type SlashMenuItemInternal = { ref: MutableRefObject -} +} & SlashMenuItem -export type SlashMenuGroupInternal = SlashMenuGroup & { +export type SlashMenuGroupInternal = { items: Array -} +} & SlashMenuGroup diff --git a/packages/richtext-lexical/src/populateGraphQL/populate.ts b/packages/richtext-lexical/src/populateGraphQL/populate.ts index 67821a6d56..9f78a0b747 100644 --- a/packages/richtext-lexical/src/populateGraphQL/populate.ts +++ b/packages/richtext-lexical/src/populateGraphQL/populate.ts @@ -24,10 +24,10 @@ export const populate = async ({ overrideAccess, req, showHiddenFields, -}: Arguments & { +}: { collectionSlug: string id: number | string -}): Promise => { +} & Arguments): Promise => { const shouldPopulate = depth && currentDepth <= depth // usually depth is checked within recursivelyPopulateFieldsForGraphQL. But since this populate function can be called outside of that (in rest afterRead node hooks) we need to check here too if (!shouldPopulate) { diff --git a/packages/richtext-lexical/src/populateGraphQL/populateLexicalPopulationPromises.ts b/packages/richtext-lexical/src/populateGraphQL/populateLexicalPopulationPromises.ts index 09a0b7c058..50365409c2 100644 --- a/packages/richtext-lexical/src/populateGraphQL/populateLexicalPopulationPromises.ts +++ b/packages/richtext-lexical/src/populateGraphQL/populateLexicalPopulationPromises.ts @@ -6,11 +6,9 @@ import type { AdapterProps } from '../types.js' import { recurseNodes } from '../utilities/forEachNodeRecursively.js' -export type Args = Parameters< - RichTextAdapter['graphQLPopulationPromises'] ->[0] & { +export type Args = { editorPopulationPromises: Map> -} +} & Parameters['graphQLPopulationPromises']>[0] /** * Appends all new populationPromises to the populationPromises prop diff --git a/packages/richtext-lexical/src/types.ts b/packages/richtext-lexical/src/types.ts index b50e8b3924..40b0ff0442 100644 --- a/packages/richtext-lexical/src/types.ts +++ b/packages/richtext-lexical/src/types.ts @@ -55,10 +55,10 @@ export type LexicalEditorProps = { lexical?: LexicalEditorConfig } -export type LexicalRichTextAdapter = RichTextAdapter & { +export type LexicalRichTextAdapter = { editorConfig: SanitizedServerEditorConfig features: FeatureProviderServer[] -} +} & RichTextAdapter export type LexicalRichTextAdapterProvider = /** @@ -72,12 +72,12 @@ export type LexicalRichTextAdapterProvider = isRoot?: boolean }) => Promise -export type FieldProps = RichTextFieldProps & { +export type FieldProps = { fieldTypes: FieldTypes indexPath: string path?: string permissions: FieldPermissions -} +} & RichTextFieldProps export type AdapterProps = { editorConfig: SanitizedServerEditorConfig diff --git a/packages/richtext-lexical/src/utilities/createServerFeature.ts b/packages/richtext-lexical/src/utilities/createServerFeature.ts index 858f5b9280..06498cafd2 100644 --- a/packages/richtext-lexical/src/utilities/createServerFeature.ts +++ b/packages/richtext-lexical/src/utilities/createServerFeature.ts @@ -9,10 +9,7 @@ import type { } from '../features/typesServer.js' import type { ServerEditorConfig } from '../lexical/config/types.js' -export type CreateServerFeatureArgs = Pick< - FeatureProviderServer, - 'dependencies' | 'dependenciesPriority' | 'dependenciesSoft' | 'key' -> & { +export type CreateServerFeatureArgs = { feature: | ((props: { config: SanitizedConfig @@ -28,7 +25,10 @@ export type CreateServerFeatureArgs> | ServerFeature) | Omit, 'sanitizedServerFeatureProps'> -} +} & Pick< + FeatureProviderServer, + 'dependencies' | 'dependenciesPriority' | 'dependenciesSoft' | 'key' +> export const createServerFeature: < UnSanitizedProps = undefined, diff --git a/packages/richtext-slate/src/data/populate.ts b/packages/richtext-slate/src/data/populate.ts index 5c6540c5a8..593da378db 100644 --- a/packages/richtext-slate/src/data/populate.ts +++ b/packages/richtext-slate/src/data/populate.ts @@ -27,11 +27,11 @@ export const populate = async ({ overrideAccess, req, showHiddenFields, -}: Omit & { +}: { collection: Collection field: Field id: string -}): Promise => { +} & Omit): Promise => { const dataRef = data as Record const doc = await req.payloadDataLoader.load( diff --git a/packages/richtext-slate/src/field/RichText.tsx b/packages/richtext-slate/src/field/RichText.tsx index 6c1fb9d5d8..6de60a712c 100644 --- a/packages/richtext-slate/src/field/RichText.tsx +++ b/packages/richtext-slate/src/field/RichText.tsx @@ -43,14 +43,14 @@ const baseClass = 'rich-text' declare module 'slate' { interface CustomTypes { - Editor: BaseEditor & ReactEditor & HistoryEditor + Editor: BaseEditor & HistoryEditor & ReactEditor Element: ElementNode Text: TextNode } } const RichTextField: React.FC< - FormFieldBase & { + { elements: EnabledFeatures['elements'] leaves: EnabledFeatures['leaves'] name: string @@ -58,7 +58,7 @@ const RichTextField: React.FC< plugins: RichTextPlugin[] richTextComponentMap: Map width?: string - } + } & FormFieldBase > = (props) => { const { name, diff --git a/packages/richtext-slate/src/field/elements/link/types.ts b/packages/richtext-slate/src/field/elements/link/types.ts index 8242f9f0d2..bb852ac44b 100644 --- a/packages/richtext-slate/src/field/elements/link/types.ts +++ b/packages/richtext-slate/src/field/elements/link/types.ts @@ -1,9 +1,9 @@ import type { Element } from 'slate' -export type LinkElementType = Element & { +export type LinkElementType = { doc: Record fields: Record linkType: string newTab: boolean url: string -} +} & Element diff --git a/packages/richtext-slate/src/field/elements/relationship/Element/index.tsx b/packages/richtext-slate/src/field/elements/relationship/Element/index.tsx index 22fd491a59..60df6aed7c 100644 --- a/packages/richtext-slate/src/field/elements/relationship/Element/index.tsx +++ b/packages/richtext-slate/src/field/elements/relationship/Element/index.tsx @@ -27,10 +27,10 @@ const initialParams = { depth: 0, } -type Props = FormFieldBase & { +type Props = { name: string richTextComponentMap: Map -} +} & FormFieldBase const RelationshipElement: React.FC = () => { const { diff --git a/packages/richtext-slate/src/field/elements/relationship/types.ts b/packages/richtext-slate/src/field/elements/relationship/types.ts index 66a7ff9479..48300ac073 100644 --- a/packages/richtext-slate/src/field/elements/relationship/types.ts +++ b/packages/richtext-slate/src/field/elements/relationship/types.ts @@ -1,8 +1,8 @@ import type { Element } from 'slate' -export type RelationshipElementType = Element & { +export type RelationshipElementType = { relationTo: string value: { id: number | string } | null -} +} & Element diff --git a/packages/richtext-slate/src/field/elements/upload/Element/UploadDrawer/index.tsx b/packages/richtext-slate/src/field/elements/upload/Element/UploadDrawer/index.tsx index d08f069cf8..0a0f50171f 100644 --- a/packages/richtext-slate/src/field/elements/upload/Element/UploadDrawer/index.tsx +++ b/packages/richtext-slate/src/field/elements/upload/Element/UploadDrawer/index.tsx @@ -29,10 +29,10 @@ import { uploadFieldsSchemaPath } from '../../shared.js' export const UploadDrawer: React.FC<{ drawerSlug: string element: UploadElementType - fieldProps: FormFieldBase & { + fieldProps: { name: string richTextComponentMap: Map - } + } & FormFieldBase relatedCollection: ClientCollectionConfig schemaPath: string }> = (props) => { diff --git a/packages/richtext-slate/src/field/elements/upload/Element/index.tsx b/packages/richtext-slate/src/field/elements/upload/Element/index.tsx index dd4620f1d9..7b9738ba30 100644 --- a/packages/richtext-slate/src/field/elements/upload/Element/index.tsx +++ b/packages/richtext-slate/src/field/elements/upload/Element/index.tsx @@ -33,12 +33,12 @@ const initialParams = { depth: 0, } -type Props = FormFieldBase & { +type Props = { name: string richTextComponentMap: Map -} +} & FormFieldBase -const UploadElement: React.FC = ({ +const UploadElement: React.FC<{ enabledCollectionSlugs?: string[] } & Props> = ({ enabledCollectionSlugs, }) => { const { diff --git a/packages/richtext-slate/src/field/elements/upload/types.ts b/packages/richtext-slate/src/field/elements/upload/types.ts index 0012c0ab49..d6d5ca0a60 100644 --- a/packages/richtext-slate/src/field/elements/upload/types.ts +++ b/packages/richtext-slate/src/field/elements/upload/types.ts @@ -1,9 +1,9 @@ import type { Element } from 'slate' -export type UploadElementType = Element & { +export type UploadElementType = { fields: Record relationTo: string value: { id: number | string } | null -} +} & Element diff --git a/packages/richtext-slate/src/field/index.tsx b/packages/richtext-slate/src/field/index.tsx index 5a738bb06f..cbdd5164ff 100644 --- a/packages/richtext-slate/src/field/index.tsx +++ b/packages/richtext-slate/src/field/index.tsx @@ -17,10 +17,10 @@ const RichTextEditor = lazy(() => ) export const RichTextField: React.FC< - FormFieldBase & { + { name: string richTextComponentMap: Map - } + } & FormFieldBase > = (props) => { const { richTextComponentMap } = props diff --git a/packages/richtext-slate/src/field/providers/ElementButtonProvider.tsx b/packages/richtext-slate/src/field/providers/ElementButtonProvider.tsx index 7208214c2c..3ff82e44ee 100644 --- a/packages/richtext-slate/src/field/providers/ElementButtonProvider.tsx +++ b/packages/richtext-slate/src/field/providers/ElementButtonProvider.tsx @@ -6,10 +6,10 @@ import React from 'react' type ElementButtonContextType = { disabled?: boolean - fieldProps: FormFieldBase & { + fieldProps: { name: string richTextComponentMap: Map - } + } & FormFieldBase path: string schemaPath: string } @@ -21,9 +21,9 @@ const ElementButtonContext = React.createContext({ }) export const ElementButtonProvider: React.FC< - ElementButtonContextType & { + { children: React.ReactNode - } + } & ElementButtonContextType > = (props) => { const { children, ...rest } = props diff --git a/packages/richtext-slate/src/field/providers/ElementProvider.tsx b/packages/richtext-slate/src/field/providers/ElementProvider.tsx index 34859ca06e..8d0064bb12 100644 --- a/packages/richtext-slate/src/field/providers/ElementProvider.tsx +++ b/packages/richtext-slate/src/field/providers/ElementProvider.tsx @@ -9,10 +9,10 @@ type ElementContextType = { children: React.ReactNode editorRef: React.MutableRefObject element: T - fieldProps: FormFieldBase & { + fieldProps: { name: string richTextComponentMap: Map - } + } & FormFieldBase path: string schemaPath: string } @@ -28,9 +28,9 @@ const ElementContext = React.createContext>({ }) export const ElementProvider: React.FC< - ElementContextType & { + { childNodes: React.ReactNode - } + } & ElementContextType > = (props) => { const { childNodes, children, ...rest } = props diff --git a/packages/richtext-slate/src/field/providers/LeafButtonProvider.tsx b/packages/richtext-slate/src/field/providers/LeafButtonProvider.tsx index 453d04cf0a..ec33422d03 100644 --- a/packages/richtext-slate/src/field/providers/LeafButtonProvider.tsx +++ b/packages/richtext-slate/src/field/providers/LeafButtonProvider.tsx @@ -5,9 +5,9 @@ import type { FormFieldBase } from '@payloadcms/ui' import React from 'react' type LeafButtonContextType = { - fieldProps: FormFieldBase & { + fieldProps: { name: string - } + } & FormFieldBase path: string schemaPath: string } @@ -19,9 +19,9 @@ const LeafButtonContext = React.createContext({ }) export const LeafButtonProvider: React.FC< - LeafButtonContextType & { + { children: React.ReactNode - } + } & LeafButtonContextType > = (props) => { const { children, ...rest } = props diff --git a/packages/richtext-slate/src/field/providers/LeafProvider.tsx b/packages/richtext-slate/src/field/providers/LeafProvider.tsx index 38da43b14f..3f52a5f9a8 100644 --- a/packages/richtext-slate/src/field/providers/LeafProvider.tsx +++ b/packages/richtext-slate/src/field/providers/LeafProvider.tsx @@ -8,9 +8,9 @@ type LeafContextType = { attributes: Record children: React.ReactNode editorRef: React.MutableRefObject - fieldProps: FormFieldBase & { + fieldProps: { name: string - } + } & FormFieldBase leaf: string path: string schemaPath: string @@ -27,9 +27,9 @@ const LeafContext = React.createContext({ }) export const LeafProvider: React.FC< - LeafContextType & { + { result: React.ReactNode - } + } & LeafContextType > = (props) => { const { children, result, ...rest } = props diff --git a/packages/storage-azure/src/staticHandler.ts b/packages/storage-azure/src/staticHandler.ts index b05c493dff..f24f4a14ba 100644 --- a/packages/storage-azure/src/staticHandler.ts +++ b/packages/storage-azure/src/staticHandler.ts @@ -26,7 +26,7 @@ export const getHandler = ({ collection, getStorageClient }: Args): StaticHandle ) const blob = await blockBlobClient.download(start, end) - // eslint-disable-next-line no-underscore-dangle + const response = blob._response // Manually create a ReadableStream for the web from a Node.js stream. diff --git a/packages/storage-uploadthing/src/index.ts b/packages/storage-uploadthing/src/index.ts index fbc15386f0..5a9cc5732a 100644 --- a/packages/storage-uploadthing/src/index.ts +++ b/packages/storage-uploadthing/src/index.ts @@ -31,12 +31,12 @@ export type UploadthingStorageOptions = { /** * Uploadthing Options */ - options: UTApiOptions & { + options: { /** * @default 'public-read' */ acl?: ACL - } + } & UTApiOptions } type UploadthingPlugin = (uploadthingStorageOptions: UploadthingStorageOptions) => Plugin diff --git a/packages/storage-vercel-blob/src/handleUpload.ts b/packages/storage-vercel-blob/src/handleUpload.ts index e5b0afb32b..f6291a26ab 100644 --- a/packages/storage-vercel-blob/src/handleUpload.ts +++ b/packages/storage-vercel-blob/src/handleUpload.ts @@ -5,10 +5,10 @@ import path from 'path' import type { VercelBlobStorageOptions } from './index.js' -type HandleUploadArgs = Omit & { +type HandleUploadArgs = { baseUrl: string prefix?: string -} +} & Omit export const getHandleUpload = ({ access = 'public', diff --git a/packages/storage-vercel-blob/src/index.ts b/packages/storage-vercel-blob/src/index.ts index aacf4885bd..dc89cf31c3 100644 --- a/packages/storage-vercel-blob/src/index.ts +++ b/packages/storage-vercel-blob/src/index.ts @@ -132,7 +132,7 @@ export const vercelBlobStorage: VercelBlobStoragePlugin = } function vercelBlobStorageInternal( - options: VercelBlobStorageOptions & { baseUrl: string }, + options: { baseUrl: string } & VercelBlobStorageOptions, ): Adapter { return ({ collection, prefix }): GeneratedAdapter => { const { access, addRandomSuffix, baseUrl, cacheControlMaxAge, token } = options diff --git a/packages/translations/src/exports/index.ts b/packages/translations/src/exports/index.ts index 416cec3c0d..b2cad1383c 100644 --- a/packages/translations/src/exports/index.ts +++ b/packages/translations/src/exports/index.ts @@ -1,5 +1,5 @@ export { importDateFNSLocale } from '../importDateFNSLocale.js' +export type * from '../types.js' export { getTranslation } from '../utilities/getTranslation.js' export { initI18n, t } from '../utilities/init.js' export { acceptedLanguages, extractHeaderLanguage, rtlLanguages } from '../utilities/languages.js' -export type * from '../types.js' diff --git a/packages/translations/src/utilities/init.ts b/packages/translations/src/utilities/init.ts index ded7cebce2..59c8ba6eac 100644 --- a/packages/translations/src/utilities/init.ts +++ b/packages/translations/src/utilities/init.ts @@ -161,9 +161,9 @@ function memoize( fn: (args: Parameters[0]) => Promise, keys: string[], ): ( - args: Parameters[0] & { + args: { context: 'api' | 'client' - }, + } & Parameters[0], ) => Promise { const cacheMap = new Map() diff --git a/packages/ui/src/elements/CodeEditor/types.ts b/packages/ui/src/elements/CodeEditor/types.ts index 6914cdc223..538a347273 100644 --- a/packages/ui/src/elements/CodeEditor/types.ts +++ b/packages/ui/src/elements/CodeEditor/types.ts @@ -1,5 +1,5 @@ import type { EditorProps } from '@monaco-editor/react' -export type Props = EditorProps & { +export type Props = { readOnly?: boolean -} +} & EditorProps diff --git a/packages/ui/src/elements/DatePicker/types.ts b/packages/ui/src/elements/DatePicker/types.ts index 37f76731fb..ab16254008 100644 --- a/packages/ui/src/elements/DatePicker/types.ts +++ b/packages/ui/src/elements/DatePicker/types.ts @@ -1,10 +1,10 @@ import type { DayPickerProps, SharedProps, TimePickerProps } from 'payload' -export type Props = SharedProps & - DayPickerProps & - TimePickerProps & { - onChange?: (val: Date) => void - placeholder?: string - readOnly?: boolean - value?: Date - } +export type Props = { + onChange?: (val: Date) => void + placeholder?: string + readOnly?: boolean + value?: Date +} & DayPickerProps & + SharedProps & + TimePickerProps diff --git a/packages/ui/src/elements/DocumentDrawer/types.ts b/packages/ui/src/elements/DocumentDrawer/types.ts index 4b18760180..b10a3e216e 100644 --- a/packages/ui/src/elements/DocumentDrawer/types.ts +++ b/packages/ui/src/elements/DocumentDrawer/types.ts @@ -4,21 +4,21 @@ import type { HTMLAttributes } from 'react' import type { DocumentInfoContext } from '../../providers/DocumentInfo/types.js' import type { Props as DrawerProps } from '../Drawer/types.js' -export type DocumentDrawerProps = Pick & { +export type DocumentDrawerProps = { collectionSlug: string drawerSlug?: string id?: null | number | string onSave?: DocumentInfoContext['onSave'] -} +} & Pick -export type DocumentTogglerProps = HTMLAttributes & { +export type DocumentTogglerProps = { children?: React.ReactNode className?: string collectionSlug: string disabled?: boolean drawerSlug?: string id?: string -} +} & HTMLAttributes export type UseDocumentDrawer = (args: { collectionSlug: string; id?: number | string }) => [ React.FC>, // drawer diff --git a/packages/ui/src/elements/DraggableSortable/DraggableSortableItem/index.tsx b/packages/ui/src/elements/DraggableSortable/DraggableSortableItem/index.tsx index 905dd4f327..f020f627f3 100644 --- a/packages/ui/src/elements/DraggableSortable/DraggableSortableItem/index.tsx +++ b/packages/ui/src/elements/DraggableSortable/DraggableSortableItem/index.tsx @@ -8,9 +8,9 @@ import type { ChildFunction } from './types.js' import { useDraggableSortable } from '../useDraggableSortable/index.js' export const DraggableSortableItem: React.FC< - UseDraggableArguments & { + { children: ChildFunction - } + } & UseDraggableArguments > = (props) => { const { id, children, disabled } = props diff --git a/packages/ui/src/elements/DraggableSortable/DraggableSortableItem/types.ts b/packages/ui/src/elements/DraggableSortable/DraggableSortableItem/types.ts index 0425710f7f..a19d0ad928 100644 --- a/packages/ui/src/elements/DraggableSortable/DraggableSortableItem/types.ts +++ b/packages/ui/src/elements/DraggableSortable/DraggableSortableItem/types.ts @@ -4,13 +4,13 @@ import type React from 'react' import type { UseDraggableSortableReturn } from '../useDraggableSortable/types.js' -export type DragHandleProps = UseDraggableArguments & { +export type DragHandleProps = { attributes: UseDraggableArguments['attributes'] listeners: SyntheticListenerMap -} +} & UseDraggableArguments export type ChildFunction = (args: UseDraggableSortableReturn) => React.ReactNode -export type Props = UseDraggableArguments & { +export type Props = { children: ChildFunction -} +} & UseDraggableArguments diff --git a/packages/ui/src/elements/Drawer/types.ts b/packages/ui/src/elements/Drawer/types.ts index b938219638..3dd4109992 100644 --- a/packages/ui/src/elements/Drawer/types.ts +++ b/packages/ui/src/elements/Drawer/types.ts @@ -10,9 +10,9 @@ export type Props = { title?: string } -export type TogglerProps = HTMLAttributes & { +export type TogglerProps = { children: React.ReactNode className?: string disabled?: boolean slug: string -} +} & HTMLAttributes diff --git a/packages/ui/src/elements/FileDetails/index.tsx b/packages/ui/src/elements/FileDetails/index.tsx index 0f0a4aec6d..dea5e53062 100644 --- a/packages/ui/src/elements/FileDetails/index.tsx +++ b/packages/ui/src/elements/FileDetails/index.tsx @@ -14,9 +14,9 @@ import type { Data, FileSizes, SanitizedCollectionConfig } from 'payload' export type FileDetailsProps = { collectionSlug: string customUploadActions?: React.ReactNode[] - doc: Data & { + doc: { sizes?: FileSizes - } + } & Data enableAdjustments?: boolean handleRemove?: () => void hasImageSizes?: boolean diff --git a/packages/ui/src/elements/ListDrawer/types.ts b/packages/ui/src/elements/ListDrawer/types.ts index f3def70ddb..52f95ca211 100644 --- a/packages/ui/src/elements/ListDrawer/types.ts +++ b/packages/ui/src/elements/ListDrawer/types.ts @@ -11,12 +11,12 @@ export type ListDrawerProps = { selectedCollection?: string } -export type ListTogglerProps = HTMLAttributes & { +export type ListTogglerProps = { children?: React.ReactNode className?: string disabled?: boolean drawerSlug?: string -} +} & HTMLAttributes export type UseListDrawer = (args: { collectionSlugs?: string[] diff --git a/packages/ui/src/elements/Pill/index.tsx b/packages/ui/src/elements/Pill/index.tsx index 6d66e69694..6447d2a063 100644 --- a/packages/ui/src/elements/Pill/index.tsx +++ b/packages/ui/src/elements/Pill/index.tsx @@ -14,9 +14,9 @@ export type PillProps = { children?: React.ReactNode className?: string draggable?: boolean - elementProps?: HTMLAttributes & { + elementProps?: { ref: React.RefCallback - } + } & HTMLAttributes icon?: React.ReactNode id?: string onClick?: () => void diff --git a/packages/ui/src/elements/PreviewSizes/index.tsx b/packages/ui/src/elements/PreviewSizes/index.tsx index bfda2c1296..da43faa370 100644 --- a/packages/ui/src/elements/PreviewSizes/index.tsx +++ b/packages/ui/src/elements/PreviewSizes/index.tsx @@ -8,9 +8,9 @@ import './index.scss' const baseClass = 'preview-sizes' -type FileInfo = FileSize & { +type FileInfo = { url: string -} +} & FileSize type FilesSizesWithUrl = { [key: string]: FileInfo } @@ -68,9 +68,9 @@ const PreviewSizeCard: React.FC = ({ } export type PreviewSizesProps = { - doc: Data & { + doc: { sizes?: FilesSizesWithUrl - } + } & Data imageCacheTag?: string uploadConfig: SanitizedCollectionConfig['upload'] } diff --git a/packages/ui/src/elements/ReactSelect/Control/index.tsx b/packages/ui/src/elements/ReactSelect/Control/index.tsx index 6715d22e88..e66ff29b5f 100644 --- a/packages/ui/src/elements/ReactSelect/Control/index.tsx +++ b/packages/ui/src/elements/ReactSelect/Control/index.tsx @@ -31,7 +31,7 @@ export const Control: React.FC> = (props) => { }, // react-select has this typed incorrectly so we disable the linting rule // we need to prevent react-select from hijacking the 'onKeyDown' event while modals are open (i.e. the 'Relationship' field component) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment + onMouseDown: (e) => { // we need to prevent react-select from hijacking the 'onMouseDown' event while modals are open (i.e. the 'Relationship' field component) if (!disableMouseDown) { diff --git a/packages/ui/src/elements/ReactSelect/DropdownIndicator/index.tsx b/packages/ui/src/elements/ReactSelect/DropdownIndicator/index.tsx index 6396207157..addcd8bc60 100644 --- a/packages/ui/src/elements/ReactSelect/DropdownIndicator/index.tsx +++ b/packages/ui/src/elements/ReactSelect/DropdownIndicator/index.tsx @@ -10,9 +10,9 @@ import './index.scss' const baseClass = 'dropdown-indicator' export const DropdownIndicator: React.FC< - DropdownIndicatorProps & { + { innerProps: JSX.IntrinsicElements['button'] - } + } & DropdownIndicatorProps > = (props) => { const { innerProps: { ref, ...restInnerProps }, diff --git a/packages/ui/src/elements/ReactSelect/MultiValueRemove/index.tsx b/packages/ui/src/elements/ReactSelect/MultiValueRemove/index.tsx index b095463619..5c25cfe71c 100644 --- a/packages/ui/src/elements/ReactSelect/MultiValueRemove/index.tsx +++ b/packages/ui/src/elements/ReactSelect/MultiValueRemove/index.tsx @@ -13,9 +13,9 @@ import './index.scss' const baseClass = 'multi-value-remove' export const MultiValueRemove: React.FC< - MultiValueRemoveProps & { + { innerProps: JSX.IntrinsicElements['button'] - } + } & MultiValueRemoveProps > = (props) => { const { innerProps: { className, onClick, onTouchEnd }, diff --git a/packages/ui/src/elements/ReactSelect/index.tsx b/packages/ui/src/elements/ReactSelect/index.tsx index 34462ccea5..5cfc6a9186 100644 --- a/packages/ui/src/elements/ReactSelect/index.tsx +++ b/packages/ui/src/elements/ReactSelect/index.tsx @@ -111,7 +111,6 @@ const SelectAdapter: React.FC = (props) => { ) } const handleKeyDown: KeyboardEventHandler = (event) => { - // eslint-disable-next-line no-restricted-globals if (numberOnly === true) { const acceptableKeys = [ 'Tab', diff --git a/packages/ui/src/elements/ReactSelect/types.ts b/packages/ui/src/elements/ReactSelect/types.ts index 51538c8181..60e50ab929 100644 --- a/packages/ui/src/elements/ReactSelect/types.ts +++ b/packages/ui/src/elements/ReactSelect/types.ts @@ -29,7 +29,7 @@ declare module 'react-select/dist/declarations/src' { IsMulti extends boolean, Group extends GroupBase