diff --git a/examples/form-builder/next-app/components/Blocks/Form/Country/index.tsx b/examples/form-builder/next-app/components/Blocks/Form/Country/index.tsx index 823690bc872..2d72c1a6a0b 100644 --- a/examples/form-builder/next-app/components/Blocks/Form/Country/index.tsx +++ b/examples/form-builder/next-app/components/Blocks/Form/Country/index.tsx @@ -1,5 +1,5 @@ import type { CountryField } from 'payload-plugin-form-builder/dist/types' -import type { Control, FieldErrorsImpl, FieldValues } from 'react-hook-form'; +import type { Control, FieldErrorsImpl, FieldValues } from 'react-hook-form' import React from 'react' import { Controller } from 'react-hook-form' diff --git a/examples/form-builder/next-app/components/Blocks/Form/Select/index.tsx b/examples/form-builder/next-app/components/Blocks/Form/Select/index.tsx index f52e7e18d05..3dd283f57b2 100644 --- a/examples/form-builder/next-app/components/Blocks/Form/Select/index.tsx +++ b/examples/form-builder/next-app/components/Blocks/Form/Select/index.tsx @@ -1,5 +1,5 @@ import type { SelectField } from 'payload-plugin-form-builder/dist/types' -import type { Control, FieldErrorsImpl, FieldValues } from 'react-hook-form'; +import type { Control, FieldErrorsImpl, FieldValues } from 'react-hook-form' import React from 'react' import { Controller } from 'react-hook-form' diff --git a/examples/form-builder/next-app/components/Blocks/Form/State/index.tsx b/examples/form-builder/next-app/components/Blocks/Form/State/index.tsx index b798cfc21d5..21d47c7de20 100644 --- a/examples/form-builder/next-app/components/Blocks/Form/State/index.tsx +++ b/examples/form-builder/next-app/components/Blocks/Form/State/index.tsx @@ -1,5 +1,5 @@ import type { StateField } from 'payload-plugin-form-builder/dist/types' -import type { Control, FieldErrorsImpl, FieldValues } from 'react-hook-form'; +import type { Control, FieldErrorsImpl, FieldValues } from 'react-hook-form' import React from 'react' import { Controller } from 'react-hook-form' diff --git a/examples/form-builder/next-app/components/CloseModalOnRouteChange/index.tsx b/examples/form-builder/next-app/components/CloseModalOnRouteChange/index.tsx index a9d9fe3e616..fc46168d369 100644 --- a/examples/form-builder/next-app/components/CloseModalOnRouteChange/index.tsx +++ b/examples/form-builder/next-app/components/CloseModalOnRouteChange/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type React from 'react'; +import type React from 'react' import { useModal } from '@faceless-ui/modal' import { usePathname } from 'next/navigation' diff --git a/examples/form-builder/next-app/components/Gutter/index.tsx b/examples/form-builder/next-app/components/Gutter/index.tsx index c1b7c918b52..fa7da778e84 100644 --- a/examples/form-builder/next-app/components/Gutter/index.tsx +++ b/examples/form-builder/next-app/components/Gutter/index.tsx @@ -1,4 +1,4 @@ -import type { Ref } from 'react'; +import type { Ref } from 'react' import React, { forwardRef } from 'react' diff --git a/examples/live-preview/next-app/package.json b/examples/live-preview/next-app/package.json index 93211e879a5..0befbabb90f 100644 --- a/examples/live-preview/next-app/package.json +++ b/examples/live-preview/next-app/package.json @@ -3,10 +3,10 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev -p 3001", "build": "next build", - "start": "next start -p 3001", - "lint": "next lint" + "dev": "next dev -p 3001", + "lint": "next lint", + "start": "next start -p 3001" }, "dependencies": { "@payloadcms/live-preview-react": "3.0.0-beta.28", diff --git a/examples/live-preview/next-pages/package.json b/examples/live-preview/next-pages/package.json index 74e35526895..260c74b7e53 100644 --- a/examples/live-preview/next-pages/package.json +++ b/examples/live-preview/next-pages/package.json @@ -3,10 +3,10 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev -p 3001", "build": "next build", - "start": "next start -p 3001", - "lint": "next lint" + "dev": "next dev -p 3001", + "lint": "next lint", + "start": "next start -p 3001" }, "dependencies": { "@payloadcms/live-preview-react": "3.0.0-beta.28", diff --git a/examples/live-preview/payload/src/app/(app)/_components/Button/index.tsx b/examples/live-preview/payload/src/app/(app)/_components/Button/index.tsx index 37be5aefa2e..ea080684d49 100644 --- a/examples/live-preview/payload/src/app/(app)/_components/Button/index.tsx +++ b/examples/live-preview/payload/src/app/(app)/_components/Button/index.tsx @@ -1,4 +1,4 @@ -import type { ElementType } from 'react'; +import type { ElementType } from 'react' import Link from 'next/link' import React from 'react' diff --git a/examples/live-preview/payload/src/app/(app)/_components/Gutter/index.tsx b/examples/live-preview/payload/src/app/(app)/_components/Gutter/index.tsx index 3223744f45c..3845a1a62fb 100644 --- a/examples/live-preview/payload/src/app/(app)/_components/Gutter/index.tsx +++ b/examples/live-preview/payload/src/app/(app)/_components/Gutter/index.tsx @@ -1,4 +1,4 @@ -import type { Ref } from 'react'; +import type { Ref } from 'react' import React, { forwardRef } from 'react' diff --git a/examples/live-preview/payload/src/fields/link.ts b/examples/live-preview/payload/src/fields/link.ts index 0877f2d5815..7de052a7d4b 100644 --- a/examples/live-preview/payload/src/fields/link.ts +++ b/examples/live-preview/payload/src/fields/link.ts @@ -125,7 +125,7 @@ const link: LinkType = ({ appearances, disableLabel = false, overrides = {} } = ] if (appearances) { - appearanceOptionsToUse = appearances.map(appearance => appearanceOptions[appearance]) + appearanceOptionsToUse = appearances.map((appearance) => appearanceOptions[appearance]) } linkResult.fields.push({ diff --git a/packages/db-mongodb/src/createMigration.ts b/packages/db-mongodb/src/createMigration.ts index e14ac7f82df..61df13e919b 100644 --- a/packages/db-mongodb/src/createMigration.ts +++ b/packages/db-mongodb/src/createMigration.ts @@ -1,22 +1,24 @@ /* eslint-disable no-restricted-syntax, no-await-in-loop */ -import type { CreateMigration } from 'payload/database' +import type { CreateMigration, MigrationTemplateArgs } from 'payload/database' import fs from 'fs' import path from 'path' +import { getPredefinedMigration } from 'payload/database' import { fileURLToPath } from 'url' -const migrationTemplate = (upSQL?: string, downSQL?: string) => `import { +const migrationTemplate = ({ downSQL, imports, upSQL }: MigrationTemplateArgs): string => `import { MigrateUpArgs, MigrateDownArgs, -} from "@payloadcms/db-mongodb"; +} from '@payloadcms/db-mongodb' +${imports} export async function up({ payload }: MigrateUpArgs): Promise { ${upSQL ?? ` // Migration code`} -}; +} export async function down({ payload }: MigrateDownArgs): Promise { ${downSQL ?? ` // Migration code`} -}; +} ` export const createMigration: CreateMigration = async function createMigration({ @@ -31,36 +33,14 @@ export const createMigration: CreateMigration = async function createMigration({ if (!fs.existsSync(dir)) { fs.mkdirSync(dir) } - - let migrationFileContent: string | undefined - - // Check for predefined migration. - // Either passed in via --file or prefixed with @payloadcms/db-mongodb/ - if (file || migrationName?.startsWith('@payloadcms/db-mongodb/')) { - if (!file) file = migrationName - - const predefinedMigrationName = file.replace('@payloadcms/db-mongodb/', '') - migrationName = predefinedMigrationName - const cleanPath = path.join(dirname, `../predefinedMigrations/${predefinedMigrationName}.js`) - - // Check if predefined migration exists - if (fs.existsSync(cleanPath)) { - let migration = await eval( - `${typeof require === 'function' ? 'require' : 'import'}(${cleanPath})`, - ) - if ('default' in migration) migration = migration.default - const { down, up } = migration - - migrationFileContent = migrationTemplate(up, down) - } else { - payload.logger.error({ - msg: `Canned migration ${predefinedMigrationName} not found.`, - }) - process.exit(1) - } - } else { - migrationFileContent = migrationTemplate() - } + const predefinedMigration = await getPredefinedMigration({ + dirname, + file, + migrationName, + payload, + }) + + const migrationFileContent = migrationTemplate(predefinedMigration) const [yyymmdd, hhmmss] = new Date().toISOString().split('T') const formattedDate = yyymmdd.replace(/\D/g, '') diff --git a/packages/db-mongodb/predefinedMigrations/versions-v1-v2.js b/packages/db-mongodb/src/predefinedMigrations/versions-v1-v2.js similarity index 100% rename from packages/db-mongodb/predefinedMigrations/versions-v1-v2.js rename to packages/db-mongodb/src/predefinedMigrations/versions-v1-v2.js diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 1537a6987b5..6780cceee37 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -21,6 +21,11 @@ "import": "./src/types.ts", "require": "./src/types.ts", "types": "./src/types.ts" + }, + "./migration-utils": { + "import": "./src/exports/migration-utils.ts", + "require": "./src/exports/migration-utils.ts", + "types": "./src/exports/migration-utils.ts" } }, "main": "./src/index.ts", @@ -30,11 +35,12 @@ "mock.js" ], "scripts": { - "build": "pnpm build:swc && pnpm build:types", + "build": "pnpm build:swc && pnpm build:types && pnpm renamePredefinedMigrations", "build:swc": "swc ./src -d ./dist --config-file .swcrc", "build:types": "tsc --emitDeclarationOnly --outDir dist", "clean": "rimraf {dist,*.tsbuildinfo}", - "prepublishOnly": "pnpm clean && pnpm turbo build" + "prepublishOnly": "pnpm clean && pnpm turbo build", + "renamePredefinedMigrations": "tsx ./scripts/renamePredefinedMigrations.ts" }, "dependencies": { "@libsql/client": "^0.5.2", @@ -66,6 +72,11 @@ "import": "./dist/types.js", "require": "./dist/types.js", "types": "./dist/types.d.ts" + }, + "./migration-utils": { + "import": "./dist/exports/migration-utils.js", + "require": "./dist/exports/migration-utils.js", + "types": "./dist/exports/migration-utils.d.ts" } }, "main": "./dist/index.js", diff --git a/packages/db-postgres/relationships-v2-v3.mjs b/packages/db-postgres/relationships-v2-v3.mjs new file mode 100644 index 00000000000..3ae893d5ec4 --- /dev/null +++ b/packages/db-postgres/relationships-v2-v3.mjs @@ -0,0 +1,13 @@ +const imports = `import { migratePostgresV2toV3 } from '@payloadcms/migratePostgresV2toV3'`; +const up = ` await migratePostgresV2toV3({ + // enables logging of changes that will be made to the database + debug: false, + // skips calls that modify schema or data + dryRun: false, + payload, + req, + }) +`; +export { imports, up }; + +//# sourceMappingURL=relationships-v2-v3.js.map \ No newline at end of file diff --git a/packages/db-postgres/scripts/renamePredefinedMigrations.ts b/packages/db-postgres/scripts/renamePredefinedMigrations.ts new file mode 100644 index 00000000000..6519ffad790 --- /dev/null +++ b/packages/db-postgres/scripts/renamePredefinedMigrations.ts @@ -0,0 +1,18 @@ +import fs from 'fs' +import path from 'path' + +/** + * Changes built .js files to .mjs to for ESM imports + */ +const rename = () => { + fs.readdirSync(path.resolve('./dist/predefinedMigrations')) + .filter((f) => { + return f.endsWith('.js') + }) + .forEach((file) => { + const newPath = path.join('./dist/predefinedMigrations', file) + fs.renameSync(newPath, newPath.replace('.js', '.mjs')) + }) +} + +rename() diff --git a/packages/db-postgres/src/count.ts b/packages/db-postgres/src/count.ts index 0d64620246d..95bb12c4d25 100644 --- a/packages/db-postgres/src/count.ts +++ b/packages/db-postgres/src/count.ts @@ -21,7 +21,7 @@ export const count: Count = async function count( const db = this.sessions[req.transactionID]?.db || this.drizzle const table = this.tables[tableName] - const { joinAliases, joins, where } = await buildQuery({ + const { joins, where } = await buildQuery({ adapter: this, fields: collectionConfig.fields, locale, @@ -31,13 +31,6 @@ export const count: Count = async function count( const selectCountMethods: ChainedMethods = [] - joinAliases.forEach(({ condition, table }) => { - selectCountMethods.push({ - args: [table, condition], - method: 'leftJoin', - }) - }) - Object.entries(joins).forEach(([joinTable, condition]) => { if (joinTable) { selectCountMethods.push({ diff --git a/packages/db-postgres/src/createMigration.ts b/packages/db-postgres/src/createMigration.ts index 4efbf092021..34db4a24492 100644 --- a/packages/db-postgres/src/createMigration.ts +++ b/packages/db-postgres/src/createMigration.ts @@ -1,40 +1,30 @@ /* eslint-disable no-restricted-syntax, no-await-in-loop */ import type { DrizzleSnapshotJSON } from 'drizzle-kit/payload' -import type { CreateMigration } from 'payload/database' +import type { CreateMigration, MigrationTemplateArgs } from 'payload/database' import fs from 'fs' import { createRequire } from 'module' +import path from 'path' +import { getPredefinedMigration } from 'payload/database' import prompts from 'prompts' +import { fileURLToPath } from 'url' import type { PostgresAdapter } from './types.js' const require = createRequire(import.meta.url) -const migrationTemplate = ( - upSQL?: string, - downSQL?: string, -) => `import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres' - -export async function up({ payload }: MigrateUpArgs): Promise { -${ - upSQL - ? `await payload.db.drizzle.execute(sql\` - -${upSQL}\`); -` - : '// Migration code' -} +const migrationTemplate = ({ + downSQL, + imports, + upSQL, +}: MigrationTemplateArgs): string => `import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres' +${imports ? `${imports}\n` : ''} +export async function up({ payload, req }: MigrateUpArgs): Promise { +${upSQL} }; -export async function down({ payload }: MigrateDownArgs): Promise { -${ - downSQL - ? `await payload.db.drizzle.execute(sql\` - -${downSQL}\`); -` - : '// Migration code' -} +export async function down({ payload, req }: MigrateDownArgs): Promise { +${downSQL} }; ` @@ -55,78 +45,95 @@ const getDefaultDrizzleSnapshot = (): DrizzleSnapshotJSON => ({ export const createMigration: CreateMigration = async function createMigration( this: PostgresAdapter, - { forceAcceptWarning, migrationName, payload }, + { file, forceAcceptWarning, migrationName, payload }, ) { + const filename = fileURLToPath(import.meta.url) + const dirname = path.dirname(filename) const dir = payload.db.migrationDir if (!fs.existsSync(dir)) { fs.mkdirSync(dir) } - const { generateDrizzleJson, generateMigration } = require('drizzle-kit/payload') - + const drizzleJsonAfter = generateDrizzleJson(this.schema) const [yyymmdd, hhmmss] = new Date().toISOString().split('T') const formattedDate = yyymmdd.replace(/\D/g, '') const formattedTime = hhmmss.split('.')[0].replace(/\D/g, '') + let imports: string = '' + let downSQL: string + let upSQL: string + ;({ downSQL, imports, upSQL } = await getPredefinedMigration({ + dirname, + file, + migrationName, + payload, + })) const timestamp = `${formattedDate}_${formattedTime}` - const fileName = migrationName - ? `${timestamp}_${migrationName.replace(/\W/g, '_')}` - : `${timestamp}` + const name = migrationName || file?.split('/').slice(2).join('/') + const fileName = `${timestamp}${name ? `_${name.replace(/\W/g, '_')}` : ''}` const filePath = `${dir}/${fileName}` let drizzleJsonBefore = getDefaultDrizzleSnapshot() - // Get latest migration snapshot - const latestSnapshot = fs - .readdirSync(dir) - .filter((file) => file.endsWith('.json')) - .sort() - .reverse()?.[0] + if (!upSQL) { + // Get latest migration snapshot + const latestSnapshot = fs + .readdirSync(dir) + .filter((file) => file.endsWith('.json')) + .sort() + .reverse()?.[0] + + if (latestSnapshot) { + drizzleJsonBefore = JSON.parse( + fs.readFileSync(`${dir}/${latestSnapshot}`, 'utf8'), + ) as DrizzleSnapshotJSON + } - if (latestSnapshot) { - const latestSnapshotJSON = JSON.parse( - fs.readFileSync(`${dir}/${latestSnapshot}`, 'utf8'), - ) as DrizzleSnapshotJSON + const sqlStatementsUp = await generateMigration(drizzleJsonBefore, drizzleJsonAfter) + const sqlStatementsDown = await generateMigration(drizzleJsonAfter, drizzleJsonBefore) + const sqlExecute = 'await payload.db.drizzle.execute(sql`' - drizzleJsonBefore = latestSnapshotJSON - } + if (sqlStatementsUp?.length) { + upSQL = `${sqlExecute}\n ${sqlStatementsUp?.join('\n')}\`)` + } + if (sqlStatementsDown?.length) { + downSQL = `${sqlExecute}\n ${sqlStatementsDown?.join('\n')}\`)` + } - const drizzleJsonAfter = generateDrizzleJson(this.schema) - const sqlStatementsUp = await generateMigration(drizzleJsonBefore, drizzleJsonAfter) - const sqlStatementsDown = await generateMigration(drizzleJsonAfter, drizzleJsonBefore) - - if (!sqlStatementsUp.length && !sqlStatementsDown.length && !forceAcceptWarning) { - const { confirm: shouldCreateBlankMigration } = await prompts( - { - name: 'confirm', - type: 'confirm', - initial: false, - message: 'No schema changes detected. Would you like to create a blank migration file?', - }, - { - onCancel: () => { - process.exit(0) + if (!upSQL?.length && !downSQL?.length && !forceAcceptWarning) { + const { confirm: shouldCreateBlankMigration } = await prompts( + { + name: 'confirm', + type: 'confirm', + initial: false, + message: 'No schema changes detected. Would you like to create a blank migration file?', + }, + { + onCancel: () => { + process.exit(0) + }, }, - }, - ) + ) - if (!shouldCreateBlankMigration) { - process.exit(0) + if (!shouldCreateBlankMigration) { + process.exit(0) + } } - } - // write schema - fs.writeFileSync(`${filePath}.json`, JSON.stringify(drizzleJsonAfter, null, 2)) + // write schema + fs.writeFileSync(`${filePath}.json`, JSON.stringify(drizzleJsonAfter, null, 2)) + } // write migration fs.writeFileSync( `${filePath}.ts`, - migrationTemplate( - sqlStatementsUp.length ? sqlStatementsUp?.join('\n') : undefined, - sqlStatementsDown.length ? sqlStatementsDown?.join('\n') : undefined, - ), + migrationTemplate({ + downSQL: downSQL || ` // Migration code`, + imports, + upSQL: upSQL || ` // Migration code`, + }), ) payload.logger.info({ msg: `Migration created at ${filePath}.ts` }) } diff --git a/packages/db-postgres/src/createVersion.ts b/packages/db-postgres/src/createVersion.ts index 3bf291f2564..f99b14b1073 100644 --- a/packages/db-postgres/src/createVersion.ts +++ b/packages/db-postgres/src/createVersion.ts @@ -45,17 +45,12 @@ export async function createVersion( const table = this.tables[tableName] - const relationshipsTable = this.tables[`${tableName}${this.relationshipsSuffix}`] - if (collection.versions.drafts) { await db.execute(sql` UPDATE ${table} SET latest = false - FROM ${relationshipsTable} - WHERE ${table.id} = ${relationshipsTable.parent} - AND ${relationshipsTable.path} = ${'parent'} - AND ${relationshipsTable[`${collectionSlug}ID`]} = ${parent} - AND ${table.id} != ${result.id}; + WHERE ${table.id} != ${result.id} + AND ${table.parent} = ${parent} `) } diff --git a/packages/db-postgres/src/deleteOne.ts b/packages/db-postgres/src/deleteOne.ts index b43aec70745..564638e0582 100644 --- a/packages/db-postgres/src/deleteOne.ts +++ b/packages/db-postgres/src/deleteOne.ts @@ -22,7 +22,7 @@ export const deleteOne: DeleteOne = async function deleteOne( let docToDelete: Record - const { joinAliases, joins, selectFields, where } = await buildQuery({ + const { joins, selectFields, where } = await buildQuery({ adapter: this, fields: collection.fields, locale: req.locale, @@ -34,7 +34,6 @@ export const deleteOne: DeleteOne = async function deleteOne( adapter: this, chainedMethods: [{ args: [1], method: 'limit' }], db, - joinAliases, joins, selectFields, tableName, @@ -59,6 +58,7 @@ export const deleteOne: DeleteOne = async function deleteOne( } const result = transform({ + adapter: this, config: this.payload.config, data: docToDelete, fields: collection.fields, diff --git a/packages/db-postgres/src/exports/migration-utils.ts b/packages/db-postgres/src/exports/migration-utils.ts new file mode 100644 index 00000000000..e67c9579f52 --- /dev/null +++ b/packages/db-postgres/src/exports/migration-utils.ts @@ -0,0 +1 @@ +export { migratePostgresV2toV3 } from '../predefinedMigrations/v2-v3/index.js' diff --git a/packages/db-postgres/src/find/buildFindManyArgs.ts b/packages/db-postgres/src/find/buildFindManyArgs.ts index 68994faafcd..fa48dcec121 100644 --- a/packages/db-postgres/src/find/buildFindManyArgs.ts +++ b/packages/db-postgres/src/find/buildFindManyArgs.ts @@ -12,7 +12,11 @@ type BuildFindQueryArgs = { tableName: string } -export type Result = DBQueryConfig<'many', true, any, any> +export type Result = DBQueryConfig<'many', true, any, any> & { + with?: DBQueryConfig<'many', true, any, any> & { + _locales?: DBQueryConfig<'many', true, any, any> + } +} // Generate the Drizzle query for findMany based on // a collection field structure @@ -31,6 +35,7 @@ export const buildFindManyArgs = ({ id: false, _parentID: false, }, + with: {}, } if (adapter.tables[`${tableName}_texts`]) { diff --git a/packages/db-postgres/src/find/findMany.ts b/packages/db-postgres/src/find/findMany.ts index 41ce010ff8d..a86d17ad1d0 100644 --- a/packages/db-postgres/src/find/findMany.ts +++ b/packages/db-postgres/src/find/findMany.ts @@ -41,7 +41,7 @@ export const findMany = async function find({ let hasNextPage: boolean let pagingCounter: number - const { joinAliases, joins, orderBy, selectFields, where } = await buildQuery({ + const { joins, orderBy, selectFields, where } = await buildQuery({ adapter, fields, locale, @@ -76,7 +76,6 @@ export const findMany = async function find({ adapter, chainedMethods: selectDistinctMethods, db, - joinAliases, joins, selectFields, tableName, @@ -122,29 +121,19 @@ export const findMany = async function find({ if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) { const selectCountMethods: ChainedMethods = [] - - joinAliases.forEach(({ condition, table }) => { + joins.forEach(({ condition, table }) => { selectCountMethods.push({ args: [table, condition], method: 'leftJoin', }) }) - Object.entries(joins).forEach(([joinTable, condition]) => { - if (joinTable) { - selectCountMethods.push({ - args: [adapter.tables[joinTable], condition], - method: 'leftJoin', - }) - } - }) - const countResult = await chainMethods({ methods: selectCountMethods, query: db .select({ count: sql`count - (DISTINCT ${adapter.tables[tableName].id})`, + (DISTINCT ${adapter.tables[tableName].id})`, }) .from(table) .where(where), @@ -172,6 +161,7 @@ export const findMany = async function find({ const docs = rawDocs.map((data: TypeWithID) => { return transform({ + adapter, config: adapter.payload.config, data, fields, diff --git a/packages/db-postgres/src/find/traverseFields.ts b/packages/db-postgres/src/find/traverseFields.ts index b8503f31ee5..9bda489340b 100644 --- a/packages/db-postgres/src/find/traverseFields.ts +++ b/packages/db-postgres/src/find/traverseFields.ts @@ -8,9 +8,9 @@ import type { PostgresAdapter } from '../types.js' import type { Result } from './buildFindManyArgs.js' type TraverseFieldArgs = { - _locales: Record + _locales: Result adapter: PostgresAdapter - currentArgs: Record + currentArgs: Result currentTableName: string depth?: number fields: Field[] @@ -31,6 +31,19 @@ export const traverseFields = ({ topLevelTableName, }: TraverseFieldArgs) => { fields.forEach((field) => { + // handle simple relationship + if ( + depth > 0 && + (field.type === 'upload' || + (field.type === 'relationship' && !field.hasMany && typeof field.relationTo === 'string')) + ) { + if (field.localized) { + _locales.with[`${path}${field.name}`] = true + } else { + currentArgs.with[`${path}${field.name}`] = true + } + } + if (field.type === 'collapsible' || field.type === 'row') { traverseFields({ _locales, @@ -84,11 +97,19 @@ export const traverseFields = ({ const arrayTableNameWithLocales = `${arrayTableName}${adapter.localesSuffix}` - if (adapter.tables[arrayTableNameWithLocales]) withArray.with._locales = _locales + if (adapter.tables[arrayTableNameWithLocales]) { + withArray.with._locales = { + columns: { + id: false, + _parentID: false, + }, + with: {}, + } + } currentArgs.with[`${path}${field.name}`] = withArray traverseFields({ - _locales, + _locales: withArray.with._locales, adapter, currentArgs: withArray, currentTableName: arrayTableName, @@ -137,12 +158,14 @@ export const traverseFields = ({ ) if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) { - withBlock.with._locales = _locales + withBlock.with._locales = { + with: {}, + } } topLevelArgs.with[blockKey] = withBlock traverseFields({ - _locales, + _locales: withBlock.with._locales, adapter, currentArgs: withBlock, currentTableName: tableName, diff --git a/packages/db-postgres/src/init.ts b/packages/db-postgres/src/init.ts index 04fc09423e0..1c8357d9068 100644 --- a/packages/db-postgres/src/init.ts +++ b/packages/db-postgres/src/init.ts @@ -4,6 +4,7 @@ import type { SanitizedCollectionConfig } from 'payload/types' import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core' import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload/versions' +import toSnakeCase from 'to-snake-case' import type { PostgresAdapter } from './types.js' @@ -25,16 +26,25 @@ export const init: Init = function init(this: PostgresAdapter) { } this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => { - const tableName = createTableName({ + createTableName({ adapter: this, config: collection, }) + if (collection.versions) { + createTableName({ + adapter: this, + config: collection, + versions: true, + versionsCustomName: true, + }) + } + }) + this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => { + const tableName = this.tableNameMap.get(toSnakeCase(collection.slug)) + buildTable({ adapter: this, - buildNumbers: true, - buildRelationships: true, - buildTexts: true, disableNotNull: !!collection?.versions?.drafts, disableUnique: false, fields: collection.fields, @@ -44,19 +54,13 @@ export const init: Init = function init(this: PostgresAdapter) { }) if (collection.versions) { - const versionsTableName = createTableName({ - adapter: this, - config: collection, - versions: true, - versionsCustomName: true, - }) + const versionsTableName = this.tableNameMap.get( + `_${toSnakeCase(collection.slug)}${this.versionsSuffix}`, + ) const versionFields = buildVersionCollectionFields(collection) buildTable({ adapter: this, - buildNumbers: true, - buildRelationships: true, - buildTexts: true, disableNotNull: !!collection.versions?.drafts, disableUnique: true, fields: versionFields, @@ -72,9 +76,6 @@ export const init: Init = function init(this: PostgresAdapter) { buildTable({ adapter: this, - buildNumbers: true, - buildRelationships: true, - buildTexts: true, disableNotNull: !!global?.versions?.drafts, disableUnique: false, fields: global.fields, @@ -94,9 +95,6 @@ export const init: Init = function init(this: PostgresAdapter) { buildTable({ adapter: this, - buildNumbers: true, - buildRelationships: true, - buildTexts: true, disableNotNull: !!global.versions?.drafts, disableUnique: true, fields: versionFields, diff --git a/packages/db-postgres/src/predefinedMigrations/relationships-v2-v3.ts b/packages/db-postgres/src/predefinedMigrations/relationships-v2-v3.ts new file mode 100644 index 00000000000..a7903fbc856 --- /dev/null +++ b/packages/db-postgres/src/predefinedMigrations/relationships-v2-v3.ts @@ -0,0 +1,10 @@ +const imports = `import { migratePostgresV2toV3 } from '@payloadcms/db-postgres/migration-utils'` +const upSQL = ` await migratePostgresV2toV3({ + // enables logging of changes that will be made to the database + debug: false, + payload, + req, + }) +` + +export { imports, upSQL } diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/index.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/index.ts new file mode 100644 index 00000000000..674834a1ee9 --- /dev/null +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/index.ts @@ -0,0 +1,237 @@ +import type { Payload } from 'payload' +import type { Field, PayloadRequestWithData } from 'payload/types' + +import type { DrizzleTransaction, PostgresAdapter } from '../../../types.js' +import type { DocsToResave } from '../types.js' + +import { upsertRow } from '../../../upsertRow/index.js' +import { traverseFields } from './traverseFields.js' + +type Args = { + adapter: PostgresAdapter + collectionSlug?: string + db: DrizzleTransaction + debug: boolean + docsToResave: DocsToResave + fields: Field[] + globalSlug?: string + isVersions: boolean + payload: Payload + req: PayloadRequestWithData + tableName: string +} + +export const fetchAndResave = async ({ + adapter, + collectionSlug, + db, + debug, + docsToResave, + fields, + globalSlug, + isVersions, + payload, + req, + tableName, +}: Args) => { + for (const [id, rows] of Object.entries(docsToResave)) { + if (collectionSlug) { + const collectionConfig = payload.collections[collectionSlug].config + + if (collectionConfig) { + if (isVersions) { + const doc = await payload.findVersionByID({ + id, + collection: collectionSlug, + depth: 0, + fallbackLocale: null, + locale: 'all', + req, + showHiddenFields: true, + }) + + if (debug) { + payload.logger.info( + `The collection "${collectionConfig.slug}" version with ID ${id} will be migrated`, + ) + } + + traverseFields({ + doc, + fields, + path: '', + rows, + }) + + try { + await upsertRow({ + id: doc.id, + adapter, + data: doc, + db, + fields, + ignoreResult: true, + operation: 'update', + req, + tableName, + }) + } catch (err) { + payload.logger.error( + `"${collectionConfig.slug}" version with ID ${doc.id} FAILED TO MIGRATE`, + ) + + throw err + } + + if (debug) { + payload.logger.info( + `"${collectionConfig.slug}" version with ID ${doc.id} migrated successfully!`, + ) + } + } else { + const doc = await payload.findByID({ + id, + collection: collectionSlug, + depth: 0, + fallbackLocale: null, + locale: 'all', + req, + showHiddenFields: true, + }) + + if (debug) { + payload.logger.info( + `The collection "${collectionConfig.slug}" with ID ${doc.id} will be migrated`, + ) + } + + traverseFields({ + doc, + fields, + path: '', + rows, + }) + + try { + await upsertRow({ + id: doc.id, + adapter, + data: doc, + db, + fields, + ignoreResult: true, + operation: 'update', + req, + tableName, + }) + } catch (err) { + payload.logger.error( + `The collection "${collectionConfig.slug}" with ID ${doc.id} has FAILED TO MIGRATE`, + ) + + throw err + } + + if (debug) { + payload.logger.info( + `The collection "${collectionConfig.slug}" with ID ${doc.id} has migrated successfully!`, + ) + } + } + } + } + + if (globalSlug) { + const globalConfig = payload.config.globals?.find((global) => global.slug === globalSlug) + + if (globalConfig) { + if (isVersions) { + const { docs } = await payload.findGlobalVersions({ + slug: globalSlug, + depth: 0, + fallbackLocale: null, + limit: 0, + locale: 'all', + req, + showHiddenFields: true, + }) + + if (debug) { + payload.logger.info(`${docs.length} global "${globalSlug}" versions will be migrated`) + } + + for (const doc of docs) { + traverseFields({ + doc, + fields, + path: '', + rows, + }) + + try { + await upsertRow({ + id: doc.id, + adapter, + data: doc, + db, + fields, + ignoreResult: true, + operation: 'update', + req, + tableName, + }) + } catch (err) { + payload.logger.error(`"${globalSlug}" version with ID ${doc.id} FAILED TO MIGRATE`) + + throw err + } + + if (debug) { + payload.logger.info( + `"${globalSlug}" version with ID ${doc.id} migrated successfully!`, + ) + } + } + } else { + const doc = await payload.findGlobal({ + slug: globalSlug, + depth: 0, + fallbackLocale: null, + locale: 'all', + req, + showHiddenFields: true, + }) + + traverseFields({ + doc, + fields, + path: '', + rows, + }) + + try { + await upsertRow({ + id: doc.id, + adapter, + data: doc, + db, + fields, + ignoreResult: true, + operation: 'update', + req, + tableName, + }) + } catch (err) { + payload.logger.error(`The global "${globalSlug}" has FAILED TO MIGRATE`) + + throw err + } + + if (debug) { + payload.logger.info(`The global "${globalSlug}" has migrated successfully!`) + } + } + } + } + } +} diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts new file mode 100644 index 00000000000..f3eb840f9e0 --- /dev/null +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts @@ -0,0 +1,215 @@ +import type { Field } from 'payload/types' + +import { tabHasName } from 'payload/types' + +type Args = { + doc: Record + fields: Field[] + locale?: string + path: string + rows: Record[] +} + +export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => { + fields.forEach((field) => { + switch (field.type) { + case 'group': { + const newPath = `${path ? `${path}.` : ''}${field.name}` + const newDoc = doc?.[field.name] + + if (typeof newDoc === 'object' && newDoc !== null) { + if (field.localized) { + Object.entries(newDoc).forEach(([locale, localeDoc]) => { + return traverseFields({ + doc: localeDoc, + fields: field.fields, + locale, + path: newPath, + rows, + }) + }) + } else { + return traverseFields({ + doc: newDoc as Record, + fields: field.fields, + path: newPath, + rows, + }) + } + } + + break + } + + case 'row': + case 'collapsible': { + return traverseFields({ + doc, + fields: field.fields, + path, + rows, + }) + } + + case 'array': { + const rowData = doc?.[field.name] + + if (field.localized && typeof rowData === 'object' && rowData !== null) { + Object.entries(rowData).forEach(([locale, localeRows]) => { + if (Array.isArray(localeRows)) { + localeRows.forEach((row, i) => { + return traverseFields({ + doc: row as Record, + fields: field.fields, + locale, + path: `${path ? `${path}.` : ''}${field.name}.${i}`, + rows, + }) + }) + } + }) + } + + if (Array.isArray(rowData)) { + rowData.forEach((row, i) => { + return traverseFields({ + doc: row as Record, + fields: field.fields, + path: `${path ? `${path}.` : ''}${field.name}.${i}`, + rows, + }) + }) + } + + break + } + + case 'blocks': { + const rowData = doc?.[field.name] + + if (field.localized && typeof rowData === 'object' && rowData !== null) { + Object.entries(rowData).forEach(([locale, localeRows]) => { + if (Array.isArray(localeRows)) { + localeRows.forEach((row, i) => { + const matchedBlock = field.blocks.find((block) => block.slug === row.blockType) + + if (matchedBlock) { + return traverseFields({ + doc: row as Record, + fields: matchedBlock.fields, + locale, + path: `${path ? `${path}.` : ''}${field.name}.${i}`, + rows, + }) + } + }) + } + }) + } + + if (Array.isArray(rowData)) { + rowData.forEach((row, i) => { + const matchedBlock = field.blocks.find((block) => block.slug === row.blockType) + + if (matchedBlock) { + return traverseFields({ + doc: row as Record, + fields: matchedBlock.fields, + path: `${path ? `${path}.` : ''}${field.name}.${i}`, + rows, + }) + } + }) + } + + break + } + + case 'tabs': { + return field.tabs.forEach((tab) => { + if (tabHasName(tab)) { + const newDoc = doc?.[tab.name] + const newPath = `${path ? `${path}.` : ''}${tab.name}` + + if (typeof newDoc === 'object' && newDoc !== null) { + if (tab.localized) { + Object.entries(newDoc).forEach(([locale, localeDoc]) => { + return traverseFields({ + doc: localeDoc, + fields: tab.fields, + locale, + path: newPath, + rows, + }) + }) + } else { + return traverseFields({ + doc: newDoc as Record, + fields: tab.fields, + path: newPath, + rows, + }) + } + } + } else { + traverseFields({ + doc, + fields: tab.fields, + path, + rows, + }) + } + }) + } + + case 'relationship': + case 'upload': { + if (typeof field.relationTo === 'string') { + if (field.type === 'upload' || !field.hasMany) { + const relationshipPath = `${path ? `${path}.` : ''}${field.name}` + + if (field.localized) { + const matchedRelationshipsWithLocales = rows.filter( + (row) => row.path === relationshipPath, + ) + + if (matchedRelationshipsWithLocales.length && !doc[field.name]) { + doc[field.name] = {} + } + + const newDoc = doc[field.name] as Record + + matchedRelationshipsWithLocales.forEach((localeRow) => { + if (typeof localeRow.locale === 'string') { + const [, id] = Object.entries(localeRow).find( + ([key, val]) => + val !== null && !['id', 'locale', 'order', 'parent_id', 'path'].includes(key), + ) + + newDoc[localeRow.locale] = id + } + }) + } else { + const matchedRelationship = rows.find((row) => { + const matchesPath = row.path === relationshipPath + + if (locale) return matchesPath && locale === row.locale + + return row.path === relationshipPath + }) + + if (matchedRelationship) { + const [, id] = Object.entries(matchedRelationship).find( + ([key, val]) => + val !== null && !['id', 'locale', 'order', 'parent_id', 'path'].includes(key), + ) + + doc[field.name] = id + } + } + } + } + } + } + }) +} diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/groupUpSQLStatements.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/groupUpSQLStatements.ts new file mode 100644 index 00000000000..f7ec0045d37 --- /dev/null +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/groupUpSQLStatements.ts @@ -0,0 +1,74 @@ +export type Groups = + | 'addColumn' + | 'addConstraint' + | 'dropColumn' + | 'dropConstraint' + | 'dropTable' + | 'notNull' + +/** + * Convert an "ADD COLUMN" statement to an "ALTER COLUMN" statement + * example: ALTER TABLE "pages_blocks_my_block" ADD COLUMN "person_id" integer NOT NULL; + * to: ALTER TABLE "pages_blocks_my_block" ALTER COLUMN "person_id" SET NOT NULL; + * @param sql + */ +function convertAddColumnToAlterColumn(sql) { + // Regular expression to match the ADD COLUMN statement with its constraints + const regex = /ALTER TABLE ("[^"]+") ADD COLUMN ("[^"]+") [\w\s]+ NOT NULL;/ + + // Replace the matched part with "ALTER COLUMN ... SET NOT NULL;" + return sql.replace(regex, 'ALTER TABLE $1 ALTER COLUMN $2 SET NOT NULL;') +} + +export const groupUpSQLStatements = (list: string[]): Record => { + const groups = { + addColumn: 'ADD COLUMN', + // example: ALTER TABLE "posts" ADD COLUMN "category_id" integer + + addConstraint: 'ADD CONSTRAINT', + //example: + // DO $$ BEGIN + // ALTER TABLE "pages_blocks_my_block" ADD CONSTRAINT "pages_blocks_my_block_person_id_users_id_fk" FOREIGN KEY ("person_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action; + // EXCEPTION + // WHEN duplicate_object THEN null; + // END $$; + + dropColumn: 'DROP COLUMN', + // example: ALTER TABLE "_posts_v_rels" DROP COLUMN IF EXISTS "posts_id"; + + dropConstraint: 'DROP CONSTRAINT', + // example: ALTER TABLE "_posts_v_rels" DROP CONSTRAINT "_posts_v_rels_posts_fk"; + + dropTable: 'DROP TABLE', + // example: DROP TABLE "pages_rels"; + + notNull: 'NOT NULL', + // example: ALTER TABLE "pages_blocks_my_block" ALTER COLUMN "person_id" SET NOT NULL; + } + + const result = Object.keys(groups).reduce((result, group: Groups) => { + result[group] = [] + return result + }, {}) as Record + + for (const line of list) { + Object.entries(groups).some(([key, value]) => { + if (line.endsWith('NOT NULL;')) { + // split up the ADD COLUMN and ALTER COLUMN NOT NULL statements + // example: ALTER TABLE "pages_blocks_my_block" ADD COLUMN "person_id" integer NOT NULL; + // becomes two separate statements: + // 1. ALTER TABLE "pages_blocks_my_block" ADD COLUMN "person_id" integer; + // 2. ALTER TABLE "pages_blocks_my_block" ALTER COLUMN "person_id" SET NOT NULL; + result.addColumn.push(line.replace(' NOT NULL;', ';')) + result.notNull.push(convertAddColumnToAlterColumn(line)) + return true + } + if (line.includes(value)) { + result[key].push(line) + return true + } + }) + } + + return result +} diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/index.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/index.ts new file mode 100644 index 00000000000..2857a3800f4 --- /dev/null +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/index.ts @@ -0,0 +1,278 @@ +import type { DrizzleSnapshotJSON } from 'drizzle-kit/payload' +import type { Payload } from 'payload' +import type { PayloadRequestWithData } from 'payload/types' + +import { sql } from 'drizzle-orm' +import fs from 'fs' +import { createRequire } from 'module' +import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload/versions' +import toSnakeCase from 'to-snake-case' + +import type { PostgresAdapter } from '../../types.js' +import type { PathsToQuery } from './types.js' + +import { groupUpSQLStatements } from './groupUpSQLStatements.js' +import { migrateRelationships } from './migrateRelationships.js' +import { traverseFields } from './traverseFields.js' + +const require = createRequire(import.meta.url) + +type Args = { + debug?: boolean + payload: Payload + req: PayloadRequestWithData +} + +/** + * Moves upload and relationship columns from the join table and into the tables while moving data + * This is done in the following order: + * ADD COLUMNs + * -- manipulate data to move relationships to new columns + * ADD CONSTRAINTs + * NOT NULLs + * DROP TABLEs + * DROP CONSTRAINTs + * DROP COLUMNs + * @param debug + * @param payload + * @param req + */ +export const migratePostgresV2toV3 = async ({ debug, payload, req }: Args) => { + const adapter = payload.db as PostgresAdapter + const db = adapter.sessions[req.transactionID]?.db + const dir = payload.db.migrationDir + + // get the drizzle migrateUpSQL from drizzle using the last schema + const { generateDrizzleJson, generateMigration } = require('drizzle-kit/payload') + const drizzleJsonAfter = generateDrizzleJson(adapter.schema) + + // Get latest migration snapshot + const latestSnapshot = fs + .readdirSync(dir) + .filter((file) => file.endsWith('.json')) + .sort() + .reverse()?.[0] + + if (!latestSnapshot) { + throw new Error( + `No previous migration schema file found! A prior migration from v2 is required to migrate to v3.`, + ) + } + + const drizzleJsonBefore = JSON.parse( + fs.readFileSync(`${dir}/${latestSnapshot}`, 'utf8'), + ) as DrizzleSnapshotJSON + + const generatedSQL = await generateMigration(drizzleJsonBefore, drizzleJsonAfter) + + if (!generatedSQL.length) { + payload.logger.info(`No schema changes needed.`) + process.exit(0) + } + + const sqlUpStatements = groupUpSQLStatements(generatedSQL) + + const addColumnsStatement = sqlUpStatements.addColumn.join('\n') + + if (debug) { + payload.logger.info('CREATING NEW RELATIONSHIP COLUMNS') + payload.logger.info(addColumnsStatement) + } + + await db.execute(sql.raw(addColumnsStatement)) + + for (const collection of payload.config.collections) { + const tableName = adapter.tableNameMap.get(toSnakeCase(collection.slug)) + const pathsToQuery: PathsToQuery = new Set() + + traverseFields({ + adapter, + collectionSlug: collection.slug, + columnPrefix: '', + db, + disableNotNull: false, + fields: collection.fields, + isVersions: false, + newTableName: tableName, + parentTableName: tableName, + path: '', + pathsToQuery, + payload, + rootTableName: tableName, + }) + + await migrateRelationships({ + adapter, + collectionSlug: collection.slug, + db, + debug, + fields: collection.fields, + isVersions: false, + pathsToQuery, + payload, + req, + tableName, + }) + + if (collection.versions) { + const versionsTableName = adapter.tableNameMap.get( + `_${toSnakeCase(collection.slug)}${adapter.versionsSuffix}`, + ) + const versionFields = buildVersionCollectionFields(collection) + const versionPathsToQuery: PathsToQuery = new Set() + + traverseFields({ + adapter, + collectionSlug: collection.slug, + columnPrefix: '', + db, + disableNotNull: true, + fields: versionFields, + isVersions: true, + newTableName: versionsTableName, + parentTableName: versionsTableName, + path: '', + pathsToQuery: versionPathsToQuery, + payload, + rootTableName: versionsTableName, + }) + + await migrateRelationships({ + adapter, + collectionSlug: collection.slug, + db, + debug, + fields: versionFields, + isVersions: true, + pathsToQuery: versionPathsToQuery, + payload, + req, + tableName: versionsTableName, + }) + } + } + + for (const global of payload.config.globals) { + const tableName = adapter.tableNameMap.get(toSnakeCase(global.slug)) + + const pathsToQuery: PathsToQuery = new Set() + + traverseFields({ + adapter, + columnPrefix: '', + db, + disableNotNull: false, + fields: global.fields, + globalSlug: global.slug, + isVersions: false, + newTableName: tableName, + parentTableName: tableName, + path: '', + pathsToQuery, + payload, + rootTableName: tableName, + }) + + await migrateRelationships({ + adapter, + db, + debug, + fields: global.fields, + globalSlug: global.slug, + isVersions: false, + pathsToQuery, + payload, + req, + tableName, + }) + + if (global.versions) { + const versionsTableName = adapter.tableNameMap.get( + `_${toSnakeCase(global.slug)}${adapter.versionsSuffix}`, + ) + + const versionFields = buildVersionGlobalFields(global) + + const versionPathsToQuery: PathsToQuery = new Set() + + traverseFields({ + adapter, + columnPrefix: '', + db, + disableNotNull: true, + fields: versionFields, + globalSlug: global.slug, + isVersions: true, + newTableName: versionsTableName, + parentTableName: versionsTableName, + path: '', + pathsToQuery: versionPathsToQuery, + payload, + rootTableName: versionsTableName, + }) + + await migrateRelationships({ + adapter, + db, + debug, + fields: versionFields, + globalSlug: global.slug, + isVersions: true, + pathsToQuery: versionPathsToQuery, + payload, + req, + tableName: versionsTableName, + }) + } + } + + // ADD CONSTRAINT + const addConstraintsStatement = sqlUpStatements.addConstraint.join('\n') + + if (debug) { + payload.logger.info('ADDING CONSTRAINTS') + payload.logger.info(addConstraintsStatement) + } + + await db.execute(sql.raw(addConstraintsStatement)) + + // NOT NULL + const notNullStatements = sqlUpStatements.notNull.join('\n') + + if (debug) { + payload.logger.info('NOT NULL CONSTRAINTS') + payload.logger.info(notNullStatements) + } + + await db.execute(sql.raw(notNullStatements)) + + // DROP TABLE + const dropTablesStatement = sqlUpStatements.dropTable.join('\n') + + if (debug) { + payload.logger.info('DROPPING TABLES') + payload.logger.info(dropTablesStatement) + } + + await db.execute(sql.raw(dropTablesStatement)) + + // DROP CONSTRAINT + const dropConstraintsStatement = sqlUpStatements.dropConstraint.join('\n') + + if (debug) { + payload.logger.info('DROPPING CONSTRAINTS') + payload.logger.info(dropConstraintsStatement) + } + + await db.execute(sql.raw(dropConstraintsStatement)) + + // DROP COLUMN + const dropColumnsStatement = sqlUpStatements.dropColumn.join('\n') + + if (debug) { + payload.logger.info('DROPPING COLUMNS') + payload.logger.info(dropColumnsStatement) + } + + await db.execute(sql.raw(dropColumnsStatement)) +} diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts new file mode 100644 index 00000000000..28728693f39 --- /dev/null +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts @@ -0,0 +1,102 @@ +import type { Field, Payload, PayloadRequestWithData } from 'payload/types' + +import { sql } from 'drizzle-orm' + +import type { DrizzleTransaction, PostgresAdapter } from '../../types.js' +import type { DocsToResave, PathsToQuery } from './types.js' + +import { fetchAndResave } from './fetchAndResave/index.js' + +type Args = { + adapter: PostgresAdapter + collectionSlug?: string + db: DrizzleTransaction + debug: boolean + fields: Field[] + globalSlug?: string + isVersions: boolean + pathsToQuery: PathsToQuery + payload: Payload + req: PayloadRequestWithData + tableName: string +} + +export const migrateRelationships = async ({ + adapter, + collectionSlug, + db, + debug, + fields, + globalSlug, + isVersions, + pathsToQuery, + payload, + req, + tableName, +}: Args) => { + if (pathsToQuery.size === 0) return + + let offset = 0 + + let paginationResult + + const where = Array.from(pathsToQuery).reduce((statement, path, i) => { + return (statement += ` +"${tableName}${adapter.relationshipsSuffix}"."path" LIKE '${path}'${pathsToQuery.size !== i + 1 ? ' OR' : ''} +`) + }, '') + + while (typeof paginationResult === 'undefined' || paginationResult.rows.length > 0) { + const paginationStatement = `SELECT DISTINCT parent_id FROM ${tableName}${adapter.relationshipsSuffix} WHERE + ${where} ORDER BY parent_id LIMIT 500 OFFSET ${offset * 500}; + ` + + paginationResult = await adapter.drizzle.execute(sql.raw(`${paginationStatement}`)) + + if (paginationResult.rows.length === 0) return + + offset += 1 + + const statement = `SELECT * FROM ${tableName}${adapter.relationshipsSuffix} WHERE + (${where}) AND parent_id IN (${paginationResult.rows.map((row) => row.parent_id).join(', ')}); +` + if (debug) { + payload.logger.info('FINDING ROWS TO MIGRATE') + payload.logger.info(statement) + } + + const result = await adapter.drizzle.execute(sql.raw(`${statement}`)) + + const docsToResave: DocsToResave = {} + + result.rows.forEach((row) => { + const parentID = row.parent_id + + if (typeof parentID === 'string' || typeof parentID === 'number') { + if (!docsToResave[parentID]) docsToResave[parentID] = [] + docsToResave[parentID].push(row) + } + }) + + await fetchAndResave({ + adapter, + collectionSlug, + db, + debug, + docsToResave, + fields, + globalSlug, + isVersions, + payload, + req, + tableName, + }) + } + + const deleteStatement = `DELETE FROM ${tableName}${adapter.relationshipsSuffix} WHERE ${where}` + if (debug) { + payload.logger.info('DELETING ROWS') + payload.logger.info(deleteStatement) + } + await db.execute(sql.raw(`${deleteStatement}`)) +} diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts new file mode 100644 index 00000000000..be15b624e12 --- /dev/null +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts @@ -0,0 +1,116 @@ +import type { Payload } from 'payload' + +import { type Field, tabHasName } from 'payload/types' +import toSnakeCase from 'to-snake-case' + +import type { DrizzleTransaction, PostgresAdapter } from '../../types.js' +import type { PathsToQuery } from './types.js' + +type Args = { + adapter: PostgresAdapter + collectionSlug?: string + columnPrefix: string + db: DrizzleTransaction + disableNotNull: boolean + fields: Field[] + globalSlug?: string + isVersions: boolean + newTableName: string + parentTableName: string + path: string + pathsToQuery: PathsToQuery + payload: Payload + rootTableName: string +} + +export const traverseFields = (args: Args) => { + args.fields.forEach((field) => { + switch (field.type) { + case 'group': { + let newTableName = `${args.newTableName}_${toSnakeCase(field.name)}` + + if (field.localized && args.payload.config.localization) { + newTableName += args.adapter.localesSuffix + } + + return traverseFields({ + ...args, + columnPrefix: `${args.columnPrefix}${toSnakeCase(field.name)}_`, + fields: field.fields, + newTableName, + path: `${args.path ? `${args.path}.` : ''}${field.name}`, + }) + } + + case 'row': + case 'collapsible': { + return traverseFields({ + ...args, + fields: field.fields, + }) + } + + case 'array': { + const newTableName = args.adapter.tableNameMap.get( + `${args.newTableName}_${toSnakeCase(field.name)}`, + ) + + return traverseFields({ + ...args, + columnPrefix: '', + fields: field.fields, + newTableName, + parentTableName: newTableName, + path: `${args.path ? `${args.path}.` : ''}${field.name}.%`, + }) + } + + case 'blocks': { + return field.blocks.forEach((block) => { + const newTableName = args.adapter.tableNameMap.get( + `${args.rootTableName}_blocks_${toSnakeCase(block.slug)}`, + ) + + traverseFields({ + ...args, + columnPrefix: '', + fields: block.fields, + newTableName, + parentTableName: newTableName, + path: `${args.path ? `${args.path}.` : ''}${field.name}.%`, + }) + }) + } + + case 'tabs': { + return field.tabs.forEach((tab) => { + if (tabHasName(tab)) { + args.columnPrefix = `${args.columnPrefix}_${toSnakeCase(tab.name)}_` + args.path = `${args.path ? `${args.path}.` : ''}${tab.name}` + args.newTableName = `${args.newTableName}_${toSnakeCase(tab.name)}` + + if (tab.localized && args.payload.config.localization) { + args.newTableName += args.adapter.localesSuffix + } + } + + traverseFields({ + ...args, + fields: tab.fields, + }) + }) + } + + case 'relationship': + case 'upload': { + if (typeof field.relationTo === 'string') { + if (field.type === 'upload' || !field.hasMany) { + args.pathsToQuery.add(`${args.path ? `${args.path}.` : ''}${field.name}`) + } + } + + return null + } + } + }) +} diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/types.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/types.ts new file mode 100644 index 00000000000..8980e64b940 --- /dev/null +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/types.ts @@ -0,0 +1,9 @@ +/** + * Set of all paths which should be moved + * This will be built up into one WHERE query + */ +export type PathsToQuery = Set + +export type DocsToResave = { + [id: number | string]: Record[] +} diff --git a/packages/db-postgres/src/queries/buildAndOrConditions.ts b/packages/db-postgres/src/queries/buildAndOrConditions.ts index b2c3b453587..3648c831494 100644 --- a/packages/db-postgres/src/queries/buildAndOrConditions.ts +++ b/packages/db-postgres/src/queries/buildAndOrConditions.ts @@ -2,14 +2,13 @@ import type { SQL } from 'drizzle-orm' import type { Field, Where } from 'payload/types' import type { GenericColumn, PostgresAdapter } from '../types.js' -import type { BuildQueryJoinAliases, BuildQueryJoins } from './buildQuery.js' +import type { BuildQueryJoinAliases } from './buildQuery.js' import { parseParams } from './parseParams.js' export async function buildAndOrConditions({ adapter, fields, - joinAliases, joins, locale, selectFields, @@ -20,8 +19,7 @@ export async function buildAndOrConditions({ collectionSlug?: string fields: Field[] globalSlug?: string - joinAliases: BuildQueryJoinAliases - joins: BuildQueryJoins + joins: BuildQueryJoinAliases locale?: string selectFields: Record tableName: string @@ -38,7 +36,6 @@ export async function buildAndOrConditions({ const result = await parseParams({ adapter, fields, - joinAliases, joins, locale, selectFields, diff --git a/packages/db-postgres/src/queries/buildQuery.ts b/packages/db-postgres/src/queries/buildQuery.ts index 4cc21a50b1c..7a134d81301 100644 --- a/packages/db-postgres/src/queries/buildQuery.ts +++ b/packages/db-postgres/src/queries/buildQuery.ts @@ -26,8 +26,7 @@ type BuildQueryArgs = { } type Result = { - joinAliases: BuildQueryJoinAliases - joins: BuildQueryJoins + joins: BuildQueryJoinAliases orderBy: { column: GenericColumn order: typeof asc | typeof desc @@ -46,8 +45,7 @@ const buildQuery = async function buildQuery({ const selectFields: Record = { id: adapter.tables[tableName].id, } - const joins: BuildQueryJoins = {} - const joinAliases: BuildQueryJoinAliases = [] + const joins: BuildQueryJoinAliases = [] const orderBy: Result['orderBy'] = { column: null, @@ -70,7 +68,6 @@ const buildQuery = async function buildQuery({ adapter, collectionPath: sortPath, fields, - joinAliases, joins, locale, pathSegments: sortPath.replace(/__/g, '.').split('.'), @@ -105,7 +102,6 @@ const buildQuery = async function buildQuery({ where = await parseParams({ adapter, fields, - joinAliases, joins, locale, selectFields, @@ -115,7 +111,6 @@ const buildQuery = async function buildQuery({ } return { - joinAliases, joins, orderBy, selectFields, diff --git a/packages/db-postgres/src/queries/getTableColumnFromPath.ts b/packages/db-postgres/src/queries/getTableColumnFromPath.ts index 1e236f2a0d7..978f2414ba6 100644 --- a/packages/db-postgres/src/queries/getTableColumnFromPath.ts +++ b/packages/db-postgres/src/queries/getTableColumnFromPath.ts @@ -12,7 +12,7 @@ import toSnakeCase from 'to-snake-case' import { v4 as uuid } from 'uuid' import type { GenericColumn, GenericTable, PostgresAdapter } from '../types.js' -import type { BuildQueryJoinAliases, BuildQueryJoins } from './buildQuery.js' +import type { BuildQueryJoinAliases } from './buildQuery.js' type Constraint = { columnName: string @@ -38,8 +38,7 @@ type Args = { constraintPath?: string constraints?: Constraint[] fields: (Field | TabAsField)[] - joinAliases: BuildQueryJoinAliases - joins: BuildQueryJoins + joins: BuildQueryJoinAliases locale?: string pathSegments: string[] rootTableName?: string @@ -67,7 +66,6 @@ export const getTableColumnFromPath = ({ constraintPath: incomingConstraintPath, constraints = [], fields, - joinAliases, joins, locale: incomingLocale, pathSegments: incomingSegments, @@ -129,7 +127,6 @@ export const getTableColumnFromPath = ({ ...tab, type: 'tab', })), - joinAliases, joins, locale, pathSegments: pathSegments.slice(1), @@ -150,7 +147,6 @@ export const getTableColumnFromPath = ({ constraintPath: `${constraintPath}${field.name}.`, constraints, fields: field.fields, - joinAliases, joins, locale, pathSegments: pathSegments.slice(1), @@ -169,7 +165,6 @@ export const getTableColumnFromPath = ({ constraintPath, constraints, fields: field.fields, - joinAliases, joins, locale, pathSegments: pathSegments.slice(1), @@ -185,10 +180,10 @@ export const getTableColumnFromPath = ({ if (locale && field.localized && adapter.payload.config.localization) { newTableName = `${tableName}${adapter.localesSuffix}` - joins[tableName] = eq( - adapter.tables[tableName].id, - adapter.tables[newTableName]._parentID, - ) + joins.push({ + condition: eq(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID), + table: adapter.tables[newTableName], + }) if (locale !== 'all') { constraints.push({ columnName: '_locale', @@ -205,7 +200,6 @@ export const getTableColumnFromPath = ({ constraintPath: `${constraintPath}${field.name}.`, constraints, fields: field.fields, - joinAliases, joins, locale, pathSegments: pathSegments.slice(1), @@ -224,10 +218,13 @@ export const getTableColumnFromPath = ({ ) if (locale && field.localized && adapter.payload.config.localization) { - joins[newTableName] = and( - eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent), - eq(adapter.tables[newTableName]._locale, locale), - ) + joins.push({ + condition: and( + eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent), + eq(adapter.tables[newTableName]._locale, locale), + ), + table: adapter.tables[newTableName], + }) if (locale !== 'all') { constraints.push({ columnName: '_locale', @@ -236,10 +233,10 @@ export const getTableColumnFromPath = ({ }) } } else { - joins[newTableName] = eq( - adapter.tables[tableName].id, - adapter.tables[newTableName].parent, - ) + joins.push({ + condition: eq(adapter.tables[tableName].id, adapter.tables[newTableName].parent), + table: adapter.tables[newTableName], + }) } return { @@ -268,10 +265,10 @@ export const getTableColumnFromPath = ({ ] if (locale && field.localized && adapter.payload.config.localization) { - joins[newTableName] = and( - ...joinConstraints, - eq(adapter.tables[newTableName]._locale, locale), - ) + joins.push({ + condition: and(...joinConstraints, eq(adapter.tables[newTableName]._locale, locale)), + table: adapter.tables[newTableName], + }) if (locale !== 'all') { constraints.push({ columnName: 'locale', @@ -280,7 +277,10 @@ export const getTableColumnFromPath = ({ }) } } else { - joins[newTableName] = and(...joinConstraints) + joins.push({ + condition: and(...joinConstraints), + table: adapter.tables[newTableName], + }) } return { @@ -300,10 +300,13 @@ export const getTableColumnFromPath = ({ constraintPath = `${constraintPath}${field.name}.%.` if (locale && field.localized && adapter.payload.config.localization) { - joins[newTableName] = and( - eq(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID), - eq(adapter.tables[newTableName]._locale, locale), - ) + joins.push({ + condition: and( + eq(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID), + eq(adapter.tables[newTableName]._locale, locale), + ), + table: adapter.tables[newTableName], + }) if (locale !== 'all') { constraints.push({ columnName: '_locale', @@ -312,10 +315,10 @@ export const getTableColumnFromPath = ({ }) } } else { - joins[newTableName] = eq( - adapter.tables[tableName].id, - adapter.tables[newTableName]._parentID, - ) + joins.push({ + condition: eq(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID), + table: adapter.tables[newTableName], + }) } return getTableColumnFromPath({ adapter, @@ -323,7 +326,6 @@ export const getTableColumnFromPath = ({ constraintPath, constraints, fields: field.fields, - joinAliases, joins, locale, pathSegments: pathSegments.slice(1), @@ -344,18 +346,19 @@ export const getTableColumnFromPath = ({ const blockTypes = Array.isArray(value) ? value : [value] blockTypes.forEach((blockType) => { const block = field.blocks.find((block) => block.slug === blockType) - newTableName = adapter.tableNameMap.get( `${tableName}_blocks_${toSnakeCase(block.slug)}`, ) + const newAliasTableName = toSnakeCase(uuid()) + const newAliasTable = alias(adapter.tables[newTableName], newAliasTableName) - joins[newTableName] = eq( - adapter.tables[tableName].id, - adapter.tables[newTableName]._parentID, - ) + joins.push({ + condition: eq(adapter.tables[tableName].id, newAliasTable._parentID), + table: newAliasTable, + }) constraints.push({ columnName: '_path', - table: adapter.tables[newTableName], + table: newAliasTable, value: pathSegments[0], }) }) @@ -381,7 +384,6 @@ export const getTableColumnFromPath = ({ constraintPath, constraints: blockConstraints, fields: block.fields, - joinAliases, joins, locale, pathSegments: pathSegments.slice(1), @@ -400,10 +402,16 @@ export const getTableColumnFromPath = ({ constraints = constraints.concat(blockConstraints) selectFields = { ...selectFields, ...blockSelectFields } if (field.localized && adapter.payload.config.localization) { - joins[newTableName] = and( - eq(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID), - eq(adapter.tables[newTableName]._locale, locale), - ) + joins.push({ + condition: and( + eq( + (aliasTable || adapter.tables[tableName]).id, + adapter.tables[newTableName]._parentID, + ), + eq(adapter.tables[newTableName]._locale, locale), + ), + table: adapter.tables[newTableName], + }) if (locale) { constraints.push({ columnName: '_locale', @@ -412,10 +420,13 @@ export const getTableColumnFromPath = ({ }) } } else { - joins[newTableName] = eq( - adapter.tables[tableName].id, - adapter.tables[newTableName]._parentID, - ) + joins.push({ + condition: eq( + (aliasTable || adapter.tables[tableName]).id, + adapter.tables[newTableName]._parentID, + ), + table: adapter.tables[newTableName], + }) } return true }) @@ -434,116 +445,178 @@ export const getTableColumnFromPath = ({ case 'relationship': case 'upload': { - let relationshipFields - const relationTableName = `${rootTableName}${adapter.relationshipsSuffix}` const newCollectionPath = pathSegments.slice(1).join('.') - const aliasRelationshipTableName = uuid() - const aliasRelationshipTable = alias( - adapter.tables[relationTableName], - aliasRelationshipTableName, - ) + if (Array.isArray(field.relationTo) || (field.type === 'relationship' && field.hasMany)) { + let relationshipFields + const relationTableName = `${rootTableName}${adapter.relationshipsSuffix}` + const aliasRelationshipTableName = uuid() + const aliasRelationshipTable = alias( + adapter.tables[relationTableName], + aliasRelationshipTableName, + ) - // Join in the relationships table - if (locale && field.localized && adapter.payload.config.localization) { - joinAliases.push({ - condition: and( - eq((aliasTable || adapter.tables[rootTableName]).id, aliasRelationshipTable.parent), - eq(aliasRelationshipTable.locale, locale), - like(aliasRelationshipTable.path, `${constraintPath}${field.name}`), - ), - table: aliasRelationshipTable, - }) - if (locale !== 'all') { - constraints.push({ - columnName: 'locale', + // Join in the relationships table + if (locale && field.localized && adapter.payload.config.localization) { + joins.push({ + condition: and( + eq((aliasTable || adapter.tables[rootTableName]).id, aliasRelationshipTable.parent), + eq(aliasRelationshipTable.locale, locale), + like(aliasRelationshipTable.path, `${constraintPath}${field.name}`), + ), + table: aliasRelationshipTable, + }) + if (locale !== 'all') { + constraints.push({ + columnName: 'locale', + table: aliasRelationshipTable, + value: locale, + }) + } + } else { + // Join in the relationships table + joins.push({ + condition: and( + eq((aliasTable || adapter.tables[rootTableName]).id, aliasRelationshipTable.parent), + like(aliasRelationshipTable.path, `${constraintPath}${field.name}`), + ), table: aliasRelationshipTable, - value: locale, }) } - } else { - // Join in the relationships table - joinAliases.push({ - condition: and( - eq((aliasTable || adapter.tables[rootTableName]).id, aliasRelationshipTable.parent), - like(aliasRelationshipTable.path, `${constraintPath}${field.name}`), - ), - table: aliasRelationshipTable, - }) - } - selectFields[`${relationTableName}.path`] = aliasRelationshipTable.path + selectFields[`${relationTableName}.path`] = aliasRelationshipTable.path - let newAliasTable + let newAliasTable - if (typeof field.relationTo === 'string') { - const relationshipConfig = adapter.payload.collections[field.relationTo].config + if (typeof field.relationTo === 'string') { + const relationshipConfig = adapter.payload.collections[field.relationTo].config - newTableName = adapter.tableNameMap.get(toSnakeCase(relationshipConfig.slug)) + newTableName = adapter.tableNameMap.get(toSnakeCase(relationshipConfig.slug)) - // parent to relationship join table - relationshipFields = relationshipConfig.fields + // parent to relationship join table + relationshipFields = relationshipConfig.fields - newAliasTable = alias(adapter.tables[newTableName], toSnakeCase(uuid())) + newAliasTable = alias(adapter.tables[newTableName], toSnakeCase(uuid())) - joinAliases.push({ - condition: eq(newAliasTable.id, aliasRelationshipTable[`${field.relationTo}ID`]), - table: newAliasTable, - }) + joins.push({ + condition: eq(newAliasTable.id, aliasRelationshipTable[`${field.relationTo}ID`]), + table: newAliasTable, + }) + + if (newCollectionPath === '' || newCollectionPath === 'id') { + return { + columnName: `${field.relationTo}ID`, + constraints, + field, + table: aliasRelationshipTable, + } + } + } else if (newCollectionPath === 'value') { + const tableColumnsNames = field.relationTo.map((relationTo) => { + const relationTableName = adapter.tableNameMap.get( + toSnakeCase(adapter.payload.collections[relationTo].config.slug), + ) + + return `"${aliasRelationshipTableName}"."${relationTableName}_id"` + }) + return { + constraints, + field, + rawColumn: sql.raw(`COALESCE(${tableColumnsNames.join(', ')})`), + table: aliasRelationshipTable, + } + } else if (newCollectionPath === 'relationTo') { + const relationTo = Array.isArray(field.relationTo) + ? field.relationTo + : [field.relationTo] - if (newCollectionPath === '' || newCollectionPath === 'id') { return { - columnName: `${field.relationTo}ID`, constraints, field, + getNotNullColumnByValue: (val) => { + const matchedRelation = relationTo.find((relation) => relation === val) + if (matchedRelation) return `${matchedRelation}ID` + return undefined + }, table: aliasRelationshipTable, } + } else { + throw new APIError('Not supported') } - } else if (newCollectionPath === 'value') { - const tableColumnsNames = field.relationTo.map((relationTo) => { - const relationTableName = adapter.tableNameMap.get( - toSnakeCase(adapter.payload.collections[relationTo].config.slug), - ) - return `"${aliasRelationshipTableName}"."${relationTableName}_id"` - }) - return { + return getTableColumnFromPath({ + adapter, + aliasTable: newAliasTable, + collectionPath: newCollectionPath, constraints, - field, - rawColumn: sql.raw(`COALESCE(${tableColumnsNames.join(', ')})`), - table: aliasRelationshipTable, + fields: relationshipFields, + joins, + locale, + pathSegments: pathSegments.slice(1), + rootTableName: newTableName, + selectFields, + tableName: newTableName, + value, + }) + } else if ( + pathSegments.length > 1 && + !(pathSegments.length === 2 && pathSegments[1] === 'id') + ) { + // simple relationships + const columnName = `${columnPrefix}${field.name}` + const newTableName = adapter.tableNameMap.get( + toSnakeCase(adapter.payload.collections[field.relationTo].config.slug), + ) + const aliasTableName = uuid() + const newAliasTable = alias(adapter.tables[newTableName], aliasTableName) + + if (field.localized && adapter.payload.config.localization) { + const aliasLocaleTableName = uuid() + const aliasLocaleTable = alias( + adapter.tables[`${rootTableName}${adapter.localesSuffix}`], + aliasLocaleTableName, + ) + joins.push({ + condition: and( + eq(aliasLocaleTable._parentID, adapter.tables[rootTableName].id), + eq(aliasLocaleTable._locale, locale), + ), + table: aliasLocaleTable, + }) + joins.push({ + condition: eq(aliasLocaleTable[columnName], newAliasTable.id), + table: newAliasTable, + }) + } else { + joins.push({ + condition: eq( + newAliasTable.id, + aliasTable ? aliasTable[columnName] : adapter.tables[tableName][columnName], + ), + table: newAliasTable, + }) } - } else if (newCollectionPath === 'relationTo') { - const relationTo = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo] - return { + return getTableColumnFromPath({ + adapter, + aliasTable: newAliasTable, + collectionPath: newCollectionPath, + constraintPath: '', constraints, - field, - getNotNullColumnByValue: (val) => { - const matchedRelation = relationTo.find((relation) => relation === val) - if (matchedRelation) return `${matchedRelation}ID` - return undefined - }, - table: aliasRelationshipTable, - } - } else { - throw new APIError('Not supported') + fields: adapter.payload.collections[field.relationTo].config.fields, + joins, + locale, + pathSegments: pathSegments.slice(1), + selectFields, + tableName: newTableName, + value, + }) } + break + } - return getTableColumnFromPath({ - adapter, - aliasTable: newAliasTable, - collectionPath: newCollectionPath, - constraints, - fields: relationshipFields, - joinAliases, - joins, - locale, - pathSegments: pathSegments.slice(1), - rootTableName: newTableName, - selectFields, - tableName: newTableName, - value, - }) + default: { + // fall through + break } } @@ -551,11 +624,13 @@ export const getTableColumnFromPath = ({ if (field.localized && adapter.payload.config.localization) { // If localized, we go to localized table and set aliasTable to undefined // so it is not picked up below to be used as targetTable - newTableName = `${tableName}${adapter.localesSuffix}` - const parentTable = aliasTable || adapter.tables[tableName] + newTableName = `${tableName}${adapter.localesSuffix}` - joins[newTableName] = eq(parentTable.id, adapter.tables[newTableName]._parentID) + joins.push({ + condition: eq(parentTable.id, adapter.tables[newTableName]._parentID), + table: adapter.tables[newTableName], + }) aliasTable = undefined diff --git a/packages/db-postgres/src/queries/parseParams.ts b/packages/db-postgres/src/queries/parseParams.ts index 11341cb6712..8924df6dcbc 100644 --- a/packages/db-postgres/src/queries/parseParams.ts +++ b/packages/db-postgres/src/queries/parseParams.ts @@ -7,7 +7,7 @@ import { QueryError } from 'payload/errors' import { validOperators } from 'payload/types' import type { GenericColumn, PostgresAdapter } from '../types.js' -import type { BuildQueryJoinAliases, BuildQueryJoins } from './buildQuery.js' +import type { BuildQueryJoinAliases } from './buildQuery.js' import { buildAndOrConditions } from './buildAndOrConditions.js' import { convertPathToJSONTraversal } from './createJSONQuery/convertPathToJSONTraversal.js' @@ -19,8 +19,7 @@ import { sanitizeQueryValue } from './sanitizeQueryValue.js' type Args = { adapter: PostgresAdapter fields: Field[] - joinAliases: BuildQueryJoinAliases - joins: BuildQueryJoins + joins: BuildQueryJoinAliases locale: string selectFields: Record tableName: string @@ -30,7 +29,6 @@ type Args = { export async function parseParams({ adapter, fields, - joinAliases, joins, locale, selectFields, @@ -55,7 +53,6 @@ export async function parseParams({ const builtConditions = await buildAndOrConditions({ adapter, fields, - joinAliases, joins, locale, selectFields, @@ -86,7 +83,6 @@ export async function parseParams({ adapter, collectionPath: relationOrPath, fields, - joinAliases, joins, locale, pathSegments: relationOrPath.replace(/__/g, '.').split('.'), diff --git a/packages/db-postgres/src/queries/selectDistinct.ts b/packages/db-postgres/src/queries/selectDistinct.ts index 5231af41c78..28e9c664b72 100644 --- a/packages/db-postgres/src/queries/selectDistinct.ts +++ b/packages/db-postgres/src/queries/selectDistinct.ts @@ -2,7 +2,7 @@ import type { QueryPromise, SQL } from 'drizzle-orm' import type { ChainedMethods } from '../find/chainMethods.js' import type { DrizzleDB, PostgresAdapter } from '../types.js' -import type { BuildQueryJoinAliases, BuildQueryJoins } from './buildQuery.js' +import type { BuildQueryJoinAliases } from './buildQuery.js' import { chainMethods } from '../find/chainMethods.js' import { type GenericColumn } from '../types.js' @@ -11,8 +11,7 @@ type Args = { adapter: PostgresAdapter chainedMethods?: ChainedMethods db: DrizzleDB - joinAliases: BuildQueryJoinAliases - joins: BuildQueryJoins + joins: BuildQueryJoinAliases selectFields: Record tableName: string where: SQL @@ -25,33 +24,23 @@ export const selectDistinct = ({ adapter, chainedMethods = [], db, - joinAliases, joins, selectFields, tableName, where, }: Args): QueryPromise & { id: number | string }[]> => { - if (Object.keys(joins).length > 0 || joinAliases.length > 0) { + if (Object.keys(joins).length > 0) { if (where) { chainedMethods.push({ args: [where], method: 'where' }) } - joinAliases.forEach(({ condition, table }) => { + joins.forEach(({ condition, table }) => { chainedMethods.push({ args: [table, condition], method: 'leftJoin', }) }) - Object.entries(joins).forEach(([joinTable, condition]) => { - if (joinTable) { - chainedMethods.push({ - args: [adapter.tables[joinTable], condition], - method: 'leftJoin', - }) - } - }) - return chainMethods({ methods: chainedMethods, query: db.selectDistinct(selectFields).from(adapter.tables[tableName]), diff --git a/packages/db-postgres/src/schema/build.ts b/packages/db-postgres/src/schema/build.ts index e685b38720b..3a35b3a6516 100644 --- a/packages/db-postgres/src/schema/build.ts +++ b/packages/db-postgres/src/schema/build.ts @@ -34,17 +34,18 @@ export type BaseExtraConfig = Record< (cols: GenericColumns) => ForeignKeyBuilder | IndexBuilder | UniqueConstraintBuilder > +export type RelationMap = Map + type Args = { adapter: PostgresAdapter baseColumns?: Record baseExtraConfig?: BaseExtraConfig buildNumbers?: boolean buildRelationships?: boolean - buildTexts?: boolean disableNotNull: boolean disableUnique: boolean fields: Field[] - rootRelationsToBuild?: Map + rootRelationsToBuild?: RelationMap rootRelationships?: Set rootTableIDColType?: string rootTableName?: string @@ -56,16 +57,13 @@ type Args = { type Result = { hasManyNumberField: 'index' | boolean hasManyTextField: 'index' | boolean - relationsToBuild: Map + relationsToBuild: RelationMap } export const buildTable = ({ adapter, baseColumns = {}, baseExtraConfig = {}, - buildNumbers, - buildRelationships, - buildTexts, disableNotNull, disableUnique = false, fields, @@ -77,6 +75,7 @@ export const buildTable = ({ timestamps, versions, }: Args): Result => { + const isRoot = !incomingRootTableName const rootTableName = incomingRootTableName || tableName const columns: Record = baseColumns const indexes: Record IndexBuilder> = {} @@ -93,7 +92,7 @@ export const buildTable = ({ let relationshipsTable: GenericTable | PgTableWithColumns // Drizzle relations - const relationsToBuild: Map = new Map() + const relationsToBuild: RelationMap = new Map() const idColType: IDType = setColumnID({ adapter, columns, fields }) @@ -106,9 +105,6 @@ export const buildTable = ({ hasManyTextField, } = traverseFields({ adapter, - buildNumbers, - buildRelationships, - buildTexts, columns, disableNotNull, disableUnique, @@ -126,6 +122,15 @@ export const buildTable = ({ versions, }) + // split the relationsToBuild by localized and non-localized + const localizedRelations = new Map() + const nonLocalizedRelations = new Map() + + relationsToBuild.forEach(({ type, localized, target }, key) => { + const map = localized ? localizedRelations : nonLocalizedRelations + map.set(key, { type, target }) + }) + if (timestamps) { columns.createdAt = timestamp('created_at', { mode: 'string', @@ -159,7 +164,7 @@ export const buildTable = ({ adapter.tables[tableName] = table - if (hasLocalizedField) { + if (hasLocalizedField || localizedRelations.size) { const localeTableName = `${tableName}${adapter.localesSuffix}` localesColumns.id = serial('id').primaryKey() localesColumns._locale = adapter.enums.enum__locales('_locale').notNull() @@ -187,114 +192,134 @@ export const buildTable = ({ adapter.tables[localeTableName] = localesTable - const localesTableRelations = relations(localesTable, ({ one }) => ({ - _parentID: one(table, { + adapter.relations[`relations_${localeTableName}`] = relations(localesTable, ({ many, one }) => { + const result: Record> = {} + + result._parentID = one(table, { fields: [localesTable._parentID], references: [table.id], - }), - })) - - adapter.relations[`relations_${localeTableName}`] = localesTableRelations - } - - if (hasManyTextField && buildTexts) { - const textsTableName = `${rootTableName}_texts` - const columns: Record = { - id: serial('id').primaryKey(), - order: integer('order').notNull(), - parent: parentIDColumnMap[idColType]('parent_id').notNull(), - path: varchar('path').notNull(), - text: varchar('text'), - } + // name the relationship by what the many() relationName is + relationName: '_locales', + }) - if (hasLocalizedManyTextField) { - columns.locale = adapter.enums.enum__locales('locale') - } + localizedRelations.forEach(({ type, target }, key) => { + if (type === 'one') { + result[key] = one(adapter.tables[target], { + fields: [localesTable[key]], + references: [adapter.tables[target].id], + relationName: key, + }) + } + if (type === 'many') { + result[key] = many(adapter.tables[target], { + relationName: key, + }) + } + }) - textsTable = adapter.pgSchema.table(textsTableName, columns, (cols) => { - const config: Record = { - orderParentIdx: index(`${textsTableName}_order_parent_idx`).on(cols.order, cols.parent), - parentFk: foreignKey({ - name: `${textsTableName}_parent_fk`, - columns: [cols.parent], - foreignColumns: [table.id], - }).onDelete('cascade'), - } + return result + }) + } - if (hasManyTextField === 'index') { - config.text_idx = index(`${textsTableName}_text_idx`).on(cols.text) + if (isRoot) { + if (hasManyTextField) { + const textsTableName = `${rootTableName}_texts` + const columns: Record = { + id: serial('id').primaryKey(), + order: integer('order').notNull(), + parent: parentIDColumnMap[idColType]('parent_id').notNull(), + path: varchar('path').notNull(), + text: varchar('text'), } if (hasLocalizedManyTextField) { - config.localeParent = index(`${textsTableName}_locale_parent`).on(cols.locale, cols.parent) + columns.locale = adapter.enums.enum__locales('locale') } - return config - }) + textsTable = adapter.pgSchema.table(textsTableName, columns, (cols) => { + const config: Record = { + orderParentIdx: index(`${textsTableName}_order_parent_idx`).on(cols.order, cols.parent), + parentFk: foreignKey({ + name: `${textsTableName}_parent_fk`, + columns: [cols.parent], + foreignColumns: [table.id], + }).onDelete('cascade'), + } - adapter.tables[textsTableName] = textsTable + if (hasManyTextField === 'index') { + config.text_idx = index(`${textsTableName}_text_idx`).on(cols.text) + } - const textsTableRelations = relations(textsTable, ({ one }) => ({ - parent: one(table, { - fields: [textsTable.parent], - references: [table.id], - }), - })) + if (hasLocalizedManyTextField) { + config.localeParent = index(`${textsTableName}_locale_parent`).on( + cols.locale, + cols.parent, + ) + } - adapter.relations[`relations_${textsTableName}`] = textsTableRelations - } + return config + }) - if (hasManyNumberField && buildNumbers) { - const numbersTableName = `${rootTableName}_numbers` - const columns: Record = { - id: serial('id').primaryKey(), - number: numeric('number'), - order: integer('order').notNull(), - parent: parentIDColumnMap[idColType]('parent_id').notNull(), - path: varchar('path').notNull(), - } + adapter.tables[textsTableName] = textsTable - if (hasLocalizedManyNumberField) { - columns.locale = adapter.enums.enum__locales('locale') + adapter.relations[`relations_${textsTableName}`] = relations(textsTable, ({ one }) => ({ + parent: one(table, { + fields: [textsTable.parent], + references: [table.id], + relationName: '_texts', + }), + })) } - numbersTable = adapter.pgSchema.table(numbersTableName, columns, (cols) => { - const config: Record = { - orderParentIdx: index(`${numbersTableName}_order_parent_idx`).on(cols.order, cols.parent), - parentFk: foreignKey({ - name: `${numbersTableName}_parent_fk`, - columns: [cols.parent], - foreignColumns: [table.id], - }).onDelete('cascade'), - } - - if (hasManyNumberField === 'index') { - config.numberIdx = index(`${numbersTableName}_number_idx`).on(cols.number) + if (hasManyNumberField) { + const numbersTableName = `${rootTableName}_numbers` + const columns: Record = { + id: serial('id').primaryKey(), + number: numeric('number'), + order: integer('order').notNull(), + parent: parentIDColumnMap[idColType]('parent_id').notNull(), + path: varchar('path').notNull(), } if (hasLocalizedManyNumberField) { - config.localeParent = index(`${numbersTableName}_locale_parent`).on( - cols.locale, - cols.parent, - ) + columns.locale = adapter.enums.enum__locales('locale') } - return config - }) + numbersTable = adapter.pgSchema.table(numbersTableName, columns, (cols) => { + const config: Record = { + orderParentIdx: index(`${numbersTableName}_order_parent_idx`).on(cols.order, cols.parent), + parentFk: foreignKey({ + name: `${numbersTableName}_parent_fk`, + columns: [cols.parent], + foreignColumns: [table.id], + }).onDelete('cascade'), + } - adapter.tables[numbersTableName] = numbersTable + if (hasManyNumberField === 'index') { + config.numberIdx = index(`${numbersTableName}_number_idx`).on(cols.number) + } - const numbersTableRelations = relations(numbersTable, ({ one }) => ({ - parent: one(table, { - fields: [numbersTable.parent], - references: [table.id], - }), - })) + if (hasLocalizedManyNumberField) { + config.localeParent = index(`${numbersTableName}_locale_parent`).on( + cols.locale, + cols.parent, + ) + } - adapter.relations[`relations_${numbersTableName}`] = numbersTableRelations - } + return config + }) + + adapter.tables[numbersTableName] = numbersTable + + adapter.relations[`relations_${numbersTableName}`] = relations(numbersTable, ({ one }) => ({ + parent: one(table, { + fields: [numbersTable.parent], + references: [table.id], + relationName: '_numbers', + }), + })) + } - if (buildRelationships) { if (relationships.size) { const relationshipColumns: Record = { id: serial('id').primaryKey(), @@ -308,7 +333,6 @@ export const buildTable = ({ } const relationExtraConfig: BaseExtraConfig = {} - const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}` relationships.forEach((relationTo) => { @@ -319,7 +343,6 @@ export const buildTable = ({ throwValidationError: true, }) let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer' - const relatedCollectionCustomIDType = adapter.payload.collections[relationshipConfig.slug]?.customIDType @@ -371,51 +394,63 @@ export const buildTable = ({ adapter.tables[relationshipsTableName] = relationshipsTable - const relationshipsTableRelations = relations(relationshipsTable, ({ one }) => { - const result: Record> = { - parent: one(table, { - fields: [relationshipsTable.parent], - references: [table.id], - relationName: '_rels', - }), - } + adapter.relations[`relations_${relationshipsTableName}`] = relations( + relationshipsTable, + ({ one }) => { + const result: Record> = { + parent: one(table, { + fields: [relationshipsTable.parent], + references: [table.id], + relationName: '_rels', + }), + } - relationships.forEach((relationTo) => { - const relatedTableName = createTableName({ - adapter, - config: adapter.payload.collections[relationTo].config, - throwValidationError: true, - }) - const idColumnName = `${relationTo}ID` - result[idColumnName] = one(adapter.tables[relatedTableName], { - fields: [relationshipsTable[idColumnName]], - references: [adapter.tables[relatedTableName].id], + relationships.forEach((relationTo) => { + const relatedTableName = createTableName({ + adapter, + config: adapter.payload.collections[relationTo].config, + throwValidationError: true, + }) + const idColumnName = `${relationTo}ID` + result[idColumnName] = one(adapter.tables[relatedTableName], { + fields: [relationshipsTable[idColumnName]], + references: [adapter.tables[relatedTableName].id], + relationName: relationTo, + }) }) - }) - - return result - }) - adapter.relations[`relations_${relationshipsTableName}`] = relationshipsTableRelations + return result + }, + ) } } - const tableRelations = relations(table, ({ many }) => { + adapter.relations[`relations_${tableName}`] = relations(table, ({ many, one }) => { const result: Record> = {} - relationsToBuild.forEach((val, key) => { - result[key] = many(adapter.tables[val]) + nonLocalizedRelations.forEach(({ type, target }, key) => { + if (type === 'one') { + result[key] = one(adapter.tables[target], { + fields: [table[key]], + references: [adapter.tables[target].id], + relationName: key, + }) + } + if (type === 'many') { + result[key] = many(adapter.tables[target], { relationName: key }) + } }) if (hasLocalizedField) { - result._locales = many(localesTable) + result._locales = many(localesTable, { relationName: '_locales' }) } if (hasManyTextField) { - result._texts = many(textsTable) + result._texts = many(textsTable, { relationName: '_texts' }) } + if (hasManyNumberField) { - result._numbers = many(numbersTable) + result._numbers = many(numbersTable, { relationName: '_numbers' }) } if (relationships.size && relationshipsTable) { @@ -427,7 +462,5 @@ export const buildTable = ({ return result }) - adapter.relations[`relations_${tableName}`] = tableRelations - return { hasManyNumberField, hasManyTextField, relationsToBuild } } diff --git a/packages/db-postgres/src/schema/traverseFields.ts b/packages/db-postgres/src/schema/traverseFields.ts index 69fc0922648..1f9f9748bcf 100644 --- a/packages/db-postgres/src/schema/traverseFields.ts +++ b/packages/db-postgres/src/schema/traverseFields.ts @@ -24,7 +24,7 @@ import { fieldAffectsData, optionIsObject } from 'payload/types' import toSnakeCase from 'to-snake-case' import type { GenericColumns, IDType, PostgresAdapter } from '../types.js' -import type { BaseExtraConfig } from './build.js' +import type { BaseExtraConfig, RelationMap } from './build.js' import { hasLocalesTable } from '../utilities/hasLocalesTable.js' import { buildTable } from './build.js' @@ -36,9 +36,6 @@ import { validateExistingBlockIsIdentical } from './validateExistingBlockIsIdent type Args = { adapter: PostgresAdapter - buildNumbers: boolean - buildRelationships: boolean - buildTexts: boolean columnPrefix?: string columns: Record disableNotNull: boolean @@ -51,9 +48,9 @@ type Args = { localesIndexes: Record IndexBuilder> newTableName: string parentTableName: string - relationsToBuild: Map + relationsToBuild: RelationMap relationships: Set - rootRelationsToBuild?: Map + rootRelationsToBuild?: RelationMap rootTableIDColType: string rootTableName: string versions: boolean @@ -70,9 +67,6 @@ type Result = { export const traverseFields = ({ adapter, - buildNumbers, - buildRelationships, - buildTexts, columnPrefix, columns, disableNotNull, @@ -121,7 +115,13 @@ export const traverseFields = ({ // If field is localized, // add the column to the locale table instead of main table - if (adapter.payload.config.localization && (field.localized || forceLocalized)) { + if ( + adapter.payload.config.localization && + (field.localized || forceLocalized) && + field.type !== 'array' && + field.type !== 'blocks' && + (('hasMany' in field && field.hasMany !== true) || !('hasMany' in field)) + ) { hasLocalizedField = true targetTable = localesColumns targetIndexes = localesIndexes @@ -250,6 +250,7 @@ export const traverseFields = ({ parentTableName: newTableName, prefix: `${newTableName}_`, throwValidationError, + versionsCustomName: versions, }) const baseColumns: Record = { order: integer('order').notNull(), @@ -264,7 +265,7 @@ export const traverseFields = ({ name: `${selectTableName}_parent_fk`, columns: [cols.parent], foreignColumns: [adapter.tables[parentTableName].id], - }), + }).onDelete('cascade'), parentIdx: (cols) => index(`${selectTableName}_parent_idx`).on(cols.parent), } @@ -285,24 +286,28 @@ export const traverseFields = ({ disableNotNull, disableUnique, fields: [], + rootTableName, tableName: selectTableName, versions, }) - relationsToBuild.set(fieldName, selectTableName) + relationsToBuild.set(fieldName, { + type: 'many', + // selects have their own localized table, independent of the base table. + localized: false, + target: selectTableName, + }) - const selectTableRelations = relations(adapter.tables[selectTableName], ({ one }) => { - const result: Record> = { + adapter.relations[`relations_${selectTableName}`] = relations( + adapter.tables[selectTableName], + ({ one }) => ({ parent: one(adapter.tables[parentTableName], { fields: [adapter.tables[selectTableName].parent], references: [adapter.tables[parentTableName].id], + relationName: fieldName, }), - } - - return result - }) - - adapter.relations[`relation_${selectTableName}`] = selectTableRelations + }), + ) } else { targetTable[fieldName] = adapter.enums[enumName](fieldName) } @@ -376,28 +381,49 @@ export const traverseFields = ({ hasManyNumberField = subHasManyNumberField } - relationsToBuild.set(fieldName, arrayTableName) - - const arrayTableRelations = relations(adapter.tables[arrayTableName], ({ many, one }) => { - const result: Record> = { - _parentID: one(adapter.tables[parentTableName], { - fields: [adapter.tables[arrayTableName]._parentID], - references: [adapter.tables[parentTableName].id], - }), - } + relationsToBuild.set(fieldName, { + type: 'many', + // arrays have their own localized table, independent of the base table. + localized: false, + target: arrayTableName, + }) - if (hasLocalesTable(field.fields)) { - result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`]) - } + adapter.relations[`relations_${arrayTableName}`] = relations( + adapter.tables[arrayTableName], + ({ many, one }) => { + const result: Record> = { + _parentID: one(adapter.tables[parentTableName], { + fields: [adapter.tables[arrayTableName]._parentID], + references: [adapter.tables[parentTableName].id], + relationName: fieldName, + }), + } - subRelationsToBuild.forEach((val, key) => { - result[key] = many(adapter.tables[val]) - }) + if (hasLocalesTable(field.fields)) { + result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`], { + relationName: '_locales', + }) + } - return result - }) + subRelationsToBuild.forEach(({ type, localized, target }, key) => { + if (type === 'one') { + const arrayWithLocalized = localized + ? `${arrayTableName}${adapter.localesSuffix}` + : arrayTableName + result[key] = one(adapter.tables[target], { + fields: [adapter.tables[arrayWithLocalized][key]], + references: [adapter.tables[target].id], + relationName: key, + }) + } + if (type === 'many') { + result[key] = many(adapter.tables[target], { relationName: key }) + } + }) - adapter.relations[`relations_${arrayTableName}`] = arrayTableRelations + return result + }, + ) break } @@ -468,31 +494,43 @@ export const traverseFields = ({ hasManyNumberField = subHasManyNumberField } - const blockTableRelations = relations( + adapter.relations[`relations_${blockTableName}`] = relations( adapter.tables[blockTableName], ({ many, one }) => { const result: Record> = { _parentID: one(adapter.tables[rootTableName], { fields: [adapter.tables[blockTableName]._parentID], references: [adapter.tables[rootTableName].id], + relationName: `_blocks_${block.slug}`, }), } if (hasLocalesTable(block.fields)) { result._locales = many( adapter.tables[`${blockTableName}${adapter.localesSuffix}`], + { relationName: '_locales' }, ) } - subRelationsToBuild.forEach((val, key) => { - result[key] = many(adapter.tables[val]) + subRelationsToBuild.forEach(({ type, localized, target }, key) => { + if (type === 'one') { + const blockWithLocalized = localized + ? `${blockTableName}${adapter.localesSuffix}` + : blockTableName + result[key] = one(adapter.tables[target], { + fields: [adapter.tables[blockWithLocalized][key]], + references: [adapter.tables[target].id], + relationName: key, + }) + } + if (type === 'many') { + result[key] = many(adapter.tables[target], { relationName: key }) + } }) return result }, ) - - adapter.relations[`relations_${blockTableName}`] = blockTableRelations } else if (process.env.NODE_ENV !== 'production' && !versions) { validateExistingBlockIsIdentical({ block, @@ -502,7 +540,13 @@ export const traverseFields = ({ tableLocales: adapter.tables[`${blockTableName}${adapter.localesSuffix}`], }) } - rootRelationsToBuild.set(`_blocks_${block.slug}`, blockTableName) + // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks + rootRelationsToBuild.set(`_blocks_${block.slug}`, { + type: 'many', + // blocks are not localized on the parent table + localized: false, + target: blockTableName, + }) }) break @@ -520,9 +564,6 @@ export const traverseFields = ({ hasManyTextField: groupHasManyTextField, } = traverseFields({ adapter, - buildNumbers, - buildRelationships, - buildTexts, columnPrefix, columns, disableNotNull, @@ -563,9 +604,6 @@ export const traverseFields = ({ hasManyTextField: groupHasManyTextField, } = traverseFields({ adapter, - buildNumbers, - buildRelationships, - buildTexts, columnPrefix: `${columnName}_`, columns, disableNotNull: disableNotNullFromHere, @@ -607,9 +645,6 @@ export const traverseFields = ({ hasManyTextField: tabHasManyTextField, } = traverseFields({ adapter, - buildNumbers, - buildRelationships, - buildTexts, columnPrefix, columns, disableNotNull: disableNotNullFromHere, @@ -651,9 +686,6 @@ export const traverseFields = ({ hasManyTextField: rowHasManyTextField, } = traverseFields({ adapter, - buildNumbers, - buildRelationships, - buildTexts, columnPrefix, columns, disableNotNull: disableNotNullFromHere, @@ -687,13 +719,45 @@ export const traverseFields = ({ case 'upload': if (Array.isArray(field.relationTo)) { field.relationTo.forEach((relation) => relationships.add(relation)) - } else { + } else if (field.type === 'relationship' && field.hasMany) { relationships.add(field.relationTo) - } + } else { + // simple relationships get a column on the targetTable with a foreign key to the relationTo table + const relationshipConfig = adapter.payload.collections[field.relationTo].config + + const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo)) + + // get the id type of the related collection + let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer' + const relatedCollectionCustomID = relationshipConfig.fields.find( + (field) => fieldAffectsData(field) && field.name === 'id', + ) + if (relatedCollectionCustomID?.type === 'number') colType = 'numeric' + if (relatedCollectionCustomID?.type === 'text') colType = 'varchar' + + // make the foreign key column for relationship using the correct id column type + targetTable[fieldName] = parentIDColumnMap[colType](`${columnName}_id`).references( + () => adapter.tables[tableName].id, + { onDelete: 'set null' }, + ) + + // add relationship to table + relationsToBuild.set(fieldName, { + type: 'one', + localized: adapter.payload.config.localization && field.localized, + target: tableName, + }) - if (field.localized && adapter.payload.config.localization) { + // add notNull when not required + if (!disableNotNull && field.required && !field.admin?.condition) { + targetTable[fieldName].notNull() + } + break + } + if (adapter.payload.config.localization && field.localized) { hasLocalizedRelationshipField = true } + break default: diff --git a/packages/db-postgres/src/transform/read/index.ts b/packages/db-postgres/src/transform/read/index.ts index aeb4f911f23..b584c7e98ce 100644 --- a/packages/db-postgres/src/transform/read/index.ts +++ b/packages/db-postgres/src/transform/read/index.ts @@ -2,11 +2,14 @@ import type { SanitizedConfig } from 'payload/config' import type { Field, TypeWithID } from 'payload/types' +import type { PostgresAdapter } from '../../types.js' + import { createBlocksMap } from '../../utilities/createBlocksMap.js' import { createPathMap } from '../../utilities/createRelationshipMap.js' import { traverseFields } from './traverseFields.js' type TransformArgs = { + adapter: PostgresAdapter config: SanitizedConfig data: Record fallbackLocale?: false | string @@ -16,7 +19,12 @@ type TransformArgs = { // This is the entry point to transform Drizzle output data // into the shape Payload expects based on field schema -export const transform = ({ config, data, fields }: TransformArgs): T => { +export const transform = ({ + adapter, + config, + data, + fields, +}: TransformArgs): T => { let relationships: Record[]> = {} let texts: Record[]> = {} let numbers: Record[]> = {} @@ -40,6 +48,7 @@ export const transform = ({ config, data, fields }: Transf const deletions = [] const result = traverseFields({ + adapter, blocks, config, dataRef: { diff --git a/packages/db-postgres/src/transform/read/relationship.ts b/packages/db-postgres/src/transform/read/relationship.ts index d606a45709a..5d40484d2d8 100644 --- a/packages/db-postgres/src/transform/read/relationship.ts +++ b/packages/db-postgres/src/transform/read/relationship.ts @@ -30,10 +30,6 @@ export const transformRelationship = ({ field, locale, ref, relations }: Args) = value: matchedRelation[1], } } - } else { - // Handle hasOne - const relatedData = relation[`${field.relationTo}ID`] - result = relatedData } } } else { diff --git a/packages/db-postgres/src/transform/read/traverseFields.ts b/packages/db-postgres/src/transform/read/traverseFields.ts index 0e9abd5689e..444be1d525a 100644 --- a/packages/db-postgres/src/transform/read/traverseFields.ts +++ b/packages/db-postgres/src/transform/read/traverseFields.ts @@ -4,6 +4,7 @@ import type { Field, TabAsField } from 'payload/types' import { fieldAffectsData } from 'payload/types' +import type { PostgresAdapter } from '../../types.js' import type { BlocksMap } from '../../utilities/createBlocksMap.js' import { transformHasManyNumber } from './hasManyNumber.js' @@ -11,6 +12,10 @@ import { transformHasManyText } from './hasManyText.js' import { transformRelationship } from './relationship.js' type TraverseFieldsArgs = { + /** + * The DB adapter + */ + adapter: PostgresAdapter /** * Pre-formatted blocks map */ @@ -60,6 +65,7 @@ type TraverseFieldsArgs = { // Traverse fields recursively, transforming data // for each field type into required Payload shape export const traverseFields = >({ + adapter, blocks, config, dataRef, @@ -77,6 +83,7 @@ export const traverseFields = >({ const formatted = fields.reduce((result, field) => { if (field.type === 'tabs') { traverseFields({ + adapter, blocks, config, dataRef, @@ -97,6 +104,7 @@ export const traverseFields = >({ (field.type === 'tab' && !('name' in field)) ) { traverseFields({ + adapter, blocks, config, dataRef, @@ -114,6 +122,11 @@ export const traverseFields = >({ if (fieldAffectsData(field)) { const fieldName = `${fieldPrefix || ''}${field.name}` const fieldData = table[fieldName] + const localizedFieldData = {} + const valuesToTransform: { + ref: Record + table: Record + }[] = [] if (fieldPrefix) { deletions.push(() => delete table[fieldName]) @@ -134,6 +147,7 @@ export const traverseFields = >({ } const rowResult = traverseFields({ + adapter, blocks, config, dataRef: data, @@ -168,6 +182,7 @@ export const traverseFields = >({ } return traverseFields({ + adapter, blocks, config, dataRef: row, @@ -212,6 +227,7 @@ export const traverseFields = >({ if (block) { const blockResult = traverseFields({ + adapter, blocks, config, dataRef: row, @@ -243,6 +259,7 @@ export const traverseFields = >({ if (block) { return traverseFields({ + adapter, blocks, config, dataRef: row, @@ -266,49 +283,63 @@ export const traverseFields = >({ } if (field.type === 'relationship' || field.type === 'upload') { - const relationPathMatch = relationships[`${sanitizedPath}${field.name}`] - if (!relationPathMatch) { - if ('hasMany' in field && field.hasMany) { - if (field.localized && config.localization && config.localization.locales) { - result[field.name] = { - [config.localization.defaultLocale]: [], + if (typeof field.relationTo === 'string' && !('hasMany' in field && field.hasMany)) { + if ( + field.localized && + config.localization && + config.localization.locales && + Array.isArray(table?._locales) + ) { + table._locales.forEach((localeRow) => { + result[field.name] = { [localeRow._locale]: localeRow[fieldName] } + }) + } else { + valuesToTransform.push({ ref: result, table }) + } + } else { + const relationPathMatch = relationships[`${sanitizedPath}${field.name}`] + if (!relationPathMatch) { + if ('hasMany' in field && field.hasMany) { + if (field.localized && config.localization && config.localization.locales) { + result[field.name] = { + [config.localization.defaultLocale]: [], + } + } else { + result[field.name] = [] } - } else { - result[field.name] = [] } - } - return result - } + return result + } - if (field.localized) { - result[field.name] = {} - const relationsByLocale: Record[]> = {} + if (field.localized) { + result[field.name] = {} + const relationsByLocale: Record[]> = {} - relationPathMatch.forEach((row) => { - if (typeof row.locale === 'string') { - if (!relationsByLocale[row.locale]) relationsByLocale[row.locale] = [] - relationsByLocale[row.locale].push(row) - } - }) + relationPathMatch.forEach((row) => { + if (typeof row.locale === 'string') { + if (!relationsByLocale[row.locale]) relationsByLocale[row.locale] = [] + relationsByLocale[row.locale].push(row) + } + }) - Object.entries(relationsByLocale).forEach(([locale, relations]) => { + Object.entries(relationsByLocale).forEach(([locale, relations]) => { + transformRelationship({ + field, + locale, + ref: result, + relations, + }) + }) + } else { transformRelationship({ field, - locale, ref: result, - relations, + relations: relationPathMatch, }) - }) - } else { - transformRelationship({ - field, - ref: result, - relations: relationPathMatch, - }) + } + return result } - - return result } if (field.type === 'text' && field?.hasMany) { @@ -397,12 +428,6 @@ export const traverseFields = >({ return result } - const localizedFieldData = {} - const valuesToTransform: { - ref: Record - table: Record - }[] = [] - if (field.localized && Array.isArray(table._locales)) { table._locales.forEach((localeRow) => { valuesToTransform.push({ ref: localizedFieldData, table: localeRow }) @@ -414,6 +439,7 @@ export const traverseFields = >({ valuesToTransform.forEach(({ ref, table }) => { const fieldData = table[`${fieldPrefix || ''}${field.name}`] const locale = table?._locale + let val = fieldData switch (field.type) { case 'tab': @@ -428,6 +454,7 @@ export const traverseFields = >({ Object.entries(ref).forEach(([groupLocale, groupLocaleData]) => { ref[groupLocale] = traverseFields>({ + adapter, blocks, config, dataRef: groupLocaleData as Record, @@ -448,6 +475,7 @@ export const traverseFields = >({ const groupData = {} ref[field.name] = traverseFields>({ + adapter, blocks, config, dataRef: groupData as Record, @@ -465,65 +493,55 @@ export const traverseFields = >({ } } - break + return } case 'text': { - let val = fieldData if (typeof fieldData === 'string') { val = String(fieldData) } - if (typeof locale === 'string') { - ref[locale] = val - } else { - result[field.name] = val - } - break } case 'number': { - let val = fieldData if (typeof fieldData === 'string') { val = Number.parseFloat(fieldData) } - if (typeof locale === 'string') { - ref[locale] = val - } else { - result[field.name] = val - } - break } case 'date': { - let val = fieldData - if (typeof fieldData === 'string') { val = new Date(fieldData).toISOString() } - if (typeof locale === 'string') { - ref[locale] = val - } else { - result[field.name] = val + break + } + + case 'relationship': + case 'upload': { + if ( + val && + typeof field.relationTo === 'string' && + adapter.payload.collections[field.relationTo].customIDType === 'number' + ) { + val = Number(val) } break } default: { - if (typeof locale === 'string') { - ref[locale] = fieldData - } else { - result[field.name] = fieldData - } - break } } + if (typeof locale === 'string') { + ref[locale] = val + } else { + result[field.name] = val + } }) if (Object.keys(localizedFieldData).length > 0) { diff --git a/packages/db-postgres/src/transform/write/traverseFields.ts b/packages/db-postgres/src/transform/write/traverseFields.ts index 656f2eabc7a..8680414976a 100644 --- a/packages/db-postgres/src/transform/write/traverseFields.ts +++ b/packages/db-postgres/src/transform/write/traverseFields.ts @@ -354,7 +354,10 @@ export const traverseFields = ({ if (field.type === 'relationship' || field.type === 'upload') { const relationshipPath = `${path || ''}${field.name}` - if (field.localized) { + if ( + field.localized && + (Array.isArray(field.relationTo) || ('hasMany' in field && field.hasMany)) + ) { if (typeof fieldData === 'object') { Object.entries(fieldData).forEach(([localeKey, localeData]) => { if (localeData === null) { @@ -376,7 +379,8 @@ export const traverseFields = ({ }) }) } - } else { + return + } else if (Array.isArray(field.relationTo) || ('hasMany' in field && field.hasMany)) { if (fieldData === null || (Array.isArray(fieldData) && fieldData.length === 0)) { relationshipsToDelete.push({ path: relationshipPath }) return @@ -390,9 +394,30 @@ export const traverseFields = ({ field, relationships, }) + return + } else { + if ( + !field.localized && + fieldData && + typeof fieldData === 'object' && + 'id' in fieldData && + fieldData?.id + ) { + fieldData = fieldData.id + } else if (field.localized) { + if (typeof fieldData === 'object') { + Object.entries(fieldData).forEach(([localeKey, localeData]) => { + if (typeof localeData === 'object') { + if (localeData && 'id' in localeData && localeData?.id) { + fieldData[localeKey] = localeData.id + } + } else { + fieldData[localeKey] = localeData + } + }) + } + } } - - return } if (field.type === 'text' && field.hasMany) { diff --git a/packages/db-postgres/src/update.ts b/packages/db-postgres/src/update.ts index b3717e44f41..c9caa28adcf 100644 --- a/packages/db-postgres/src/update.ts +++ b/packages/db-postgres/src/update.ts @@ -18,7 +18,7 @@ export const updateOne: UpdateOne = async function updateOne( const whereToUse = whereArg || { id: { equals: id } } let idToUpdate = id - const { joinAliases, joins, selectFields, where } = await buildQuery({ + const { joins, selectFields, where } = await buildQuery({ adapter: this, fields: collection.fields, locale, @@ -30,7 +30,6 @@ export const updateOne: UpdateOne = async function updateOne( adapter: this, chainedMethods: [{ args: [1], method: 'limit' }], db, - joinAliases, joins, selectFields, tableName, diff --git a/packages/db-postgres/src/upsertRow/index.ts b/packages/db-postgres/src/upsertRow/index.ts index 3b24230143c..55f13fa2421 100644 --- a/packages/db-postgres/src/upsertRow/index.ts +++ b/packages/db-postgres/src/upsertRow/index.ts @@ -20,6 +20,7 @@ export const upsertRow = async ({ data, db, fields, + ignoreResult, operation, path = '', req, @@ -323,6 +324,8 @@ export const upsertRow = async ({ : error } + if (ignoreResult) return data as T + // ////////////////////////////////// // RETRIEVE NEWLY UPDATED ROW // ////////////////////////////////// @@ -343,6 +346,7 @@ export const upsertRow = async ({ // ////////////////////////////////// const result = transform({ + adapter, config: adapter.payload.config, data: doc, fields, diff --git a/packages/db-postgres/src/upsertRow/types.ts b/packages/db-postgres/src/upsertRow/types.ts index e2952d94a97..b00cd1e7610 100644 --- a/packages/db-postgres/src/upsertRow/types.ts +++ b/packages/db-postgres/src/upsertRow/types.ts @@ -8,6 +8,11 @@ type BaseArgs = { data: Record db: DrizzleDB fields: Field[] + /** + * When true, skips reading the data back from the database and returns the input data + * @default false + */ + ignoreResult?: boolean path?: string req: PayloadRequestWithData tableName: string diff --git a/packages/payload/auth.d.ts b/packages/payload/auth.d.ts new file mode 100644 index 00000000000..d901b14d193 --- /dev/null +++ b/packages/payload/auth.d.ts @@ -0,0 +1,6 @@ +export * from './dist/auth/index.js'; +export { default as executeAccess } from './dist/auth/executeAccess.js'; +export { getAccessResults } from './dist/auth/getAccessResults.js'; +export { getAuthenticatedUser } from './dist/auth/getAuthenticatedUser.js'; +export type { AuthStrategyFunction, AuthStrategyFunctionArgs, CollectionPermission, FieldPermissions, GlobalPermission, IncomingAuthType, Permission, Permissions, User, VerifyConfig, } from './dist/auth/types.js'; +//# sourceMappingURL=auth.d.ts.map \ No newline at end of file diff --git a/packages/payload/auth.js b/packages/payload/auth.js new file mode 100644 index 00000000000..502a6510aeb --- /dev/null +++ b/packages/payload/auth.js @@ -0,0 +1,6 @@ +export * from './dist/auth/index.js'; +export { default as executeAccess } from './dist/auth/executeAccess.js'; +export { getAccessResults } from './dist/auth/getAccessResults.js'; +export { getAuthenticatedUser } from './dist/auth/getAuthenticatedUser.js'; + +//# sourceMappingURL=auth.js.map \ No newline at end of file diff --git a/packages/payload/components.d.ts b/packages/payload/components.d.ts new file mode 100644 index 00000000000..365773232f3 --- /dev/null +++ b/packages/payload/components.d.ts @@ -0,0 +1,14 @@ +export { default as Banner } from './dist/admin/components/elements/Banner'; +export { default as Button } from './dist/admin/components/elements/Button'; +export { ErrorPill } from './dist/admin/components/elements/ErrorPill'; +export { default as Pill } from './dist/admin/components/elements/Pill'; +export { default as Popup } from './dist/admin/components/elements/Popup'; +export { ShimmerEffect } from './dist/admin/components/elements/ShimmerEffect'; +export { default as Tooltip } from './dist/admin/components/elements/Tooltip'; +export { default as Check } from './dist/admin/components/icons/Check'; +export { default as Chevron } from './dist/admin/components/icons/Chevron'; +export { default as Menu } from './dist/admin/components/icons/Menu'; +export { default as Search } from './dist/admin/components/icons/Search'; +export { default as X } from './dist/admin/components/icons/X'; +export { default as MinimalTemplate } from './dist/admin/components/templates/Minimal'; +//# sourceMappingURL=components.d.ts.map \ No newline at end of file diff --git a/packages/payload/components.js b/packages/payload/components.js new file mode 100644 index 00000000000..c557aa8ad83 --- /dev/null +++ b/packages/payload/components.js @@ -0,0 +1,71 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + Banner: function() { + return _Banner.default; + }, + Button: function() { + return _Button.default; + }, + Check: function() { + return _Check.default; + }, + Chevron: function() { + return _Chevron.default; + }, + ErrorPill: function() { + return _ErrorPill.ErrorPill; + }, + Menu: function() { + return _Menu.default; + }, + MinimalTemplate: function() { + return _Minimal.default; + }, + Pill: function() { + return _Pill.default; + }, + Popup: function() { + return _Popup.default; + }, + Search: function() { + return _Search.default; + }, + ShimmerEffect: function() { + return _ShimmerEffect.ShimmerEffect; + }, + Tooltip: function() { + return _Tooltip.default; + }, + X: function() { + return _X.default; + } +}); +const _Banner = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/elements/Banner")); +const _Button = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/elements/Button")); +const _ErrorPill = require("./dist/admin/components/elements/ErrorPill"); +const _Pill = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/elements/Pill")); +const _Popup = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/elements/Popup")); +const _ShimmerEffect = require("./dist/admin/components/elements/ShimmerEffect"); +const _Tooltip = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/elements/Tooltip")); +const _Check = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/icons/Check")); +const _Chevron = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/icons/Chevron")); +const _Menu = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/icons/Menu")); +const _Search = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/icons/Search")); +const _X = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/icons/X")); +const _Minimal = /*#__PURE__*/ _interop_require_default(require("./dist/admin/components/templates/Minimal")); +function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHBvcnRzL2NvbXBvbmVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBCYW5uZXIgfSBmcm9tICcuLi9hZG1pbi9jb21wb25lbnRzL2VsZW1lbnRzL0Jhbm5lcidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQnV0dG9uIH0gZnJvbSAnLi4vYWRtaW4vY29tcG9uZW50cy9lbGVtZW50cy9CdXR0b24nXG5cbmV4cG9ydCB7IEVycm9yUGlsbCB9IGZyb20gJy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvRXJyb3JQaWxsJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQaWxsIH0gZnJvbSAnLi4vYWRtaW4vY29tcG9uZW50cy9lbGVtZW50cy9QaWxsJ1xuXG5leHBvcnQgeyBkZWZhdWx0IGFzIFBvcHVwIH0gZnJvbSAnLi4vYWRtaW4vY29tcG9uZW50cy9lbGVtZW50cy9Qb3B1cCdcblxuZXhwb3J0IHsgU2hpbW1lckVmZmVjdCB9IGZyb20gJy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvU2hpbW1lckVmZmVjdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVG9vbHRpcCB9IGZyb20gJy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvVG9vbHRpcCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2hlY2sgfSBmcm9tICcuLi9hZG1pbi9jb21wb25lbnRzL2ljb25zL0NoZWNrJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDaGV2cm9uIH0gZnJvbSAnLi4vYWRtaW4vY29tcG9uZW50cy9pY29ucy9DaGV2cm9uJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNZW51IH0gZnJvbSAnLi4vYWRtaW4vY29tcG9uZW50cy9pY29ucy9NZW51J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTZWFyY2ggfSBmcm9tICcuLi9hZG1pbi9jb21wb25lbnRzL2ljb25zL1NlYXJjaCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgWCB9IGZyb20gJy4uL2FkbWluL2NvbXBvbmVudHMvaWNvbnMvWCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWluaW1hbFRlbXBsYXRlIH0gZnJvbSAnLi4vYWRtaW4vY29tcG9uZW50cy90ZW1wbGF0ZXMvTWluaW1hbCdcbiJdLCJuYW1lcyI6WyJCYW5uZXIiLCJCdXR0b24iLCJDaGVjayIsIkNoZXZyb24iLCJFcnJvclBpbGwiLCJNZW51IiwiTWluaW1hbFRlbXBsYXRlIiwiUGlsbCIsIlBvcHVwIiwiU2VhcmNoIiwiU2hpbW1lckVmZmVjdCIsIlRvb2x0aXAiLCJYIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQUFvQkEsTUFBTTtlQUFOQSxlQUFNOztJQUNOQyxNQUFNO2VBQU5BLGVBQU07O0lBU05DLEtBQUs7ZUFBTEEsY0FBSzs7SUFDTEMsT0FBTztlQUFQQSxnQkFBTzs7SUFSbEJDLFNBQVM7ZUFBVEEsb0JBQVM7O0lBU0VDLElBQUk7ZUFBSkEsYUFBSTs7SUFHSkMsZUFBZTtlQUFmQSxnQkFBZTs7SUFYZkMsSUFBSTtlQUFKQSxhQUFJOztJQUVKQyxLQUFLO2VBQUxBLGNBQUs7O0lBT0xDLE1BQU07ZUFBTkEsZUFBTTs7SUFMakJDLGFBQWE7ZUFBYkEsNEJBQWE7O0lBQ0ZDLE9BQU87ZUFBUEEsZ0JBQU87O0lBS1BDLENBQUM7ZUFBREEsVUFBQzs7OytEQWRhOytEQUNBOzJCQUVSOzZEQUNNOzhEQUVDOytCQUVIO2dFQUNLOzhEQUNGO2dFQUNFOzZEQUNIOytEQUNFOzBEQUNMO2dFQUNjIn0= \ No newline at end of file diff --git a/packages/payload/components/elements.d.ts b/packages/payload/components/elements.d.ts new file mode 100644 index 00000000000..c3c7e1ace75 --- /dev/null +++ b/packages/payload/components/elements.d.ts @@ -0,0 +1,14 @@ +export { default as Button } from '../dist/admin/components/elements/Button'; +export { default as Card } from '../dist/admin/components/elements/Card'; +export { Collapsible } from '../dist/admin/components/elements/Collapsible'; +export { DocumentDrawer, DocumentDrawerToggler, baseClass as DocumentDrawerBaseClass, useDocumentDrawer, } from '../dist/admin/components/elements/DocumentDrawer'; +export { Drawer, DrawerToggler, formatDrawerSlug } from '../dist/admin/components/elements/Drawer'; +export { useDrawerSlug } from '../dist/admin/components/elements/Drawer/useDrawerSlug'; +export { default as Eyebrow } from '../dist/admin/components/elements/Eyebrow'; +export { Gutter } from '../dist/admin/components/elements/Gutter'; +export { AppHeader } from '../dist/admin/components/elements/Header'; +export { ListDrawer, ListDrawerToggler, baseClass as ListDrawerBaseClass, formatListDrawerSlug, useListDrawer, } from '../dist/admin/components/elements/ListDrawer'; +export { Description, DescriptionComponent, DescriptionFunction, } from '../dist/admin/components/forms/FieldDescription/types'; +export { useNav } from '../dist/admin/components/elements/Nav/context'; +export { default as NavGroup } from '../dist/admin/components/elements/NavGroup'; +//# sourceMappingURL=elements.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/elements.js b/packages/payload/components/elements.js new file mode 100644 index 00000000000..89e77b3e32d --- /dev/null +++ b/packages/payload/components/elements.js @@ -0,0 +1,104 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + AppHeader: function() { + return _Header.AppHeader; + }, + Button: function() { + return _Button.default; + }, + Card: function() { + return _Card.default; + }, + Collapsible: function() { + return _Collapsible.Collapsible; + }, + Description: function() { + return _types.Description; + }, + DescriptionComponent: function() { + return _types.DescriptionComponent; + }, + DescriptionFunction: function() { + return _types.DescriptionFunction; + }, + DocumentDrawer: function() { + return _DocumentDrawer.DocumentDrawer; + }, + DocumentDrawerBaseClass: function() { + return _DocumentDrawer.baseClass; + }, + DocumentDrawerToggler: function() { + return _DocumentDrawer.DocumentDrawerToggler; + }, + Drawer: function() { + return _Drawer.Drawer; + }, + DrawerToggler: function() { + return _Drawer.DrawerToggler; + }, + Eyebrow: function() { + return _Eyebrow.default; + }, + Gutter: function() { + return _Gutter.Gutter; + }, + ListDrawer: function() { + return _ListDrawer.ListDrawer; + }, + ListDrawerBaseClass: function() { + return _ListDrawer.baseClass; + }, + ListDrawerToggler: function() { + return _ListDrawer.ListDrawerToggler; + }, + NavGroup: function() { + return _NavGroup.default; + }, + formatDrawerSlug: function() { + return _Drawer.formatDrawerSlug; + }, + formatListDrawerSlug: function() { + return _ListDrawer.formatListDrawerSlug; + }, + useDocumentDrawer: function() { + return _DocumentDrawer.useDocumentDrawer; + }, + useDrawerSlug: function() { + return _useDrawerSlug.useDrawerSlug; + }, + useListDrawer: function() { + return _ListDrawer.useListDrawer; + }, + useNav: function() { + return _context.useNav; + } +}); +const _Button = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/elements/Button")); +const _Card = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/elements/Card")); +const _Collapsible = require("../dist/admin/components/elements/Collapsible"); +const _DocumentDrawer = require("../dist/admin/components/elements/DocumentDrawer"); +const _Drawer = require("../dist/admin/components/elements/Drawer"); +const _useDrawerSlug = require("../dist/admin/components/elements/Drawer/useDrawerSlug"); +const _Eyebrow = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/elements/Eyebrow")); +const _Gutter = require("../dist/admin/components/elements/Gutter"); +const _Header = require("../dist/admin/components/elements/Header"); +const _ListDrawer = require("../dist/admin/components/elements/ListDrawer"); +const _types = require("../dist/admin/components/forms/FieldDescription/types"); +const _context = require("../dist/admin/components/elements/Nav/context"); +const _NavGroup = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/elements/NavGroup")); +function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leHBvcnRzL2NvbXBvbmVudHMvZWxlbWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBCdXR0b24gfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2VsZW1lbnRzL0J1dHRvbidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FyZCB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvQ2FyZCdcbmV4cG9ydCB7IENvbGxhcHNpYmxlIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9lbGVtZW50cy9Db2xsYXBzaWJsZSdcbmV4cG9ydCB7XG4gIERvY3VtZW50RHJhd2VyLFxuICBEb2N1bWVudERyYXdlclRvZ2dsZXIsXG4gIGJhc2VDbGFzcyBhcyBEb2N1bWVudERyYXdlckJhc2VDbGFzcyxcbiAgdXNlRG9jdW1lbnREcmF3ZXIsXG59IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvRG9jdW1lbnREcmF3ZXInXG5leHBvcnQgeyBEcmF3ZXIsIERyYXdlclRvZ2dsZXIsIGZvcm1hdERyYXdlclNsdWcgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2VsZW1lbnRzL0RyYXdlcidcblxuZXhwb3J0IHsgdXNlRHJhd2VyU2x1ZyB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvRHJhd2VyL3VzZURyYXdlclNsdWcnXG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgRXllYnJvdyB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvRXllYnJvdydcbmV4cG9ydCB7IEd1dHRlciB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvR3V0dGVyJ1xuZXhwb3J0IHsgQXBwSGVhZGVyIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9lbGVtZW50cy9IZWFkZXInXG5cbmV4cG9ydCB7XG4gIExpc3REcmF3ZXIsXG4gIExpc3REcmF3ZXJUb2dnbGVyLFxuICBiYXNlQ2xhc3MgYXMgTGlzdERyYXdlckJhc2VDbGFzcyxcbiAgZm9ybWF0TGlzdERyYXdlclNsdWcsXG4gIHVzZUxpc3REcmF3ZXIsXG59IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvTGlzdERyYXdlcidcblxuZXhwb3J0IHtcbiAgRGVzY3JpcHRpb24sXG4gIERlc2NyaXB0aW9uQ29tcG9uZW50LFxuICBEZXNjcmlwdGlvbkZ1bmN0aW9uLFxufSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL0ZpZWxkRGVzY3JpcHRpb24vdHlwZXMnXG5cbmV4cG9ydCB7IHVzZU5hdiB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvTmF2L2NvbnRleHQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIE5hdkdyb3VwIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9lbGVtZW50cy9OYXZHcm91cCdcbiJdLCJuYW1lcyI6WyJBcHBIZWFkZXIiLCJCdXR0b24iLCJDYXJkIiwiQ29sbGFwc2libGUiLCJEZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uQ29tcG9uZW50IiwiRGVzY3JpcHRpb25GdW5jdGlvbiIsIkRvY3VtZW50RHJhd2VyIiwiRG9jdW1lbnREcmF3ZXJCYXNlQ2xhc3MiLCJiYXNlQ2xhc3MiLCJEb2N1bWVudERyYXdlclRvZ2dsZXIiLCJEcmF3ZXIiLCJEcmF3ZXJUb2dnbGVyIiwiRXllYnJvdyIsIkd1dHRlciIsIkxpc3REcmF3ZXIiLCJMaXN0RHJhd2VyQmFzZUNsYXNzIiwiTGlzdERyYXdlclRvZ2dsZXIiLCJOYXZHcm91cCIsImZvcm1hdERyYXdlclNsdWciLCJmb3JtYXRMaXN0RHJhd2VyU2x1ZyIsInVzZURvY3VtZW50RHJhd2VyIiwidXNlRHJhd2VyU2x1ZyIsInVzZUxpc3REcmF3ZXIiLCJ1c2VOYXYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBZVNBLFNBQVM7ZUFBVEEsaUJBQVM7O0lBZkVDLE1BQU07ZUFBTkEsZUFBTTs7SUFDTkMsSUFBSTtlQUFKQSxhQUFJOztJQUNmQyxXQUFXO2VBQVhBLHdCQUFXOztJQXdCbEJDLFdBQVc7ZUFBWEEsa0JBQVc7O0lBQ1hDLG9CQUFvQjtlQUFwQkEsMkJBQW9COztJQUNwQkMsbUJBQW1CO2VBQW5CQSwwQkFBbUI7O0lBeEJuQkMsY0FBYztlQUFkQSw4QkFBYzs7SUFFREMsdUJBQXVCO2VBQXBDQyx5QkFBUzs7SUFEVEMscUJBQXFCO2VBQXJCQSxxQ0FBcUI7O0lBSWRDLE1BQU07ZUFBTkEsY0FBTTs7SUFBRUMsYUFBYTtlQUFiQSxxQkFBYTs7SUFJVkMsT0FBTztlQUFQQSxnQkFBTzs7SUFDbEJDLE1BQU07ZUFBTkEsY0FBTTs7SUFJYkMsVUFBVTtlQUFWQSxzQkFBVTs7SUFFR0MsbUJBQW1CO2VBQWhDUCxxQkFBUzs7SUFEVFEsaUJBQWlCO2VBQWpCQSw2QkFBaUI7O0lBYUNDLFFBQVE7ZUFBUkEsaUJBQVE7O0lBdkJJQyxnQkFBZ0I7ZUFBaEJBLHdCQUFnQjs7SUFZOUNDLG9CQUFvQjtlQUFwQkEsZ0NBQW9COztJQWRwQkMsaUJBQWlCO2VBQWpCQSxpQ0FBaUI7O0lBSVZDLGFBQWE7ZUFBYkEsNEJBQWE7O0lBV3BCQyxhQUFhO2VBQWJBLHlCQUFhOztJQVNOQyxNQUFNO2VBQU5BLGVBQU07OzsrREEvQm1COzZEQUNGOzZCQUNKO2dDQU1yQjt3QkFDaUQ7K0JBRTFCO2dFQUVLO3dCQUNaO3dCQUNHOzRCQVFuQjt1QkFNQTt5QkFFZ0I7aUVBQ2EifQ== \ No newline at end of file diff --git a/packages/payload/components/fields/Array.d.ts b/packages/payload/components/fields/Array.d.ts new file mode 100644 index 00000000000..725ef9ec41a --- /dev/null +++ b/packages/payload/components/fields/Array.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Array/types'; +//# sourceMappingURL=Array.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Array.js b/packages/payload/components/fields/Array.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Array.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Blocks.d.ts b/packages/payload/components/fields/Blocks.d.ts new file mode 100644 index 00000000000..63eb4cdb0b5 --- /dev/null +++ b/packages/payload/components/fields/Blocks.d.ts @@ -0,0 +1,9 @@ +export { BlockRow } from '../../dist/admin/components/forms/field-types/Blocks/BlockRow'; +export { BlocksDrawer } from '../../dist/admin/components/forms/field-types/Blocks/BlocksDrawer'; +export { default as BlockSearch } from '../../dist/admin/components/forms/field-types/Blocks/BlocksDrawer/BlockSearch'; +export type { Props as BlocksDrawerProps } from '../../dist/admin/components/forms/field-types/Blocks/BlocksDrawer/types'; +export { RowActions } from '../../dist/admin/components/forms/field-types/Blocks/RowActions'; +export { default as SectionTitle } from '../../dist/admin/components/forms/field-types/Blocks/SectionTitle/index'; +export type { Props as SectionTitleProps } from '../../dist/admin/components/forms/field-types/Blocks/SectionTitle/types'; +export type { Props } from '../../dist/admin/components/forms/field-types/Blocks/types'; +//# sourceMappingURL=Blocks.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Blocks.js b/packages/payload/components/fields/Blocks.js new file mode 100644 index 00000000000..2e2c4a9ffd2 --- /dev/null +++ b/packages/payload/components/fields/Blocks.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + BlockRow: function() { + return _BlockRow.BlockRow; + }, + BlockSearch: function() { + return _BlockSearch.default; + }, + BlocksDrawer: function() { + return _BlocksDrawer.BlocksDrawer; + }, + RowActions: function() { + return _RowActions.RowActions; + }, + SectionTitle: function() { + return _index.default; + } +}); +const _BlockRow = require("../../dist/admin/components/forms/field-types/Blocks/BlockRow"); +const _BlocksDrawer = require("../../dist/admin/components/forms/field-types/Blocks/BlocksDrawer"); +const _BlockSearch = /*#__PURE__*/ _interop_require_default(require("../../dist/admin/components/forms/field-types/Blocks/BlocksDrawer/BlockSearch")); +const _RowActions = require("../../dist/admin/components/forms/field-types/Blocks/RowActions"); +const _index = /*#__PURE__*/ _interop_require_default(require("../../dist/admin/components/forms/field-types/Blocks/SectionTitle/index")); +function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9leHBvcnRzL2NvbXBvbmVudHMvZmllbGRzL0Jsb2Nrcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBCbG9ja1JvdyB9IGZyb20gJy4uLy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvZmllbGQtdHlwZXMvQmxvY2tzL0Jsb2NrUm93J1xuZXhwb3J0IHsgQmxvY2tzRHJhd2VyIH0gZnJvbSAnLi4vLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9maWVsZC10eXBlcy9CbG9ja3MvQmxvY2tzRHJhd2VyJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCbG9ja1NlYXJjaCB9IGZyb20gJy4uLy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvZmllbGQtdHlwZXMvQmxvY2tzL0Jsb2Nrc0RyYXdlci9CbG9ja1NlYXJjaCdcbmV4cG9ydCB0eXBlIHsgUHJvcHMgYXMgQmxvY2tzRHJhd2VyUHJvcHMgfSBmcm9tICcuLi8uLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL0Jsb2Nrcy9CbG9ja3NEcmF3ZXIvdHlwZXMnXG5leHBvcnQgeyBSb3dBY3Rpb25zIH0gZnJvbSAnLi4vLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9maWVsZC10eXBlcy9CbG9ja3MvUm93QWN0aW9ucydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2VjdGlvblRpdGxlIH0gZnJvbSAnLi4vLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9maWVsZC10eXBlcy9CbG9ja3MvU2VjdGlvblRpdGxlL2luZGV4J1xuZXhwb3J0IHR5cGUgeyBQcm9wcyBhcyBTZWN0aW9uVGl0bGVQcm9wcyB9IGZyb20gJy4uLy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvZmllbGQtdHlwZXMvQmxvY2tzL1NlY3Rpb25UaXRsZS90eXBlcydcbmV4cG9ydCB0eXBlIHsgUHJvcHMgfSBmcm9tICcuLi8uLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL0Jsb2Nrcy90eXBlcydcbiJdLCJuYW1lcyI6WyJCbG9ja1JvdyIsIkJsb2NrU2VhcmNoIiwiQmxvY2tzRHJhd2VyIiwiUm93QWN0aW9ucyIsIlNlY3Rpb25UaXRsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUFBU0EsUUFBUTtlQUFSQSxrQkFBUTs7SUFFR0MsV0FBVztlQUFYQSxvQkFBVzs7SUFEdEJDLFlBQVk7ZUFBWkEsMEJBQVk7O0lBR1pDLFVBQVU7ZUFBVkEsc0JBQVU7O0lBQ0NDLFlBQVk7ZUFBWkEsY0FBWTs7OzBCQUxQOzhCQUNJO29FQUNVOzRCQUVaOzhEQUNhIn0= \ No newline at end of file diff --git a/packages/payload/components/fields/Cell.d.ts b/packages/payload/components/fields/Cell.d.ts new file mode 100644 index 00000000000..9ea060a7b9d --- /dev/null +++ b/packages/payload/components/fields/Cell.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/views/collections/List/Cell/types'; +//# sourceMappingURL=Cell.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Cell.js b/packages/payload/components/fields/Cell.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Cell.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Checkbox.d.ts b/packages/payload/components/fields/Checkbox.d.ts new file mode 100644 index 00000000000..2b03cbcc7d3 --- /dev/null +++ b/packages/payload/components/fields/Checkbox.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Checkbox/types'; +//# sourceMappingURL=Checkbox.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Checkbox.js b/packages/payload/components/fields/Checkbox.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Checkbox.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Code.d.ts b/packages/payload/components/fields/Code.d.ts new file mode 100644 index 00000000000..1d5956877ec --- /dev/null +++ b/packages/payload/components/fields/Code.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Code/types'; +//# sourceMappingURL=Code.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Code.js b/packages/payload/components/fields/Code.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Code.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/DateTime.d.ts b/packages/payload/components/fields/DateTime.d.ts new file mode 100644 index 00000000000..ed5813483d5 --- /dev/null +++ b/packages/payload/components/fields/DateTime.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/DateTime/types'; +//# sourceMappingURL=DateTime.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/DateTime.js b/packages/payload/components/fields/DateTime.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/DateTime.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Email.d.ts b/packages/payload/components/fields/Email.d.ts new file mode 100644 index 00000000000..94f9d20befb --- /dev/null +++ b/packages/payload/components/fields/Email.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Email/types'; +//# sourceMappingURL=Email.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Email.js b/packages/payload/components/fields/Email.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Email.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Group.d.ts b/packages/payload/components/fields/Group.d.ts new file mode 100644 index 00000000000..310839c3408 --- /dev/null +++ b/packages/payload/components/fields/Group.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Group/types'; +//# sourceMappingURL=Group.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Group.js b/packages/payload/components/fields/Group.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Group.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Json.d.ts b/packages/payload/components/fields/Json.d.ts new file mode 100644 index 00000000000..ed4eb022bbf --- /dev/null +++ b/packages/payload/components/fields/Json.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/JSON/types'; +//# sourceMappingURL=Json.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Json.js b/packages/payload/components/fields/Json.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Json.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Number.d.ts b/packages/payload/components/fields/Number.d.ts new file mode 100644 index 00000000000..289c971d41a --- /dev/null +++ b/packages/payload/components/fields/Number.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Number/types'; +//# sourceMappingURL=Number.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Number.js b/packages/payload/components/fields/Number.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Number.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Password.d.ts b/packages/payload/components/fields/Password.d.ts new file mode 100644 index 00000000000..ba7c5105071 --- /dev/null +++ b/packages/payload/components/fields/Password.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Password/types'; +//# sourceMappingURL=Password.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Password.js b/packages/payload/components/fields/Password.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Password.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/RadioGroup/RadioInput.d.ts b/packages/payload/components/fields/RadioGroup/RadioInput.d.ts new file mode 100644 index 00000000000..a09f32e0b61 --- /dev/null +++ b/packages/payload/components/fields/RadioGroup/RadioInput.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../../dist/admin/components/forms/field-types/RadioGroup/RadioInput/types'; +//# sourceMappingURL=RadioInput.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/RadioGroup/RadioInput.js b/packages/payload/components/fields/RadioGroup/RadioInput.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/RadioGroup/RadioInput.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/RadioGroup/index.d.ts b/packages/payload/components/fields/RadioGroup/index.d.ts new file mode 100644 index 00000000000..5cd79f18021 --- /dev/null +++ b/packages/payload/components/fields/RadioGroup/index.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../../dist/admin/components/forms/field-types/RadioGroup/types'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/RadioGroup/index.js b/packages/payload/components/fields/RadioGroup/index.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/RadioGroup/index.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Relationship.d.ts b/packages/payload/components/fields/Relationship.d.ts new file mode 100644 index 00000000000..a5fd025c022 --- /dev/null +++ b/packages/payload/components/fields/Relationship.d.ts @@ -0,0 +1,3 @@ +export { default as RelationshipComponent } from '../../dist/admin/components/forms/field-types/Relationship'; +export type { Option, Props, ValueWithRelation, } from '../../dist/admin/components/forms/field-types/Relationship/types'; +//# sourceMappingURL=Relationship.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Relationship.js b/packages/payload/components/fields/Relationship.js new file mode 100644 index 00000000000..a7c049e28bf --- /dev/null +++ b/packages/payload/components/fields/Relationship.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "RelationshipComponent", { + enumerable: true, + get: function() { + return _Relationship.default; + } +}); +const _Relationship = /*#__PURE__*/ _interop_require_default(require("../../dist/admin/components/forms/field-types/Relationship")); +function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9leHBvcnRzL2NvbXBvbmVudHMvZmllbGRzL1JlbGF0aW9uc2hpcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBkZWZhdWx0IGFzIFJlbGF0aW9uc2hpcENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvZmllbGQtdHlwZXMvUmVsYXRpb25zaGlwJ1xuZXhwb3J0IHR5cGUge1xuICBPcHRpb24sXG4gIFByb3BzLFxuICBWYWx1ZVdpdGhSZWxhdGlvbixcbn0gZnJvbSAnLi4vLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9maWVsZC10eXBlcy9SZWxhdGlvbnNoaXAvdHlwZXMnXG4iXSwibmFtZXMiOlsiUmVsYXRpb25zaGlwQ29tcG9uZW50Il0sIm1hcHBpbmdzIjoiOzs7OytCQUFvQkE7OztlQUFBQSxxQkFBcUI7OztxRUFBUSJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/RichText.d.ts b/packages/payload/components/fields/RichText.d.ts new file mode 100644 index 00000000000..f145f6b5fab --- /dev/null +++ b/packages/payload/components/fields/RichText.d.ts @@ -0,0 +1,2 @@ +export type { RichTextFieldProps } from '../../dist/admin/components/forms/field-types/RichText/types'; +//# sourceMappingURL=RichText.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/RichText.js b/packages/payload/components/fields/RichText.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/RichText.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Row.d.ts b/packages/payload/components/fields/Row.d.ts new file mode 100644 index 00000000000..943559f41aa --- /dev/null +++ b/packages/payload/components/fields/Row.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Row/types'; +//# sourceMappingURL=Row.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Row.js b/packages/payload/components/fields/Row.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Row.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Select.d.ts b/packages/payload/components/fields/Select.d.ts new file mode 100644 index 00000000000..d0405e65a8e --- /dev/null +++ b/packages/payload/components/fields/Select.d.ts @@ -0,0 +1,3 @@ +export { default as SelectComponent } from '../../dist/admin/components/forms/field-types/Select'; +export type { Props } from '../../dist/admin/components/forms/field-types/Select/types'; +//# sourceMappingURL=Select.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Select.js b/packages/payload/components/fields/Select.js new file mode 100644 index 00000000000..2025e493379 --- /dev/null +++ b/packages/payload/components/fields/Select.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "SelectComponent", { + enumerable: true, + get: function() { + return _Select.default; + } +}); +const _Select = /*#__PURE__*/ _interop_require_default(require("../../dist/admin/components/forms/field-types/Select")); +function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9leHBvcnRzL2NvbXBvbmVudHMvZmllbGRzL1NlbGVjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBkZWZhdWx0IGFzIFNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvZmllbGQtdHlwZXMvU2VsZWN0J1xuZXhwb3J0IHR5cGUgeyBQcm9wcyB9IGZyb20gJy4uLy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvZmllbGQtdHlwZXMvU2VsZWN0L3R5cGVzJ1xuIl0sIm5hbWVzIjpbIlNlbGVjdENvbXBvbmVudCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFBb0JBOzs7ZUFBQUEsZUFBZTs7OytEQUFRIn0= \ No newline at end of file diff --git a/packages/payload/components/fields/Text.d.ts b/packages/payload/components/fields/Text.d.ts new file mode 100644 index 00000000000..27ec5e619e3 --- /dev/null +++ b/packages/payload/components/fields/Text.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Text/types'; +//# sourceMappingURL=Text.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Text.js b/packages/payload/components/fields/Text.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Text.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Textarea.d.ts b/packages/payload/components/fields/Textarea.d.ts new file mode 100644 index 00000000000..4527e4408cd --- /dev/null +++ b/packages/payload/components/fields/Textarea.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Textarea/types'; +//# sourceMappingURL=Textarea.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Textarea.js b/packages/payload/components/fields/Textarea.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Textarea.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/fields/Upload.d.ts b/packages/payload/components/fields/Upload.d.ts new file mode 100644 index 00000000000..3c204461ebb --- /dev/null +++ b/packages/payload/components/fields/Upload.d.ts @@ -0,0 +1,2 @@ +export type { Props } from '../../dist/admin/components/forms/field-types/Upload/types'; +//# sourceMappingURL=Upload.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/fields/Upload.js b/packages/payload/components/fields/Upload.js new file mode 100644 index 00000000000..b775d337d89 --- /dev/null +++ b/packages/payload/components/fields/Upload.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/packages/payload/components/forms.d.ts b/packages/payload/components/forms.d.ts new file mode 100644 index 00000000000..e131ceb341b --- /dev/null +++ b/packages/payload/components/forms.d.ts @@ -0,0 +1,38 @@ +export { default as Error } from '../dist/admin/components/forms/Error'; +export { default as FieldDescription } from '../dist/admin/components/forms/FieldDescription'; +export { default as Form } from '../dist/admin/components/forms/Form'; +export { default as buildInitialState } from '../dist/admin/components/forms/Form/buildInitialState'; +export { useAllFormFields, useForm, useFormFields, useFormModified, useFormProcessing, useFormSubmitted, +/** + * @deprecated useWatchForm is no longer preferred. If you need all form fields, prefer `useAllFormFields`. + */ +useWatchForm, } from '../dist/admin/components/forms/Form/context'; +export { createNestedFieldPath } from '../dist/admin/components/forms/Form/createNestedFieldPath'; +export { default as getSiblingData } from '../dist/admin/components/forms/Form/getSiblingData'; +export { default as reduceFieldsToValues } from '../dist/admin/components/forms/Form/reduceFieldsToValues'; +export { default as Label } from '../dist/admin/components/forms/Label'; +export { default as RenderFields } from '../dist/admin/components/forms/RenderFields'; +export { default as Submit } from '../dist/admin/components/forms/Submit'; +export { default as FormSubmit } from '../dist/admin/components/forms/Submit'; +export { fieldTypes } from '../dist/admin/components/forms/field-types'; +export { default as Checkbox } from '../dist/admin/components/forms/field-types/Checkbox'; +export { default as Collapsible } from '../dist/admin/components/forms/field-types/Collapsible'; +export { default as Date } from '../dist/admin/components/forms/field-types/DateTime'; +export { DateTimeInput } from '../dist/admin/components/forms/field-types/DateTime/Input'; +export { default as Group } from '../dist/admin/components/forms/field-types/Group'; +export { default as HiddenInput } from '../dist/admin/components/forms/field-types/HiddenInput'; +export { default as Select } from '../dist/admin/components/forms/field-types/Select'; +export { default as SelectInput } from '../dist/admin/components/forms/field-types/Select/Input'; +export { default as Text } from '../dist/admin/components/forms/field-types/Text'; +export { default as TextInput } from '../dist/admin/components/forms/field-types/Text/Input'; +export { default as Textarea } from '../dist/admin/components/forms/field-types/Textarea'; +export { default as TextareaInput } from '../dist/admin/components/forms/field-types/Textarea/Input'; +export { default as Upload } from '../dist/admin/components/forms/field-types/Upload'; +export { default as UploadInput } from '../dist/admin/components/forms/field-types/Upload/Input'; +/** + * @deprecated This method is now called useField. The useFieldType alias will be removed in an upcoming version. + */ +export { default as useFieldType } from '../dist/admin/components/forms/useField'; +export { default as useField } from '../dist/admin/components/forms/useField'; +export { default as withCondition } from '../dist/admin/components/forms/withCondition'; +//# sourceMappingURL=forms.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/forms.js b/packages/payload/components/forms.js new file mode 100644 index 00000000000..0cba1ce8207 --- /dev/null +++ b/packages/payload/components/forms.js @@ -0,0 +1,157 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + Checkbox: function() { + return _Checkbox.default; + }, + Collapsible: function() { + return _Collapsible.default; + }, + Date: function() { + return _DateTime.default; + }, + DateTimeInput: function() { + return _Input.DateTimeInput; + }, + Error: function() { + return _Error.default; + }, + FieldDescription: function() { + return _FieldDescription.default; + }, + Form: function() { + return _Form.default; + }, + FormSubmit: function() { + return _Submit.default; + }, + Group: function() { + return _Group.default; + }, + HiddenInput: function() { + return _HiddenInput.default; + }, + Label: function() { + return _Label.default; + }, + RenderFields: function() { + return _RenderFields.default; + }, + Select: function() { + return _Select.default; + }, + SelectInput: function() { + return _Input1.default; + }, + Submit: function() { + return _Submit.default; + }, + Text: function() { + return _Text.default; + }, + TextInput: function() { + return _Input2.default; + }, + Textarea: function() { + return _Textarea.default; + }, + TextareaInput: function() { + return _Input3.default; + }, + Upload: function() { + return _Upload.default; + }, + UploadInput: function() { + return _Input4.default; + }, + buildInitialState: function() { + return _buildInitialState.default; + }, + createNestedFieldPath: function() { + return _createNestedFieldPath.createNestedFieldPath; + }, + fieldTypes: function() { + return _fieldtypes.fieldTypes; + }, + getSiblingData: function() { + return _getSiblingData.default; + }, + reduceFieldsToValues: function() { + return _reduceFieldsToValues.default; + }, + useAllFormFields: function() { + return _context.useAllFormFields; + }, + useField: function() { + return _useField.default; + }, + useFieldType: function() { + return _useField.default; + }, + useForm: function() { + return _context.useForm; + }, + useFormFields: function() { + return _context.useFormFields; + }, + useFormModified: function() { + return _context.useFormModified; + }, + useFormProcessing: function() { + return _context.useFormProcessing; + }, + useFormSubmitted: function() { + return _context.useFormSubmitted; + }, + /** + * @deprecated useWatchForm is no longer preferred. If you need all form fields, prefer `useAllFormFields`. + */ useWatchForm: function() { + return _context.useWatchForm; + }, + withCondition: function() { + return _withCondition.default; + } +}); +const _Error = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/Error")); +const _FieldDescription = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/FieldDescription")); +const _Form = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/Form")); +const _buildInitialState = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/Form/buildInitialState")); +const _context = require("../dist/admin/components/forms/Form/context"); +const _createNestedFieldPath = require("../dist/admin/components/forms/Form/createNestedFieldPath"); +const _getSiblingData = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/Form/getSiblingData")); +const _reduceFieldsToValues = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/Form/reduceFieldsToValues")); +const _Label = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/Label")); +const _RenderFields = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/RenderFields")); +const _Submit = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/Submit")); +const _fieldtypes = require("../dist/admin/components/forms/field-types"); +const _Checkbox = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Checkbox")); +const _Collapsible = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Collapsible")); +const _DateTime = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/DateTime")); +const _Input = require("../dist/admin/components/forms/field-types/DateTime/Input"); +const _Group = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Group")); +const _HiddenInput = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/HiddenInput")); +const _Select = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Select")); +const _Input1 = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Select/Input")); +const _Text = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Text")); +const _Input2 = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Text/Input")); +const _Textarea = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Textarea")); +const _Input3 = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Textarea/Input")); +const _Upload = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Upload")); +const _Input4 = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/field-types/Upload/Input")); +const _useField = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/useField")); +const _withCondition = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/forms/withCondition")); +function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leHBvcnRzL2NvbXBvbmVudHMvZm9ybXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBFcnJvciB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvRXJyb3InXG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgRmllbGREZXNjcmlwdGlvbiB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvRmllbGREZXNjcmlwdGlvbidcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9Gb3JtJ1xuXG5leHBvcnQgeyBkZWZhdWx0IGFzIGJ1aWxkSW5pdGlhbFN0YXRlIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9Gb3JtL2J1aWxkSW5pdGlhbFN0YXRlJ1xuXG5leHBvcnQge1xuICB1c2VBbGxGb3JtRmllbGRzLFxuICB1c2VGb3JtLFxuICB1c2VGb3JtRmllbGRzLFxuICB1c2VGb3JtTW9kaWZpZWQsXG4gIHVzZUZvcm1Qcm9jZXNzaW5nLFxuICB1c2VGb3JtU3VibWl0dGVkLFxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlV2F0Y2hGb3JtIGlzIG5vIGxvbmdlciBwcmVmZXJyZWQuIElmIHlvdSBuZWVkIGFsbCBmb3JtIGZpZWxkcywgcHJlZmVyIGB1c2VBbGxGb3JtRmllbGRzYC5cbiAgICovXG4gIHVzZVdhdGNoRm9ybSxcbn0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9Gb3JtL2NvbnRleHQnXG5cbmV4cG9ydCB7IGNyZWF0ZU5lc3RlZEZpZWxkUGF0aCB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvRm9ybS9jcmVhdGVOZXN0ZWRGaWVsZFBhdGgnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGdldFNpYmxpbmdEYXRhIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9Gb3JtL2dldFNpYmxpbmdEYXRhJ1xuXG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlZHVjZUZpZWxkc1RvVmFsdWVzIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9Gb3JtL3JlZHVjZUZpZWxkc1RvVmFsdWVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMYWJlbCB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvTGFiZWwnXG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgUmVuZGVyRmllbGRzIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9SZW5kZXJGaWVsZHMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIFN1Ym1pdCB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvU3VibWl0J1xuXG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1TdWJtaXQgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL1N1Ym1pdCdcbmV4cG9ydCB7IGZpZWxkVHlwZXMgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDaGVja2JveCB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvZmllbGQtdHlwZXMvQ2hlY2tib3gnXG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ29sbGFwc2libGUgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL0NvbGxhcHNpYmxlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEYXRlIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9maWVsZC10eXBlcy9EYXRlVGltZSdcbmV4cG9ydCB7IERhdGVUaW1lSW5wdXQgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL0RhdGVUaW1lL0lucHV0J1xuXG5leHBvcnQgeyBkZWZhdWx0IGFzIEdyb3VwIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9maWVsZC10eXBlcy9Hcm91cCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSGlkZGVuSW5wdXQgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL0hpZGRlbklucHV0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTZWxlY3QgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL1NlbGVjdCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2VsZWN0SW5wdXQgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL1NlbGVjdC9JbnB1dCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGV4dCB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvZmllbGQtdHlwZXMvVGV4dCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGV4dElucHV0IH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9maWVsZC10eXBlcy9UZXh0L0lucHV0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUZXh0YXJlYSB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvZmllbGQtdHlwZXMvVGV4dGFyZWEnXG5leHBvcnQgeyBkZWZhdWx0IGFzIFRleHRhcmVhSW5wdXQgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL1RleHRhcmVhL0lucHV0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBVcGxvYWQgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL1VwbG9hZCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVXBsb2FkSW5wdXQgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL2ZpZWxkLXR5cGVzL1VwbG9hZC9JbnB1dCdcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3cgY2FsbGVkIHVzZUZpZWxkLiBUaGUgdXNlRmllbGRUeXBlIGFsaWFzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyB2ZXJzaW9uLlxuICovXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVzZUZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZm9ybXMvdXNlRmllbGQnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVzZUZpZWxkIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy91c2VGaWVsZCdcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyB3aXRoQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy93aXRoQ29uZGl0aW9uJ1xuIl0sIm5hbWVzIjpbIkNoZWNrYm94IiwiQ29sbGFwc2libGUiLCJEYXRlIiwiRGF0ZVRpbWVJbnB1dCIsIkVycm9yIiwiRmllbGREZXNjcmlwdGlvbiIsIkZvcm0iLCJGb3JtU3VibWl0IiwiR3JvdXAiLCJIaWRkZW5JbnB1dCIsIkxhYmVsIiwiUmVuZGVyRmllbGRzIiwiU2VsZWN0IiwiU2VsZWN0SW5wdXQiLCJTdWJtaXQiLCJUZXh0IiwiVGV4dElucHV0IiwiVGV4dGFyZWEiLCJUZXh0YXJlYUlucHV0IiwiVXBsb2FkIiwiVXBsb2FkSW5wdXQiLCJidWlsZEluaXRpYWxTdGF0ZSIsImNyZWF0ZU5lc3RlZEZpZWxkUGF0aCIsImZpZWxkVHlwZXMiLCJnZXRTaWJsaW5nRGF0YSIsInJlZHVjZUZpZWxkc1RvVmFsdWVzIiwidXNlQWxsRm9ybUZpZWxkcyIsInVzZUZpZWxkIiwidXNlRmllbGRUeXBlIiwidXNlRm9ybSIsInVzZUZvcm1GaWVsZHMiLCJ1c2VGb3JtTW9kaWZpZWQiLCJ1c2VGb3JtUHJvY2Vzc2luZyIsInVzZUZvcm1TdWJtaXR0ZWQiLCJ1c2VXYXRjaEZvcm0iLCJ3aXRoQ29uZGl0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQWdDb0JBLFFBQVE7ZUFBUkEsaUJBQVE7O0lBRVJDLFdBQVc7ZUFBWEEsb0JBQVc7O0lBQ1hDLElBQUk7ZUFBSkEsaUJBQUk7O0lBQ2ZDLGFBQWE7ZUFBYkEsb0JBQWE7O0lBcENGQyxLQUFLO2VBQUxBLGNBQUs7O0lBRUxDLGdCQUFnQjtlQUFoQkEseUJBQWdCOztJQUVoQkMsSUFBSTtlQUFKQSxhQUFJOztJQTBCSkMsVUFBVTtlQUFWQSxlQUFVOztJQVFWQyxLQUFLO2VBQUxBLGNBQUs7O0lBQ0xDLFdBQVc7ZUFBWEEsb0JBQVc7O0lBZFhDLEtBQUs7ZUFBTEEsY0FBSzs7SUFFTEMsWUFBWTtlQUFaQSxxQkFBWTs7SUFhWkMsTUFBTTtlQUFOQSxlQUFNOztJQUNOQyxXQUFXO2VBQVhBLGVBQVc7O0lBYlhDLE1BQU07ZUFBTkEsZUFBTTs7SUFjTkMsSUFBSTtlQUFKQSxhQUFJOztJQUNKQyxTQUFTO2VBQVRBLGVBQVM7O0lBQ1RDLFFBQVE7ZUFBUkEsaUJBQVE7O0lBQ1JDLGFBQWE7ZUFBYkEsZUFBYTs7SUFDYkMsTUFBTTtlQUFOQSxlQUFNOztJQUNOQyxXQUFXO2VBQVhBLGVBQVc7O0lBekNYQyxpQkFBaUI7ZUFBakJBLDBCQUFpQjs7SUFlNUJDLHFCQUFxQjtlQUFyQkEsNENBQXFCOztJQVVyQkMsVUFBVTtlQUFWQSxzQkFBVTs7SUFUQ0MsY0FBYztlQUFkQSx1QkFBYzs7SUFFZEMsb0JBQW9CO2VBQXBCQSw2QkFBb0I7O0lBZnRDQyxnQkFBZ0I7ZUFBaEJBLHlCQUFnQjs7SUE0Q0VDLFFBQVE7ZUFBUkEsaUJBQVE7O0lBRFJDLFlBQVk7ZUFBWkEsaUJBQVk7O0lBMUM5QkMsT0FBTztlQUFQQSxnQkFBTzs7SUFDUEMsYUFBYTtlQUFiQSxzQkFBYTs7SUFDYkMsZUFBZTtlQUFmQSx3QkFBZTs7SUFDZkMsaUJBQWlCO2VBQWpCQSwwQkFBaUI7O0lBQ2pCQyxnQkFBZ0I7ZUFBaEJBLHlCQUFnQjs7SUFDaEI7O0dBRUMsR0FDREMsWUFBWTtlQUFaQSxxQkFBWTs7SUFxQ01DLGFBQWE7ZUFBYkEsc0JBQWE7Ozs4REF2REE7eUVBRVc7NkRBRVo7MEVBRWE7eUJBYXRDO3VDQUUrQjt1RUFDSTs2RUFFTTs4REFDZjtxRUFFTzsrREFDTjs0QkFHUDtpRUFDUztvRUFFRztpRUFDUDt1QkFDRjs4REFFRztvRUFDTTsrREFDTDsrREFDSzs2REFDUDsrREFDSztpRUFDRDsrREFDSzsrREFDUDsrREFDSztpRUFLQztzRUFHQyJ9 \ No newline at end of file diff --git a/packages/payload/components/graphics.d.ts b/packages/payload/components/graphics.d.ts new file mode 100644 index 00000000000..df77422f09b --- /dev/null +++ b/packages/payload/components/graphics.d.ts @@ -0,0 +1,7 @@ +export { default as AccountGraphic } from '../dist/admin/components/graphics/Account'; +export { default as DefaultBlockImageGraphic } from '../dist/admin/components/graphics/DefaultBlockImage'; +export { default as FileGraphic } from '../dist/admin/components/graphics/File'; +export { default as IconGraphic } from '../dist/admin/components/graphics/Icon'; +export { default as LogoGraphic } from '../dist/admin/components/graphics/Logo'; +export { default as SearchGraphic } from '../dist/admin/components/graphics/Search'; +//# sourceMappingURL=graphics.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/graphics.js b/packages/payload/components/graphics.js new file mode 100644 index 00000000000..d143b5f1d95 --- /dev/null +++ b/packages/payload/components/graphics.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + AccountGraphic: function() { + return _Account.default; + }, + DefaultBlockImageGraphic: function() { + return _DefaultBlockImage.default; + }, + FileGraphic: function() { + return _File.default; + }, + IconGraphic: function() { + return _Icon.default; + }, + LogoGraphic: function() { + return _Logo.default; + }, + SearchGraphic: function() { + return _Search.default; + } +}); +const _Account = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/graphics/Account")); +const _DefaultBlockImage = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/graphics/DefaultBlockImage")); +const _File = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/graphics/File")); +const _Icon = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/graphics/Icon")); +const _Logo = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/graphics/Logo")); +const _Search = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/graphics/Search")); +function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leHBvcnRzL2NvbXBvbmVudHMvZ3JhcGhpY3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvdW50R3JhcGhpYyB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZ3JhcGhpY3MvQWNjb3VudCdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRGVmYXVsdEJsb2NrSW1hZ2VHcmFwaGljIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9ncmFwaGljcy9EZWZhdWx0QmxvY2tJbWFnZSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRmlsZUdyYXBoaWMgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL2dyYXBoaWNzL0ZpbGUnXG5leHBvcnQgeyBkZWZhdWx0IGFzIEljb25HcmFwaGljIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9ncmFwaGljcy9JY29uJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMb2dvR3JhcGhpYyB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZ3JhcGhpY3MvTG9nbydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2VhcmNoR3JhcGhpYyB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZ3JhcGhpY3MvU2VhcmNoJ1xuIl0sIm5hbWVzIjpbIkFjY291bnRHcmFwaGljIiwiRGVmYXVsdEJsb2NrSW1hZ2VHcmFwaGljIiwiRmlsZUdyYXBoaWMiLCJJY29uR3JhcGhpYyIsIkxvZ29HcmFwaGljIiwiU2VhcmNoR3JhcGhpYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUFBb0JBLGNBQWM7ZUFBZEEsZ0JBQWM7O0lBQ2RDLHdCQUF3QjtlQUF4QkEsMEJBQXdCOztJQUN4QkMsV0FBVztlQUFYQSxhQUFXOztJQUNYQyxXQUFXO2VBQVhBLGFBQVc7O0lBQ1hDLFdBQVc7ZUFBWEEsYUFBVzs7SUFDWEMsYUFBYTtlQUFiQSxlQUFhOzs7Z0VBTFM7MEVBQ1U7NkRBQ2I7NkRBQ0E7NkRBQ0E7K0RBQ0UifQ== \ No newline at end of file diff --git a/packages/payload/components/hooks.d.ts b/packages/payload/components/hooks.d.ts new file mode 100644 index 00000000000..159036a9033 --- /dev/null +++ b/packages/payload/components/hooks.d.ts @@ -0,0 +1,15 @@ +export { useStepNav } from '../dist/admin/components/elements/StepNav'; +export { useTableColumns } from '../dist/admin/components/elements/TableColumns'; +export { useDocumentEvents } from '../dist/admin/components/utilities/DocumentEvents'; +export { default as useDebounce } from '../dist/admin/hooks/useDebounce'; +export { useDebouncedCallback } from '../dist/admin/hooks/useDebouncedCallback'; +export { useDelay } from '../dist/admin/hooks/useDelay'; +export { useDelayedRender } from '../dist/admin/hooks/useDelayedRender'; +export { default as useHotkey } from '../dist/admin/hooks/useHotkey'; +export { default as useIntersect } from '../dist/admin/hooks/useIntersect'; +export { default as useMountEffect } from '../dist/admin/hooks/useMountEffect'; +export { default as usePayloadAPI } from '../dist/admin/hooks/usePayloadAPI'; +export { default as useThrottledEffect } from '../dist/admin/hooks/useThrottledEffect'; +export { default as useThumbnail } from '../dist/admin/hooks/useThumbnail'; +export { default as useTitle, formatUseAsTitle } from '../dist/admin/hooks/useTitle'; +//# sourceMappingURL=hooks.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/hooks.js b/packages/payload/components/hooks.js new file mode 100644 index 00000000000..35ff6889b36 --- /dev/null +++ b/packages/payload/components/hooks.js @@ -0,0 +1,119 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + formatUseAsTitle: function() { + return _useTitle.formatUseAsTitle; + }, + useDebounce: function() { + return _useDebounce.default; + }, + useDebouncedCallback: function() { + return _useDebouncedCallback.useDebouncedCallback; + }, + useDelay: function() { + return _useDelay.useDelay; + }, + useDelayedRender: function() { + return _useDelayedRender.useDelayedRender; + }, + useDocumentEvents: function() { + return _DocumentEvents.useDocumentEvents; + }, + useHotkey: function() { + return _useHotkey.default; + }, + useIntersect: function() { + return _useIntersect.default; + }, + useMountEffect: function() { + return _useMountEffect.default; + }, + usePayloadAPI: function() { + return _usePayloadAPI.default; + }, + useStepNav: function() { + return _StepNav.useStepNav; + }, + useTableColumns: function() { + return _TableColumns.useTableColumns; + }, + useThrottledEffect: function() { + return _useThrottledEffect.default; + }, + useThumbnail: function() { + return _useThumbnail.default; + }, + useTitle: function() { + return _useTitle.default; + } +}); +const _StepNav = require("../dist/admin/components/elements/StepNav"); +const _TableColumns = require("../dist/admin/components/elements/TableColumns"); +const _DocumentEvents = require("../dist/admin/components/utilities/DocumentEvents"); +const _useDebounce = /*#__PURE__*/ _interop_require_default(require("../dist/admin/hooks/useDebounce")); +const _useDebouncedCallback = require("../dist/admin/hooks/useDebouncedCallback"); +const _useDelay = require("../dist/admin/hooks/useDelay"); +const _useDelayedRender = require("../dist/admin/hooks/useDelayedRender"); +const _useHotkey = /*#__PURE__*/ _interop_require_default(require("../dist/admin/hooks/useHotkey")); +const _useIntersect = /*#__PURE__*/ _interop_require_default(require("../dist/admin/hooks/useIntersect")); +const _useMountEffect = /*#__PURE__*/ _interop_require_default(require("../dist/admin/hooks/useMountEffect")); +const _usePayloadAPI = /*#__PURE__*/ _interop_require_default(require("../dist/admin/hooks/usePayloadAPI")); +const _useThrottledEffect = /*#__PURE__*/ _interop_require_default(require("../dist/admin/hooks/useThrottledEffect")); +const _useThumbnail = /*#__PURE__*/ _interop_require_default(require("../dist/admin/hooks/useThumbnail")); +const _useTitle = /*#__PURE__*/ _interop_require_wildcard(require("../dist/admin/hooks/useTitle")); +function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} +function _getRequireWildcardCache(nodeInterop) { + if (typeof WeakMap !== "function") return null; + var cacheBabelInterop = new WeakMap(); + var cacheNodeInterop = new WeakMap(); + return (_getRequireWildcardCache = function(nodeInterop) { + return nodeInterop ? cacheNodeInterop : cacheBabelInterop; + })(nodeInterop); +} +function _interop_require_wildcard(obj, nodeInterop) { + if (!nodeInterop && obj && obj.__esModule) { + return obj; + } + if (obj === null || typeof obj !== "object" && typeof obj !== "function") { + return { + default: obj + }; + } + var cache = _getRequireWildcardCache(nodeInterop); + if (cache && cache.has(obj)) { + return cache.get(obj); + } + var newObj = { + __proto__: null + }; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + for(var key in obj){ + if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + newObj.default = obj; + if (cache) { + cache.set(obj, newObj); + } + return newObj; +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leHBvcnRzL2NvbXBvbmVudHMvaG9va3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgdXNlU3RlcE5hdiB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvU3RlcE5hdidcbmV4cG9ydCB7IHVzZVRhYmxlQ29sdW1ucyB9IGZyb20gJy4uLy4uL2FkbWluL2NvbXBvbmVudHMvZWxlbWVudHMvVGFibGVDb2x1bW5zJ1xuZXhwb3J0IHsgdXNlRG9jdW1lbnRFdmVudHMgfSBmcm9tICcuLi8uLi9hZG1pbi9jb21wb25lbnRzL3V0aWxpdGllcy9Eb2N1bWVudEV2ZW50cydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlRGVib3VuY2UgfSBmcm9tICcuLi8uLi9hZG1pbi9ob29rcy91c2VEZWJvdW5jZSdcbmV4cG9ydCB7IHVzZURlYm91bmNlZENhbGxiYWNrIH0gZnJvbSAnLi4vLi4vYWRtaW4vaG9va3MvdXNlRGVib3VuY2VkQ2FsbGJhY2snXG5leHBvcnQgeyB1c2VEZWxheSB9IGZyb20gJy4uLy4uL2FkbWluL2hvb2tzL3VzZURlbGF5J1xuZXhwb3J0IHsgdXNlRGVsYXllZFJlbmRlciB9IGZyb20gJy4uLy4uL2FkbWluL2hvb2tzL3VzZURlbGF5ZWRSZW5kZXInXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVzZUhvdGtleSB9IGZyb20gJy4uLy4uL2FkbWluL2hvb2tzL3VzZUhvdGtleSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlSW50ZXJzZWN0IH0gZnJvbSAnLi4vLi4vYWRtaW4vaG9va3MvdXNlSW50ZXJzZWN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VNb3VudEVmZmVjdCB9IGZyb20gJy4uLy4uL2FkbWluL2hvb2tzL3VzZU1vdW50RWZmZWN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VQYXlsb2FkQVBJIH0gZnJvbSAnLi4vLi4vYWRtaW4vaG9va3MvdXNlUGF5bG9hZEFQSSdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlVGhyb3R0bGVkRWZmZWN0IH0gZnJvbSAnLi4vLi4vYWRtaW4vaG9va3MvdXNlVGhyb3R0bGVkRWZmZWN0J1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VUaHVtYm5haWwgfSBmcm9tICcuLi8uLi9hZG1pbi9ob29rcy91c2VUaHVtYm5haWwnXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVzZVRpdGxlLCBmb3JtYXRVc2VBc1RpdGxlIH0gZnJvbSAnLi4vLi4vYWRtaW4vaG9va3MvdXNlVGl0bGUnXG4iXSwibmFtZXMiOlsiZm9ybWF0VXNlQXNUaXRsZSIsInVzZURlYm91bmNlIiwidXNlRGVib3VuY2VkQ2FsbGJhY2siLCJ1c2VEZWxheSIsInVzZURlbGF5ZWRSZW5kZXIiLCJ1c2VEb2N1bWVudEV2ZW50cyIsInVzZUhvdGtleSIsInVzZUludGVyc2VjdCIsInVzZU1vdW50RWZmZWN0IiwidXNlUGF5bG9hZEFQSSIsInVzZVN0ZXBOYXYiLCJ1c2VUYWJsZUNvbHVtbnMiLCJ1c2VUaHJvdHRsZWRFZmZlY3QiLCJ1c2VUaHVtYm5haWwiLCJ1c2VUaXRsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUFhOEJBLGdCQUFnQjtlQUFoQkEsMEJBQWdCOztJQVYxQkMsV0FBVztlQUFYQSxvQkFBVzs7SUFDdEJDLG9CQUFvQjtlQUFwQkEsMENBQW9COztJQUNwQkMsUUFBUTtlQUFSQSxrQkFBUTs7SUFDUkMsZ0JBQWdCO2VBQWhCQSxrQ0FBZ0I7O0lBSmhCQyxpQkFBaUI7ZUFBakJBLGlDQUFpQjs7SUFLTkMsU0FBUztlQUFUQSxrQkFBUzs7SUFDVEMsWUFBWTtlQUFaQSxxQkFBWTs7SUFDWkMsY0FBYztlQUFkQSx1QkFBYzs7SUFDZEMsYUFBYTtlQUFiQSxzQkFBYTs7SUFWeEJDLFVBQVU7ZUFBVkEsbUJBQVU7O0lBQ1ZDLGVBQWU7ZUFBZkEsNkJBQWU7O0lBVUpDLGtCQUFrQjtlQUFsQkEsMkJBQWtCOztJQUNsQkMsWUFBWTtlQUFaQSxxQkFBWTs7SUFDWkMsUUFBUTtlQUFSQSxpQkFBUTs7O3lCQWJEOzhCQUNLO2dDQUNFO29FQUNLO3NDQUNGOzBCQUNaO2tDQUNRO2tFQUNJO3FFQUNHO3VFQUNFO3NFQUNEOzJFQUNLO3FFQUNOO2tFQUNjIn0= \ No newline at end of file diff --git a/packages/payload/components/icons.d.ts b/packages/payload/components/icons.d.ts new file mode 100644 index 00000000000..8593acaa61d --- /dev/null +++ b/packages/payload/components/icons.d.ts @@ -0,0 +1,3 @@ +export { default as Chevron } from '../dist/admin/components/icons/Chevron'; +export { default as X } from '../dist/admin/components/icons/X'; +//# sourceMappingURL=icons.d.ts.map \ No newline at end of file diff --git a/packages/payload/components/icons.js b/packages/payload/components/icons.js new file mode 100644 index 00000000000..42edf0e715a --- /dev/null +++ b/packages/payload/components/icons.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +function _export(target, all) { + for(var name in all)Object.defineProperty(target, name, { + enumerable: true, + get: all[name] + }); +} +_export(exports, { + Chevron: function() { + return _Chevron.default; + }, + X: function() { + return _X.default; + } +}); +const _Chevron = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/icons/Chevron")); +const _X = /*#__PURE__*/ _interop_require_default(require("../dist/admin/components/icons/X")); +function _interop_require_default(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leHBvcnRzL2NvbXBvbmVudHMvaWNvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBDaGV2cm9uIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9pY29ucy9DaGV2cm9uJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBYIH0gZnJvbSAnLi4vLi4vYWRtaW4vY29tcG9uZW50cy9pY29ucy9YJ1xuIl0sIm5hbWVzIjpbIkNoZXZyb24iLCJYIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQUFvQkEsT0FBTztlQUFQQSxnQkFBTzs7SUFDUEMsQ0FBQztlQUFEQSxVQUFDOzs7Z0VBRGM7MERBQ04ifQ== \ No newline at end of file diff --git a/packages/payload/components/index.js b/packages/payload/components/index.js new file mode 100644 index 00000000000..7830941f5bf --- /dev/null +++ b/packages/payload/components/index.js @@ -0,0 +1,27 @@ +(()=>{var e={9509:(e,t,n)=>{"use strict";n.r(t),n.d(t,{SortableContext:()=>je,arrayMove:()=>Ce,arraySwap:()=>_e,defaultAnimateLayoutChanges:()=>Ae,defaultNewIndexGetter:()=>Fe,hasSortableData:()=>Ve,horizontalListSortingStrategy:()=>Te,rectSortingStrategy:()=>Me,rectSwappingStrategy:()=>Le,sortableKeyboardCoordinates:()=>Ke,useSortable:()=>He,verticalListSortingStrategy:()=>Re});var r=n(9497),a=n.n(r);n(3730);const o="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement;function l(e){const t=Object.prototype.toString.call(e);return"[object Window]"===t||"[object global]"===t}function i(e){return"nodeType"in e}function u(e){var t,n;return e?l(e)?e:i(e)&&null!=(t=null==(n=e.ownerDocument)?void 0:n.defaultView)?t:window:window}function s(e){const{Document:t}=u(e);return e instanceof t}function c(e){return!l(e)&&e instanceof u(e).HTMLElement}function f(e){return e?l(e)?e.document:i(e)?s(e)?e:c(e)?e.ownerDocument:document:document:document}const d=o?r.useLayoutEffect:r.useEffect;function p(e){const t=(0,r.useRef)(e);return d((()=>{t.current=e})),(0,r.useCallback)((function(){for(var e=arguments.length,n=new Array(e),r=0;r{n.current!==e&&(n.current=e)}),t),n}function m(e){const t=p(e),n=(0,r.useRef)(null),a=(0,r.useCallback)((e=>{e!==n.current&&(null==t||t(e,n.current)),n.current=e}),[]);return[n,a]}let v={};function g(e,t){return(0,r.useMemo)((()=>{if(t)return t;const n=null==v[e]?0:v[e]+1;return v[e]=n,e+"-"+n}),[e,t])}function y(e){return function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a{const r=Object.entries(n);for(const[n,a]of r){const r=t[n];null!=r&&(t[n]=r+e*a)}return t}),{...t})}}const b=y(1),w=y(-1);function k(e){if(!e)return!1;const{KeyboardEvent:t}=u(e.target);return t&&e instanceof t}function x(e){if(function(e){if(!e)return!1;const{TouchEvent:t}=u(e.target);return t&&e instanceof t}(e)){if(e.touches&&e.touches.length){const{clientX:t,clientY:n}=e.touches[0];return{x:t,y:n}}if(e.changedTouches&&e.changedTouches.length){const{clientX:t,clientY:n}=e.changedTouches[0];return{x:t,y:n}}}return function(e){return"clientX"in e&&"clientY"in e}(e)?{x:e.clientX,y:e.clientY}:null}const S=Object.freeze({Translate:{toString(e){if(!e)return;const{x:t,y:n}=e;return"translate3d("+(t?Math.round(t):0)+"px, "+(n?Math.round(n):0)+"px, 0)"}},Scale:{toString(e){if(!e)return;const{scaleX:t,scaleY:n}=e;return"scaleX("+t+") scaleY("+n+")"}},Transform:{toString(e){if(e)return[S.Translate.toString(e),S.Scale.toString(e)].join(" ")}},Transition:{toString(e){let{property:t,duration:n,easing:r}=e;return t+" "+n+"ms "+r}}});var E;function C(){}!function(e){e.DragStart="dragStart",e.DragMove="dragMove",e.DragEnd="dragEnd",e.DragCancel="dragCancel",e.DragOver="dragOver",e.RegisterDroppable="registerDroppable",e.SetDroppableDisabled="setDroppableDisabled",e.UnregisterDroppable="unregisterDroppable"}(E||(E={}));const _=Object.freeze({x:0,y:0});function P(e,t){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function N(e,t){let{data:{value:n}}=e,{data:{value:r}}=t;return n-r}function O(e){let{left:t,top:n,height:r,width:a}=e;return[{x:t,y:n},{x:t+a,y:n},{x:t,y:n+r},{x:t+a,y:n+r}]}function T(e,t){if(!e||0===e.length)return null;const[n]=e;return t?n[t]:n}function M(e){if(e.startsWith("matrix3d(")){const t=e.slice(9,-1).split(/, /);return{x:+t[12],y:+t[13],scaleX:+t[0],scaleY:+t[5]}}if(e.startsWith("matrix(")){const t=e.slice(7,-1).split(/, /);return{x:+t[4],y:+t[5],scaleX:+t[0],scaleY:+t[3]}}return null}const L={ignoreTransform:!1};function z(e,t){void 0===t&&(t=L);let n=e.getBoundingClientRect();if(t.ignoreTransform){const{transform:t,transformOrigin:r}=u(e).getComputedStyle(e);t&&(n=function(e,t,n){const r=M(t);if(!r)return e;const{scaleX:a,scaleY:o,x:l,y:i}=r,u=e.left-l-(1-a)*parseFloat(n),s=e.top-i-(1-o)*parseFloat(n.slice(n.indexOf(" ")+1)),c=a?e.width/a:e.width,f=o?e.height/o:e.height;return{width:c,height:f,top:s,right:u+c,bottom:s+f,left:u}}(n,t,r))}const{top:r,left:a,width:o,height:l,bottom:i,right:s}=n;return{top:r,left:a,width:o,height:l,bottom:i,right:s}}function R(e){return z(e,{ignoreTransform:!0})}function D(e,t){const n=[];return e?function r(a){if(null!=t&&n.length>=t)return n;if(!a)return n;if(s(a)&&null!=a.scrollingElement&&!n.includes(a.scrollingElement))return n.push(a.scrollingElement),n;if(!c(a)||function(e){return e instanceof u(e).SVGElement}(a))return n;if(n.includes(a))return n;const o=u(e).getComputedStyle(a);return a!==e&&function(e,t){void 0===t&&(t=u(e).getComputedStyle(e));const n=/(auto|scroll|overlay)/;return["overflow","overflowX","overflowY"].some((e=>{const r=t[e];return"string"==typeof r&&n.test(r)}))}(a,o)&&n.push(a),function(e,t){return void 0===t&&(t=u(e).getComputedStyle(e)),"fixed"===t.position}(a,o)?n:r(a.parentNode)}(e):n}function I(e){const[t]=D(e,1);return null!=t?t:null}var j;function F(e){return!(!o||!e)&&e===document.scrollingElement}function A(e){const t={x:0,y:0},n=F(e)?{height:window.innerHeight,width:window.innerWidth}:{height:e.clientHeight,width:e.clientWidth},r={x:e.scrollWidth-n.width,y:e.scrollHeight-n.height};return{isTop:e.scrollTop<=t.y,isLeft:e.scrollLeft<=t.x,isBottom:e.scrollTop>=r.y,isRight:e.scrollLeft>=r.x,maxScroll:r,minScroll:t}}!function(e){e[e.Forward=1]="Forward",e[e.Backward=-1]="Backward"}(j||(j={}));function $(e){if(e===document.scrollingElement){const{innerWidth:e,innerHeight:t}=window;return{top:0,left:0,right:e,bottom:t,width:e,height:t}}const{top:t,left:n,right:r,bottom:a}=e.getBoundingClientRect();return{top:t,left:n,right:r,bottom:a,width:e.clientWidth,height:e.clientHeight}}function U(e,t){if(void 0===t&&(t=z),!e)return;const{top:n,left:r,bottom:a,right:o}=t(e);I(e)&&(a<=0||o<=0||n>=window.innerHeight||r>=window.innerWidth)&&e.scrollIntoView({block:"center",inline:"center"})}class B{constructor(e){this.target=void 0,this.listeners=[],this.removeAll=()=>{this.listeners.forEach((e=>{var t;return null==(t=this.target)?void 0:t.removeEventListener(...e)}))},this.target=e}add(e,t,n){var r;null==(r=this.target)||r.addEventListener(e,t,n),this.listeners.push([e,t,n])}}function W(e,t){const n=Math.abs(e.x),r=Math.abs(e.y);return"number"==typeof t?Math.sqrt(n**2+r**2)>t:"x"in t&&"y"in t?n>t.x&&r>t.y:"x"in t?n>t.x:"y"in t&&r>t.y}var H,V;function Q(e){e.preventDefault()}function K(e){e.stopPropagation()}!function(e){e.Click="click",e.DragStart="dragstart",e.Keydown="keydown",e.ContextMenu="contextmenu",e.Resize="resize",e.SelectionChange="selectionchange",e.VisibilityChange="visibilitychange"}(H||(H={})),function(e){e.Space="Space",e.Down="ArrowDown",e.Right="ArrowRight",e.Left="ArrowLeft",e.Up="ArrowUp",e.Esc="Escape",e.Enter="Enter"}(V||(V={}));const q={start:[V.Space,V.Enter],cancel:[V.Esc],end:[V.Space,V.Enter]},Y=(e,t)=>{let{currentCoordinates:n}=t;switch(e.code){case V.Right:return{...n,x:n.x+25};case V.Left:return{...n,x:n.x-25};case V.Down:return{...n,y:n.y+25};case V.Up:return{...n,y:n.y-25}}};class X{constructor(e){this.props=void 0,this.autoScrollEnabled=!1,this.referenceCoordinates=void 0,this.listeners=void 0,this.windowListeners=void 0,this.props=e;const{event:{target:t}}=e;this.props=e,this.listeners=new B(f(t)),this.windowListeners=new B(u(t)),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleCancel=this.handleCancel.bind(this),this.attach()}attach(){this.handleStart(),this.windowListeners.add(H.Resize,this.handleCancel),this.windowListeners.add(H.VisibilityChange,this.handleCancel),setTimeout((()=>this.listeners.add(H.Keydown,this.handleKeyDown)))}handleStart(){const{activeNode:e,onStart:t}=this.props,n=e.node.current;n&&U(n),t(_)}handleKeyDown(e){if(k(e)){const{active:t,context:n,options:r}=this.props,{keyboardCodes:a=q,coordinateGetter:o=Y,scrollBehavior:l="smooth"}=r,{code:i}=e;if(a.end.includes(i))return void this.handleEnd(e);if(a.cancel.includes(i))return void this.handleCancel(e);const{collisionRect:u}=n.current,s=u?{x:u.left,y:u.top}:_;this.referenceCoordinates||(this.referenceCoordinates=s);const c=o(e,{active:t,context:n.current,currentCoordinates:s});if(c){const t=w(c,s),r={x:0,y:0},{scrollableAncestors:a}=n.current;for(const n of a){const a=e.code,{isTop:o,isRight:i,isLeft:u,isBottom:s,maxScroll:f,minScroll:d}=A(n),p=$(n),h={x:Math.min(a===V.Right?p.right-p.width/2:p.right,Math.max(a===V.Right?p.left:p.left+p.width/2,c.x)),y:Math.min(a===V.Down?p.bottom-p.height/2:p.bottom,Math.max(a===V.Down?p.top:p.top+p.height/2,c.y))},m=a===V.Right&&!i||a===V.Left&&!u,v=a===V.Down&&!s||a===V.Up&&!o;if(m&&h.x!==c.x){const e=n.scrollLeft+t.x,o=a===V.Right&&e<=f.x||a===V.Left&&e>=d.x;if(o&&!t.y)return void n.scrollTo({left:e,behavior:l});r.x=o?n.scrollLeft-e:a===V.Right?n.scrollLeft-f.x:n.scrollLeft-d.x,r.x&&n.scrollBy({left:-r.x,behavior:l});break}if(v&&h.y!==c.y){const e=n.scrollTop+t.y,o=a===V.Down&&e<=f.y||a===V.Up&&e>=d.y;if(o&&!t.x)return void n.scrollTo({top:e,behavior:l});r.y=o?n.scrollTop-e:a===V.Down?n.scrollTop-f.y:n.scrollTop-d.y,r.y&&n.scrollBy({top:-r.y,behavior:l});break}}this.handleMove(e,b(w(c,this.referenceCoordinates),r))}}}handleMove(e,t){const{onMove:n}=this.props;e.preventDefault(),n(t)}handleEnd(e){const{onEnd:t}=this.props;e.preventDefault(),this.detach(),t()}handleCancel(e){const{onCancel:t}=this.props;e.preventDefault(),this.detach(),t()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll()}}function G(e){return Boolean(e&&"distance"in e)}function J(e){return Boolean(e&&"delay"in e)}X.activators=[{eventName:"onKeyDown",handler:(e,t,n)=>{let{keyboardCodes:r=q,onActivation:a}=t,{active:o}=n;const{code:l}=e.nativeEvent;if(r.start.includes(l)){const t=o.activatorNode.current;return(!t||e.target===t)&&(e.preventDefault(),null==a||a({event:e.nativeEvent}),!0)}return!1}}];class Z{constructor(e,t,n){var r;void 0===n&&(n=function(e){const{EventTarget:t}=u(e);return e instanceof t?e:f(e)}(e.event.target)),this.props=void 0,this.events=void 0,this.autoScrollEnabled=!0,this.document=void 0,this.activated=!1,this.initialCoordinates=void 0,this.timeoutId=null,this.listeners=void 0,this.documentListeners=void 0,this.windowListeners=void 0,this.props=e,this.events=t;const{event:a}=e,{target:o}=a;this.props=e,this.events=t,this.document=f(o),this.documentListeners=new B(this.document),this.listeners=new B(n),this.windowListeners=new B(u(o)),this.initialCoordinates=null!=(r=x(a))?r:_,this.handleStart=this.handleStart.bind(this),this.handleMove=this.handleMove.bind(this),this.handleEnd=this.handleEnd.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleKeydown=this.handleKeydown.bind(this),this.removeTextSelection=this.removeTextSelection.bind(this),this.attach()}attach(){const{events:e,props:{options:{activationConstraint:t}}}=this;if(this.listeners.add(e.move.name,this.handleMove,{passive:!1}),this.listeners.add(e.end.name,this.handleEnd),this.windowListeners.add(H.Resize,this.handleCancel),this.windowListeners.add(H.DragStart,Q),this.windowListeners.add(H.VisibilityChange,this.handleCancel),this.windowListeners.add(H.ContextMenu,Q),this.documentListeners.add(H.Keydown,this.handleKeydown),t){if(G(t))return;if(J(t))return void(this.timeoutId=setTimeout(this.handleStart,t.delay))}this.handleStart()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll(),setTimeout(this.documentListeners.removeAll,50),null!==this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null)}handleStart(){const{initialCoordinates:e}=this,{onStart:t}=this.props;e&&(this.activated=!0,this.documentListeners.add(H.Click,K,{capture:!0}),this.removeTextSelection(),this.documentListeners.add(H.SelectionChange,this.removeTextSelection),t(e))}handleMove(e){var t;const{activated:n,initialCoordinates:r,props:a}=this,{onMove:o,options:{activationConstraint:l}}=a;if(!r)return;const i=null!=(t=x(e))?t:_,u=w(r,i);if(!n&&l){if(J(l))return W(u,l.tolerance)?this.handleCancel():void 0;if(G(l))return null!=l.tolerance&&W(u,l.tolerance)?this.handleCancel():W(u,l.distance)?this.handleStart():void 0}e.cancelable&&e.preventDefault(),o(i)}handleEnd(){const{onEnd:e}=this.props;this.detach(),e()}handleCancel(){const{onCancel:e}=this.props;this.detach(),e()}handleKeydown(e){e.code===V.Esc&&this.handleCancel()}removeTextSelection(){var e;null==(e=this.document.getSelection())||e.removeAllRanges()}}const ee={move:{name:"pointermove"},end:{name:"pointerup"}};class te extends Z{constructor(e){const{event:t}=e,n=f(t.target);super(e,ee,n)}}te.activators=[{eventName:"onPointerDown",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return!(!n.isPrimary||0!==n.button)&&(null==r||r({event:n}),!0)}}];const ne={move:{name:"mousemove"},end:{name:"mouseup"}};var re;!function(e){e[e.RightClick=2]="RightClick"}(re||(re={}));(class extends Z{constructor(e){super(e,ne,f(e.event.target))}}).activators=[{eventName:"onMouseDown",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return n.button!==re.RightClick&&(null==r||r({event:n}),!0)}}];const ae={move:{name:"touchmove"},end:{name:"touchend"}};var oe,le;(class extends Z{constructor(e){super(e,ae)}static setup(){return window.addEventListener(ae.move.name,e,{capture:!1,passive:!1}),function(){window.removeEventListener(ae.move.name,e)};function e(){}}}).activators=[{eventName:"onTouchStart",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;const{touches:a}=n;return!(a.length>1)&&(null==r||r({event:n}),!0)}}],function(e){e[e.Pointer=0]="Pointer",e[e.DraggableRect=1]="DraggableRect"}(oe||(oe={})),function(e){e[e.TreeOrder=0]="TreeOrder",e[e.ReversedTreeOrder=1]="ReversedTreeOrder"}(le||(le={}));j.Backward,j.Forward,j.Backward,j.Forward;var ie,ue;!function(e){e[e.Always=0]="Always",e[e.BeforeDragging=1]="BeforeDragging",e[e.WhileDragging=2]="WhileDragging"}(ie||(ie={})),function(e){e.Optimized="optimized"}(ue||(ue={}));function se(e){let{callback:t,disabled:n}=e;const a=p(t),o=(0,r.useMemo)((()=>{if(n||"undefined"==typeof window||void 0===window.ResizeObserver)return;const{ResizeObserver:e}=window;return new e(a)}),[n]);return(0,r.useEffect)((()=>()=>null==o?void 0:o.disconnect()),[o]),o}const ce={draggable:{measure:R},droppable:{measure:R,strategy:ie.WhileDragging,frequency:ue.Optimized},dragOverlay:{measure:z}};class fe extends Map{get(e){var t;return null!=e&&null!=(t=super.get(e))?t:void 0}toArray(){return Array.from(this.values())}getEnabled(){return this.toArray().filter((e=>{let{disabled:t}=e;return!t}))}getNodeFor(e){var t,n;return null!=(t=null==(n=this.get(e))?void 0:n.node.current)?t:void 0}}const de={activatorEvent:null,active:null,activeNode:null,activeNodeRect:null,collisions:null,containerNodeRect:null,draggableNodes:new Map,droppableRects:new Map,droppableContainers:new fe,over:null,dragOverlay:{nodeRef:{current:null},rect:null,setRef:C},scrollableAncestors:[],scrollableAncestorRects:[],measuringConfiguration:ce,measureDroppableContainers:C,windowRect:null,measuringScheduled:!1},pe={activatorEvent:null,activators:[],active:null,activeNodeRect:null,ariaDescribedById:{draggable:""},dispatch:C,draggableNodes:new Map,over:null,measureDroppableContainers:C},he=(0,r.createContext)(pe),me=(0,r.createContext)(de);const ve=(0,r.createContext)({..._,scaleX:1,scaleY:1});var ge;!function(e){e[e.Uninitialized=0]="Uninitialized",e[e.Initializing=1]="Initializing",e[e.Initialized=2]="Initialized"}(ge||(ge={}));const ye=(0,r.createContext)(null),be="button",we="Droppable";function ke(e){let{id:t,data:n,disabled:a=!1,attributes:o}=e;const l=g(we),{activators:i,activatorEvent:u,active:s,activeNodeRect:c,ariaDescribedById:f,draggableNodes:p,over:v}=(0,r.useContext)(he),{role:y=be,roleDescription:b="draggable",tabIndex:w=0}=null!=o?o:{},k=(null==s?void 0:s.id)===t,x=(0,r.useContext)(k?ve:ye),[S,E]=m(),[C,_]=m(),P=function(e,t){return(0,r.useMemo)((()=>e.reduce(((e,n)=>{let{eventName:r,handler:a}=n;return e[r]=e=>{a(e,t)},e}),{})),[e,t])}(i,t),N=h(n);d((()=>(p.set(t,{id:t,key:l,node:S,activatorNode:C,data:N}),()=>{const e=p.get(t);e&&e.key===l&&p.delete(t)})),[p,t]);return{active:s,activatorEvent:u,activeNodeRect:c,attributes:(0,r.useMemo)((()=>({role:y,tabIndex:w,"aria-disabled":a,"aria-pressed":!(!k||y!==be)||void 0,"aria-roledescription":b,"aria-describedby":f.draggable})),[a,y,w,k,b,f.draggable]),isDragging:k,listeners:a?void 0:P,node:S,over:v,setNodeRef:E,setActivatorNodeRef:_,transform:x}}function xe(){return(0,r.useContext)(me)}const Se="Droppable",Ee={timeout:25};function Ce(e,t,n){const r=e.slice();return r.splice(n<0?r.length+n:n,0,r.splice(t,1)[0]),r}function _e(e,t,n){const r=e.slice();return r[t]=e[n],r[n]=e[t],r}function Pe(e,t){return e.reduce(((e,n,r)=>{const a=t.get(n);return a&&(e[r]=a),e}),Array(e.length))}function Ne(e){return null!==e&&e>=0}const Oe={scaleX:1,scaleY:1},Te=e=>{var t;let{rects:n,activeNodeRect:r,activeIndex:a,overIndex:o,index:l}=e;const i=null!=(t=n[a])?t:r;if(!i)return null;const u=function(e,t,n){const r=e[t],a=e[t-1],o=e[t+1];if(!r||!a&&!o)return 0;if(na&&l<=o?{x:-i.width-u,y:0,...Oe}:l=o?{x:i.width+u,y:0,...Oe}:{x:0,y:0,...Oe}};const Me=e=>{let{rects:t,activeIndex:n,overIndex:r,index:a}=e;const o=Ce(t,r,n),l=t[a],i=o[a];return i&&l?{x:i.left-l.left,y:i.top-l.top,scaleX:i.width/l.width,scaleY:i.height/l.height}:null},Le=e=>{let t,n,{activeIndex:r,index:a,rects:o,overIndex:l}=e;return a===r&&(t=o[a],n=o[l]),a===l&&(t=o[a],n=o[r]),n&&t?{x:n.left-t.left,y:n.top-t.top,scaleX:n.width/t.width,scaleY:n.height/t.height}:null},ze={scaleX:1,scaleY:1},Re=e=>{var t;let{activeIndex:n,activeNodeRect:r,index:a,rects:o,overIndex:l}=e;const i=null!=(t=o[n])?t:r;if(!i)return null;if(a===n){const e=o[l];return e?{x:0,y:nn&&a<=l?{x:0,y:-i.height-u,...ze}:a=l?{x:0,y:i.height+u,...ze}:{x:0,y:0,...ze}};const De="Sortable",Ie=a().createContext({activeIndex:-1,containerId:De,disableTransforms:!1,items:[],overIndex:-1,useDragOverlay:!1,sortedRects:[],strategy:Me,disabled:{draggable:!1,droppable:!1}});function je(e){let{children:t,id:n,items:o,strategy:l=Me,disabled:i=!1}=e;const{active:u,dragOverlay:s,droppableRects:c,over:f,measureDroppableContainers:p}=xe(),h=g(De,n),m=Boolean(null!==s.rect),v=(0,r.useMemo)((()=>o.map((e=>"object"==typeof e&&"id"in e?e.id:e))),[o]),y=null!=u,b=u?v.indexOf(u.id):-1,w=f?v.indexOf(f.id):-1,k=(0,r.useRef)(v),x=!function(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0;n{x&&y&&p(v)}),[x,v,y,p]),(0,r.useEffect)((()=>{k.current=v}),[v]);const C=(0,r.useMemo)((()=>({activeIndex:b,containerId:h,disabled:E,disableTransforms:S,items:v,overIndex:w,useDragOverlay:m,sortedRects:Pe(v,c),strategy:l})),[b,h,E.draggable,E.droppable,S,v,w,c,m,l]);return a().createElement(Ie.Provider,{value:C},t)}const Fe=e=>{let{id:t,items:n,activeIndex:r,overIndex:a}=e;return Ce(n,r,a).indexOf(t)},Ae=e=>{let{containerId:t,isSorting:n,wasDragging:r,index:a,items:o,newIndex:l,previousItems:i,previousContainerId:u,transition:s}=e;return!(!s||!r)&&((i===o||a!==l)&&(!!n||l!==a&&t===u))},$e={duration:200,easing:"ease"},Ue="transform",Be=S.Transition.toString({property:Ue,duration:0,easing:"linear"}),We={roleDescription:"sortable"};function He(e){let{animateLayoutChanges:t=Ae,attributes:n,disabled:a,data:o,getNewIndex:l=Fe,id:i,strategy:u,resizeObserverConfig:s,transition:c=$e}=e;const{items:f,containerId:p,activeIndex:v,disabled:y,disableTransforms:b,sortedRects:w,overIndex:x,useDragOverlay:C,strategy:_}=(0,r.useContext)(Ie),P=function(e,t){var n,r;if("boolean"==typeof e)return{draggable:e,droppable:!1};return{draggable:null!=(n=null==e?void 0:e.draggable)?n:t.draggable,droppable:null!=(r=null==e?void 0:e.droppable)?r:t.droppable}}(a,y),N=f.indexOf(i),O=(0,r.useMemo)((()=>({sortable:{containerId:p,index:N,items:f},...o})),[p,o,N,f]),T=(0,r.useMemo)((()=>f.slice(f.indexOf(i))),[f,i]),{rect:M,node:L,isOver:R,setNodeRef:D}=function(e){let{data:t,disabled:n=!1,id:a,resizeObserverConfig:o}=e;const l=g(Se),{active:i,dispatch:u,over:s,measureDroppableContainers:c}=(0,r.useContext)(he),f=(0,r.useRef)({disabled:n}),p=(0,r.useRef)(!1),v=(0,r.useRef)(null),y=(0,r.useRef)(null),{disabled:b,updateMeasurementsFor:w,timeout:k}={...Ee,...o},x=h(null!=w?w:a),S=se({callback:(0,r.useCallback)((()=>{p.current?(null!=y.current&&clearTimeout(y.current),y.current=setTimeout((()=>{c(Array.isArray(x.current)?x.current:[x.current]),y.current=null}),k)):p.current=!0}),[k]),disabled:b||!i}),C=(0,r.useCallback)(((e,t)=>{S&&(t&&(S.unobserve(t),p.current=!1),e&&S.observe(e))}),[S]),[_,P]=m(C),N=h(t);return(0,r.useEffect)((()=>{S&&_.current&&(S.disconnect(),p.current=!1,S.observe(_.current))}),[_,S]),d((()=>(u({type:E.RegisterDroppable,element:{id:a,key:l,disabled:n,node:_,rect:v,data:N}}),()=>u({type:E.UnregisterDroppable,key:l,id:a}))),[a]),(0,r.useEffect)((()=>{n!==f.current.disabled&&(u({type:E.SetDroppableDisabled,id:a,key:l,disabled:n}),f.current.disabled=n)}),[a,l,n,u]),{active:i,rect:v,isOver:(null==s?void 0:s.id)===a,node:_,over:s,setNodeRef:P}}({id:i,data:O,disabled:P.droppable,resizeObserverConfig:{updateMeasurementsFor:T,...s}}),{active:I,activatorEvent:j,activeNodeRect:F,attributes:A,setNodeRef:$,listeners:U,isDragging:B,over:W,setActivatorNodeRef:H,transform:V}=ke({id:i,data:O,attributes:{...We,...n},disabled:P.draggable}),Q=function(){for(var e=arguments.length,t=new Array(e),n=0;ne=>{t.forEach((t=>t(e)))}),t)}(D,$),K=Boolean(I),q=K&&!b&&Ne(v)&&Ne(x),Y=!C&&B,X=Y&&q?V:null,G=q?null!=X?X:(null!=u?u:_)({rects:w,activeNodeRect:F,activeIndex:v,overIndex:x,index:N}):null,J=Ne(v)&&Ne(x)?l({id:i,items:f,activeIndex:v,overIndex:x}):N,Z=null==I?void 0:I.id,ee=(0,r.useRef)({activeId:Z,items:f,newIndex:J,containerId:p}),te=f!==ee.current.items,ne=t({active:I,containerId:p,isDragging:B,isSorting:K,id:i,index:N,items:f,newIndex:ee.current.newIndex,previousItems:ee.current.items,previousContainerId:ee.current.containerId,transition:c,wasDragging:null!=ee.current.activeId}),re=function(e){let{disabled:t,index:n,node:a,rect:o}=e;const[l,i]=(0,r.useState)(null),u=(0,r.useRef)(n);return d((()=>{if(!t&&n!==u.current&&a.current){const e=o.current;if(e){const t=z(a.current,{ignoreTransform:!0}),n={x:e.left-t.left,y:e.top-t.top,scaleX:e.width/t.width,scaleY:e.height/t.height};(n.x||n.y)&&i(n)}}n!==u.current&&(u.current=n)}),[t,n,a,o]),(0,r.useEffect)((()=>{l&&i(null)}),[l]),l}({disabled:!ne,index:N,node:L,rect:M});return(0,r.useEffect)((()=>{K&&ee.current.newIndex!==J&&(ee.current.newIndex=J),p!==ee.current.containerId&&(ee.current.containerId=p),f!==ee.current.items&&(ee.current.items=f)}),[K,J,p,f]),(0,r.useEffect)((()=>{if(Z===ee.current.activeId)return;if(Z&&!ee.current.activeId)return void(ee.current.activeId=Z);const e=setTimeout((()=>{ee.current.activeId=Z}),50);return()=>clearTimeout(e)}),[Z]),{active:I,activeIndex:v,attributes:A,data:O,rect:M,index:N,newIndex:J,items:f,isOver:R,isSorting:K,isDragging:B,listeners:U,node:L,overIndex:x,over:W,setNodeRef:Q,setActivatorNodeRef:H,setDroppableNodeRef:D,setDraggableNodeRef:$,transform:null!=re?re:G,transition:function(){if(re||te&&ee.current.newIndex===N)return Be;if(Y&&!k(j)||!c)return;if(K||ne)return S.Transition.toString({...c,property:Ue});return}()}}function Ve(e){if(!e)return!1;const t=e.data.current;return!!(t&&"sortable"in t&&"object"==typeof t.sortable&&"containerId"in t.sortable&&"items"in t.sortable&&"index"in t.sortable)}const Qe=[V.Down,V.Right,V.Up,V.Left],Ke=(e,t)=>{let{context:{active:n,collisionRect:r,droppableRects:a,droppableContainers:o,over:l,scrollableAncestors:i}}=t;if(Qe.includes(e.code)){if(e.preventDefault(),!n||!r)return;const t=[];o.getEnabled().forEach((n=>{if(!n||null!=n&&n.disabled)return;const o=a.get(n.id);if(o)switch(e.code){case V.Down:r.topo.top&&t.push(n);break;case V.Left:r.left>o.left&&t.push(n);break;case V.Right:r.left{let{collisionRect:t,droppableRects:n,droppableContainers:r}=e;const a=O(t),o=[];for(const e of r){const{id:t}=e,r=n.get(t);if(r){const n=O(r),l=a.reduce(((e,t,r)=>e+P(n[r],t)),0),i=Number((l/4).toFixed(4));o.push({id:t,data:{droppableContainer:e,value:i}})}}return o.sort(N)})({active:n,collisionRect:r,droppableRects:a,droppableContainers:t,pointerCoordinates:null});let s=T(u,"id");if(s===(null==l?void 0:l.id)&&u.length>1&&(s=u[1].id),null!=s){const e=o.get(n.id),t=o.get(s),l=t?a.get(t.id):null,u=null==t?void 0:t.node.current;if(u&&l&&e&&t){const n=D(u).some(((e,t)=>i[t]!==e)),a=qe(e,t),o=function(e,t){if(!Ve(e)||!Ve(t))return!1;if(!qe(e,t))return!1;return e.data.current.sortable.index{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=(0,n(9497).createContext)({});t.default=r},2767:function(e,t,n){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n{"use strict";var r=n(9415),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},l={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function u(e){return r.isMemo(e)?l:i[e.$$typeof]||a}i[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[r.Memo]=l;var s=Object.defineProperty,c=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,d=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var a=p(n);a&&a!==h&&e(t,a,r)}var l=c(n);f&&(l=l.concat(f(n)));for(var i=u(t),m=u(n),v=0;v{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},4047:(e,t,n)=>{"use strict";n.r(t)},4355:(e,t,n)=>{"use strict";n.r(t)},1997:(e,t,n)=>{"use strict";n.r(t)},9772:(e,t,n)=>{"use strict";n.r(t)},3710:(e,t,n)=>{"use strict";n.r(t)},2286:(e,t,n)=>{"use strict";n.r(t)},9498:(e,t,n)=>{"use strict";n.r(t)},7484:(e,t,n)=>{"use strict";n.r(t)},7601:(e,t,n)=>{"use strict";n.r(t)},1519:(e,t,n)=>{"use strict";n.r(t)},2125:(e,t,n)=>{"use strict";n.r(t)},3160:(e,t,n)=>{"use strict";n.r(t)},9094:(e,t,n)=>{"use strict";n.r(t)},7889:(e,t,n)=>{"use strict";n.r(t)},6039:(e,t,n)=>{"use strict";n.r(t)},7565:(e,t,n)=>{"use strict";n.r(t)},5415:(e,t,n)=>{var r=n(8967);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return i(o(e,t),t)},e.exports.tokensToFunction=i,e.exports.tokensToRegExp=d;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,l=0,i="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var f=n[0],d=n[1],p=n.index;if(i+=e.slice(l,p),l=p+f.length,d)i+=d[1];else{var h=e[l],m=n[2],v=n[3],g=n[4],y=n[5],b=n[6],w=n[7];i&&(r.push(i),i="");var k=null!=m&&null!=h&&h!==m,x="+"===b||"*"===b,S="?"===b||"*"===b,E=n[2]||c,C=g||y;r.push({name:v||o++,prefix:m||"",delimiter:E,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:C?s(C):w?".*":"[^"+u(E)+"]+?"})}}return l{"use strict";var r=n(5148);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,l){if(l!==r){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},7862:(e,t,n)=>{e.exports=n(1772)()},5148:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},5565:(e,t,n)=>{"use strict";var r=n(9497),a=n(5655); +/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n