From edfa85bcd57b00de54c338f2f3190d3d71da5e74 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Thu, 30 May 2024 14:09:11 -0400 Subject: [PATCH] feat(db-postgres)!: relationship column (#6339) BREAKING CHANGE: Moves `upload` field and `relationship` fields with `hasMany: false` & `relationTo: string` from the many-to-many `_rels` join table to simple columns. This only affects Postgres database users. ## TL;DR We have dramatically simplified the storage of simple relationships in relational databases to boost performance and align with more expected relational paradigms. If you are using the beta Postgres adapter, and you need to keep simple relationship data, you'll need to run a migration script that we provide you. ### Background For example, prior to this update, a collection of "posts" with a simple `hasMany: false` and `relationTo: 'categories'` field would have a `posts_rels` table where the category relations would be stored. This was somewhat unnecessary as simple relations like this can be expressed with a `category_id` column which is configured as a foreign key. This also introduced added complexity for dealing directly with the database if all you have are simple relations. ### Who needs to migrate You need to migrate if you are using the beta Postgres database adapter and any of the following applies to you. - If you have versions enabled on any collection / global - If you use the `upload` field - If you have relationship fields that are `hasMany: false` (default) and `relationTo` to a single category ([has one](https://payloadcms.com/docs/fields/relationship#has-one)) relations ### We have a migration for you Even though the Postgres adapter is in beta, we've prepared a predefined migration that will work out of the box for you to migrate from an earlier version of the adapter to the most recent version easily. It makes the schema changes in step with actually moving the data from the old locations to the new before adding any null constraints and dropping the old columns and tables. ### How to migrate The steps to preserve your data while making this update are as follows. These steps are the same whether you are moving from Payload v2 to v3 or a previous version of v3 beta to the most recent v3 beta. **Important: during these steps, don't start the dev server unless you have `push: false` set on your Postgres adapter.** #### Step 1 - backup Always back up your database before performing big changes, especially in production cases. #### Step 2 - create a pre-update migration Before updating to new Payload and Postgres adapter versions, run `payload migrate:create` without any other config changes to have a prior snapshot of the schema from the previous adapter version #### Step 3 - if you're migrating a dev DB, delete the dev `push` row from your `payload_migrations` table If you're migrating a dev database where you have the default setting to push database changes directly to your DB, and you need to preserve data in your development database, then you need to delete a `dev` migration record from your database. Connect directly to your database in any tool you'd like and delete the dev push record from the `payload_migrations` table using the following SQL statement: ```sql DELETE FROM payload_migrations where batch = -1` ``` #### Step 4 - update Payload and Postgres versions to most recent Update packages, making sure you have matching versions across all `@payloadcms/*` and `payload` packages (including `@payloadcms/db-postgres`) #### Step 5 - create the predefined migration Run the following command to create the predefined migration we've provided: ``` payload migrate:create --file @payloadcms/db-postgres/relationships-v2-v3 ``` #### Step 6 - migrate! Run migrations with the following command: ``` payload migrate ``` Assuming the migration worked, you can proceed to commit this change and distribute it to be run on all other environments. Note that if two servers connect to the same database, only one should be running migrations to avoid transaction conflicts. Related discussion: https://github.com/payloadcms/payload/discussions/4163 --------- Co-authored-by: James Co-authored-by: PatrikKozak --- .../components/Blocks/Form/Country/index.tsx | 2 +- .../components/Blocks/Form/Select/index.tsx | 2 +- .../components/Blocks/Form/State/index.tsx | 2 +- .../CloseModalOnRouteChange/index.tsx | 2 +- .../next-app/components/Gutter/index.tsx | 2 +- examples/live-preview/next-app/package.json | 6 +- examples/live-preview/next-pages/package.json | 6 +- .../app/(app)/_components/Button/index.tsx | 2 +- .../app/(app)/_components/Gutter/index.tsx | 2 +- .../live-preview/payload/src/fields/link.ts | 2 +- packages/db-mongodb/src/createMigration.ts | 48 +- .../predefinedMigrations/versions-v1-v2.js | 0 packages/db-postgres/package.json | 15 +- packages/db-postgres/relationships-v2-v3.mjs | 13 + .../scripts/renamePredefinedMigrations.ts | 18 + packages/db-postgres/src/count.ts | 9 +- packages/db-postgres/src/createMigration.ts | 151 ++--- packages/db-postgres/src/createVersion.ts | 9 +- packages/db-postgres/src/deleteOne.ts | 4 +- .../src/exports/migration-utils.ts | 1 + .../db-postgres/src/find/buildFindManyArgs.ts | 7 +- packages/db-postgres/src/find/findMany.ts | 18 +- .../db-postgres/src/find/traverseFields.ts | 35 +- packages/db-postgres/src/init.ts | 36 +- .../relationships-v2-v3.ts | 10 + .../v2-v3/fetchAndResave/index.ts | 237 +++++++ .../v2-v3/fetchAndResave/traverseFields.ts | 215 +++++++ .../v2-v3/groupUpSQLStatements.ts | 74 +++ .../src/predefinedMigrations/v2-v3/index.ts | 278 ++++++++ .../v2-v3/migrateRelationships.ts | 102 +++ .../v2-v3/traverseFields.ts | 116 ++++ .../src/predefinedMigrations/v2-v3/types.ts | 9 + .../src/queries/buildAndOrConditions.ts | 7 +- .../db-postgres/src/queries/buildQuery.ts | 9 +- .../src/queries/getTableColumnFromPath.ts | 351 ++++++---- .../db-postgres/src/queries/parseParams.ts | 8 +- .../db-postgres/src/queries/selectDistinct.ts | 19 +- packages/db-postgres/src/schema/build.ts | 287 +++++---- .../db-postgres/src/schema/traverseFields.ts | 186 ++++-- .../db-postgres/src/transform/read/index.ts | 11 +- .../src/transform/read/relationship.ts | 4 - .../src/transform/read/traverseFields.ts | 148 +++-- .../src/transform/write/traverseFields.ts | 33 +- packages/db-postgres/src/update.ts | 3 +- packages/db-postgres/src/upsertRow/index.ts | 4 + packages/db-postgres/src/upsertRow/types.ts | 5 + packages/payload/auth.d.ts | 6 + packages/payload/auth.js | 6 + packages/payload/components.d.ts | 14 + packages/payload/components.js | 71 +++ packages/payload/components/elements.d.ts | 14 + packages/payload/components/elements.js | 104 +++ packages/payload/components/fields/Array.d.ts | 2 + packages/payload/components/fields/Array.js | 6 + .../payload/components/fields/Blocks.d.ts | 9 + packages/payload/components/fields/Blocks.js | 39 ++ packages/payload/components/fields/Cell.d.ts | 2 + packages/payload/components/fields/Cell.js | 6 + .../payload/components/fields/Checkbox.d.ts | 2 + .../payload/components/fields/Checkbox.js | 6 + packages/payload/components/fields/Code.d.ts | 2 + packages/payload/components/fields/Code.js | 6 + .../payload/components/fields/DateTime.d.ts | 2 + .../payload/components/fields/DateTime.js | 6 + packages/payload/components/fields/Email.d.ts | 2 + packages/payload/components/fields/Email.js | 6 + packages/payload/components/fields/Group.d.ts | 2 + packages/payload/components/fields/Group.js | 6 + packages/payload/components/fields/Json.d.ts | 2 + packages/payload/components/fields/Json.js | 6 + .../payload/components/fields/Number.d.ts | 2 + packages/payload/components/fields/Number.js | 6 + .../payload/components/fields/Password.d.ts | 2 + .../payload/components/fields/Password.js | 6 + .../fields/RadioGroup/RadioInput.d.ts | 2 + .../fields/RadioGroup/RadioInput.js | 6 + .../components/fields/RadioGroup/index.d.ts | 2 + .../components/fields/RadioGroup/index.js | 6 + .../components/fields/Relationship.d.ts | 3 + .../payload/components/fields/Relationship.js | 18 + .../payload/components/fields/RichText.d.ts | 2 + .../payload/components/fields/RichText.js | 6 + packages/payload/components/fields/Row.d.ts | 2 + packages/payload/components/fields/Row.js | 6 + .../payload/components/fields/Select.d.ts | 3 + packages/payload/components/fields/Select.js | 18 + packages/payload/components/fields/Text.d.ts | 2 + packages/payload/components/fields/Text.js | 6 + .../payload/components/fields/Textarea.d.ts | 2 + .../payload/components/fields/Textarea.js | 6 + .../payload/components/fields/Upload.d.ts | 2 + packages/payload/components/fields/Upload.js | 6 + packages/payload/components/forms.d.ts | 38 ++ packages/payload/components/forms.js | 157 +++++ packages/payload/components/graphics.d.ts | 7 + packages/payload/components/graphics.js | 43 ++ packages/payload/components/hooks.d.ts | 15 + packages/payload/components/hooks.js | 119 ++++ packages/payload/components/icons.d.ts | 3 + packages/payload/components/icons.js | 27 + packages/payload/components/index.js | 27 + packages/payload/components/preferences.d.ts | 2 + packages/payload/components/preferences.js | 13 + packages/payload/components/rich-text.d.ts | 4 + packages/payload/components/rich-text.js | 31 + packages/payload/components/root.d.ts | 2 + packages/payload/components/root.js | 18 + packages/payload/components/styles.css | 1 + packages/payload/components/templates.d.ts | 3 + packages/payload/components/templates.js | 27 + packages/payload/components/utilities.d.ts | 2 + packages/payload/components/utilities.js | 2 + packages/payload/components/views/Cell.d.ts | 3 + packages/payload/components/views/Cell.js | 18 + .../payload/components/views/Dashboard.d.ts | 3 + .../payload/components/views/Dashboard.js | 18 + packages/payload/components/views/Edit.d.ts | 2 + packages/payload/components/views/Edit.js | 18 + packages/payload/components/views/List.d.ts | 3 + packages/payload/components/views/List.js | 18 + packages/payload/config.d.ts | 14 + packages/payload/config.js | 14 + packages/payload/database.d.ts | 23 + packages/payload/database.js | 22 + packages/payload/errors.d.ts | 2 + packages/payload/errors.js | 3 + packages/payload/fields/index.d.ts | 3 + packages/payload/fields/index.js | 4 + packages/payload/fields/validations.d.ts | 2 + packages/payload/fields/validations.js | 3 + packages/payload/graphql.d.ts | 3 + packages/payload/graphql.js | 27 + packages/payload/operations.d.ts | 30 + packages/payload/operations.js | 31 + .../collections/operations/restoreVersion.ts | 1 + .../migrations/getPredefinedMigration.ts | 51 ++ packages/payload/src/database/types.ts | 6 + packages/payload/src/exports/database.ts | 3 + packages/payload/src/versions/saveVersion.ts | 1 + packages/payload/types.d.ts | 17 + packages/payload/types.js | 5 + packages/payload/utilities.d.ts | 33 + packages/payload/utilities.js | 34 + packages/payload/versions.d.ts | 9 + packages/payload/versions.js | 9 + packages/plugin-cloud-storage/azure.d.ts | 2 + packages/plugin-cloud-storage/azure.js | 3 + packages/plugin-cloud-storage/gcs.d.ts | 2 + packages/plugin-cloud-storage/gcs.js | 3 + packages/plugin-cloud-storage/s3.d.ts | 2 + packages/plugin-cloud-storage/s3.js | 3 + packages/richtext-lexical/components.d.ts | 6 + packages/richtext-lexical/components.js | 7 + test/_community/config.ts | 2 +- .../migrations/20240513_181104_test.js | 157 +++++ .../migrations/20240513_181104_test.json | 599 ++++++++++++++++++ test/buildConfigWithDefaults.ts | 8 +- test/database/config.ts | 68 ++ test/database/int.spec.ts | 170 ++++- test/fields/collections/Group/index.ts | 11 + test/fields/int.spec.ts | 31 + .../app/live-preview/_api/getFooter.ts | 2 +- .../app/live-preview/_api/getHeader.ts | 2 +- 163 files changed, 4372 insertions(+), 629 deletions(-) rename packages/db-mongodb/{ => src}/predefinedMigrations/versions-v1-v2.js (100%) create mode 100644 packages/db-postgres/relationships-v2-v3.mjs create mode 100644 packages/db-postgres/scripts/renamePredefinedMigrations.ts create mode 100644 packages/db-postgres/src/exports/migration-utils.ts create mode 100644 packages/db-postgres/src/predefinedMigrations/relationships-v2-v3.ts create mode 100644 packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/index.ts create mode 100644 packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts create mode 100644 packages/db-postgres/src/predefinedMigrations/v2-v3/groupUpSQLStatements.ts create mode 100644 packages/db-postgres/src/predefinedMigrations/v2-v3/index.ts create mode 100644 packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts create mode 100644 packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts create mode 100644 packages/db-postgres/src/predefinedMigrations/v2-v3/types.ts create mode 100644 packages/payload/auth.d.ts create mode 100644 packages/payload/auth.js create mode 100644 packages/payload/components.d.ts create mode 100644 packages/payload/components.js create mode 100644 packages/payload/components/elements.d.ts create mode 100644 packages/payload/components/elements.js create mode 100644 packages/payload/components/fields/Array.d.ts create mode 100644 packages/payload/components/fields/Array.js create mode 100644 packages/payload/components/fields/Blocks.d.ts create mode 100644 packages/payload/components/fields/Blocks.js create mode 100644 packages/payload/components/fields/Cell.d.ts create mode 100644 packages/payload/components/fields/Cell.js create mode 100644 packages/payload/components/fields/Checkbox.d.ts create mode 100644 packages/payload/components/fields/Checkbox.js create mode 100644 packages/payload/components/fields/Code.d.ts create mode 100644 packages/payload/components/fields/Code.js create mode 100644 packages/payload/components/fields/DateTime.d.ts create mode 100644 packages/payload/components/fields/DateTime.js create mode 100644 packages/payload/components/fields/Email.d.ts create mode 100644 packages/payload/components/fields/Email.js create mode 100644 packages/payload/components/fields/Group.d.ts create mode 100644 packages/payload/components/fields/Group.js create mode 100644 packages/payload/components/fields/Json.d.ts create mode 100644 packages/payload/components/fields/Json.js create mode 100644 packages/payload/components/fields/Number.d.ts create mode 100644 packages/payload/components/fields/Number.js create mode 100644 packages/payload/components/fields/Password.d.ts create mode 100644 packages/payload/components/fields/Password.js create mode 100644 packages/payload/components/fields/RadioGroup/RadioInput.d.ts create mode 100644 packages/payload/components/fields/RadioGroup/RadioInput.js create mode 100644 packages/payload/components/fields/RadioGroup/index.d.ts create mode 100644 packages/payload/components/fields/RadioGroup/index.js create mode 100644 packages/payload/components/fields/Relationship.d.ts create mode 100644 packages/payload/components/fields/Relationship.js create mode 100644 packages/payload/components/fields/RichText.d.ts create mode 100644 packages/payload/components/fields/RichText.js create mode 100644 packages/payload/components/fields/Row.d.ts create mode 100644 packages/payload/components/fields/Row.js create mode 100644 packages/payload/components/fields/Select.d.ts create mode 100644 packages/payload/components/fields/Select.js create mode 100644 packages/payload/components/fields/Text.d.ts create mode 100644 packages/payload/components/fields/Text.js create mode 100644 packages/payload/components/fields/Textarea.d.ts create mode 100644 packages/payload/components/fields/Textarea.js create mode 100644 packages/payload/components/fields/Upload.d.ts create mode 100644 packages/payload/components/fields/Upload.js create mode 100644 packages/payload/components/forms.d.ts create mode 100644 packages/payload/components/forms.js create mode 100644 packages/payload/components/graphics.d.ts create mode 100644 packages/payload/components/graphics.js create mode 100644 packages/payload/components/hooks.d.ts create mode 100644 packages/payload/components/hooks.js create mode 100644 packages/payload/components/icons.d.ts create mode 100644 packages/payload/components/icons.js create mode 100644 packages/payload/components/index.js create mode 100644 packages/payload/components/preferences.d.ts create mode 100644 packages/payload/components/preferences.js create mode 100644 packages/payload/components/rich-text.d.ts create mode 100644 packages/payload/components/rich-text.js create mode 100644 packages/payload/components/root.d.ts create mode 100644 packages/payload/components/root.js create mode 100644 packages/payload/components/styles.css create mode 100644 packages/payload/components/templates.d.ts create mode 100644 packages/payload/components/templates.js create mode 100644 packages/payload/components/utilities.d.ts create mode 100644 packages/payload/components/utilities.js create mode 100644 packages/payload/components/views/Cell.d.ts create mode 100644 packages/payload/components/views/Cell.js create mode 100644 packages/payload/components/views/Dashboard.d.ts create mode 100644 packages/payload/components/views/Dashboard.js create mode 100644 packages/payload/components/views/Edit.d.ts create mode 100644 packages/payload/components/views/Edit.js create mode 100644 packages/payload/components/views/List.d.ts create mode 100644 packages/payload/components/views/List.js create mode 100644 packages/payload/config.d.ts create mode 100644 packages/payload/config.js create mode 100644 packages/payload/database.d.ts create mode 100644 packages/payload/database.js create mode 100644 packages/payload/errors.d.ts create mode 100644 packages/payload/errors.js create mode 100644 packages/payload/fields/index.d.ts create mode 100644 packages/payload/fields/index.js create mode 100644 packages/payload/fields/validations.d.ts create mode 100644 packages/payload/fields/validations.js create mode 100644 packages/payload/graphql.d.ts create mode 100644 packages/payload/graphql.js create mode 100644 packages/payload/operations.d.ts create mode 100644 packages/payload/operations.js create mode 100644 packages/payload/src/database/migrations/getPredefinedMigration.ts create mode 100644 packages/payload/types.d.ts create mode 100644 packages/payload/types.js create mode 100644 packages/payload/utilities.d.ts create mode 100644 packages/payload/utilities.js create mode 100644 packages/payload/versions.d.ts create mode 100644 packages/payload/versions.js create mode 100644 packages/plugin-cloud-storage/azure.d.ts create mode 100644 packages/plugin-cloud-storage/azure.js create mode 100644 packages/plugin-cloud-storage/gcs.d.ts create mode 100644 packages/plugin-cloud-storage/gcs.js create mode 100644 packages/plugin-cloud-storage/s3.d.ts create mode 100644 packages/plugin-cloud-storage/s3.js create mode 100644 packages/richtext-lexical/components.d.ts create mode 100644 packages/richtext-lexical/components.js create mode 100644 test/_community/migrations/20240513_181104_test.js create mode 100644 test/_community/migrations/20240513_181104_test.json 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 823690bc87..2d72c1a6a0 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 f52e7e18d0..3dd283f57b 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 b798cfc21d..21d47c7de2 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 a9d9fe3e61..fc46168d36 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 c1b7c918b5..fa7da778e8 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 93211e879a..0befbabb90 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 74e3552689..260c74b7e5 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 37be5aefa2..ea080684d4 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 3223744f45..3845a1a62f 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 0877f2d581..7de052a7d4 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 e14ac7f82d..61df13e919 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) } + const predefinedMigration = await getPredefinedMigration({ + dirname, + file, + migrationName, + payload, + }) - 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 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 2e80a46af6..3840f6dce2 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 0000000000..3ae893d5ec --- /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 0000000000..6519ffad79 --- /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 0d64620246..95bb12c4d2 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 4efbf09202..34db4a2449 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) { - const latestSnapshotJSON = JSON.parse( - fs.readFileSync(`${dir}/${latestSnapshot}`, 'utf8'), - ) as DrizzleSnapshotJSON - - drizzleJsonBefore = latestSnapshotJSON - } - - 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 (!shouldCreateBlankMigration) { - process.exit(0) + if (latestSnapshot) { + drizzleJsonBefore = JSON.parse( + fs.readFileSync(`${dir}/${latestSnapshot}`, 'utf8'), + ) as DrizzleSnapshotJSON } - } - // write schema - fs.writeFileSync(`${filePath}.json`, JSON.stringify(drizzleJsonAfter, null, 2)) + const sqlStatementsUp = await generateMigration(drizzleJsonBefore, drizzleJsonAfter) + const sqlStatementsDown = await generateMigration(drizzleJsonAfter, drizzleJsonBefore) + const sqlExecute = 'await payload.db.drizzle.execute(sql`' + + if (sqlStatementsUp?.length) { + upSQL = `${sqlExecute}\n ${sqlStatementsUp?.join('\n')}\`)` + } + if (sqlStatementsDown?.length) { + downSQL = `${sqlExecute}\n ${sqlStatementsDown?.join('\n')}\`)` + } + + 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) + } + } + + // 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 3bf291f256..f99b14b107 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 b43aec7074..564638e058 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 0000000000..e67c9579f5 --- /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 68994faafc..fa48dcec12 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 41ce010ff8..a86d17ad1d 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 b8503f31ee..9bda489340 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 04fc09423e..1c8357d906 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 0000000000..a7903fbc85 --- /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 0000000000..674834a1ee --- /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 0000000000..f3eb840f9e --- /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 0000000000..f7ec0045d3 --- /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 0000000000..2857a3800f --- /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 0000000000..28728693f3 --- /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 0000000000..be15b624e1 --- /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 0000000000..8980e64b94 --- /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 b2c3b45358..3648c83149 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 4cc21a50b1..7a134d8130 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 1e236f2a0d..978f2414ba 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') { + 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 { - columnName: `${field.relationTo}ID`, constraints, field, + rawColumn: sql.raw(`COALESCE(${tableColumnsNames.join(', ')})`), table: aliasRelationshipTable, } - } - } else if (newCollectionPath === 'value') { - const tableColumnsNames = field.relationTo.map((relationTo) => { - const relationTableName = adapter.tableNameMap.get( - toSnakeCase(adapter.payload.collections[relationTo].config.slug), - ) + } else if (newCollectionPath === 'relationTo') { + const relationTo = Array.isArray(field.relationTo) + ? field.relationTo + : [field.relationTo] - return `"${aliasRelationshipTableName}"."${relationTableName}_id"` + return { + 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') + } + + return getTableColumnFromPath({ + adapter, + aliasTable: newAliasTable, + collectionPath: newCollectionPath, + constraints, + fields: relationshipFields, + joins, + locale, + pathSegments: pathSegments.slice(1), + rootTableName: newTableName, + selectFields, + tableName: newTableName, + value, }) - 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] + } 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) - return { - constraints, - field, - getNotNullColumnByValue: (val) => { - const matchedRelation = relationTo.find((relation) => relation === val) - if (matchedRelation) return `${matchedRelation}ID` - return undefined - }, - table: aliasRelationshipTable, + 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 { - throw new APIError('Not supported') + + return getTableColumnFromPath({ + adapter, + aliasTable: newAliasTable, + collectionPath: newCollectionPath, + constraintPath: '', + constraints, + 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 + const parentTable = aliasTable || adapter.tables[tableName] newTableName = `${tableName}${adapter.localesSuffix}` - const parentTable = aliasTable || adapter.tables[tableName] - - 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 11341cb671..8924df6dcb 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 5231af41c7..28e9c664b7 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 e685b38720..3a35b3a651 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], - }), - })) + // name the relationship by what the many() relationName is + relationName: '_locales', + }) - adapter.relations[`relations_${localeTableName}`] = localesTableRelations + 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, + }) + } + }) + + return result + }) } - 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'), - } - - if (hasLocalizedManyTextField) { - columns.locale = adapter.enums.enum__locales('locale') - } - - 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'), - } - - 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 + + adapter.relations[`relations_${textsTableName}`] = relations(textsTable, ({ one }) => ({ + parent: one(table, { + fields: [textsTable.parent], + references: [table.id], + relationName: '_texts', + }), + })) } - if (hasLocalizedManyNumberField) { - columns.locale = adapter.enums.enum__locales('locale') - } - - 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, + 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, + }) }) - const idColumnName = `${relationTo}ID` - result[idColumnName] = one(adapter.tables[relatedTableName], { - fields: [relationshipsTable[idColumnName]], - references: [adapter.tables[relatedTableName].id], - }) - }) - 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 69fc092264..1f9f9748bc 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], - }), - } - - if (hasLocalesTable(field.fields)) { - result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`]) - } - - subRelationsToBuild.forEach((val, key) => { - result[key] = many(adapter.tables[val]) - }) - - return result + relationsToBuild.set(fieldName, { + type: 'many', + // arrays have their own localized table, independent of the base table. + localized: false, + target: arrayTableName, }) - adapter.relations[`relations_${arrayTableName}`] = arrayTableRelations + 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, + }), + } + + if (hasLocalesTable(field.fields)) { + result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`], { + relationName: '_locales', + }) + } + + 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 }) + } + }) + + 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 - if (field.localized && adapter.payload.config.localization) { + 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, + }) + + // 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 aeb4f911f2..b584c7e98c 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 d606a45709..5d40484d2d 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 0e9abd5689..444be1d525 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 656f2eabc7..8680414976 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 b3717e44f4..c9caa28adc 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 3b24230143..55f13fa242 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 e2952d94a9..b00cd1e761 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 0000000000..d901b14d19 --- /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 0000000000..502a6510ae --- /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 0000000000..365773232f --- /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 0000000000..c557aa8ad8 --- /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 0000000000..c3c7e1ace7 --- /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 0000000000..89e77b3e32 --- /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 0000000000..725ef9ec41 --- /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 0000000000..b775d337d8 --- /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 0000000000..63eb4cdb0b --- /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 0000000000..2e2c4a9ffd --- /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 0000000000..9ea060a7b9 --- /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 0000000000..b775d337d8 --- /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 0000000000..2b03cbcc7d --- /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 0000000000..b775d337d8 --- /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 0000000000..1d5956877e --- /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 0000000000..b775d337d8 --- /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 0000000000..ed5813483d --- /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 0000000000..b775d337d8 --- /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 0000000000..94f9d20bef --- /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 0000000000..b775d337d8 --- /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 0000000000..310839c340 --- /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 0000000000..b775d337d8 --- /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 0000000000..ed4eb022bb --- /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 0000000000..b775d337d8 --- /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 0000000000..289c971d41 --- /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 0000000000..b775d337d8 --- /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 0000000000..ba7c510507 --- /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 0000000000..b775d337d8 --- /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 0000000000..a09f32e0b6 --- /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 0000000000..b775d337d8 --- /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 0000000000..5cd79f1802 --- /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 0000000000..b775d337d8 --- /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 0000000000..a5fd025c02 --- /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 0000000000..a7c049e28b --- /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 0000000000..f145f6b5fa --- /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 0000000000..b775d337d8 --- /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 0000000000..943559f41a --- /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 0000000000..b775d337d8 --- /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 0000000000..d0405e65a8 --- /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 0000000000..2025e49337 --- /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 0000000000..27ec5e619e --- /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 0000000000..b775d337d8 --- /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 0000000000..4527e4408c --- /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 0000000000..b775d337d8 --- /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 0000000000..3c204461eb --- /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 0000000000..b775d337d8 --- /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 0000000000..e131ceb341 --- /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 0000000000..0cba1ce820 --- /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 0000000000..df77422f09 --- /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 0000000000..d143b5f1d9 --- /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 0000000000..159036a903 --- /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 0000000000..35ff6889b3 --- /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 0000000000..8593acaa61 --- /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 0000000000..42edf0e715 --- /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 0000000000..7830941f5b --- /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