From 2a56f98fddc25ec2557dc491c6dcafdd7965fc54 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 30 Jul 2024 16:29:02 -0400 Subject: [PATCH 001/173] test: joins config --- test/config/collections/Joins/index.ts | 18 + test/joins/config.ts | 69 + test/joins/e2e.spec.ts | 37 + test/joins/eslint.config.js | 21 + test/joins/int.spec.ts | 67 + test/joins/payload-types.ts | 184 +++ test/joins/schema.graphql | 1902 ++++++++++++++++++++++++ test/joins/tsconfig.eslint.json | 13 + test/joins/tsconfig.json | 3 + 9 files changed, 2314 insertions(+) create mode 100644 test/config/collections/Joins/index.ts create mode 100644 test/joins/config.ts create mode 100644 test/joins/e2e.spec.ts create mode 100644 test/joins/eslint.config.js create mode 100644 test/joins/int.spec.ts create mode 100644 test/joins/payload-types.ts create mode 100644 test/joins/schema.graphql create mode 100644 test/joins/tsconfig.eslint.json create mode 100644 test/joins/tsconfig.json diff --git a/test/config/collections/Joins/index.ts b/test/config/collections/Joins/index.ts new file mode 100644 index 00000000000..e21d8fd023a --- /dev/null +++ b/test/config/collections/Joins/index.ts @@ -0,0 +1,18 @@ +import type { CollectionConfig } from 'payload' + +export const postsSlug = 'joins' +export const PostsCollection: CollectionConfig = { + slug: postsSlug, + admin: { + useAsTitle: 'text', + }, + fields: [ + { + name: 'text', + type: 'text', + }, + ], + versions: { + drafts: true, + }, +} diff --git a/test/joins/config.ts b/test/joins/config.ts new file mode 100644 index 00000000000..e6f2fc928f0 --- /dev/null +++ b/test/joins/config.ts @@ -0,0 +1,69 @@ +import { fileURLToPath } from 'node:url' +import path from 'path' + +import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' +import { devUser } from '../credentials.js' +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +export default buildConfigWithDefaults({ + collections: [ + { + slug: 'posts', + admin: { + useAsTitle: 'title', + }, + fields: [ + { + name: 'title', + type: 'text', + }, + ], + }, + { + slug: 'categories', + admin: { + useAsTitle: 'name', + }, + fields: [ + { + name: 'name', + type: 'text', + }, + { + name: 'posts', + type: 'join', + collection: 'posts', + path: 'category', + }, + ], + }, + ], + onInit: async (payload) => { + await payload.create({ + collection: 'users', + data: { + email: devUser.email, + password: devUser.password, + }, + }) + + const category = await payload.create({ + collection: 'categories', + data: { + name: 'example', + }, + }) + + await payload.create({ + collection: 'posts', + data: { + category: category.id, + title: 'example post', + }, + }) + }, + typescript: { + outputFile: path.resolve(dirname, 'payload-types.ts'), + }, +}) diff --git a/test/joins/e2e.spec.ts b/test/joins/e2e.spec.ts new file mode 100644 index 00000000000..35e1fb60dfb --- /dev/null +++ b/test/joins/e2e.spec.ts @@ -0,0 +1,37 @@ +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import * as path from 'path' +import { fileURLToPath } from 'url' + +import { ensureCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js' +import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' +import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' +import { TEST_TIMEOUT_LONG } from '../playwright.config.js' + +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +test.describe('Admin Panel', () => { + let page: Page + let url: AdminUrlUtil + + test.beforeAll(async ({ browser }, testInfo) => { + testInfo.setTimeout(TEST_TIMEOUT_LONG) + + const { payload, serverURL } = await initPayloadE2ENoConfig({ dirname }) + url = new AdminUrlUtil(serverURL, 'posts') + + const context = await browser.newContext() + page = await context.newPage() + initPageConsoleErrorCatch(page) + await ensureCompilationIsDone({ page, serverURL }) + }) + + test('example test', async () => { + await page.goto(url.list) + + const textCell = page.locator('.row-1 .cell-text') + await expect(textCell).toHaveText('example post') + }) +}) diff --git a/test/joins/eslint.config.js b/test/joins/eslint.config.js new file mode 100644 index 00000000000..b27e03cee9a --- /dev/null +++ b/test/joins/eslint.config.js @@ -0,0 +1,21 @@ +import { rootParserOptions } from '../../eslint.config.js' +import { testEslintConfig } from '../eslint.config.js' + +/** @typedef {import('eslint').Linter.FlatConfig} */ +let FlatConfig + +/** @type {FlatConfig[]} */ +export const index = [ + ...testEslintConfig, + { + languageOptions: { + parserOptions: { + project: './tsconfig.eslint.json', + tsconfigDirName: import.meta.dirname, + ...rootParserOptions, + }, + }, + }, +] + +export default index diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts new file mode 100644 index 00000000000..ec870e44ec1 --- /dev/null +++ b/test/joins/int.spec.ts @@ -0,0 +1,67 @@ +import type { Payload } from 'payload' + +import type { NextRESTClient } from '../helpers/NextRESTClient.js' + +import { devUser } from '../credentials.js' +import { initPayloadInt } from '../helpers/initPayloadInt.js' +import { postsSlug } from './collections/Posts/index.js' +import configPromise from './config.js' + +let payload: Payload +let token: string +let restClient: NextRESTClient + +const { email, password } = devUser + +describe('Joins Field Tests', () => { + // --__--__--__--__--__--__--__--__--__ + // Boilerplate test setup/teardown + // --__--__--__--__--__--__--__--__--__ + beforeAll(async () => { + const initialized = await initPayloadInt(configPromise) + ;({ payload, restClient } = initialized) + + const data = await restClient + .POST('/users/login', { + body: JSON.stringify({ + email, + password, + }), + }) + .then((res) => res.json()) + + token = data.token + }) + + afterAll(async () => { + if (typeof payload.db.destroy === 'function') { + await payload.db.destroy() + } + }) + + it('local API example', async () => { + const newPost = await payload.create({ + collection: postsSlug, + data: { + text: 'LOCAL API EXAMPLE', + }, + }) + + expect(newPost.text).toEqual('LOCAL API EXAMPLE') + }) + + it('rest API example', async () => { + const data = await restClient + .POST(`/${postsSlug}`, { + body: JSON.stringify({ + text: 'REST API EXAMPLE', + }), + headers: { + Authorization: `JWT ${token}`, + }, + }) + .then((res) => res.json()) + + expect(data.doc.text).toEqual('REST API EXAMPLE') + }) +}) diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts new file mode 100644 index 00000000000..bf1368e08ef --- /dev/null +++ b/test/joins/payload-types.ts @@ -0,0 +1,184 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * This file was automatically generated by Payload. + * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config, + * and re-run `payload generate:types` to regenerate this file. + */ + +export interface Config { + auth: { + users: UserAuthOperations; + }; + collections: { + posts: Post; + users: User; + 'payload-preferences': PayloadPreference; + 'payload-migrations': PayloadMigration; + }; + db: { + defaultIDType: string; + }; + globals: { + menu: Menu; + 'custom-ts': CustomT; + }; + locale: null; + user: User & { + collection: 'users'; + }; +} +export interface UserAuthOperations { + forgotPassword: { + email: string; + }; + login: { + email: string; + password: string; + }; + registerFirstUser: { + email: string; + password: string; + }; + unlock: { + email: string; + }; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "posts". + */ +export interface Post { + id: string; + text?: string | null; + richText?: { + root: { + type: string; + children: { + type: string; + version: number; + [k: string]: unknown; + }[]; + direction: ('ltr' | 'rtl') | null; + format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; + indent: number; + version: number; + }; + [k: string]: unknown; + } | null; + richText2?: { + root: { + type: string; + children: { + type: string; + version: number; + [k: string]: unknown; + }[]; + direction: ('ltr' | 'rtl') | null; + format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; + indent: number; + version: number; + }; + [k: string]: unknown; + } | null; + updatedAt: string; + createdAt: string; + _status?: ('draft' | 'published') | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users". + */ +export interface User { + id: string; + updatedAt: string; + createdAt: string; + email: string; + resetPasswordToken?: string | null; + resetPasswordExpiration?: string | null; + salt?: string | null; + hash?: string | null; + loginAttempts?: number | null; + lockUntil?: string | null; + password?: string | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-preferences". + */ +export interface PayloadPreference { + id: string; + user: { + relationTo: 'users'; + value: string | User; + }; + key?: string | null; + value?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-migrations". + */ +export interface PayloadMigration { + id: string; + name?: string | null; + batch?: number | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "menu". + */ +export interface Menu { + id: string; + globalText?: string | null; + updatedAt?: string | null; + createdAt?: string | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "custom-ts". + */ +export interface CustomT { + id: string; + custom?: 'hello' | 'world'; + withDefinitionsUsage?: ObjectWithNumber[]; + json: { + id: string; + name: string; + age?: number; + }[]; + updatedAt?: string | null; + createdAt?: string | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "objectWithNumber". + */ +export interface ObjectWithNumber { + id?: number; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "auth". + */ +export interface Auth { + [k: string]: unknown; +} + + +declare module 'payload' { + // @ts-ignore + export interface GeneratedTypes extends Config {} +} \ No newline at end of file diff --git a/test/joins/schema.graphql b/test/joins/schema.graphql new file mode 100644 index 00000000000..1038d843d62 --- /dev/null +++ b/test/joins/schema.graphql @@ -0,0 +1,1902 @@ +type Query { + Post(id: String!, draft: Boolean): Post + Posts(draft: Boolean, where: Post_where, limit: Int, page: Int, sort: String): Posts + countPosts(draft: Boolean, where: Post_where): countPosts + docAccessPost(id: String!): postsDocAccess + versionPost(id: String): PostVersion + versionsPosts(where: versionsPost_where, limit: Int, page: Int, sort: String): versionsPosts + User(id: String!, draft: Boolean): User + Users(draft: Boolean, where: User_where, limit: Int, page: Int, sort: String): Users + countUsers(draft: Boolean, where: User_where): countUsers + docAccessUser(id: String!): usersDocAccess + meUser: usersMe + initializedUser: Boolean + PayloadPreference(id: String!, draft: Boolean): PayloadPreference + PayloadPreferences( + draft: Boolean + where: PayloadPreference_where + limit: Int + page: Int + sort: String + ): PayloadPreferences + countPayloadPreferences(draft: Boolean, where: PayloadPreference_where): countPayloadPreferences + docAccessPayloadPreference(id: String!): payload_preferencesDocAccess + Menu(draft: Boolean): Menu + docAccessMenu: menuDocAccess + Access: Access +} + +type Post { + id: String + text: String + richText(depth: Int): JSON + richText2(depth: Int): JSON + updatedAt: DateTime + createdAt: DateTime + _status: Post__status +} + +""" +The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSON + @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf") + +""" +A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. +""" +scalar DateTime + +enum Post__status { + draft + published +} + +type Posts { + docs: [Post] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input Post_where { + text: Post_text_operator + richText: Post_richText_operator + richText2: Post_richText2_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + _status: Post__status_operator + id: Post_id_operator + AND: [Post_where_and] + OR: [Post_where_or] +} + +input Post_text_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_richText_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + exists: Boolean +} + +input Post_richText2_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + exists: Boolean +} + +input Post_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Post_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Post__status_operator { + equals: Post__status_Input + not_equals: Post__status_Input + in: [Post__status_Input] + not_in: [Post__status_Input] + all: [Post__status_Input] + exists: Boolean +} + +enum Post__status_Input { + draft + published +} + +input Post_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_where_and { + text: Post_text_operator + richText: Post_richText_operator + richText2: Post_richText2_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + _status: Post__status_operator + id: Post_id_operator + AND: [Post_where_and] + OR: [Post_where_or] +} + +input Post_where_or { + text: Post_text_operator + richText: Post_richText_operator + richText2: Post_richText2_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + _status: Post__status_operator + id: Post_id_operator + AND: [Post_where_and] + OR: [Post_where_or] +} + +type countPosts { + totalDocs: Int +} + +type postsDocAccess { + fields: PostsDocAccessFields + create: PostsCreateDocAccess + read: PostsReadDocAccess + update: PostsUpdateDocAccess + delete: PostsDeleteDocAccess + readVersions: PostsReadVersionsDocAccess +} + +type PostsDocAccessFields { + text: PostsDocAccessFields_text + richText: PostsDocAccessFields_richText + richText2: PostsDocAccessFields_richText2 + updatedAt: PostsDocAccessFields_updatedAt + createdAt: PostsDocAccessFields_createdAt + _status: PostsDocAccessFields__status +} + +type PostsDocAccessFields_text { + create: PostsDocAccessFields_text_Create + read: PostsDocAccessFields_text_Read + update: PostsDocAccessFields_text_Update + delete: PostsDocAccessFields_text_Delete +} + +type PostsDocAccessFields_text_Create { + permission: Boolean! +} + +type PostsDocAccessFields_text_Read { + permission: Boolean! +} + +type PostsDocAccessFields_text_Update { + permission: Boolean! +} + +type PostsDocAccessFields_text_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_richText { + create: PostsDocAccessFields_richText_Create + read: PostsDocAccessFields_richText_Read + update: PostsDocAccessFields_richText_Update + delete: PostsDocAccessFields_richText_Delete +} + +type PostsDocAccessFields_richText_Create { + permission: Boolean! +} + +type PostsDocAccessFields_richText_Read { + permission: Boolean! +} + +type PostsDocAccessFields_richText_Update { + permission: Boolean! +} + +type PostsDocAccessFields_richText_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_richText2 { + create: PostsDocAccessFields_richText2_Create + read: PostsDocAccessFields_richText2_Read + update: PostsDocAccessFields_richText2_Update + delete: PostsDocAccessFields_richText2_Delete +} + +type PostsDocAccessFields_richText2_Create { + permission: Boolean! +} + +type PostsDocAccessFields_richText2_Read { + permission: Boolean! +} + +type PostsDocAccessFields_richText2_Update { + permission: Boolean! +} + +type PostsDocAccessFields_richText2_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt { + create: PostsDocAccessFields_updatedAt_Create + read: PostsDocAccessFields_updatedAt_Read + update: PostsDocAccessFields_updatedAt_Update + delete: PostsDocAccessFields_updatedAt_Delete +} + +type PostsDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt { + create: PostsDocAccessFields_createdAt_Create + read: PostsDocAccessFields_createdAt_Read + update: PostsDocAccessFields_createdAt_Update + delete: PostsDocAccessFields_createdAt_Delete +} + +type PostsDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type PostsDocAccessFields__status { + create: PostsDocAccessFields__status_Create + read: PostsDocAccessFields__status_Read + update: PostsDocAccessFields__status_Update + delete: PostsDocAccessFields__status_Delete +} + +type PostsDocAccessFields__status_Create { + permission: Boolean! +} + +type PostsDocAccessFields__status_Read { + permission: Boolean! +} + +type PostsDocAccessFields__status_Update { + permission: Boolean! +} + +type PostsDocAccessFields__status_Delete { + permission: Boolean! +} + +type PostsCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +""" +The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSONObject + @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf") + +type PostsReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsReadVersionsDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostVersion { + parent(draft: Boolean): Post + version: PostVersion_Version + createdAt: DateTime + updatedAt: DateTime + latest: Boolean + id: String +} + +type PostVersion_Version { + text: String + richText(depth: Int): JSON + richText2(depth: Int): JSON + updatedAt: DateTime + createdAt: DateTime + _status: PostVersion_Version__status +} + +enum PostVersion_Version__status { + draft + published +} + +type versionsPosts { + docs: [PostVersion] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input versionsPost_where { + parent: versionsPost_parent_operator + version__text: versionsPost_version__text_operator + version__richText: versionsPost_version__richText_operator + version__richText2: versionsPost_version__richText2_operator + version__updatedAt: versionsPost_version__updatedAt_operator + version__createdAt: versionsPost_version__createdAt_operator + version___status: versionsPost_version___status_operator + createdAt: versionsPost_createdAt_operator + updatedAt: versionsPost_updatedAt_operator + latest: versionsPost_latest_operator + id: versionsPost_id_operator + AND: [versionsPost_where_and] + OR: [versionsPost_where_or] +} + +input versionsPost_parent_operator { + equals: JSON + not_equals: JSON + in: [JSON] + not_in: [JSON] + all: [JSON] + exists: Boolean +} + +input versionsPost_version__text_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input versionsPost_version__richText_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + exists: Boolean +} + +input versionsPost_version__richText2_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + exists: Boolean +} + +input versionsPost_version__updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input versionsPost_version__createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input versionsPost_version___status_operator { + equals: versionsPost_version___status_Input + not_equals: versionsPost_version___status_Input + in: [versionsPost_version___status_Input] + not_in: [versionsPost_version___status_Input] + all: [versionsPost_version___status_Input] + exists: Boolean +} + +enum versionsPost_version___status_Input { + draft + published +} + +input versionsPost_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input versionsPost_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input versionsPost_latest_operator { + equals: Boolean + not_equals: Boolean + exists: Boolean +} + +input versionsPost_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input versionsPost_where_and { + parent: versionsPost_parent_operator + version__text: versionsPost_version__text_operator + version__richText: versionsPost_version__richText_operator + version__richText2: versionsPost_version__richText2_operator + version__updatedAt: versionsPost_version__updatedAt_operator + version__createdAt: versionsPost_version__createdAt_operator + version___status: versionsPost_version___status_operator + createdAt: versionsPost_createdAt_operator + updatedAt: versionsPost_updatedAt_operator + latest: versionsPost_latest_operator + id: versionsPost_id_operator + AND: [versionsPost_where_and] + OR: [versionsPost_where_or] +} + +input versionsPost_where_or { + parent: versionsPost_parent_operator + version__text: versionsPost_version__text_operator + version__richText: versionsPost_version__richText_operator + version__richText2: versionsPost_version__richText2_operator + version__updatedAt: versionsPost_version__updatedAt_operator + version__createdAt: versionsPost_version__createdAt_operator + version___status: versionsPost_version___status_operator + createdAt: versionsPost_createdAt_operator + updatedAt: versionsPost_updatedAt_operator + latest: versionsPost_latest_operator + id: versionsPost_id_operator + AND: [versionsPost_where_and] + OR: [versionsPost_where_or] +} + +type User { + id: String + updatedAt: DateTime + createdAt: DateTime + email: EmailAddress! + resetPasswordToken: String + resetPasswordExpiration: DateTime + salt: String + hash: String + loginAttempts: Float + lockUntil: DateTime + password: String! +} + +""" +A field whose value conforms to the standard internet email address format as specified in HTML Spec: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address. +""" +scalar EmailAddress + @specifiedBy(url: "https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address") + +type Users { + docs: [User] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input User_where { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + AND: [User_where_and] + OR: [User_where_or] +} + +input User_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input User_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input User_email_operator { + equals: EmailAddress + not_equals: EmailAddress + like: EmailAddress + contains: EmailAddress + in: [EmailAddress] + not_in: [EmailAddress] + all: [EmailAddress] +} + +input User_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input User_where_and { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + AND: [User_where_and] + OR: [User_where_or] +} + +input User_where_or { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + AND: [User_where_and] + OR: [User_where_or] +} + +type countUsers { + totalDocs: Int +} + +type usersDocAccess { + fields: UsersDocAccessFields + create: UsersCreateDocAccess + read: UsersReadDocAccess + update: UsersUpdateDocAccess + delete: UsersDeleteDocAccess + unlock: UsersUnlockDocAccess +} + +type UsersDocAccessFields { + updatedAt: UsersDocAccessFields_updatedAt + createdAt: UsersDocAccessFields_createdAt + email: UsersDocAccessFields_email + password: UsersDocAccessFields_password +} + +type UsersDocAccessFields_updatedAt { + create: UsersDocAccessFields_updatedAt_Create + read: UsersDocAccessFields_updatedAt_Read + update: UsersDocAccessFields_updatedAt_Update + delete: UsersDocAccessFields_updatedAt_Delete +} + +type UsersDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt { + create: UsersDocAccessFields_createdAt_Create + read: UsersDocAccessFields_createdAt_Read + update: UsersDocAccessFields_createdAt_Update + delete: UsersDocAccessFields_createdAt_Delete +} + +type UsersDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_email { + create: UsersDocAccessFields_email_Create + read: UsersDocAccessFields_email_Read + update: UsersDocAccessFields_email_Update + delete: UsersDocAccessFields_email_Delete +} + +type UsersDocAccessFields_email_Create { + permission: Boolean! +} + +type UsersDocAccessFields_email_Read { + permission: Boolean! +} + +type UsersDocAccessFields_email_Update { + permission: Boolean! +} + +type UsersDocAccessFields_email_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_password { + create: UsersDocAccessFields_password_Create + read: UsersDocAccessFields_password_Read + update: UsersDocAccessFields_password_Update + delete: UsersDocAccessFields_password_Delete +} + +type UsersDocAccessFields_password_Create { + permission: Boolean! +} + +type UsersDocAccessFields_password_Read { + permission: Boolean! +} + +type UsersDocAccessFields_password_Update { + permission: Boolean! +} + +type UsersDocAccessFields_password_Delete { + permission: Boolean! +} + +type UsersCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUnlockDocAccess { + permission: Boolean! + where: JSONObject +} + +type usersMe { + collection: String + exp: Int + token: String + user: User +} + +type PayloadPreference { + id: String + user: PayloadPreference_User_Relationship! + key: String + value: JSON + updatedAt: DateTime + createdAt: DateTime +} + +type PayloadPreference_User_Relationship { + relationTo: PayloadPreference_User_RelationTo + value: PayloadPreference_User +} + +enum PayloadPreference_User_RelationTo { + users +} + +union PayloadPreference_User = User + +type PayloadPreferences { + docs: [PayloadPreference] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input PayloadPreference_where { + user: PayloadPreference_user_Relation + key: PayloadPreference_key_operator + value: PayloadPreference_value_operator + updatedAt: PayloadPreference_updatedAt_operator + createdAt: PayloadPreference_createdAt_operator + id: PayloadPreference_id_operator + AND: [PayloadPreference_where_and] + OR: [PayloadPreference_where_or] +} + +input PayloadPreference_user_Relation { + relationTo: PayloadPreference_user_Relation_RelationTo + value: JSON +} + +enum PayloadPreference_user_Relation_RelationTo { + users +} + +input PayloadPreference_key_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input PayloadPreference_value_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + within: JSON + intersects: JSON + exists: Boolean +} + +input PayloadPreference_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input PayloadPreference_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input PayloadPreference_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input PayloadPreference_where_and { + user: PayloadPreference_user_Relation + key: PayloadPreference_key_operator + value: PayloadPreference_value_operator + updatedAt: PayloadPreference_updatedAt_operator + createdAt: PayloadPreference_createdAt_operator + id: PayloadPreference_id_operator + AND: [PayloadPreference_where_and] + OR: [PayloadPreference_where_or] +} + +input PayloadPreference_where_or { + user: PayloadPreference_user_Relation + key: PayloadPreference_key_operator + value: PayloadPreference_value_operator + updatedAt: PayloadPreference_updatedAt_operator + createdAt: PayloadPreference_createdAt_operator + id: PayloadPreference_id_operator + AND: [PayloadPreference_where_and] + OR: [PayloadPreference_where_or] +} + +type countPayloadPreferences { + totalDocs: Int +} + +type payload_preferencesDocAccess { + fields: PayloadPreferencesDocAccessFields + create: PayloadPreferencesCreateDocAccess + read: PayloadPreferencesReadDocAccess + update: PayloadPreferencesUpdateDocAccess + delete: PayloadPreferencesDeleteDocAccess +} + +type PayloadPreferencesDocAccessFields { + user: PayloadPreferencesDocAccessFields_user + key: PayloadPreferencesDocAccessFields_key + value: PayloadPreferencesDocAccessFields_value + updatedAt: PayloadPreferencesDocAccessFields_updatedAt + createdAt: PayloadPreferencesDocAccessFields_createdAt +} + +type PayloadPreferencesDocAccessFields_user { + create: PayloadPreferencesDocAccessFields_user_Create + read: PayloadPreferencesDocAccessFields_user_Read + update: PayloadPreferencesDocAccessFields_user_Update + delete: PayloadPreferencesDocAccessFields_user_Delete +} + +type PayloadPreferencesDocAccessFields_user_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_user_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_user_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_user_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key { + create: PayloadPreferencesDocAccessFields_key_Create + read: PayloadPreferencesDocAccessFields_key_Read + update: PayloadPreferencesDocAccessFields_key_Update + delete: PayloadPreferencesDocAccessFields_key_Delete +} + +type PayloadPreferencesDocAccessFields_key_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value { + create: PayloadPreferencesDocAccessFields_value_Create + read: PayloadPreferencesDocAccessFields_value_Read + update: PayloadPreferencesDocAccessFields_value_Update + delete: PayloadPreferencesDocAccessFields_value_Delete +} + +type PayloadPreferencesDocAccessFields_value_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt { + create: PayloadPreferencesDocAccessFields_updatedAt_Create + read: PayloadPreferencesDocAccessFields_updatedAt_Read + update: PayloadPreferencesDocAccessFields_updatedAt_Update + delete: PayloadPreferencesDocAccessFields_updatedAt_Delete +} + +type PayloadPreferencesDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt { + create: PayloadPreferencesDocAccessFields_createdAt_Create + read: PayloadPreferencesDocAccessFields_createdAt_Read + update: PayloadPreferencesDocAccessFields_createdAt_Update + delete: PayloadPreferencesDocAccessFields_createdAt_Delete +} + +type PayloadPreferencesDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type Menu { + globalText: String + updatedAt: DateTime + createdAt: DateTime +} + +type menuDocAccess { + fields: MenuDocAccessFields + read: MenuReadDocAccess + update: MenuUpdateDocAccess +} + +type MenuDocAccessFields { + globalText: MenuDocAccessFields_globalText + updatedAt: MenuDocAccessFields_updatedAt + createdAt: MenuDocAccessFields_createdAt +} + +type MenuDocAccessFields_globalText { + create: MenuDocAccessFields_globalText_Create + read: MenuDocAccessFields_globalText_Read + update: MenuDocAccessFields_globalText_Update + delete: MenuDocAccessFields_globalText_Delete +} + +type MenuDocAccessFields_globalText_Create { + permission: Boolean! +} + +type MenuDocAccessFields_globalText_Read { + permission: Boolean! +} + +type MenuDocAccessFields_globalText_Update { + permission: Boolean! +} + +type MenuDocAccessFields_globalText_Delete { + permission: Boolean! +} + +type MenuDocAccessFields_updatedAt { + create: MenuDocAccessFields_updatedAt_Create + read: MenuDocAccessFields_updatedAt_Read + update: MenuDocAccessFields_updatedAt_Update + delete: MenuDocAccessFields_updatedAt_Delete +} + +type MenuDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type MenuDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type MenuDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type MenuDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type MenuDocAccessFields_createdAt { + create: MenuDocAccessFields_createdAt_Create + read: MenuDocAccessFields_createdAt_Read + update: MenuDocAccessFields_createdAt_Update + delete: MenuDocAccessFields_createdAt_Delete +} + +type MenuDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type MenuDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type MenuDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type MenuDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type MenuReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type MenuUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type Access { + canAccessAdmin: Boolean! + posts: postsAccess + users: usersAccess + payload_preferences: payload_preferencesAccess + menu: menuAccess +} + +type postsAccess { + fields: PostsFields + create: PostsCreateAccess + read: PostsReadAccess + update: PostsUpdateAccess + delete: PostsDeleteAccess + readVersions: PostsReadVersionsAccess +} + +type PostsFields { + text: PostsFields_text + richText: PostsFields_richText + richText2: PostsFields_richText2 + updatedAt: PostsFields_updatedAt + createdAt: PostsFields_createdAt + _status: PostsFields__status +} + +type PostsFields_text { + create: PostsFields_text_Create + read: PostsFields_text_Read + update: PostsFields_text_Update + delete: PostsFields_text_Delete +} + +type PostsFields_text_Create { + permission: Boolean! +} + +type PostsFields_text_Read { + permission: Boolean! +} + +type PostsFields_text_Update { + permission: Boolean! +} + +type PostsFields_text_Delete { + permission: Boolean! +} + +type PostsFields_richText { + create: PostsFields_richText_Create + read: PostsFields_richText_Read + update: PostsFields_richText_Update + delete: PostsFields_richText_Delete +} + +type PostsFields_richText_Create { + permission: Boolean! +} + +type PostsFields_richText_Read { + permission: Boolean! +} + +type PostsFields_richText_Update { + permission: Boolean! +} + +type PostsFields_richText_Delete { + permission: Boolean! +} + +type PostsFields_richText2 { + create: PostsFields_richText2_Create + read: PostsFields_richText2_Read + update: PostsFields_richText2_Update + delete: PostsFields_richText2_Delete +} + +type PostsFields_richText2_Create { + permission: Boolean! +} + +type PostsFields_richText2_Read { + permission: Boolean! +} + +type PostsFields_richText2_Update { + permission: Boolean! +} + +type PostsFields_richText2_Delete { + permission: Boolean! +} + +type PostsFields_updatedAt { + create: PostsFields_updatedAt_Create + read: PostsFields_updatedAt_Read + update: PostsFields_updatedAt_Update + delete: PostsFields_updatedAt_Delete +} + +type PostsFields_updatedAt_Create { + permission: Boolean! +} + +type PostsFields_updatedAt_Read { + permission: Boolean! +} + +type PostsFields_updatedAt_Update { + permission: Boolean! +} + +type PostsFields_updatedAt_Delete { + permission: Boolean! +} + +type PostsFields_createdAt { + create: PostsFields_createdAt_Create + read: PostsFields_createdAt_Read + update: PostsFields_createdAt_Update + delete: PostsFields_createdAt_Delete +} + +type PostsFields_createdAt_Create { + permission: Boolean! +} + +type PostsFields_createdAt_Read { + permission: Boolean! +} + +type PostsFields_createdAt_Update { + permission: Boolean! +} + +type PostsFields_createdAt_Delete { + permission: Boolean! +} + +type PostsFields__status { + create: PostsFields__status_Create + read: PostsFields__status_Read + update: PostsFields__status_Update + delete: PostsFields__status_Delete +} + +type PostsFields__status_Create { + permission: Boolean! +} + +type PostsFields__status_Read { + permission: Boolean! +} + +type PostsFields__status_Update { + permission: Boolean! +} + +type PostsFields__status_Delete { + permission: Boolean! +} + +type PostsCreateAccess { + permission: Boolean! + where: JSONObject +} + +type PostsReadAccess { + permission: Boolean! + where: JSONObject +} + +type PostsUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type PostsDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type PostsReadVersionsAccess { + permission: Boolean! + where: JSONObject +} + +type usersAccess { + fields: UsersFields + create: UsersCreateAccess + read: UsersReadAccess + update: UsersUpdateAccess + delete: UsersDeleteAccess + unlock: UsersUnlockAccess +} + +type UsersFields { + updatedAt: UsersFields_updatedAt + createdAt: UsersFields_createdAt + email: UsersFields_email + password: UsersFields_password +} + +type UsersFields_updatedAt { + create: UsersFields_updatedAt_Create + read: UsersFields_updatedAt_Read + update: UsersFields_updatedAt_Update + delete: UsersFields_updatedAt_Delete +} + +type UsersFields_updatedAt_Create { + permission: Boolean! +} + +type UsersFields_updatedAt_Read { + permission: Boolean! +} + +type UsersFields_updatedAt_Update { + permission: Boolean! +} + +type UsersFields_updatedAt_Delete { + permission: Boolean! +} + +type UsersFields_createdAt { + create: UsersFields_createdAt_Create + read: UsersFields_createdAt_Read + update: UsersFields_createdAt_Update + delete: UsersFields_createdAt_Delete +} + +type UsersFields_createdAt_Create { + permission: Boolean! +} + +type UsersFields_createdAt_Read { + permission: Boolean! +} + +type UsersFields_createdAt_Update { + permission: Boolean! +} + +type UsersFields_createdAt_Delete { + permission: Boolean! +} + +type UsersFields_email { + create: UsersFields_email_Create + read: UsersFields_email_Read + update: UsersFields_email_Update + delete: UsersFields_email_Delete +} + +type UsersFields_email_Create { + permission: Boolean! +} + +type UsersFields_email_Read { + permission: Boolean! +} + +type UsersFields_email_Update { + permission: Boolean! +} + +type UsersFields_email_Delete { + permission: Boolean! +} + +type UsersFields_password { + create: UsersFields_password_Create + read: UsersFields_password_Read + update: UsersFields_password_Update + delete: UsersFields_password_Delete +} + +type UsersFields_password_Create { + permission: Boolean! +} + +type UsersFields_password_Read { + permission: Boolean! +} + +type UsersFields_password_Update { + permission: Boolean! +} + +type UsersFields_password_Delete { + permission: Boolean! +} + +type UsersCreateAccess { + permission: Boolean! + where: JSONObject +} + +type UsersReadAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type UsersDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUnlockAccess { + permission: Boolean! + where: JSONObject +} + +type payload_preferencesAccess { + fields: PayloadPreferencesFields + create: PayloadPreferencesCreateAccess + read: PayloadPreferencesReadAccess + update: PayloadPreferencesUpdateAccess + delete: PayloadPreferencesDeleteAccess +} + +type PayloadPreferencesFields { + user: PayloadPreferencesFields_user + key: PayloadPreferencesFields_key + value: PayloadPreferencesFields_value + updatedAt: PayloadPreferencesFields_updatedAt + createdAt: PayloadPreferencesFields_createdAt +} + +type PayloadPreferencesFields_user { + create: PayloadPreferencesFields_user_Create + read: PayloadPreferencesFields_user_Read + update: PayloadPreferencesFields_user_Update + delete: PayloadPreferencesFields_user_Delete +} + +type PayloadPreferencesFields_user_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_user_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_user_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_user_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_key { + create: PayloadPreferencesFields_key_Create + read: PayloadPreferencesFields_key_Read + update: PayloadPreferencesFields_key_Update + delete: PayloadPreferencesFields_key_Delete +} + +type PayloadPreferencesFields_key_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_key_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_key_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_key_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_value { + create: PayloadPreferencesFields_value_Create + read: PayloadPreferencesFields_value_Read + update: PayloadPreferencesFields_value_Update + delete: PayloadPreferencesFields_value_Delete +} + +type PayloadPreferencesFields_value_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_value_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_value_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_value_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt { + create: PayloadPreferencesFields_updatedAt_Create + read: PayloadPreferencesFields_updatedAt_Read + update: PayloadPreferencesFields_updatedAt_Update + delete: PayloadPreferencesFields_updatedAt_Delete +} + +type PayloadPreferencesFields_updatedAt_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt { + create: PayloadPreferencesFields_createdAt_Create + read: PayloadPreferencesFields_createdAt_Read + update: PayloadPreferencesFields_createdAt_Update + delete: PayloadPreferencesFields_createdAt_Delete +} + +type PayloadPreferencesFields_createdAt_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesCreateAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesReadAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type menuAccess { + fields: MenuFields + read: MenuReadAccess + update: MenuUpdateAccess +} + +type MenuFields { + globalText: MenuFields_globalText + updatedAt: MenuFields_updatedAt + createdAt: MenuFields_createdAt +} + +type MenuFields_globalText { + create: MenuFields_globalText_Create + read: MenuFields_globalText_Read + update: MenuFields_globalText_Update + delete: MenuFields_globalText_Delete +} + +type MenuFields_globalText_Create { + permission: Boolean! +} + +type MenuFields_globalText_Read { + permission: Boolean! +} + +type MenuFields_globalText_Update { + permission: Boolean! +} + +type MenuFields_globalText_Delete { + permission: Boolean! +} + +type MenuFields_updatedAt { + create: MenuFields_updatedAt_Create + read: MenuFields_updatedAt_Read + update: MenuFields_updatedAt_Update + delete: MenuFields_updatedAt_Delete +} + +type MenuFields_updatedAt_Create { + permission: Boolean! +} + +type MenuFields_updatedAt_Read { + permission: Boolean! +} + +type MenuFields_updatedAt_Update { + permission: Boolean! +} + +type MenuFields_updatedAt_Delete { + permission: Boolean! +} + +type MenuFields_createdAt { + create: MenuFields_createdAt_Create + read: MenuFields_createdAt_Read + update: MenuFields_createdAt_Update + delete: MenuFields_createdAt_Delete +} + +type MenuFields_createdAt_Create { + permission: Boolean! +} + +type MenuFields_createdAt_Read { + permission: Boolean! +} + +type MenuFields_createdAt_Update { + permission: Boolean! +} + +type MenuFields_createdAt_Delete { + permission: Boolean! +} + +type MenuReadAccess { + permission: Boolean! + where: JSONObject +} + +type MenuUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type Mutation { + createPost(data: mutationPostInput!, draft: Boolean): Post + updatePost(id: String!, autosave: Boolean, data: mutationPostUpdateInput!, draft: Boolean): Post + deletePost(id: String!): Post + duplicatePost(id: String!): Post + restoreVersionPost(id: String): Post + createUser(data: mutationUserInput!, draft: Boolean): User + updateUser(id: String!, autosave: Boolean, data: mutationUserUpdateInput!, draft: Boolean): User + deleteUser(id: String!): User + refreshTokenUser(token: String): usersRefreshedUser + logoutUser: String + unlockUser(email: String!): Boolean! + loginUser(email: String, password: String): usersLoginResult + forgotPasswordUser(disableEmail: Boolean, email: String!, expiration: Int): Boolean! + resetPasswordUser(password: String, token: String): usersResetPassword + verifyEmailUser(token: String): Boolean + createPayloadPreference(data: mutationPayloadPreferenceInput!, draft: Boolean): PayloadPreference + updatePayloadPreference( + id: String! + autosave: Boolean + data: mutationPayloadPreferenceUpdateInput! + draft: Boolean + ): PayloadPreference + deletePayloadPreference(id: String!): PayloadPreference + duplicatePayloadPreference(id: String!): PayloadPreference + updateMenu(data: mutationMenuInput!, draft: Boolean): Menu +} + +input mutationPostInput { + text: String + richText: JSON + richText2: JSON + updatedAt: String + createdAt: String + _status: Post__status_MutationInput +} + +enum Post__status_MutationInput { + draft + published +} + +input mutationPostUpdateInput { + text: String + richText: JSON + richText2: JSON + updatedAt: String + createdAt: String + _status: PostUpdate__status_MutationInput +} + +enum PostUpdate__status_MutationInput { + draft + published +} + +input mutationUserInput { + updatedAt: String + createdAt: String + email: String! + resetPasswordToken: String + resetPasswordExpiration: String + salt: String + hash: String + loginAttempts: Float + lockUntil: String + password: String! +} + +input mutationUserUpdateInput { + updatedAt: String + createdAt: String + email: String + resetPasswordToken: String + resetPasswordExpiration: String + salt: String + hash: String + loginAttempts: Float + lockUntil: String + password: String +} + +type usersRefreshedUser { + exp: Int + refreshedToken: String + user: usersJWT +} + +type usersJWT { + email: EmailAddress! + collection: String! +} + +type usersLoginResult { + exp: Int + token: String + user: User +} + +type usersResetPassword { + token: String + user: User +} + +input mutationPayloadPreferenceInput { + user: PayloadPreference_UserRelationshipInput + key: String + value: JSON + updatedAt: String + createdAt: String +} + +input PayloadPreference_UserRelationshipInput { + relationTo: PayloadPreference_UserRelationshipInputRelationTo + value: JSON +} + +enum PayloadPreference_UserRelationshipInputRelationTo { + users +} + +input mutationPayloadPreferenceUpdateInput { + user: PayloadPreferenceUpdate_UserRelationshipInput + key: String + value: JSON + updatedAt: String + createdAt: String +} + +input PayloadPreferenceUpdate_UserRelationshipInput { + relationTo: PayloadPreferenceUpdate_UserRelationshipInputRelationTo + value: JSON +} + +enum PayloadPreferenceUpdate_UserRelationshipInputRelationTo { + users +} + +input mutationMenuInput { + globalText: String + updatedAt: String + createdAt: String +} diff --git a/test/joins/tsconfig.eslint.json b/test/joins/tsconfig.eslint.json new file mode 100644 index 00000000000..b34cc7afbb8 --- /dev/null +++ b/test/joins/tsconfig.eslint.json @@ -0,0 +1,13 @@ +{ + // extend your base config to share compilerOptions, etc + //"extends": "./tsconfig.json", + "compilerOptions": { + // ensure that nobody can accidentally use this config for a build + "noEmit": true + }, + "include": [ + // whatever paths you intend to lint + "./**/*.ts", + "./**/*.tsx" + ] +} diff --git a/test/joins/tsconfig.json b/test/joins/tsconfig.json new file mode 100644 index 00000000000..3c43903cfdd --- /dev/null +++ b/test/joins/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../tsconfig.json" +} From 80b632fc2e533d269e6b388d77f3ff2ca10dba4a Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 30 Jul 2024 16:30:47 -0400 Subject: [PATCH 002/173] feat: join field types --- .../payload/src/collections/config/types.ts | 8 +++++- packages/payload/src/fields/config/types.ts | 27 +++++++++++++++++++ packages/payload/src/index.ts | 18 ++++++++++--- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 6239b6ec37a..42716512c76 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -28,7 +28,7 @@ import type { OpenGraphConfig, } from '../../config/types.js' import type { DBIdentifierName } from '../../database/types.js' -import type { Field } from '../../fields/config/types.js' +import type { Field, JoinField } from '../../fields/config/types.js' import type { CollectionSlug, JsonObject, @@ -499,6 +499,12 @@ export type Collection = { versionType: GraphQLObjectType whereInputType: GraphQLInputObjectType } + /** + * Object of collections to join 'Join Fields object keyed by collection + */ + joins: { + [key: string]: JoinField[] + } } export type BulkOperationResult = { diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index 6b053f9c90e..c4d4db3fec7 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -816,6 +816,31 @@ export type PointField = { validate?: Validate } & FieldBase +/** + * A virtual field that loads in related collections by querying a relationship or upload field. + */ +export type JoinField = { + access?: { + create?: never + read?: FieldAccess + update?: never + } + admin?: { + disableBulkEdit?: never + readOnly?: never + } & Admin + /** + * The slug of the collection to relate with. + */ + collection: CollectionSlug + index?: never + /** + * A string for the field in the collection being joined to. + */ + path: string + type: 'join' +} & FieldBase + export type Field = | ArrayField | BlockField @@ -826,6 +851,7 @@ export type Field = | EmailField | GroupField | JSONField + | JoinField | NumberField | PointField | RadioField @@ -848,6 +874,7 @@ export type FieldAffectingData = | EmailField | GroupField | JSONField + | JoinField | NumberField | PointField | RadioField diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index 17c6c2594da..f3e18ba3b00 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -498,9 +498,19 @@ export class BasePayload { } this.config.collections.forEach((collection) => { - const customID = flattenFields(collection.fields).find( - (field) => fieldAffectsData(field) && field.name === 'id', - ) + const joins = {} + const flattenedFields = flattenFields(collection.fields) + let customID + + for (const field of flattenedFields) { + if (!fieldAffectsData(field)) { + continue + } + if (field.type === 'join') { + joins[field.collection] = field + } + if (field.name === 'id') customID = field + } let customIDType @@ -509,6 +519,7 @@ export class BasePayload { this.collections[collection.slug] = { config: collection, customIDType, + joins, } }) @@ -891,6 +902,7 @@ export type { GroupField, HookName, JSONField, + JoinField, Labels, NamedTab, NonPresentationalField, From 10b9aa777f0f7f4f93d087b49bbb99d39218a2c4 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Thu, 1 Aug 2024 16:56:58 -0400 Subject: [PATCH 003/173] test: fetch joins --- packages/db-mongodb/src/findOne.ts | 23 + packages/db-mongodb/src/models/buildSchema.ts | 4 + packages/db-mongodb/src/types.ts | 2 + packages/payload/src/index.ts | 3 +- test/joins/config.ts | 5 + test/joins/int.spec.ts | 50 +- test/joins/payload-types.ts | 83 +- test/joins/schema.graphql | 1902 ----------------- 8 files changed, 81 insertions(+), 1991 deletions(-) delete mode 100644 test/joins/schema.graphql diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index c17e93aea00..dc42ff04918 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -24,6 +24,29 @@ export const findOne: FindOne = async function findOne( const doc = await Model.findOne(query, {}, options) + const joins = this.payload.collections[collection].joins + + for (const slug of Object.keys(joins)) { + // fetch docs and add to the keys by path + const joinModel = this.collections[slug] + + for (const join of joins[slug]) { + const joinData = await joinModel + .find( + { [join.path]: { $eq: doc?._id.toString() } }, + { + _id: 1, + }, + options, + ) + .limit(10) + + // TODO: handle assigning join data to nested paths + // iterate path and assign object + doc[join.name] = joinData.map((a) => a._id.toString()) + } + } + if (!doc) { return null } diff --git a/packages/db-mongodb/src/models/buildSchema.ts b/packages/db-mongodb/src/models/buildSchema.ts index f713f096a81..1428eb5b34c 100644 --- a/packages/db-mongodb/src/models/buildSchema.ts +++ b/packages/db-mongodb/src/models/buildSchema.ts @@ -304,6 +304,10 @@ const fieldToSchemaMap: Record = { [field.name]: localizeSchema(field, baseSchema, config.localization), }) }, + join: (): void => { + // TODO: what is this going to look like? + // it maybe just be virtual and not actually added to the schema + }, json: ( field: JSONField, schema: Schema, diff --git a/packages/db-mongodb/src/types.ts b/packages/db-mongodb/src/types.ts index 25ff7a82189..5b35aa3e4ac 100644 --- a/packages/db-mongodb/src/types.ts +++ b/packages/db-mongodb/src/types.ts @@ -10,6 +10,7 @@ import type { Field, GroupField, JSONField, + JoinField, NumberField, Payload, PointField, @@ -108,6 +109,7 @@ export type FieldToSchemaMap = { date: FieldGeneratorFunction email: FieldGeneratorFunction group: FieldGeneratorFunction + join: FieldGeneratorFunction json: FieldGeneratorFunction number: FieldGeneratorFunction point: FieldGeneratorFunction diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index f3e18ba3b00..7c43b3cd5f7 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -507,7 +507,8 @@ export class BasePayload { continue } if (field.type === 'join') { - joins[field.collection] = field + joins[field.collection] = joins[field.collection] || [] + joins[field.collection].push(field) } if (field.name === 'id') customID = field } diff --git a/test/joins/config.ts b/test/joins/config.ts index e6f2fc928f0..2d429453ed9 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -18,6 +18,11 @@ export default buildConfigWithDefaults({ name: 'title', type: 'text', }, + { + name: 'category', + type: 'relationship', + relationTo: 'categories', + }, ], }, { diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index ec870e44ec1..f2cfd87133d 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -4,7 +4,6 @@ import type { NextRESTClient } from '../helpers/NextRESTClient.js' import { devUser } from '../credentials.js' import { initPayloadInt } from '../helpers/initPayloadInt.js' -import { postsSlug } from './collections/Posts/index.js' import configPromise from './config.js' let payload: Payload @@ -39,29 +38,42 @@ describe('Joins Field Tests', () => { } }) - it('local API example', async () => { - const newPost = await payload.create({ - collection: postsSlug, + it('should populate joins', async () => { + const category = await payload.create({ + collection: 'categories', data: { - text: 'LOCAL API EXAMPLE', + name: 'example', }, }) - expect(newPost.text).toEqual('LOCAL API EXAMPLE') - }) + const post1 = await payload.create({ + collection: 'posts', + data: { + category: category.id, + title: 'test', + }, + }) + const post2 = await payload.create({ + collection: 'posts', + data: { + category: category.id, + title: 'test', + }, + }) + const post3 = await payload.create({ + collection: 'posts', + data: { + category: category.id, + title: 'test', + }, + }) - it('rest API example', async () => { - const data = await restClient - .POST(`/${postsSlug}`, { - body: JSON.stringify({ - text: 'REST API EXAMPLE', - }), - headers: { - Authorization: `JWT ${token}`, - }, - }) - .then((res) => res.json()) + const categoryWithPosts = await payload.findByID({ + id: category.id, + collection: 'categories', + }) - expect(data.doc.text).toEqual('REST API EXAMPLE') + // TODO: add types for joins (same as relationship with hasMany) + expect(categoryWithPosts.posts).toHaveLength(3) }) }) diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index bf1368e08ef..e239b9fdca4 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -12,6 +12,7 @@ export interface Config { }; collections: { posts: Post; + categories: Category; users: User; 'payload-preferences': PayloadPreference; 'payload-migrations': PayloadMigration; @@ -19,10 +20,7 @@ export interface Config { db: { defaultIDType: string; }; - globals: { - menu: Menu; - 'custom-ts': CustomT; - }; + globals: {}; locale: null; user: User & { collection: 'users'; @@ -50,40 +48,20 @@ export interface UserAuthOperations { */ export interface Post { id: string; - text?: string | null; - richText?: { - root: { - type: string; - children: { - type: string; - version: number; - [k: string]: unknown; - }[]; - direction: ('ltr' | 'rtl') | null; - format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; - indent: number; - version: number; - }; - [k: string]: unknown; - } | null; - richText2?: { - root: { - type: string; - children: { - type: string; - version: number; - [k: string]: unknown; - }[]; - direction: ('ltr' | 'rtl') | null; - format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; - indent: number; - version: number; - }; - [k: string]: unknown; - } | null; + title?: string | null; + category?: (string | null) | Category; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "categories". + */ +export interface Category { + id: string; + name?: string | null; updatedAt: string; createdAt: string; - _status?: ('draft' | 'published') | null; } /** * This interface was referenced by `Config`'s JSON-Schema @@ -136,39 +114,6 @@ export interface PayloadMigration { updatedAt: string; createdAt: string; } -/** - * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "menu". - */ -export interface Menu { - id: string; - globalText?: string | null; - updatedAt?: string | null; - createdAt?: string | null; -} -/** - * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "custom-ts". - */ -export interface CustomT { - id: string; - custom?: 'hello' | 'world'; - withDefinitionsUsage?: ObjectWithNumber[]; - json: { - id: string; - name: string; - age?: number; - }[]; - updatedAt?: string | null; - createdAt?: string | null; -} -/** - * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "objectWithNumber". - */ -export interface ObjectWithNumber { - id?: number; -} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "auth". diff --git a/test/joins/schema.graphql b/test/joins/schema.graphql deleted file mode 100644 index 1038d843d62..00000000000 --- a/test/joins/schema.graphql +++ /dev/null @@ -1,1902 +0,0 @@ -type Query { - Post(id: String!, draft: Boolean): Post - Posts(draft: Boolean, where: Post_where, limit: Int, page: Int, sort: String): Posts - countPosts(draft: Boolean, where: Post_where): countPosts - docAccessPost(id: String!): postsDocAccess - versionPost(id: String): PostVersion - versionsPosts(where: versionsPost_where, limit: Int, page: Int, sort: String): versionsPosts - User(id: String!, draft: Boolean): User - Users(draft: Boolean, where: User_where, limit: Int, page: Int, sort: String): Users - countUsers(draft: Boolean, where: User_where): countUsers - docAccessUser(id: String!): usersDocAccess - meUser: usersMe - initializedUser: Boolean - PayloadPreference(id: String!, draft: Boolean): PayloadPreference - PayloadPreferences( - draft: Boolean - where: PayloadPreference_where - limit: Int - page: Int - sort: String - ): PayloadPreferences - countPayloadPreferences(draft: Boolean, where: PayloadPreference_where): countPayloadPreferences - docAccessPayloadPreference(id: String!): payload_preferencesDocAccess - Menu(draft: Boolean): Menu - docAccessMenu: menuDocAccess - Access: Access -} - -type Post { - id: String - text: String - richText(depth: Int): JSON - richText2(depth: Int): JSON - updatedAt: DateTime - createdAt: DateTime - _status: Post__status -} - -""" -The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). -""" -scalar JSON - @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf") - -""" -A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. -""" -scalar DateTime - -enum Post__status { - draft - published -} - -type Posts { - docs: [Post] - hasNextPage: Boolean - hasPrevPage: Boolean - limit: Int - nextPage: Int - offset: Int - page: Int - pagingCounter: Int - prevPage: Int - totalDocs: Int - totalPages: Int -} - -input Post_where { - text: Post_text_operator - richText: Post_richText_operator - richText2: Post_richText2_operator - updatedAt: Post_updatedAt_operator - createdAt: Post_createdAt_operator - _status: Post__status_operator - id: Post_id_operator - AND: [Post_where_and] - OR: [Post_where_or] -} - -input Post_text_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [String] - all: [String] - exists: Boolean -} - -input Post_richText_operator { - equals: JSON - not_equals: JSON - like: JSON - contains: JSON - exists: Boolean -} - -input Post_richText2_operator { - equals: JSON - not_equals: JSON - like: JSON - contains: JSON - exists: Boolean -} - -input Post_updatedAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input Post_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input Post__status_operator { - equals: Post__status_Input - not_equals: Post__status_Input - in: [Post__status_Input] - not_in: [Post__status_Input] - all: [Post__status_Input] - exists: Boolean -} - -enum Post__status_Input { - draft - published -} - -input Post_id_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [String] - all: [String] - exists: Boolean -} - -input Post_where_and { - text: Post_text_operator - richText: Post_richText_operator - richText2: Post_richText2_operator - updatedAt: Post_updatedAt_operator - createdAt: Post_createdAt_operator - _status: Post__status_operator - id: Post_id_operator - AND: [Post_where_and] - OR: [Post_where_or] -} - -input Post_where_or { - text: Post_text_operator - richText: Post_richText_operator - richText2: Post_richText2_operator - updatedAt: Post_updatedAt_operator - createdAt: Post_createdAt_operator - _status: Post__status_operator - id: Post_id_operator - AND: [Post_where_and] - OR: [Post_where_or] -} - -type countPosts { - totalDocs: Int -} - -type postsDocAccess { - fields: PostsDocAccessFields - create: PostsCreateDocAccess - read: PostsReadDocAccess - update: PostsUpdateDocAccess - delete: PostsDeleteDocAccess - readVersions: PostsReadVersionsDocAccess -} - -type PostsDocAccessFields { - text: PostsDocAccessFields_text - richText: PostsDocAccessFields_richText - richText2: PostsDocAccessFields_richText2 - updatedAt: PostsDocAccessFields_updatedAt - createdAt: PostsDocAccessFields_createdAt - _status: PostsDocAccessFields__status -} - -type PostsDocAccessFields_text { - create: PostsDocAccessFields_text_Create - read: PostsDocAccessFields_text_Read - update: PostsDocAccessFields_text_Update - delete: PostsDocAccessFields_text_Delete -} - -type PostsDocAccessFields_text_Create { - permission: Boolean! -} - -type PostsDocAccessFields_text_Read { - permission: Boolean! -} - -type PostsDocAccessFields_text_Update { - permission: Boolean! -} - -type PostsDocAccessFields_text_Delete { - permission: Boolean! -} - -type PostsDocAccessFields_richText { - create: PostsDocAccessFields_richText_Create - read: PostsDocAccessFields_richText_Read - update: PostsDocAccessFields_richText_Update - delete: PostsDocAccessFields_richText_Delete -} - -type PostsDocAccessFields_richText_Create { - permission: Boolean! -} - -type PostsDocAccessFields_richText_Read { - permission: Boolean! -} - -type PostsDocAccessFields_richText_Update { - permission: Boolean! -} - -type PostsDocAccessFields_richText_Delete { - permission: Boolean! -} - -type PostsDocAccessFields_richText2 { - create: PostsDocAccessFields_richText2_Create - read: PostsDocAccessFields_richText2_Read - update: PostsDocAccessFields_richText2_Update - delete: PostsDocAccessFields_richText2_Delete -} - -type PostsDocAccessFields_richText2_Create { - permission: Boolean! -} - -type PostsDocAccessFields_richText2_Read { - permission: Boolean! -} - -type PostsDocAccessFields_richText2_Update { - permission: Boolean! -} - -type PostsDocAccessFields_richText2_Delete { - permission: Boolean! -} - -type PostsDocAccessFields_updatedAt { - create: PostsDocAccessFields_updatedAt_Create - read: PostsDocAccessFields_updatedAt_Read - update: PostsDocAccessFields_updatedAt_Update - delete: PostsDocAccessFields_updatedAt_Delete -} - -type PostsDocAccessFields_updatedAt_Create { - permission: Boolean! -} - -type PostsDocAccessFields_updatedAt_Read { - permission: Boolean! -} - -type PostsDocAccessFields_updatedAt_Update { - permission: Boolean! -} - -type PostsDocAccessFields_updatedAt_Delete { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt { - create: PostsDocAccessFields_createdAt_Create - read: PostsDocAccessFields_createdAt_Read - update: PostsDocAccessFields_createdAt_Update - delete: PostsDocAccessFields_createdAt_Delete -} - -type PostsDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type PostsDocAccessFields_createdAt_Delete { - permission: Boolean! -} - -type PostsDocAccessFields__status { - create: PostsDocAccessFields__status_Create - read: PostsDocAccessFields__status_Read - update: PostsDocAccessFields__status_Update - delete: PostsDocAccessFields__status_Delete -} - -type PostsDocAccessFields__status_Create { - permission: Boolean! -} - -type PostsDocAccessFields__status_Read { - permission: Boolean! -} - -type PostsDocAccessFields__status_Update { - permission: Boolean! -} - -type PostsDocAccessFields__status_Delete { - permission: Boolean! -} - -type PostsCreateDocAccess { - permission: Boolean! - where: JSONObject -} - -""" -The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). -""" -scalar JSONObject - @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf") - -type PostsReadDocAccess { - permission: Boolean! - where: JSONObject -} - -type PostsUpdateDocAccess { - permission: Boolean! - where: JSONObject -} - -type PostsDeleteDocAccess { - permission: Boolean! - where: JSONObject -} - -type PostsReadVersionsDocAccess { - permission: Boolean! - where: JSONObject -} - -type PostVersion { - parent(draft: Boolean): Post - version: PostVersion_Version - createdAt: DateTime - updatedAt: DateTime - latest: Boolean - id: String -} - -type PostVersion_Version { - text: String - richText(depth: Int): JSON - richText2(depth: Int): JSON - updatedAt: DateTime - createdAt: DateTime - _status: PostVersion_Version__status -} - -enum PostVersion_Version__status { - draft - published -} - -type versionsPosts { - docs: [PostVersion] - hasNextPage: Boolean - hasPrevPage: Boolean - limit: Int - nextPage: Int - offset: Int - page: Int - pagingCounter: Int - prevPage: Int - totalDocs: Int - totalPages: Int -} - -input versionsPost_where { - parent: versionsPost_parent_operator - version__text: versionsPost_version__text_operator - version__richText: versionsPost_version__richText_operator - version__richText2: versionsPost_version__richText2_operator - version__updatedAt: versionsPost_version__updatedAt_operator - version__createdAt: versionsPost_version__createdAt_operator - version___status: versionsPost_version___status_operator - createdAt: versionsPost_createdAt_operator - updatedAt: versionsPost_updatedAt_operator - latest: versionsPost_latest_operator - id: versionsPost_id_operator - AND: [versionsPost_where_and] - OR: [versionsPost_where_or] -} - -input versionsPost_parent_operator { - equals: JSON - not_equals: JSON - in: [JSON] - not_in: [JSON] - all: [JSON] - exists: Boolean -} - -input versionsPost_version__text_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [String] - all: [String] - exists: Boolean -} - -input versionsPost_version__richText_operator { - equals: JSON - not_equals: JSON - like: JSON - contains: JSON - exists: Boolean -} - -input versionsPost_version__richText2_operator { - equals: JSON - not_equals: JSON - like: JSON - contains: JSON - exists: Boolean -} - -input versionsPost_version__updatedAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input versionsPost_version__createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input versionsPost_version___status_operator { - equals: versionsPost_version___status_Input - not_equals: versionsPost_version___status_Input - in: [versionsPost_version___status_Input] - not_in: [versionsPost_version___status_Input] - all: [versionsPost_version___status_Input] - exists: Boolean -} - -enum versionsPost_version___status_Input { - draft - published -} - -input versionsPost_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input versionsPost_updatedAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input versionsPost_latest_operator { - equals: Boolean - not_equals: Boolean - exists: Boolean -} - -input versionsPost_id_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [String] - all: [String] - exists: Boolean -} - -input versionsPost_where_and { - parent: versionsPost_parent_operator - version__text: versionsPost_version__text_operator - version__richText: versionsPost_version__richText_operator - version__richText2: versionsPost_version__richText2_operator - version__updatedAt: versionsPost_version__updatedAt_operator - version__createdAt: versionsPost_version__createdAt_operator - version___status: versionsPost_version___status_operator - createdAt: versionsPost_createdAt_operator - updatedAt: versionsPost_updatedAt_operator - latest: versionsPost_latest_operator - id: versionsPost_id_operator - AND: [versionsPost_where_and] - OR: [versionsPost_where_or] -} - -input versionsPost_where_or { - parent: versionsPost_parent_operator - version__text: versionsPost_version__text_operator - version__richText: versionsPost_version__richText_operator - version__richText2: versionsPost_version__richText2_operator - version__updatedAt: versionsPost_version__updatedAt_operator - version__createdAt: versionsPost_version__createdAt_operator - version___status: versionsPost_version___status_operator - createdAt: versionsPost_createdAt_operator - updatedAt: versionsPost_updatedAt_operator - latest: versionsPost_latest_operator - id: versionsPost_id_operator - AND: [versionsPost_where_and] - OR: [versionsPost_where_or] -} - -type User { - id: String - updatedAt: DateTime - createdAt: DateTime - email: EmailAddress! - resetPasswordToken: String - resetPasswordExpiration: DateTime - salt: String - hash: String - loginAttempts: Float - lockUntil: DateTime - password: String! -} - -""" -A field whose value conforms to the standard internet email address format as specified in HTML Spec: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address. -""" -scalar EmailAddress - @specifiedBy(url: "https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address") - -type Users { - docs: [User] - hasNextPage: Boolean - hasPrevPage: Boolean - limit: Int - nextPage: Int - offset: Int - page: Int - pagingCounter: Int - prevPage: Int - totalDocs: Int - totalPages: Int -} - -input User_where { - updatedAt: User_updatedAt_operator - createdAt: User_createdAt_operator - email: User_email_operator - id: User_id_operator - AND: [User_where_and] - OR: [User_where_or] -} - -input User_updatedAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input User_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input User_email_operator { - equals: EmailAddress - not_equals: EmailAddress - like: EmailAddress - contains: EmailAddress - in: [EmailAddress] - not_in: [EmailAddress] - all: [EmailAddress] -} - -input User_id_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [String] - all: [String] - exists: Boolean -} - -input User_where_and { - updatedAt: User_updatedAt_operator - createdAt: User_createdAt_operator - email: User_email_operator - id: User_id_operator - AND: [User_where_and] - OR: [User_where_or] -} - -input User_where_or { - updatedAt: User_updatedAt_operator - createdAt: User_createdAt_operator - email: User_email_operator - id: User_id_operator - AND: [User_where_and] - OR: [User_where_or] -} - -type countUsers { - totalDocs: Int -} - -type usersDocAccess { - fields: UsersDocAccessFields - create: UsersCreateDocAccess - read: UsersReadDocAccess - update: UsersUpdateDocAccess - delete: UsersDeleteDocAccess - unlock: UsersUnlockDocAccess -} - -type UsersDocAccessFields { - updatedAt: UsersDocAccessFields_updatedAt - createdAt: UsersDocAccessFields_createdAt - email: UsersDocAccessFields_email - password: UsersDocAccessFields_password -} - -type UsersDocAccessFields_updatedAt { - create: UsersDocAccessFields_updatedAt_Create - read: UsersDocAccessFields_updatedAt_Read - update: UsersDocAccessFields_updatedAt_Update - delete: UsersDocAccessFields_updatedAt_Delete -} - -type UsersDocAccessFields_updatedAt_Create { - permission: Boolean! -} - -type UsersDocAccessFields_updatedAt_Read { - permission: Boolean! -} - -type UsersDocAccessFields_updatedAt_Update { - permission: Boolean! -} - -type UsersDocAccessFields_updatedAt_Delete { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt { - create: UsersDocAccessFields_createdAt_Create - read: UsersDocAccessFields_createdAt_Read - update: UsersDocAccessFields_createdAt_Update - delete: UsersDocAccessFields_createdAt_Delete -} - -type UsersDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type UsersDocAccessFields_createdAt_Delete { - permission: Boolean! -} - -type UsersDocAccessFields_email { - create: UsersDocAccessFields_email_Create - read: UsersDocAccessFields_email_Read - update: UsersDocAccessFields_email_Update - delete: UsersDocAccessFields_email_Delete -} - -type UsersDocAccessFields_email_Create { - permission: Boolean! -} - -type UsersDocAccessFields_email_Read { - permission: Boolean! -} - -type UsersDocAccessFields_email_Update { - permission: Boolean! -} - -type UsersDocAccessFields_email_Delete { - permission: Boolean! -} - -type UsersDocAccessFields_password { - create: UsersDocAccessFields_password_Create - read: UsersDocAccessFields_password_Read - update: UsersDocAccessFields_password_Update - delete: UsersDocAccessFields_password_Delete -} - -type UsersDocAccessFields_password_Create { - permission: Boolean! -} - -type UsersDocAccessFields_password_Read { - permission: Boolean! -} - -type UsersDocAccessFields_password_Update { - permission: Boolean! -} - -type UsersDocAccessFields_password_Delete { - permission: Boolean! -} - -type UsersCreateDocAccess { - permission: Boolean! - where: JSONObject -} - -type UsersReadDocAccess { - permission: Boolean! - where: JSONObject -} - -type UsersUpdateDocAccess { - permission: Boolean! - where: JSONObject -} - -type UsersDeleteDocAccess { - permission: Boolean! - where: JSONObject -} - -type UsersUnlockDocAccess { - permission: Boolean! - where: JSONObject -} - -type usersMe { - collection: String - exp: Int - token: String - user: User -} - -type PayloadPreference { - id: String - user: PayloadPreference_User_Relationship! - key: String - value: JSON - updatedAt: DateTime - createdAt: DateTime -} - -type PayloadPreference_User_Relationship { - relationTo: PayloadPreference_User_RelationTo - value: PayloadPreference_User -} - -enum PayloadPreference_User_RelationTo { - users -} - -union PayloadPreference_User = User - -type PayloadPreferences { - docs: [PayloadPreference] - hasNextPage: Boolean - hasPrevPage: Boolean - limit: Int - nextPage: Int - offset: Int - page: Int - pagingCounter: Int - prevPage: Int - totalDocs: Int - totalPages: Int -} - -input PayloadPreference_where { - user: PayloadPreference_user_Relation - key: PayloadPreference_key_operator - value: PayloadPreference_value_operator - updatedAt: PayloadPreference_updatedAt_operator - createdAt: PayloadPreference_createdAt_operator - id: PayloadPreference_id_operator - AND: [PayloadPreference_where_and] - OR: [PayloadPreference_where_or] -} - -input PayloadPreference_user_Relation { - relationTo: PayloadPreference_user_Relation_RelationTo - value: JSON -} - -enum PayloadPreference_user_Relation_RelationTo { - users -} - -input PayloadPreference_key_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [String] - all: [String] - exists: Boolean -} - -input PayloadPreference_value_operator { - equals: JSON - not_equals: JSON - like: JSON - contains: JSON - within: JSON - intersects: JSON - exists: Boolean -} - -input PayloadPreference_updatedAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input PayloadPreference_createdAt_operator { - equals: DateTime - not_equals: DateTime - greater_than_equal: DateTime - greater_than: DateTime - less_than_equal: DateTime - less_than: DateTime - like: DateTime - exists: Boolean -} - -input PayloadPreference_id_operator { - equals: String - not_equals: String - like: String - contains: String - in: [String] - not_in: [String] - all: [String] - exists: Boolean -} - -input PayloadPreference_where_and { - user: PayloadPreference_user_Relation - key: PayloadPreference_key_operator - value: PayloadPreference_value_operator - updatedAt: PayloadPreference_updatedAt_operator - createdAt: PayloadPreference_createdAt_operator - id: PayloadPreference_id_operator - AND: [PayloadPreference_where_and] - OR: [PayloadPreference_where_or] -} - -input PayloadPreference_where_or { - user: PayloadPreference_user_Relation - key: PayloadPreference_key_operator - value: PayloadPreference_value_operator - updatedAt: PayloadPreference_updatedAt_operator - createdAt: PayloadPreference_createdAt_operator - id: PayloadPreference_id_operator - AND: [PayloadPreference_where_and] - OR: [PayloadPreference_where_or] -} - -type countPayloadPreferences { - totalDocs: Int -} - -type payload_preferencesDocAccess { - fields: PayloadPreferencesDocAccessFields - create: PayloadPreferencesCreateDocAccess - read: PayloadPreferencesReadDocAccess - update: PayloadPreferencesUpdateDocAccess - delete: PayloadPreferencesDeleteDocAccess -} - -type PayloadPreferencesDocAccessFields { - user: PayloadPreferencesDocAccessFields_user - key: PayloadPreferencesDocAccessFields_key - value: PayloadPreferencesDocAccessFields_value - updatedAt: PayloadPreferencesDocAccessFields_updatedAt - createdAt: PayloadPreferencesDocAccessFields_createdAt -} - -type PayloadPreferencesDocAccessFields_user { - create: PayloadPreferencesDocAccessFields_user_Create - read: PayloadPreferencesDocAccessFields_user_Read - update: PayloadPreferencesDocAccessFields_user_Update - delete: PayloadPreferencesDocAccessFields_user_Delete -} - -type PayloadPreferencesDocAccessFields_user_Create { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_user_Read { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_user_Update { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_user_Delete { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_key { - create: PayloadPreferencesDocAccessFields_key_Create - read: PayloadPreferencesDocAccessFields_key_Read - update: PayloadPreferencesDocAccessFields_key_Update - delete: PayloadPreferencesDocAccessFields_key_Delete -} - -type PayloadPreferencesDocAccessFields_key_Create { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_key_Read { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_key_Update { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_key_Delete { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_value { - create: PayloadPreferencesDocAccessFields_value_Create - read: PayloadPreferencesDocAccessFields_value_Read - update: PayloadPreferencesDocAccessFields_value_Update - delete: PayloadPreferencesDocAccessFields_value_Delete -} - -type PayloadPreferencesDocAccessFields_value_Create { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_value_Read { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_value_Update { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_value_Delete { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_updatedAt { - create: PayloadPreferencesDocAccessFields_updatedAt_Create - read: PayloadPreferencesDocAccessFields_updatedAt_Read - update: PayloadPreferencesDocAccessFields_updatedAt_Update - delete: PayloadPreferencesDocAccessFields_updatedAt_Delete -} - -type PayloadPreferencesDocAccessFields_updatedAt_Create { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_updatedAt_Read { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_updatedAt_Update { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_updatedAt_Delete { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_createdAt { - create: PayloadPreferencesDocAccessFields_createdAt_Create - read: PayloadPreferencesDocAccessFields_createdAt_Read - update: PayloadPreferencesDocAccessFields_createdAt_Update - delete: PayloadPreferencesDocAccessFields_createdAt_Delete -} - -type PayloadPreferencesDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type PayloadPreferencesDocAccessFields_createdAt_Delete { - permission: Boolean! -} - -type PayloadPreferencesCreateDocAccess { - permission: Boolean! - where: JSONObject -} - -type PayloadPreferencesReadDocAccess { - permission: Boolean! - where: JSONObject -} - -type PayloadPreferencesUpdateDocAccess { - permission: Boolean! - where: JSONObject -} - -type PayloadPreferencesDeleteDocAccess { - permission: Boolean! - where: JSONObject -} - -type Menu { - globalText: String - updatedAt: DateTime - createdAt: DateTime -} - -type menuDocAccess { - fields: MenuDocAccessFields - read: MenuReadDocAccess - update: MenuUpdateDocAccess -} - -type MenuDocAccessFields { - globalText: MenuDocAccessFields_globalText - updatedAt: MenuDocAccessFields_updatedAt - createdAt: MenuDocAccessFields_createdAt -} - -type MenuDocAccessFields_globalText { - create: MenuDocAccessFields_globalText_Create - read: MenuDocAccessFields_globalText_Read - update: MenuDocAccessFields_globalText_Update - delete: MenuDocAccessFields_globalText_Delete -} - -type MenuDocAccessFields_globalText_Create { - permission: Boolean! -} - -type MenuDocAccessFields_globalText_Read { - permission: Boolean! -} - -type MenuDocAccessFields_globalText_Update { - permission: Boolean! -} - -type MenuDocAccessFields_globalText_Delete { - permission: Boolean! -} - -type MenuDocAccessFields_updatedAt { - create: MenuDocAccessFields_updatedAt_Create - read: MenuDocAccessFields_updatedAt_Read - update: MenuDocAccessFields_updatedAt_Update - delete: MenuDocAccessFields_updatedAt_Delete -} - -type MenuDocAccessFields_updatedAt_Create { - permission: Boolean! -} - -type MenuDocAccessFields_updatedAt_Read { - permission: Boolean! -} - -type MenuDocAccessFields_updatedAt_Update { - permission: Boolean! -} - -type MenuDocAccessFields_updatedAt_Delete { - permission: Boolean! -} - -type MenuDocAccessFields_createdAt { - create: MenuDocAccessFields_createdAt_Create - read: MenuDocAccessFields_createdAt_Read - update: MenuDocAccessFields_createdAt_Update - delete: MenuDocAccessFields_createdAt_Delete -} - -type MenuDocAccessFields_createdAt_Create { - permission: Boolean! -} - -type MenuDocAccessFields_createdAt_Read { - permission: Boolean! -} - -type MenuDocAccessFields_createdAt_Update { - permission: Boolean! -} - -type MenuDocAccessFields_createdAt_Delete { - permission: Boolean! -} - -type MenuReadDocAccess { - permission: Boolean! - where: JSONObject -} - -type MenuUpdateDocAccess { - permission: Boolean! - where: JSONObject -} - -type Access { - canAccessAdmin: Boolean! - posts: postsAccess - users: usersAccess - payload_preferences: payload_preferencesAccess - menu: menuAccess -} - -type postsAccess { - fields: PostsFields - create: PostsCreateAccess - read: PostsReadAccess - update: PostsUpdateAccess - delete: PostsDeleteAccess - readVersions: PostsReadVersionsAccess -} - -type PostsFields { - text: PostsFields_text - richText: PostsFields_richText - richText2: PostsFields_richText2 - updatedAt: PostsFields_updatedAt - createdAt: PostsFields_createdAt - _status: PostsFields__status -} - -type PostsFields_text { - create: PostsFields_text_Create - read: PostsFields_text_Read - update: PostsFields_text_Update - delete: PostsFields_text_Delete -} - -type PostsFields_text_Create { - permission: Boolean! -} - -type PostsFields_text_Read { - permission: Boolean! -} - -type PostsFields_text_Update { - permission: Boolean! -} - -type PostsFields_text_Delete { - permission: Boolean! -} - -type PostsFields_richText { - create: PostsFields_richText_Create - read: PostsFields_richText_Read - update: PostsFields_richText_Update - delete: PostsFields_richText_Delete -} - -type PostsFields_richText_Create { - permission: Boolean! -} - -type PostsFields_richText_Read { - permission: Boolean! -} - -type PostsFields_richText_Update { - permission: Boolean! -} - -type PostsFields_richText_Delete { - permission: Boolean! -} - -type PostsFields_richText2 { - create: PostsFields_richText2_Create - read: PostsFields_richText2_Read - update: PostsFields_richText2_Update - delete: PostsFields_richText2_Delete -} - -type PostsFields_richText2_Create { - permission: Boolean! -} - -type PostsFields_richText2_Read { - permission: Boolean! -} - -type PostsFields_richText2_Update { - permission: Boolean! -} - -type PostsFields_richText2_Delete { - permission: Boolean! -} - -type PostsFields_updatedAt { - create: PostsFields_updatedAt_Create - read: PostsFields_updatedAt_Read - update: PostsFields_updatedAt_Update - delete: PostsFields_updatedAt_Delete -} - -type PostsFields_updatedAt_Create { - permission: Boolean! -} - -type PostsFields_updatedAt_Read { - permission: Boolean! -} - -type PostsFields_updatedAt_Update { - permission: Boolean! -} - -type PostsFields_updatedAt_Delete { - permission: Boolean! -} - -type PostsFields_createdAt { - create: PostsFields_createdAt_Create - read: PostsFields_createdAt_Read - update: PostsFields_createdAt_Update - delete: PostsFields_createdAt_Delete -} - -type PostsFields_createdAt_Create { - permission: Boolean! -} - -type PostsFields_createdAt_Read { - permission: Boolean! -} - -type PostsFields_createdAt_Update { - permission: Boolean! -} - -type PostsFields_createdAt_Delete { - permission: Boolean! -} - -type PostsFields__status { - create: PostsFields__status_Create - read: PostsFields__status_Read - update: PostsFields__status_Update - delete: PostsFields__status_Delete -} - -type PostsFields__status_Create { - permission: Boolean! -} - -type PostsFields__status_Read { - permission: Boolean! -} - -type PostsFields__status_Update { - permission: Boolean! -} - -type PostsFields__status_Delete { - permission: Boolean! -} - -type PostsCreateAccess { - permission: Boolean! - where: JSONObject -} - -type PostsReadAccess { - permission: Boolean! - where: JSONObject -} - -type PostsUpdateAccess { - permission: Boolean! - where: JSONObject -} - -type PostsDeleteAccess { - permission: Boolean! - where: JSONObject -} - -type PostsReadVersionsAccess { - permission: Boolean! - where: JSONObject -} - -type usersAccess { - fields: UsersFields - create: UsersCreateAccess - read: UsersReadAccess - update: UsersUpdateAccess - delete: UsersDeleteAccess - unlock: UsersUnlockAccess -} - -type UsersFields { - updatedAt: UsersFields_updatedAt - createdAt: UsersFields_createdAt - email: UsersFields_email - password: UsersFields_password -} - -type UsersFields_updatedAt { - create: UsersFields_updatedAt_Create - read: UsersFields_updatedAt_Read - update: UsersFields_updatedAt_Update - delete: UsersFields_updatedAt_Delete -} - -type UsersFields_updatedAt_Create { - permission: Boolean! -} - -type UsersFields_updatedAt_Read { - permission: Boolean! -} - -type UsersFields_updatedAt_Update { - permission: Boolean! -} - -type UsersFields_updatedAt_Delete { - permission: Boolean! -} - -type UsersFields_createdAt { - create: UsersFields_createdAt_Create - read: UsersFields_createdAt_Read - update: UsersFields_createdAt_Update - delete: UsersFields_createdAt_Delete -} - -type UsersFields_createdAt_Create { - permission: Boolean! -} - -type UsersFields_createdAt_Read { - permission: Boolean! -} - -type UsersFields_createdAt_Update { - permission: Boolean! -} - -type UsersFields_createdAt_Delete { - permission: Boolean! -} - -type UsersFields_email { - create: UsersFields_email_Create - read: UsersFields_email_Read - update: UsersFields_email_Update - delete: UsersFields_email_Delete -} - -type UsersFields_email_Create { - permission: Boolean! -} - -type UsersFields_email_Read { - permission: Boolean! -} - -type UsersFields_email_Update { - permission: Boolean! -} - -type UsersFields_email_Delete { - permission: Boolean! -} - -type UsersFields_password { - create: UsersFields_password_Create - read: UsersFields_password_Read - update: UsersFields_password_Update - delete: UsersFields_password_Delete -} - -type UsersFields_password_Create { - permission: Boolean! -} - -type UsersFields_password_Read { - permission: Boolean! -} - -type UsersFields_password_Update { - permission: Boolean! -} - -type UsersFields_password_Delete { - permission: Boolean! -} - -type UsersCreateAccess { - permission: Boolean! - where: JSONObject -} - -type UsersReadAccess { - permission: Boolean! - where: JSONObject -} - -type UsersUpdateAccess { - permission: Boolean! - where: JSONObject -} - -type UsersDeleteAccess { - permission: Boolean! - where: JSONObject -} - -type UsersUnlockAccess { - permission: Boolean! - where: JSONObject -} - -type payload_preferencesAccess { - fields: PayloadPreferencesFields - create: PayloadPreferencesCreateAccess - read: PayloadPreferencesReadAccess - update: PayloadPreferencesUpdateAccess - delete: PayloadPreferencesDeleteAccess -} - -type PayloadPreferencesFields { - user: PayloadPreferencesFields_user - key: PayloadPreferencesFields_key - value: PayloadPreferencesFields_value - updatedAt: PayloadPreferencesFields_updatedAt - createdAt: PayloadPreferencesFields_createdAt -} - -type PayloadPreferencesFields_user { - create: PayloadPreferencesFields_user_Create - read: PayloadPreferencesFields_user_Read - update: PayloadPreferencesFields_user_Update - delete: PayloadPreferencesFields_user_Delete -} - -type PayloadPreferencesFields_user_Create { - permission: Boolean! -} - -type PayloadPreferencesFields_user_Read { - permission: Boolean! -} - -type PayloadPreferencesFields_user_Update { - permission: Boolean! -} - -type PayloadPreferencesFields_user_Delete { - permission: Boolean! -} - -type PayloadPreferencesFields_key { - create: PayloadPreferencesFields_key_Create - read: PayloadPreferencesFields_key_Read - update: PayloadPreferencesFields_key_Update - delete: PayloadPreferencesFields_key_Delete -} - -type PayloadPreferencesFields_key_Create { - permission: Boolean! -} - -type PayloadPreferencesFields_key_Read { - permission: Boolean! -} - -type PayloadPreferencesFields_key_Update { - permission: Boolean! -} - -type PayloadPreferencesFields_key_Delete { - permission: Boolean! -} - -type PayloadPreferencesFields_value { - create: PayloadPreferencesFields_value_Create - read: PayloadPreferencesFields_value_Read - update: PayloadPreferencesFields_value_Update - delete: PayloadPreferencesFields_value_Delete -} - -type PayloadPreferencesFields_value_Create { - permission: Boolean! -} - -type PayloadPreferencesFields_value_Read { - permission: Boolean! -} - -type PayloadPreferencesFields_value_Update { - permission: Boolean! -} - -type PayloadPreferencesFields_value_Delete { - permission: Boolean! -} - -type PayloadPreferencesFields_updatedAt { - create: PayloadPreferencesFields_updatedAt_Create - read: PayloadPreferencesFields_updatedAt_Read - update: PayloadPreferencesFields_updatedAt_Update - delete: PayloadPreferencesFields_updatedAt_Delete -} - -type PayloadPreferencesFields_updatedAt_Create { - permission: Boolean! -} - -type PayloadPreferencesFields_updatedAt_Read { - permission: Boolean! -} - -type PayloadPreferencesFields_updatedAt_Update { - permission: Boolean! -} - -type PayloadPreferencesFields_updatedAt_Delete { - permission: Boolean! -} - -type PayloadPreferencesFields_createdAt { - create: PayloadPreferencesFields_createdAt_Create - read: PayloadPreferencesFields_createdAt_Read - update: PayloadPreferencesFields_createdAt_Update - delete: PayloadPreferencesFields_createdAt_Delete -} - -type PayloadPreferencesFields_createdAt_Create { - permission: Boolean! -} - -type PayloadPreferencesFields_createdAt_Read { - permission: Boolean! -} - -type PayloadPreferencesFields_createdAt_Update { - permission: Boolean! -} - -type PayloadPreferencesFields_createdAt_Delete { - permission: Boolean! -} - -type PayloadPreferencesCreateAccess { - permission: Boolean! - where: JSONObject -} - -type PayloadPreferencesReadAccess { - permission: Boolean! - where: JSONObject -} - -type PayloadPreferencesUpdateAccess { - permission: Boolean! - where: JSONObject -} - -type PayloadPreferencesDeleteAccess { - permission: Boolean! - where: JSONObject -} - -type menuAccess { - fields: MenuFields - read: MenuReadAccess - update: MenuUpdateAccess -} - -type MenuFields { - globalText: MenuFields_globalText - updatedAt: MenuFields_updatedAt - createdAt: MenuFields_createdAt -} - -type MenuFields_globalText { - create: MenuFields_globalText_Create - read: MenuFields_globalText_Read - update: MenuFields_globalText_Update - delete: MenuFields_globalText_Delete -} - -type MenuFields_globalText_Create { - permission: Boolean! -} - -type MenuFields_globalText_Read { - permission: Boolean! -} - -type MenuFields_globalText_Update { - permission: Boolean! -} - -type MenuFields_globalText_Delete { - permission: Boolean! -} - -type MenuFields_updatedAt { - create: MenuFields_updatedAt_Create - read: MenuFields_updatedAt_Read - update: MenuFields_updatedAt_Update - delete: MenuFields_updatedAt_Delete -} - -type MenuFields_updatedAt_Create { - permission: Boolean! -} - -type MenuFields_updatedAt_Read { - permission: Boolean! -} - -type MenuFields_updatedAt_Update { - permission: Boolean! -} - -type MenuFields_updatedAt_Delete { - permission: Boolean! -} - -type MenuFields_createdAt { - create: MenuFields_createdAt_Create - read: MenuFields_createdAt_Read - update: MenuFields_createdAt_Update - delete: MenuFields_createdAt_Delete -} - -type MenuFields_createdAt_Create { - permission: Boolean! -} - -type MenuFields_createdAt_Read { - permission: Boolean! -} - -type MenuFields_createdAt_Update { - permission: Boolean! -} - -type MenuFields_createdAt_Delete { - permission: Boolean! -} - -type MenuReadAccess { - permission: Boolean! - where: JSONObject -} - -type MenuUpdateAccess { - permission: Boolean! - where: JSONObject -} - -type Mutation { - createPost(data: mutationPostInput!, draft: Boolean): Post - updatePost(id: String!, autosave: Boolean, data: mutationPostUpdateInput!, draft: Boolean): Post - deletePost(id: String!): Post - duplicatePost(id: String!): Post - restoreVersionPost(id: String): Post - createUser(data: mutationUserInput!, draft: Boolean): User - updateUser(id: String!, autosave: Boolean, data: mutationUserUpdateInput!, draft: Boolean): User - deleteUser(id: String!): User - refreshTokenUser(token: String): usersRefreshedUser - logoutUser: String - unlockUser(email: String!): Boolean! - loginUser(email: String, password: String): usersLoginResult - forgotPasswordUser(disableEmail: Boolean, email: String!, expiration: Int): Boolean! - resetPasswordUser(password: String, token: String): usersResetPassword - verifyEmailUser(token: String): Boolean - createPayloadPreference(data: mutationPayloadPreferenceInput!, draft: Boolean): PayloadPreference - updatePayloadPreference( - id: String! - autosave: Boolean - data: mutationPayloadPreferenceUpdateInput! - draft: Boolean - ): PayloadPreference - deletePayloadPreference(id: String!): PayloadPreference - duplicatePayloadPreference(id: String!): PayloadPreference - updateMenu(data: mutationMenuInput!, draft: Boolean): Menu -} - -input mutationPostInput { - text: String - richText: JSON - richText2: JSON - updatedAt: String - createdAt: String - _status: Post__status_MutationInput -} - -enum Post__status_MutationInput { - draft - published -} - -input mutationPostUpdateInput { - text: String - richText: JSON - richText2: JSON - updatedAt: String - createdAt: String - _status: PostUpdate__status_MutationInput -} - -enum PostUpdate__status_MutationInput { - draft - published -} - -input mutationUserInput { - updatedAt: String - createdAt: String - email: String! - resetPasswordToken: String - resetPasswordExpiration: String - salt: String - hash: String - loginAttempts: Float - lockUntil: String - password: String! -} - -input mutationUserUpdateInput { - updatedAt: String - createdAt: String - email: String - resetPasswordToken: String - resetPasswordExpiration: String - salt: String - hash: String - loginAttempts: Float - lockUntil: String - password: String -} - -type usersRefreshedUser { - exp: Int - refreshedToken: String - user: usersJWT -} - -type usersJWT { - email: EmailAddress! - collection: String! -} - -type usersLoginResult { - exp: Int - token: String - user: User -} - -type usersResetPassword { - token: String - user: User -} - -input mutationPayloadPreferenceInput { - user: PayloadPreference_UserRelationshipInput - key: String - value: JSON - updatedAt: String - createdAt: String -} - -input PayloadPreference_UserRelationshipInput { - relationTo: PayloadPreference_UserRelationshipInputRelationTo - value: JSON -} - -enum PayloadPreference_UserRelationshipInputRelationTo { - users -} - -input mutationPayloadPreferenceUpdateInput { - user: PayloadPreferenceUpdate_UserRelationshipInput - key: String - value: JSON - updatedAt: String - createdAt: String -} - -input PayloadPreferenceUpdate_UserRelationshipInput { - relationTo: PayloadPreferenceUpdate_UserRelationshipInputRelationTo - value: JSON -} - -enum PayloadPreferenceUpdate_UserRelationshipInputRelationTo { - users -} - -input mutationMenuInput { - globalText: String - updatedAt: String - createdAt: String -} From e9acd944e4ee2d10fe83a1fa3d1ecb11ee9ec7ab Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 2 Aug 2024 13:11:38 -0400 Subject: [PATCH 004/173] feat(payload): populate joins --- .../src/fields/hooks/afterRead/promise.ts | 2 +- .../relationshipPopulationPromise.ts | 23 +++++++++++-------- test/joins/int.spec.ts | 7 ++++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/payload/src/fields/hooks/afterRead/promise.ts b/packages/payload/src/fields/hooks/afterRead/promise.ts index ff9fc3878c1..a7d87b40782 100644 --- a/packages/payload/src/fields/hooks/afterRead/promise.ts +++ b/packages/payload/src/fields/hooks/afterRead/promise.ts @@ -288,7 +288,7 @@ export const promise = async ({ }) } - if (field.type === 'relationship' || field.type === 'upload') { + if (field.type === 'relationship' || field.type === 'upload' || field.type === 'join') { populationPromises.push( relationshipPopulationPromise({ currentDepth, diff --git a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts index 386c4cf132f..a316155fa45 100644 --- a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts +++ b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts @@ -1,5 +1,5 @@ import type { PayloadRequest } from '../../../types/index.js' -import type { RelationshipField, UploadField } from '../../config/types.js' +import type { JoinField, RelationshipField, UploadField } from '../../config/types.js' import { createDataloaderCacheKey } from '../../../collections/dataloader.js' import { fieldHasMaxDepth, fieldSupportsMany } from '../../config/types.js' @@ -11,7 +11,7 @@ type PopulateArgs = { depth: number draft: boolean fallbackLocale: null | string - field: RelationshipField | UploadField + field: JoinField | RelationshipField | UploadField index?: number key?: string locale: null | string @@ -36,11 +36,16 @@ const populate = async ({ showHiddenFields, }: PopulateArgs) => { const dataToUpdate = dataReference - const relation = Array.isArray(field.relationTo) ? (data.relationTo as string) : field.relationTo + let relation + if (field.type === 'join') { + relation = field.collection + } else { + relation = Array.isArray(field.relationTo) ? (data.relationTo as string) : field.relationTo + } const relatedCollection = req.payload.collections[relation] if (relatedCollection) { - let id = Array.isArray(field.relationTo) ? data.value : data + let id = field.type === 'relationship' && Array.isArray(field.relationTo) ? data.value : data let relationshipValue const shouldPopulate = depth && currentDepth <= depth @@ -76,18 +81,18 @@ const populate = async ({ } if (typeof index === 'number' && typeof key === 'string') { - if (Array.isArray(field.relationTo)) { + if (field.type === 'relationship' && Array.isArray(field.relationTo)) { dataToUpdate[field.name][key][index].value = relationshipValue } else { dataToUpdate[field.name][key][index] = relationshipValue } } else if (typeof index === 'number' || typeof key === 'string') { - if (Array.isArray(field.relationTo)) { + if (field.type === 'relationship' && Array.isArray(field.relationTo)) { dataToUpdate[field.name][index ?? key].value = relationshipValue } else { dataToUpdate[field.name][index ?? key] = relationshipValue } - } else if (Array.isArray(field.relationTo)) { + } else if (field.type === 'relationship' && Array.isArray(field.relationTo)) { dataToUpdate[field.name].value = relationshipValue } else { dataToUpdate[field.name] = relationshipValue @@ -100,7 +105,7 @@ type PromiseArgs = { depth: number draft: boolean fallbackLocale: null | string - field: RelationshipField | UploadField + field: JoinField | RelationshipField | UploadField locale: null | string overrideAccess: boolean req: PayloadRequest @@ -124,7 +129,7 @@ export const relationshipPopulationPromise = async ({ const populateDepth = fieldHasMaxDepth(field) && field.maxDepth < depth ? field.maxDepth : depth const rowPromises = [] - if (fieldSupportsMany(field) && field.hasMany) { + if (field.type === 'join' || (fieldSupportsMany(field) && field.hasMany)) { if ( field.localized && locale === 'all' && diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index f2cfd87133d..2f44a925220 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -73,7 +73,14 @@ describe('Joins Field Tests', () => { collection: 'categories', }) + const joinedIDs = categoryWithPosts.posts.map((post) => post.id) + // TODO: add types for joins (same as relationship with hasMany) expect(categoryWithPosts.posts).toHaveLength(3) + expect(categoryWithPosts.posts[0]).toHaveProperty('title') + expect(categoryWithPosts.posts[0].title).toBe('test') + expect(joinedIDs).toContain(categoryWithPosts.posts[0].id) + expect(joinedIDs).toContain(categoryWithPosts.posts[1].id) + expect(joinedIDs).toContain(categoryWithPosts.posts[2].id) }) }) From d1d7a1d6ab90f1b06be3b64ea79bf87ed9eae0bd Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 2 Aug 2024 14:06:46 -0400 Subject: [PATCH 005/173] feat(payload): generate join types --- .../payload/src/utilities/configToJSONSchema.ts | 17 +++++++++++++++++ test/joins/payload-types.ts | 1 + 2 files changed, 18 insertions(+) diff --git a/packages/payload/src/utilities/configToJSONSchema.ts b/packages/payload/src/utilities/configToJSONSchema.ts index b3c6c2d0ef5..e48af4b0db6 100644 --- a/packages/payload/src/utilities/configToJSONSchema.ts +++ b/packages/payload/src/utilities/configToJSONSchema.ts @@ -291,6 +291,23 @@ export function fieldsToJSONSchema( break } + case 'join': { + fieldSchema = { + type: withNullableJSONSchemaType('array', isRequired), + items: { + oneOf: [ + { + type: collectionIDFieldTypes[field.collection], + }, + { + $ref: `#/definitions/${field.collection}`, + }, + ], + }, + } + break + } + case 'relationship': { if (Array.isArray(field.relationTo)) { if (field.hasMany) { diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index e239b9fdca4..476562debe9 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -60,6 +60,7 @@ export interface Post { export interface Category { id: string; name?: string | null; + posts?: (string | Post)[] | null; updatedAt: string; createdAt: string; } From 6bebb5af7d6c0d315e4ea09b3caca07d4e06a136 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 2 Aug 2024 15:14:03 -0400 Subject: [PATCH 006/173] chore: generate joins graphql before change --- test/joins/schema.graphql | 1708 +++++++++++++++++++++++++++++++++++++ 1 file changed, 1708 insertions(+) create mode 100644 test/joins/schema.graphql diff --git a/test/joins/schema.graphql b/test/joins/schema.graphql new file mode 100644 index 00000000000..2d6f2788ee2 --- /dev/null +++ b/test/joins/schema.graphql @@ -0,0 +1,1708 @@ +type Query { + Post(id: String!, draft: Boolean): Post + Posts(draft: Boolean, where: Post_where, limit: Int, page: Int, sort: String): Posts + countPosts(draft: Boolean, where: Post_where): countPosts + docAccessPost(id: String!): postsDocAccess + Category(id: String!, draft: Boolean): Category + Categories(draft: Boolean, where: Category_where, limit: Int, page: Int, sort: String): Categories + countCategories(draft: Boolean, where: Category_where): countCategories + docAccessCategory(id: String!): categoriesDocAccess + User(id: String!, draft: Boolean): User + Users(draft: Boolean, where: User_where, limit: Int, page: Int, sort: String): Users + countUsers(draft: Boolean, where: User_where): countUsers + docAccessUser(id: String!): usersDocAccess + meUser: usersMe + initializedUser: Boolean + PayloadPreference(id: String!, draft: Boolean): PayloadPreference + PayloadPreferences(draft: Boolean, where: PayloadPreference_where, limit: Int, page: Int, sort: String): PayloadPreferences + countPayloadPreferences(draft: Boolean, where: PayloadPreference_where): countPayloadPreferences + docAccessPayloadPreference(id: String!): payload_preferencesDocAccess + Access: Access +} + +type Post { + id: String + title: String + category: Category + updatedAt: DateTime + createdAt: DateTime +} + +type Category { + id: String + name: String + updatedAt: DateTime + createdAt: DateTime +} + +""" +A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. +""" +scalar DateTime + +type Posts { + docs: [Post] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input Post_where { + title: Post_title_operator + category: Post_category_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + id: Post_id_operator + AND: [Post_where_and] + OR: [Post_where_or] +} + +input Post_title_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_category_operator { + equals: JSON + not_equals: JSON + in: [JSON] + not_in: [JSON] + all: [JSON] + exists: Boolean +} + +""" +The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSON @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf") + +input Post_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Post_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Post_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_where_and { + title: Post_title_operator + category: Post_category_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + id: Post_id_operator + AND: [Post_where_and] + OR: [Post_where_or] +} + +input Post_where_or { + title: Post_title_operator + category: Post_category_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + id: Post_id_operator + AND: [Post_where_and] + OR: [Post_where_or] +} + +type countPosts { + totalDocs: Int +} + +type postsDocAccess { + fields: PostsDocAccessFields + create: PostsCreateDocAccess + read: PostsReadDocAccess + update: PostsUpdateDocAccess + delete: PostsDeleteDocAccess +} + +type PostsDocAccessFields { + title: PostsDocAccessFields_title + category: PostsDocAccessFields_category + updatedAt: PostsDocAccessFields_updatedAt + createdAt: PostsDocAccessFields_createdAt +} + +type PostsDocAccessFields_title { + create: PostsDocAccessFields_title_Create + read: PostsDocAccessFields_title_Read + update: PostsDocAccessFields_title_Update + delete: PostsDocAccessFields_title_Delete +} + +type PostsDocAccessFields_title_Create { + permission: Boolean! +} + +type PostsDocAccessFields_title_Read { + permission: Boolean! +} + +type PostsDocAccessFields_title_Update { + permission: Boolean! +} + +type PostsDocAccessFields_title_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_category { + create: PostsDocAccessFields_category_Create + read: PostsDocAccessFields_category_Read + update: PostsDocAccessFields_category_Update + delete: PostsDocAccessFields_category_Delete +} + +type PostsDocAccessFields_category_Create { + permission: Boolean! +} + +type PostsDocAccessFields_category_Read { + permission: Boolean! +} + +type PostsDocAccessFields_category_Update { + permission: Boolean! +} + +type PostsDocAccessFields_category_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt { + create: PostsDocAccessFields_updatedAt_Create + read: PostsDocAccessFields_updatedAt_Read + update: PostsDocAccessFields_updatedAt_Update + delete: PostsDocAccessFields_updatedAt_Delete +} + +type PostsDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt { + create: PostsDocAccessFields_createdAt_Create + read: PostsDocAccessFields_createdAt_Read + update: PostsDocAccessFields_createdAt_Update + delete: PostsDocAccessFields_createdAt_Delete +} + +type PostsDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type PostsCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +""" +The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSONObject @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf") + +type PostsReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type Categories { + docs: [Category] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input Category_where { + name: Category_name_operator + updatedAt: Category_updatedAt_operator + createdAt: Category_createdAt_operator + id: Category_id_operator + AND: [Category_where_and] + OR: [Category_where_or] +} + +input Category_name_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Category_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Category_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Category_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Category_where_and { + name: Category_name_operator + updatedAt: Category_updatedAt_operator + createdAt: Category_createdAt_operator + id: Category_id_operator + AND: [Category_where_and] + OR: [Category_where_or] +} + +input Category_where_or { + name: Category_name_operator + updatedAt: Category_updatedAt_operator + createdAt: Category_createdAt_operator + id: Category_id_operator + AND: [Category_where_and] + OR: [Category_where_or] +} + +type countCategories { + totalDocs: Int +} + +type categoriesDocAccess { + fields: CategoriesDocAccessFields + create: CategoriesCreateDocAccess + read: CategoriesReadDocAccess + update: CategoriesUpdateDocAccess + delete: CategoriesDeleteDocAccess +} + +type CategoriesDocAccessFields { + name: CategoriesDocAccessFields_name + posts: CategoriesDocAccessFields_posts + updatedAt: CategoriesDocAccessFields_updatedAt + createdAt: CategoriesDocAccessFields_createdAt +} + +type CategoriesDocAccessFields_name { + create: CategoriesDocAccessFields_name_Create + read: CategoriesDocAccessFields_name_Read + update: CategoriesDocAccessFields_name_Update + delete: CategoriesDocAccessFields_name_Delete +} + +type CategoriesDocAccessFields_name_Create { + permission: Boolean! +} + +type CategoriesDocAccessFields_name_Read { + permission: Boolean! +} + +type CategoriesDocAccessFields_name_Update { + permission: Boolean! +} + +type CategoriesDocAccessFields_name_Delete { + permission: Boolean! +} + +type CategoriesDocAccessFields_posts { + create: CategoriesDocAccessFields_posts_Create + read: CategoriesDocAccessFields_posts_Read + update: CategoriesDocAccessFields_posts_Update + delete: CategoriesDocAccessFields_posts_Delete +} + +type CategoriesDocAccessFields_posts_Create { + permission: Boolean! +} + +type CategoriesDocAccessFields_posts_Read { + permission: Boolean! +} + +type CategoriesDocAccessFields_posts_Update { + permission: Boolean! +} + +type CategoriesDocAccessFields_posts_Delete { + permission: Boolean! +} + +type CategoriesDocAccessFields_updatedAt { + create: CategoriesDocAccessFields_updatedAt_Create + read: CategoriesDocAccessFields_updatedAt_Read + update: CategoriesDocAccessFields_updatedAt_Update + delete: CategoriesDocAccessFields_updatedAt_Delete +} + +type CategoriesDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type CategoriesDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type CategoriesDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type CategoriesDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type CategoriesDocAccessFields_createdAt { + create: CategoriesDocAccessFields_createdAt_Create + read: CategoriesDocAccessFields_createdAt_Read + update: CategoriesDocAccessFields_createdAt_Update + delete: CategoriesDocAccessFields_createdAt_Delete +} + +type CategoriesDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type CategoriesDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type CategoriesDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type CategoriesDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type CategoriesCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type CategoriesReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type CategoriesUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type CategoriesDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type User { + id: String + updatedAt: DateTime + createdAt: DateTime + email: EmailAddress! + resetPasswordToken: String + resetPasswordExpiration: DateTime + salt: String + hash: String + loginAttempts: Float + lockUntil: DateTime + password: String! +} + +""" +A field whose value conforms to the standard internet email address format as specified in HTML Spec: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address. +""" +scalar EmailAddress @specifiedBy(url: "https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address") + +type Users { + docs: [User] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input User_where { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + AND: [User_where_and] + OR: [User_where_or] +} + +input User_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input User_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input User_email_operator { + equals: EmailAddress + not_equals: EmailAddress + like: EmailAddress + contains: EmailAddress + in: [EmailAddress] + not_in: [EmailAddress] + all: [EmailAddress] +} + +input User_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input User_where_and { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + AND: [User_where_and] + OR: [User_where_or] +} + +input User_where_or { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + AND: [User_where_and] + OR: [User_where_or] +} + +type countUsers { + totalDocs: Int +} + +type usersDocAccess { + fields: UsersDocAccessFields + create: UsersCreateDocAccess + read: UsersReadDocAccess + update: UsersUpdateDocAccess + delete: UsersDeleteDocAccess + unlock: UsersUnlockDocAccess +} + +type UsersDocAccessFields { + updatedAt: UsersDocAccessFields_updatedAt + createdAt: UsersDocAccessFields_createdAt + email: UsersDocAccessFields_email + password: UsersDocAccessFields_password +} + +type UsersDocAccessFields_updatedAt { + create: UsersDocAccessFields_updatedAt_Create + read: UsersDocAccessFields_updatedAt_Read + update: UsersDocAccessFields_updatedAt_Update + delete: UsersDocAccessFields_updatedAt_Delete +} + +type UsersDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt { + create: UsersDocAccessFields_createdAt_Create + read: UsersDocAccessFields_createdAt_Read + update: UsersDocAccessFields_createdAt_Update + delete: UsersDocAccessFields_createdAt_Delete +} + +type UsersDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_email { + create: UsersDocAccessFields_email_Create + read: UsersDocAccessFields_email_Read + update: UsersDocAccessFields_email_Update + delete: UsersDocAccessFields_email_Delete +} + +type UsersDocAccessFields_email_Create { + permission: Boolean! +} + +type UsersDocAccessFields_email_Read { + permission: Boolean! +} + +type UsersDocAccessFields_email_Update { + permission: Boolean! +} + +type UsersDocAccessFields_email_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_password { + create: UsersDocAccessFields_password_Create + read: UsersDocAccessFields_password_Read + update: UsersDocAccessFields_password_Update + delete: UsersDocAccessFields_password_Delete +} + +type UsersDocAccessFields_password_Create { + permission: Boolean! +} + +type UsersDocAccessFields_password_Read { + permission: Boolean! +} + +type UsersDocAccessFields_password_Update { + permission: Boolean! +} + +type UsersDocAccessFields_password_Delete { + permission: Boolean! +} + +type UsersCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUnlockDocAccess { + permission: Boolean! + where: JSONObject +} + +type usersMe { + collection: String + exp: Int + strategy: String + token: String + user: User +} + +type PayloadPreference { + id: String + user: PayloadPreference_User_Relationship! + key: String + value: JSON + updatedAt: DateTime + createdAt: DateTime +} + +type PayloadPreference_User_Relationship { + relationTo: PayloadPreference_User_RelationTo + value: PayloadPreference_User +} + +enum PayloadPreference_User_RelationTo { + users +} + +union PayloadPreference_User = User + +type PayloadPreferences { + docs: [PayloadPreference] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input PayloadPreference_where { + user: PayloadPreference_user_Relation + key: PayloadPreference_key_operator + value: PayloadPreference_value_operator + updatedAt: PayloadPreference_updatedAt_operator + createdAt: PayloadPreference_createdAt_operator + id: PayloadPreference_id_operator + AND: [PayloadPreference_where_and] + OR: [PayloadPreference_where_or] +} + +input PayloadPreference_user_Relation { + relationTo: PayloadPreference_user_Relation_RelationTo + value: JSON +} + +enum PayloadPreference_user_Relation_RelationTo { + users +} + +input PayloadPreference_key_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input PayloadPreference_value_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + within: JSON + intersects: JSON + exists: Boolean +} + +input PayloadPreference_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input PayloadPreference_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input PayloadPreference_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input PayloadPreference_where_and { + user: PayloadPreference_user_Relation + key: PayloadPreference_key_operator + value: PayloadPreference_value_operator + updatedAt: PayloadPreference_updatedAt_operator + createdAt: PayloadPreference_createdAt_operator + id: PayloadPreference_id_operator + AND: [PayloadPreference_where_and] + OR: [PayloadPreference_where_or] +} + +input PayloadPreference_where_or { + user: PayloadPreference_user_Relation + key: PayloadPreference_key_operator + value: PayloadPreference_value_operator + updatedAt: PayloadPreference_updatedAt_operator + createdAt: PayloadPreference_createdAt_operator + id: PayloadPreference_id_operator + AND: [PayloadPreference_where_and] + OR: [PayloadPreference_where_or] +} + +type countPayloadPreferences { + totalDocs: Int +} + +type payload_preferencesDocAccess { + fields: PayloadPreferencesDocAccessFields + create: PayloadPreferencesCreateDocAccess + read: PayloadPreferencesReadDocAccess + update: PayloadPreferencesUpdateDocAccess + delete: PayloadPreferencesDeleteDocAccess +} + +type PayloadPreferencesDocAccessFields { + user: PayloadPreferencesDocAccessFields_user + key: PayloadPreferencesDocAccessFields_key + value: PayloadPreferencesDocAccessFields_value + updatedAt: PayloadPreferencesDocAccessFields_updatedAt + createdAt: PayloadPreferencesDocAccessFields_createdAt +} + +type PayloadPreferencesDocAccessFields_user { + create: PayloadPreferencesDocAccessFields_user_Create + read: PayloadPreferencesDocAccessFields_user_Read + update: PayloadPreferencesDocAccessFields_user_Update + delete: PayloadPreferencesDocAccessFields_user_Delete +} + +type PayloadPreferencesDocAccessFields_user_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_user_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_user_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_user_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key { + create: PayloadPreferencesDocAccessFields_key_Create + read: PayloadPreferencesDocAccessFields_key_Read + update: PayloadPreferencesDocAccessFields_key_Update + delete: PayloadPreferencesDocAccessFields_key_Delete +} + +type PayloadPreferencesDocAccessFields_key_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value { + create: PayloadPreferencesDocAccessFields_value_Create + read: PayloadPreferencesDocAccessFields_value_Read + update: PayloadPreferencesDocAccessFields_value_Update + delete: PayloadPreferencesDocAccessFields_value_Delete +} + +type PayloadPreferencesDocAccessFields_value_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt { + create: PayloadPreferencesDocAccessFields_updatedAt_Create + read: PayloadPreferencesDocAccessFields_updatedAt_Read + update: PayloadPreferencesDocAccessFields_updatedAt_Update + delete: PayloadPreferencesDocAccessFields_updatedAt_Delete +} + +type PayloadPreferencesDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt { + create: PayloadPreferencesDocAccessFields_createdAt_Create + read: PayloadPreferencesDocAccessFields_createdAt_Read + update: PayloadPreferencesDocAccessFields_createdAt_Update + delete: PayloadPreferencesDocAccessFields_createdAt_Delete +} + +type PayloadPreferencesDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type Access { + canAccessAdmin: Boolean! + posts: postsAccess + categories: categoriesAccess + users: usersAccess + payload_preferences: payload_preferencesAccess +} + +type postsAccess { + fields: PostsFields + create: PostsCreateAccess + read: PostsReadAccess + update: PostsUpdateAccess + delete: PostsDeleteAccess +} + +type PostsFields { + title: PostsFields_title + category: PostsFields_category + updatedAt: PostsFields_updatedAt + createdAt: PostsFields_createdAt +} + +type PostsFields_title { + create: PostsFields_title_Create + read: PostsFields_title_Read + update: PostsFields_title_Update + delete: PostsFields_title_Delete +} + +type PostsFields_title_Create { + permission: Boolean! +} + +type PostsFields_title_Read { + permission: Boolean! +} + +type PostsFields_title_Update { + permission: Boolean! +} + +type PostsFields_title_Delete { + permission: Boolean! +} + +type PostsFields_category { + create: PostsFields_category_Create + read: PostsFields_category_Read + update: PostsFields_category_Update + delete: PostsFields_category_Delete +} + +type PostsFields_category_Create { + permission: Boolean! +} + +type PostsFields_category_Read { + permission: Boolean! +} + +type PostsFields_category_Update { + permission: Boolean! +} + +type PostsFields_category_Delete { + permission: Boolean! +} + +type PostsFields_updatedAt { + create: PostsFields_updatedAt_Create + read: PostsFields_updatedAt_Read + update: PostsFields_updatedAt_Update + delete: PostsFields_updatedAt_Delete +} + +type PostsFields_updatedAt_Create { + permission: Boolean! +} + +type PostsFields_updatedAt_Read { + permission: Boolean! +} + +type PostsFields_updatedAt_Update { + permission: Boolean! +} + +type PostsFields_updatedAt_Delete { + permission: Boolean! +} + +type PostsFields_createdAt { + create: PostsFields_createdAt_Create + read: PostsFields_createdAt_Read + update: PostsFields_createdAt_Update + delete: PostsFields_createdAt_Delete +} + +type PostsFields_createdAt_Create { + permission: Boolean! +} + +type PostsFields_createdAt_Read { + permission: Boolean! +} + +type PostsFields_createdAt_Update { + permission: Boolean! +} + +type PostsFields_createdAt_Delete { + permission: Boolean! +} + +type PostsCreateAccess { + permission: Boolean! + where: JSONObject +} + +type PostsReadAccess { + permission: Boolean! + where: JSONObject +} + +type PostsUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type PostsDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type categoriesAccess { + fields: CategoriesFields + create: CategoriesCreateAccess + read: CategoriesReadAccess + update: CategoriesUpdateAccess + delete: CategoriesDeleteAccess +} + +type CategoriesFields { + name: CategoriesFields_name + posts: CategoriesFields_posts + updatedAt: CategoriesFields_updatedAt + createdAt: CategoriesFields_createdAt +} + +type CategoriesFields_name { + create: CategoriesFields_name_Create + read: CategoriesFields_name_Read + update: CategoriesFields_name_Update + delete: CategoriesFields_name_Delete +} + +type CategoriesFields_name_Create { + permission: Boolean! +} + +type CategoriesFields_name_Read { + permission: Boolean! +} + +type CategoriesFields_name_Update { + permission: Boolean! +} + +type CategoriesFields_name_Delete { + permission: Boolean! +} + +type CategoriesFields_posts { + create: CategoriesFields_posts_Create + read: CategoriesFields_posts_Read + update: CategoriesFields_posts_Update + delete: CategoriesFields_posts_Delete +} + +type CategoriesFields_posts_Create { + permission: Boolean! +} + +type CategoriesFields_posts_Read { + permission: Boolean! +} + +type CategoriesFields_posts_Update { + permission: Boolean! +} + +type CategoriesFields_posts_Delete { + permission: Boolean! +} + +type CategoriesFields_updatedAt { + create: CategoriesFields_updatedAt_Create + read: CategoriesFields_updatedAt_Read + update: CategoriesFields_updatedAt_Update + delete: CategoriesFields_updatedAt_Delete +} + +type CategoriesFields_updatedAt_Create { + permission: Boolean! +} + +type CategoriesFields_updatedAt_Read { + permission: Boolean! +} + +type CategoriesFields_updatedAt_Update { + permission: Boolean! +} + +type CategoriesFields_updatedAt_Delete { + permission: Boolean! +} + +type CategoriesFields_createdAt { + create: CategoriesFields_createdAt_Create + read: CategoriesFields_createdAt_Read + update: CategoriesFields_createdAt_Update + delete: CategoriesFields_createdAt_Delete +} + +type CategoriesFields_createdAt_Create { + permission: Boolean! +} + +type CategoriesFields_createdAt_Read { + permission: Boolean! +} + +type CategoriesFields_createdAt_Update { + permission: Boolean! +} + +type CategoriesFields_createdAt_Delete { + permission: Boolean! +} + +type CategoriesCreateAccess { + permission: Boolean! + where: JSONObject +} + +type CategoriesReadAccess { + permission: Boolean! + where: JSONObject +} + +type CategoriesUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type CategoriesDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type usersAccess { + fields: UsersFields + create: UsersCreateAccess + read: UsersReadAccess + update: UsersUpdateAccess + delete: UsersDeleteAccess + unlock: UsersUnlockAccess +} + +type UsersFields { + updatedAt: UsersFields_updatedAt + createdAt: UsersFields_createdAt + email: UsersFields_email + password: UsersFields_password +} + +type UsersFields_updatedAt { + create: UsersFields_updatedAt_Create + read: UsersFields_updatedAt_Read + update: UsersFields_updatedAt_Update + delete: UsersFields_updatedAt_Delete +} + +type UsersFields_updatedAt_Create { + permission: Boolean! +} + +type UsersFields_updatedAt_Read { + permission: Boolean! +} + +type UsersFields_updatedAt_Update { + permission: Boolean! +} + +type UsersFields_updatedAt_Delete { + permission: Boolean! +} + +type UsersFields_createdAt { + create: UsersFields_createdAt_Create + read: UsersFields_createdAt_Read + update: UsersFields_createdAt_Update + delete: UsersFields_createdAt_Delete +} + +type UsersFields_createdAt_Create { + permission: Boolean! +} + +type UsersFields_createdAt_Read { + permission: Boolean! +} + +type UsersFields_createdAt_Update { + permission: Boolean! +} + +type UsersFields_createdAt_Delete { + permission: Boolean! +} + +type UsersFields_email { + create: UsersFields_email_Create + read: UsersFields_email_Read + update: UsersFields_email_Update + delete: UsersFields_email_Delete +} + +type UsersFields_email_Create { + permission: Boolean! +} + +type UsersFields_email_Read { + permission: Boolean! +} + +type UsersFields_email_Update { + permission: Boolean! +} + +type UsersFields_email_Delete { + permission: Boolean! +} + +type UsersFields_password { + create: UsersFields_password_Create + read: UsersFields_password_Read + update: UsersFields_password_Update + delete: UsersFields_password_Delete +} + +type UsersFields_password_Create { + permission: Boolean! +} + +type UsersFields_password_Read { + permission: Boolean! +} + +type UsersFields_password_Update { + permission: Boolean! +} + +type UsersFields_password_Delete { + permission: Boolean! +} + +type UsersCreateAccess { + permission: Boolean! + where: JSONObject +} + +type UsersReadAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type UsersDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUnlockAccess { + permission: Boolean! + where: JSONObject +} + +type payload_preferencesAccess { + fields: PayloadPreferencesFields + create: PayloadPreferencesCreateAccess + read: PayloadPreferencesReadAccess + update: PayloadPreferencesUpdateAccess + delete: PayloadPreferencesDeleteAccess +} + +type PayloadPreferencesFields { + user: PayloadPreferencesFields_user + key: PayloadPreferencesFields_key + value: PayloadPreferencesFields_value + updatedAt: PayloadPreferencesFields_updatedAt + createdAt: PayloadPreferencesFields_createdAt +} + +type PayloadPreferencesFields_user { + create: PayloadPreferencesFields_user_Create + read: PayloadPreferencesFields_user_Read + update: PayloadPreferencesFields_user_Update + delete: PayloadPreferencesFields_user_Delete +} + +type PayloadPreferencesFields_user_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_user_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_user_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_user_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_key { + create: PayloadPreferencesFields_key_Create + read: PayloadPreferencesFields_key_Read + update: PayloadPreferencesFields_key_Update + delete: PayloadPreferencesFields_key_Delete +} + +type PayloadPreferencesFields_key_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_key_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_key_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_key_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_value { + create: PayloadPreferencesFields_value_Create + read: PayloadPreferencesFields_value_Read + update: PayloadPreferencesFields_value_Update + delete: PayloadPreferencesFields_value_Delete +} + +type PayloadPreferencesFields_value_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_value_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_value_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_value_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt { + create: PayloadPreferencesFields_updatedAt_Create + read: PayloadPreferencesFields_updatedAt_Read + update: PayloadPreferencesFields_updatedAt_Update + delete: PayloadPreferencesFields_updatedAt_Delete +} + +type PayloadPreferencesFields_updatedAt_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt { + create: PayloadPreferencesFields_createdAt_Create + read: PayloadPreferencesFields_createdAt_Read + update: PayloadPreferencesFields_createdAt_Update + delete: PayloadPreferencesFields_createdAt_Delete +} + +type PayloadPreferencesFields_createdAt_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesCreateAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesReadAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type Mutation { + createPost(data: mutationPostInput!, draft: Boolean): Post + updatePost(id: String!, autosave: Boolean, data: mutationPostUpdateInput!, draft: Boolean): Post + deletePost(id: String!): Post + duplicatePost(id: String!): Post + createCategory(data: mutationCategoryInput!, draft: Boolean): Category + updateCategory(id: String!, autosave: Boolean, data: mutationCategoryUpdateInput!, draft: Boolean): Category + deleteCategory(id: String!): Category + duplicateCategory(id: String!): Category + createUser(data: mutationUserInput!, draft: Boolean): User + updateUser(id: String!, autosave: Boolean, data: mutationUserUpdateInput!, draft: Boolean): User + deleteUser(id: String!): User + refreshTokenUser: usersRefreshedUser + logoutUser: String + unlockUser(email: String!): Boolean! + loginUser(email: String!, password: String): usersLoginResult + forgotPasswordUser(disableEmail: Boolean, expiration: Int, email: String!): Boolean! + resetPasswordUser(password: String, token: String): usersResetPassword + verifyEmailUser(token: String): Boolean + createPayloadPreference(data: mutationPayloadPreferenceInput!, draft: Boolean): PayloadPreference + updatePayloadPreference(id: String!, autosave: Boolean, data: mutationPayloadPreferenceUpdateInput!, draft: Boolean): PayloadPreference + deletePayloadPreference(id: String!): PayloadPreference + duplicatePayloadPreference(id: String!): PayloadPreference +} + +input mutationPostInput { + title: String + category: String + updatedAt: String + createdAt: String +} + +input mutationPostUpdateInput { + title: String + category: String + updatedAt: String + createdAt: String +} + +input mutationCategoryInput { + name: String + updatedAt: String + createdAt: String +} + +input mutationCategoryUpdateInput { + name: String + updatedAt: String + createdAt: String +} + +input mutationUserInput { + updatedAt: String + createdAt: String + email: String! + resetPasswordToken: String + resetPasswordExpiration: String + salt: String + hash: String + loginAttempts: Float + lockUntil: String + password: String! +} + +input mutationUserUpdateInput { + updatedAt: String + createdAt: String + email: String + resetPasswordToken: String + resetPasswordExpiration: String + salt: String + hash: String + loginAttempts: Float + lockUntil: String + password: String +} + +type usersRefreshedUser { + exp: Int + refreshedToken: String + strategy: String + user: usersJWT +} + +type usersJWT { + email: EmailAddress! + collection: String! +} + +type usersLoginResult { + exp: Int + token: String + user: User +} + +type usersResetPassword { + token: String + user: User +} + +input mutationPayloadPreferenceInput { + user: PayloadPreference_UserRelationshipInput + key: String + value: JSON + updatedAt: String + createdAt: String +} + +input PayloadPreference_UserRelationshipInput { + relationTo: PayloadPreference_UserRelationshipInputRelationTo + value: JSON +} + +enum PayloadPreference_UserRelationshipInputRelationTo { + users +} + +input mutationPayloadPreferenceUpdateInput { + user: PayloadPreferenceUpdate_UserRelationshipInput + key: String + value: JSON + updatedAt: String + createdAt: String +} + +input PayloadPreferenceUpdate_UserRelationshipInput { + relationTo: PayloadPreferenceUpdate_UserRelationshipInputRelationTo + value: JSON +} + +enum PayloadPreferenceUpdate_UserRelationshipInputRelationTo { + users +} \ No newline at end of file From 0e4da640d5d8b73933cf01c1e70b308dff13b528 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Mon, 5 Aug 2024 16:18:05 -0400 Subject: [PATCH 007/173] feat(db-mongodb): support nested join fields --- packages/db-mongodb/src/findOne.ts | 30 ++---------- packages/db-mongodb/src/utilities/setJoins.ts | 48 +++++++++++++++++++ .../payload/src/collections/config/types.ts | 11 ++++- packages/payload/src/index.ts | 35 +++++++++----- .../payload/src/utilities/traverseFields.ts | 46 ++++++++++++++++++ test/joins/config.ts | 23 +++++++++ test/joins/int.spec.ts | 27 +++++++---- 7 files changed, 174 insertions(+), 46 deletions(-) create mode 100644 packages/db-mongodb/src/utilities/setJoins.ts create mode 100644 packages/payload/src/utilities/traverseFields.ts diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index dc42ff04918..d8eb22fd76c 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -1,9 +1,10 @@ import type { MongooseQueryOptions } from 'mongoose' -import type { Document, FindOne, PayloadRequest } from 'payload' +import type { FindOne, PayloadRequest } from 'payload' import type { MongooseAdapter } from './index.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' +import { setJoins } from './utilities/setJoins.js' import { withSession } from './withSession.js' export const findOne: FindOne = async function findOne( @@ -24,34 +25,13 @@ export const findOne: FindOne = async function findOne( const doc = await Model.findOne(query, {}, options) - const joins = this.payload.collections[collection].joins - - for (const slug of Object.keys(joins)) { - // fetch docs and add to the keys by path - const joinModel = this.collections[slug] - - for (const join of joins[slug]) { - const joinData = await joinModel - .find( - { [join.path]: { $eq: doc?._id.toString() } }, - { - _id: 1, - }, - options, - ) - .limit(10) - - // TODO: handle assigning join data to nested paths - // iterate path and assign object - doc[join.name] = joinData.map((a) => a._id.toString()) - } - } - if (!doc) { return null } - let result: Document = JSON.parse(JSON.stringify(doc)) + let result = await setJoins({ collection, doc, options, payload: this.payload }) + + result = JSON.parse(JSON.stringify(result)) // custom id type reset result.id = result._id diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts new file mode 100644 index 00000000000..232f0864ded --- /dev/null +++ b/packages/db-mongodb/src/utilities/setJoins.ts @@ -0,0 +1,48 @@ +import type { MongooseQueryOptions } from 'mongoose' +import type { Document, Payload } from 'payload' + +type Args = { + collection: string + doc: Document + options: MongooseQueryOptions + payload: Payload +} + +export const setJoins = async ({ collection, doc, options, payload }: Args): Promise => { + const joins = payload.collections[collection].joins + + await Promise.all( + Object.keys(joins).map(async (slug) => { + // fetch docs and add to the keys by path + const joinModel = payload.db.collections[slug] + + for (const join of joins[slug]) { + const joinData = await joinModel + .find( + { [join.field.path]: { $eq: doc._id.toString() } }, + { + _id: 1, + }, + options, + ) + .limit(10) + + // iterate path and assign to the document + const path = join.path.split('.') + let current = doc + for (let i = 0; i <= path.length - 1; i++) { + if (i === path.length - 1) { + current[path[i]] = joinData.map((a) => a._id) + } else { + if (!current[path[i]]) { + current[path[i]] = {} + } + current = current[path[i]] + } + } + } + }), + ) + + return doc +} diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 42716512c76..dfb09637a23 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -503,7 +503,16 @@ export type Collection = { * Object of collections to join 'Join Fields object keyed by collection */ joins: { - [key: string]: JoinField[] + [collectionSlug: string]: { + /** + * The field configuration defining the join + */ + field: JoinField + /** + * The nested field path in dot notation + */ + path: string + }[] } } diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index 7c43b3cd5f7..61b7a8e7f08 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -44,6 +44,8 @@ import type { import type { InitOptions, SanitizedConfig } from './config/types.js' import type { BaseDatabaseAdapter, PaginatedDocs } from './database/types.js' import type { InitializedEmailAdapter } from './email/types.js' +import type { ClientFieldConfig } from './fields/config/client.js' +import type { Field} from './fields/config/types.js'; import type { DataFromGlobalSlug, Globals } from './globals/config/types.js' import type { Options as FindGlobalOptions } from './globals/operations/local/findOne.js' import type { Options as FindGlobalVersionByIDOptions } from './globals/operations/local/findVersionByID.js' @@ -58,12 +60,13 @@ import { APIKeyAuthentication } from './auth/strategies/apiKey.js' import { JWTAuthentication } from './auth/strategies/jwt.js' import localOperations from './collections/operations/local/index.js' import { consoleEmailAdapter } from './email/consoleEmailAdapter.js' -import { fieldAffectsData } from './fields/config/types.js' +import { fieldAffectsData, fieldHasSubFields } from './fields/config/types.js' import localGlobalOperations from './globals/operations/local/index.js' import { getDependencies } from './utilities/dependencies/getDependencies.js' import flattenFields from './utilities/flattenTopLevelFields.js' import { getLogger } from './utilities/logger.js' import { serverInit as serverInitTelemetry } from './utilities/telemetry/events/serverInit.js' +import { traverseFields } from './utilities/traverseFields.js' export interface GeneratedTypes { authUntyped: { @@ -499,23 +502,31 @@ export class BasePayload { this.config.collections.forEach((collection) => { const joins = {} - const flattenedFields = flattenFields(collection.fields) - let customID - - for (const field of flattenedFields) { + let customIDType + const callback = (field: ClientFieldConfig | Field, ref, parentRef) => { if (!fieldAffectsData(field)) { - continue + return + } + if (field.name === 'id') { + customIDType = field.type + return + } + if (fieldHasSubFields(field)) { + const parentPath = parentRef.path || '' + ref.path = `${parentPath}${parentPath ? '.' : ''}${field.name}` + return } if (field.type === 'join') { - joins[field.collection] = joins[field.collection] || [] - joins[field.collection].push(field) + const join = { field, path: `${ref.path || ''}${ref.path ? '.' : ''}${field.name}` } + if (!joins[field.collection]) { + joins[field.collection] = [join] + } else { + joins[field.collection].push(join) + } } - if (field.name === 'id') customID = field } - let customIDType - - if (customID?.type === 'number' || customID?.type === 'text') customIDType = customID.type + traverseFields(collection.fields, callback) this.collections[collection.slug] = { config: collection, diff --git a/packages/payload/src/utilities/traverseFields.ts b/packages/payload/src/utilities/traverseFields.ts new file mode 100644 index 00000000000..81d188639f5 --- /dev/null +++ b/packages/payload/src/utilities/traverseFields.ts @@ -0,0 +1,46 @@ +import type { ClientFieldConfig } from '../fields/config/client.js' +import type { Field } from '../fields/config/types.js' + +import { fieldHasSubFields } from '../fields/config/types.js' + +type Ref = { + [key: string]: Ref +} + +/** + * Iterate a recurse an array of fields, calling a callback for each field + * + * @param fields + * @param callback callback called for each field + * @param ref + * @param parentRef + */ +export const traverseFields = ( + fields: (ClientFieldConfig | Field)[], + callback?: (field: ClientFieldConfig | Field, ref: Ref, parentRef: Ref) => void, + ref: Ref = {}, + parentRef: Ref = {}, +): void => { + fields.forEach((field) => { + if (fieldHasSubFields(field)) { + const parentRef = ref + if ('name' in field && field.name) { + ref[field.name] = {} + ref = ref[field.name] + } + if (callback) callback(field, ref, parentRef) + traverseFields(field.fields, callback, ref, parentRef) + } + + if (field.type === 'tabs' && 'tabs' in field) { + field.tabs.forEach((tab) => { + if ('name' in tab && tab.name) { + ref[tab.name] = {} + ref = ref[tab.name] + } + traverseFields(tab.fields, callback, ref, parentRef) + }) + } + callback(field, ref, parentRef) + }) +} diff --git a/test/joins/config.ts b/test/joins/config.ts index 2d429453ed9..a521eca8bb0 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -23,6 +23,17 @@ export default buildConfigWithDefaults({ type: 'relationship', relationTo: 'categories', }, + { + name: 'group', + type: 'group', + fields: [ + { + name: 'category', + type: 'relationship', + relationTo: 'categories', + }, + ], + }, ], }, { @@ -41,6 +52,18 @@ export default buildConfigWithDefaults({ collection: 'posts', path: 'category', }, + { + name: 'group', + type: 'group', + fields: [ + { + name: 'posts', + type: 'join', + collection: 'posts', + path: 'group.category', + }, + ], + }, ], }, ], diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index 2f44a925220..3f74587b380 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -43,6 +43,7 @@ describe('Joins Field Tests', () => { collection: 'categories', data: { name: 'example', + group: {}, }, }) @@ -50,6 +51,9 @@ describe('Joins Field Tests', () => { collection: 'posts', data: { category: category.id, + group: { + category: category.id, + }, title: 'test', }, }) @@ -57,6 +61,9 @@ describe('Joins Field Tests', () => { collection: 'posts', data: { category: category.id, + group: { + category: category.id, + }, title: 'test', }, }) @@ -64,6 +71,9 @@ describe('Joins Field Tests', () => { collection: 'posts', data: { category: category.id, + group: { + category: category.id, + }, title: 'test', }, }) @@ -73,14 +83,15 @@ describe('Joins Field Tests', () => { collection: 'categories', }) - const joinedIDs = categoryWithPosts.posts.map((post) => post.id) + expect(Array.isArray(categoryWithPosts.group.posts)).toBeDefined() + expect(Array.isArray(categoryWithPosts.posts)).toBeDefined() + const joinedIDs = categoryWithPosts.group.posts.map((post) => post.id) - // TODO: add types for joins (same as relationship with hasMany) - expect(categoryWithPosts.posts).toHaveLength(3) - expect(categoryWithPosts.posts[0]).toHaveProperty('title') - expect(categoryWithPosts.posts[0].title).toBe('test') - expect(joinedIDs).toContain(categoryWithPosts.posts[0].id) - expect(joinedIDs).toContain(categoryWithPosts.posts[1].id) - expect(joinedIDs).toContain(categoryWithPosts.posts[2].id) + expect(categoryWithPosts.group.posts).toHaveLength(3) + expect(categoryWithPosts.group.posts[0]).toHaveProperty('title') + expect(categoryWithPosts.group.posts[0].title).toBe('test') + expect(joinedIDs).toContain(categoryWithPosts.group.posts[0].id) + expect(joinedIDs).toContain(categoryWithPosts.group.posts[1].id) + expect(joinedIDs).toContain(categoryWithPosts.group.posts[2].id) }) }) From 8604b36d29ddac43dcb5ccf6a4b8df069114e489 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 6 Aug 2024 14:37:27 -0400 Subject: [PATCH 008/173] chore: disambiguate path to schemaPath and on --- packages/db-mongodb/src/findOne.ts | 2 +- packages/db-mongodb/src/utilities/setJoins.ts | 29 +++++++++++++++---- packages/payload/src/admin/fields/Join.ts | 16 ++++++++++ packages/payload/src/admin/fields/index.ts | 4 +++ .../payload/src/admin/forms/FieldTypes.ts | 1 + packages/payload/src/admin/types.ts | 7 +++++ .../payload/src/collections/config/types.ts | 6 ++-- packages/payload/src/fields/config/types.ts | 2 +- packages/payload/src/index.ts | 12 +++++--- test/joins/config.ts | 4 +-- 10 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 packages/payload/src/admin/fields/Join.ts diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index d8eb22fd76c..dc8d4bbcf2a 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -29,7 +29,7 @@ export const findOne: FindOne = async function findOne( return null } - let result = await setJoins({ collection, doc, options, payload: this.payload }) + let result = await setJoins({ collection, doc, options, payload: this.payload, req }) result = JSON.parse(JSON.stringify(result)) diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts index 232f0864ded..a0a83d8c1ef 100644 --- a/packages/db-mongodb/src/utilities/setJoins.ts +++ b/packages/db-mongodb/src/utilities/setJoins.ts @@ -1,25 +1,42 @@ import type { MongooseQueryOptions } from 'mongoose' -import type { Document, Payload } from 'payload' +import type { Document, Payload, PayloadRequest } from 'payload' type Args = { collection: string doc: Document options: MongooseQueryOptions payload: Payload + req: PayloadRequest } -export const setJoins = async ({ collection, doc, options, payload }: Args): Promise => { +// TODO: pass in queryParam called `joins` to specify the pagination of each join +// joins[schemaPath][page]=2&joins[schemaPath][limit]=100 + +/** + * // fetch docs and add to the keys by path + * @param collection + * @param doc + * @param options + * @param payload + * @param req + */ +export const setJoins = async ({ + collection, + doc, + options, + payload, + req, +}: Args): Promise => { const joins = payload.collections[collection].joins await Promise.all( Object.keys(joins).map(async (slug) => { - // fetch docs and add to the keys by path const joinModel = payload.db.collections[slug] for (const join of joins[slug]) { const joinData = await joinModel .find( - { [join.field.path]: { $eq: doc._id.toString() } }, + { [join.field.on]: { $eq: doc._id.toString() } }, { _id: 1, }, @@ -27,8 +44,8 @@ export const setJoins = async ({ collection, doc, options, payload }: Args): Pro ) .limit(10) - // iterate path and assign to the document - const path = join.path.split('.') + // iterate schemaPath and assign to the document + const path = join.schemaPath.split('.') let current = doc for (let i = 0; i <= path.length - 1; i++) { if (i === path.length - 1) { diff --git a/packages/payload/src/admin/fields/Join.ts b/packages/payload/src/admin/fields/Join.ts new file mode 100644 index 00000000000..cf6e648a70c --- /dev/null +++ b/packages/payload/src/admin/fields/Join.ts @@ -0,0 +1,16 @@ +import type { ErrorComponent } from '../forms/Error.js' +import type { DescriptionComponent, FormFieldBase, LabelComponent } from '../types.js' + +export type JoinFieldProps = { + disableModifyingForm?: false + forceUsePathFromProps?: boolean + name?: string + path?: string + value?: unknown +} & FormFieldBase + +export type JoinFieldLabelComponent = LabelComponent<'join'> + +export type JoinFieldDescriptionComponent = DescriptionComponent<'join'> + +export type JoinFieldErrorComponent = ErrorComponent<'join'> diff --git a/packages/payload/src/admin/fields/index.ts b/packages/payload/src/admin/fields/index.ts index 835ccf0732c..f0f0726775f 100644 --- a/packages/payload/src/admin/fields/index.ts +++ b/packages/payload/src/admin/fields/index.ts @@ -8,6 +8,7 @@ import type { EmailFieldProps } from './Email.js' import type { GroupFieldProps } from './Group.js' import type { HiddenFieldProps } from './Hidden.js' import type { JSONFieldProps } from './JSON.js' +import type { JoinFieldProps } from './Join.js' import type { NumberFieldProps } from './Number.js' import type { PointFieldProps } from './Point.js' import type { RadioFieldProps } from './Radio.js' @@ -48,6 +49,9 @@ export type FieldComponentProps = | ({ type: 'hidden' } & HiddenFieldProps) + | ({ + type: 'join' + } & JoinFieldProps) | ({ type: 'json' } & JSONFieldProps) diff --git a/packages/payload/src/admin/forms/FieldTypes.ts b/packages/payload/src/admin/forms/FieldTypes.ts index cf93f709e2d..bd7c1be7165 100644 --- a/packages/payload/src/admin/forms/FieldTypes.ts +++ b/packages/payload/src/admin/forms/FieldTypes.ts @@ -9,6 +9,7 @@ export type FieldTypes = { email: React.ComponentType group: React.ComponentType hidden: React.ComponentType + join: React.ComponentType json: React.ComponentType number: React.ComponentType password: React.ComponentType diff --git a/packages/payload/src/admin/types.ts b/packages/payload/src/admin/types.ts index 6a8919e54c2..4584ddc77cf 100644 --- a/packages/payload/src/admin/types.ts +++ b/packages/payload/src/admin/types.ts @@ -95,6 +95,13 @@ export type { JSONFieldProps, } from './fields/JSON.js' +export type { + JoinFieldDescriptionComponent, + JoinFieldErrorComponent, + JoinFieldLabelComponent, + JoinFieldProps, +} from './fields/Join.js' + export type { NumberFieldDescriptionComponent, NumberFieldErrorComponent, diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index dfb09637a23..ffec1263267 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -502,16 +502,16 @@ export type Collection = { /** * Object of collections to join 'Join Fields object keyed by collection */ - joins: { + joins?: { [collectionSlug: string]: { /** * The field configuration defining the join */ field: JoinField /** - * The nested field path in dot notation + * The schemaPath of the join field in dot notation */ - path: string + schemaPath: string }[] } } diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index c4d4db3fec7..928d05ccc8d 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -837,7 +837,7 @@ export type JoinField = { /** * A string for the field in the collection being joined to. */ - path: string + on: string type: 'join' } & FieldBase diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index 61b7a8e7f08..91dc7af4e19 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -45,7 +45,7 @@ import type { InitOptions, SanitizedConfig } from './config/types.js' import type { BaseDatabaseAdapter, PaginatedDocs } from './database/types.js' import type { InitializedEmailAdapter } from './email/types.js' import type { ClientFieldConfig } from './fields/config/client.js' -import type { Field} from './fields/config/types.js'; +import type { Field } from './fields/config/types.js' import type { DataFromGlobalSlug, Globals } from './globals/config/types.js' import type { Options as FindGlobalOptions } from './globals/operations/local/findOne.js' import type { Options as FindGlobalVersionByIDOptions } from './globals/operations/local/findVersionByID.js' @@ -500,6 +500,7 @@ export class BasePayload { config: this.config.globals, } + // TODO: move to sanitize to reduce looping of collections + fields this.config.collections.forEach((collection) => { const joins = {} let customIDType @@ -512,12 +513,15 @@ export class BasePayload { return } if (fieldHasSubFields(field)) { - const parentPath = parentRef.path || '' - ref.path = `${parentPath}${parentPath ? '.' : ''}${field.name}` + const parentPath = parentRef.schemaPath || '' + ref.schemaPath = `${parentPath}${parentPath ? '.' : ''}${field.name}` return } if (field.type === 'join') { - const join = { field, path: `${ref.path || ''}${ref.path ? '.' : ''}${field.name}` } + const join = { + field, + schemaPath: `${ref.schemaPath || ''}${ref.schemaPath ? '.' : ''}${field.name}`, + } if (!joins[field.collection]) { joins[field.collection] = [join] } else { diff --git a/test/joins/config.ts b/test/joins/config.ts index a521eca8bb0..a73ffec4977 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -50,7 +50,7 @@ export default buildConfigWithDefaults({ name: 'posts', type: 'join', collection: 'posts', - path: 'category', + on: 'category', }, { name: 'group', @@ -60,7 +60,7 @@ export default buildConfigWithDefaults({ name: 'posts', type: 'join', collection: 'posts', - path: 'group.category', + on: 'group.category', }, ], }, From 4e67ad263a4de9db96d7a9a36be4e38ba1ae01f8 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 6 Aug 2024 14:39:16 -0400 Subject: [PATCH 009/173] chore(ui): stub join field --- packages/ui/src/fields/Join/index.tsx | 37 +++++++++++++++++++ packages/ui/src/fields/index.tsx | 2 + .../ComponentMap/buildComponentMap/fields.tsx | 12 ++++++ 3 files changed, 51 insertions(+) create mode 100644 packages/ui/src/fields/Join/index.tsx diff --git a/packages/ui/src/fields/Join/index.tsx b/packages/ui/src/fields/Join/index.tsx new file mode 100644 index 00000000000..71884495b01 --- /dev/null +++ b/packages/ui/src/fields/Join/index.tsx @@ -0,0 +1,37 @@ +'use client' + +import type { JoinFieldProps } from 'payload' + +import React, { useEffect } from 'react' + +import { useFieldProps } from '../../forms/FieldPropsProvider/index.js' +import { useField } from '../../forms/useField/index.js' +import { withCondition } from '../../forms/withCondition/index.js' + +const JoinFieldComponent: React.FC = (props) => { + const { + name, + disableModifyingForm = true, + forceUsePathFromProps, + path: pathFromProps, + value: valueFromProps, + } = props + + const { path: pathFromContext } = useFieldProps() + + const { path, value } = useField({ + path: (!forceUsePathFromProps ? pathFromContext : null) || pathFromProps || name, + }) + + // TODO: replace hidden placeholder with the actual edit component + return ( + + ) +} + +export const JoinField = withCondition(JoinFieldComponent) diff --git a/packages/ui/src/fields/index.tsx b/packages/ui/src/fields/index.tsx index e554bdc9e0c..9ac102d1bca 100644 --- a/packages/ui/src/fields/index.tsx +++ b/packages/ui/src/fields/index.tsx @@ -11,6 +11,7 @@ import { EmailField } from './Email/index.js' import { GroupField } from './Group/index.js' import { HiddenField } from './Hidden/index.js' import { JSONField } from './JSON/index.js' +import { JoinField } from './Join/index.js' import { NumberField } from './Number/index.js' import { PasswordField } from './Password/index.js' import { PointField } from './Point/index.js' @@ -38,6 +39,7 @@ export const fieldComponents: FieldTypes = { email: EmailField, group: GroupField, hidden: HiddenField, + join: JoinField, json: JSONField, number: NumberField, password: PasswordField, diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx index 09ee4e72baa..a8abcabfd2c 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx @@ -17,6 +17,7 @@ import type { FormFieldBase, GroupFieldProps, JSONFieldProps, + JoinFieldProps, LabelProps, MappedField, MappedTab, @@ -382,6 +383,17 @@ export const mapFields = (args: { fieldComponentPropsBase = groupField break } + case 'join': { + // TODO: Implement join field + const joinField: JoinFieldProps = { + ...baseFieldProps, + name: field.name, + className: field.admin?.className, + style: field.admin?.style, + } + fieldComponentPropsBase = joinField + break + } case 'json': { const jsonField: JSONFieldProps = { ...baseFieldProps, From 75d858a342f5de4d3b5a379ae94b397439629472 Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Thu, 8 Aug 2024 18:10:46 +0100 Subject: [PATCH 010/173] feat: scope publish specific locale --- .../src/routes/rest/collections/updateByID.ts | 2 + .../src/collections/operations/updateByID.ts | 42 +++++++++++- .../src/fields/hooks/beforeChange/index.ts | 6 +- .../payload/src/globals/operations/update.ts | 2 + .../versions/getLatestCollectionVersion.ts | 1 + .../src/versions/getLatestGlobalVersion.ts | 5 ++ packages/payload/src/versions/saveVersion.ts | 7 +- packages/ui/src/elements/Button/index.scss | 43 +++++++++++++ packages/ui/src/elements/Button/index.tsx | 64 ++++++++++++++++++- packages/ui/src/elements/Button/types.ts | 5 ++ .../src/elements/Popup/PopupTrigger/index.tsx | 11 +++- packages/ui/src/elements/Popup/index.tsx | 6 +- .../ui/src/elements/PublishButton/index.tsx | 14 +++- 13 files changed, 194 insertions(+), 14 deletions(-) diff --git a/packages/next/src/routes/rest/collections/updateByID.ts b/packages/next/src/routes/rest/collections/updateByID.ts index 8ff51093711..92767d75876 100644 --- a/packages/next/src/routes/rest/collections/updateByID.ts +++ b/packages/next/src/routes/rest/collections/updateByID.ts @@ -16,6 +16,7 @@ export const updateByID: CollectionRouteHandlerWithID = async ({ const depth = searchParams.get('depth') const autosave = searchParams.get('autosave') === 'true' const draft = searchParams.get('draft') === 'true' + const publishSpecificLocale = req.query.publishSpecificLocale as string | undefined const id = sanitizeCollectionID({ id: incomingID, @@ -30,6 +31,7 @@ export const updateByID: CollectionRouteHandlerWithID = async ({ data: req.data, depth: isNumber(depth) ? Number(depth) : undefined, draft, + publishSpecificLocale, req, }) diff --git a/packages/payload/src/collections/operations/updateByID.ts b/packages/payload/src/collections/operations/updateByID.ts index 0a07606c0aa..52b770dda8e 100644 --- a/packages/payload/src/collections/operations/updateByID.ts +++ b/packages/payload/src/collections/operations/updateByID.ts @@ -3,12 +3,13 @@ import type { DeepPartial } from 'ts-essentials' import httpStatus from 'http-status' import type { FindOneArgs } from '../../database/types.js' -import type { CollectionSlug } from '../../index.js' +import type { CollectionSlug, GeneratedTypes } from '../../index.js' import type { PayloadRequest } from '../../types/index.js' import type { Collection, DataFromCollectionSlug, RequiredDataFromCollectionSlug, + TypeWithID, } from '../config/types.js' import { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js' @@ -42,6 +43,7 @@ export type Arguments = { id: number | string overrideAccess?: boolean overwriteExistingFiles?: boolean + publishSpecificLocale?: string req: PayloadRequest showHiddenFields?: boolean } @@ -80,6 +82,7 @@ export const updateByIDOperation = async ( draft: draftArg = false, overrideAccess, overwriteExistingFiles = false, + publishSpecificLocale, req: { fallbackLocale, locale, @@ -127,6 +130,19 @@ export const updateByIDOperation = async ( req, }) + let publishedDocWithLocales + + if (publishSpecificLocale) { + publishedDocWithLocales = await getLatestCollectionVersion({ + id, + config: collectionConfig, + payload, + published: true, + query: findOneArgs, + req, + }) + } + if (!docWithLocales && !hasWherePolicy) throw new NotFound(req.t) if (!docWithLocales && hasWherePolicy) throw new Forbidden(req.t) @@ -257,6 +273,8 @@ export const updateByIDOperation = async ( docWithLocales, global: null, operation: 'update', + publishSpecificLocale, + publishedDocWithLocales, req, skipValidation: shouldSaveDraft && @@ -265,6 +283,23 @@ export const updateByIDOperation = async ( data._status !== 'published', }) + let versionResult = result + + if (publishSpecificLocale) { + versionResult = await beforeChange({ + id, + collection: collectionConfig, + context: req.context, + data, + doc: originalDoc, + docWithLocales, + global: null, + operation: 'update', + req, + skipValidation: shouldSaveDraft || data._status === 'draft', + }) + } + // ///////////////////////////////////// // Handle potential password update // ///////////////////////////////////// @@ -307,11 +342,12 @@ export const updateByIDOperation = async ( autosave, collection: collectionConfig, docWithLocales: { - ...result, + ...versionResult, createdAt: docWithLocales.createdAt, }, - draft: shouldSaveDraft, + draft: publishSpecificLocale ? true : shouldSaveDraft, payload, + publishSpecificLocale, req, }) } diff --git a/packages/payload/src/fields/hooks/beforeChange/index.ts b/packages/payload/src/fields/hooks/beforeChange/index.ts index b8f47c03391..77e502b6e78 100644 --- a/packages/payload/src/fields/hooks/beforeChange/index.ts +++ b/packages/payload/src/fields/hooks/beforeChange/index.ts @@ -16,6 +16,8 @@ type Args = { global: SanitizedGlobalConfig | null id?: number | string operation: Operation + publishSpecificLocale?: string + publishedDocWithLocales?: JsonObject req: PayloadRequest skipValidation?: boolean } @@ -39,6 +41,8 @@ export const beforeChange = async ({ duplicate = false, global, operation, + publishSpecificLocale, + publishedDocWithLocales, req, skipValidation, }: Args): Promise => { @@ -64,7 +68,7 @@ export const beforeChange = async ({ schemaPath: [], siblingData: data, siblingDoc: doc, - siblingDocWithLocales: docWithLocales, + siblingDocWithLocales: publishSpecificLocale ? publishedDocWithLocales : docWithLocales, skipValidation, }) diff --git a/packages/payload/src/globals/operations/update.ts b/packages/payload/src/globals/operations/update.ts index d02f77713ce..9ea0ea4d8d5 100644 --- a/packages/payload/src/globals/operations/update.ts +++ b/packages/payload/src/globals/operations/update.ts @@ -49,6 +49,7 @@ export const updateOperation = async ( let { data } = args const shouldSaveDraft = Boolean(draftArg && globalConfig.versions?.drafts) + const publishSpecificLocale = req.query?.publishSpecificLocale // ///////////////////////////////////// // 1. Retrieve and execute access @@ -78,6 +79,7 @@ export const updateOperation = async ( config: globalConfig, locale, payload, + published: publishSpecificLocale !== undefined ? true : false, req, where: query, }) diff --git a/packages/payload/src/versions/getLatestCollectionVersion.ts b/packages/payload/src/versions/getLatestCollectionVersion.ts index c68017a481c..ef91a348e57 100644 --- a/packages/payload/src/versions/getLatestCollectionVersion.ts +++ b/packages/payload/src/versions/getLatestCollectionVersion.ts @@ -9,6 +9,7 @@ type Args = { config: SanitizedCollectionConfig id: number | string payload: Payload + published?: boolean query: FindOneArgs req?: PayloadRequest } diff --git a/packages/payload/src/versions/getLatestGlobalVersion.ts b/packages/payload/src/versions/getLatestGlobalVersion.ts index 42303c0595e..b9bb9696411 100644 --- a/packages/payload/src/versions/getLatestGlobalVersion.ts +++ b/packages/payload/src/versions/getLatestGlobalVersion.ts @@ -7,6 +7,7 @@ type Args = { config: SanitizedGlobalConfig locale?: string payload: Payload + published?: boolean req?: PayloadRequest slug: string where: Where @@ -17,11 +18,14 @@ export const getLatestGlobalVersion = async ({ config, locale, payload, + published, req, where, }: Args): Promise<{ global: Document; globalExists: boolean }> => { let latestVersion + const whereQuery = published ? { 'version._status': { equals: 'published' } } : {} + if (config.versions?.drafts) { latestVersion = ( await payload.db.findGlobalVersions({ @@ -31,6 +35,7 @@ export const getLatestGlobalVersion = async ({ pagination: false, req, sort: '-updatedAt', + where: whereQuery, }) ).docs[0] } diff --git a/packages/payload/src/versions/saveVersion.ts b/packages/payload/src/versions/saveVersion.ts index d6635c75919..d857b7c240b 100644 --- a/packages/payload/src/versions/saveVersion.ts +++ b/packages/payload/src/versions/saveVersion.ts @@ -15,6 +15,7 @@ type Args = { global?: SanitizedGlobalConfig id?: number | string payload: Payload + publishSpecificLocale?: string req?: PayloadRequest } @@ -26,6 +27,7 @@ export const saveVersion = async ({ draft, global, payload, + publishSpecificLocale, req, }: Args): Promise => { let result @@ -71,7 +73,10 @@ export const saveVersion = async ({ const data: Record = { createdAt: new Date(latestVersion.createdAt).toISOString(), updatedAt: draft ? now : new Date(doc.updatedAt).toISOString(), - version: versionData, + version: { + ...versionData, + publishedLocale: publishSpecificLocale, + }, } const updateVersionArgs = { diff --git a/packages/ui/src/elements/Button/index.scss b/packages/ui/src/elements/Button/index.scss index 0b3bbae4380..1b50798265a 100644 --- a/packages/ui/src/elements/Button/index.scss +++ b/packages/ui/src/elements/Button/index.scss @@ -47,6 +47,10 @@ a.btn { } } + &__wrap { + display: flex; + } + &--has-tooltip { position: relative; } @@ -127,6 +131,11 @@ a.btn { } } + &--has-secondary-actions { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + &--style-primary { background: var(--theme-elevation-800); color: var(--theme-elevation-0); @@ -184,6 +193,40 @@ a.btn { padding: 0; } + &__chevron { + @include color-svg(currentColor); + border-radius: $style-radius-m; + border-left: 1px solid var(--theme-bg) !important; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + align-items: center; + + .icon { + vertical-align: middle; + + & path { + stroke-width: 1px; + } + } + + &--disabled { + .popup__trigger-wrap { + display: none; + } + } + + &--open { + .icon { + transform: rotate(180deg); + } + } + + &:focus:not(:focus-visible) { + box-shadow: none; + background: var(--theme-elevation-700); + } + } + &:focus:not(:focus-visible) { .btn__icon { @include color-svg(var(--theme-elevation-800)); diff --git a/packages/ui/src/elements/Button/index.tsx b/packages/ui/src/elements/Button/index.tsx index 9c851a599f6..8466bd8e146 100644 --- a/packages/ui/src/elements/Button/index.tsx +++ b/packages/ui/src/elements/Button/index.tsx @@ -1,4 +1,5 @@ 'use client' +import { Popup } from '@payloadcms/ui' import React, { Fragment, forwardRef, isValidElement } from 'react' import type { Props } from './types.js' @@ -9,6 +10,7 @@ import { LinkIcon } from '../../icons/Link/index.js' import { PlusIcon } from '../../icons/Plus/index.js' import { SwapIcon } from '../../icons/Swap/index.js' import { XIcon } from '../../icons/X/index.js' +import { ButtonGroup, Button as PopupButton } from '../Popup/PopupButtonList/index.js' import { Tooltip } from '../Tooltip/index.js' import './index.scss' @@ -46,6 +48,46 @@ export const ButtonContents = ({ children, icon, showTooltip, tooltip }) => { ) } +const SecondaryActions = ({ className, disabled, secondaryActions }) => { + const [showSecondaryActions, setShowSecondaryActions] = React.useState(false) + const multipleActions = secondaryActions.length >= 1 + + React.useEffect(() => { + if (disabled) setShowSecondaryActions(false) + }, [disabled]) + + return ( + } + buttonClassName={[ + className && className, + `${baseClass}__chevron`, + showSecondaryActions && `${baseClass}__chevron--open`, + ] + .filter(Boolean) + .join(' ')} + className={disabled ? `${baseClass}--popup-disabled` : ''} + disabled={disabled} + horizontalAlign="right" + onToggleOpen={(active) => (!disabled ? setShowSecondaryActions(active) : undefined)} + size="large" + verticalAlign="bottom" + > + + {multipleActions ? ( + secondaryActions.map((action, i) => ( + + {action.label} + + )) + ) : ( + {secondaryActions.label} + )} + + + ) +} + export const Button = forwardRef((props, ref) => { const { id, @@ -63,6 +105,7 @@ export const Button = forwardRef(( newTab, onClick, round, + secondaryActions, size = 'medium', to, tooltip, @@ -83,6 +126,7 @@ export const Button = forwardRef(( size && `${baseClass}--size-${size}`, icon && iconPosition && `${baseClass}--icon-position-${iconPosition}`, tooltip && `${baseClass}--has-tooltip`, + secondaryActions && `${baseClass}--has-secondary-actions`, ] .filter(Boolean) .join(' ') @@ -107,6 +151,8 @@ export const Button = forwardRef(( target: newTab ? '_blank' : undefined, } + let buttonElement + switch (el) { case 'link': if (!Link) { @@ -114,32 +160,44 @@ export const Button = forwardRef(( return null } - return ( + buttonElement = ( {children} ) + break case 'anchor': - return ( + buttonElement = ( }> {children} ) + break default: const Tag = el // eslint-disable-line no-case-declarations - return ( + buttonElement = ( {children} ) + break } + if (secondaryActions) + return ( +
+ {buttonElement} + +
+ ) + + return buttonElement }) diff --git a/packages/ui/src/elements/Button/types.ts b/packages/ui/src/elements/Button/types.ts index 65835432e05..fc55c426b4d 100644 --- a/packages/ui/src/elements/Button/types.ts +++ b/packages/ui/src/elements/Button/types.ts @@ -1,6 +1,10 @@ import type { ElementType, MouseEvent } from 'react' import type React from 'react' +type secondaryAction = { + label: string + onClick: (event: MouseEvent) => void +} export type Props = { Link?: React.ElementType 'aria-label'?: string @@ -17,6 +21,7 @@ export type Props = { newTab?: boolean onClick?: (event: MouseEvent) => void round?: boolean + secondaryActions?: secondaryAction | secondaryAction[] size?: 'large' | 'medium' | 'small' to?: string tooltip?: string diff --git a/packages/ui/src/elements/Popup/PopupTrigger/index.tsx b/packages/ui/src/elements/Popup/PopupTrigger/index.tsx index 85e6b9d2ea5..d08461939c4 100644 --- a/packages/ui/src/elements/Popup/PopupTrigger/index.tsx +++ b/packages/ui/src/elements/Popup/PopupTrigger/index.tsx @@ -10,11 +10,12 @@ export type PopupTriggerProps = { button: React.ReactNode buttonType: 'custom' | 'default' | 'none' className?: string + disabled setActive: (active: boolean) => void } export const PopupTrigger: React.FC = (props) => { - const { active, button, buttonType, className, setActive } = props + const { active, button, buttonType, className, disabled, setActive } = props const classes = [baseClass, className, `${baseClass}--${buttonType}`].filter(Boolean).join(' ') @@ -43,7 +44,13 @@ export const PopupTrigger: React.FC = (props) => { } return ( - ) diff --git a/packages/ui/src/elements/Popup/index.tsx b/packages/ui/src/elements/Popup/index.tsx index dcbf5d4d7b2..3d9503f2ba4 100644 --- a/packages/ui/src/elements/Popup/index.tsx +++ b/packages/ui/src/elements/Popup/index.tsx @@ -21,6 +21,7 @@ export type PopupProps = { caret?: boolean children?: React.ReactNode className?: string + disabled?: boolean forceOpen?: boolean horizontalAlign?: 'center' | 'left' | 'right' initActive?: boolean @@ -41,6 +42,7 @@ export const Popup: React.FC = (props) => { caret = true, children, className, + disabled, forceOpen, horizontalAlign: horizontalAlignFromProps = 'left', initActive = false, @@ -168,12 +170,12 @@ export const Popup: React.FC = (props) => { onMouseLeave={() => setActive(false)} > ) : ( )} diff --git a/packages/ui/src/elements/PublishButton/index.tsx b/packages/ui/src/elements/PublishButton/index.tsx index bbb6894d259..61029451d2c 100644 --- a/packages/ui/src/elements/PublishButton/index.tsx +++ b/packages/ui/src/elements/PublishButton/index.tsx @@ -1,5 +1,6 @@ 'use client' +import { useLocale } from '@payloadcms/ui' import React, { useCallback } from 'react' import { useForm, useFormModified } from '../../forms/Form/context.js' @@ -9,13 +10,16 @@ import { useDocumentInfo } from '../../providers/DocumentInfo/index.js' import { useEditDepth } from '../../providers/EditDepth/index.js' import { useTranslation } from '../../providers/Translation/index.js' -export const DefaultPublishButton: React.FC<{ label?: string }> = ({ label: labelProp }) => { +export const DefaultPublishButton: React.FC<{ + label?: string + publishSpecificLocale?: () => void +}> = ({ label: labelProp, publishSpecificLocale }) => { const { hasPublishPermission, publishedDoc, unpublishedVersions } = useDocumentInfo() const { submit } = useForm() const modified = useFormModified() const editDepth = useEditDepth() - + const { label: localeLabel } = useLocale() const { t } = useTranslation() const label = labelProp || t('version:publishChanges') @@ -46,6 +50,12 @@ export const DefaultPublishButton: React.FC<{ label?: string }> = ({ label: labe buttonId="action-save" disabled={!canPublish} onClick={publish} + secondaryActions={[ + { + label: `Publish ${localeLabel} only`, + onClick: publishSpecificLocale, + }, + ]} size="medium" type="button" > From fd270a4e38c3dc1cc59e7f9ee8de2233c75f600c Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Thu, 8 Aug 2024 18:04:09 -0400 Subject: [PATCH 011/173] feat: paginate and sort joins --- packages/db-mongodb/src/findOne.ts | 10 ++++-- packages/db-mongodb/src/utilities/setJoins.ts | 32 ++++++++++++----- .../next/src/routes/rest/collections/find.ts | 7 ++-- .../src/routes/rest/collections/findByID.ts | 4 +++ .../rest/utilities/sanitizeJoinParams.ts | 23 ++++++++++++ .../src/collections/operations/find.ts | 5 ++- .../src/collections/operations/findByID.ts | 5 ++- packages/payload/src/database/types.ts | 4 ++- packages/payload/src/types/index.ts | 11 ++++++ test/joins/config.ts | 28 +++++++++++++-- test/joins/int.spec.ts | 35 ++++++++++++------- test/joins/payload-types.ts | 8 +++++ 12 files changed, 143 insertions(+), 29 deletions(-) create mode 100644 packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index dc8d4bbcf2a..2d92b119a9e 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -9,7 +9,7 @@ import { withSession } from './withSession.js' export const findOne: FindOne = async function findOne( this: MongooseAdapter, - { collection, locale, req = {} as PayloadRequest, where }, + { collection, joins, locale, req = {} as PayloadRequest, where }, ) { const Model = this.collections[collection] const options: MongooseQueryOptions = { @@ -29,7 +29,13 @@ export const findOne: FindOne = async function findOne( return null } - let result = await setJoins({ collection, doc, options, payload: this.payload, req }) + let result = await setJoins({ + collection, + doc, + joins, + options, + payload: this.payload, + }) result = JSON.parse(JSON.stringify(result)) diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts index a0a83d8c1ef..b76ac698898 100644 --- a/packages/db-mongodb/src/utilities/setJoins.ts +++ b/packages/db-mongodb/src/utilities/setJoins.ts @@ -1,12 +1,12 @@ import type { MongooseQueryOptions } from 'mongoose' -import type { Document, Payload, PayloadRequest } from 'payload' +import type { Document, JoinQuery, Payload } from 'payload' type Args = { collection: string doc: Document + joins: JoinQuery options: MongooseQueryOptions payload: Payload - req: PayloadRequest } // TODO: pass in queryParam called `joins` to specify the pagination of each join @@ -17,23 +17,37 @@ type Args = { * @param collection * @param doc * @param options + * @param joins, * @param payload - * @param req */ export const setJoins = async ({ collection, doc, + joins = {}, options, payload, - req, }: Args): Promise => { - const joins = payload.collections[collection].joins + const joinConfig = payload.collections[collection].joins await Promise.all( - Object.keys(joins).map(async (slug) => { + Object.keys(joinConfig).map(async (slug) => { const joinModel = payload.db.collections[slug] + const { defaultSort } = payload.collections[slug].config + + for (const join of joinConfig[slug]) { + // get the query options for the join off of req + // TODO: allow disabling the join completely + // if (joins[join.schemaPath] === false || req.query[join.schemaPath] === 'false') { + // continue + // } + + const { limit, page, sort } = { + limit: 10, + page: 1, + sort: defaultSort, + ...(joins[join.schemaPath] ?? {}), + } - for (const join of joins[slug]) { const joinData = await joinModel .find( { [join.field.on]: { $eq: doc._id.toString() } }, @@ -42,7 +56,9 @@ export const setJoins = async ({ }, options, ) - .limit(10) + .sort(sort === 'id' ? '_id' : sort) + .skip((page - 1) * limit) + .limit(limit) // iterate schemaPath and assign to the document const path = join.schemaPath.split('.') diff --git a/packages/next/src/routes/rest/collections/find.ts b/packages/next/src/routes/rest/collections/find.ts index ac38d2de692..4634629bffa 100644 --- a/packages/next/src/routes/rest/collections/find.ts +++ b/packages/next/src/routes/rest/collections/find.ts @@ -1,4 +1,4 @@ -import type { Where } from 'payload' +import type { JoinQuery, Where } from 'payload' import httpStatus from 'http-status' import { findOperation } from 'payload' @@ -7,11 +7,13 @@ import { isNumber } from 'payload/shared' import type { CollectionRouteHandler } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' +import { sanitizeJoinParams } from '../utilities/sanitizeJoinParams.js' export const find: CollectionRouteHandler = async ({ collection, req }) => { - const { depth, draft, limit, page, sort, where } = req.query as { + const { depth, draft, joins, limit, page, sort, where } = req.query as { depth?: string draft?: string + joins?: JoinQuery limit?: string page?: string sort?: string @@ -22,6 +24,7 @@ export const find: CollectionRouteHandler = async ({ collection, req }) => { collection, depth: isNumber(depth) ? Number(depth) : undefined, draft: draft === 'true', + joins: sanitizeJoinParams(joins), limit: isNumber(limit) ? Number(limit) : undefined, page: isNumber(page) ? Number(page) : undefined, req, diff --git a/packages/next/src/routes/rest/collections/findByID.ts b/packages/next/src/routes/rest/collections/findByID.ts index 571738363e2..55eebedd655 100644 --- a/packages/next/src/routes/rest/collections/findByID.ts +++ b/packages/next/src/routes/rest/collections/findByID.ts @@ -1,3 +1,5 @@ +import type { JoinQuery } from 'payload' + import httpStatus from 'http-status' import { findByIDOperation } from 'payload' import { isNumber } from 'payload/shared' @@ -6,6 +8,7 @@ import type { CollectionRouteHandlerWithID } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' +import { sanitizeJoinParams } from '../utilities/sanitizeJoinParams.js' export const findByID: CollectionRouteHandlerWithID = async ({ id: incomingID, @@ -26,6 +29,7 @@ export const findByID: CollectionRouteHandlerWithID = async ({ collection, depth: isNumber(depth) ? Number(depth) : undefined, draft: searchParams.get('draft') === 'true', + joins: sanitizeJoinParams(req.query.joins as JoinQuery), req, }) diff --git a/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts b/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts new file mode 100644 index 00000000000..2bf39b40d2e --- /dev/null +++ b/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts @@ -0,0 +1,23 @@ +import type { JoinQuery } from 'payload' + +import { isNumber } from 'payload/shared' + +/** + * Convert request JoinQuery object from strings to numbers + * @param joins + */ +export const sanitizeJoinParams = ( + joins: { [schemaPath: string]: { limit?: unknown; page?: unknown; sort?: string } } = {}, +): JoinQuery => { + const joinQuery = {} + + Object.keys(joins).forEach((schemaPath) => { + joinQuery[schemaPath] = { + limit: isNumber(joins[schemaPath]?.limit) ? Number(joins[schemaPath].limit) : undefined, + page: isNumber(joins[schemaPath]?.page) ? Number(joins[schemaPath].page) : undefined, + sort: joins[schemaPath]?.sort ? joins[schemaPath].sort : undefined, + } + }) + + return joinQuery +} diff --git a/packages/payload/src/collections/operations/find.ts b/packages/payload/src/collections/operations/find.ts index 294c1b7b149..4dc0f5b7898 100644 --- a/packages/payload/src/collections/operations/find.ts +++ b/packages/payload/src/collections/operations/find.ts @@ -1,6 +1,6 @@ import type { AccessResult } from '../../config/types.js' import type { PaginatedDocs } from '../../database/types.js' -import type { CollectionSlug } from '../../index.js' +import type { CollectionSlug, JoinQuery } from '../../index.js' import type { PayloadRequest, Where } from '../../types/index.js' import type { Collection, DataFromCollectionSlug } from '../config/types.js' @@ -20,6 +20,7 @@ export type Arguments = { depth?: number disableErrors?: boolean draft?: boolean + joins?: JoinQuery limit?: number overrideAccess?: boolean page?: number @@ -60,6 +61,7 @@ export const findOperation = async ( depth, disableErrors, draft: draftsEnabled, + joins, limit, overrideAccess, page, @@ -140,6 +142,7 @@ export const findOperation = async ( result = await payload.db.find>({ collection: collectionConfig.slug, + joins, limit: sanitizedLimit, locale, page: sanitizedPage, diff --git a/packages/payload/src/collections/operations/findByID.ts b/packages/payload/src/collections/operations/findByID.ts index 98ec17f6f49..1682243aee3 100644 --- a/packages/payload/src/collections/operations/findByID.ts +++ b/packages/payload/src/collections/operations/findByID.ts @@ -1,5 +1,5 @@ import type { FindOneArgs } from '../../database/types.js' -import type { CollectionSlug } from '../../index.js' +import type { CollectionSlug, JoinQuery } from '../../index.js' import type { PayloadRequest } from '../../types/index.js' import type { Collection, DataFromCollectionSlug } from '../config/types.js' @@ -18,6 +18,7 @@ export type Arguments = { disableErrors?: boolean draft?: boolean id: number | string + joins?: JoinQuery overrideAccess?: boolean req: PayloadRequest showHiddenFields?: boolean @@ -53,6 +54,7 @@ export const findByIDOperation = async ( depth, disableErrors, draft: draftEnabled = false, + joins, overrideAccess = false, req: { fallbackLocale, locale, t }, req, @@ -72,6 +74,7 @@ export const findByIDOperation = async ( const findOneArgs: FindOneArgs = { collection: collectionConfig.slug, + joins, locale, req: { transactionID: req.transactionID, diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index b0a92ba56e5..9e9bb2c7f12 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -1,5 +1,5 @@ import type { TypeWithID } from '../collections/config/types.js' -import type { Document, Payload, PayloadRequest, Where } from '../types/index.js' +import type { Document, JoinQuery, Payload, PayloadRequest, Where } from '../types/index.js' import type { TypeWithVersion } from '../versions/types.js' export type { TypeWithVersion } @@ -178,6 +178,7 @@ export type QueryDrafts = (args: QueryDraftsArgs) => Promise(args: FindOneArgs) => Promise { + let category: Category // --__--__--__--__--__--__--__--__--__ // Boilerplate test setup/teardown // --__--__--__--__--__--__--__--__--__ @@ -30,16 +32,8 @@ describe('Joins Field Tests', () => { .then((res) => res.json()) token = data.token - }) - - afterAll(async () => { - if (typeof payload.db.destroy === 'function') { - await payload.db.destroy() - } - }) - it('should populate joins', async () => { - const category = await payload.create({ + category = await payload.create({ collection: 'categories', data: { name: 'example', @@ -47,7 +41,7 @@ describe('Joins Field Tests', () => { }, }) - const post1 = await payload.create({ + await payload.create({ collection: 'posts', data: { category: category.id, @@ -57,7 +51,7 @@ describe('Joins Field Tests', () => { title: 'test', }, }) - const post2 = await payload.create({ + await payload.create({ collection: 'posts', data: { category: category.id, @@ -67,7 +61,7 @@ describe('Joins Field Tests', () => { title: 'test', }, }) - const post3 = await payload.create({ + await payload.create({ collection: 'posts', data: { category: category.id, @@ -77,7 +71,15 @@ describe('Joins Field Tests', () => { title: 'test', }, }) + }) + afterAll(async () => { + if (typeof payload.db.destroy === 'function') { + await payload.db.destroy() + } + }) + + it('should populate joins', async () => { const categoryWithPosts = await payload.findByID({ id: category.id, collection: 'categories', @@ -94,4 +96,13 @@ describe('Joins Field Tests', () => { expect(joinedIDs).toContain(categoryWithPosts.group.posts[1].id) expect(joinedIDs).toContain(categoryWithPosts.group.posts[2].id) }) + + describe('REST', () => { + it('should paginate joins', async () => { + const response = await restClient + .GET(`/categories/${category.id}?joins[posts][limit]=1`) + .then((res) => res.json()) + expect(response.posts).toHaveLength(1) + }) + }) }) diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 476562debe9..8a141566e05 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -29,6 +29,7 @@ export interface Config { export interface UserAuthOperations { forgotPassword: { email: string; + password: string; }; login: { email: string; @@ -40,6 +41,7 @@ export interface UserAuthOperations { }; unlock: { email: string; + password: string; }; } /** @@ -50,6 +52,9 @@ export interface Post { id: string; title?: string | null; category?: (string | null) | Category; + group?: { + category?: (string | null) | Category; + }; updatedAt: string; createdAt: string; } @@ -61,6 +66,9 @@ export interface Category { id: string; name?: string | null; posts?: (string | Post)[] | null; + group?: { + posts?: (string | Post)[] | null; + }; updatedAt: string; createdAt: string; } From caba54a439848593aaea158d5a6fa28ed5cbcce0 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 9 Aug 2024 14:01:35 -0400 Subject: [PATCH 012/173] feat(db-mongodb): add joins to find function --- packages/db-mongodb/src/find.ts | 33 +++++++++++++++- packages/db-mongodb/src/findOne.ts | 4 +- packages/db-mongodb/src/utilities/setJoins.ts | 11 ++---- packages/db-mongodb/src/withSession.ts | 2 +- test/joins/int.spec.ts | 38 ++++++++++++++++--- 5 files changed, 71 insertions(+), 17 deletions(-) diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index 450414fb103..c24606959bd 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -7,11 +7,22 @@ import type { MongooseAdapter } from './index.js' import { buildSortParam } from './queries/buildSortParam.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' +import { setJoins } from './utilities/setJoins.js' import { withSession } from './withSession.js' export const find: Find = async function find( this: MongooseAdapter, - { collection, limit, locale, page, pagination, req = {} as PayloadRequest, sort: sortArg, where }, + { + collection, + joins, + limit, + locale, + page, + pagination, + req = {} as PayloadRequest, + sort: sortArg, + where, + }, ) { const Model = this.collections[collection] const collectionConfig = this.payload.collections[collection].config @@ -89,6 +100,26 @@ export const find: Find = async function find( } const result = await Model.paginate(query, paginationOptions) + + const joinPromises = [] + + result.docs.forEach((doc) => { + joinPromises.push( + setJoins({ + collection, + doc, + joins, + options: { + lean: true, + session: options.session, + }, + payload: this.payload, + }), + ) + }) + + await Promise.all(joinPromises) + const docs = JSON.parse(JSON.stringify(result.docs)) return { diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index 2d92b119a9e..959649613ac 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -1,4 +1,4 @@ -import type { MongooseQueryOptions } from 'mongoose' +import type { QueryOptions } from 'mongoose' import type { FindOne, PayloadRequest } from 'payload' import type { MongooseAdapter } from './index.js' @@ -12,7 +12,7 @@ export const findOne: FindOne = async function findOne( { collection, joins, locale, req = {} as PayloadRequest, where }, ) { const Model = this.collections[collection] - const options: MongooseQueryOptions = { + const options: QueryOptions = { ...(await withSession(this, req)), lean: true, } diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts index b76ac698898..e653879af41 100644 --- a/packages/db-mongodb/src/utilities/setJoins.ts +++ b/packages/db-mongodb/src/utilities/setJoins.ts @@ -1,23 +1,20 @@ -import type { MongooseQueryOptions } from 'mongoose' +import type { QueryOptions } from 'mongoose' import type { Document, JoinQuery, Payload } from 'payload' type Args = { collection: string doc: Document joins: JoinQuery - options: MongooseQueryOptions + options: QueryOptions payload: Payload } -// TODO: pass in queryParam called `joins` to specify the pagination of each join -// joins[schemaPath][page]=2&joins[schemaPath][limit]=100 - /** - * // fetch docs and add to the keys by path + * // fetch docs and add to the keys by path, mutating and returning the doc * @param collection * @param doc - * @param options * @param joins, + * @param options * @param payload */ export const setJoins = async ({ diff --git a/packages/db-mongodb/src/withSession.ts b/packages/db-mongodb/src/withSession.ts index 51d7054a5c2..263a59d8955 100644 --- a/packages/db-mongodb/src/withSession.ts +++ b/packages/db-mongodb/src/withSession.ts @@ -10,7 +10,7 @@ import type { MongooseAdapter } from './index.js' export async function withSession( db: MongooseAdapter, req: PayloadRequest, -): Promise<{ session: ClientSession } | object> { +): Promise<{ session: ClientSession } | Record> { let transactionID = req.transactionID if (transactionID instanceof Promise) { diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index 02c686d4252..df9111e9348 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -48,7 +48,7 @@ describe('Joins Field Tests', () => { group: { category: category.id, }, - title: 'test', + title: 'test a', }, }) await payload.create({ @@ -58,7 +58,7 @@ describe('Joins Field Tests', () => { group: { category: category.id, }, - title: 'test', + title: 'test b', }, }) await payload.create({ @@ -68,7 +68,7 @@ describe('Joins Field Tests', () => { group: { category: category.id, }, - title: 'test', + title: 'test c', }, }) }) @@ -79,7 +79,7 @@ describe('Joins Field Tests', () => { } }) - it('should populate joins', async () => { + it('should populate joins using findByID', async () => { const categoryWithPosts = await payload.findByID({ id: category.id, collection: 'categories', @@ -91,7 +91,26 @@ describe('Joins Field Tests', () => { expect(categoryWithPosts.group.posts).toHaveLength(3) expect(categoryWithPosts.group.posts[0]).toHaveProperty('title') - expect(categoryWithPosts.group.posts[0].title).toBe('test') + expect(categoryWithPosts.group.posts[0].title).toBe('test a') + expect(joinedIDs).toContain(categoryWithPosts.group.posts[0].id) + expect(joinedIDs).toContain(categoryWithPosts.group.posts[1].id) + expect(joinedIDs).toContain(categoryWithPosts.group.posts[2].id) + }) + + it('should populate joins using find', async () => { + const result = await payload.find({ + collection: 'categories', + }) + + const [categoryWithPosts] = result.docs + + expect(Array.isArray(categoryWithPosts.group.posts)).toBeDefined() + expect(Array.isArray(categoryWithPosts.posts)).toBeDefined() + const joinedIDs = categoryWithPosts.group.posts.map((post) => post.id) + + expect(categoryWithPosts.group.posts).toHaveLength(3) + expect(categoryWithPosts.group.posts[0]).toHaveProperty('title') + expect(categoryWithPosts.group.posts[0].title).toBe('test a') expect(joinedIDs).toContain(categoryWithPosts.group.posts[0].id) expect(joinedIDs).toContain(categoryWithPosts.group.posts[1].id) expect(joinedIDs).toContain(categoryWithPosts.group.posts[2].id) @@ -100,9 +119,16 @@ describe('Joins Field Tests', () => { describe('REST', () => { it('should paginate joins', async () => { const response = await restClient - .GET(`/categories/${category.id}?joins[posts][limit]=1`) + .GET(`/categories/${category.id}?joins[posts][limit]=1[page]=2`) .then((res) => res.json()) expect(response.posts).toHaveLength(1) + expect(response.posts[0].title).toStrictEqual('test b') + }) + it('should sort joins', async () => { + const response = await restClient + .GET(`/categories/${category.id}?joins[posts][sort]=-title`) + .then((res) => res.json()) + expect(response.posts[0].title).toStrictEqual('test c') }) }) }) From 02bdcd1321508e282a85ee7e3cf807b3a5e018c9 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 9 Aug 2024 14:43:34 -0400 Subject: [PATCH 013/173] chore: add joins to sanitized collection config --- packages/db-mongodb/src/utilities/setJoins.ts | 4 +- .../payload/src/collections/config/client.ts | 13 +++++- .../src/collections/config/sanitize.ts | 11 ++++- .../payload/src/collections/config/types.ts | 34 ++++++++------- .../payload/src/fields/config/sanitize.ts | 42 ++++++++++++++++--- packages/payload/src/index.ts | 26 ++---------- .../payload/src/utilities/traverseFields.ts | 14 ++++--- 7 files changed, 92 insertions(+), 52 deletions(-) diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts index e653879af41..67dd70c139d 100644 --- a/packages/db-mongodb/src/utilities/setJoins.ts +++ b/packages/db-mongodb/src/utilities/setJoins.ts @@ -24,7 +24,9 @@ export const setJoins = async ({ options, payload, }: Args): Promise => { - const joinConfig = payload.collections[collection].joins + // TODO: allow disabling of joining at the top level using `joins: false` or `?joins=false` + // if (joins === false) return doc + const joinConfig = payload.collections[collection].config.joins await Promise.all( Object.keys(joinConfig).map(async (slug) => { diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index ef0014990ee..e54cb276e39 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -25,7 +25,7 @@ import type { TFunction } from '@payloadcms/translations' import type { ClientFieldConfig } from '../../fields/config/client.js' import type { SanitizedCollectionConfig } from './types.js' -import { createClientFieldConfigs } from '../../fields/config/client.js' +import { createClientFieldConfig, createClientFieldConfigs } from '../../fields/config/client.js' export const createClientCollectionConfig = ({ collection, @@ -53,6 +53,17 @@ export const createClientCollectionConfig = ({ } }) + if ('joins' in sanitized && typeof sanitized.joins === 'object') { + const sanitizedJoins = {} + Object.keys(sanitized.joins).forEach((slug) => { + sanitizedJoins[slug] = sanitized.joins[slug].map((join) => ({ + ...join, + field: createClientFieldConfig({ field: join.field, t }), + })) + }) + sanitized.joins = sanitizedJoins + } + if ('upload' in sanitized && typeof sanitized.upload === 'object') { sanitized.upload = { ...sanitized.upload } delete sanitized.upload.handlers diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index 0ef10451554..d885885e8be 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -1,6 +1,6 @@ import type { LoginWithUsernameOptions } from '../../auth/types.js' import type { Config, SanitizedConfig } from '../../config/types.js' -import type { CollectionConfig, SanitizedCollectionConfig } from './types.js' +import type { CollectionConfig, SanitizedCollectionConfig, SanitizedJoins } from './types.js' import { getBaseAuthFields } from '../../auth/getAuthFields.js' import { TimestampsRequired } from '../../errors/TimestampsRequired.js' @@ -35,11 +35,14 @@ export const sanitizeCollection = async ( // ///////////////////////////////// const validRelationships = config.collections.map((c) => c.slug) || [] + const joins: SanitizedJoins = {} sanitized.fields = await sanitizeFields({ collectionConfig: sanitized, config, fields: sanitized.fields, + joins, richTextSanitizationPromises, + schemaPath: '', validRelationships, }) @@ -176,5 +179,9 @@ export const sanitizeCollection = async ( sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth)) } - return sanitized as SanitizedCollectionConfig + const sanitizedConfig = sanitized as SanitizedCollectionConfig + + sanitizedConfig.joins = joins + + return sanitizedConfig } diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index ffec1263267..b2e096d71ee 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -474,6 +474,21 @@ export type CollectionConfig = { versions?: IncomingCollectionVersions | boolean } +export type SanitizedJoin = { + /** + * The field configuration defining the join + */ + field: JoinField + /** + * The schemaPath of the join field in dot notation + */ + schemaPath: string +} + +export type SanitizedJoins = { + [collectionSlug: string]: SanitizedJoin[] +} + export interface SanitizedCollectionConfig extends Omit< DeepRequired, @@ -482,6 +497,10 @@ export interface SanitizedCollectionConfig auth: Auth endpoints: Endpoint[] | false fields: Field[] + /** + * Object of collections to join 'Join Fields object keyed by collection + */ + joins?: SanitizedJoins upload: SanitizedUploadConfig versions: SanitizedCollectionVersions } @@ -499,21 +518,6 @@ export type Collection = { versionType: GraphQLObjectType whereInputType: GraphQLInputObjectType } - /** - * Object of collections to join 'Join Fields object keyed by collection - */ - joins?: { - [collectionSlug: string]: { - /** - * The field configuration defining the join - */ - field: JoinField - /** - * The schemaPath of the join field in dot notation - */ - schemaPath: string - }[] - } } export type BulkOperationResult = { diff --git a/packages/payload/src/fields/config/sanitize.ts b/packages/payload/src/fields/config/sanitize.ts index 1425e377662..5ee53cee5f4 100644 --- a/packages/payload/src/fields/config/sanitize.ts +++ b/packages/payload/src/fields/config/sanitize.ts @@ -1,14 +1,15 @@ import { deepMergeSimple } from '@payloadcms/translations/utilities' -import type { CollectionConfig } from '../../collections/config/types.js' +import type { CollectionConfig, SanitizedJoins } from '../../collections/config/types.js' import type { Config, SanitizedConfig } from '../../config/types.js' import type { Field } from './types.js' -import { MissingEditorProp } from '../../errors/MissingEditorProp.js' import { + APIError, DuplicateFieldName, InvalidFieldName, InvalidFieldRelationship, + MissingEditorProp, MissingFieldType, } from '../../errors/index.js' import { formatLabels, toWords } from '../../utilities/formatLabels.js' @@ -23,6 +24,7 @@ type Args = { config: Config existingFieldNames?: Set fields: Field[] + joins?: SanitizedJoins /** * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present. * @@ -34,7 +36,7 @@ type Args = { * so that you can sanitize them together, after the config has been sanitized. */ richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise> - + schemaPath?: string /** * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array. * This validation will be skipped if validRelationships is null. @@ -47,12 +49,16 @@ export const sanitizeFields = async ({ config, existingFieldNames = new Set(), fields, + joins, requireFieldLevelRichTextEditor = false, richTextSanitizationPromises, + schemaPath: schemaPathArg, validRelationships, }: Args): Promise => { if (!fields) return [] + let schemaPath = schemaPathArg + for (let i = 0; i < fields.length; i++) { const field = fields[i] @@ -83,6 +89,22 @@ export const sanitizeFields = async ({ field.defaultValue = false } + if (field.type === 'join') { + if (typeof joins === 'undefined') { + throw new APIError( + 'Join fields cannot be added to arrays or blocks to avoid duplicate data.', + ) + } + const join = { + field, + schemaPath: `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}`, + } + if (!joins[field.collection]) { + joins[field.collection] = [join] + } else { + joins[field.collection].push(join) + } + } if (field.type === 'relationship' || field.type === 'upload') { if (validRelationships) { const relationships = Array.isArray(field.relationTo) @@ -187,12 +209,17 @@ export const sanitizeFields = async ({ } if ('fields' in field && field.fields) { + if ('name' in field && field.name) { + schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}` + } field.fields = await sanitizeFields({ config, existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames, fields: field.fields, + joins, requireFieldLevelRichTextEditor, richTextSanitizationPromises, + schemaPath, validRelationships, }) } @@ -200,16 +227,21 @@ export const sanitizeFields = async ({ if (field.type === 'tabs') { for (let j = 0; j < field.tabs.length; j++) { const tab = field.tabs[j] - if (tabHasName(tab) && typeof tab.label === 'undefined') { - tab.label = toWords(tab.name) + if (tabHasName(tab)) { + schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${tab.name}` + if (typeof tab.label === 'undefined') { + tab.label = toWords(tab.name) + } } tab.fields = await sanitizeFields({ config, existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames, fields: tab.fields, + joins, requireFieldLevelRichTextEditor, richTextSanitizationPromises, + schemaPath, validRelationships, }) field.tabs[j] = tab diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index 91dc7af4e19..a412f9c96e1 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -60,10 +60,9 @@ import { APIKeyAuthentication } from './auth/strategies/apiKey.js' import { JWTAuthentication } from './auth/strategies/jwt.js' import localOperations from './collections/operations/local/index.js' import { consoleEmailAdapter } from './email/consoleEmailAdapter.js' -import { fieldAffectsData, fieldHasSubFields } from './fields/config/types.js' +import { fieldAffectsData } from './fields/config/types.js' import localGlobalOperations from './globals/operations/local/index.js' import { getDependencies } from './utilities/dependencies/getDependencies.js' -import flattenFields from './utilities/flattenTopLevelFields.js' import { getLogger } from './utilities/logger.js' import { serverInit as serverInitTelemetry } from './utilities/telemetry/events/serverInit.js' import { traverseFields } from './utilities/traverseFields.js' @@ -500,33 +499,15 @@ export class BasePayload { config: this.config.globals, } - // TODO: move to sanitize to reduce looping of collections + fields this.config.collections.forEach((collection) => { - const joins = {} let customIDType - const callback = (field: ClientFieldConfig | Field, ref, parentRef) => { + const callback = (field: ClientFieldConfig | Field) => { if (!fieldAffectsData(field)) { return } if (field.name === 'id') { customIDType = field.type - return - } - if (fieldHasSubFields(field)) { - const parentPath = parentRef.schemaPath || '' - ref.schemaPath = `${parentPath}${parentPath ? '.' : ''}${field.name}` - return - } - if (field.type === 'join') { - const join = { - field, - schemaPath: `${ref.schemaPath || ''}${ref.schemaPath ? '.' : ''}${field.name}`, - } - if (!joins[field.collection]) { - joins[field.collection] = [join] - } else { - joins[field.collection].push(join) - } + return true } } @@ -535,7 +516,6 @@ export class BasePayload { this.collections[collection.slug] = { config: collection, customIDType, - joins, } }) diff --git a/packages/payload/src/utilities/traverseFields.ts b/packages/payload/src/utilities/traverseFields.ts index 81d188639f5..40fe515fd91 100644 --- a/packages/payload/src/utilities/traverseFields.ts +++ b/packages/payload/src/utilities/traverseFields.ts @@ -11,24 +11,26 @@ type Ref = { * Iterate a recurse an array of fields, calling a callback for each field * * @param fields - * @param callback callback called for each field + * @param callback callback called for each field, discontinue looping if callback returns truthy * @param ref * @param parentRef */ export const traverseFields = ( fields: (ClientFieldConfig | Field)[], - callback?: (field: ClientFieldConfig | Field, ref: Ref, parentRef: Ref) => void, + callback?: (field: ClientFieldConfig | Field, ref: Ref, parentRef: Ref) => boolean | void, ref: Ref = {}, parentRef: Ref = {}, ): void => { - fields.forEach((field) => { + fields.some((field) => { if (fieldHasSubFields(field)) { const parentRef = ref if ('name' in field && field.name) { ref[field.name] = {} ref = ref[field.name] } - if (callback) callback(field, ref, parentRef) + if (callback && callback(field, ref, parentRef)) { + return true + } traverseFields(field.fields, callback, ref, parentRef) } @@ -41,6 +43,8 @@ export const traverseFields = ( traverseFields(tab.fields, callback, ref, parentRef) }) } - callback(field, ref, parentRef) + if (callback && callback(field, ref, parentRef)) { + return true + } }) } From 99cdabcea5ac223a8fe994e9168a4fc6892bfb51 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 14 Aug 2024 15:29:41 -0400 Subject: [PATCH 014/173] chore: scaffold client components --- packages/payload/src/admin/fields/Join.ts | 9 ++++----- packages/payload/src/collections/config/client.ts | 4 ++-- packages/payload/src/collections/config/types.ts | 2 +- packages/payload/src/fields/config/types.ts | 7 +++++++ packages/payload/src/index.ts | 1 + packages/ui/src/fields/Join/index.tsx | 12 +++++------- .../Config/createClientConfig/collections.tsx | 1 + .../providers/Config/createClientConfig/fields.tsx | 4 ++++ 8 files changed, 25 insertions(+), 15 deletions(-) diff --git a/packages/payload/src/admin/fields/Join.ts b/packages/payload/src/admin/fields/Join.ts index cf6e648a70c..50bb33b0658 100644 --- a/packages/payload/src/admin/fields/Join.ts +++ b/packages/payload/src/admin/fields/Join.ts @@ -1,12 +1,11 @@ +import type { MarkOptional } from 'ts-essentials' + +import type { JoinFieldClient } from '../../fields/config/types.js' import type { ErrorComponent } from '../forms/Error.js' import type { DescriptionComponent, FormFieldBase, LabelComponent } from '../types.js' export type JoinFieldProps = { - disableModifyingForm?: false - forceUsePathFromProps?: boolean - name?: string - path?: string - value?: unknown + readonly field: MarkOptional } & FormFieldBase export type JoinFieldLabelComponent = LabelComponent<'join'> diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index 78ca5164845..a845d29d3ad 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -6,7 +6,7 @@ import type { SanitizedCollectionConfig } from './types.js' export type ServerOnlyCollectionProperties = keyof Pick< SanitizedCollectionConfig, - 'access' | 'custom' | 'endpoints' | 'hooks' + 'access' | 'custom' | 'endpoints' | 'hooks' | 'joins' > export type ServerOnlyCollectionAdminProperties = keyof Pick< @@ -50,7 +50,7 @@ export type ClientCollectionConfig = { livePreview?: Omit } & Omit< SanitizedCollectionConfig['admin'], - 'components' | 'description' | 'livePreview' | ServerOnlyCollectionAdminProperties + 'components' | 'description' | 'joins' | 'livePreview' | ServerOnlyCollectionAdminProperties > fields: ClientField[] } & Omit diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 57d15a4ea2c..29a1b2393b9 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -499,7 +499,7 @@ export interface SanitizedCollectionConfig /** * Object of collections to join 'Join Fields object keyed by collection */ - joins?: SanitizedJoins + joins: SanitizedJoins upload: SanitizedUploadConfig versions: SanitizedCollectionVersions } diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index f0a2a95aedf..d6fcc9393d4 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -1237,6 +1237,11 @@ export type JoinField = { type: 'join' } & FieldBase +export type JoinFieldClient = { + admin?: AdminClient & Pick +} & FieldBaseClient +& Pick + export type Field = | ArrayField | BlockField @@ -1271,6 +1276,7 @@ export type ClientField = | EmailFieldClient | GroupFieldClient | JSONFieldClient + | JoinFieldClient | NumberFieldClient | PointFieldClient | RadioFieldClient @@ -1318,6 +1324,7 @@ export type FieldAffectingDataClient = | EmailFieldClient | GroupFieldClient | JSONFieldClient + | JoinFieldClient | NumberFieldClient | PointFieldClient | RadioFieldClient diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index 7308cbd2399..b4ae5696a1c 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -923,6 +923,7 @@ export type { JSONField, JSONFieldClient, JoinField, + JoinFieldClient, Labels, LabelsClient, NamedTab, diff --git a/packages/ui/src/fields/Join/index.tsx b/packages/ui/src/fields/Join/index.tsx index 71884495b01..fcdb4dcdc60 100644 --- a/packages/ui/src/fields/Join/index.tsx +++ b/packages/ui/src/fields/Join/index.tsx @@ -10,19 +10,17 @@ import { withCondition } from '../../forms/withCondition/index.js' const JoinFieldComponent: React.FC = (props) => { const { - name, - disableModifyingForm = true, - forceUsePathFromProps, - path: pathFromProps, - value: valueFromProps, + field: { name, _path: pathFromProps, collection, on }, } = props - const { path: pathFromContext } = useFieldProps() + const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps() const { path, value } = useField({ - path: (!forceUsePathFromProps ? pathFromContext : null) || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, }) + console.log(props) + // TODO: replace hidden placeholder with the actual edit component return ( Date: Thu, 15 Aug 2024 10:29:02 -0400 Subject: [PATCH 015/173] poc --- .../ui/src/elements/ListControls/index.tsx | 2 +- packages/ui/src/elements/Table/index.scss | 4 + .../ui/src/elements/TableColumns/index.tsx | 4 +- .../collections/Posts/TableField/MyTable.tsx | 31 ++++++ .../collections/Posts/TableField/index.scss | 10 ++ .../collections/Posts/TableField/index.tsx | 97 +++++++++++++++++++ test/_community/collections/Posts/index.ts | 48 +-------- test/_community/payload-types.ts | 32 ------ 8 files changed, 147 insertions(+), 81 deletions(-) create mode 100644 test/_community/collections/Posts/TableField/MyTable.tsx create mode 100644 test/_community/collections/Posts/TableField/index.scss create mode 100644 test/_community/collections/Posts/TableField/index.tsx diff --git a/packages/ui/src/elements/ListControls/index.tsx b/packages/ui/src/elements/ListControls/index.tsx index 956b96e10a9..4a92e7bf456 100644 --- a/packages/ui/src/elements/ListControls/index.tsx +++ b/packages/ui/src/elements/ListControls/index.tsx @@ -131,7 +131,7 @@ export const ListControls: React.FC = (props) => {
{ return void handleSearchChange(search) }} diff --git a/packages/ui/src/elements/Table/index.scss b/packages/ui/src/elements/Table/index.scss index 45add9832b6..b5db66db433 100644 --- a/packages/ui/src/elements/Table/index.scss +++ b/packages/ui/src/elements/Table/index.scss @@ -5,6 +5,10 @@ overflow: auto; max-width: 100%; + table { + min-width: 100%; + } + thead { color: var(--theme-elevation-400); diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index e82fafa5672..67652eb9ff9 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -48,9 +48,7 @@ export const TableColumnsProvider: React.FC = ({ config: { collections }, } = useConfig() - const collectionConfig = collections.find( - (collectionConfig) => collectionConfig.slug === collectionSlug, - ) + const collectionConfig = collections.find((c) => c.slug === collectionSlug) const { admin: { defaultColumns, useAsTitle }, diff --git a/test/_community/collections/Posts/TableField/MyTable.tsx b/test/_community/collections/Posts/TableField/MyTable.tsx new file mode 100644 index 00000000000..0f0ee869be4 --- /dev/null +++ b/test/_community/collections/Posts/TableField/MyTable.tsx @@ -0,0 +1,31 @@ +'use client' + +import type { ClientCollectionConfig } from 'payload' + +import { Table, useListQuery } from '@payloadcms/ui' +import React from 'react' + +type RelationshipTableComponentProps = { + readonly collectionConfig: ClientCollectionConfig + readonly field: { + relationTo: string + } +} + +export const TableComponent: React.FC = ({ + collectionConfig, + field: { relationTo }, +}) => { + const { data } = useListQuery() + + return ( + + ) +} diff --git a/test/_community/collections/Posts/TableField/index.scss b/test/_community/collections/Posts/TableField/index.scss new file mode 100644 index 00000000000..563f4e15e46 --- /dev/null +++ b/test/_community/collections/Posts/TableField/index.scss @@ -0,0 +1,10 @@ +.table-field-header { + display: flex; + justify-content: space-between; + + &__actions { + display: flex; + align-items: center; + gap: var(--base); + } +} diff --git a/test/_community/collections/Posts/TableField/index.tsx b/test/_community/collections/Posts/TableField/index.tsx new file mode 100644 index 00000000000..7105b81ebd0 --- /dev/null +++ b/test/_community/collections/Posts/TableField/index.tsx @@ -0,0 +1,97 @@ +'use client' +import type { ClientCollectionConfig, PaginatedDocs, Where } from 'payload' + +import { + ListQueryProvider, + TableColumnsProvider, + useConfig, + useDocumentDrawer, + useListDrawer, +} from '@payloadcms/ui' +import React, { useState } from 'react' + +import { TableComponent } from './MyTable.js' +import './index.scss' + +const baseClass = 'table-field-header' + +type RelationshipTableComponentProps = { + readonly field: { + label: string + name: string + relationTo: string + } +} + +const initialData: PaginatedDocs = { + docs: [ + { + _id: '', + context: {}, + createdAt: new Date(), + title: 'Hello', + updatedAt: new Date(), + }, + ], + hasNextPage: false, + hasPrevPage: false, + limit: 0, + page: 0, + pagingCounter: 0, + totalDocs: 0, + totalPages: 0, +} + +export const TableField: React.FC = ({ + field, + field: { relationTo = 'posts' }, +}) => { + const [limit, setLimit] = useState() + const [sort, setSort] = useState(undefined) + const [page, setPage] = useState(1) + const [where, setWhere] = useState(null) + const [search, setSearch] = useState('') + + const { getEntityConfig } = useConfig() + const collectionConfig = getEntityConfig({ collectionSlug: relationTo }) as ClientCollectionConfig + + const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({ + collectionSlug: relationTo, + }) + + const [ListDrawer, ListDrawerToggler] = useListDrawer({ + collectionSlugs: [relationTo], + }) + + const preferenceKey = `${relationTo}-list` + + return ( +
+
+

{field?.label || field?.name || 'Untitled'}

+
+ Create new + Add existing +
+
+ + + + + + + +
+ ) +} diff --git a/test/_community/collections/Posts/index.ts b/test/_community/collections/Posts/index.ts index 327a9ea479a..eb4c5bff528 100644 --- a/test/_community/collections/Posts/index.ts +++ b/test/_community/collections/Posts/index.ts @@ -9,56 +9,14 @@ export const PostsCollection: CollectionConfig = { }, fields: [ { + type: 'ui', + name: 'ui', admin: { components: { - Label: '/collections/Posts/MyComponent.js#MyComponent', + Field: '/collections/Posts/TableField/index.js#TableField', }, - description: 'This is a description', }, - name: 'text', - type: 'text', }, - { - name: 'richText', - type: 'richText', - }, - { - name: 'myBlocks', - type: 'blocks', - blocks: [ - { - slug: 'test', - fields: [ - { - name: 'test', - type: 'text', - }, - ], - }, - { - slug: 'someBlock2', - fields: [ - { - name: 'test2', - type: 'text', - }, - ], - }, - ], - }, - // { - // type: 'row', - // fields: [], - // }, - // { - // name: 'associatedMedia', - // type: 'upload', - // access: { - // create: () => true, - // update: () => false, - // }, - // relationTo: mediaSlug, - // }, ], versions: { drafts: true, diff --git a/test/_community/payload-types.ts b/test/_community/payload-types.ts index d1c4db30bff..d5694e43816 100644 --- a/test/_community/payload-types.ts +++ b/test/_community/payload-types.ts @@ -53,38 +53,6 @@ export interface UserAuthOperations { */ export interface Post { id: string; - text?: string | null; - richText?: { - root: { - type: string; - children: { - type: string; - version: number; - [k: string]: unknown; - }[]; - direction: ('ltr' | 'rtl') | null; - format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; - indent: number; - version: number; - }; - [k: string]: unknown; - } | null; - myBlocks?: - | ( - | { - test?: string | null; - id?: string | null; - blockName?: string | null; - blockType: 'test'; - } - | { - test2?: string | null; - id?: string | null; - blockName?: string | null; - blockType: 'someBlock2'; - } - )[] - | null; updatedAt: string; createdAt: string; _status?: ('draft' | 'published') | null; From 13d6295a5444c144eb0f351bba3e4360cfcdd0c3 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 15 Aug 2024 11:33:16 -0400 Subject: [PATCH 016/173] adds support to table for cell overrides --- packages/ui/src/elements/Table/index.tsx | 5 ++- .../TableColumns/buildColumnState.tsx | 35 +++++++++++++------ .../collections/Posts/TableField/MyCell.tsx | 5 +++ .../collections/Posts/TableField/MyTable.tsx | 2 +- .../collections/Posts/TableField/index.tsx | 26 +++++++++++--- 5 files changed, 55 insertions(+), 18 deletions(-) create mode 100644 test/_community/collections/Posts/TableField/MyCell.tsx diff --git a/packages/ui/src/elements/Table/index.tsx b/packages/ui/src/elements/Table/index.tsx index 3b71a75f61c..5eebf745ab0 100644 --- a/packages/ui/src/elements/Table/index.tsx +++ b/packages/ui/src/elements/Table/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { CellComponentProps, ClientField, MappedComponent } from 'payload' +import type { CellComponentProps, ClientField } from 'payload' import React from 'react' @@ -20,7 +20,6 @@ export type Column = { readonly active: boolean readonly cellProps?: Partial readonly components: { - Cell: MappedComponent Heading: React.ReactNode } } @@ -71,7 +70,7 @@ export const Table: React.FC = ({ columns: columnsFromProps, customCellCo > diff --git a/packages/ui/src/elements/TableColumns/buildColumnState.tsx b/packages/ui/src/elements/TableColumns/buildColumnState.tsx index fe77fbf98a0..832e9820966 100644 --- a/packages/ui/src/elements/TableColumns/buildColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildColumnState.tsx @@ -128,16 +128,23 @@ export const buildColumnState = (args: Args): Column[] => { field: { ...(field || ({} as ClientField)), ...(cellProps?.[index]?.field || ({} as ClientField)), + admin: { + ...(field.admin || {}), + components: { + ...(field.admin?.components || {}), + Cell: field.admin?.components?.Cell || { + type: 'client', + Component: DefaultCell, + RenderedComponent: null, + }, + ...(cellProps?.[index]?.field?.admin?.components || {}), + }, + }, } as ClientField, ...cellProps?.[index], link: isFirstActiveColumn, }, components: { - Cell: field.admin?.components?.Cell || { - type: 'client', - Component: DefaultCell, - RenderedComponent: null, - }, Heading, }, } @@ -153,12 +160,20 @@ export const buildColumnState = (args: Args): Column[] => { Label: null, accessor: '_select', active: true, + cellProps: { + field: { + admin: { + components: { + Cell: { + type: 'client', + Component: null, + RenderedComponent: , + }, + }, + }, + } as ClientField, + }, components: { - Cell: { - type: 'client', - Component: null, - RenderedComponent: , - }, Heading: , }, }) diff --git a/test/_community/collections/Posts/TableField/MyCell.tsx b/test/_community/collections/Posts/TableField/MyCell.tsx new file mode 100644 index 00000000000..fa5278533dc --- /dev/null +++ b/test/_community/collections/Posts/TableField/MyCell.tsx @@ -0,0 +1,5 @@ +'use client' + +export const MyCell = () => { + return
My Cell
+} diff --git a/test/_community/collections/Posts/TableField/MyTable.tsx b/test/_community/collections/Posts/TableField/MyTable.tsx index 0f0ee869be4..9164017a0f5 100644 --- a/test/_community/collections/Posts/TableField/MyTable.tsx +++ b/test/_community/collections/Posts/TableField/MyTable.tsx @@ -12,7 +12,7 @@ type RelationshipTableComponentProps = { } } -export const TableComponent: React.FC = ({ +export const MyTableComponent: React.FC = ({ collectionConfig, field: { relationTo }, }) => { diff --git a/test/_community/collections/Posts/TableField/index.tsx b/test/_community/collections/Posts/TableField/index.tsx index 7105b81ebd0..ab8fb03ee40 100644 --- a/test/_community/collections/Posts/TableField/index.tsx +++ b/test/_community/collections/Posts/TableField/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { ClientCollectionConfig, PaginatedDocs, Where } from 'payload' +import type { ClientCollectionConfig, ClientField, PaginatedDocs, Where } from 'payload' import { ListQueryProvider, @@ -10,7 +10,8 @@ import { } from '@payloadcms/ui' import React, { useState } from 'react' -import { TableComponent } from './MyTable.js' +import { MyCell } from './MyCell.js' +import { MyTableComponent } from './MyTable.js' import './index.scss' const baseClass = 'table-field-header' @@ -86,8 +87,25 @@ export const TableField: React.FC = ({ modifySearchParams={false} preferenceKey={preferenceKey} > - - + + From eefd4e9abf04c9d99ed2c85d1f13379501963a15 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 15 Aug 2024 12:59:04 -0400 Subject: [PATCH 017/173] chore: adds lock icon --- packages/ui/src/icons/Lock/index.scss | 8 ++++++++ packages/ui/src/icons/Lock/index.tsx | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 packages/ui/src/icons/Lock/index.scss create mode 100644 packages/ui/src/icons/Lock/index.tsx diff --git a/packages/ui/src/icons/Lock/index.scss b/packages/ui/src/icons/Lock/index.scss new file mode 100644 index 00000000000..55504a43deb --- /dev/null +++ b/packages/ui/src/icons/Lock/index.scss @@ -0,0 +1,8 @@ +@import '../../scss/styles'; + +.icon--lock { + .stroke { + stroke: currentColor; + stroke-width: $style-stroke-width; + } +} diff --git a/packages/ui/src/icons/Lock/index.tsx b/packages/ui/src/icons/Lock/index.tsx new file mode 100644 index 00000000000..011a0e8aa25 --- /dev/null +++ b/packages/ui/src/icons/Lock/index.tsx @@ -0,0 +1,24 @@ +import React from 'react' + +import './index.scss' + +export const LockIcon: React.FC = () => ( + + + + +) From 41ed35783077973f31f459287f4f5e5f627c21d6 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 15 Aug 2024 12:59:40 -0400 Subject: [PATCH 018/173] chore: adds new lockWhenEditing prop to collections & globals config --- packages/payload/src/collections/config/types.ts | 9 +++++++++ packages/payload/src/globals/config/types.ts | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index bd7f1184e0a..94d29bc93cd 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -441,6 +441,15 @@ export type CollectionConfig = { plural?: LabelFunction | StaticLabel singular?: LabelFunction | StaticLabel } + /** + * Enables / Disables the ability to lock documents while editing + * @default true + */ + lockWhenEditing?: + | { + lockDuration: number + } + | boolean slug: string /** * Add `createdAt` and `updatedAt` fields diff --git a/packages/payload/src/globals/config/types.ts b/packages/payload/src/globals/config/types.ts index c13536a4d0f..6866aea8bfc 100644 --- a/packages/payload/src/globals/config/types.ts +++ b/packages/payload/src/globals/config/types.ts @@ -167,6 +167,15 @@ export type GlobalConfig = { beforeValidate?: BeforeValidateHook[] } label?: Record | string + /** + * Enables / Disables the ability to lock documents while editing + * @default true + */ + lockWhenEditing?: + | { + lockDuration: number + } + | boolean slug: string /** * Options used in typescript generation From 1ae10b0e365f4f0fb4416225d7b5b6cd01f8bc88 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 15 Aug 2024 13:11:13 -0400 Subject: [PATCH 019/173] more --- .../ui/src/elements/ColumnSelector/index.tsx | 13 +++- packages/ui/src/elements/Table/index.tsx | 7 +-- .../TableColumns/buildColumnState.tsx | 15 ++--- .../select-components/SingleValue/index.tsx | 62 +++++++++---------- .../collections/Posts/TableField/MyCell.tsx | 26 +++++++- .../collections/Posts/TableField/MyTable.tsx | 6 +- .../collections/Posts/TableField/index.tsx | 4 +- 7 files changed, 77 insertions(+), 56 deletions(-) diff --git a/packages/ui/src/elements/ColumnSelector/index.tsx b/packages/ui/src/elements/ColumnSelector/index.tsx index 33b20805679..ec620843373 100644 --- a/packages/ui/src/elements/ColumnSelector/index.tsx +++ b/packages/ui/src/elements/ColumnSelector/index.tsx @@ -51,7 +51,18 @@ export const ColumnSelector: React.FC = ({ collectionSlug }) => { {filteredColumns.map((col, i) => { if (!col) return null - const { Label, accessor, active } = col + const { + accessor, + active, + cellProps: { + field: { + admin: { + // @ts-expect-error // TODO: `Label` does not exist on the UI field + components: { Label }, + }, + }, + }, + } = col if (col.accessor === '_select') return null diff --git a/packages/ui/src/elements/Table/index.tsx b/packages/ui/src/elements/Table/index.tsx index 5eebf745ab0..f58cba3a580 100644 --- a/packages/ui/src/elements/Table/index.tsx +++ b/packages/ui/src/elements/Table/index.tsx @@ -15,13 +15,10 @@ export { TableCellProvider } const baseClass = 'table' export type Column = { - readonly Label: React.ReactNode + readonly Heading: React.ReactNode readonly accessor: string readonly active: boolean readonly cellProps?: Partial - readonly components: { - Heading: React.ReactNode - } } export type Props = { @@ -49,7 +46,7 @@ export const Table: React.FC = ({ columns: columnsFromProps, customCellCo
{activeColumns.map((col, i) => ( ))} diff --git a/packages/ui/src/elements/TableColumns/buildColumnState.tsx b/packages/ui/src/elements/TableColumns/buildColumnState.tsx index 832e9820966..8134196c612 100644 --- a/packages/ui/src/elements/TableColumns/buildColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildColumnState.tsx @@ -121,15 +121,17 @@ export const buildColumnState = (args: Args): Column[] => { if (field) { const column: Column = { - Label, + Heading, accessor: 'name' in field ? field.name : undefined, active, cellProps: { + ...cellProps?.[index], field: { ...(field || ({} as ClientField)), ...(cellProps?.[index]?.field || ({} as ClientField)), admin: { ...(field.admin || {}), + ...(cellProps?.[index]?.field?.admin || {}), components: { ...(field.admin?.components || {}), Cell: field.admin?.components?.Cell || { @@ -137,16 +139,13 @@ export const buildColumnState = (args: Args): Column[] => { Component: DefaultCell, RenderedComponent: null, }, + Label, ...(cellProps?.[index]?.field?.admin?.components || {}), }, }, } as ClientField, - ...cellProps?.[index], link: isFirstActiveColumn, }, - components: { - Heading, - }, } acc.push(column) @@ -157,7 +156,7 @@ export const buildColumnState = (args: Args): Column[] => { if (enableRowSelections) { sorted.unshift({ - Label: null, + Heading: , accessor: '_select', active: true, cellProps: { @@ -169,13 +168,11 @@ export const buildColumnState = (args: Args): Column[] => { Component: null, RenderedComponent: , }, + Label: null, }, }, } as ClientField, }, - components: { - Heading: , - }, }) } diff --git a/packages/ui/src/fields/Relationship/select-components/SingleValue/index.tsx b/packages/ui/src/fields/Relationship/select-components/SingleValue/index.tsx index 0d2ebe372d7..930a73b821f 100644 --- a/packages/ui/src/fields/Relationship/select-components/SingleValue/index.tsx +++ b/packages/ui/src/fields/Relationship/select-components/SingleValue/index.tsx @@ -40,38 +40,36 @@ export const SingleValue: React.FC> = (props) => { }, [isDrawerOpen, setDrawerIsOpen]) return ( - - -
-
-
{children}
- {relationTo && hasReadPermission && ( - - setShowTooltip(false)} - onKeyDown={(e) => { - if (e.key === 'Enter') { - e.stopPropagation() - } - }} - onMouseDown={(e) => e.stopPropagation()} // prevents react-select dropdown from opening - onMouseEnter={() => setShowTooltip(true)} - onMouseLeave={() => setShowTooltip(false)} - onTouchEnd={(e) => e.stopPropagation()} // prevents react-select dropdown from opening - > - - {t('general:edit')} - - - - - )} -
+ +
+
+
{children}
+ {relationTo && hasReadPermission && ( + + setShowTooltip(false)} + onKeyDown={(e) => { + if (e.key === 'Enter') { + e.stopPropagation() + } + }} + onMouseDown={(e) => e.stopPropagation()} // prevents react-select dropdown from opening + onMouseEnter={() => setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + onTouchEnd={(e) => e.stopPropagation()} // prevents react-select dropdown from opening + > + + {t('general:edit')} + + + + + )}
- {relationTo && hasReadPermission && } - - +
+ {relationTo && hasReadPermission && } +
) } diff --git a/test/_community/collections/Posts/TableField/MyCell.tsx b/test/_community/collections/Posts/TableField/MyCell.tsx index fa5278533dc..cf56110eb6e 100644 --- a/test/_community/collections/Posts/TableField/MyCell.tsx +++ b/test/_community/collections/Posts/TableField/MyCell.tsx @@ -1,5 +1,27 @@ 'use client' -export const MyCell = () => { - return
My Cell
+import { EditIcon, useDocumentDrawer, useTableCell } from '@payloadcms/ui' + +export const MyCell = (props) => { + const context = useTableCell() + + const { + customCellContext: { collectionSlug }, + rowData, + } = context + + const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({ + collectionSlug, + }) + + return ( +
+ {rowData.id} +   + + + + +
+ ) } diff --git a/test/_community/collections/Posts/TableField/MyTable.tsx b/test/_community/collections/Posts/TableField/MyTable.tsx index 9164017a0f5..f8dbaa0a5eb 100644 --- a/test/_community/collections/Posts/TableField/MyTable.tsx +++ b/test/_community/collections/Posts/TableField/MyTable.tsx @@ -7,21 +7,17 @@ import React from 'react' type RelationshipTableComponentProps = { readonly collectionConfig: ClientCollectionConfig - readonly field: { - relationTo: string - } } export const MyTableComponent: React.FC = ({ collectionConfig, - field: { relationTo }, }) => { const { data } = useListQuery() return (
- {col.components.Heading} + {col.Heading}
= ({ collectionSlug={relationTo} preferenceKey={preferenceKey} > - + From 6efa9c73c074df887cae62137f7f98bad8b600b6 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 15 Aug 2024 13:21:55 -0400 Subject: [PATCH 020/173] updates version cells to new shape --- .../next/src/views/Versions/buildColumns.tsx | 92 +++++++++++-------- .../collections/Posts/TableField/index.tsx | 4 +- 2 files changed, 55 insertions(+), 41 deletions(-) diff --git a/packages/next/src/views/Versions/buildColumns.tsx b/packages/next/src/views/Versions/buildColumns.tsx index 5a77f5dcbfc..93e9c81f64a 100644 --- a/packages/next/src/views/Versions/buildColumns.tsx +++ b/packages/next/src/views/Versions/buildColumns.tsx @@ -28,48 +28,58 @@ export const buildVersionColumns = ({ const columns: Column[] = [ { - Label: '', + Heading: , accessor: 'updatedAt', active: true, cellProps: { field: { name: '', type: 'date', + admin: { + components: { + Cell: { + type: 'client', + Component: null, + RenderedComponent: ( + + ), + }, + Label: { + type: 'client', + Component: null, + }, + }, + }, }, }, - components: { - Cell: { - type: 'client', - Component: null, - RenderedComponent: ( - - ), - }, - Heading: , - }, }, { - Label: '', + Heading: , accessor: 'id', active: true, cellProps: { field: { name: '', type: 'text', + admin: { + components: { + Cell: { + type: 'client', + Component: null, + RenderedComponent: , + }, + Label: { + type: 'client', + Component: null, + }, + }, + }, }, }, - components: { - Cell: { - type: 'client', - Component: null, - RenderedComponent: , - }, - Heading: , - }, }, ] @@ -78,29 +88,33 @@ export const buildVersionColumns = ({ (entityConfig?.versions?.drafts && entityConfig.versions.drafts?.autosave) ) { columns.push({ - Label: '', + Heading: , accessor: '_status', active: true, cellProps: { field: { name: '', type: 'checkbox', + admin: { + components: { + Cell: { + type: 'client', + Component: null, + RenderedComponent: ( + + ), + }, + Label: { + type: 'client', + Component: null, + }, + }, + }, }, }, - components: { - Cell: { - type: 'client', - Component: null, - RenderedComponent: ( - - ), - }, - - Heading: , - }, }) } diff --git a/test/_community/collections/Posts/TableField/index.tsx b/test/_community/collections/Posts/TableField/index.tsx index a9162aa86ea..efc60064401 100644 --- a/test/_community/collections/Posts/TableField/index.tsx +++ b/test/_community/collections/Posts/TableField/index.tsx @@ -29,9 +29,9 @@ const initialData: PaginatedDocs = { { id: '123', context: {}, - createdAt: new Date(), + createdAt: '2021-01-01T00:00:00.000Z', title: 'Hello', - updatedAt: new Date(), + updatedAt: '2021-01-01T00:00:00.000Z', }, ], hasNextPage: false, From b9fa144fd422f7a8268843d2e6f3c93727651793 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 15 Aug 2024 13:22:41 -0400 Subject: [PATCH 021/173] adds back community fields --- test/_community/collections/Posts/index.ts | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/_community/collections/Posts/index.ts b/test/_community/collections/Posts/index.ts index eb4c5bff528..5d5eecf7df6 100644 --- a/test/_community/collections/Posts/index.ts +++ b/test/_community/collections/Posts/index.ts @@ -17,6 +17,57 @@ export const PostsCollection: CollectionConfig = { }, }, }, + { + admin: { + components: { + Label: '/collections/Posts/MyComponent.js#MyComponent', + }, + description: 'This is a description', + }, + name: 'text', + type: 'text', + }, + { + name: 'richText', + type: 'richText', + }, + { + name: 'myBlocks', + type: 'blocks', + blocks: [ + { + slug: 'test', + fields: [ + { + name: 'test', + type: 'text', + }, + ], + }, + { + slug: 'someBlock2', + fields: [ + { + name: 'test2', + type: 'text', + }, + ], + }, + ], + }, + // { + // type: 'row', + // fields: [], + // }, + // { + // name: 'associatedMedia', + // type: 'upload', + // access: { + // create: () => true, + // update: () => false, + // }, + // relationTo: mediaSlug, + // }, ], versions: { drafts: true, From 195667281e738b3ccdf87570bdcaee554234d9fa Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 15 Aug 2024 16:12:43 -0400 Subject: [PATCH 022/173] fetches data using the api and adds pagination --- .../src/elements/ListDrawer/DrawerContent.tsx | 2 +- packages/ui/src/providers/ListQuery/index.tsx | 31 +++-- .../collections/Posts/TableField/MyTable.tsx | 35 +++-- .../collections/Posts/TableField/index.tsx | 124 +++++++++++++++--- test/_community/payload-types.ts | 32 +++++ 5 files changed, 181 insertions(+), 43 deletions(-) diff --git a/packages/ui/src/elements/ListDrawer/DrawerContent.tsx b/packages/ui/src/elements/ListDrawer/DrawerContent.tsx index c6ec314f8e0..fa266efaf2f 100644 --- a/packages/ui/src/elements/ListDrawer/DrawerContent.tsx +++ b/packages/ui/src/elements/ListDrawer/DrawerContent.tsx @@ -25,7 +25,7 @@ import { TableColumnsProvider } from '../TableColumns/index.js' import { ViewDescription } from '../ViewDescription/index.js' import { baseClass } from './index.js' -const hoistQueryParamsToAnd = (where: Where, queryParams: Where) => { +export const hoistQueryParamsToAnd = (where: Where, queryParams: Where) => { if ('and' in where) { where.and.push(queryParams) } else if ('or' in where) { diff --git a/packages/ui/src/providers/ListQuery/index.tsx b/packages/ui/src/providers/ListQuery/index.tsx index a69846fe8a8..69f37a3d1f0 100644 --- a/packages/ui/src/providers/ListQuery/index.tsx +++ b/packages/ui/src/providers/ListQuery/index.tsx @@ -14,12 +14,13 @@ import { useSearchParams } from '../SearchParams/index.js' export type ColumnPreferences = Pick[] type PropHandlers = { - handlePageChange?: (page: number) => Promise | void - handlePerPageChange?: (limit: number) => Promise | void - handleSearchChange?: (search: string) => Promise | void - handleSortChange?: (sort: string) => Promise | void - handleWhereChange?: (where: Where) => Promise | void + readonly handlePageChange?: (page: number) => Promise | void + readonly handlePerPageChange?: (limit: number) => Promise | void + readonly handleSearchChange?: (search: string) => Promise | void + readonly handleSortChange?: (sort: string) => Promise | void + readonly handleWhereChange?: (where: Where) => Promise | void } + type ContextHandlers = { handlePageChange?: (page: number) => Promise handlePerPageChange?: (limit: number) => Promise @@ -29,12 +30,12 @@ type ContextHandlers = { } export type ListQueryProps = { - children: React.ReactNode - data: PaginatedDocs - defaultLimit?: number - defaultSort?: string - modifySearchParams?: boolean - preferenceKey?: string + readonly children: React.ReactNode + readonly data: PaginatedDocs + readonly defaultLimit?: number + readonly defaultSort?: string + readonly modifySearchParams?: boolean + readonly preferenceKey?: string } & PropHandlers export type ListQueryContext = { @@ -88,10 +89,12 @@ export const ListQueryProvider: React.FC = ({ updatedPreferences.limit = query.limit updatePreferences = true } + if ('sort' in query) { updatedPreferences.sort = query.sort updatePreferences = true } + if (updatePreferences && preferenceKey) { await setPreference(preferenceKey, updatedPreferences) } @@ -118,6 +121,7 @@ export const ListQueryProvider: React.FC = ({ }, [refineListData, handlePageChangeFromProps], ) + const handlePerPageChange = React.useCallback( async (arg: number) => { if (typeof handlePerPageChangeFromProps === 'function') { @@ -127,6 +131,7 @@ export const ListQueryProvider: React.FC = ({ }, [refineListData, handlePerPageChangeFromProps], ) + const handleSearchChange = React.useCallback( async (arg: string) => { if (typeof handleSearchChangeFromProps === 'function') { @@ -136,6 +141,7 @@ export const ListQueryProvider: React.FC = ({ }, [refineListData, handleSearchChangeFromProps], ) + const handleSortChange = React.useCallback( async (arg: string) => { if (typeof handleSortChangeFromProps === 'function') { @@ -145,6 +151,7 @@ export const ListQueryProvider: React.FC = ({ }, [refineListData, handleSortChangeFromProps], ) + const handleWhereChange = React.useCallback( async (arg: Where) => { if (typeof handleWhereChangeFromProps === 'function') { @@ -164,10 +171,12 @@ export const ListQueryProvider: React.FC = ({ currentQuery.limit = String(defaultLimit) shouldUpdateQueryString = true } + if (defaultSort && !('sort' in currentQuery)) { currentQuery.sort = defaultSort shouldUpdateQueryString = true } + if (shouldUpdateQueryString) { router.replace(`?${qs.stringify(currentQuery)}`) } diff --git a/test/_community/collections/Posts/TableField/MyTable.tsx b/test/_community/collections/Posts/TableField/MyTable.tsx index f8dbaa0a5eb..44c805fa483 100644 --- a/test/_community/collections/Posts/TableField/MyTable.tsx +++ b/test/_community/collections/Posts/TableField/MyTable.tsx @@ -2,8 +2,8 @@ import type { ClientCollectionConfig } from 'payload' -import { Table, useListQuery } from '@payloadcms/ui' -import React from 'react' +import { Pagination, Table, useListQuery } from '@payloadcms/ui' +import React, { Fragment } from 'react' type RelationshipTableComponentProps = { readonly collectionConfig: ClientCollectionConfig @@ -12,16 +12,29 @@ type RelationshipTableComponentProps = { export const MyTableComponent: React.FC = ({ collectionConfig, }) => { - const { data } = useListQuery() + const { data, handlePageChange } = useListQuery() return ( -
+ +
+ handlePageChange} + page={data.page} + prevPage={data.prevPage || undefined} + totalPages={data.totalPages} + /> + ) } diff --git a/test/_community/collections/Posts/TableField/index.tsx b/test/_community/collections/Posts/TableField/index.tsx index efc60064401..a72abf0496f 100644 --- a/test/_community/collections/Posts/TableField/index.tsx +++ b/test/_community/collections/Posts/TableField/index.tsx @@ -2,14 +2,19 @@ import type { ClientCollectionConfig, ClientField, PaginatedDocs, Where } from 'payload' import { + FieldLabel, ListQueryProvider, + LoadingOverlay, + Pagination, TableColumnsProvider, useConfig, useDocumentDrawer, useListDrawer, + usePayloadAPI, } from '@payloadcms/ui' -import React, { useState } from 'react' +import React, { useEffect, useReducer, useState } from 'react' +import { hoistQueryParamsToAnd } from '../../../../../packages/ui/src/elements/ListDrawer/DrawerContent.js' import { MyCell } from './MyCell.js' import { MyTableComponent } from './MyTable.js' import './index.scss' @@ -17,22 +22,18 @@ import './index.scss' const baseClass = 'table-field-header' type RelationshipTableComponentProps = { - readonly field: { - label: string - name: string - relationTo: string - } + readonly field: ClientField } const initialData: PaginatedDocs = { docs: [ - { - id: '123', - context: {}, - createdAt: '2021-01-01T00:00:00.000Z', - title: 'Hello', - updatedAt: '2021-01-01T00:00:00.000Z', - }, + // { + // id: '123', + // context: {}, + // createdAt: '2021-01-01T00:00:00.000Z', + // title: 'Hello', + // updatedAt: '2021-01-01T00:00:00.000Z', + // }, ], hasNextPage: false, hasPrevPage: false, @@ -43,19 +44,88 @@ const initialData: PaginatedDocs = { totalPages: 0, } -export const TableField: React.FC = ({ - field, - field: { relationTo = 'posts' }, -}) => { +const relationTo = 'posts' + +const filterOptions: Where = {} + +export const TableField: React.FC = (props) => { + const { field } = props + + const { + config: { + routes: { api }, + serverURL, + }, + getEntityConfig, + } = useConfig() + const [limit, setLimit] = useState() const [sort, setSort] = useState(undefined) const [page, setPage] = useState(1) const [where, setWhere] = useState(null) const [search, setSearch] = useState('') - const { getEntityConfig } = useConfig() const collectionConfig = getEntityConfig({ collectionSlug: relationTo }) as ClientCollectionConfig + const apiURL = `${serverURL}${api}/${collectionConfig.slug}` + + const [cacheBust, dispatchCacheBust] = useReducer((state) => state + 1, 0) // used to force a re-fetch even when apiURL is unchanged + + const [{ data, isError, isLoading: isLoadingList }, { setParams }] = usePayloadAPI(apiURL, { + initialData, + }) + + console.log(data) + + useEffect(() => { + const { + admin: { listSearchableFields, useAsTitle } = {} as ClientCollectionConfig['admin'], + versions, + } = collectionConfig + + const params: { + cacheBust?: number + draft?: string + limit?: number + page?: number + search?: string + sort?: string + where?: unknown + } = {} + + let copyOfWhere = { ...(where || {}) } + + if (filterOptions && typeof filterOptions !== 'boolean') { + copyOfWhere = hoistQueryParamsToAnd(copyOfWhere, filterOptions) + } + + if (search) { + const searchAsConditions = (listSearchableFields || [useAsTitle]).map((fieldName) => { + return { + [fieldName]: { + like: search, + }, + } + }, []) + + if (searchAsConditions.length > 0) { + const searchFilter: Where = { + or: [...searchAsConditions], + } + + copyOfWhere = hoistQueryParamsToAnd(copyOfWhere, searchFilter) + } + } + + if (page) params.page = page + if (sort) params.sort = sort + if (cacheBust) params.cacheBust = cacheBust + if (copyOfWhere) params.where = copyOfWhere + if (versions?.drafts) params.draft = 'true' + + setParams(params) + }, [page, sort, where, search, cacheBust, collectionConfig, setParams]) + const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({ collectionSlug: relationTo, }) @@ -66,17 +136,31 @@ export const TableField: React.FC = ({ const preferenceKey = `${relationTo}-list` + if (isLoadingList) { + return + } + return (
-

{field?.label || field?.name || 'Untitled'}

+

+ +

Create new Add existing
Date: Thu, 15 Aug 2024 17:01:20 -0400 Subject: [PATCH 023/173] feat: add pagination to joins field --- packages/db-mongodb/src/find.ts | 7 +- packages/db-mongodb/src/findOne.ts | 3 +- packages/db-mongodb/src/utilities/setJoins.ts | 100 ++++++------ .../src/collections/operations/local/find.ts | 5 +- .../collections/operations/local/findByID.ts | 5 +- packages/payload/src/database/types.ts | 1 + .../relationshipPopulationPromise.ts | 14 +- packages/payload/src/types/index.ts | 1 + .../src/utilities/configToJSONSchema.ts | 34 ++-- pnpm-lock.yaml | 1 - test/helpers/NextRESTClient.ts | 3 +- test/joins/int.spec.ts | 151 +++++++++++------- test/joins/payload-types.ts | 28 +++- 13 files changed, 221 insertions(+), 132 deletions(-) diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index c24606959bd..9d3b2498aa5 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -19,6 +19,7 @@ export const find: Find = async function find( locale, page, pagination, + projection, req = {} as PayloadRequest, sort: sortArg, where, @@ -61,6 +62,7 @@ export const find: Find = async function find( options, page, pagination, + projection, sort, useEstimatedCount, } @@ -109,11 +111,8 @@ export const find: Find = async function find( collection, doc, joins, - options: { - lean: true, - session: options.session, - }, payload: this.payload, + req, }), ) }) diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index 959649613ac..b8e2a55bbe1 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -33,8 +33,9 @@ export const findOne: FindOne = async function findOne( collection, doc, joins, - options, + locale, payload: this.payload, + req, }) result = JSON.parse(JSON.stringify(result)) diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts index 67dd70c139d..f9c211027bf 100644 --- a/packages/db-mongodb/src/utilities/setJoins.ts +++ b/packages/db-mongodb/src/utilities/setJoins.ts @@ -1,80 +1,76 @@ -import type { QueryOptions } from 'mongoose' -import type { Document, JoinQuery, Payload } from 'payload' +import type { Document, FindArgs, JoinQuery, Payload } from 'payload' type Args = { collection: string doc: Document joins: JoinQuery - options: QueryOptions payload: Payload -} +} & FindArgs /** - * // fetch docs and add to the keys by path, mutating and returning the doc - * @param collection - * @param doc - * @param joins, - * @param options - * @param payload + * fetch docs and add to the keys by path, mutating and returning the doc with paginated results */ export const setJoins = async ({ collection, doc, joins = {}, - options, + locale, payload, + req, }: Args): Promise => { // TODO: allow disabling of joining at the top level using `joins: false` or `?joins=false` // if (joins === false) return doc const joinConfig = payload.collections[collection].config.joins - await Promise.all( - Object.keys(joinConfig).map(async (slug) => { - const joinModel = payload.db.collections[slug] - const { defaultSort } = payload.collections[slug].config + const promises = [] - for (const join of joinConfig[slug]) { - // get the query options for the join off of req - // TODO: allow disabling the join completely - // if (joins[join.schemaPath] === false || req.query[join.schemaPath] === 'false') { - // continue - // } + Object.keys(joinConfig).map(async (slug) => { + for (const join of joinConfig[slug]) { + // get the query options for the join off of req + // TODO: allow disabling the join completely + // if (joins[join.schemaPath] === false || req.query[join.schemaPath] === 'false') { + // continue + // } - const { limit, page, sort } = { - limit: 10, - page: 1, - sort: defaultSort, - ...(joins[join.schemaPath] ?? {}), - } + const { limit, page, pagination = true, sort } = joins[join.schemaPath] || {} - const joinData = await joinModel - .find( - { [join.field.on]: { $eq: doc._id.toString() } }, - { + promises.push( + payload.db + .find({ + collection: slug, + limit, + locale, + page, + pagination, + projection: { _id: 1, }, - options, - ) - .sort(sort === 'id' ? '_id' : sort) - .skip((page - 1) * limit) - .limit(limit) - - // iterate schemaPath and assign to the document - const path = join.schemaPath.split('.') - let current = doc - for (let i = 0; i <= path.length - 1; i++) { - if (i === path.length - 1) { - current[path[i]] = joinData.map((a) => a._id) - } else { - if (!current[path[i]]) { - current[path[i]] = {} + req, + sort, + where: { + [join.field.on]: { equals: doc._id.toString() }, + }, + }) + .then((data) => { + // iterate schemaPath and assign to the document + const path = join.schemaPath.split('.') + let current = doc + for (let i = 0; i <= path.length - 1; i++) { + if (i === path.length - 1) { + current[path[i]] = data + } else { + if (!current[path[i]]) { + current[path[i]] = {} + } + current = current[path[i]] + } } - current = current[path[i]] - } - } - } - }), - ) + }), + ) + } + }) + + await Promise.all(promises) return doc } diff --git a/packages/payload/src/collections/operations/local/find.ts b/packages/payload/src/collections/operations/local/find.ts index 1563a7e4430..6cd40c23605 100644 --- a/packages/payload/src/collections/operations/local/find.ts +++ b/packages/payload/src/collections/operations/local/find.ts @@ -1,5 +1,5 @@ import type { PaginatedDocs } from '../../../database/types.js' -import type { CollectionSlug, Payload, TypedLocale } from '../../../index.js' +import type { CollectionSlug, JoinQuery, Payload, TypedLocale } from '../../../index.js' import type { Document, PayloadRequest, RequestContext, Where } from '../../../types/index.js' import type { DataFromCollectionSlug } from '../../config/types.js' @@ -18,6 +18,7 @@ export type Options = { disableErrors?: boolean draft?: boolean fallbackLocale?: TypedLocale + joins?: JoinQuery limit?: number locale?: 'all' | TypedLocale overrideAccess?: boolean @@ -40,6 +41,7 @@ export async function findLocal( depth, disableErrors, draft = false, + joins, limit, overrideAccess = true, page, @@ -63,6 +65,7 @@ export async function findLocal( depth, disableErrors, draft, + joins, limit, overrideAccess, page, diff --git a/packages/payload/src/collections/operations/local/findByID.ts b/packages/payload/src/collections/operations/local/findByID.ts index 362fb40f8b2..7a492c3c104 100644 --- a/packages/payload/src/collections/operations/local/findByID.ts +++ b/packages/payload/src/collections/operations/local/findByID.ts @@ -1,4 +1,4 @@ -import type { CollectionSlug, Payload, TypedLocale } from '../../../index.js' +import type { CollectionSlug, JoinQuery, Payload, TypedLocale } from '../../../index.js' import type { Document, PayloadRequest, RequestContext } from '../../../types/index.js' import type { DataFromCollectionSlug } from '../../config/types.js' @@ -18,6 +18,7 @@ export type Options = { draft?: boolean fallbackLocale?: TypedLocale id: number | string + joins?: JoinQuery locale?: 'all' | TypedLocale overrideAccess?: boolean req?: PayloadRequest @@ -36,6 +37,7 @@ export default async function findByIDLocal( depth, disableErrors = false, draft = false, + joins, overrideAccess = true, showHiddenFields, } = options @@ -55,6 +57,7 @@ export default async function findByIDLocal( depth, disableErrors, draft, + joins, overrideAccess, req: await createLocalReq(options, payload), showHiddenFields, diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 81f4a511f5e..d8f029dfb0c 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -194,6 +194,7 @@ export type FindArgs = { locale?: string page?: number pagination?: boolean + projection?: Record req: PayloadRequest skip?: number sort?: string diff --git a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts index a316155fa45..ee73094478e 100644 --- a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts +++ b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts @@ -90,7 +90,7 @@ const populate = async ({ if (field.type === 'relationship' && Array.isArray(field.relationTo)) { dataToUpdate[field.name][index ?? key].value = relationshipValue } else { - dataToUpdate[field.name][index ?? key] = relationshipValue + dataToUpdate[field.name].docs[index ?? key] = relationshipValue } } else if (field.type === 'relationship' && Array.isArray(field.relationTo)) { dataToUpdate[field.name].value = relationshipValue @@ -160,13 +160,19 @@ export const relationshipPopulationPromise = async ({ }) } }) - } else if (Array.isArray(siblingDoc[field.name])) { - siblingDoc[field.name].forEach((relatedDoc, index) => { + } else if ( + Array.isArray(siblingDoc[field.name]) || + Array.isArray(siblingDoc[field.name]?.docs) + ) { + ;(Array.isArray(siblingDoc[field.name]) + ? siblingDoc[field.name] + : siblingDoc[field.name].docs + ).forEach((relatedDoc, index) => { const rowPromise = async () => { if (relatedDoc) { await populate({ currentDepth, - data: relatedDoc, + data: relatedDoc?.id ? relatedDoc.id : relatedDoc, dataReference: resultingDoc, depth: populateDepth, draft, diff --git a/packages/payload/src/types/index.ts b/packages/payload/src/types/index.ts index 7743a0346b2..0306929d017 100644 --- a/packages/payload/src/types/index.ts +++ b/packages/payload/src/types/index.ts @@ -116,6 +116,7 @@ export type JoinQuery = { [schemaPath: string]: { limit?: number page?: number + pagination?: boolean sort?: string } } diff --git a/packages/payload/src/utilities/configToJSONSchema.ts b/packages/payload/src/utilities/configToJSONSchema.ts index e48af4b0db6..3d97f394f6b 100644 --- a/packages/payload/src/utilities/configToJSONSchema.ts +++ b/packages/payload/src/utilities/configToJSONSchema.ts @@ -293,16 +293,32 @@ export function fieldsToJSONSchema( case 'join': { fieldSchema = { - type: withNullableJSONSchemaType('array', isRequired), - items: { - oneOf: [ - { - type: collectionIDFieldTypes[field.collection], - }, - { - $ref: `#/definitions/${field.collection}`, + type: withNullableJSONSchemaType('object', false), + additionalProperties: false, + properties: { + docs: { + type: withNullableJSONSchemaType('array', false), + items: { + oneOf: [ + { + type: collectionIDFieldTypes[field.collection], + }, + { + $ref: `#/definitions/${field.collection}`, + }, + ], }, - ], + }, + hasNextPage: { type: withNullableJSONSchemaType('boolean', false) }, + hasPrevPage: { type: withNullableJSONSchemaType('boolean', false) }, + limit: { type: withNullableJSONSchemaType('integer', false) }, + nextPage: { type: withNullableJSONSchemaType('integer', false) }, + offset: { type: withNullableJSONSchemaType('integer', false) }, + page: { type: withNullableJSONSchemaType('integer', false) }, + pagingCounter: { type: withNullableJSONSchemaType('integer', false) }, + prevPage: { type: withNullableJSONSchemaType('integer', false) }, + totalDocs: { type: withNullableJSONSchemaType('integer', false) }, + totalPages: { type: withNullableJSONSchemaType('integer', false) }, }, } break diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ba3bfee2eb..c843615a2c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7096,7 +7096,6 @@ packages: libsql@0.3.19: resolution: {integrity: sha512-Aj5cQ5uk/6fHdmeW0TiXK42FqUlwx7ytmMLPSaUQPin5HKKKuUPD62MAbN4OEweGBBI7q1BekoEN4gPUEL6MZA==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lie@3.1.1: diff --git a/test/helpers/NextRESTClient.ts b/test/helpers/NextRESTClient.ts index c885e8b20c7..ed75e3d9199 100644 --- a/test/helpers/NextRESTClient.ts +++ b/test/helpers/NextRESTClient.ts @@ -1,4 +1,4 @@ -import type { SanitizedConfig, Where } from 'payload' +import type { JoinQuery, SanitizedConfig, Where } from 'payload' import type { ParsedQs } from 'qs-esm' import { @@ -18,6 +18,7 @@ type RequestOptions = { query?: { depth?: number fallbackLocale?: string + joins?: JoinQuery limit?: number locale?: string page?: number diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index df9111e9348..46ac8a13816 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -1,12 +1,18 @@ import type { Payload } from 'payload' +import path from 'path' +import { fileURLToPath } from 'url' + import type { NextRESTClient } from '../helpers/NextRESTClient.js' -import type { Category } from './payload-types.js' +import type { Category, Post } from './payload-types.js' import { devUser } from '../credentials.js' import { initPayloadInt } from '../helpers/initPayloadInt.js' import configPromise from './config.js' +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + let payload: Payload let token: string let restClient: NextRESTClient @@ -19,8 +25,7 @@ describe('Joins Field Tests', () => { // Boilerplate test setup/teardown // --__--__--__--__--__--__--__--__--__ beforeAll(async () => { - const initialized = await initPayloadInt(configPromise) - ;({ payload, restClient } = initialized) + ;({ payload, restClient } = await initPayloadInt(dirname)) const data = await restClient .POST('/users/login', { @@ -36,41 +41,20 @@ describe('Joins Field Tests', () => { category = await payload.create({ collection: 'categories', data: { - name: 'example', + name: 'paginate example', group: {}, }, }) - await payload.create({ - collection: 'posts', - data: { - category: category.id, - group: { - category: category.id, - }, - title: 'test a', - }, - }) - await payload.create({ - collection: 'posts', - data: { + for (let i = 0; i < 10; i++) { + await createPost({ + title: `test ${i}`, category: category.id, group: { category: category.id, }, - title: 'test b', - }, - }) - await payload.create({ - collection: 'posts', - data: { - category: category.id, - group: { - category: category.id, - }, - title: 'test c', - }, - }) + }) + } }) afterAll(async () => { @@ -82,19 +66,18 @@ describe('Joins Field Tests', () => { it('should populate joins using findByID', async () => { const categoryWithPosts = await payload.findByID({ id: category.id, + joins: { + posts: { + sort: '-title', + }, + }, collection: 'categories', }) - expect(Array.isArray(categoryWithPosts.group.posts)).toBeDefined() - expect(Array.isArray(categoryWithPosts.posts)).toBeDefined() - const joinedIDs = categoryWithPosts.group.posts.map((post) => post.id) - - expect(categoryWithPosts.group.posts).toHaveLength(3) - expect(categoryWithPosts.group.posts[0]).toHaveProperty('title') - expect(categoryWithPosts.group.posts[0].title).toBe('test a') - expect(joinedIDs).toContain(categoryWithPosts.group.posts[0].id) - expect(joinedIDs).toContain(categoryWithPosts.group.posts[1].id) - expect(joinedIDs).toContain(categoryWithPosts.group.posts[2].id) + expect(categoryWithPosts.group.posts.docs).toHaveLength(10) + expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('id') + expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('title') + expect(categoryWithPosts.group.posts.docs[0].title).toStrictEqual('test 9') }) it('should populate joins using find', async () => { @@ -104,31 +87,87 @@ describe('Joins Field Tests', () => { const [categoryWithPosts] = result.docs - expect(Array.isArray(categoryWithPosts.group.posts)).toBeDefined() - expect(Array.isArray(categoryWithPosts.posts)).toBeDefined() - const joinedIDs = categoryWithPosts.group.posts.map((post) => post.id) - - expect(categoryWithPosts.group.posts).toHaveLength(3) - expect(categoryWithPosts.group.posts[0]).toHaveProperty('title') - expect(categoryWithPosts.group.posts[0].title).toBe('test a') - expect(joinedIDs).toContain(categoryWithPosts.group.posts[0].id) - expect(joinedIDs).toContain(categoryWithPosts.group.posts[1].id) - expect(joinedIDs).toContain(categoryWithPosts.group.posts[2].id) + expect(categoryWithPosts.group.posts.docs).toHaveLength(10) + expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('title') + expect(categoryWithPosts.group.posts.docs[0].title).toBe('test 9') }) describe('REST', () => { it('should paginate joins', async () => { - const response = await restClient - .GET(`/categories/${category.id}?joins[posts][limit]=1[page]=2`) - .then((res) => res.json()) - expect(response.posts).toHaveLength(1) - expect(response.posts[0].title).toStrictEqual('test b') + let page = 1 + const query = { + depth: 1, + where: { + name: { equals: 'paginate example' }, + }, + joins: { + posts: { + limit: 4, + sort: 'createdAt', + get page() { + return page + }, + }, + }, + } + + const page1 = await restClient.GET(`/categories`, { query }).then((res) => res.json()) + page = 2 + const page2 = await restClient.GET(`/categories`, { query }).then((res) => res.json()) + page = 3 + const page3 = await restClient.GET(`/categories`, { query }).then((res) => res.json()) + + expect(page1.docs[0].posts.docs).toHaveLength(4) + expect(page1.docs[0].posts.docs[0].title).toStrictEqual('test 0') + expect(page1.docs[0].posts.hasNextPage).toStrictEqual(true) + expect(page1.docs[0].posts.hasPrevPage).toStrictEqual(false) + expect(page1.docs[0].posts.limit).toStrictEqual(4) + expect(page1.docs[0].posts.nextPage).toStrictEqual(2) + expect(page1.docs[0].posts.page).toStrictEqual(1) + expect(page1.docs[0].posts.pagingCounter).toStrictEqual(1) + expect(page1.docs[0].posts.prevPage).toStrictEqual(null) + expect(page1.docs[0].posts.totalDocs).toStrictEqual(10) + expect(page1.docs[0].posts.totalPages).toStrictEqual(3) + + expect(page2.docs[0].posts.docs).toHaveLength(4) + expect(page2.docs[0].posts.docs[0].title).toStrictEqual('test 4') + expect(page2.docs[0].posts.hasNextPage).toStrictEqual(true) + expect(page2.docs[0].posts.hasPrevPage).toStrictEqual(true) + expect(page2.docs[0].posts.limit).toStrictEqual(4) + expect(page2.docs[0].posts.nextPage).toStrictEqual(3) + expect(page2.docs[0].posts.page).toStrictEqual(2) + expect(page2.docs[0].posts.pagingCounter).toStrictEqual(5) + expect(page2.docs[0].posts.prevPage).toStrictEqual(1) + expect(page2.docs[0].posts.totalDocs).toStrictEqual(10) + expect(page2.docs[0].posts.totalPages).toStrictEqual(3) + + expect(page3.docs[0].posts.docs).toHaveLength(2) + expect(page3.docs[0].posts.docs[0].title).toStrictEqual('test 8') + expect(page3.docs[0].posts.hasNextPage).toStrictEqual(false) + expect(page3.docs[0].posts.hasPrevPage).toStrictEqual(true) + expect(page3.docs[0].posts.limit).toStrictEqual(4) + expect(page3.docs[0].posts.nextPage).toStrictEqual(null) + expect(page3.docs[0].posts.page).toStrictEqual(3) + expect(page3.docs[0].posts.pagingCounter).toStrictEqual(9) + expect(page3.docs[0].posts.prevPage).toStrictEqual(2) + expect(page3.docs[0].posts.totalDocs).toStrictEqual(10) + expect(page3.docs[0].posts.totalPages).toStrictEqual(3) }) it('should sort joins', async () => { const response = await restClient .GET(`/categories/${category.id}?joins[posts][sort]=-title`) .then((res) => res.json()) - expect(response.posts[0].title).toStrictEqual('test c') + expect(response.posts.docs[0].title).toStrictEqual('test 9') }) }) }) + +async function createPost(overrides?: Partial) { + return payload.create({ + collection: 'posts', + data: { + title: 'test', + ...overrides, + }, + }) +} diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 8a141566e05..2251a86ce41 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -65,9 +65,33 @@ export interface Post { export interface Category { id: string; name?: string | null; - posts?: (string | Post)[] | null; + posts?: { + docs?: (string | Post)[] | null; + hasNextPage?: boolean | null; + hasPrevPage?: boolean | null; + limit?: number | null; + nextPage?: number | null; + offset?: number | null; + page?: number | null; + pagingCounter?: number | null; + prevPage?: number | null; + totalDocs?: number | null; + totalPages?: number | null; + } | null; group?: { - posts?: (string | Post)[] | null; + posts?: { + docs?: (string | Post)[] | null; + hasNextPage?: boolean | null; + hasPrevPage?: boolean | null; + limit?: number | null; + nextPage?: number | null; + offset?: number | null; + page?: number | null; + pagingCounter?: number | null; + prevPage?: number | null; + totalDocs?: number | null; + totalPages?: number | null; + } | null; }; updatedAt: string; createdAt: string; From d698f097e43dac846ed64a707f2f0ead5b5550cf Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Fri, 16 Aug 2024 09:13:25 -0400 Subject: [PATCH 024/173] adds limit --- test/_community/collections/Posts/TableField/index.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/_community/collections/Posts/TableField/index.tsx b/test/_community/collections/Posts/TableField/index.tsx index a72abf0496f..bb062ef9791 100644 --- a/test/_community/collections/Posts/TableField/index.tsx +++ b/test/_community/collections/Posts/TableField/index.tsx @@ -5,7 +5,6 @@ import { FieldLabel, ListQueryProvider, LoadingOverlay, - Pagination, TableColumnsProvider, useConfig, useDocumentDrawer, @@ -48,6 +47,8 @@ const relationTo = 'posts' const filterOptions: Where = {} +const defaultLimit = 5 + export const TableField: React.FC = (props) => { const { field } = props @@ -59,7 +60,7 @@ export const TableField: React.FC = (props) => getEntityConfig, } = useConfig() - const [limit, setLimit] = useState() + const [limit, setLimit] = useState(defaultLimit) const [sort, setSort] = useState(undefined) const [page, setPage] = useState(1) const [where, setWhere] = useState(null) @@ -117,6 +118,7 @@ export const TableField: React.FC = (props) => } } + if (limit) params.limit = limit if (page) params.page = page if (sort) params.sort = sort if (cacheBust) params.cacheBust = cacheBust @@ -124,7 +126,7 @@ export const TableField: React.FC = (props) => if (versions?.drafts) params.draft = 'true' setParams(params) - }, [page, sort, where, search, cacheBust, collectionConfig, setParams]) + }, [page, sort, where, search, cacheBust, collectionConfig, setParams, limit]) const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({ collectionSlug: relationTo, From 0381b54e0c3a7e4de6583e15b3051296bfd3b012 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 16 Aug 2024 12:28:47 -0400 Subject: [PATCH 025/173] chore: test joins localization --- packages/db-mongodb/src/utilities/setJoins.ts | 6 +- test/joins/config.ts | 41 ++++++++++++++ test/joins/int.spec.ts | 55 ++++++++++++++++++- test/joins/payload-types.ts | 38 ++++++++++++- 4 files changed, 135 insertions(+), 5 deletions(-) diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts index f9c211027bf..9ad76a32863 100644 --- a/packages/db-mongodb/src/utilities/setJoins.ts +++ b/packages/db-mongodb/src/utilities/setJoins.ts @@ -24,8 +24,8 @@ export const setJoins = async ({ const promises = [] - Object.keys(joinConfig).map(async (slug) => { - for (const join of joinConfig[slug]) { + Object.keys(joinConfig).forEach((slug) => { + joinConfig[slug].forEach((join) => { // get the query options for the join off of req // TODO: allow disabling the join completely // if (joins[join.schemaPath] === false || req.query[join.schemaPath] === 'false') { @@ -67,7 +67,7 @@ export const setJoins = async ({ } }), ) - } + }) }) await Promise.all(promises) diff --git a/test/joins/config.ts b/test/joins/config.ts index 9108a14c44a..dccf7560632 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -3,6 +3,7 @@ import path from 'path' import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' import { devUser } from '../credentials.js' + const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -66,7 +67,47 @@ export default buildConfigWithDefaults({ }, ], }, + { + slug: 'localized-posts', + admin: { + useAsTitle: 'title', + }, + fields: [ + { + name: 'title', + type: 'text', + }, + { + name: 'category', + type: 'relationship', + localized: true, + relationTo: 'localized-categories', + }, + ], + }, + { + slug: 'localized-categories', + admin: { + useAsTitle: 'name', + }, + fields: [ + { + name: 'name', + type: 'text', + }, + { + name: 'posts', + type: 'join', + collection: 'localized-posts', + on: 'category', + }, + ], + }, ], + localization: { + locales: ['en', 'es'], + defaultLocale: 'en', + }, onInit: async (payload) => { await payload.create({ collection: 'users', diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index 46ac8a13816..806cf55fe0e 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -8,7 +8,6 @@ import type { Category, Post } from './payload-types.js' import { devUser } from '../credentials.js' import { initPayloadInt } from '../helpers/initPayloadInt.js' -import configPromise from './config.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -92,6 +91,60 @@ describe('Joins Field Tests', () => { expect(categoryWithPosts.group.posts.docs[0].title).toBe('test 9') }) + describe('Joins with localization', () => { + let localizedCategory: Category + + beforeAll(async () => { + localizedCategory = await payload.create({ + collection: 'localized-categories', + locale: 'en', + data: { + name: 'localized category', + }, + }) + const post1 = await payload.create({ + collection: 'localized-posts', + locale: 'en', + data: { + title: 'english post', + category: localizedCategory.id, + }, + }) + await payload.update({ + collection: 'localized-posts', + id: post1.id, + locale: 'es', + data: { + title: 'spanish post', + category: localizedCategory.id, + }, + }) + await payload.create({ + collection: 'localized-posts', + locale: 'en', + data: { + title: 'spanish post', + category: localizedCategory.id, + }, + }) + }) + + it('should populate joins using findByID with localization on the relationship', async () => { + const enCategory = await payload.findByID({ + id: localizedCategory.id, + collection: 'localized-categories', + locale: 'en', + }) + const esCategory = await payload.findByID({ + id: localizedCategory.id, + collection: 'localized-categories', + locale: 'es', + }) + expect(enCategory.posts.docs).toHaveLength(2) + expect(esCategory.posts.docs).toHaveLength(1) + }) + }) + describe('REST', () => { it('should paginate joins', async () => { let page = 1 diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 2251a86ce41..c3646d7b6d4 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -13,6 +13,8 @@ export interface Config { collections: { posts: Post; categories: Category; + 'localized-posts': LocalizedPost; + 'localized-categories': LocalizedCategory; users: User; 'payload-preferences': PayloadPreference; 'payload-migrations': PayloadMigration; @@ -21,7 +23,7 @@ export interface Config { defaultIDType: string; }; globals: {}; - locale: null; + locale: 'en' | 'es'; user: User & { collection: 'users'; }; @@ -96,6 +98,40 @@ export interface Category { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "localized-posts". + */ +export interface LocalizedPost { + id: string; + title?: string | null; + category?: (string | null) | LocalizedCategory; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "localized-categories". + */ +export interface LocalizedCategory { + id: string; + name?: string | null; + posts?: { + docs?: (string | LocalizedPost)[] | null; + hasNextPage?: boolean | null; + hasPrevPage?: boolean | null; + limit?: number | null; + nextPage?: number | null; + offset?: number | null; + page?: number | null; + pagingCounter?: number | null; + prevPage?: number | null; + totalDocs?: number | null; + totalPages?: number | null; + } | null; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "users". From cc0c3ce52bd74c2a855f579f6fe88c3fd6dd660e Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Sat, 17 Aug 2024 14:16:25 -0400 Subject: [PATCH 026/173] chore(db-postgres): WIP joins --- .../db-postgres/src/schema/traverseFields.ts | 12 ++++++++ .../drizzle/src/find/buildFindManyArgs.ts | 13 ++++---- packages/drizzle/src/find/findMany.ts | 2 ++ packages/drizzle/src/find/traverseFields.ts | 30 +++++++++++++++++-- packages/payload/src/types/index.ts | 18 ++++++----- 5 files changed, 60 insertions(+), 15 deletions(-) diff --git a/packages/db-postgres/src/schema/traverseFields.ts b/packages/db-postgres/src/schema/traverseFields.ts index 5eb46bcdae3..c4b0ce8c41a 100644 --- a/packages/db-postgres/src/schema/traverseFields.ts +++ b/packages/db-postgres/src/schema/traverseFields.ts @@ -764,6 +764,18 @@ export const traverseFields = ({ break + case 'join': { + // fieldName could be 'posts' or 'group_posts' + // using on as the key for the relation + rootRelationsToBuild.set(toSnakeCase(field.on), { + type: 'many', + // joins are not localized on the parent table + localized: false, + target: adapter.tableNameMap.get(toSnakeCase(field.collection)), + }) + break + } + default: break } diff --git a/packages/drizzle/src/find/buildFindManyArgs.ts b/packages/drizzle/src/find/buildFindManyArgs.ts index 15f446e1df6..0c8e600626c 100644 --- a/packages/drizzle/src/find/buildFindManyArgs.ts +++ b/packages/drizzle/src/find/buildFindManyArgs.ts @@ -1,5 +1,5 @@ import type { DBQueryConfig } from 'drizzle-orm' -import type { Field } from 'payload' +import type { Field, JoinQuery } from 'payload' import type { DrizzleAdapter } from '../types.js' @@ -9,14 +9,15 @@ type BuildFindQueryArgs = { adapter: DrizzleAdapter depth: number fields: Field[] + joinQuery?: JoinQuery tableName: string } -export type Result = DBQueryConfig<'many', true, any, any> & { - with?: DBQueryConfig<'many', true, any, any> & { +export type Result = { + with?: { _locales?: DBQueryConfig<'many', true, any, any> - } -} + } & DBQueryConfig<'many', true, any, any> +} & DBQueryConfig<'many', true, any, any> // Generate the Drizzle query for findMany based on // a collection field structure @@ -24,6 +25,7 @@ export const buildFindManyArgs = ({ adapter, depth, fields, + joinQuery, tableName, }: BuildFindQueryArgs): Record => { const result: Result = { @@ -79,6 +81,7 @@ export const buildFindManyArgs = ({ currentTableName: tableName, depth, fields, + joinQuery, path: '', topLevelArgs: result, topLevelTableName: tableName, diff --git a/packages/drizzle/src/find/findMany.ts b/packages/drizzle/src/find/findMany.ts index 5d5fad0a297..4ff102718dd 100644 --- a/packages/drizzle/src/find/findMany.ts +++ b/packages/drizzle/src/find/findMany.ts @@ -19,6 +19,7 @@ type Args = { export const findMany = async function find({ adapter, fields, + joins: joinQuery, limit: limitArg, locale, page = 1, @@ -67,6 +68,7 @@ export const findMany = async function find({ adapter, depth: 0, fields, + joinQuery, tableName, }) diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index c8d1534022b..9df09109256 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -1,5 +1,4 @@ -/* eslint-disable no-param-reassign */ -import type { Field } from 'payload' +import type { Field, JoinQuery } from 'payload' import { fieldAffectsData, tabHasName } from 'payload/shared' import toSnakeCase from 'to-snake-case' @@ -14,6 +13,7 @@ type TraverseFieldArgs = { currentTableName: string depth?: number fields: Field[] + joinQuery: JoinQuery path: string topLevelArgs: Record topLevelTableName: string @@ -26,6 +26,7 @@ export const traverseFields = ({ currentTableName, depth, fields, + joinQuery, path, topLevelArgs, topLevelTableName, @@ -52,6 +53,7 @@ export const traverseFields = ({ currentTableName, depth, fields: field.fields, + joinQuery, path, topLevelArgs, topLevelTableName, @@ -71,6 +73,7 @@ export const traverseFields = ({ currentTableName, depth, fields: tab.fields, + joinQuery, path: tabPath, topLevelArgs, topLevelTableName, @@ -115,6 +118,7 @@ export const traverseFields = ({ currentTableName: arrayTableName, depth, fields: field.fields, + joinQuery, path: '', topLevelArgs, topLevelTableName, @@ -171,6 +175,7 @@ export const traverseFields = ({ currentTableName: tableName, depth, fields: block.fields, + joinQuery, path: '', topLevelArgs, topLevelTableName, @@ -188,6 +193,7 @@ export const traverseFields = ({ currentTableName, depth, fields: field.fields, + joinQuery, path: `${path}${field.name}_`, topLevelArgs, topLevelTableName, @@ -195,6 +201,26 @@ export const traverseFields = ({ break + case 'join': { + // if `joinsQuery` is false, do not join + if (joinQuery !== false) { + // TODO: field.on is the incorrect property for the join field. It needs to be assigned as toSnakeCase(fieldName) + // but this breaks the relation disambiguation in the query builder. This needs to be fixed. + topLevelArgs.with[toSnakeCase(field.on)] = { + columns: { + id: true, + }, + } + // topLevelArgs.with[`${path}${field.name}`] = { + // // sort + // orderBy: ({ order }, { asc }) => [asc(order)], + // // page + // // limit + // } + } + break + } + default: { break } diff --git a/packages/payload/src/types/index.ts b/packages/payload/src/types/index.ts index 0306929d017..f6a359977cd 100644 --- a/packages/payload/src/types/index.ts +++ b/packages/payload/src/types/index.ts @@ -112,14 +112,16 @@ export type Where = { /** * Applies pagination for join fields for including collection relationships */ -export type JoinQuery = { - [schemaPath: string]: { - limit?: number - page?: number - pagination?: boolean - sort?: string - } -} +export type JoinQuery = + | { + [schemaPath: string]: { + limit?: number + page?: number + pagination?: boolean + sort?: string + } + } + | false // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Document = any From e2bc203123922c96d2ccba07ee9338db73b5efa7 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Sat, 17 Aug 2024 15:19:47 -0400 Subject: [PATCH 027/173] chore(db-postgres): fixes join relationName to have correct field name --- packages/db-postgres/src/schema/build.ts | 18 +++++++++++++----- .../db-postgres/src/schema/traverseFields.ts | 3 ++- packages/drizzle/src/find/traverseFields.ts | 8 ++------ 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/db-postgres/src/schema/build.ts b/packages/db-postgres/src/schema/build.ts index 52abfd72f8c..20f32ccf533 100644 --- a/packages/db-postgres/src/schema/build.ts +++ b/packages/db-postgres/src/schema/build.ts @@ -33,7 +33,15 @@ export type BaseExtraConfig = Record< (cols: GenericColumns) => ForeignKeyBuilder | IndexBuilder | UniqueConstraintBuilder > -export type RelationMap = Map +export type RelationMap = Map< + string, + { + localized: boolean + relationName?: string + target: string + type: 'many' | 'one' + } +> type Args = { adapter: PostgresAdapter @@ -129,9 +137,9 @@ export const buildTable = ({ const localizedRelations = new Map() const nonLocalizedRelations = new Map() - relationsToBuild.forEach(({ type, localized, target }, key) => { + relationsToBuild.forEach(({ type, localized, relationName, target }, key) => { const map = localized ? localizedRelations : nonLocalizedRelations - map.set(key, { type, target }) + map.set(key, { type, relationName, target }) }) if (timestamps) { @@ -431,7 +439,7 @@ export const buildTable = ({ adapter.relations[`relations_${tableName}`] = relations(table, ({ many, one }) => { const result: Record> = {} - nonLocalizedRelations.forEach(({ type, target }, key) => { + nonLocalizedRelations.forEach(({ type, relationName, target }, key) => { if (type === 'one') { result[key] = one(adapter.tables[target], { fields: [table[key]], @@ -440,7 +448,7 @@ export const buildTable = ({ }) } if (type === 'many') { - result[key] = many(adapter.tables[target], { relationName: key }) + result[key] = many(adapter.tables[target], { relationName: relationName || key }) } }) diff --git a/packages/db-postgres/src/schema/traverseFields.ts b/packages/db-postgres/src/schema/traverseFields.ts index c4b0ce8c41a..94911a8adfd 100644 --- a/packages/db-postgres/src/schema/traverseFields.ts +++ b/packages/db-postgres/src/schema/traverseFields.ts @@ -767,10 +767,11 @@ export const traverseFields = ({ case 'join': { // fieldName could be 'posts' or 'group_posts' // using on as the key for the relation - rootRelationsToBuild.set(toSnakeCase(field.on), { + rootRelationsToBuild.set(fieldName, { type: 'many', // joins are not localized on the parent table localized: false, + relationName: toSnakeCase(field.on), target: adapter.tableNameMap.get(toSnakeCase(field.collection)), }) break diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index 9df09109256..a107a896646 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -202,21 +202,17 @@ export const traverseFields = ({ break case 'join': { - // if `joinsQuery` is false, do not join + // when `joinsQuery` is false, do not join if (joinQuery !== false) { - // TODO: field.on is the incorrect property for the join field. It needs to be assigned as toSnakeCase(fieldName) - // but this breaks the relation disambiguation in the query builder. This needs to be fixed. - topLevelArgs.with[toSnakeCase(field.on)] = { + topLevelArgs.with[toSnakeCase(`${path}${field.name}`)] = { columns: { id: true, }, } - // topLevelArgs.with[`${path}${field.name}`] = { // // sort // orderBy: ({ order }, { asc }) => [asc(order)], // // page // // limit - // } } break } From e14264c15cba41d6ae5fbddc741a44c6b2cb40ca Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Sun, 18 Aug 2024 18:25:29 -0400 Subject: [PATCH 028/173] feat: adds payload-locks collection --- packages/payload/src/config/sanitize.ts | 3 +- packages/payload/src/locks/locksCollection.ts | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 packages/payload/src/locks/locksCollection.ts diff --git a/packages/payload/src/config/sanitize.ts b/packages/payload/src/config/sanitize.ts index 49485daf259..04e601cac00 100644 --- a/packages/payload/src/config/sanitize.ts +++ b/packages/payload/src/config/sanitize.ts @@ -15,9 +15,9 @@ import { sanitizeCollection } from '../collections/config/sanitize.js' import { migrationsCollection } from '../database/migrations/migrationsCollection.js' import { InvalidConfiguration } from '../errors/index.js' import { sanitizeGlobals } from '../globals/config/sanitize.js' +import { getLocksCollection } from '../locks/locksCollection.js' import getPreferencesCollection from '../preferences/preferencesCollection.js' import checkDuplicateCollections from '../utilities/checkDuplicateCollections.js' -import { deepMergeWithReactComponents } from '../utilities/deepMerge.js' import { defaults } from './defaults.js' const sanitizeAdminConfig = (configToSanitize: Config): Partial => { @@ -148,6 +148,7 @@ export const sanitizeConfig = async (incomingConfig: Config): Promise Promise> = [] diff --git a/packages/payload/src/locks/locksCollection.ts b/packages/payload/src/locks/locksCollection.ts new file mode 100644 index 00000000000..a325bebfa0e --- /dev/null +++ b/packages/payload/src/locks/locksCollection.ts @@ -0,0 +1,56 @@ +import type { CollectionConfig } from '../collections/config/types.js' +import type { Access, Config } from '../config/types.js' + +const lockAccess: Access = ({ req }) => ({ + 'user.value': { + equals: req?.user?.id, + }, +}) + +export const getLocksCollection = (config: Config): CollectionConfig => ({ + slug: 'payload-locks', + // access: { + // delete: lockAccess, + // read: lockAccess, + // }, + // admin: { + // hidden: true, + // }, + fields: [ + { + name: 'docId', + type: 'text', + }, + { + name: '_lastEdited', + type: 'group', + fields: [ + { + name: 'user', + type: 'relationship', + hooks: { + beforeValidate: [ + ({ req }) => { + if (!req?.user) { + return null + } + return { + relationTo: req?.user.collection, + value: req?.user.id, + } + }, + ], + }, + relationTo: config.collections + .filter((collectionConfig) => collectionConfig.auth) + .map((collectionConfig) => collectionConfig.slug), + required: true, + }, + { + name: 'editedAt', + type: 'date', + }, + ], + }, + ], +}) From 9fd3b652dfd88e587aa92dd6b35946f5e77152b2 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Sun, 18 Aug 2024 18:26:57 -0400 Subject: [PATCH 029/173] feat: adds DocumentLockProvider & locks document when editing --- .../next/src/views/Edit/Default/index.tsx | 19 ++- packages/ui/src/elements/SelectRow/index.tsx | 7 ++ packages/ui/src/exports/client/index.ts | 2 + .../ui/src/hooks/useDocumentLockStatus.ts | 36 ++++++ .../ui/src/providers/DocumentLock/index.tsx | 113 ++++++++++++++++++ packages/ui/src/providers/Root/index.tsx | 37 +++--- 6 files changed, 196 insertions(+), 18 deletions(-) create mode 100644 packages/ui/src/hooks/useDocumentLockStatus.ts create mode 100644 packages/ui/src/providers/DocumentLock/index.tsx diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index b95af6eecb5..af313843d40 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -14,12 +14,13 @@ import { useConfig, useDocumentEvents, useDocumentInfo, + useDocumentLock, useEditDepth, useUploadEdits, } from '@payloadcms/ui' import { formatAdminURL, getFormState } from '@payloadcms/ui/shared' import { useRouter, useSearchParams } from 'next/navigation.js' -import React, { Fragment, useCallback, useState } from 'react' +import React, { Fragment, useCallback, useEffect, useRef, useState } from 'react' import { LeaveWithoutSaving } from '../../../elements/LeaveWithoutSaving/index.js' import { Auth } from './Auth/index.js' @@ -58,6 +59,8 @@ export const DefaultEditView: React.FC = () => { } = useDocumentInfo() const { refreshCookieAsync, user } = useAuth() + const { lockDocument, unlockDocument } = useDocumentLock() + const hasLocked = useRef(false) const { config, @@ -109,6 +112,20 @@ export const DefaultEditView: React.FC = () => { return false }) + useEffect(() => { + if (id && collectionSlug && !hasLocked.current) { + void lockDocument(id) + hasLocked.current = true + } + + return () => { + if (id && collectionSlug && hasLocked.current) { + void unlockDocument(id) + hasLocked.current = false + } + } + }, [id, collectionSlug, lockDocument, unlockDocument]) + const onSave = useCallback( (json) => { reportUpdate({ diff --git a/packages/ui/src/elements/SelectRow/index.tsx b/packages/ui/src/elements/SelectRow/index.tsx index 1536ac3332d..e38bb49d8ea 100644 --- a/packages/ui/src/elements/SelectRow/index.tsx +++ b/packages/ui/src/elements/SelectRow/index.tsx @@ -1,8 +1,10 @@ 'use client' +import { useDocumentLockStatus } from '@payloadcms/ui' import React from 'react' import { useTableCell } from '../../elements/Table/TableCellProvider/index.js' import { CheckboxInput } from '../../fields/Checkbox/Input.js' +import { LockIcon } from '../../icons/Lock/index.js' import { useSelection } from '../../providers/Selection/index.js' import './index.scss' @@ -11,6 +13,11 @@ const baseClass = 'select-row' export const SelectRow: React.FC = () => { const { selected, setSelection } = useSelection() const { rowData } = useTableCell() + const isLocked = useDocumentLockStatus(rowData?.id) + + if (isLocked) { + return + } return ( { + const [isLocked, setIsLocked] = useState(false) + const { config } = useConfig() + + useEffect(() => { + const checkLockStatus = async () => { + try { + const request = await requests.get( + `${config.serverURL}${config.routes.api}/payload-locks?where[docId][equals]=${docId}`, + ) + + const { docs } = await request.json() + + if (docs.length > 0) { + setIsLocked(true) + } else { + setIsLocked(false) + } + } catch (error) { + console.error('Failed to check the lock status of the document', error) + setIsLocked(false) + } + } + + if (docId) { + void checkLockStatus() + } + }, [docId, config.serverURL, config.routes.api]) + + return isLocked +} diff --git a/packages/ui/src/providers/DocumentLock/index.tsx b/packages/ui/src/providers/DocumentLock/index.tsx new file mode 100644 index 00000000000..4495d145423 --- /dev/null +++ b/packages/ui/src/providers/DocumentLock/index.tsx @@ -0,0 +1,113 @@ +'use client' +import React, { createContext, useCallback, useContext, useRef, useState } from 'react' + +import { requests } from '../../utilities/api.js' +import { useAuth } from '../Auth/index.js' +import { useConfig } from '../Config/index.js' + +type DocumentLockContextType = { + lockDocument: (docId: number | string) => Promise + unlockDocument: (docId: number | string) => Promise +} + +const DocumentLockContext = createContext(undefined) + +export const DocumentLockProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) => { + const { config } = useConfig() + const { user } = useAuth() + const [isLocked, setIsLocked] = useState(false) + const lockInProgress = useRef(false) + + const { + routes: { api }, + serverURL, + } = config + + const lockDocument = useCallback( + async (docId: number | string) => { + if (lockInProgress.current) { + console.log('Lock already in progress, skipping:', docId) + return + } + + lockInProgress.current = true + + console.log('Attempting to lock document:', docId) + + try { + const request = await requests.get( + `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, + ) + + const { docs } = await request.json() + + if (docs.length === 0) { + await requests.post(`${serverURL}${api}/payload-locks`, { + body: JSON.stringify({ + _lastEdited: { + editedAt: new Date(), + user: { relationTo: user?.collection, value: user?.id }, + }, + docId, + }), + headers: { + 'Content-Type': 'application/json', + }, + }) + setIsLocked(true) + console.log('Document locked') + } else { + console.log('Document already locked by this user') + setIsLocked(true) + } + } catch (error) { + console.error('Failed to lock the document', error) + } finally { + lockInProgress.current = false + } + }, + [serverURL, api, user], + ) + + const unlockDocument = useCallback( + async (docId: number | string) => { + console.log('Attempting to unlock document:', docId) + if (!isLocked) { + console.log('Document is not locked, no need to unlock') + return + } + + try { + const request = await requests.get( + `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, + ) + + const { docs } = await request.json() + + if (docs.length > 0) { + const lockId = docs[0].id + await requests.delete(`${serverURL}${api}/payload-locks/${lockId}`, { + headers: { + 'Content-Type': 'application/json', + }, + }) + setIsLocked(false) + console.log('Document unlocked') + } else { + console.log('No lock found for this user, skipping unlock') + } + } catch (error) { + console.error('Failed to unlock the document', error) + } + }, + [serverURL, api, isLocked], + ) + + return ( + + {children} + + ) +} + +export const useDocumentLock = (): DocumentLockContextType => useContext(DocumentLockContext) diff --git a/packages/ui/src/providers/Root/index.tsx b/packages/ui/src/providers/Root/index.tsx index 4c6dce7ce2f..195dd545d47 100644 --- a/packages/ui/src/providers/Root/index.tsx +++ b/packages/ui/src/providers/Root/index.tsx @@ -19,6 +19,7 @@ import { AuthProvider } from '../Auth/index.js' import { ClientFunctionProvider } from '../ClientFunction/index.js' import { ConfigProvider } from '../Config/index.js' import { DocumentEventsProvider } from '../DocumentEvents/index.js' +import { DocumentLockProvider } from '../DocumentLock/index.js' import { FieldComponentsProvider } from '../FieldComponents/index.js' import { LocaleProvider } from '../Locale/index.js' import { ParamsProvider } from '../Params/index.js' @@ -85,23 +86,25 @@ export const RootProvider: React.FC = ({ - - - - - - - - - {children} - - - - - - - - + + + + + + + + + + {children} + + + + + + + + + From f8414e3053546b37f1ff4b2acdd4c9a460686168 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Mon, 19 Aug 2024 17:18:18 -0400 Subject: [PATCH 030/173] chore(db-postgres): localized joins --- .../db-postgres/src/schema/traverseFields.ts | 6 +- packages/drizzle/src/find.ts | 2 + .../drizzle/src/find/buildFindManyArgs.ts | 3 + packages/drizzle/src/find/traverseFields.ts | 42 ++++++++++-- packages/drizzle/src/queries/buildQuery.ts | 67 ++++--------------- .../drizzle/src/queries/selectDistinct.ts | 4 +- .../src/transform/read/traverseFields.ts | 49 +++++++++++++- .../rest/utilities/sanitizeJoinParams.ts | 9 ++- test/joins/config.ts | 1 + 9 files changed, 117 insertions(+), 66 deletions(-) diff --git a/packages/db-postgres/src/schema/traverseFields.ts b/packages/db-postgres/src/schema/traverseFields.ts index 94911a8adfd..68ee2f8bcc2 100644 --- a/packages/db-postgres/src/schema/traverseFields.ts +++ b/packages/db-postgres/src/schema/traverseFields.ts @@ -767,12 +767,14 @@ export const traverseFields = ({ case 'join': { // fieldName could be 'posts' or 'group_posts' // using on as the key for the relation - rootRelationsToBuild.set(fieldName, { + const localized = adapter.payload.config.localization && field.localized + const target = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${localized ? adapter.localesSuffix : ''}` + relationsToBuild.set(fieldName, { type: 'many', // joins are not localized on the parent table localized: false, relationName: toSnakeCase(field.on), - target: adapter.tableNameMap.get(toSnakeCase(field.collection)), + target, }) break } diff --git a/packages/drizzle/src/find.ts b/packages/drizzle/src/find.ts index 2e49973182e..549ed6e13c2 100644 --- a/packages/drizzle/src/find.ts +++ b/packages/drizzle/src/find.ts @@ -10,6 +10,7 @@ export const find: Find = async function find( this: DrizzleAdapter, { collection, + joins, limit, locale, page = 1, @@ -27,6 +28,7 @@ export const find: Find = async function find( return findMany({ adapter: this, fields: collectionConfig.fields, + joins, limit, locale, page, diff --git a/packages/drizzle/src/find/buildFindManyArgs.ts b/packages/drizzle/src/find/buildFindManyArgs.ts index 0c8e600626c..861225aa587 100644 --- a/packages/drizzle/src/find/buildFindManyArgs.ts +++ b/packages/drizzle/src/find/buildFindManyArgs.ts @@ -10,6 +10,7 @@ type BuildFindQueryArgs = { depth: number fields: Field[] joinQuery?: JoinQuery + locale?: string tableName: string } @@ -26,6 +27,7 @@ export const buildFindManyArgs = ({ depth, fields, joinQuery, + locale, tableName, }: BuildFindQueryArgs): Record => { const result: Result = { @@ -82,6 +84,7 @@ export const buildFindManyArgs = ({ depth, fields, joinQuery, + locale, path: '', topLevelArgs: result, topLevelTableName: tableName, diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index a107a896646..eba7de08dcc 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -1,11 +1,15 @@ +import type { DBQueryConfig } from 'drizzle-orm' import type { Field, JoinQuery } from 'payload' +import { APIError } from 'payload' import { fieldAffectsData, tabHasName } from 'payload/shared' import toSnakeCase from 'to-snake-case' import type { DrizzleAdapter } from '../types.js' import type { Result } from './buildFindManyArgs.js' +import { buildOrderBy } from '../queries/buildOrderBy.js' + type TraverseFieldArgs = { _locales: Result adapter: DrizzleAdapter @@ -14,6 +18,7 @@ type TraverseFieldArgs = { depth?: number fields: Field[] joinQuery: JoinQuery + locale?: string path: string topLevelArgs: Record topLevelTableName: string @@ -26,7 +31,8 @@ export const traverseFields = ({ currentTableName, depth, fields, - joinQuery, + joinQuery = {}, + locale, path, topLevelArgs, topLevelTableName, @@ -204,15 +210,39 @@ export const traverseFields = ({ case 'join': { // when `joinsQuery` is false, do not join if (joinQuery !== false) { - topLevelArgs.with[toSnakeCase(`${path}${field.name}`)] = { + const { limit = 10, page = 1, sort } = joinQuery[`${path}${field.name}`] || {} + if (page !== 1) { + // we need a second query in read step to complete the join because drizzle doesn't support offset + throw new APIError('Pagination is not supported for joins') + } + const fields = adapter.payload.collections[field.collection].config.fields + const joinTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${ + field.localized && adapter.payload.config.localization ? adapter.localesSuffix : '' + }` + const selectFields = {} + const orderBy = buildOrderBy({ + adapter, + fields, + joins: [], + locale, + selectFields, + sort, + tableName: joinTableName, + }) + const withJoin: DBQueryConfig<'many', true, any, any> = { columns: { id: true, + ...selectFields, }, + // TODO: join a custom query to handle count + // extras: {}, + limit, + orderBy: () => [orderBy.order(orderBy.column)], + } + if (field.localized) { + withJoin.columns._locale = true } - // // sort - // orderBy: ({ order }, { asc }) => [asc(order)], - // // page - // // limit + currentArgs.with[toSnakeCase(`${path}${field.name}`)] = withJoin } break } diff --git a/packages/drizzle/src/queries/buildQuery.ts b/packages/drizzle/src/queries/buildQuery.ts index 7d565b86aab..22cc58162be 100644 --- a/packages/drizzle/src/queries/buildQuery.ts +++ b/packages/drizzle/src/queries/buildQuery.ts @@ -1,12 +1,10 @@ -import type { SQL } from 'drizzle-orm' +import type { SQL, asc, desc } from 'drizzle-orm' import type { PgTableWithColumns } from 'drizzle-orm/pg-core' import type { Field, Where } from 'payload' -import { asc, desc } from 'drizzle-orm' - import type { DrizzleAdapter, GenericColumn, GenericTable } from '../types.js' -import { getTableColumnFromPath } from './getTableColumnFromPath.js' +import { buildOrderBy } from './buildOrderBy.js' import { parseParams } from './parseParams.js' export type BuildQueryJoinAliases = { @@ -23,7 +21,7 @@ type BuildQueryArgs = { where: Where } -type Result = { +export type BuildQueryResult = { joins: BuildQueryJoinAliases orderBy: { column: GenericColumn @@ -39,60 +37,21 @@ const buildQuery = async function buildQuery({ sort, tableName, where: incomingWhere, -}: BuildQueryArgs): Promise { +}: BuildQueryArgs): Promise { const selectFields: Record = { id: adapter.tables[tableName].id, } const joins: BuildQueryJoinAliases = [] - const orderBy: Result['orderBy'] = { - column: null, - order: null, - } - - if (sort) { - let sortPath - - if (sort[0] === '-') { - sortPath = sort.substring(1) - orderBy.order = desc - } else { - sortPath = sort - orderBy.order = asc - } - - try { - const { columnName: sortTableColumnName, table: sortTable } = getTableColumnFromPath({ - adapter, - collectionPath: sortPath, - fields, - joins, - locale, - pathSegments: sortPath.replace(/__/g, '.').split('.'), - selectFields, - tableName, - value: sortPath, - }) - orderBy.column = sortTable?.[sortTableColumnName] - } catch (err) { - // continue - } - } - - if (!orderBy?.column) { - orderBy.order = desc - const createdAt = adapter.tables[tableName]?.createdAt - - if (createdAt) { - orderBy.column = createdAt - } else { - orderBy.column = adapter.tables[tableName].id - } - } - - if (orderBy.column) { - selectFields.sort = orderBy.column - } + const orderBy = buildOrderBy({ + adapter, + fields, + joins, + locale, + selectFields, + sort, + tableName, + }) let where: SQL diff --git a/packages/drizzle/src/queries/selectDistinct.ts b/packages/drizzle/src/queries/selectDistinct.ts index dda8b0823ea..3e393dd82be 100644 --- a/packages/drizzle/src/queries/selectDistinct.ts +++ b/packages/drizzle/src/queries/selectDistinct.ts @@ -5,6 +5,7 @@ import type { ChainedMethods } from '../find/chainMethods.js' import type { DrizzleAdapter, DrizzleTransaction, + GenericColumn, GenericPgColumn, TransactionPg, TransactionSQLite, @@ -12,7 +13,6 @@ import type { import type { BuildQueryJoinAliases } from './buildQuery.js' import { chainMethods } from '../find/chainMethods.js' -import { type GenericColumn } from '../types.js' type Args = { adapter: DrizzleAdapter @@ -35,7 +35,7 @@ export const selectDistinct = ({ selectFields, tableName, where, -}: Args): QueryPromise & { id: number | string }[]> => { +}: Args): QueryPromise<{ id: number | string }[] & Record> => { if (Object.keys(joins).length > 0) { if (where) { chainedMethods.push({ args: [where], method: 'where' }) diff --git a/packages/drizzle/src/transform/read/traverseFields.ts b/packages/drizzle/src/transform/read/traverseFields.ts index a899079f9a7..d034731af82 100644 --- a/packages/drizzle/src/transform/read/traverseFields.ts +++ b/packages/drizzle/src/transform/read/traverseFields.ts @@ -1,4 +1,4 @@ -import type { Field, SanitizedConfig, TabAsField } from 'payload' +import type { Field, PaginatedDocs, SanitizedConfig, TabAsField } from 'payload' import { fieldAffectsData } from 'payload/shared' @@ -374,6 +374,53 @@ export const traverseFields = >({ return result } + if (field.type === 'join') { + let fieldResult: PaginatedDocs | Record + if (Array.isArray(fieldData)) { + if (field.localized) { + fieldResult = fieldData.reduce((joinResult, row) => { + if (typeof row._locale === 'string') { + if (!joinResult[row._locale]) { + // TODO: handle pagination + joinResult[row._locale] = { + docs: [], + hasNextPage: false, + hasPrevPage: false, + limit: 0, + nextPage: 0, + page: 1, + pagingCounter: 0, + prevPage: 0, + totalDocs: 0, + totalPages: 0, + } + } + joinResult[row._locale].docs.push(row.id) + } + + return joinResult + }, {}) + } else { + // TODO: handle pagination + fieldResult = { + docs: fieldData, + hasNextPage: false, + hasPrevPage: false, + limit: 0, + nextPage: 0, + page: 1, + pagingCounter: 0, + prevPage: 0, + totalDocs: 0, + totalPages: 0, + } + } + } + + result[field.name] = fieldResult + return result + } + if (field.type === 'number' && field.hasMany) { const numberPathMatch = numbers[`${sanitizedPath}${field.name}`] if (!numberPathMatch) return result diff --git a/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts b/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts index 2bf39b40d2e..288e1cff202 100644 --- a/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts +++ b/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts @@ -7,7 +7,9 @@ import { isNumber } from 'payload/shared' * @param joins */ export const sanitizeJoinParams = ( - joins: { [schemaPath: string]: { limit?: unknown; page?: unknown; sort?: string } } = {}, + joins: { + [schemaPath: string]: { limit?: unknown; page?: unknown; pagination?: unknown; sort?: string } + } = {}, ): JoinQuery => { const joinQuery = {} @@ -15,6 +17,11 @@ export const sanitizeJoinParams = ( joinQuery[schemaPath] = { limit: isNumber(joins[schemaPath]?.limit) ? Number(joins[schemaPath].limit) : undefined, page: isNumber(joins[schemaPath]?.page) ? Number(joins[schemaPath].page) : undefined, + pagination: + joins[schemaPath]?.pagination && + (joins[schemaPath].pagination === 'true' || joins[schemaPath].pagination) + ? true + : undefined, sort: joins[schemaPath]?.sort ? joins[schemaPath].sort : undefined, } }) diff --git a/test/joins/config.ts b/test/joins/config.ts index dccf7560632..238e572195a 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -100,6 +100,7 @@ export default buildConfigWithDefaults({ type: 'join', collection: 'localized-posts', on: 'category', + localized: true, }, ], }, From b63a37a5cdbfdfa9f7a18c2b271f2cb14690229f Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 20 Aug 2024 08:48:26 -0400 Subject: [PATCH 031/173] chore: fix build error --- .../src/routes/rest/utilities/sanitizeJoinParams.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts b/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts index 288e1cff202..473149da5dd 100644 --- a/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts +++ b/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts @@ -7,9 +7,16 @@ import { isNumber } from 'payload/shared' * @param joins */ export const sanitizeJoinParams = ( - joins: { - [schemaPath: string]: { limit?: unknown; page?: unknown; pagination?: unknown; sort?: string } - } = {}, + joins: + | { + [schemaPath: string]: { + limit?: unknown + page?: unknown + pagination?: unknown + sort?: string + } + } + | false = {}, ): JoinQuery => { const joinQuery = {} From 905e91a2f03d2a9a9558bb524950d0369227f450 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Tue, 20 Aug 2024 13:47:17 -0400 Subject: [PATCH 032/173] feat: adds document-locked & document-take-over modal --- .../src/elements/DocumentLocked/index.scss | 37 +++++++++ .../src/elements/DocumentLocked/index.tsx | 81 +++++++++++++++++++ .../src/elements/DocumentTakeOver/index.scss | 37 +++++++++ .../src/elements/DocumentTakeOver/index.tsx | 51 ++++++++++++ packages/translations/src/clientKeys.ts | 4 + packages/translations/src/languages/ar.ts | 4 + packages/translations/src/languages/az.ts | 4 + packages/translations/src/languages/bg.ts | 4 + packages/translations/src/languages/cs.ts | 4 + packages/translations/src/languages/de.ts | 4 + packages/translations/src/languages/en.ts | 4 + packages/translations/src/languages/es.ts | 4 + packages/translations/src/languages/fa.ts | 4 + packages/translations/src/languages/fr.ts | 4 + packages/translations/src/languages/he.ts | 4 + packages/translations/src/languages/hr.ts | 4 + packages/translations/src/languages/hu.ts | 4 + packages/translations/src/languages/it.ts | 4 + packages/translations/src/languages/ja.ts | 4 + packages/translations/src/languages/ko.ts | 4 + packages/translations/src/languages/my.ts | 4 + packages/translations/src/languages/nb.ts | 4 + packages/translations/src/languages/nl.ts | 4 + packages/translations/src/languages/pl.ts | 4 + packages/translations/src/languages/pt.ts | 4 + packages/translations/src/languages/ro.ts | 4 + packages/translations/src/languages/rs.ts | 4 + .../translations/src/languages/rsLatin.ts | 4 + packages/translations/src/languages/ru.ts | 4 + packages/translations/src/languages/sk.ts | 4 + packages/translations/src/languages/sv.ts | 4 + packages/translations/src/languages/th.ts | 4 + packages/translations/src/languages/tr.ts | 4 + packages/translations/src/languages/uk.ts | 4 + packages/translations/src/languages/vi.ts | 4 + packages/translations/src/languages/zh.ts | 4 + packages/translations/src/languages/zhTw.ts | 4 + 37 files changed, 338 insertions(+) create mode 100644 packages/next/src/elements/DocumentLocked/index.scss create mode 100644 packages/next/src/elements/DocumentLocked/index.tsx create mode 100644 packages/next/src/elements/DocumentTakeOver/index.scss create mode 100644 packages/next/src/elements/DocumentTakeOver/index.tsx diff --git a/packages/next/src/elements/DocumentLocked/index.scss b/packages/next/src/elements/DocumentLocked/index.scss new file mode 100644 index 00000000000..d2e6d392dda --- /dev/null +++ b/packages/next/src/elements/DocumentLocked/index.scss @@ -0,0 +1,37 @@ +@import '../../scss/styles.scss'; + +.document-locked { + @include blur-bg; + display: flex; + align-items: center; + justify-content: center; + height: 100%; + + &__wrapper { + z-index: 1; + position: relative; + display: flex; + flex-direction: column; + gap: var(--base); + padding: base(2); + } + + &__content { + display: flex; + flex-direction: column; + gap: var(--base); + + > * { + margin: 0; + } + } + + &__controls { + display: flex; + gap: var(--base); + + .btn { + margin: 0; + } + } +} diff --git a/packages/next/src/elements/DocumentLocked/index.tsx b/packages/next/src/elements/DocumentLocked/index.tsx new file mode 100644 index 00000000000..3cbe4153c9e --- /dev/null +++ b/packages/next/src/elements/DocumentLocked/index.tsx @@ -0,0 +1,81 @@ +'use client' +import type { ClientUser } from 'payload' + +import { Button, Modal, useModal, useTranslation } from '@payloadcms/ui' +import React, { useEffect } from 'react' + +import './index.scss' + +const modalSlug = 'document-locked' + +const baseClass = 'document-locked' + +const formatDate = (dateString) => { + if (!dateString) return '' + const date = new Date(dateString) + return new Intl.DateTimeFormat('en-US', { + day: 'numeric', + hour: 'numeric', + hour12: true, + minute: 'numeric', + month: 'short', + year: 'numeric', + }).format(date) +} + +export const DocumentLocked: React.FC<{ + editedAt: null | string + handleGoBack: () => void + isActive: boolean + onReadOnly: () => void + onTakeOver: () => Promise + user?: ClientUser +}> = ({ editedAt, handleGoBack, isActive, onReadOnly, onTakeOver, user }) => { + const { closeModal, openModal } = useModal() + const { t } = useTranslation() + + useEffect(() => { + if (isActive) openModal(modalSlug) + else closeModal(modalSlug) + }, [isActive, openModal, closeModal]) + + return ( + +
+
+

{t('general:documentLocked')}

+

{`${user?.email ?? user?.id} is currently editing this document. If you take over, they will be blocked from continuing to eit, and may also lose unsaved changes.`}

+

+ {`Edited since `} + {formatDate(editedAt)} +

+
+
+ + + +
+
+
+ ) +} diff --git a/packages/next/src/elements/DocumentTakeOver/index.scss b/packages/next/src/elements/DocumentTakeOver/index.scss new file mode 100644 index 00000000000..58bbec71661 --- /dev/null +++ b/packages/next/src/elements/DocumentTakeOver/index.scss @@ -0,0 +1,37 @@ +@import '../../scss/styles.scss'; + +.document-take-over { + @include blur-bg; + display: flex; + align-items: center; + justify-content: center; + height: 100%; + + &__wrapper { + z-index: 1; + position: relative; + display: flex; + flex-direction: column; + gap: var(--base); + padding: base(2); + } + + &__content { + display: flex; + flex-direction: column; + gap: var(--base); + + > * { + margin: 0; + } + } + + &__controls { + display: flex; + gap: var(--base); + + .btn { + margin: 0; + } + } +} diff --git a/packages/next/src/elements/DocumentTakeOver/index.tsx b/packages/next/src/elements/DocumentTakeOver/index.tsx new file mode 100644 index 00000000000..d7a0206ba66 --- /dev/null +++ b/packages/next/src/elements/DocumentTakeOver/index.tsx @@ -0,0 +1,51 @@ +'use client' +import { Button, Modal, useModal, useTranslation } from '@payloadcms/ui' +import LinkImport from 'next/link.js' +import React, { useEffect } from 'react' + +import './index.scss' + +const Link = (LinkImport.default || LinkImport) as unknown as typeof LinkImport.default + +const modalSlug = 'document-take-over' + +const baseClass = 'document-take-over' + +export const DocumentTakeOver: React.FC<{ + adminRoute: string + isActive: boolean + onReadOnly: () => void +}> = ({ adminRoute, isActive, onReadOnly }) => { + const { closeModal, openModal } = useModal() + const { t } = useTranslation() + + useEffect(() => { + if (isActive) openModal(modalSlug) + else closeModal(modalSlug) + }, [isActive, openModal, closeModal]) + + return ( + +
+
+

Editing taken over

+
+
+ + +
+
+
+ ) +} diff --git a/packages/translations/src/clientKeys.ts b/packages/translations/src/clientKeys.ts index 32543e93db8..7ac77ad45f6 100644 --- a/packages/translations/src/clientKeys.ts +++ b/packages/translations/src/clientKeys.ts @@ -160,6 +160,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'general:depth', 'general:deselectAllRows', 'general:document', + 'general:documentLocked', 'general:documents', 'general:duplicate', 'general:duplicateWithoutSaving', @@ -177,6 +178,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'general:filters', 'general:filterWhere', 'general:globals', + 'general:goBack', 'general:language', 'general:lastModified', 'general:leaveAnyway', @@ -226,6 +228,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'general:success', 'general:successfullyCreated', 'general:successfullyDuplicated', + 'general:takeOver', 'general:thisLanguage', 'general:titleDeleted', 'general:true', @@ -239,6 +242,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'general:updatedCountSuccessfully', 'general:updatedSuccessfully', 'general:updating', + 'general:viewReadOnly', 'general:welcome', 'operators:equals', diff --git a/packages/translations/src/languages/ar.ts b/packages/translations/src/languages/ar.ts index a21f6451c20..519874e259c 100644 --- a/packages/translations/src/languages/ar.ts +++ b/packages/translations/src/languages/ar.ts @@ -211,6 +211,7 @@ export const arTranslations: DefaultTranslationsObject = { descending: 'تنازلي', deselectAllRows: 'إلغاء تحديد جميع الصفوف', document: 'وثيقة', + documentLocked: 'تم قفل المستند', documents: 'وثائق', duplicate: 'استنساخ', duplicateWithoutSaving: 'استنساخ بدون حفظ التغييرات', @@ -231,6 +232,7 @@ export const arTranslations: DefaultTranslationsObject = { filterWhere: 'تصفية {{label}} حيث', filters: 'عوامل التصفية', globals: 'عامة', + goBack: 'العودة', language: 'اللغة', lastModified: 'آخر تعديل', leaveAnyway: 'المغادرة على أي حال', @@ -283,6 +285,7 @@ export const arTranslations: DefaultTranslationsObject = { success: 'النجاح', successfullyCreated: '{{label}} تم إنشاؤها بنجاح.', successfullyDuplicated: '{{label}} تم استنساخها بنجاح.', + takeOver: 'تولي', thisLanguage: 'العربية', titleDeleted: 'تم حذف {{label}} "{{title}}" بنجاح.', true: 'صحيح', @@ -298,6 +301,7 @@ export const arTranslations: DefaultTranslationsObject = { username: 'اسم المستخدم', users: 'المستخدمين', value: 'القيمة', + viewReadOnly: 'عرض للقراءة فقط', welcome: 'مرحبًا', }, operators: { diff --git a/packages/translations/src/languages/az.ts b/packages/translations/src/languages/az.ts index 0db14be88ca..4bf741b3362 100644 --- a/packages/translations/src/languages/az.ts +++ b/packages/translations/src/languages/az.ts @@ -213,6 +213,7 @@ export const azTranslations: DefaultTranslationsObject = { descending: 'Azalan', deselectAllRows: 'Bütün sıraları seçimi ləğv edin', document: 'Sənəd', + documentLocked: 'Sənəd kilidləndi', documents: 'Sənədlər', duplicate: 'Dublikat', duplicateWithoutSaving: 'Dəyişiklikləri saxlamadan dublikatla', @@ -233,6 +234,7 @@ export const azTranslations: DefaultTranslationsObject = { filterWhere: '{{label}} filtrlə', filters: 'Filtərlər', globals: 'Qloballar', + goBack: 'Geri qayıt', language: 'Dil', lastModified: 'Son dəyişdirildi', leaveAnyway: 'Heç olmasa çıx', @@ -285,6 +287,7 @@ export const azTranslations: DefaultTranslationsObject = { success: 'Uğur', successfullyCreated: '{{label}} uğurla yaradıldı.', successfullyDuplicated: '{{label}} uğurla dublikatlandı.', + takeOver: 'Əvvəl', thisLanguage: 'Azərbaycan dili', titleDeleted: '{{label}} "{{title}}" uğurla silindi.', true: 'Doğru', @@ -301,6 +304,7 @@ export const azTranslations: DefaultTranslationsObject = { username: 'İstifadəçi adı', users: 'İstifadəçilər', value: 'Dəyər', + viewReadOnly: 'Yalnız oxu rejimində bax', welcome: 'Xoş gəldiniz', }, operators: { diff --git a/packages/translations/src/languages/bg.ts b/packages/translations/src/languages/bg.ts index 9612283280d..6caf3c5c378 100644 --- a/packages/translations/src/languages/bg.ts +++ b/packages/translations/src/languages/bg.ts @@ -212,6 +212,7 @@ export const bgTranslations: DefaultTranslationsObject = { descending: 'Низходящо', deselectAllRows: 'Деселектирай всички редове', document: 'Документ', + documentLocked: 'Документът е заключен', documents: 'Документи', duplicate: 'Дупликирай', duplicateWithoutSaving: 'Дупликирай без да запазваш промените', @@ -232,6 +233,7 @@ export const bgTranslations: DefaultTranslationsObject = { filterWhere: 'Филтрирай {{label}} където', filters: 'Филтри', globals: 'Глобални', + goBack: 'Върни се', language: 'Език', lastModified: 'Последно променено', leaveAnyway: 'Напусни въпреки това', @@ -284,6 +286,7 @@ export const bgTranslations: DefaultTranslationsObject = { success: 'Успех', successfullyCreated: '{{label}} успешно създаден.', successfullyDuplicated: '{{label}} успешно дупликиран.', + takeOver: 'Поемане', thisLanguage: 'Български', titleDeleted: '{{label}} "{{title}}" успешно изтрит.', true: 'Истина', @@ -299,6 +302,7 @@ export const bgTranslations: DefaultTranslationsObject = { username: 'Потребителско име', users: 'Потребители', value: 'Стойност', + viewReadOnly: 'Преглед само за четене', welcome: 'Добре дошъл', }, operators: { diff --git a/packages/translations/src/languages/cs.ts b/packages/translations/src/languages/cs.ts index f288305b2f1..6568fbd50bb 100644 --- a/packages/translations/src/languages/cs.ts +++ b/packages/translations/src/languages/cs.ts @@ -212,6 +212,7 @@ export const csTranslations: DefaultTranslationsObject = { descending: 'Sestupně', deselectAllRows: 'Zrušte výběr všech řádků', document: 'Dokument', + documentLocked: 'Dokument je uzamčen', documents: 'Dokumenty', duplicate: 'Duplikovat', duplicateWithoutSaving: 'Duplikovat bez uložení změn', @@ -232,6 +233,7 @@ export const csTranslations: DefaultTranslationsObject = { filterWhere: 'Filtrovat {{label}} kde', filters: 'Filtry', globals: 'Globální', + goBack: 'Vrátit se', language: 'Jazyk', lastModified: 'Naposledy změněno', leaveAnyway: 'Přesto odejít', @@ -284,6 +286,7 @@ export const csTranslations: DefaultTranslationsObject = { success: 'Úspěch', successfullyCreated: '{{label}} úspěšně vytvořeno.', successfullyDuplicated: '{{label}} úspěšně duplikováno.', + takeOver: 'Převzít', thisLanguage: 'Čeština', titleDeleted: '{{label}} "{{title}}" úspěšně smazáno.', true: 'Pravda', @@ -299,6 +302,7 @@ export const csTranslations: DefaultTranslationsObject = { username: 'Uživatelské jméno', users: 'Uživatelé', value: 'Hodnota', + viewReadOnly: 'Zobrazit pouze pro čtení', welcome: 'Vítejte', }, operators: { diff --git a/packages/translations/src/languages/de.ts b/packages/translations/src/languages/de.ts index 81a763b7b72..d3a38f946a5 100644 --- a/packages/translations/src/languages/de.ts +++ b/packages/translations/src/languages/de.ts @@ -217,6 +217,7 @@ export const deTranslations: DefaultTranslationsObject = { descending: 'Absteigend', deselectAllRows: 'Alle Zeilen abwählen', document: 'Dokument', + documentLocked: 'Dokument gesperrt', documents: 'Dokumente', duplicate: 'Duplizieren', duplicateWithoutSaving: 'Dupliziere ohne Änderungen zu speichern', @@ -237,6 +238,7 @@ export const deTranslations: DefaultTranslationsObject = { filterWhere: 'Filter {{label}} wo', filters: 'Filter', globals: 'Globale Dokumente', + goBack: 'Zurück', language: 'Sprache', lastModified: 'Zuletzt geändert', leaveAnyway: 'Trotzdem verlassen', @@ -289,6 +291,7 @@ export const deTranslations: DefaultTranslationsObject = { success: 'Erfolg', successfullyCreated: '{{label}} erfolgreich erstellt.', successfullyDuplicated: '{{label}} wurde erfolgreich dupliziert.', + takeOver: 'Übernehmen', thisLanguage: 'Deutsch', titleDeleted: '{{label}} {{title}} wurde erfolgreich gelöscht.', true: 'Wahr', @@ -305,6 +308,7 @@ export const deTranslations: DefaultTranslationsObject = { username: 'Benutzername', users: 'Benutzer', value: 'Wert', + viewReadOnly: 'Nur-Lese-Ansicht', welcome: 'Willkommen', }, operators: { diff --git a/packages/translations/src/languages/en.ts b/packages/translations/src/languages/en.ts index 6e68f67ff74..376e6be709c 100644 --- a/packages/translations/src/languages/en.ts +++ b/packages/translations/src/languages/en.ts @@ -215,6 +215,7 @@ export const enTranslations = { descending: 'Descending', deselectAllRows: 'Deselect all rows', document: 'Document', + documentLocked: 'Document locked', documents: 'Documents', duplicate: 'Duplicate', duplicateWithoutSaving: 'Duplicate without saving changes', @@ -235,6 +236,7 @@ export const enTranslations = { filterWhere: 'Filter {{label}} where', filters: 'Filters', globals: 'Globals', + goBack: 'Go back', language: 'Language', lastModified: 'Last Modified', leaveAnyway: 'Leave anyway', @@ -287,6 +289,7 @@ export const enTranslations = { success: 'Success', successfullyCreated: '{{label}} successfully created.', successfullyDuplicated: '{{label}} successfully duplicated.', + takeOver: 'Take over', thisLanguage: 'English', titleDeleted: '{{label}} "{{title}}" successfully deleted.', true: 'True', @@ -302,6 +305,7 @@ export const enTranslations = { username: 'Username', users: 'Users', value: 'Value', + viewReadOnly: 'View read-only', welcome: 'Welcome', }, operators: { diff --git a/packages/translations/src/languages/es.ts b/packages/translations/src/languages/es.ts index d5d07e02eb4..79bbc9bb3ee 100644 --- a/packages/translations/src/languages/es.ts +++ b/packages/translations/src/languages/es.ts @@ -217,6 +217,7 @@ export const esTranslations: DefaultTranslationsObject = { descending: 'Descendente', deselectAllRows: 'Deselecciona todas las filas', document: 'Documento', + documentLocked: 'Documento bloqueado', documents: 'Documentos', duplicate: 'Duplicar', duplicateWithoutSaving: 'Duplicar sin guardar cambios', @@ -237,6 +238,7 @@ export const esTranslations: DefaultTranslationsObject = { filterWhere: 'Filtrar {{label}} donde', filters: 'Filtros', globals: 'Globales', + goBack: 'Volver', language: 'Idioma', lastModified: 'Última modificación', leaveAnyway: 'Salir de todos modos', @@ -289,6 +291,7 @@ export const esTranslations: DefaultTranslationsObject = { success: 'Éxito', successfullyCreated: '{{label}} creado correctamente.', successfullyDuplicated: '{{label}} duplicado correctamente.', + takeOver: 'Tomar el control', thisLanguage: 'Español', titleDeleted: '{{label}} {{title}} eliminado correctamente.', true: 'Verdadero', @@ -304,6 +307,7 @@ export const esTranslations: DefaultTranslationsObject = { username: 'Nombre de usuario', users: 'Usuarios', value: 'Valor', + viewReadOnly: 'Ver solo lectura', welcome: 'Bienvenido', }, operators: { diff --git a/packages/translations/src/languages/fa.ts b/packages/translations/src/languages/fa.ts index d02567562cb..b4dca50cc32 100644 --- a/packages/translations/src/languages/fa.ts +++ b/packages/translations/src/languages/fa.ts @@ -212,6 +212,7 @@ export const faTranslations: DefaultTranslationsObject = { descending: 'رو به پایین', deselectAllRows: 'تمام سطرها را از انتخاب خارج کنید', document: 'سند', + documentLocked: 'سند قفل شده است', documents: 'اسناد', duplicate: 'تکراری', duplicateWithoutSaving: 'رونوشت بدون ذخیره کردن تغییرات', @@ -232,6 +233,7 @@ export const faTranslations: DefaultTranslationsObject = { filterWhere: 'علامت گذاری کردن {{label}} جایی که', filters: 'علامت‌گذاری‌ها', globals: 'سراسری', + goBack: 'برگشت', language: 'زبان', lastModified: 'آخرین نگارش', leaveAnyway: 'به هر حال ترک کن', @@ -284,6 +286,7 @@ export const faTranslations: DefaultTranslationsObject = { success: 'موفقیت', successfullyCreated: '{{label}} با موفقیت ساخته شد.', successfullyDuplicated: '{{label}} با موفقیت رونوشت شد.', + takeOver: 'تحویل گرفتن', thisLanguage: 'فارسی', titleDeleted: '{{label}} "{{title}}" با موفقیت پاک شد.', true: 'درست', @@ -299,6 +302,7 @@ export const faTranslations: DefaultTranslationsObject = { username: 'نام کاربری', users: 'کاربران', value: 'مقدار', + viewReadOnly: 'فقط برای خواندن مشاهده کنید', welcome: 'خوش‌آمدید', }, operators: { diff --git a/packages/translations/src/languages/fr.ts b/packages/translations/src/languages/fr.ts index 40545121942..032c0eb13e5 100644 --- a/packages/translations/src/languages/fr.ts +++ b/packages/translations/src/languages/fr.ts @@ -220,6 +220,7 @@ export const frTranslations: DefaultTranslationsObject = { descending: 'Descendant(e)', deselectAllRows: 'Désélectionner toutes les lignes', document: 'Document', + documentLocked: 'Document verrouillé', documents: 'Documents', duplicate: 'Dupliquer', duplicateWithoutSaving: 'Dupliquer sans enregistrer les modifications', @@ -240,6 +241,7 @@ export const frTranslations: DefaultTranslationsObject = { filterWhere: 'Filtrer {{label}} où', filters: 'Filtres', globals: 'Globals(es)', + goBack: 'Retourner', language: 'Langue', lastModified: 'Dernière modification', leaveAnyway: 'Quitter quand même', @@ -292,6 +294,7 @@ export const frTranslations: DefaultTranslationsObject = { success: 'Succès', successfullyCreated: '{{label}} créé(e) avec succès.', successfullyDuplicated: '{{label}} dupliqué(e) avec succès.', + takeOver: 'Prendre en charge', thisLanguage: 'Français', titleDeleted: '{{label}} "{{title}}" supprimé(e) avec succès.', true: 'Vrai', @@ -308,6 +311,7 @@ export const frTranslations: DefaultTranslationsObject = { username: "Nom d'utilisateur", users: 'Utilisateurs', value: 'Valeur', + viewReadOnly: 'Afficher en lecture seule', welcome: 'Bienvenue', }, operators: { diff --git a/packages/translations/src/languages/he.ts b/packages/translations/src/languages/he.ts index 30c52bcaf76..04dbc90c37a 100644 --- a/packages/translations/src/languages/he.ts +++ b/packages/translations/src/languages/he.ts @@ -208,6 +208,7 @@ export const heTranslations: DefaultTranslationsObject = { descending: 'בסדר יורד', deselectAllRows: 'בטל בחירת כל השורות', document: 'מסמך', + documentLocked: 'המסמך ננעל', documents: 'מסמכים', duplicate: 'שכפול', duplicateWithoutSaving: 'שכפול ללא שמירת שינויים', @@ -228,6 +229,7 @@ export const heTranslations: DefaultTranslationsObject = { filterWhere: 'סנן {{label}} בהם', filters: 'מסננים', globals: 'גלובלים', + goBack: 'חזור', language: 'שפה', lastModified: 'נערך לאחרונה', leaveAnyway: 'צא בכל זאת', @@ -279,6 +281,7 @@ export const heTranslations: DefaultTranslationsObject = { success: 'הצלחה', successfullyCreated: '{{label}} נוצר בהצלחה.', successfullyDuplicated: '{{label}} שוכפל בהצלחה.', + takeOver: 'קח פיקוד', thisLanguage: 'עברית', titleDeleted: '{{label}} "{{title}}" נמחק בהצלחה.', true: 'True', @@ -294,6 +297,7 @@ export const heTranslations: DefaultTranslationsObject = { username: 'שם משתמש', users: 'משתמשים', value: 'ערך', + viewReadOnly: 'הצג קריאה בלבד', welcome: 'ברוך הבא', }, operators: { diff --git a/packages/translations/src/languages/hr.ts b/packages/translations/src/languages/hr.ts index 15c40ef94f3..be1564edb12 100644 --- a/packages/translations/src/languages/hr.ts +++ b/packages/translations/src/languages/hr.ts @@ -213,6 +213,7 @@ export const hrTranslations: DefaultTranslationsObject = { descending: 'Silazno', deselectAllRows: 'Odznači sve redove', document: 'Dokument', + documentLocked: 'Dokument je zaključan', documents: 'Dokumenti', duplicate: 'Duplikat', duplicateWithoutSaving: 'Dupliciraj bez spremanja promjena', @@ -233,6 +234,7 @@ export const hrTranslations: DefaultTranslationsObject = { filterWhere: 'Filter {{label}} gdje', filters: 'Filteri', globals: 'Globali', + goBack: 'Vrati se', language: 'Jezik', lastModified: 'Zadnja promjena', leaveAnyway: 'Svejedno napusti', @@ -285,6 +287,7 @@ export const hrTranslations: DefaultTranslationsObject = { success: 'Uspjeh', successfullyCreated: '{{label}} uspješno kreirano.', successfullyDuplicated: '{{label}} uspješno duplicirano.', + takeOver: 'Preuzmi', thisLanguage: 'Hrvatski', titleDeleted: '{{label}} "{{title}}" uspješno obrisano.', true: 'Istinito', @@ -300,6 +303,7 @@ export const hrTranslations: DefaultTranslationsObject = { username: 'Korisničko ime', users: 'Korisnici', value: 'Attribute', + viewReadOnly: 'Pogledaj samo za čitanje', welcome: 'Dobrodošli', }, operators: { diff --git a/packages/translations/src/languages/hu.ts b/packages/translations/src/languages/hu.ts index 52c1995e94e..a20b515bf8f 100644 --- a/packages/translations/src/languages/hu.ts +++ b/packages/translations/src/languages/hu.ts @@ -215,6 +215,7 @@ export const huTranslations: DefaultTranslationsObject = { descending: 'Csökkenő', deselectAllRows: 'Jelölje ki az összes sort', document: 'Dokumentum', + documentLocked: 'A dokumentum zárolva van', documents: 'Dokumentumok', duplicate: 'Duplikálás', duplicateWithoutSaving: 'Duplikálás a módosítások mentése nélkül', @@ -235,6 +236,7 @@ export const huTranslations: DefaultTranslationsObject = { filterWhere: 'Szűrő {{label}} ahol', filters: 'Szűrők', globals: 'Globálisok', + goBack: 'Vissza', language: 'Nyelv', lastModified: 'Utoljára módosítva', leaveAnyway: 'Távozás mindenképp', @@ -287,6 +289,7 @@ export const huTranslations: DefaultTranslationsObject = { success: 'Siker', successfullyCreated: '{{label}} sikeresen létrehozva.', successfullyDuplicated: '{{label}} sikeresen duplikálódott.', + takeOver: 'Átvétel', thisLanguage: 'Magyar', titleDeleted: '{{label}} "{{title}}" sikeresen törölve.', true: 'Igaz', @@ -302,6 +305,7 @@ export const huTranslations: DefaultTranslationsObject = { username: 'Felhasználónév', users: 'Felhasználók', value: 'Érték', + viewReadOnly: 'Csak olvasható nézet', welcome: 'Üdvözöljük', }, operators: { diff --git a/packages/translations/src/languages/it.ts b/packages/translations/src/languages/it.ts index e9b09eafc26..edd2f1875f0 100644 --- a/packages/translations/src/languages/it.ts +++ b/packages/translations/src/languages/it.ts @@ -215,6 +215,7 @@ export const itTranslations: DefaultTranslationsObject = { descending: 'Decrescente', deselectAllRows: 'Deseleziona tutte le righe', document: 'Documento', + documentLocked: 'Documento bloccato', documents: 'Documenti', duplicate: 'Duplica', duplicateWithoutSaving: 'Duplica senza salvare le modifiche', @@ -235,6 +236,7 @@ export const itTranslations: DefaultTranslationsObject = { filterWhere: 'Filtra {{label}} se', filters: 'Filtri', globals: 'Globali', + goBack: 'Torna indietro', language: 'Lingua', lastModified: 'Ultima modifica', leaveAnyway: 'Esci comunque', @@ -287,6 +289,7 @@ export const itTranslations: DefaultTranslationsObject = { success: 'Successo', successfullyCreated: '{{label}} creato con successo.', successfullyDuplicated: '{{label}} duplicato con successo.', + takeOver: 'Prendi il controllo', thisLanguage: 'Italiano', titleDeleted: '{{label}} {{title}} eliminato con successo.', true: 'Vero', @@ -302,6 +305,7 @@ export const itTranslations: DefaultTranslationsObject = { username: 'Nome utente', users: 'Utenti', value: 'Valore', + viewReadOnly: 'Visualizza solo lettura', welcome: 'Benvenuto', }, operators: { diff --git a/packages/translations/src/languages/ja.ts b/packages/translations/src/languages/ja.ts index 244e967c1f2..dee11bad6eb 100644 --- a/packages/translations/src/languages/ja.ts +++ b/packages/translations/src/languages/ja.ts @@ -213,6 +213,7 @@ export const jaTranslations: DefaultTranslationsObject = { descending: '降順', deselectAllRows: 'すべての行の選択を解除します', document: 'ドキュメント', + documentLocked: 'ドキュメントがロックされました', documents: 'ドキュメント', duplicate: '複製', duplicateWithoutSaving: '変更を保存せずに複製', @@ -233,6 +234,7 @@ export const jaTranslations: DefaultTranslationsObject = { filterWhere: '{{label}} の絞り込み', filters: '絞り込み', globals: 'グローバル', + goBack: '戻る', language: '言語', lastModified: '最終更新', leaveAnyway: 'すぐに画面を離れる', @@ -285,6 +287,7 @@ export const jaTranslations: DefaultTranslationsObject = { success: '成功', successfullyCreated: '{{label}} が作成されました。', successfullyDuplicated: '{{label}} が複製されました。', + takeOver: '引き継ぐ', thisLanguage: 'Japanese', titleDeleted: '{{label}} "{{title}}" が削除されました。', true: '真実', @@ -300,6 +303,7 @@ export const jaTranslations: DefaultTranslationsObject = { username: 'ユーザーネーム', users: 'ユーザー', value: '値', + viewReadOnly: '読み取り専用で表示', welcome: 'ようこそ', }, operators: { diff --git a/packages/translations/src/languages/ko.ts b/packages/translations/src/languages/ko.ts index 567174c25b8..e3aaac4343f 100644 --- a/packages/translations/src/languages/ko.ts +++ b/packages/translations/src/languages/ko.ts @@ -212,6 +212,7 @@ export const koTranslations: DefaultTranslationsObject = { descending: '내림차순', deselectAllRows: '모든 행 선택 해제', document: '문서', + documentLocked: '문서가 잠겼습니다', documents: '문서들', duplicate: '복제', duplicateWithoutSaving: '변경 사항 저장 없이 복제', @@ -232,6 +233,7 @@ export const koTranslations: DefaultTranslationsObject = { filterWhere: '{{label}} 필터링 조건', filters: '필터', globals: '글로벌', + goBack: '돌아가기', language: '언어', lastModified: '마지막 수정 일시', leaveAnyway: '그래도 나가시겠습니까?', @@ -284,6 +286,7 @@ export const koTranslations: DefaultTranslationsObject = { success: '성공', successfullyCreated: '{{label}}이(가) 생성되었습니다.', successfullyDuplicated: '{{label}}이(가) 복제되었습니다.', + takeOver: '인수하기', thisLanguage: '한국어', titleDeleted: '{{label}} "{{title}}"을(를) 삭제했습니다.', true: '참', @@ -299,6 +302,7 @@ export const koTranslations: DefaultTranslationsObject = { username: '사용자 이름', users: '사용자', value: '값', + viewReadOnly: '읽기 전용으로 보기', welcome: '환영합니다', }, operators: { diff --git a/packages/translations/src/languages/my.ts b/packages/translations/src/languages/my.ts index dced2153145..6d8fa7cd2d1 100644 --- a/packages/translations/src/languages/my.ts +++ b/packages/translations/src/languages/my.ts @@ -215,6 +215,7 @@ export const myTranslations: DefaultTranslationsObject = { descending: 'ဆင်းသက်လာသည်။', deselectAllRows: 'အားလုံးကို မရွေးနိုင်ပါ', document: 'စာရွက်စာတမ်း', + documentLocked: 'စာရွက်စာတမ်းကိုပိတ်ထားသည်', documents: 'စာရွက်စာတမ်းများ', duplicate: 'ပုံတူပွားမည်။', duplicateWithoutSaving: 'သေချာပါပြီ။', @@ -235,6 +236,7 @@ export const myTranslations: DefaultTranslationsObject = { filterWhere: 'နေရာတွင် စစ်ထုတ်ပါ။', filters: 'စစ်ထုတ်မှုများ', globals: 'Globals', + goBack: 'နောက်သို့', language: 'ဘာသာစကား', lastModified: 'နောက်ဆုံးပြင်ဆင်ထားသည်။', leaveAnyway: 'ဘာဖြစ်ဖြစ် ထွက်မည်။', @@ -287,6 +289,7 @@ export const myTranslations: DefaultTranslationsObject = { success: 'အောင်မြင်မှု', successfullyCreated: '{{label}} အောင်မြင်စွာဖန်တီးခဲ့သည်။', successfullyDuplicated: '{{label}} အောင်မြင်စွာ ပုံတူပွားခဲ့သည်။', + takeOver: 'တာဝန်ယူပါ', thisLanguage: 'မြန်မာစာ', titleDeleted: '{{label}} {{title}} အောင်မြင်စွာ ဖျက်သိမ်းခဲ့သည်။', true: 'အမှန်', @@ -303,6 +306,7 @@ export const myTranslations: DefaultTranslationsObject = { username: 'Nama pengguna', users: 'အသုံးပြုသူများ', value: 'တန်ဖိုး', + viewReadOnly: 'ဖတ်ရှုရန်သာကြည့်ပါ', welcome: 'ကြိုဆိုပါတယ်။', }, operators: { diff --git a/packages/translations/src/languages/nb.ts b/packages/translations/src/languages/nb.ts index cf3b9bf7306..49139af8927 100644 --- a/packages/translations/src/languages/nb.ts +++ b/packages/translations/src/languages/nb.ts @@ -213,6 +213,7 @@ export const nbTranslations: DefaultTranslationsObject = { descending: 'Synkende', deselectAllRows: 'Fjern markeringen fra alle rader', document: 'Dokument', + documentLocked: 'Dokument låst', documents: 'Dokumenter', duplicate: 'Dupliser', duplicateWithoutSaving: 'Dupliser uten å lagre endringer', @@ -233,6 +234,7 @@ export const nbTranslations: DefaultTranslationsObject = { filterWhere: 'Filtrer {{label}} der', filters: 'Filter', globals: 'Globale variabler', + goBack: 'Gå tilbake', language: 'Språk', lastModified: 'Sist endret', leaveAnyway: 'Forlat likevel', @@ -285,6 +287,7 @@ export const nbTranslations: DefaultTranslationsObject = { success: 'Suksess', successfullyCreated: '{{label}} ble opprettet.', successfullyDuplicated: '{{label}} ble duplisert.', + takeOver: 'Ta over', thisLanguage: 'Norsk', titleDeleted: '{{label}} "{{title}}" ble slettet.', true: 'Sann', @@ -300,6 +303,7 @@ export const nbTranslations: DefaultTranslationsObject = { username: 'Brukernavn', users: 'Brukere', value: 'Verdi', + viewReadOnly: 'Vis skrivebeskyttet', welcome: 'Velkommen', }, operators: { diff --git a/packages/translations/src/languages/nl.ts b/packages/translations/src/languages/nl.ts index bc20bc12cc0..33928a522d6 100644 --- a/packages/translations/src/languages/nl.ts +++ b/packages/translations/src/languages/nl.ts @@ -215,6 +215,7 @@ export const nlTranslations: DefaultTranslationsObject = { descending: 'Aflopend', deselectAllRows: 'Deselecteer alle rijen', document: 'Document', + documentLocked: 'Document vergrendeld', documents: 'Documenten', duplicate: 'Dupliceren', duplicateWithoutSaving: 'Dupliceren zonder wijzigingen te bewaren', @@ -235,6 +236,7 @@ export const nlTranslations: DefaultTranslationsObject = { filterWhere: 'Filter {{label}} waar', filters: 'Filters', globals: 'Globalen', + goBack: 'Ga terug', language: 'Taal', lastModified: 'Laatst gewijzigd', leaveAnyway: 'Toch weggaan', @@ -287,6 +289,7 @@ export const nlTranslations: DefaultTranslationsObject = { success: 'Succes', successfullyCreated: '{{label}} succesvol aangemaakt.', successfullyDuplicated: '{{label}} succesvol gedupliceerd.', + takeOver: 'Overnemen', thisLanguage: 'Nederlands', titleDeleted: '{{label}} "{{title}}" succesvol verwijderd.', true: 'Waar', @@ -302,6 +305,7 @@ export const nlTranslations: DefaultTranslationsObject = { username: 'Gebruikersnaam', users: 'Gebruikers', value: 'Waarde', + viewReadOnly: 'Alleen-lezen weergave', welcome: 'Welkom', }, operators: { diff --git a/packages/translations/src/languages/pl.ts b/packages/translations/src/languages/pl.ts index f62fea036a6..cce2ecdef45 100644 --- a/packages/translations/src/languages/pl.ts +++ b/packages/translations/src/languages/pl.ts @@ -213,6 +213,7 @@ export const plTranslations: DefaultTranslationsObject = { descending: 'Malejąco', deselectAllRows: 'Odznacz wszystkie wiersze', document: 'Dokument', + documentLocked: 'Dokument zablokowany', documents: 'Dokumenty', duplicate: 'Zduplikuj', duplicateWithoutSaving: 'Zduplikuj bez zapisywania zmian', @@ -233,6 +234,7 @@ export const plTranslations: DefaultTranslationsObject = { filterWhere: 'Filtruj gdzie', filters: 'Filtry', globals: 'Globalne', + goBack: 'Wróć', language: 'Język', lastModified: 'Ostatnio zmodyfikowany', leaveAnyway: 'Wyjdź mimo to', @@ -285,6 +287,7 @@ export const plTranslations: DefaultTranslationsObject = { success: 'Sukces', successfullyCreated: 'Pomyślnie utworzono {{label}}.', successfullyDuplicated: 'Pomyślnie zduplikowano {{label}}', + takeOver: 'Przejąć', thisLanguage: 'Polski', titleDeleted: 'Pomyślnie usunięto {{label}} {{title}}', true: 'Prawda', @@ -300,6 +303,7 @@ export const plTranslations: DefaultTranslationsObject = { username: 'Nazwa użytkownika', users: 'użytkownicy', value: 'Wartość', + viewReadOnly: 'Widok tylko do odczytu', welcome: 'Witaj', }, operators: { diff --git a/packages/translations/src/languages/pt.ts b/packages/translations/src/languages/pt.ts index dd710181b33..98aab843d64 100644 --- a/packages/translations/src/languages/pt.ts +++ b/packages/translations/src/languages/pt.ts @@ -214,6 +214,7 @@ export const ptTranslations: DefaultTranslationsObject = { descending: 'Decrescente', deselectAllRows: 'Desmarcar todas as linhas', document: 'Documento', + documentLocked: 'Documento bloqueado', documents: 'Documentos', duplicate: 'Duplicar', duplicateWithoutSaving: 'Duplicar sem salvar alterações', @@ -234,6 +235,7 @@ export const ptTranslations: DefaultTranslationsObject = { filterWhere: 'Filtrar {{label}} em que', filters: 'Filtros', globals: 'Globais', + goBack: 'Voltar', language: 'Idioma', lastModified: 'Última modificação', leaveAnyway: 'Sair mesmo assim', @@ -286,6 +288,7 @@ export const ptTranslations: DefaultTranslationsObject = { success: 'Sucesso', successfullyCreated: '{{label}} criado com sucesso.', successfullyDuplicated: '{{label}} duplicado com sucesso.', + takeOver: 'Assumir', thisLanguage: 'Português', titleDeleted: '{{label}} {{title}} excluído com sucesso.', true: 'Verdadeiro', @@ -301,6 +304,7 @@ export const ptTranslations: DefaultTranslationsObject = { username: 'Nome de usuário', users: 'usuários', value: 'Valor', + viewReadOnly: 'Visualizar somente leitura', welcome: 'Boas vindas', }, operators: { diff --git a/packages/translations/src/languages/ro.ts b/packages/translations/src/languages/ro.ts index eb60fd19e00..fffb7c2521e 100644 --- a/packages/translations/src/languages/ro.ts +++ b/packages/translations/src/languages/ro.ts @@ -217,6 +217,7 @@ export const roTranslations: DefaultTranslationsObject = { descending: 'Descendentă', deselectAllRows: 'Deselectează toate rândurile', document: 'Document', + documentLocked: 'Document blocat', documents: 'Documente', duplicate: 'Duplicați', duplicateWithoutSaving: 'Duplicați fără salvarea modificărilor', @@ -237,6 +238,7 @@ export const roTranslations: DefaultTranslationsObject = { filterWhere: 'Filtrează {{label}} unde', filters: 'Filtre', globals: 'Globale', + goBack: 'Înapoi', language: 'Limba', lastModified: 'Ultima modificare', leaveAnyway: 'Pleacă oricum', @@ -289,6 +291,7 @@ export const roTranslations: DefaultTranslationsObject = { success: 'Succes', successfullyCreated: '{{label}} creat(ă) cu succes.', successfullyDuplicated: '{{label}} duplicat(ă) cu succes.', + takeOver: 'Preia controlul', thisLanguage: 'Română', titleDeleted: '{{label}} "{{title}}" șters cu succes.', true: 'Adevărat', @@ -304,6 +307,7 @@ export const roTranslations: DefaultTranslationsObject = { username: 'Nume de utilizator', users: 'Utilizatori', value: 'Valoare', + viewReadOnly: 'Vizualizare doar pentru citire', welcome: 'Bine ați venit', }, operators: { diff --git a/packages/translations/src/languages/rs.ts b/packages/translations/src/languages/rs.ts index e551b6bb4f1..2c6e48a0ccd 100644 --- a/packages/translations/src/languages/rs.ts +++ b/packages/translations/src/languages/rs.ts @@ -212,6 +212,7 @@ export const rsTranslations: DefaultTranslationsObject = { descending: 'Опадајуће', deselectAllRows: 'Деселектујте све редове', document: 'Dokument', + documentLocked: 'Документ је закључан', documents: 'Dokumenti', duplicate: 'Дупликат', duplicateWithoutSaving: 'Понови без чувања промена', @@ -232,6 +233,7 @@ export const rsTranslations: DefaultTranslationsObject = { filterWhere: 'Филтер {{label}} где', filters: 'Филтери', globals: 'Глобали', + goBack: 'Врати се', language: 'Језик', lastModified: 'Задња промена', leaveAnyway: 'Свеједно напусти', @@ -284,6 +286,7 @@ export const rsTranslations: DefaultTranslationsObject = { success: 'Uspeh', successfullyCreated: '{{label}} успешно креирано.', successfullyDuplicated: '{{label}} успешно дуплицирано.', + takeOver: 'Превузети', thisLanguage: 'Српски (ћирилица)', titleDeleted: '{{label}} "{{title}}" успешно обрисано.', true: 'Istinito', @@ -299,6 +302,7 @@ export const rsTranslations: DefaultTranslationsObject = { username: 'Korisničko ime', users: 'Корисници', value: 'Вредност', + viewReadOnly: 'Прегледај само за читање', welcome: 'Добродошли', }, operators: { diff --git a/packages/translations/src/languages/rsLatin.ts b/packages/translations/src/languages/rsLatin.ts index 88d5763e123..152101fd554 100644 --- a/packages/translations/src/languages/rsLatin.ts +++ b/packages/translations/src/languages/rsLatin.ts @@ -212,6 +212,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { descending: 'Opadajuće', deselectAllRows: 'Deselektujte sve redove', document: 'Dokument', + documentLocked: 'Dokument je zaključan', documents: 'Dokumenti', duplicate: 'Duplikat', duplicateWithoutSaving: 'Ponovi bez čuvanja promena', @@ -232,6 +233,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { filterWhere: 'Filter {{label}} gde', filters: 'Filteri', globals: 'Globali', + goBack: 'Vrati se', language: 'Jezik', lastModified: 'Zadnja promena', leaveAnyway: 'Svejedno napusti', @@ -284,6 +286,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { success: 'Uspeh', successfullyCreated: '{{label}} uspešno kreirano.', successfullyDuplicated: '{{label}} uspešno duplicirano.', + takeOver: 'Preuzeti', thisLanguage: 'Srpski (latinica)', titleDeleted: '{{label}} "{{title}}" uspešno obrisano.', true: 'Istinito', @@ -299,6 +302,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { username: 'Korisničko ime', users: 'Korisnici', value: 'Vrednost', + viewReadOnly: 'Pregledaj samo za čitanje', welcome: 'Dobrodošli', }, operators: { diff --git a/packages/translations/src/languages/ru.ts b/packages/translations/src/languages/ru.ts index f031e21e089..797261eea0a 100644 --- a/packages/translations/src/languages/ru.ts +++ b/packages/translations/src/languages/ru.ts @@ -215,6 +215,7 @@ export const ruTranslations: DefaultTranslationsObject = { descending: 'Уменьшение', deselectAllRows: 'Снять выделение со всех строк', document: 'Документ', + documentLocked: 'Документ заблокирован', documents: 'Документы', duplicate: 'Дублировать', duplicateWithoutSaving: 'Дублирование без сохранения изменений', @@ -235,6 +236,7 @@ export const ruTranslations: DefaultTranslationsObject = { filterWhere: 'Где фильтровать', filters: 'Фильтры', globals: 'Глобальные', + goBack: 'Назад', language: 'Язык', lastModified: 'Последнее изменение', leaveAnyway: 'Все равно уйти', @@ -287,6 +289,7 @@ export const ruTranslations: DefaultTranslationsObject = { success: 'Успех', successfullyCreated: '{{label}} успешно создан.', successfullyDuplicated: '{{label}} успешно продублирован.', + takeOver: 'Взять на себя', thisLanguage: 'Русский', titleDeleted: '{{label}} {{title}} успешно удалено.', true: 'Правда', @@ -303,6 +306,7 @@ export const ruTranslations: DefaultTranslationsObject = { username: 'Имя пользователя', users: 'пользователи', value: 'Значение', + viewReadOnly: 'Просмотр только для чтения', welcome: 'Добро пожаловать', }, operators: { diff --git a/packages/translations/src/languages/sk.ts b/packages/translations/src/languages/sk.ts index 95427769cae..d0a533e1fec 100644 --- a/packages/translations/src/languages/sk.ts +++ b/packages/translations/src/languages/sk.ts @@ -214,6 +214,7 @@ export const skTranslations: DefaultTranslationsObject = { descending: 'Zostupne', deselectAllRows: 'Zrušiť výber všetkých riadkov', document: 'Dokument', + documentLocked: 'Dokument je zamknutý', documents: 'Dokumenty', duplicate: 'Duplikovať', duplicateWithoutSaving: 'Duplikovať bez uloženia zmien', @@ -234,6 +235,7 @@ export const skTranslations: DefaultTranslationsObject = { filterWhere: 'Filtrovat kde je {{label}}', filters: 'Filtry', globals: 'Globalné', + goBack: 'Vrátiť sa', language: 'Jazyk', lastModified: 'Naposledy zmenené', leaveAnyway: 'Presto odísť', @@ -286,6 +288,7 @@ export const skTranslations: DefaultTranslationsObject = { success: 'Úspech', successfullyCreated: '{{label}} úspešne vytvorené.', successfullyDuplicated: '{{label}} úspešne duplikované.', + takeOver: 'Prevziať', thisLanguage: 'Slovenčina', titleDeleted: '{{label}} "{{title}}" úspešne zmazané.', true: 'Pravda', @@ -301,6 +304,7 @@ export const skTranslations: DefaultTranslationsObject = { username: 'Používateľské meno', users: 'Používatelia', value: 'Hodnota', + viewReadOnly: 'Zobraziť iba na čítanie', welcome: 'Vitajte', }, operators: { diff --git a/packages/translations/src/languages/sv.ts b/packages/translations/src/languages/sv.ts index ca09f4e237f..1be5fdf21cd 100644 --- a/packages/translations/src/languages/sv.ts +++ b/packages/translations/src/languages/sv.ts @@ -213,6 +213,7 @@ export const svTranslations: DefaultTranslationsObject = { descending: 'Fallande', deselectAllRows: 'Avmarkera alla rader', document: 'Dokument', + documentLocked: 'Dokument låst', documents: 'Dokument', duplicate: 'Duplicera', duplicateWithoutSaving: 'Duplicera utan att spara ändringar', @@ -233,6 +234,7 @@ export const svTranslations: DefaultTranslationsObject = { filterWhere: 'Filtrera {{label}} där', filters: 'Filter', globals: 'Globala', + goBack: 'Gå tillbaka', language: 'Språk', lastModified: 'Senast Ändrad', leaveAnyway: 'Lämna ändå', @@ -285,6 +287,7 @@ export const svTranslations: DefaultTranslationsObject = { success: 'Framgång', successfullyCreated: '{{label}} skapades framgångsrikt.', successfullyDuplicated: '{{label}} duplicerades framgångsrikt.', + takeOver: 'Ta över', thisLanguage: 'Svenska', titleDeleted: '{{label}} "{{title}}" togs bort framgångsrikt.', true: 'Sann', @@ -300,6 +303,7 @@ export const svTranslations: DefaultTranslationsObject = { username: 'Användarnamn', users: 'Användare', value: 'Värde', + viewReadOnly: 'Visa endast läsning', welcome: 'Välkommen', }, operators: { diff --git a/packages/translations/src/languages/th.ts b/packages/translations/src/languages/th.ts index fed1f0afe36..d05548718f9 100644 --- a/packages/translations/src/languages/th.ts +++ b/packages/translations/src/languages/th.ts @@ -209,6 +209,7 @@ export const thTranslations: DefaultTranslationsObject = { descending: 'มากไปน้อย', deselectAllRows: 'ยกเลิกการเลือกทุกแถว', document: 'เอกสาร', + documentLocked: 'เอกสารถูกล็อค', documents: 'เอกสาร', duplicate: 'สำเนา', duplicateWithoutSaving: 'สำเนาโดยไม่บันทึกการแก้ไข', @@ -229,6 +230,7 @@ export const thTranslations: DefaultTranslationsObject = { filterWhere: 'กรอง {{label}} เฉพาะ', filters: 'กรอง', globals: 'Globals', + goBack: 'กลับไป', language: 'ภาษา', lastModified: 'แก้ไขล่าสุดเมื่อ', leaveAnyway: 'ออกจากหน้านี้', @@ -281,6 +283,7 @@ export const thTranslations: DefaultTranslationsObject = { success: 'ความสำเร็จ', successfullyCreated: 'สร้าง {{label}} สำเร็จ', successfullyDuplicated: 'สำเนา {{label}} สำเร็จ', + takeOver: 'เข้ายึด', thisLanguage: 'ไทย', titleDeleted: 'ลบ {{label}} "{{title}}" สำเร็จ', true: 'จริง', @@ -296,6 +299,7 @@ export const thTranslations: DefaultTranslationsObject = { username: 'ชื่อผู้ใช้', users: 'ผู้ใช้', value: 'ค่า', + viewReadOnly: 'ดูในโหมดอ่านอย่างเดียว', welcome: 'ยินดีต้อนรับ', }, operators: { diff --git a/packages/translations/src/languages/tr.ts b/packages/translations/src/languages/tr.ts index a24ed1604df..ac320b8ab64 100644 --- a/packages/translations/src/languages/tr.ts +++ b/packages/translations/src/languages/tr.ts @@ -216,6 +216,7 @@ export const trTranslations: DefaultTranslationsObject = { descending: 'Azalan', deselectAllRows: 'Tüm satırların seçimini kaldır', document: 'Belge', + documentLocked: 'Belge kilitlendi', documents: 'Belgeler', duplicate: 'Çoğalt', duplicateWithoutSaving: 'Ayarları kaydetmeden çoğalt', @@ -236,6 +237,7 @@ export const trTranslations: DefaultTranslationsObject = { filterWhere: '{{label}} filtrele:', filters: 'Filtreler', globals: 'Globaller', + goBack: 'Geri dön', language: 'Dil', lastModified: 'Son değiştirme', leaveAnyway: 'Yine de ayrıl', @@ -288,6 +290,7 @@ export const trTranslations: DefaultTranslationsObject = { success: 'Başarı', successfullyCreated: '{{label}} başarıyla oluşturuldu.', successfullyDuplicated: '{{label}} başarıyla kopyalandı.', + takeOver: 'Devralmak', thisLanguage: 'Türkçe', titleDeleted: '{{label}} {{title}} başarıyla silindi.', true: 'Doğru', @@ -304,6 +307,7 @@ export const trTranslations: DefaultTranslationsObject = { username: 'Kullanıcı Adı', users: 'kullanıcı', value: 'Değer', + viewReadOnly: 'Salt okunur olarak görüntüle', welcome: 'Hoşgeldiniz', }, operators: { diff --git a/packages/translations/src/languages/uk.ts b/packages/translations/src/languages/uk.ts index e68cdf4040b..5ac9d388eb1 100644 --- a/packages/translations/src/languages/uk.ts +++ b/packages/translations/src/languages/uk.ts @@ -213,6 +213,7 @@ export const ukTranslations: DefaultTranslationsObject = { descending: 'В порядку спадання', deselectAllRows: 'Скасувати вибір всіх рядків', document: 'Документ', + documentLocked: 'Документ заблоковано', documents: 'Документи', duplicate: 'Дублювати', duplicateWithoutSaving: 'Дублювання без збереження змін', @@ -233,6 +234,7 @@ export const ukTranslations: DefaultTranslationsObject = { filterWhere: 'Де фільтрувати {{label}}', filters: 'Фільтри', globals: 'Глобальні', + goBack: 'Повернутися', language: 'Мова', lastModified: 'Останні зміни', leaveAnyway: 'Все одно вийти', @@ -285,6 +287,7 @@ export const ukTranslations: DefaultTranslationsObject = { success: 'Успіх', successfullyCreated: '{{label}} успішно створено.', successfullyDuplicated: '{{label}} успішно продубльовано.', + takeOver: 'Перейняти', thisLanguage: 'Українська', titleDeleted: '{{label}} "{{title}}" успішно видалено.', true: 'Правда', @@ -300,6 +303,7 @@ export const ukTranslations: DefaultTranslationsObject = { username: "Ім'я користувача", users: 'Користувачі', value: 'Значення', + viewReadOnly: 'Перегляд тільки для читання', welcome: 'Вітаю', }, operators: { diff --git a/packages/translations/src/languages/vi.ts b/packages/translations/src/languages/vi.ts index 72217e15b33..3ec71d59e09 100644 --- a/packages/translations/src/languages/vi.ts +++ b/packages/translations/src/languages/vi.ts @@ -211,6 +211,7 @@ export const viTranslations: DefaultTranslationsObject = { descending: 'Xếp theo thứ tự giảm dần', deselectAllRows: 'Bỏ chọn tất cả các hàng', document: 'Tài liệu', + documentLocked: 'Tài liệu bị khóa', documents: 'Tài liệu', duplicate: 'Tạo bản sao', duplicateWithoutSaving: 'Không lưu dữ liệu và tạo bản sao', @@ -231,6 +232,7 @@ export const viTranslations: DefaultTranslationsObject = { filterWhere: 'Lọc {{label}} với điều kiện:', filters: 'Bộ lọc', globals: 'Toàn thể (globals)', + goBack: 'Quay lại', language: 'Ngôn ngữ', lastModified: 'Chỉnh sửa lần cuối vào lúc', leaveAnyway: 'Tiếp tục thoát', @@ -283,6 +285,7 @@ export const viTranslations: DefaultTranslationsObject = { success: 'Thành công', successfullyCreated: '{{label}} đã được tạo thành công.', successfullyDuplicated: '{{label}} đã được sao chép thành công.', + takeOver: 'Tiếp quản', thisLanguage: 'Vietnamese (Tiếng Việt)', titleDeleted: '{{label}} {{title}} đã được xóa thành công.', true: 'Thật', @@ -298,6 +301,7 @@ export const viTranslations: DefaultTranslationsObject = { username: 'Tên đăng nhập', users: 'Người dùng', value: 'Giá trị', + viewReadOnly: 'Xem chỉ đọc', welcome: 'Xin chào', }, operators: { diff --git a/packages/translations/src/languages/zh.ts b/packages/translations/src/languages/zh.ts index f7af8952318..95cc5854af2 100644 --- a/packages/translations/src/languages/zh.ts +++ b/packages/translations/src/languages/zh.ts @@ -206,6 +206,7 @@ export const zhTranslations: DefaultTranslationsObject = { descending: '降序', deselectAllRows: '取消选择所有行', document: '文件', + documentLocked: '文档已锁定', documents: '文件', duplicate: '重复', duplicateWithoutSaving: '重复而不保存更改。', @@ -226,6 +227,7 @@ export const zhTranslations: DefaultTranslationsObject = { filterWhere: '过滤{{label}}', filters: '过滤器', globals: '全局', + goBack: '返回', language: '语言', lastModified: '最后修改', leaveAnyway: '无论如何都要离开', @@ -277,6 +279,7 @@ export const zhTranslations: DefaultTranslationsObject = { success: '成功', successfullyCreated: '成功创建{{label}}', successfullyDuplicated: '成功复制{{label}}', + takeOver: '接管', thisLanguage: '中文 (简体)', titleDeleted: '{{label}} "{{title}}"已被成功删除。', true: '真实', @@ -292,6 +295,7 @@ export const zhTranslations: DefaultTranslationsObject = { username: '用户名', users: '用户', value: '值', + viewReadOnly: '只读查看', welcome: '欢迎', }, operators: { diff --git a/packages/translations/src/languages/zhTw.ts b/packages/translations/src/languages/zhTw.ts index 2332f14aa2e..3951ab2ac3f 100644 --- a/packages/translations/src/languages/zhTw.ts +++ b/packages/translations/src/languages/zhTw.ts @@ -206,6 +206,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { descending: '降冪', deselectAllRows: '取消選擇全部', document: '文件', + documentLocked: '文件已鎖定', documents: '文件', duplicate: '複製', duplicateWithoutSaving: '複製而不儲存變更。', @@ -226,6 +227,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { filterWhere: '過濾{{label}}', filters: '過濾器', globals: '全域', + goBack: '返回', language: '語言', lastModified: '最後修改', leaveAnyway: '無論如何都要離開', @@ -277,6 +279,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { success: '成功', successfullyCreated: '成功建立{{label}}', successfullyDuplicated: '成功複製{{label}}', + takeOver: '接管', thisLanguage: '中文 (繁體)', titleDeleted: '{{label}} "{{title}}"已被成功刪除。', true: '真實', @@ -292,6 +295,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { username: '使用者名稱', users: '使用者', value: '值', + viewReadOnly: '僅檢視', welcome: '歡迎', }, operators: { From fb0a2fa7ec88b95d1ad11ca363099abffbbffe64 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 20 Aug 2024 13:51:12 -0400 Subject: [PATCH 033/173] chore(db-drizzle): abstract build order by to function --- packages/drizzle/src/queries/buildOrderBy.ts | 78 ++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 packages/drizzle/src/queries/buildOrderBy.ts diff --git a/packages/drizzle/src/queries/buildOrderBy.ts b/packages/drizzle/src/queries/buildOrderBy.ts new file mode 100644 index 00000000000..c9913fb85fe --- /dev/null +++ b/packages/drizzle/src/queries/buildOrderBy.ts @@ -0,0 +1,78 @@ +import type { Field } from 'payload' + +import { asc, desc } from 'drizzle-orm' + +import type { DrizzleAdapter, GenericColumn } from '../types.js' +import type { BuildQueryJoinAliases, BuildQueryResult } from './buildQuery.js' + +import { getTableColumnFromPath } from './getTableColumnFromPath.js' + +type Args = { + adapter: DrizzleAdapter + fields: Field[] + joins: BuildQueryJoinAliases + locale?: string + selectFields: Record + sort?: string + tableName: string +} +export const buildOrderBy = ({ + adapter, + fields, + joins, + locale, + selectFields, + sort, + tableName, +}: Args): BuildQueryResult['orderBy'] => { + const orderBy: BuildQueryResult['orderBy'] = { + column: null, + order: null, + } + + if (sort) { + let sortPath + + if (sort[0] === '-') { + sortPath = sort.substring(1) + orderBy.order = desc + } else { + sortPath = sort + orderBy.order = asc + } + + try { + const { columnName: sortTableColumnName, table: sortTable } = getTableColumnFromPath({ + adapter, + collectionPath: sortPath, + fields, + joins, + locale, + pathSegments: sortPath.replace(/__/g, '.').split('.'), + selectFields, + tableName, + value: sortPath, + }) + orderBy.column = sortTable?.[sortTableColumnName] + } catch (err) { + // continue + } + } + + if (!orderBy?.column) { + orderBy.order = desc + const createdAt = adapter.tables[tableName]?.createdAt + + if (createdAt) { + orderBy.column = createdAt + } else { + orderBy.column = adapter.tables[tableName].id + } + } + + if (orderBy.column) { + selectFields.sort = orderBy.column + } + + return orderBy +} From 7c7c5715550ee667b84860e9e01d359806fe826a Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 20 Aug 2024 16:02:04 -0400 Subject: [PATCH 034/173] chore: fix types after merge --- packages/payload/src/admin/fields/Join.ts | 27 ++++++++++++++++----- packages/payload/src/admin/types.ts | 9 ++++--- packages/payload/src/fields/config/types.ts | 10 ++++++++ 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/packages/payload/src/admin/fields/Join.ts b/packages/payload/src/admin/fields/Join.ts index 50bb33b0658..556d4423043 100644 --- a/packages/payload/src/admin/fields/Join.ts +++ b/packages/payload/src/admin/fields/Join.ts @@ -1,15 +1,30 @@ import type { MarkOptional } from 'ts-essentials' -import type { JoinFieldClient } from '../../fields/config/types.js' -import type { ErrorComponent } from '../forms/Error.js' -import type { DescriptionComponent, FormFieldBase, LabelComponent } from '../types.js' +import type { JoinField, JoinFieldClient } from '../../fields/config/types.js' +import type { FieldErrorClientComponent, FieldErrorServerComponent } from '../forms/Error.js' +import type { + FieldDescriptionClientComponent, + FieldDescriptionServerComponent, + FieldLabelClientComponent, + FieldLabelServerComponent, + FormFieldBase, +} from '../types.js' + +type JoinFieldClientWithoutType = MarkOptional export type JoinFieldProps = { readonly field: MarkOptional } & FormFieldBase -export type JoinFieldLabelComponent = LabelComponent<'join'> +export type JoinFieldLabelServerComponent = FieldLabelServerComponent + +export type JoinFieldLabelClientComponent = FieldLabelClientComponent + +export type JoinFieldDescriptionServerComponent = FieldDescriptionServerComponent + +export type JoinFieldDescriptionClientComponent = + FieldDescriptionClientComponent -export type JoinFieldDescriptionComponent = DescriptionComponent<'join'> +export type JoinFieldErrorServerComponent = FieldErrorServerComponent -export type JoinFieldErrorComponent = ErrorComponent<'join'> +export type JoinFieldErrorClientComponent = FieldErrorClientComponent diff --git a/packages/payload/src/admin/types.ts b/packages/payload/src/admin/types.ts index 2230f62c541..07c0c6d326a 100644 --- a/packages/payload/src/admin/types.ts +++ b/packages/payload/src/admin/types.ts @@ -125,9 +125,12 @@ export type { } from './fields/JSON.js' export type { - JoinFieldDescriptionComponent, - JoinFieldErrorComponent, - JoinFieldLabelComponent, + JoinFieldDescriptionClientComponent, + JoinFieldDescriptionServerComponent, + JoinFieldErrorClientComponent, + JoinFieldErrorServerComponent, + JoinFieldLabelClientComponent, + JoinFieldLabelServerComponent, JoinFieldProps, } from './fields/Join.js' diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index 5ca5eb6c48a..8e239f56bcb 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -6,6 +6,12 @@ import type { CSSProperties } from 'react' import type { DeepUndefinable } from 'ts-essentials' import type { RichTextAdapter, RichTextAdapterProvider } from '../../admin/RichText.js' +import type { + JoinFieldErrorClientComponent, + JoinFieldErrorServerComponent, + JoinFieldLabelClientComponent, + JoinFieldLabelServerComponent, +} from '../../admin/fields/Join.js' import type { ArrayFieldErrorClientComponent, ArrayFieldErrorServerComponent, @@ -1314,6 +1320,10 @@ export type JoinField = { update?: never } admin?: { + components?: { + Error?: CustomComponent + Label?: CustomComponent + } & Admin['components'] disableBulkEdit?: never readOnly?: never } & Admin From 39a2ea3a4f6fc15c993dc761441e1e6909c20a45 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 22 Aug 2024 10:21:17 -0400 Subject: [PATCH 035/173] renames to RelationshipTable component and moves to components dir --- .../elements/RelationshipTable}/MyCell.tsx | 9 +- .../elements/RelationshipTable}/MyTable.tsx | 5 +- .../elements/RelationshipTable}/index.scss | 0 .../src/elements/RelationshipTable}/index.tsx | 23 +- packages/ui/src/fields/Join/index.tsx | 4 +- templates/website/pnpm-lock.yaml | 10220 ++++++++++++++++ test/_community/collections/Posts/index.ts | 9 - test/joins/payload-types.ts | 42 +- 8 files changed, 10245 insertions(+), 67 deletions(-) rename {test/_community/collections/Posts/TableField => packages/ui/src/elements/RelationshipTable}/MyCell.tsx (56%) rename {test/_community/collections/Posts/TableField => packages/ui/src/elements/RelationshipTable}/MyTable.tsx (86%) rename {test/_community/collections/Posts/TableField => packages/ui/src/elements/RelationshipTable}/index.scss (100%) rename {test/_community/collections/Posts/TableField => packages/ui/src/elements/RelationshipTable}/index.tsx (87%) create mode 100644 templates/website/pnpm-lock.yaml diff --git a/test/_community/collections/Posts/TableField/MyCell.tsx b/packages/ui/src/elements/RelationshipTable/MyCell.tsx similarity index 56% rename from test/_community/collections/Posts/TableField/MyCell.tsx rename to packages/ui/src/elements/RelationshipTable/MyCell.tsx index cf56110eb6e..eb622e6747e 100644 --- a/test/_community/collections/Posts/TableField/MyCell.tsx +++ b/packages/ui/src/elements/RelationshipTable/MyCell.tsx @@ -1,8 +1,13 @@ 'use client' +import type { CellComponentProps } from 'payload' -import { EditIcon, useDocumentDrawer, useTableCell } from '@payloadcms/ui' +import React from 'react' -export const MyCell = (props) => { +import { EditIcon } from '../../icons/Edit/index.js' +import { useDocumentDrawer } from '../DocumentDrawer/index.js' +import { useTableCell } from '../Table/index.js' + +export const MyCell: React.FC = (props) => { const context = useTableCell() const { diff --git a/test/_community/collections/Posts/TableField/MyTable.tsx b/packages/ui/src/elements/RelationshipTable/MyTable.tsx similarity index 86% rename from test/_community/collections/Posts/TableField/MyTable.tsx rename to packages/ui/src/elements/RelationshipTable/MyTable.tsx index 44c805fa483..bfadeca4d9d 100644 --- a/test/_community/collections/Posts/TableField/MyTable.tsx +++ b/packages/ui/src/elements/RelationshipTable/MyTable.tsx @@ -2,9 +2,12 @@ import type { ClientCollectionConfig } from 'payload' -import { Pagination, Table, useListQuery } from '@payloadcms/ui' import React, { Fragment } from 'react' +import { useListQuery } from '../../providers/ListQuery/index.js' +import { Pagination } from '../Pagination/index.js' +import { Table } from '../Table/index.js' + type RelationshipTableComponentProps = { readonly collectionConfig: ClientCollectionConfig } diff --git a/test/_community/collections/Posts/TableField/index.scss b/packages/ui/src/elements/RelationshipTable/index.scss similarity index 100% rename from test/_community/collections/Posts/TableField/index.scss rename to packages/ui/src/elements/RelationshipTable/index.scss diff --git a/test/_community/collections/Posts/TableField/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx similarity index 87% rename from test/_community/collections/Posts/TableField/index.tsx rename to packages/ui/src/elements/RelationshipTable/index.tsx index bb062ef9791..bd2c65ff810 100644 --- a/test/_community/collections/Posts/TableField/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -1,19 +1,17 @@ 'use client' import type { ClientCollectionConfig, ClientField, PaginatedDocs, Where } from 'payload' -import { - FieldLabel, - ListQueryProvider, - LoadingOverlay, - TableColumnsProvider, - useConfig, - useDocumentDrawer, - useListDrawer, - usePayloadAPI, -} from '@payloadcms/ui' import React, { useEffect, useReducer, useState } from 'react' -import { hoistQueryParamsToAnd } from '../../../../../packages/ui/src/elements/ListDrawer/DrawerContent.js' +import { FieldLabel } from '../../fields/FieldLabel/index.js' +import { usePayloadAPI } from '../../hooks/usePayloadAPI.js' +import { useConfig } from '../../providers/Config/index.js' +import { ListQueryProvider } from '../../providers/ListQuery/index.js' +import { useDocumentDrawer } from '../DocumentDrawer/index.js' +import { hoistQueryParamsToAnd } from '../ListDrawer/DrawerContent.js' +import { useListDrawer } from '../ListDrawer/index.js' +import { LoadingOverlay } from '../Loading/index.js' +import { TableColumnsProvider } from '../TableColumns/index.js' import { MyCell } from './MyCell.js' import { MyTableComponent } from './MyTable.js' import './index.scss' @@ -49,7 +47,7 @@ const filterOptions: Where = {} const defaultLimit = 5 -export const TableField: React.FC = (props) => { +export const RelationshipTable: React.FC = (props) => { const { field } = props const { @@ -147,6 +145,7 @@ export const TableField: React.FC = (props) =>

= (props) => { path: pathFromContext ?? pathFromProps ?? name, }) - console.log(props) + console.log('field props', props) // TODO: replace hidden placeholder with the actual edit component return ( diff --git a/templates/website/pnpm-lock.yaml b/templates/website/pnpm-lock.yaml new file mode 100644 index 00000000000..d7ed653f0f5 --- /dev/null +++ b/templates/website/pnpm-lock.yaml @@ -0,0 +1,10220 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + +importers: + + .: + dependencies: + '@payloadcms/db-mongodb': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4)) + '@payloadcms/live-preview-react': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@payloadcms/next': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(graphql@16.9.0)(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4) + '@payloadcms/plugin-cloud': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4)) + '@payloadcms/plugin-form-builder': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4) + '@payloadcms/plugin-nested-docs': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4)) + '@payloadcms/plugin-redirects': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4)) + '@payloadcms/plugin-seo': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(@payloadcms/translations@3.0.0-beta.84)(@payloadcms/ui@3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@payloadcms/richtext-lexical': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(bnvdl5wfjkg4h76us5tylsgsuq) + '@payloadcms/ui': + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4) + '@radix-ui/react-checkbox': + specifier: ^1.0.4 + version: 1.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-label': + specifier: ^2.0.2 + version: 2.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-select': + specifier: ^2.0.0 + version: 2.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-slot': + specifier: ^1.0.2 + version: 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + geist: + specifier: ^1.3.0 + version: 1.3.1(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) + graphql: + specifier: ^16.8.2 + version: 16.9.0 + jsonwebtoken: + specifier: 9.0.1 + version: 9.0.1 + lexical: + specifier: 0.17.0 + version: 0.17.0 + lucide-react: + specifier: ^0.378.0 + version: 0.378.0(react@19.0.0-rc-06d0b89e-20240801) + next: + specifier: 15.0.0-canary.104 + version: 15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + payload: + specifier: 3.0.0-beta.84 + version: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + payload-admin-bar: + specifier: ^1.0.6 + version: 1.0.6(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + prism-react-renderer: + specifier: ^2.3.1 + version: 2.3.1(react@19.0.0-rc-06d0b89e-20240801) + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-hook-form: + specifier: 7.45.4 + version: 7.45.4(react@19.0.0-rc-06d0b89e-20240801) + sharp: + specifier: 0.32.6 + version: 0.32.6 + tailwind-merge: + specifier: ^2.3.0 + version: 2.5.2 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.10) + devDependencies: + '@next/eslint-plugin-next': + specifier: ^13.1.6 + version: 13.5.6 + '@payloadcms/eslint-config': + specifier: ^1.1.1 + version: 1.1.1(typescript@5.5.4) + '@tailwindcss/typography': + specifier: ^0.5.13 + version: 0.5.14(tailwindcss@3.4.10) + '@types/escape-html': + specifier: ^1.0.2 + version: 1.0.4 + '@types/node': + specifier: 18.11.3 + version: 18.11.3 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + autoprefixer: + specifier: ^10.4.19 + version: 10.4.20(postcss@8.4.41) + copyfiles: + specifier: ^2.4.1 + version: 2.4.1 + eslint: + specifier: ^8 + version: 8.57.0 + eslint-config-next: + specifier: 15.0.0-canary.104 + version: 15.0.0-canary.104(eslint@8.57.0)(typescript@5.5.4) + postcss: + specifier: ^8.4.38 + version: 8.4.41 + prettier: + specifier: ^3.0.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.3 + version: 3.4.10 + typescript: + specifier: 5.5.4 + version: 5.5.4 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@1.2.2': + resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@1.2.2': + resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-cognito-identity@3.632.0': + resolution: {integrity: sha512-ciPZZ0jxMmXuaKCVdJthWogfqJ/4nb1zCxm7D/XkKcSbANjAiJ+1l+yiu7ZPTLGKKPRQQkPsWUknw5xb/5LxeQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-s3@3.633.0': + resolution: {integrity: sha512-KPwNGlZlCRUADNTvwPJmvDvlh8N/jxjcv5e71M/mWxLXwSPdlHlRjVSBL1/CPSXUr86XRAsPL+BCRkdiytUhbg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso-oidc@3.632.0': + resolution: {integrity: sha512-Oh1fIWaoZluihOCb/zDEpRTi+6an82fgJz7fyRBugyLhEtDjmvpCQ3oKjzaOhoN+4EvXAm1ZS/ZgpvXBlIRTgw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.632.0 + + '@aws-sdk/client-sso@3.632.0': + resolution: {integrity: sha512-iYWHiKBz44m3chCFvtvHnvCpL2rALzyr1e6tOZV3dLlOKtQtDUlPy6OtnXDu4y+wyJCniy8ivG3+LAe4klzn1Q==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sts@3.632.0': + resolution: {integrity: sha512-Ss5cBH09icpTvT+jtGGuQlRdwtO7RyE9BF4ZV/CEPATdd9whtJt4Qxdya8BUnkWR7h5HHTrQHqai3YVYjku41A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/core@3.629.0': + resolution: {integrity: sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.632.0': + resolution: {integrity: sha512-fr+xCIqMYsUD67vwE/IpboIqHiEYMQMrpPjnvpbbvyjTKspFh0GS7Qn1LVFCd5oNeu1rzAdJei1On2HBOwIiZQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-env@3.620.1': + resolution: {integrity: sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-http@3.622.0': + resolution: {integrity: sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-ini@3.632.0': + resolution: {integrity: sha512-m6epoW41xa1ajU5OiHcmQHoGVtrbXBaRBOUhlCLZmcaqMLYsboM4iD/WZP8aatKEON5tTnVXh/4StV8D/+wemw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.632.0 + + '@aws-sdk/credential-provider-node@3.632.0': + resolution: {integrity: sha512-cL8fuJWm/xQBO4XJPkeuZzl3XinIn9EExWgzpG48NRMKR5us1RI/ucv7xFbBBaG+r/sDR2HpYBIA3lVIpm1H3Q==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-process@3.620.1': + resolution: {integrity: sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-sso@3.632.0': + resolution: {integrity: sha512-P/4wB6j7ym5QCPTL2xlMfvf2NcXSh+z0jmsZP4WW/tVwab4hvgabPPbLeEZDSWZ0BpgtxKGvRq0GSHuGeirQbA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.621.0': + resolution: {integrity: sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.621.0 + + '@aws-sdk/credential-providers@3.632.0': + resolution: {integrity: sha512-Q4x2ARdgncZKOJE/NXJHY5s8/YDRugVUR4lBEtibE764w5ezAhI1aMChzAzv4j3WMSDZ29KyxaymHHt2vJED9g==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/lib-storage@3.633.0': + resolution: {integrity: sha512-bc+o95CWgyY9BwY6BmmvM+SfmOTNzkvszE8jSNtw4RO8rhhy+cDkwMOpyHe2mBWMUEq2LMXW3TvIrPZT1bvTyA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-s3': ^3.633.0 + + '@aws-sdk/middleware-bucket-endpoint@3.620.0': + resolution: {integrity: sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-expect-continue@3.620.0': + resolution: {integrity: sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.620.0': + resolution: {integrity: sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-host-header@3.620.0': + resolution: {integrity: sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-location-constraint@3.609.0': + resolution: {integrity: sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-logger@3.609.0': + resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.620.0': + resolution: {integrity: sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.633.0': + resolution: {integrity: sha512-7jjmWVw28wIHOdrHyTCvwKr1EYGrZI13DviwAOwRC0y9dB8gGCdRiA4fNczripUBxolCCE9mpqLrqy5pXtTzvA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-ssec@3.609.0': + resolution: {integrity: sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-user-agent@3.632.0': + resolution: {integrity: sha512-yY/sFsHKwG9yzSf/DTclqWJaGPI2gPBJDCGBujSqTG1zlS7Ot4fqi91DZ6088BFWzbOorDzJFcAhAEFzc6LuQg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/region-config-resolver@3.614.0': + resolution: {integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.633.0': + resolution: {integrity: sha512-96F7Mx4lybMZdE0TTEkw6EKpeB0hxqp3J8fUJasesekTnO7jsklc47GHL5R3whyS/L4/JaPazm0Pi2DEH3kw1w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/token-providers@3.614.0': + resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.614.0 + + '@aws-sdk/types@3.609.0': + resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-arn-parser@3.568.0': + resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-endpoints@3.632.0': + resolution: {integrity: sha512-LlYMU8pAbcEQphOpE6xaNLJ8kPGhklZZTVzZVpVW477NaaGgoGTMYNXTABYHcxeF5E2lLrxql9OmVpvr8GWN8Q==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-locate-window@3.568.0': + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-user-agent-browser@3.609.0': + resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==} + + '@aws-sdk/util-user-agent-node@3.614.0': + resolution: {integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/util-utf8-browser@3.259.0': + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + + '@aws-sdk/xml-builder@3.609.0': + resolution: {integrity: sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==} + engines: {node: '>=16.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.3': + resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + + '@bcherny/json-schema-ref-parser@9.0.9': + resolution: {integrity: sha512-vmEmnJCfpkLdas++9OYg6riIezTYqTHpqUTODJzHLzs5UnXujbOJW9VwcVCnyo1mVRt32FRr23iXBx/sX8YbeQ==} + + '@dnd-kit/accessibility@3.1.0': + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + + '@dnd-kit/core@6.0.8': + resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@dnd-kit/sortable@7.0.2': + resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} + peerDependencies: + '@dnd-kit/core': ^6.0.7 + react: '>=16.8.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + + '@emnapi/runtime@1.2.0': + resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + + '@emotion/babel-plugin@11.12.0': + resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + + '@emotion/cache@11.13.1': + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + + '@emotion/css@11.13.0': + resolution: {integrity: sha512-BUk99ylT+YHl+W/HN7nv1RCTkDYmKKqa1qbvM/qLSQEg61gipuBF5Hptk/2/ERmX2DCv0ccuFGhz9i0KSZOqPg==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.13.0': + resolution: {integrity: sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.0': + resolution: {integrity: sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.9.0': + resolution: {integrity: sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0': + resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.0': + resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.48.0': + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@faceless-ui/modal@3.0.0-beta.2': + resolution: {integrity: sha512-UmXvz7Iw3KMO4Pm3llZczU4uc5pPQDb6rdqwoBvYDFgWvkraOAHKx0HxSZgwqQvqOhn8joEFBfFp6/Do2562ow==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + + '@faceless-ui/scroll-info@2.0.0-beta.0': + resolution: {integrity: sha512-pUBhQP8vduA7rVndNsjhaCcds1BykA/Q4iV23JWijU6ZFL/M3Fm9P3ypDS+0VVxolqemNhw8S3FXPwZGgjH4Rw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + + '@faceless-ui/window-info@3.0.0-beta.0': + resolution: {integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + + '@floating-ui/core@1.6.7': + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + + '@floating-ui/react-dom@2.1.1': + resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.22': + resolution: {integrity: sha512-LNv4azPt8SpT4WW7Kku5JNVjLk2GcS0bGGjFTAgqOONRFo9r/aaGHHPpdiIuQbB1t8shmWyWqTTUDmZ9fcNshg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@lexical/clipboard@0.17.0': + resolution: {integrity: sha512-wYtC6VJhuSxUZc69VTU+vBgzB4HQqhve2hLrr3v+3tR2aimx3KnKphCCP1TexCntxpEnOTPXafEgpOW/EVQE+Q==} + + '@lexical/code@0.17.0': + resolution: {integrity: sha512-8zrgHzf27aYySfUVeSKw8YP/LkRlXHSwD03BKlkSZAb4HX/WC60SGmdXUhtyTIBucqe0pnuGsRYfR9euD0/tfw==} + + '@lexical/devtools-core@0.17.0': + resolution: {integrity: sha512-0ftqWsoCb96oTc8Ok+uvjGAXZpsN9oc6ml3d46BdufdZyxHXC4qU3YVoPfLkgAHzH+4fQlNypu7u3Ym3dZ2rJg==} + peerDependencies: + react: '>=17.x' + react-dom: '>=17.x' + + '@lexical/dragon@0.17.0': + resolution: {integrity: sha512-XSsrHVwhjBIVF9VN9MFm6Go8fquj5H/jlYuyNzemHq0tOli8NaoSovGc5q0LwXr88RPsuIt1jluazR7Q1+kxTQ==} + + '@lexical/hashtag@0.17.0': + resolution: {integrity: sha512-E6nSoz9haB6JypQtYxG5OYr36AHgam/FBMu77OWNl1KsJbkP8nInm+P22QFsNnEvs4Hk6/0FJ5g42+lTEnGmIg==} + + '@lexical/headless@0.17.0': + resolution: {integrity: sha512-yKvXcq2F6S1lwDLcwv+bHht/al1LcFmidPT3rjISRxLX+/YjUcUT8MmvV773Du4piV4rFPbVlBPFBZfHJkDxXw==} + + '@lexical/history@0.17.0': + resolution: {integrity: sha512-SfeUKAXf9pZpqee9rMOTt33V0J0p/AS9TZLT9Un9dU6wAaHfv6NFax1ND0JoG1a9YkTc539mufxVLNjsNRc0ag==} + + '@lexical/html@0.17.0': + resolution: {integrity: sha512-sI458CEP/j+Gd2YEo1+vTax31ZAjdq5jmRJMgSKxzKlkVYAUY9eH5u3Y3awPLwLVXJHiIopMX02GeZytibuTiw==} + + '@lexical/link@0.17.0': + resolution: {integrity: sha512-Kux6yvPit6y0ksPpwimv3seVrXAsggkqB6oT6oAVBaDpYuygVEwNDqg/rCTtB3mHQ4eeuU33mdK7MSXZ34bZRQ==} + + '@lexical/list@0.17.0': + resolution: {integrity: sha512-anDuSUykTv+lqyCwl1m+sThrB15OKCa00Eo68/d2HQSHDD3KNWgSx709dcR17bD9oT204yOhMJbQGywuzcEyGQ==} + + '@lexical/mark@0.17.0': + resolution: {integrity: sha512-Ynqh9KHXUcB9qLOTGC9s+bbWtawOwRStkeIeAugTqrwckyYWeDaePpyJ6IhBBJy1E1CfpiZn71NDeP+FuRjnXQ==} + + '@lexical/markdown@0.17.0': + resolution: {integrity: sha512-6IuJ2l5p/Ma+VBUIStIRXwTC01GEzx21gvqqywuqBUzAOiMr1oRM+DGsQgrzZrcjX+LzUlZ5ZgjuWtK8XKVAZw==} + + '@lexical/offset@0.17.0': + resolution: {integrity: sha512-onE6SD2mIAwBLTT5v5fVBVtRg/NpQj+o10vTWJ1ImvEUERpSoCyHMTy3IMoSMuCRwuOG9C0cFEret2u+QS8Icw==} + + '@lexical/overflow@0.17.0': + resolution: {integrity: sha512-dh+nQAmeobKvZFodWyzNh1ZjX043Patk/1Lwct9XmtAGMUdXL+tB0bbguWVcDfY8OYu1CTQGfbdq2oMEJYzwsg==} + + '@lexical/plain-text@0.17.0': + resolution: {integrity: sha512-AEk+3ttbRyRi7m9UbU1CdLUtGsXh4FFZkBC12twV3U82lZHOdHocLlTutP+lcbYlGjeq6UF43NxOSGzsYEunsA==} + + '@lexical/react@0.17.0': + resolution: {integrity: sha512-HZ3joq+5g2++2vo/6scTd60Y2bsu8ya8EUdopyudnmGZGKAcAPue9pLOlBaEpsYZ7vqTuGjiPgtEBfFzDy9rlg==} + peerDependencies: + react: '>=17.x' + react-dom: '>=17.x' + + '@lexical/rich-text@0.17.0': + resolution: {integrity: sha512-XJc8gQBSwppCkESQaNcGtyTaPXZaeCQDcUVpnDjDK0vM/ZZN8TErxbujwbSqA3kO2dBds9N8WxNboSwuncMBcQ==} + + '@lexical/selection@0.17.0': + resolution: {integrity: sha512-UTjlvyhFY/lmHtBaIaVRwYnRfO9gR4I32+PT7vHQr4v3VfcgS63YEGSgEZy3Gh1pfeJqaZATN58+jCuMAQXlWQ==} + + '@lexical/table@0.17.0': + resolution: {integrity: sha512-RQF7IG0rGL2/bPaPFUIMgDA3QMdDflvXSnE7Udgbj9yMqSKhYkaERVfNyoLckDUSuusGJd6XV+qum6JWn0nSNA==} + + '@lexical/text@0.17.0': + resolution: {integrity: sha512-kFH0V6yjW8YswmoY7vHT4zHFDflGfamuUxTPHROpdnq/JMjHeaVwtmFBdrP0gknaC8XMRXdr3EsemQ7cbOoDPA==} + + '@lexical/utils@0.17.0': + resolution: {integrity: sha512-B/n0rRGDmdMrqi2qnprLt6SntC6jb4JItLmPl8zDDdg7/HxMdLq3F93vogeiXQJn0mlNqgiENWHvLAy5K2C2uQ==} + + '@lexical/yjs@0.17.0': + resolution: {integrity: sha512-xJv3frcK/jskssLbzdY4yfBaM7+LWaZD4YjYkJ/bvRDTey2w+McF+SvsJ/yBA8YF1oaL3rT+0aIQJ7rfH+AxjA==} + peerDependencies: + yjs: '>=13.5.22' + + '@monaco-editor/loader@1.4.0': + resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} + peerDependencies: + monaco-editor: '>= 0.21.0 < 1' + + '@monaco-editor/react@4.5.1': + resolution: {integrity: sha512-NNDFdP+2HojtNhCkRfE6/D6ro6pBNihaOzMbGK84lNWzRu+CfBjwzGt4jmnqimLuqp5yE5viHS2vi+QOAnD5FQ==} + peerDependencies: + monaco-editor: '>= 0.25.0 < 1' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@mongodb-js/saslprep@1.1.8': + resolution: {integrity: sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==} + + '@next/env@15.0.0-canary.104': + resolution: {integrity: sha512-7wOJhe62uL4ViZOumMwuPev4IxQaXJ4g97iMsXelOF+Q5QuuFXzbxIXh4OJMVAHZJMYkM5VyD2zxV66iYU01DQ==} + + '@next/env@15.0.0-rc.0': + resolution: {integrity: sha512-6W0ndQvHR9sXcqcKeR/inD2UTRCs9+VkSK3lfaGmEuZs7EjwwXMO2BPYjz9oBrtfPL3xuTjtXsHKSsalYQ5l1Q==} + + '@next/eslint-plugin-next@13.5.6': + resolution: {integrity: sha512-ng7pU/DDsxPgT6ZPvuprxrkeew3XaRf4LAT4FabaEO/hAbvVx4P7wqnqdbTdDn1kgTvsI4tpIgT4Awn/m0bGbg==} + + '@next/eslint-plugin-next@15.0.0-canary.104': + resolution: {integrity: sha512-mkvTl0zmSfRDWabHc1NQie9sw8DZHsqBx77jEu+CKaoXRJ2/zLUb29CJL0YHMIIzr/026NI8AFsg1SxrxllUsw==} + + '@next/swc-darwin-arm64@15.0.0-canary.104': + resolution: {integrity: sha512-tLrkGDlVAch+dwLr0lwZt6t//KQhwJQamTt86bFeSEgmuWg8escVD5608XjIicpy4oYUeTG2e7EDjvW1/9C7+Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.0.0-canary.104': + resolution: {integrity: sha512-NokpzlJHGzldMdx5ALJi9w8sZbFVQj3KPjMg1EKutvkX8Z0TgZguoj0Hb+0Dh7o6fBK0CqH1mYQd/IgYeqvYew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.0.0-canary.104': + resolution: {integrity: sha512-U9P1bXaxMyGrY7HdJ1fdtS5vy2yfWF7z1Qt/8OBcZi5y6WWHloZmJ/jRMXxoHJ1lcLSsC1EcubYHgV5ys1NDcA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.0.0-canary.104': + resolution: {integrity: sha512-PDOS3ySD0/YBVvKn/JhQ8xjh4HU4v2MCvqFHaoahu9v1ydmUOeuDRjQk4hUliXgvKuE/ZZksP3a9TrzpbDScsA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.0.0-canary.104': + resolution: {integrity: sha512-jYNKOIkqL4puFpeNjIZ/riK0+adDyjENjACMlU3HyuG7A0xCYAFxBIbmwjbGmpSv99+PPB/gAbGnB0TT2PDHUQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.0.0-canary.104': + resolution: {integrity: sha512-xX3ZUWM4syINdEqsUhvQWBjoFa2P8PL96adQUfph4cpUrkrUbnBQbWA2vSdSvwoC6a80wSX+buuhJptvxzEl3A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.0.0-canary.104': + resolution: {integrity: sha512-kUMeZOhueb5wXZTQTPvdl4V4wtJKh49TcVAHS7kcDTU9m8jrIQ3beKURWtzjD4iizgl/iar8CHuYS5CAnCGqAw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@15.0.0-canary.104': + resolution: {integrity: sha512-6q5HYiACa6GH7+RyTlLMdUlivwi75bw2L9PRYRBuw4C0SvLYMwBf7SlshbrCrNYbIAaGajYJLZjv3IXFnsZBjA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@15.0.0-canary.104': + resolution: {integrity: sha512-OeY5GRHRv5qMPwK2e1ipX+EeTDPmRITM9OBeaeIllubWprLGeLxnC1NbKYKCt6IfCboX+wanZKQcbuyH5RMtlg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@payloadcms/db-mongodb@3.0.0-beta.84': + resolution: {integrity: sha512-5m1T2qgTtcbpGmzTri9gwl0mMCg/DMqfnzNTO5ljABB9qh/nW7gNhzYAbQUGHHP6Pb1erYJIEtvZkcUdzhKXew==} + peerDependencies: + payload: 3.0.0-beta.84 + + '@payloadcms/email-nodemailer@3.0.0-beta.84': + resolution: {integrity: sha512-UBIlkxuT8WgWykIfGVFP83Jgfy3Bk3Z+kJRRP8XGPMOgVOdx1n8t+N3DJh8MXLMXqciUhmLQ93di56plx2Szpg==} + engines: {node: ^18.20.2 || >=20.9.0} + peerDependencies: + payload: 3.0.0-beta.84 + + '@payloadcms/eslint-config@1.1.1': + resolution: {integrity: sha512-LSf9oEPb6aMEMqdTFqj1v+7p/bdrJWG6hp7748xjVO3RL3yQESTKLK/NbjsMYITN4tKFXjfPWDUtcwHv0hS6/A==} + + '@payloadcms/graphql@3.0.0-beta.84': + resolution: {integrity: sha512-PXUuXLzZ7xjp//UgdghsM8yScBpEgTTfp9dHrrKbfEyqcL+wAgVnhvQkEkL8L38GWEHQu2Ts7rAXlWb0LHB8ow==} + hasBin: true + peerDependencies: + graphql: ^16.8.1 + payload: 3.0.0-beta.84 + + '@payloadcms/live-preview-react@3.0.0-beta.84': + resolution: {integrity: sha512-5HENOg7JiHUs/FBFqTtQGGu87i6jjewGMsMwb7V7q2aOJrxBtr4pC5GhCOZnj6/D8SNbEPIZr7A9Cuahpmk0vw==} + peerDependencies: + react: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + react-dom: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + + '@payloadcms/live-preview@3.0.0-beta.84': + resolution: {integrity: sha512-W1WSq1Q6DdSSyS8WQ17w6DdvoVv0ix2TylmIGcimu0g7W58Uiy8vmJ/Hhrb2Q4FqINRykQlea7Wpk+nwfDu93A==} + + '@payloadcms/next@3.0.0-beta.84': + resolution: {integrity: sha512-4xeCdzHS61QZX1agEjkuF1auKOSLdwrFfc/LluxNdtmcL3Qf61FQ0YDczxhtOAjQ0+aDDbU6wp/D6ssvHdcC9A==} + engines: {node: ^18.20.2 || >=20.9.0} + peerDependencies: + graphql: ^16.8.1 + next: ^15.0.0-canary.104 + payload: 3.0.0-beta.84 + + '@payloadcms/plugin-cloud@3.0.0-beta.84': + resolution: {integrity: sha512-RFzZSc7yhNJ3v2fNtv3ouN8lBhToLtyYE1UwIthyn0T1TDrXzNGoaqDk7sk1TEqnUq9UX5FtqDujWkT9o0g2mQ==} + peerDependencies: + payload: 3.0.0-beta.84 + + '@payloadcms/plugin-form-builder@3.0.0-beta.84': + resolution: {integrity: sha512-4cCahIU8Phb/TgG/vWktwu8q19dNISzo5DhL/YFpH1Lt9dZlRZqc1PDYtEknYZ6AMUrxI1/p4mnSVzOqRVhWIA==} + peerDependencies: + payload: 3.0.0-beta.84 + react: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + react-dom: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + + '@payloadcms/plugin-nested-docs@3.0.0-beta.84': + resolution: {integrity: sha512-j2YqexOxNIo1UJAqV5MpF3PQC7N4HQ01jDfYwSYFkDOEUhvvDY6pWxR0ehqk29DgTeH5MxLMWzZ1E6y0U062cw==} + peerDependencies: + payload: 3.0.0-beta.84 + + '@payloadcms/plugin-redirects@3.0.0-beta.84': + resolution: {integrity: sha512-JsSwbW+JEHwbPULmyR6dZTxhFF0F70l96onmcqohnUmbQwPdUSrM1sVt+4GiNJrzjn3uKMo/vm5/Rn8yhM8RcA==} + peerDependencies: + payload: 3.0.0-beta.84 + + '@payloadcms/plugin-seo@3.0.0-beta.84': + resolution: {integrity: sha512-uWaEtl/VQSItpE8USN9iGS26IJjFcILcT6gV1LfmI8YAhYVW8b0057YNMXtW3FoclpKx0TAnGfxm0t9GkUM4PA==} + peerDependencies: + '@payloadcms/translations': 3.0.0-beta.84 + '@payloadcms/ui': 3.0.0-beta.84 + payload: 3.0.0-beta.84 + react: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + react-dom: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + + '@payloadcms/richtext-lexical@3.0.0-beta.84': + resolution: {integrity: sha512-hgKTo0omvWZtlBx3nm7+liJqsmLUrwW6d3ZLDWmWSyIsaaSWmLcGLuRn8yKOLh5Fx4lLZ7CwApFvmiIZSrxoQw==} + engines: {node: ^18.20.2 || >=20.9.0} + peerDependencies: + '@faceless-ui/modal': 3.0.0-beta.2 + '@faceless-ui/scroll-info': 2.0.0-beta.0 + '@lexical/headless': 0.17.0 + '@lexical/link': 0.17.0 + '@lexical/list': 0.17.0 + '@lexical/mark': 0.17.0 + '@lexical/markdown': 0.17.0 + '@lexical/react': 0.17.0 + '@lexical/rich-text': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/table': 0.17.0 + '@lexical/utils': 0.17.0 + '@payloadcms/next': 3.0.0-beta.84 + '@payloadcms/translations': 3.0.0-beta.84 + '@payloadcms/ui': 3.0.0-beta.84 + lexical: 0.17.0 + payload: 3.0.0-beta.84 + react: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + react-dom: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + + '@payloadcms/translations@3.0.0-beta.84': + resolution: {integrity: sha512-t9a3DzcWnJrGiQ0Xs7dGu+r+D9WtGeRZMKQUS6imtZcqloW1aKJikX/MNYxym3nJsnQ2VolPUJ0J3wx2CBH1og==} + + '@payloadcms/ui@3.0.0-beta.84': + resolution: {integrity: sha512-A2J06Gv7xtv6uULDN2Ix6qM9sbKmVj32uyBToT6zH/ly4NBc7726vCEPI4/1G4Kep+uMPaS49tgJZqaX6yNlQQ==} + engines: {node: ^18.20.2 || >=20.9.0} + peerDependencies: + next: ^15.0.0-canary.104 + payload: 3.0.0-beta.84 + react: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + react-dom: ^19.0.0 || ^19.0.0-rc-06d0b89e-20240801 + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.1.1': + resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.0': + resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.1.1': + resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.0': + resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@react-email/render@0.0.7': + resolution: {integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==} + engines: {node: '>=16.0.0'} + + '@rushstack/eslint-patch@1.10.4': + resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + + '@selderee/plugin-htmlparser2@0.10.0': + resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} + + '@smithy/abort-controller@3.1.1': + resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} + engines: {node: '>=16.0.0'} + + '@smithy/chunked-blob-reader-native@3.0.0': + resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==} + + '@smithy/chunked-blob-reader@3.0.0': + resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} + + '@smithy/config-resolver@3.0.5': + resolution: {integrity: sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==} + engines: {node: '>=16.0.0'} + + '@smithy/core@2.4.0': + resolution: {integrity: sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w==} + engines: {node: '>=16.0.0'} + + '@smithy/credential-provider-imds@3.2.0': + resolution: {integrity: sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-codec@3.1.2': + resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==} + + '@smithy/eventstream-serde-browser@3.0.6': + resolution: {integrity: sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-config-resolver@3.0.3': + resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-node@3.0.5': + resolution: {integrity: sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-universal@3.0.5': + resolution: {integrity: sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ==} + engines: {node: '>=16.0.0'} + + '@smithy/fetch-http-handler@3.2.4': + resolution: {integrity: sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==} + + '@smithy/hash-blob-browser@3.1.2': + resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==} + + '@smithy/hash-node@3.0.3': + resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} + engines: {node: '>=16.0.0'} + + '@smithy/hash-stream-node@3.1.2': + resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==} + engines: {node: '>=16.0.0'} + + '@smithy/invalid-dependency@3.0.3': + resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@3.0.0': + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} + + '@smithy/md5-js@3.0.3': + resolution: {integrity: sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==} + + '@smithy/middleware-content-length@3.0.5': + resolution: {integrity: sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-endpoint@3.1.0': + resolution: {integrity: sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-retry@3.0.15': + resolution: {integrity: sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-serde@3.0.3': + resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-stack@3.0.3': + resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} + engines: {node: '>=16.0.0'} + + '@smithy/node-config-provider@3.1.4': + resolution: {integrity: sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==} + engines: {node: '>=16.0.0'} + + '@smithy/node-http-handler@3.1.4': + resolution: {integrity: sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==} + engines: {node: '>=16.0.0'} + + '@smithy/property-provider@3.1.3': + resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} + engines: {node: '>=16.0.0'} + + '@smithy/protocol-http@4.1.0': + resolution: {integrity: sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-builder@3.0.3': + resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-parser@3.0.3': + resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} + engines: {node: '>=16.0.0'} + + '@smithy/service-error-classification@3.0.3': + resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} + engines: {node: '>=16.0.0'} + + '@smithy/shared-ini-file-loader@3.1.4': + resolution: {integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==} + engines: {node: '>=16.0.0'} + + '@smithy/signature-v4@4.1.0': + resolution: {integrity: sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==} + engines: {node: '>=16.0.0'} + + '@smithy/smithy-client@3.2.0': + resolution: {integrity: sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw==} + engines: {node: '>=16.0.0'} + + '@smithy/types@3.3.0': + resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} + engines: {node: '>=16.0.0'} + + '@smithy/url-parser@3.0.3': + resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} + + '@smithy/util-base64@3.0.0': + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-body-length-browser@3.0.0': + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + + '@smithy/util-body-length-node@3.0.0': + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@3.0.0': + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-config-provider@3.0.0': + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-defaults-mode-browser@3.0.15': + resolution: {integrity: sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-defaults-mode-node@3.0.15': + resolution: {integrity: sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-endpoints@2.0.5': + resolution: {integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-hex-encoding@3.0.0': + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-middleware@3.0.3': + resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} + engines: {node: '>=16.0.0'} + + '@smithy/util-retry@3.0.3': + resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} + engines: {node: '>=16.0.0'} + + '@smithy/util-stream@3.1.3': + resolution: {integrity: sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==} + engines: {node: '>=16.0.0'} + + '@smithy/util-uri-escape@3.0.0': + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@3.0.0': + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-waiter@3.1.2': + resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} + engines: {node: '>=16.0.0'} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.12': + resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} + + '@tailwindcss/typography@0.5.14': + resolution: {integrity: sha512-ZvOCjUbsJBjL9CxQBn+VEnFpouzuKhxh2dH8xMIWHILL+HfOYtlAkWcyoon8LlzE53d2Yo6YO6pahKKNW3q1YQ==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@types/escape-html@1.0.4': + resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} + + '@types/eslint@8.44.2': + resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/node@18.11.3': + resolution: {integrity: sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + '@types/prismjs@1.26.4': + resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} + + '@types/react-transition-group@4.4.11': + resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@8.2.2': + resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} + + '@typescript-eslint/eslint-plugin@6.6.0': + resolution: {integrity: sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.6.0': + resolution: {integrity: sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@6.6.0': + resolution: {integrity: sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@6.6.0': + resolution: {integrity: sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@6.6.0': + resolution: {integrity: sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@6.6.0': + resolution: {integrity: sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@6.6.0': + resolution: {integrity: sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@6.6.0': + resolution: {integrity: sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.14.0: + resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} + + amazon-cognito-identity-js@6.3.12: + resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + ast-types-flow@0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.10.0: + resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} + engines: {node: '>=4'} + + axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + + axobject-query@3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + + axobject-query@3.2.4: + resolution: {integrity: sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A==} + engines: {node: '>= 0.4'} + + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + + bare-fs@2.3.1: + resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} + + bare-os@2.4.0: + resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==} + + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + + bare-stream@2.1.3: + resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-scroll-lock@4.0.0-beta.0: + resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bson-objectid@2.0.4: + resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} + + bson@4.7.2: + resolution: {integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==} + engines: {node: '>=6.9.0'} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + + buffer@5.6.0: + resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cli-color@2.0.4: + resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} + engines: {node: '>=0.10'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + console-table-printer@2.11.2: + resolution: {integrity: sha512-uuUHie0sfPP542TKGzPFal0W1wo1beuKAqIZdaavcONx8OoqdnJRKjkinbRTOta4FaCa1RcIL+7mMJWX3pQGVg==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + copyfiles@2.4.1: + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} + hasBin: true + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dataloader@2.2.2: + resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + + date-fns@3.3.1: + resolution: {integrity: sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + electron-to-chromium@1.5.12: + resolution: {integrity: sha512-tIhPkdlEoCL1Y+PToq3zRNehUaKp3wBX/sr7aclAWdIWjvqAe/Im/H0SiCM4c1Q8BLPHCdoJTol+ZblflydehA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-next@15.0.0-canary.104: + resolution: {integrity: sha512-8DbGD//1YDUrN4+cCATt8DKnXEr4M8b3U/p/EZPH2QS6F7zAEZmkcdjfku5ZYz9HTo4SfImcApiCBXZRQcVthQ==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-prettier@9.0.0: + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-es@3.0.1: + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.28.1: + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jest-dom@5.1.0: + resolution: {integrity: sha512-JIXZp+E/h/aGlP/rQc4tuOejiHlZXg65qw8JAJMIJA5VsdjOkss/SYcRSqBrQuEOytEM8JvngUjcz31d1RrCrA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} + peerDependencies: + '@testing-library/dom': ^8.0.0 || ^9.0.0 + eslint: ^6.8.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@testing-library/dom': + optional: true + + eslint-plugin-jest@27.2.3: + resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-jsx-a11y@6.7.1: + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-jsx-a11y@6.9.0: + resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-node@11.1.0: + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + + eslint-plugin-perfectionist@2.0.0: + resolution: {integrity: sha512-VqUk5WR7Dj8L0gNPqn7bl7NTHFYB8l5um4wo7hkMp0Dl+k8RHDAsOef4pPrty6G8vjnzvb3xIZNNshmDJI8SdA==} + peerDependencies: + astro-eslint-parser: ^0.14.0 + eslint: '>=8.0.0' + svelte: '>=3.0.0' + svelte-eslint-parser: ^0.32.0 + vue-eslint-parser: '>=9.0.0' + peerDependenciesMeta: + astro-eslint-parser: + optional: true + svelte: + optional: true + svelte-eslint-parser: + optional: true + vue-eslint-parser: + optional: true + + eslint-plugin-playwright@0.16.0: + resolution: {integrity: sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==} + peerDependencies: + eslint: '>=7' + eslint-plugin-jest: '>=25' + peerDependenciesMeta: + eslint-plugin-jest: + optional: true + + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.33.2: + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react@7.35.0: + resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-plugin-regexp@1.15.0: + resolution: {integrity: sha512-YEtQPfdudafU7RBIFci81R/Q1yErm0mVh3BkGnXD2Dk8DLwTFdc2ITYH1wCnHKim2gnHfPFgrkh+b2ozyyU7ag==} + engines: {node: ^12 || >=14} + peerDependencies: + eslint: '>=6.0.0' + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + fast-base64-decode@1.0.0: + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + hasBin: true + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-type@17.1.6: + resolution: {integrity: sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + focus-trap@7.5.4: + resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + geist@1.3.1: + resolution: {integrity: sha512-Q4gC1pBVPN+D579pBaz0TRRnGA4p9UK6elDY/xizXdFk/g4EKR5g0I+4p/Kj6gM0SajDBZ/0FvDV9ey9ud7BWw==} + peerDependencies: + next: '>=13.2.0' + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-promise@4.2.2: + resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} + engines: {node: '>=12'} + peerDependencies: + glob: ^7.1.6 + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql-http@1.22.1: + resolution: {integrity: sha512-4Jor+LRbA7SfSaw7dfDUs2UBzvWg3cKrykfHRgKsOIvQaLuf+QOcG2t3Mx5N9GzSNJcuqMqJWz0ta5+BryEmXg==} + engines: {node: '>=12'} + peerDependencies: + graphql: '>=0.11 <=16' + + graphql-playground-html@1.6.30: + resolution: {integrity: sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==} + + graphql-scalars@1.22.2: + resolution: {integrity: sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + graphql@16.9.0: + resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-to-text@9.0.3: + resolution: {integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==} + engines: {node: '>=14'} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-status@1.6.2: + resolution: {integrity: sha512-oUExvfNckrpTpDazph7kNG8sQi5au3BeTo0idaZFXEhTaJKu7GNJCLHI0rYY2wljm548MSTM+Ljj/c6anqu2zQ==} + engines: {node: '>= 0.4.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsdoctypeparser@9.0.0: + resolution: {integrity: sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==} + engines: {node: '>=10'} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-to-typescript@11.0.3: + resolution: {integrity: sha512-EaEE9Y4VZ8b9jW5zce5a9L3+p4C9AqgIRHbNVDJahfMnoKzcd4sDb98BLxLdQhJEuRAXyKLg4H66NKm80W8ilg==} + engines: {node: '>=12.0.0'} + hasBin: true + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonwebtoken@9.0.1: + resolution: {integrity: sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==} + engines: {node: '>=12', npm: '>=6'} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + kareem@2.5.1: + resolution: {integrity: sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==} + engines: {node: '>=12.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lexical@0.17.0: + resolution: {integrity: sha512-cCFmANO5rIf34NF0go/hxp5S3V5Z8G2Rsa1FJy50qF2WM5EJNJ/MqN75TApjfgMkfrbO6gau3X12nCqwsT7aDg==} + + lib0@0.2.97: + resolution: {integrity: sha512-Q4d1ekgvufi9FiHkkL46AhecfNjznSL9MRNoJRQ76gBHS9OqU2ArfQK0FvBpuxgWeJeNI0LVgAYMIpsGeX4gYg==} + engines: {node: '>=16'} + hasBin: true + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + + lucide-react@0.378.0: + resolution: {integrity: sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + memoizee@0.4.17: + resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} + engines: {node: '>=0.12'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + monaco-editor@0.38.0: + resolution: {integrity: sha512-11Fkh6yzEmwx7O0YoLxeae0qEGFwmyPRlVxpg7oF9czOOCB/iCjdJrG5I67da5WiXK3YJCxoz9TJFE8Tfq/v9A==} + + mongodb-connection-string-url@2.6.0: + resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + + mongodb@4.17.1: + resolution: {integrity: sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==} + engines: {node: '>=12.9.0'} + + mongoose-paginate-v2@1.7.22: + resolution: {integrity: sha512-xW5GugkE21DJiu9e13EOxKt4ejEKQkRP/S1PkkXRjnk2rRZVKBcld1nPV+VJ/YCPfm8hb3sz9OvI7O38RmixkA==} + engines: {node: '>=4.0.0'} + + mongoose@6.12.3: + resolution: {integrity: sha512-MNJymaaXali7w7rHBxVUoQ3HzHHMk/7I/+yeeoSa4rUzdjZwIWQznBNvVgc0A8ghuJwsuIkb5LyLV6gSjGjWyQ==} + engines: {node: '>=12.0.0'} + + mpath@0.9.0: + resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} + engines: {node: '>=4.0.0'} + + mquery@4.0.3: + resolution: {integrity: sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==} + engines: {node: '>=12.0.0'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + next@15.0.0-canary.104: + resolution: {integrity: sha512-LVzRmV/p/BGGYmTjlZSmCULmBQ2S5ov1nQAXYssu4cEMhkpklQVgh2I+uHHgo/xgdqIIcEBlUgsfV+CfKVsM6Q==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-abi@3.66.0: + resolution: {integrity: sha512-J3ygyG8cTcn5TVzpHYEBE6zHN4uVoj6wKMS946b19VYGhVpGgR5mB3OK2oBTe0l3Bpsj5/h+TAblq0K8Ec9cRQ==} + engines: {node: '>=10'} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + nodemailer@6.9.10: + resolution: {integrity: sha512-qtoKfGFhvIFW5kLfrkw2R6Nm6Ur4LNUMykyqu6n9BRKJuyQrqEGwdXXUAbwWEKt33dlWUGXb7rzmJP/p4+O+CA==} + engines: {node: '>=6.0.0'} + + noms@0.0.0: + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-to-formdata@4.5.1: + resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseley@0.11.0: + resolution: {integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + payload-admin-bar@1.0.6: + resolution: {integrity: sha512-hpQdOiPq4LpWTkbuAnvxDf5wQ2ysMp9kQt+X2U+FfvBwD1U6qoxJfmUymG1OjLlaZzCZ93FlOdTl4u4Z0/m/SA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + payload@3.0.0-beta.84: + resolution: {integrity: sha512-mdpvaHqeawvllq1hEJByq7RDLuM8MpPiGi0ovXOYj7hyyRYES9DPWnl31uGEX8UjtDCDoCUBg2pocOMdh0q6Hw==} + engines: {node: ^18.20.2 || >=20.9.0} + hasBin: true + peerDependencies: + graphql: ^16.8.1 + + peberminta@0.8.0: + resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} + + peek-readable@5.1.4: + resolution: {integrity: sha512-E7mY2VmKqw9jYuXrSWGHFuPCW2SLQenzXLF3amGaY6lXXg4/b3gj5HVM7h8ZjCO/nZS9ICs0Cz285+32FvNd/A==} + engines: {node: '>=14.16'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-pretty@11.2.1: + resolution: {integrity: sha512-O05NuD9tkRasFRWVaF/uHLOvoRDFD7tb5VMertr78rbsYFjYp48Vg3477EshVAF5eZaEw+OpDl/tu+B0R5o+7g==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.3.1: + resolution: {integrity: sha512-afSfrq/hUiW/MFmQcLEwV9Zh8Ry6MrMTOyBU53o/fc0gEl+1OZ/Fks/xQCM2nOC0C/OfDtQMnT2d8c3kpcfSzA==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + prism-react-renderer@2.3.1: + resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} + peerDependencies: + react: '>=16.0.0' + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs-esm@7.0.2: + resolution: {integrity: sha512-D8NAthKSD7SGn748v+GLaaO6k08Mvpoqroa35PqIQC4gtUa8/Pb/k+r0m0NnGBVbHDP1gKZ2nVywqfMisRhV5A==} + engines: {node: '>=18'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-animate-height@2.1.2: + resolution: {integrity: sha512-A9jfz/4CTdsIsE7WCQtO9UkOpMBcBRh8LxyHl2eoZz1ki02jpyUL5xt58gabd0CyeLQ8fRyQ+s2lyV2Ufu8Owg==} + engines: {node: '>= 6.0.0'} + peerDependencies: + react: '>=15.6.2' + react-dom: '>=15.6.2' + + react-datepicker@6.9.0: + resolution: {integrity: sha512-QTxuzeem7BUfVFWv+g5WuvzT0c5BPo+XTCNbMTZKSZQLU+cMMwSUHwspaxuIcDlwNcOH0tiJ+bh1fJ2yxOGYWA==} + peerDependencies: + react: ^16.9.0 || ^17 || ^18 + react-dom: ^16.9.0 || ^17 || ^18 + + react-diff-viewer-continued@3.2.6: + resolution: {integrity: sha512-GrzyqQnjIMoej+jMjWvtVSsQqhXgzEGqpXlJ2dAGfOk7Q26qcm8Gu6xtI430PBUyZsERe8BJSQf+7VZZo8IBNQ==} + engines: {node: '>= 8'} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-dom@19.0.0-rc-06d0b89e-20240801: + resolution: {integrity: sha512-6JIbEXFwsRkI3gLKhcmjvQ3GKsP4NR/BjPyTKyp7xYeQEeiH01TypGVbc/K6nU1/y4jNGFGkxH3ZFbKKZwCecw==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + react-error-boundary@3.1.4: + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13.1' + + react-error-boundary@4.0.13: + resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + peerDependencies: + react: '>=16.13.1' + + react-hook-form@7.45.4: + resolution: {integrity: sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + react-image-crop@10.1.8: + resolution: {integrity: sha512-4rb8XtXNx7ZaOZarKKnckgz4xLMvds/YrU6mpJfGhGAsy2Mg4mIw1x+DCCGngVGq2soTBVVOxx2s/C6mTX9+pA==} + peerDependencies: + react: '>=16.13.1' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-onclickoutside@6.13.1: + resolution: {integrity: sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==} + peerDependencies: + react: ^15.5.x || ^16.x || ^17.x || ^18.x + react-dom: ^15.5.x || ^16.x || ^17.x || ^18.x + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-select@5.8.0: + resolution: {integrity: sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + react@19.0.0-rc-06d0b89e-20240801: + resolution: {integrity: sha512-moBKIME1GBgs8onH1xCs+gzPWyLF62m+2XbD4GpirxeRDca7GLA8UQZO9IuQvf1uxCpVWCG8FrpU/D2x7Plknw==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + refa@0.11.0: + resolution: {integrity: sha512-486O8/pQXwj9jV0mVvUnTsxq0uknpBnNJ0eCUhkZqJRQ8KutrT1PhzmumdCeM1hSBF2eMlFPmwECRER4IbKXlQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp-ast-analysis@0.6.0: + resolution: {integrity: sha512-OLxjyjPkVH+rQlBLb1I/P/VTmamSjGkvN5PTV5BXP432k3uVz727J7H29GA5IFiY0m7e1xBN7049Wn59FY3DEQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + + resend@0.17.2: + resolution: {integrity: sha512-lakm76u4MiIDeMF1s2tCmjtksOhwZOs4WcAXkA7aUTvl+63/h+0h6Q6WnkB8RGtj6GakUhQuUkiZshfXgtIrGw==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + + sass@1.77.4: + resolution: {integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==} + engines: {node: '>=14.0.0'} + hasBin: true + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scheduler@0.25.0-rc-06d0b89e-20240801: + resolution: {integrity: sha512-5RF+494IBigvBHUPYId9MhAWyN0cZZq3o82oAbYvZuc2IFc4mZYHS3z2MuJ5Lwm39zGWDEzB404X6BO47zbt5w==} + + scheduler@0.25.0-rc-f994737d14-20240522: + resolution: {integrity: sha512-qS+xGFF7AljP2APO2iJe8zESNsK20k25MACz+WGOXPybUsRdi1ssvaoF93im2nSX2q/XT3wKkjdz6RQfbmaxdw==} + + scmp@2.1.0: + resolution: {integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==} + + scslre@0.2.0: + resolution: {integrity: sha512-4hc49fUMmX3jM0XdFUAPBrs1xwEcdHa0KyjEsjFs+Zfc66mpFpq5YmRgDtl+Ffo6AtJIilfei+yKw8fUn3N88w==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + selderee@0.10.0: + resolution: {integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + sift@16.0.1: + resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + simple-wcswidth@1.0.1: + resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonic-boom@4.0.1: + resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} + + sonner@1.5.0: + resolution: {integrity: sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + state-local@1.0.7: + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + streamx@2.18.0: + resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.includes@2.0.0: + resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + strtok3@7.1.1: + resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} + engines: {node: '>=16'} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwind-merge@2.5.2: + resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.10: + resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + text-decoder@1.1.1: + resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + timers-ext@0.1.8: + resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} + engines: {node: '>=0.12'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + tsx@4.17.0: + resolution: {integrity: sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==} + engines: {node: '>=18.0.0'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@3.13.0: + resolution: {integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==} + engines: {node: '>=14.16'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + types-react-dom@19.0.0-rc.0: + resolution: {integrity: sha512-wGlQSD6H6EeCxhH+dSip1cPcCU7nNTOwHEr29rjiNtGkUPlmEofOizoQaPMEqQH2V76ME3NLvBDLGajRu3xZOw==} + + types-react@19.0.0-rc.0: + resolution: {integrity: sha512-JFd3qtgXZ+EdHht8WXMPSF231brd6Bu4yLKqyo0JjpzhmjYxJptT6TBh/xFqOhx+ee2Nagj7Ttkh5F/jc49TVQ==} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-context-selector@2.0.0: + resolution: {integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==} + peerDependencies: + react: '>=18.0.0' + scheduler: '>=0.19.0' + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': npm:types-react@19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.4: + resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yjs@13.6.18: + resolution: {integrity: sha512-GBTjO4QCmv2HFKFkYIJl7U77hIB1o22vSCSQD1Ge8ZxWbIbn8AltI4gyXbtL+g5/GJep67HCMq3Y5AmNwDSyEg==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.3 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.3 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-crypto/sha256-js@1.2.2': + dependencies: + '@aws-crypto/util': 1.2.2 + '@aws-sdk/types': 3.609.0 + tslib: 1.14.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.3 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.6.3 + + '@aws-crypto/util@1.2.2': + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-sdk/client-cognito-identity@3.632.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.632.0(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/client-sts': 3.632.0 + '@aws-sdk/core': 3.629.0 + '@aws-sdk/credential-provider-node': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.632.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.632.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.4.0 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.15 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.15 + '@smithy/util-defaults-mode-node': 3.0.15 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-s3@3.633.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.632.0(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/client-sts': 3.632.0 + '@aws-sdk/core': 3.629.0 + '@aws-sdk/credential-provider-node': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/middleware-bucket-endpoint': 3.620.0 + '@aws-sdk/middleware-expect-continue': 3.620.0 + '@aws-sdk/middleware-flexible-checksums': 3.620.0 + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-location-constraint': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-sdk-s3': 3.633.0 + '@aws-sdk/middleware-ssec': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.632.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/signature-v4-multi-region': 3.633.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.632.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@aws-sdk/xml-builder': 3.609.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.4.0 + '@smithy/eventstream-serde-browser': 3.0.6 + '@smithy/eventstream-serde-config-resolver': 3.0.3 + '@smithy/eventstream-serde-node': 3.0.5 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-blob-browser': 3.1.2 + '@smithy/hash-node': 3.0.3 + '@smithy/hash-stream-node': 3.1.2 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/md5-js': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.15 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.15 + '@smithy/util-defaults-mode-node': 3.0.15 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-stream': 3.1.3 + '@smithy/util-utf8': 3.0.0 + '@smithy/util-waiter': 3.1.2 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.632.0 + '@aws-sdk/core': 3.629.0 + '@aws-sdk/credential-provider-node': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.632.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.632.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.4.0 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.15 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.15 + '@smithy/util-defaults-mode-node': 3.0.15 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.632.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.629.0 + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.632.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.632.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.4.0 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.15 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.15 + '@smithy/util-defaults-mode-node': 3.0.15 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.632.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.632.0(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/core': 3.629.0 + '@aws-sdk/credential-provider-node': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.632.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.632.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.4.0 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.15 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.15 + '@smithy/util-defaults-mode-node': 3.0.15 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.629.0': + dependencies: + '@smithy/core': 2.4.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + fast-xml-parser: 4.4.1 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-cognito-identity@3.632.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.632.0 + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-env@3.620.1': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-http@3.622.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/util-stream': 3.1.3 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-ini@3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(@aws-sdk/client-sts@3.632.0)': + dependencies: + '@aws-sdk/client-sts': 3.632.0 + '@aws-sdk/credential-provider-env': 3.620.1 + '@aws-sdk/credential-provider-http': 3.622.0 + '@aws-sdk/credential-provider-process': 3.620.1 + '@aws-sdk/credential-provider-sso': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)) + '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.2.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-node@3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(@aws-sdk/client-sts@3.632.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.620.1 + '@aws-sdk/credential-provider-http': 3.622.0 + '@aws-sdk/credential-provider-ini': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/credential-provider-process': 3.620.1 + '@aws-sdk/credential-provider-sso': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)) + '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.2.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-process@3.620.1': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-sso@3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))': + dependencies: + '@aws-sdk/client-sso': 3.632.0 + '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.621.0(@aws-sdk/client-sts@3.632.0)': + dependencies: + '@aws-sdk/client-sts': 3.632.0 + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/credential-providers@3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))': + dependencies: + '@aws-sdk/client-cognito-identity': 3.632.0 + '@aws-sdk/client-sso': 3.632.0 + '@aws-sdk/client-sts': 3.632.0 + '@aws-sdk/credential-provider-cognito-identity': 3.632.0 + '@aws-sdk/credential-provider-env': 3.620.1 + '@aws-sdk/credential-provider-http': 3.622.0 + '@aws-sdk/credential-provider-ini': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/credential-provider-node': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/credential-provider-process': 3.620.1 + '@aws-sdk/credential-provider-sso': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)) + '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.2.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/lib-storage@3.633.0(@aws-sdk/client-s3@3.633.0)': + dependencies: + '@aws-sdk/client-s3': 3.633.0 + '@smithy/abort-controller': 3.1.1 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/smithy-client': 3.2.0 + buffer: 5.6.0 + events: 3.3.0 + stream-browserify: 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-bucket-endpoint@3.620.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-expect-continue@3.620.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-flexible-checksums@3.620.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-host-header@3.620.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-location-constraint@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-logger@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-recursion-detection@3.620.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-sdk-s3@3.633.0': + dependencies: + '@aws-sdk/core': 3.629.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/core': 2.4.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-stream': 3.1.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-ssec@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-user-agent@3.632.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.632.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/region-config-resolver@3.614.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@aws-sdk/signature-v4-multi-region@3.633.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.633.0 + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.632.0(@aws-sdk/client-sts@3.632.0) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/types@3.609.0': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/util-arn-parser@3.568.0': + dependencies: + tslib: 2.6.3 + + '@aws-sdk/util-endpoints@3.632.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + '@smithy/util-endpoints': 2.0.5 + tslib: 2.6.3 + + '@aws-sdk/util-locate-window@3.568.0': + dependencies: + tslib: 2.6.3 + + '@aws-sdk/util-user-agent-browser@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + bowser: 2.11.0 + tslib: 2.6.3 + + '@aws-sdk/util-user-agent-node@3.614.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/util-utf8-browser@3.259.0': + dependencies: + tslib: 2.6.3 + + '@aws-sdk/xml-builder@3.609.0': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/generator@7.25.0': + dependencies: + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.25.3': + dependencies: + '@babel/types': 7.25.2 + + '@babel/runtime@7.25.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + + '@babel/traverse@7.25.3': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcherny/json-schema-ref-parser@9.0.9': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + call-me-maybe: 1.0.2 + js-yaml: 4.1.0 + + '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + tslib: 2.6.3 + + '@dnd-kit/core@6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-06d0b89e-20240801) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-06d0b89e-20240801) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + tslib: 2.6.3 + + '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@dnd-kit/core': 6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-06d0b89e-20240801) + react: 19.0.0-rc-06d0b89e-20240801 + tslib: 2.6.3 + + '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + tslib: 2.6.3 + + '@emnapi/runtime@1.2.0': + dependencies: + tslib: 2.6.3 + optional: true + + '@emotion/babel-plugin@11.12.0': + dependencies: + '@babel/helper-module-imports': 7.24.7 + '@babel/runtime': 7.25.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.0 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.13.1': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/css@11.13.0': + dependencies: + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.0 + transitivePeerDependencies: + - supports-color + + '@emotion/hash@0.9.2': {} + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.13.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + '@babel/runtime': 7.25.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-06d0b89e-20240801) + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.0': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.9.0 + '@emotion/utils': 1.4.0 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.9.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + '@emotion/utils@1.4.0': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.48.0)': + dependencies: + eslint: 8.48.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.6 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.48.0': {} + + '@eslint/js@8.57.0': {} + + '@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + body-scroll-lock: 4.0.0-beta.0 + focus-trap: 7.5.4 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + + '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@floating-ui/core@1.6.7': + dependencies: + '@floating-ui/utils': 0.2.7 + + '@floating-ui/dom@1.6.10': + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 + + '@floating-ui/react-dom@2.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@floating-ui/dom': 1.6.10 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@floating-ui/react@0.26.22(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@floating-ui/react-dom': 2.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@floating-ui/utils': 0.2.7 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.7': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.6 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.2.0 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jsdevtools/ono@7.1.3': {} + + '@lexical/clipboard@0.17.0': + dependencies: + '@lexical/html': 0.17.0 + '@lexical/list': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/code@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + prismjs: 1.29.0 + + '@lexical/devtools-core@0.17.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@lexical/html': 0.17.0 + '@lexical/link': 0.17.0 + '@lexical/mark': 0.17.0 + '@lexical/table': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@lexical/dragon@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/hashtag@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/headless@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/history@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/html@0.17.0': + dependencies: + '@lexical/selection': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/link@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/list@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/mark@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/markdown@0.17.0': + dependencies: + '@lexical/code': 0.17.0 + '@lexical/link': 0.17.0 + '@lexical/list': 0.17.0 + '@lexical/rich-text': 0.17.0 + '@lexical/text': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/offset@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/overflow@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/plain-text@0.17.0': + dependencies: + '@lexical/clipboard': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/react@0.17.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(yjs@13.6.18)': + dependencies: + '@lexical/clipboard': 0.17.0 + '@lexical/code': 0.17.0 + '@lexical/devtools-core': 0.17.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@lexical/dragon': 0.17.0 + '@lexical/hashtag': 0.17.0 + '@lexical/history': 0.17.0 + '@lexical/link': 0.17.0 + '@lexical/list': 0.17.0 + '@lexical/mark': 0.17.0 + '@lexical/markdown': 0.17.0 + '@lexical/overflow': 0.17.0 + '@lexical/plain-text': 0.17.0 + '@lexical/rich-text': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/table': 0.17.0 + '@lexical/text': 0.17.0 + '@lexical/utils': 0.17.0 + '@lexical/yjs': 0.17.0(yjs@13.6.18) + lexical: 0.17.0 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-error-boundary: 3.1.4(react@19.0.0-rc-06d0b89e-20240801) + transitivePeerDependencies: + - yjs + + '@lexical/rich-text@0.17.0': + dependencies: + '@lexical/clipboard': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/selection@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/table@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/text@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/utils@0.17.0': + dependencies: + '@lexical/list': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/table': 0.17.0 + lexical: 0.17.0 + + '@lexical/yjs@0.17.0(yjs@13.6.18)': + dependencies: + '@lexical/offset': 0.17.0 + lexical: 0.17.0 + yjs: 13.6.18 + + '@monaco-editor/loader@1.4.0(monaco-editor@0.38.0)': + dependencies: + monaco-editor: 0.38.0 + state-local: 1.0.7 + + '@monaco-editor/react@4.5.1(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@monaco-editor/loader': 1.4.0(monaco-editor@0.38.0) + monaco-editor: 0.38.0 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@mongodb-js/saslprep@1.1.8': + dependencies: + sparse-bitfield: 3.0.3 + optional: true + + '@next/env@15.0.0-canary.104': {} + + '@next/env@15.0.0-rc.0': {} + + '@next/eslint-plugin-next@13.5.6': + dependencies: + glob: 7.1.7 + + '@next/eslint-plugin-next@15.0.0-canary.104': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.0.0-canary.104': + optional: true + + '@next/swc-darwin-x64@15.0.0-canary.104': + optional: true + + '@next/swc-linux-arm64-gnu@15.0.0-canary.104': + optional: true + + '@next/swc-linux-arm64-musl@15.0.0-canary.104': + optional: true + + '@next/swc-linux-x64-gnu@15.0.0-canary.104': + optional: true + + '@next/swc-linux-x64-musl@15.0.0-canary.104': + optional: true + + '@next/swc-win32-arm64-msvc@15.0.0-canary.104': + optional: true + + '@next/swc-win32-ia32-msvc@15.0.0-canary.104': + optional: true + + '@next/swc-win32-x64-msvc@15.0.0-canary.104': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@one-ini/wasm@0.1.1': {} + + '@payloadcms/db-mongodb@3.0.0-beta.84(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))': + dependencies: + bson-objectid: 2.0.4 + http-status: 1.6.2 + mongoose: 6.12.3(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)) + mongoose-paginate-v2: 1.7.22 + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + prompts: 2.4.2 + uuid: 10.0.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - supports-color + + '@payloadcms/email-nodemailer@3.0.0-beta.84(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))': + dependencies: + nodemailer: 6.9.10 + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + + '@payloadcms/eslint-config@1.1.1(typescript@5.5.4)': + dependencies: + '@types/eslint': 8.44.2 + '@typescript-eslint/eslint-plugin': 6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.5.4))(eslint@8.48.0)(typescript@5.5.4) + '@typescript-eslint/parser': 6.6.0(eslint@8.48.0)(typescript@5.5.4) + eslint: 8.48.0 + eslint-config-prettier: 9.0.0(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.5.4))(eslint@8.48.0) + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.48.0)(typescript@5.5.4) + eslint-plugin-jest-dom: 5.1.0(eslint@8.48.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) + eslint-plugin-node: 11.1.0(eslint@8.48.0) + eslint-plugin-perfectionist: 2.0.0(eslint@8.48.0)(typescript@5.5.4) + eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.48.0)(typescript@5.5.4))(eslint@8.48.0) + eslint-plugin-react: 7.33.2(eslint@8.48.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) + eslint-plugin-regexp: 1.15.0(eslint@8.48.0) + transitivePeerDependencies: + - '@testing-library/dom' + - astro-eslint-parser + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + - svelte + - svelte-eslint-parser + - typescript + - vue-eslint-parser + + '@payloadcms/graphql@3.0.0-beta.84(graphql@16.9.0)(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(typescript@5.5.4)': + dependencies: + graphql: 16.9.0 + graphql-scalars: 1.22.2(graphql@16.9.0) + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + pluralize: 8.0.0 + ts-essentials: 7.0.3(typescript@5.5.4) + tsx: 4.17.0 + transitivePeerDependencies: + - typescript + + '@payloadcms/live-preview-react@3.0.0-beta.84(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@payloadcms/live-preview': 3.0.0-beta.84 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@payloadcms/live-preview@3.0.0-beta.84': {} + + '@payloadcms/next@3.0.0-beta.84(graphql@16.9.0)(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4)': + dependencies: + '@dnd-kit/core': 6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@payloadcms/graphql': 3.0.0-beta.84(graphql@16.9.0)(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(typescript@5.5.4) + '@payloadcms/translations': 3.0.0-beta.84 + '@payloadcms/ui': 3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4) + busboy: 1.6.0 + file-type: 17.1.6 + graphql: 16.9.0 + graphql-http: 1.22.1(graphql@16.9.0) + graphql-playground-html: 1.6.30 + http-status: 1.6.2 + next: 15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + path-to-regexp: 6.2.2 + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + qs-esm: 7.0.2 + react-diff-viewer-continued: 3.2.6(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + sass: 1.77.4 + sonner: 1.5.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + uuid: 10.0.0 + ws: 8.18.0 + transitivePeerDependencies: + - '@types/react' + - bufferutil + - monaco-editor + - react + - react-dom + - supports-color + - typescript + - utf-8-validate + + '@payloadcms/plugin-cloud@3.0.0-beta.84(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))': + dependencies: + '@aws-sdk/client-cognito-identity': 3.632.0 + '@aws-sdk/client-s3': 3.633.0 + '@aws-sdk/credential-providers': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)) + '@aws-sdk/lib-storage': 3.633.0(@aws-sdk/client-s3@3.633.0) + '@payloadcms/email-nodemailer': 3.0.0-beta.84(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4)) + amazon-cognito-identity-js: 6.3.12 + nodemailer: 6.9.10 + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + resend: 0.17.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - debug + - encoding + + '@payloadcms/plugin-form-builder@3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4)': + dependencies: + '@payloadcms/ui': 3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4) + escape-html: 1.0.3 + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + transitivePeerDependencies: + - '@types/react' + - monaco-editor + - next + - supports-color + - typescript + + '@payloadcms/plugin-nested-docs@3.0.0-beta.84(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))': + dependencies: + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + + '@payloadcms/plugin-redirects@3.0.0-beta.84(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))': + dependencies: + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + + '@payloadcms/plugin-seo@3.0.0-beta.84(@payloadcms/translations@3.0.0-beta.84)(@payloadcms/ui@3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@payloadcms/translations': 3.0.0-beta.84 + '@payloadcms/ui': 3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4) + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@payloadcms/richtext-lexical@3.0.0-beta.84(bnvdl5wfjkg4h76us5tylsgsuq)': + dependencies: + '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@lexical/headless': 0.17.0 + '@lexical/link': 0.17.0 + '@lexical/list': 0.17.0 + '@lexical/mark': 0.17.0 + '@lexical/markdown': 0.17.0 + '@lexical/react': 0.17.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(yjs@13.6.18) + '@lexical/rich-text': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/table': 0.17.0 + '@lexical/utils': 0.17.0 + '@payloadcms/next': 3.0.0-beta.84(graphql@16.9.0)(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4) + '@payloadcms/translations': 3.0.0-beta.84 + '@payloadcms/ui': 3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4) + '@types/uuid': 10.0.0 + bson-objectid: 2.0.4 + dequal: 2.0.3 + lexical: 0.17.0 + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-error-boundary: 4.0.13(react@19.0.0-rc-06d0b89e-20240801) + uuid: 10.0.0 + + '@payloadcms/translations@3.0.0-beta.84': + dependencies: + date-fns: 3.3.1 + + '@payloadcms/ui@3.0.0-beta.84(monaco-editor@0.38.0)(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4))(payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)(typescript@5.5.4)': + dependencies: + '@dnd-kit/core': 6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@monaco-editor/react': 4.5.1(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@payloadcms/translations': 3.0.0-beta.84 + body-scroll-lock: 4.0.0-beta.0 + bson-objectid: 2.0.4 + date-fns: 3.3.1 + dequal: 2.0.3 + md5: 2.3.0 + next: 15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + object-to-formdata: 4.5.1 + payload: 3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4) + qs-esm: 7.0.2 + react: 19.0.0-rc-06d0b89e-20240801 + react-animate-height: 2.1.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + react-datepicker: 6.9.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-image-crop: 10.1.8(react@19.0.0-rc-06d0b89e-20240801) + react-select: 5.8.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + scheduler: 0.25.0-rc-f994737d14-20240522 + sonner: 1.5.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + ts-essentials: 7.0.3(typescript@5.5.4) + use-context-selector: 2.0.0(react@19.0.0-rc-06d0b89e-20240801)(scheduler@0.25.0-rc-f994737d14-20240522) + uuid: 10.0.0 + transitivePeerDependencies: + - '@types/react' + - monaco-editor + - supports-color + - typescript + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@radix-ui/number@1.1.0': {} + + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-arrow@1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-checkbox@1.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-presence': 1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-previous': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-size': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-collection@1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-compose-refs@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-context@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-direction@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-dismissable-layer@1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-focus-guards@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-focus-scope@1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-id@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-label@2.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-popper@1.2.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@floating-ui/react-dom': 2.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@radix-ui/react-arrow': 1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-rect': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-size': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/rect': 1.1.0 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-portal@1.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-presence@1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-primitive@2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-select@2.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-dismissable-layer': 1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-focus-guards': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-focus-scope': 1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-id': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-popper': 1.2.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-portal': 1.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-use-previous': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@radix-ui/react-visually-hidden': 1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + aria-hidden: 1.2.4 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-remove-scroll: 2.5.7(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/react-slot@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-use-callback-ref@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-use-controllable-state@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-use-escape-keydown@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-use-layout-effect@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-use-previous@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-use-rect@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-use-size@1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@radix-ui/react-visually-hidden@1.1.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + '@types/react-dom': types-react-dom@19.0.0-rc.0 + + '@radix-ui/rect@1.1.0': {} + + '@react-email/render@0.0.7': + dependencies: + html-to-text: 9.0.3 + pretty: 2.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@rushstack/eslint-patch@1.10.4': {} + + '@selderee/plugin-htmlparser2@0.10.0': + dependencies: + domhandler: 5.0.3 + selderee: 0.10.0 + + '@smithy/abort-controller@3.1.1': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/chunked-blob-reader-native@3.0.0': + dependencies: + '@smithy/util-base64': 3.0.0 + tslib: 2.6.3 + + '@smithy/chunked-blob-reader@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/config-resolver@3.0.5': + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@smithy/core@2.4.0': + dependencies: + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.15 + '@smithy/middleware-serde': 3.0.3 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/credential-provider-imds@3.2.0': + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + tslib: 2.6.3 + + '@smithy/eventstream-codec@3.1.2': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 3.3.0 + '@smithy/util-hex-encoding': 3.0.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-browser@3.0.6': + dependencies: + '@smithy/eventstream-serde-universal': 3.0.5 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-config-resolver@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-node@3.0.5': + dependencies: + '@smithy/eventstream-serde-universal': 3.0.5 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-universal@3.0.5': + dependencies: + '@smithy/eventstream-codec': 3.1.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/fetch-http-handler@3.2.4': + dependencies: + '@smithy/protocol-http': 4.1.0 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + '@smithy/util-base64': 3.0.0 + tslib: 2.6.3 + + '@smithy/hash-blob-browser@3.1.2': + dependencies: + '@smithy/chunked-blob-reader': 3.0.0 + '@smithy/chunked-blob-reader-native': 3.0.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/hash-node@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/hash-stream-node@3.1.2': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/invalid-dependency@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.6.3 + + '@smithy/is-array-buffer@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/md5-js@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/middleware-content-length@3.0.5': + dependencies: + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/middleware-endpoint@3.1.0': + dependencies: + '@smithy/middleware-serde': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@smithy/middleware-retry@3.0.15': + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/service-error-classification': 3.0.3 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + tslib: 2.6.3 + uuid: 9.0.1 + + '@smithy/middleware-serde@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/middleware-stack@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/node-config-provider@3.1.4': + dependencies: + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/node-http-handler@3.1.4': + dependencies: + '@smithy/abort-controller': 3.1.1 + '@smithy/protocol-http': 4.1.0 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/property-provider@3.1.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/protocol-http@4.1.0': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/querystring-builder@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-uri-escape': 3.0.0 + tslib: 2.6.3 + + '@smithy/querystring-parser@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/service-error-classification@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + + '@smithy/shared-ini-file-loader@3.1.4': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/signature-v4@4.1.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/smithy-client@3.2.0': + dependencies: + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-stack': 3.0.3 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + '@smithy/util-stream': 3.1.3 + tslib: 2.6.3 + + '@smithy/types@3.3.0': + dependencies: + tslib: 2.6.3 + + '@smithy/url-parser@3.0.3': + dependencies: + '@smithy/querystring-parser': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-base64@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-body-length-browser@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-body-length-node@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.6.3 + + '@smithy/util-buffer-from@3.0.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-config-provider@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-defaults-mode-browser@3.0.15': + dependencies: + '@smithy/property-provider': 3.1.3 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + bowser: 2.11.0 + tslib: 2.6.3 + + '@smithy/util-defaults-mode-node@3.0.15': + dependencies: + '@smithy/config-resolver': 3.0.5 + '@smithy/credential-provider-imds': 3.2.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/smithy-client': 3.2.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-endpoints@2.0.5': + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-hex-encoding@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-middleware@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-retry@3.0.3': + dependencies: + '@smithy/service-error-classification': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-stream@3.1.3': + dependencies: + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-uri-escape@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.6.3 + + '@smithy/util-utf8@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-waiter@3.1.2': + dependencies: + '@smithy/abort-controller': 3.1.1 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.12': + dependencies: + tslib: 2.6.3 + + '@tailwindcss/typography@0.5.14(tailwindcss@3.4.10)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.10 + + '@tokenizer/token@0.3.0': {} + + '@types/escape-html@1.0.4': {} + + '@types/eslint@8.44.2': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 18.11.3 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/lodash@4.17.7': {} + + '@types/minimatch@5.1.2': {} + + '@types/node@18.11.3': {} + + '@types/parse-json@4.0.2': {} + + '@types/prettier@2.7.3': {} + + '@types/prismjs@1.26.4': {} + + '@types/react-transition-group@4.4.11': + dependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@types/semver@7.5.8': {} + + '@types/uuid@10.0.0': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@8.2.2': + dependencies: + '@types/node': 18.11.3 + '@types/webidl-conversions': 7.0.3 + + '@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.5.4))(eslint@8.48.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 6.6.0(eslint@8.48.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 6.6.0 + '@typescript-eslint/type-utils': 6.6.0(eslint@8.48.0)(typescript@5.5.4) + '@typescript-eslint/utils': 6.6.0(eslint@8.48.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.6.0 + debug: 4.3.6 + eslint: 8.48.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 6.6.0 + '@typescript-eslint/types': 6.6.0 + '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.6.0 + debug: 4.3.6 + eslint: 8.48.0 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/scope-manager@6.6.0': + dependencies: + '@typescript-eslint/types': 6.6.0 + '@typescript-eslint/visitor-keys': 6.6.0 + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@6.6.0(eslint@8.48.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.5.4) + '@typescript-eslint/utils': 6.6.0(eslint@8.48.0)(typescript@5.5.4) + debug: 4.3.6 + eslint: 8.48.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/types@6.6.0': {} + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@6.6.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 6.6.0 + '@typescript-eslint/visitor-keys': 6.6.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.48.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + eslint: 8.48.0 + eslint-scope: 5.1.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@6.21.0(eslint@8.48.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + eslint: 8.48.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@6.6.0(eslint@8.48.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.6.0 + '@typescript-eslint/types': 6.6.0 + '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.5.4) + eslint: 8.48.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@6.6.0': + dependencies: + '@typescript-eslint/types': 6.6.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + abbrev@2.0.0: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.14.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + amazon-cognito-identity-js@6.3.12: + dependencies: + '@aws-crypto/sha256-js': 1.2.2 + buffer: 4.9.2 + fast-base64-decode: 1.0.0 + isomorphic-unfetch: 3.1.0 + js-cookie: 2.2.1 + transitivePeerDependencies: + - encoding + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.6.3 + + aria-query@5.1.3: + dependencies: + deep-equal: 2.2.3 + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + ast-types-flow@0.0.7: {} + + ast-types-flow@0.0.8: {} + + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + + autoprefixer@10.4.20(postcss@8.4.41): + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001651 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axe-core@4.10.0: {} + + axios@1.4.0: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@3.1.1: + dependencies: + deep-equal: 2.2.3 + + axobject-query@3.2.4: {} + + b4a@1.6.6: {} + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.25.0 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + balanced-match@1.0.2: {} + + bare-events@2.4.2: + optional: true + + bare-fs@2.3.1: + dependencies: + bare-events: 2.4.2 + bare-path: 2.1.3 + bare-stream: 2.1.3 + optional: true + + bare-os@2.4.0: + optional: true + + bare-path@2.1.3: + dependencies: + bare-os: 2.4.0 + optional: true + + bare-stream@2.1.3: + dependencies: + streamx: 2.18.0 + optional: true + + base64-js@1.5.1: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-scroll-lock@4.0.0-beta.0: {} + + bowser@2.11.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.12 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + bson-objectid@2.0.4: {} + + bson@4.7.2: + dependencies: + buffer: 5.7.1 + + buffer-equal-constant-time@1.0.1: {} + + buffer@4.9.2: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + + buffer@5.6.0: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001651: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + charenc@0.0.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + ci-info@4.0.0: {} + + class-variance-authority@0.7.0: + dependencies: + clsx: 2.0.0 + + classnames@2.5.1: {} + + cli-color@2.0.4: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + memoizee: 0.4.17 + timers-ext: 0.1.8 + + client-only@0.0.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.0.0: {} + + clsx@2.1.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + comment-parser@1.4.1: {} + + concat-map@0.0.1: {} + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + console-table-printer@2.11.2: + dependencies: + simple-wcswidth: 1.0.1 + + convert-source-map@1.9.0: {} + + copyfiles@2.4.1: + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + noms: 0.0.0 + through2: 2.0.5 + untildify: 4.0.0 + yargs: 16.2.0 + + core-util-is@1.0.3: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.3 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypt@0.0.2: {} + + cssesc@3.0.0: {} + + cssfilter@0.0.10: {} + + csstype@3.1.3: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dataloader@2.2.2: {} + + date-fns@3.3.1: {} + + dateformat@4.6.3: {} + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-equal@2.2.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + isarray: 2.0.5 + object-is: 1.1.6 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.6 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.0.3: {} + + detect-node-es@1.1.0: {} + + didyoumean@1.2.2: {} + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.25.0 + csstype: 3.1.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.3 + + electron-to-chromium@1.5.12: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-get-iterator@1.1.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + + es-iterator-helpers@1.0.19: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + es6-weak-map@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-next@15.0.0-canary.104(eslint@8.57.0)(typescript@5.5.4): + dependencies: + '@next/eslint-plugin-next': 15.0.0-canary.104 + '@rushstack/eslint-patch': 1.10.4 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + + eslint-config-prettier@9.0.0(eslint@8.48.0): + dependencies: + eslint: 8.48.0 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.15.0 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 4.3.6 + enhanced-resolve: 5.17.1 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.6 + is-core-module: 2.15.0 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.6.0(eslint@8.48.0)(typescript@5.5.4) + eslint: 8.48.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-plugin-es@3.0.1(eslint@8.48.0): + dependencies: + eslint: 8.48.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + + eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.5.4))(eslint@8.48.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.48.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) + has: 1.0.4 + is-core-module: 2.15.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.6.0(eslint@8.48.0)(typescript@5.5.4) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.15.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jest-dom@5.1.0(eslint@8.48.0): + dependencies: + '@babel/runtime': 7.25.0 + eslint: 8.48.0 + requireindex: 1.2.0 + + eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.48.0)(typescript@5.5.4): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.5.4) + eslint: 8.48.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.5.4))(eslint@8.48.0)(typescript@5.5.4) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): + dependencies: + '@babel/runtime': 7.25.0 + aria-query: 5.3.0 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.7 + axe-core: 4.10.0 + axobject-query: 3.2.4 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.48.0 + has: 1.0.4 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + semver: 6.3.1 + + eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): + dependencies: + aria-query: 5.1.3 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.10.0 + axobject-query: 3.1.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.0.3 + string.prototype.includes: 2.0.0 + + eslint-plugin-node@11.1.0(eslint@8.48.0): + dependencies: + eslint: 8.48.0 + eslint-plugin-es: 3.0.1(eslint@8.48.0) + eslint-utils: 2.1.0 + ignore: 5.3.2 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 6.3.1 + + eslint-plugin-perfectionist@2.0.0(eslint@8.48.0)(typescript@5.5.4): + dependencies: + '@typescript-eslint/utils': 6.21.0(eslint@8.48.0)(typescript@5.5.4) + eslint: 8.48.0 + minimatch: 9.0.5 + natural-compare-lite: 1.4.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.48.0)(typescript@5.5.4))(eslint@8.48.0): + dependencies: + eslint: 8.48.0 + optionalDependencies: + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.48.0)(typescript@5.5.4) + + eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): + dependencies: + eslint: 8.48.0 + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react@7.33.2(eslint@8.48.0): + dependencies: + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 + eslint: 8.48.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + + eslint-plugin-react@7.35.0(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 + + eslint-plugin-regexp@1.15.0(eslint@8.48.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.11.0 + comment-parser: 1.4.1 + eslint: 8.48.0 + grapheme-splitter: 1.0.4 + jsdoctypeparser: 9.0.0 + refa: 0.11.0 + regexp-ast-analysis: 0.6.0 + scslre: 0.2.0 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + + eslint-visitor-keys@1.3.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@8.48.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + expand-template@2.0.3: {} + + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + fast-base64-decode@1.0.0: {} + + fast-copy@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fast-xml-parser@4.4.1: + dependencies: + strnum: 1.0.5 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-type@17.1.6: + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.1.1 + token-types: 5.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-root@1.1.0: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + focus-trap@7.5.4: + dependencies: + tabbable: 6.2.0 + + follow-redirects@1.15.6: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fraction.js@4.3.7: {} + + fs-constants@1.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + geist@1.3.1(next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)): + dependencies: + next: 15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-nonce@1.0.1: {} + + get-stdin@8.0.0: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.7.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-from-package@0.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-promise@4.2.2(glob@7.2.3): + dependencies: + '@types/glob': 7.2.0 + glob: 7.2.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.1.7: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + grapheme-splitter@1.0.4: {} + + graphemer@1.4.0: {} + + graphql-http@1.22.1(graphql@16.9.0): + dependencies: + graphql: 16.9.0 + + graphql-playground-html@1.6.30: + dependencies: + xss: 1.0.15 + + graphql-scalars@1.22.2(graphql@16.9.0): + dependencies: + graphql: 16.9.0 + tslib: 2.6.3 + + graphql@16.9.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + has@1.0.4: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + help-me@5.0.0: {} + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-to-text@9.0.3: + dependencies: + '@selderee/plugin-htmlparser2': 0.10.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.10.0 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + http-status@1.6.2: {} + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + image-size@1.1.1: + dependencies: + queue: 6.0.2 + + immutable@4.3.7: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.2: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-promise@2.2.2: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-weakmap@2.0.2: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-whitespace@0.3.0: {} + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isomorphic-unfetch@3.1.0: + dependencies: + node-fetch: 2.7.0 + unfetch: 4.2.0 + transitivePeerDependencies: + - encoding + + isomorphic.js@0.2.5: {} + + iterator.prototype@1.1.2: + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.6: {} + + joycon@3.1.1: {} + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@2.2.1: {} + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + jsdoctypeparser@9.0.0: {} + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-to-typescript@11.0.3: + dependencies: + '@bcherny/json-schema-ref-parser': 9.0.9 + '@types/json-schema': 7.0.15 + '@types/lodash': 4.17.7 + '@types/prettier': 2.7.3 + cli-color: 2.0.4 + get-stdin: 8.0.0 + glob: 7.2.3 + glob-promise: 4.2.2(glob@7.2.3) + is-glob: 4.0.3 + lodash: 4.17.21 + minimist: 1.2.8 + mkdirp: 1.0.4 + mz: 2.7.0 + prettier: 2.8.8 + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsonwebtoken@9.0.1: + dependencies: + jws: 3.2.2 + lodash: 4.17.21 + ms: 2.1.3 + semver: 7.6.3 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + kareem@2.5.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kleur@3.0.3: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.5: + dependencies: + language-subtag-registry: 0.3.23 + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + leac@0.6.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lexical@0.17.0: {} + + lib0@0.2.97: + dependencies: + isomorphic.js: 0.2.5 + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.castarray@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lru-queue@0.1.0: + dependencies: + es5-ext: 0.10.64 + + lucide-react@0.378.0(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + memoize-one@6.0.0: {} + + memoizee@0.4.17: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.8 + + memory-pager@1.5.0: + optional: true + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-response@3.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + + monaco-editor@0.38.0: {} + + mongodb-connection-string-url@2.6.0: + dependencies: + '@types/whatwg-url': 8.2.2 + whatwg-url: 11.0.0 + + mongodb@4.17.1(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)): + dependencies: + bson: 4.7.2 + mongodb-connection-string-url: 2.6.0 + socks: 2.8.3 + optionalDependencies: + '@aws-sdk/credential-providers': 3.632.0(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)) + '@mongodb-js/saslprep': 1.1.8 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + mongoose-paginate-v2@1.7.22: {} + + mongoose@6.12.3(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)): + dependencies: + bson: 4.7.2 + kareem: 2.5.1 + mongodb: 4.17.1(@aws-sdk/client-sso-oidc@3.632.0(@aws-sdk/client-sts@3.632.0)) + mpath: 0.9.0 + mquery: 4.0.3 + ms: 2.1.3 + sift: 16.0.1 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - supports-color + + mpath@0.9.0: {} + + mquery@4.0.3: + dependencies: + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + ms@2.1.2: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + napi-build-utils@1.0.2: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + next-tick@1.1.0: {} + + next@15.0.0-canary.104(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4): + dependencies: + '@next/env': 15.0.0-canary.104 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.12 + busboy: 1.6.0 + caniuse-lite: 1.0.30001651 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + styled-jsx: 5.1.6(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.0-canary.104 + '@next/swc-darwin-x64': 15.0.0-canary.104 + '@next/swc-linux-arm64-gnu': 15.0.0-canary.104 + '@next/swc-linux-arm64-musl': 15.0.0-canary.104 + '@next/swc-linux-x64-gnu': 15.0.0-canary.104 + '@next/swc-linux-x64-musl': 15.0.0-canary.104 + '@next/swc-win32-arm64-msvc': 15.0.0-canary.104 + '@next/swc-win32-ia32-msvc': 15.0.0-canary.104 + '@next/swc-win32-x64-msvc': 15.0.0-canary.104 + sass: 1.77.4 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-abi@3.66.0: + dependencies: + semver: 7.6.3 + + node-addon-api@6.1.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-releases@2.0.18: {} + + nodemailer@6.9.10: {} + + noms@0.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 1.0.34 + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.2: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object-to-formdata@4.5.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + + object.hasown@1.1.4: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.values@1.2.0: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + on-exit-leak-free@2.1.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + package-json-from-dist@1.0.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parseley@0.11.0: + dependencies: + leac: 0.6.0 + peberminta: 0.8.0 + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@6.2.2: {} + + path-type@4.0.0: {} + + payload-admin-bar@1.0.6(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + payload@3.0.0-beta.84(graphql@16.9.0)(typescript@5.5.4): + dependencies: + '@next/env': 15.0.0-rc.0 + '@payloadcms/translations': 3.0.0-beta.84 + ajv: 8.14.0 + bson-objectid: 2.0.4 + ci-info: 4.0.0 + console-table-printer: 2.11.2 + dataloader: 2.2.2 + deepmerge: 4.3.1 + file-type: 17.1.6 + find-up: 7.0.0 + get-tsconfig: 4.7.6 + graphql: 16.9.0 + http-status: 1.6.2 + image-size: 1.1.1 + json-schema-to-typescript: 11.0.3 + jsonwebtoken: 9.0.1 + minimist: 1.2.8 + monaco-editor: 0.38.0 + pino: 9.3.1 + pino-pretty: 11.2.1 + pluralize: 8.0.0 + sanitize-filename: 1.6.3 + scmp: 2.1.0 + ts-essentials: 7.0.3(typescript@5.5.4) + tsx: 4.17.0 + uuid: 10.0.0 + transitivePeerDependencies: + - typescript + + peberminta@0.8.0: {} + + peek-readable@5.1.4: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + + pino-pretty@11.2.1: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pump: 3.0.0 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 4.0.1 + strip-json-comments: 3.1.1 + + pino-std-serializers@7.0.0: {} + + pino@9.3.1: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 7.0.0 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 4.0.1 + thread-stream: 3.1.0 + + pirates@4.0.6: {} + + pluralize@8.0.0: {} + + possible-typed-array-names@1.0.0: {} + + postcss-import@15.1.0(postcss@8.4.41): + dependencies: + postcss: 8.4.41 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.41): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.41 + + postcss-load-config@4.0.2(postcss@8.4.41): + dependencies: + lilconfig: 3.1.2 + yaml: 2.5.0 + optionalDependencies: + postcss: 8.4.41 + + postcss-nested@6.2.0(postcss@8.4.41): + dependencies: + postcss: 8.4.41 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.66.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + + prelude-ls@1.2.1: {} + + prettier@2.8.8: {} + + prettier@3.3.3: {} + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + prism-react-renderer@2.3.1(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@types/prismjs': 1.26.4 + clsx: 2.1.1 + react: 19.0.0-rc-06d0b89e-20240801 + + prismjs@1.29.0: {} + + process-nextick-args@2.0.1: {} + + process-warning@3.0.0: {} + + process@0.11.10: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proto-list@1.2.4: {} + + proxy-from-env@1.1.0: {} + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + qs-esm@7.0.2: {} + + queue-microtask@1.2.3: {} + + queue-tick@1.0.1: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + quick-format-unescaped@4.0.4: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-animate-height@2.1.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + classnames: 2.5.1 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + react-datepicker@6.9.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@floating-ui/react': 0.26.22(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + clsx: 2.1.1 + date-fns: 3.3.1 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-onclickoutside: 6.13.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + + react-diff-viewer-continued@3.2.6(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@emotion/css': 11.13.0 + classnames: 2.5.1 + diff: 5.2.0 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + transitivePeerDependencies: + - supports-color + + react-dom@18.2.0(react@18.2.0): + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.2 + + react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + scheduler: 0.25.0-rc-06d0b89e-20240801 + + react-error-boundary@3.1.4(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@babel/runtime': 7.25.0 + react: 19.0.0-rc-06d0b89e-20240801 + + react-error-boundary@4.0.13(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@babel/runtime': 7.25.0 + react: 19.0.0-rc-06d0b89e-20240801 + + react-hook-form@7.45.4(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + react-image-crop@10.1.8(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + react-is@16.13.1: {} + + react-onclickoutside@6.13.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + react-remove-scroll-bar@2.3.6(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-style-singleton: 2.2.1(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + tslib: 2.6.3 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + react-remove-scroll@2.5.7(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-remove-scroll-bar: 2.3.6(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + react-style-singleton: 2.2.1(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + tslib: 2.6.3 + use-callback-ref: 1.3.2(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + use-sidecar: 1.1.2(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + react-select@5.8.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + dependencies: + '@babel/runtime': 7.25.0 + '@emotion/cache': 11.13.1 + '@emotion/react': 11.13.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@floating-ui/dom': 1.6.10 + '@types/react-transition-group': 4.4.11 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + use-isomorphic-layout-effect: 1.1.2(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + transitivePeerDependencies: + - '@types/react' + - supports-color + + react-style-singleton@2.2.1(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 19.0.0-rc-06d0b89e-20240801 + tslib: 2.6.3 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + react-transition-group@4.4.5(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@babel/runtime': 7.25.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + react@18.2.0: + dependencies: + loose-envify: 1.4.0 + + react@19.0.0-rc-06d0b89e-20240801: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readable-web-to-node-stream@3.0.2: + dependencies: + readable-stream: 3.6.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + real-require@0.2.0: {} + + refa@0.11.0: + dependencies: + '@eslint-community/regexpp': 4.11.0 + + reflect.getprototypeof@1.0.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.4 + + regenerator-runtime@0.14.1: {} + + regexp-ast-analysis@0.6.0: + dependencies: + '@eslint-community/regexpp': 4.11.0 + refa: 0.11.0 + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regexpp@3.2.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requireindex@1.2.0: {} + + resend@0.17.2: + dependencies: + '@react-email/render': 0.0.7 + axios: 1.4.0 + type-fest: 3.13.0 + transitivePeerDependencies: + - debug + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safe-stable-stringify@2.4.3: {} + + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sass@1.77.4: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.7 + source-map-js: 1.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + scheduler@0.25.0-rc-06d0b89e-20240801: {} + + scheduler@0.25.0-rc-f994737d14-20240522: {} + + scmp@2.1.0: {} + + scslre@0.2.0: + dependencies: + '@eslint-community/regexpp': 4.11.0 + refa: 0.11.0 + regexp-ast-analysis: 0.6.0 + + secure-json-parse@2.7.0: {} + + selderee@0.10.0: + dependencies: + parseley: 0.11.0 + + semver@6.3.1: {} + + semver@7.6.3: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + sharp@0.32.6: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + node-addon-api: 6.1.0 + prebuild-install: 7.1.2 + semver: 7.6.3 + simple-get: 4.0.1 + tar-fs: 3.0.6 + tunnel-agent: 0.6.0 + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + sift@16.0.1: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + simple-wcswidth@1.0.1: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + smart-buffer@4.2.0: {} + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + sonic-boom@4.0.1: + dependencies: + atomic-sleep: 1.0.0 + + sonner@1.5.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + source-map-js@1.2.0: {} + + source-map@0.5.7: {} + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + optional: true + + split2@4.2.0: {} + + sprintf-js@1.1.3: {} + + state-local@1.0.7: {} + + stop-iteration-iterator@1.0.0: + dependencies: + internal-slot: 1.0.7 + + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + streamsearch@1.1.0: {} + + streamx@2.18.0: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.1.1 + optionalDependencies: + bare-events: 2.4.2 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.includes@2.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + + string.prototype.matchall@4.0.11: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@0.10.31: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@3.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + strnum@1.0.5: {} + + strtok3@7.1.1: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.1.4 + + styled-jsx@5.1.6(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + client-only: 0.0.1 + react: 19.0.0-rc-06d0b89e-20240801 + + stylis@4.2.0: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tabbable@6.2.0: {} + + tailwind-merge@2.5.2: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.10): + dependencies: + tailwindcss: 3.4.10 + + tailwindcss@3.4.10: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-import: 15.1.0(postcss@8.4.41) + postcss-js: 4.0.1(postcss@8.4.41) + postcss-load-config: 4.0.2(postcss@8.4.41) + postcss-nested: 6.2.0(postcss@8.4.41) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@2.2.1: {} + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-fs@3.0.6: + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.1 + bare-path: 2.1.3 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.18.0 + + text-decoder@1.1.1: + dependencies: + b4a: 1.6.6 + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + timers-ext@0.1.8: + dependencies: + es5-ext: 0.10.64 + next-tick: 1.1.0 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + token-types@5.0.1: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + tr46@0.0.3: {} + + tr46@3.0.0: + dependencies: + punycode: 2.3.1 + + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + + ts-api-utils@1.3.0(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-essentials@7.0.3(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-interface-checker@0.1.13: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.6.3: {} + + tsutils@3.21.0(typescript@5.5.4): + dependencies: + tslib: 1.14.1 + typescript: 5.5.4 + + tsx@4.17.0: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@3.13.0: {} + + type@2.7.3: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + types-react-dom@19.0.0-rc.0: + dependencies: + '@types/react': types-react@19.0.0-rc.0 + + types-react@19.0.0-rc.0: + dependencies: + csstype: 3.1.3 + + typescript@5.5.4: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + unfetch@4.2.0: {} + + unicorn-magic@0.1.0: {} + + untildify@4.0.0: {} + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.2(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + tslib: 2.6.3 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + use-context-selector@2.0.0(react@19.0.0-rc-06d0b89e-20240801)(scheduler@0.25.0-rc-f994737d14-20240522): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + scheduler: 0.25.0-rc-f994737d14-20240522 + + use-isomorphic-layout-effect@1.1.2(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + use-sidecar@1.1.2(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.0.0-rc-06d0b89e-20240801 + tslib: 2.6.3 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + utf8-byte-length@1.0.5: {} + + util-deprecate@1.0.2: {} + + uuid@10.0.0: {} + + uuid@9.0.1: {} + + webidl-conversions@3.0.1: {} + + webidl-conversions@7.0.0: {} + + whatwg-url@11.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-builtin-type@1.1.4: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.18.0: {} + + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yaml@1.10.2: {} + + yaml@2.5.0: {} + + yargs-parser@20.2.9: {} + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yjs@13.6.18: + dependencies: + lib0: 0.2.97 + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} diff --git a/test/_community/collections/Posts/index.ts b/test/_community/collections/Posts/index.ts index 5d5eecf7df6..327a9ea479a 100644 --- a/test/_community/collections/Posts/index.ts +++ b/test/_community/collections/Posts/index.ts @@ -8,15 +8,6 @@ export const PostsCollection: CollectionConfig = { useAsTitle: 'text', }, fields: [ - { - type: 'ui', - name: 'ui', - admin: { - components: { - Field: '/collections/Posts/TableField/index.js#TableField', - }, - }, - }, { admin: { components: { diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index c3646d7b6d4..7c57f735b4b 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -67,34 +67,7 @@ export interface Post { export interface Category { id: string; name?: string | null; - posts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - hasPrevPage?: boolean | null; - limit?: number | null; - nextPage?: number | null; - offset?: number | null; - page?: number | null; - pagingCounter?: number | null; - prevPage?: number | null; - totalDocs?: number | null; - totalPages?: number | null; - } | null; - group?: { - posts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - hasPrevPage?: boolean | null; - limit?: number | null; - nextPage?: number | null; - offset?: number | null; - page?: number | null; - pagingCounter?: number | null; - prevPage?: number | null; - totalDocs?: number | null; - totalPages?: number | null; - } | null; - }; + group?: {}; updatedAt: string; createdAt: string; } @@ -116,19 +89,6 @@ export interface LocalizedPost { export interface LocalizedCategory { id: string; name?: string | null; - posts?: { - docs?: (string | LocalizedPost)[] | null; - hasNextPage?: boolean | null; - hasPrevPage?: boolean | null; - limit?: number | null; - nextPage?: number | null; - offset?: number | null; - page?: number | null; - pagingCounter?: number | null; - prevPage?: number | null; - totalDocs?: number | null; - totalPages?: number | null; - } | null; updatedAt: string; createdAt: string; } From 7292cb347b93016ae35465cc1ee25aee061c8336 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 22 Aug 2024 11:55:36 -0400 Subject: [PATCH 036/173] wires relationship table component into join field --- packages/payload/src/admin/fields/Join.ts | 4 +- packages/payload/src/fields/config/types.ts | 7 ++- .../src/elements/RelationshipTable/index.tsx | 48 ++++--------------- packages/ui/src/fields/Join/index.tsx | 34 ++++++++----- test/joins/config.ts | 1 + 5 files changed, 40 insertions(+), 54 deletions(-) diff --git a/packages/payload/src/admin/fields/Join.ts b/packages/payload/src/admin/fields/Join.ts index 556d4423043..6f463459d19 100644 --- a/packages/payload/src/admin/fields/Join.ts +++ b/packages/payload/src/admin/fields/Join.ts @@ -12,9 +12,7 @@ import type { type JoinFieldClientWithoutType = MarkOptional -export type JoinFieldProps = { - readonly field: MarkOptional -} & FormFieldBase +export type JoinFieldProps = FormFieldBase export type JoinFieldLabelServerComponent = FieldLabelServerComponent diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index 0979ed1a0dd..d8c38487cad 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -1411,7 +1411,12 @@ export type JoinField = { } & FieldBase export type JoinFieldClient = { - admin?: AdminClient & Pick + admin?: { + components?: { + Label?: MappedComponent + } & AdminClient['components'] + } & AdminClient & + Pick } & FieldBaseClient & Pick diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index bd2c65ff810..2891032f3ae 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -3,7 +3,6 @@ import type { ClientCollectionConfig, ClientField, PaginatedDocs, Where } from ' import React, { useEffect, useReducer, useState } from 'react' -import { FieldLabel } from '../../fields/FieldLabel/index.js' import { usePayloadAPI } from '../../hooks/usePayloadAPI.js' import { useConfig } from '../../providers/Config/index.js' import { ListQueryProvider } from '../../providers/ListQuery/index.js' @@ -11,6 +10,7 @@ import { useDocumentDrawer } from '../DocumentDrawer/index.js' import { hoistQueryParamsToAnd } from '../ListDrawer/DrawerContent.js' import { useListDrawer } from '../ListDrawer/index.js' import { LoadingOverlay } from '../Loading/index.js' +import { RelationshipProvider } from '../Table/RelationshipProvider/index.js' import { TableColumnsProvider } from '../TableColumns/index.js' import { MyCell } from './MyCell.js' import { MyTableComponent } from './MyTable.js' @@ -19,36 +19,17 @@ import './index.scss' const baseClass = 'table-field-header' type RelationshipTableComponentProps = { - readonly field: ClientField + readonly Label?: React.ReactNode + readonly initialData?: PaginatedDocs + readonly relationTo: string } -const initialData: PaginatedDocs = { - docs: [ - // { - // id: '123', - // context: {}, - // createdAt: '2021-01-01T00:00:00.000Z', - // title: 'Hello', - // updatedAt: '2021-01-01T00:00:00.000Z', - // }, - ], - hasNextPage: false, - hasPrevPage: false, - limit: 0, - page: 0, - pagingCounter: 0, - totalDocs: 0, - totalPages: 0, -} - -const relationTo = 'posts' - const filterOptions: Where = {} const defaultLimit = 5 export const RelationshipTable: React.FC = (props) => { - const { field } = props + const { Label, initialData, relationTo } = props const { config: { @@ -74,8 +55,6 @@ export const RelationshipTable: React.FC = (pro initialData, }) - console.log(data) - useEffect(() => { const { admin: { listSearchableFields, useAsTitle } = {} as ClientCollectionConfig['admin'], @@ -143,18 +122,7 @@ export const RelationshipTable: React.FC = (pro return (
-

- -

+ {Label}
Create new Add existing @@ -190,7 +158,9 @@ export const RelationshipTable: React.FC = (pro collectionSlug={relationTo} preferenceKey={preferenceKey} > - + + + diff --git a/packages/ui/src/fields/Join/index.tsx b/packages/ui/src/fields/Join/index.tsx index eeeb7179a68..e3188480a2c 100644 --- a/packages/ui/src/fields/Join/index.tsx +++ b/packages/ui/src/fields/Join/index.tsx @@ -1,33 +1,45 @@ 'use client' -import type { JoinFieldProps } from 'payload' +import type { JoinFieldProps, PaginatedDocs } from 'payload' import React from 'react' +import { RelationshipTable } from '../../elements/RelationshipTable/index.js' +import { FieldLabel } from '../../fields/FieldLabel/index.js' import { useFieldProps } from '../../forms/FieldPropsProvider/index.js' import { useField } from '../../forms/useField/index.js' import { withCondition } from '../../forms/withCondition/index.js' const JoinFieldComponent: React.FC = (props) => { const { - field: { name, _path: pathFromProps, collection, on }, + field, + field: { + name, + _path: pathFromProps, + admin: { + components: { Label }, + }, + collection, + label, + on, + }, } = props const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps() - const { path, value } = useField({ + const { path, value } = useField({ path: pathFromContext ?? pathFromProps ?? name, }) - console.log('field props', props) - - // TODO: replace hidden placeholder with the actual edit component return ( - + +

+ } + initialData={value} + relationTo={collection} /> ) } diff --git a/test/joins/config.ts b/test/joins/config.ts index 238e572195a..5fe8dea80a4 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -13,6 +13,7 @@ export default buildConfigWithDefaults({ slug: 'posts', admin: { useAsTitle: 'title', + defaultColumns: ['id', 'title', 'category'], }, fields: [ { From 9a124a84efe5757f6da81e638c84cbc50233997d Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 22 Aug 2024 12:49:04 -0400 Subject: [PATCH 037/173] adds support for beforeRows in table columns provider and renders collection type in relationship table --- .../{MyCell.tsx => cells/DrawerLink.tsx} | 9 +++--- .../src/elements/RelationshipTable/index.tsx | 30 +++++++++++++++++-- .../TableColumns/buildColumnState.tsx | 16 +++++++++- .../ui/src/elements/TableColumns/index.tsx | 5 ++++ 4 files changed, 53 insertions(+), 7 deletions(-) rename packages/ui/src/elements/RelationshipTable/{MyCell.tsx => cells/DrawerLink.tsx} (64%) diff --git a/packages/ui/src/elements/RelationshipTable/MyCell.tsx b/packages/ui/src/elements/RelationshipTable/cells/DrawerLink.tsx similarity index 64% rename from packages/ui/src/elements/RelationshipTable/MyCell.tsx rename to packages/ui/src/elements/RelationshipTable/cells/DrawerLink.tsx index eb622e6747e..cfb26fc0304 100644 --- a/packages/ui/src/elements/RelationshipTable/MyCell.tsx +++ b/packages/ui/src/elements/RelationshipTable/cells/DrawerLink.tsx @@ -3,11 +3,11 @@ import type { CellComponentProps } from 'payload' import React from 'react' -import { EditIcon } from '../../icons/Edit/index.js' -import { useDocumentDrawer } from '../DocumentDrawer/index.js' -import { useTableCell } from '../Table/index.js' +import { EditIcon } from '../../../icons/Edit/index.js' +import { useDocumentDrawer } from '../../DocumentDrawer/index.js' +import { useTableCell } from '../../Table/index.js' -export const MyCell: React.FC = (props) => { +export const DrawerLink: React.FC = (props) => { const context = useTableCell() const { @@ -16,6 +16,7 @@ export const MyCell: React.FC = (props) => { } = context const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({ + id: rowData.id, collectionSlug, }) diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 2891032f3ae..f5d1a26e40a 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -1,19 +1,22 @@ 'use client' import type { ClientCollectionConfig, ClientField, PaginatedDocs, Where } from 'payload' +import { getTranslation } from '@payloadcms/translations' import React, { useEffect, useReducer, useState } from 'react' +import { Pill } from '../../elements/Pill/index.js' import { usePayloadAPI } from '../../hooks/usePayloadAPI.js' import { useConfig } from '../../providers/Config/index.js' import { ListQueryProvider } from '../../providers/ListQuery/index.js' +import { useTranslation } from '../../providers/Translation/index.js' import { useDocumentDrawer } from '../DocumentDrawer/index.js' import { hoistQueryParamsToAnd } from '../ListDrawer/DrawerContent.js' import { useListDrawer } from '../ListDrawer/index.js' import { LoadingOverlay } from '../Loading/index.js' import { RelationshipProvider } from '../Table/RelationshipProvider/index.js' import { TableColumnsProvider } from '../TableColumns/index.js' -import { MyCell } from './MyCell.js' import { MyTableComponent } from './MyTable.js' +import { DrawerLink } from './cells/DrawerLink.js' import './index.scss' const baseClass = 'table-field-header' @@ -39,6 +42,8 @@ export const RelationshipTable: React.FC = (pro getEntityConfig, } = useConfig() + const { i18n } = useTranslation() + const [limit, setLimit] = useState(defaultLimit) const [sort, setSort] = useState(undefined) const [page, setPage] = useState(1) @@ -141,6 +146,27 @@ export const RelationshipTable: React.FC = (pro preferenceKey={preferenceKey} > {getTranslation(collectionConfig.labels.singular, i18n)} + ), + }, + }, + }, + } as ClientField, + }, + }, + ]} cellProps={[ { field: { @@ -148,7 +174,7 @@ export const RelationshipTable: React.FC = (pro components: { Cell: { type: 'client', - Component: MyCell, + Component: DrawerLink, }, }, }, diff --git a/packages/ui/src/elements/TableColumns/buildColumnState.tsx b/packages/ui/src/elements/TableColumns/buildColumnState.tsx index a3ce2c6848c..eb22b25f9ce 100644 --- a/packages/ui/src/elements/TableColumns/buildColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildColumnState.tsx @@ -19,16 +19,26 @@ import { SortColumn } from '../SortColumn/index.js' import { DefaultCell } from '../Table/DefaultCell/index.js' type Args = { + beforeRows?: Column[] cellProps: Partial[] columnPreferences: ColumnPreferences columns?: ColumnPreferences enableRowSelections: boolean + enableRowTypes?: boolean fields: ClientField[] useAsTitle: SanitizedCollectionConfig['admin']['useAsTitle'] } export const buildColumnState = (args: Args): Column[] => { - const { cellProps, columnPreferences, columns, enableRowSelections, fields, useAsTitle } = args + const { + beforeRows, + cellProps, + columnPreferences, + columns, + enableRowSelections, + fields, + useAsTitle, + } = args let sortedFieldMap = flattenFieldMap(fields) @@ -177,5 +187,9 @@ export const buildColumnState = (args: Args): Column[] => { }) } + if (beforeRows) { + sorted.unshift(...beforeRows) + } + return sorted } diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index 67652eb9ff9..17677e056d1 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -28,6 +28,7 @@ export type ListPreferences = { } type Props = { + readonly beforeRows?: Column[] readonly cellProps?: Partial[] readonly children: React.ReactNode readonly collectionSlug: string @@ -37,6 +38,7 @@ type Props = { } export const TableColumnsProvider: React.FC = ({ + beforeRows, cellProps, children, collectionSlug, @@ -64,6 +66,7 @@ export const TableColumnsProvider: React.FC = ({ const [tableColumns, setTableColumns] = React.useState(() => buildColumnState({ + beforeRows, cellProps, columnPreferences: listPreferences?.columns, columns: initialColumns, @@ -171,6 +174,7 @@ export const TableColumnsProvider: React.FC = ({ if (currentPreferences?.columns) { setTableColumns( buildColumnState({ + beforeRows, cellProps, columnPreferences: currentPreferences?.columns, columns: initialColumns, @@ -194,6 +198,7 @@ export const TableColumnsProvider: React.FC = ({ useAsTitle, listPreferences, initialColumns, + beforeRows, ]) return ( From f064743b6c3366f2087523ea4c0caa93e0bb587b Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 22 Aug 2024 14:28:00 -0400 Subject: [PATCH 038/173] wires default cell into relationship table --- .../cells/DrawerLink/index.scss | 4 + .../{DrawerLink.tsx => DrawerLink/index.tsx} | 15 ++- .../src/elements/RelationshipTable/index.scss | 17 ++- .../src/elements/RelationshipTable/index.tsx | 108 +++++++++--------- .../fields/Relationship/index.scss | 3 - .../ui/src/elements/TableColumns/index.tsx | 3 +- test/joins/config.ts | 48 ++++---- test/joins/payload-types.ts | 4 - 8 files changed, 109 insertions(+), 93 deletions(-) create mode 100644 packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.scss rename packages/ui/src/elements/RelationshipTable/cells/{DrawerLink.tsx => DrawerLink/index.tsx} (55%) diff --git a/packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.scss b/packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.scss new file mode 100644 index 00000000000..0df588c8cc9 --- /dev/null +++ b/packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.scss @@ -0,0 +1,4 @@ +.drawer-link { + display: flex; + gap: calc(var(--base) / 2); +} diff --git a/packages/ui/src/elements/RelationshipTable/cells/DrawerLink.tsx b/packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.tsx similarity index 55% rename from packages/ui/src/elements/RelationshipTable/cells/DrawerLink.tsx rename to packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.tsx index cfb26fc0304..1ee3ceb4c97 100644 --- a/packages/ui/src/elements/RelationshipTable/cells/DrawerLink.tsx +++ b/packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.tsx @@ -3,14 +3,18 @@ import type { CellComponentProps } from 'payload' import React from 'react' -import { EditIcon } from '../../../icons/Edit/index.js' -import { useDocumentDrawer } from '../../DocumentDrawer/index.js' -import { useTableCell } from '../../Table/index.js' +import { EditIcon } from '../../../../icons/Edit/index.js' +import { useDocumentDrawer } from '../../../DocumentDrawer/index.js' +import { DefaultCell } from '../../../Table/DefaultCell/index.js' +import { useTableCell } from '../../../Table/index.js' +import './index.scss' export const DrawerLink: React.FC = (props) => { const context = useTableCell() + const { field } = props const { + cellProps, customCellContext: { collectionSlug }, rowData, } = context @@ -21,9 +25,8 @@ export const DrawerLink: React.FC = (props) => { }) return ( -
- {rowData.id} -   +
+ diff --git a/packages/ui/src/elements/RelationshipTable/index.scss b/packages/ui/src/elements/RelationshipTable/index.scss index 563f4e15e46..bbd853c87a1 100644 --- a/packages/ui/src/elements/RelationshipTable/index.scss +++ b/packages/ui/src/elements/RelationshipTable/index.scss @@ -1,10 +1,21 @@ -.table-field-header { - display: flex; - justify-content: space-between; +.relationship-table { + position: relative; + + &__header { + display: flex; + justify-content: space-between; + } &__actions { display: flex; align-items: center; gap: var(--base); } + + .table { + th, + td:first-child { + min-width: 0; + } + } } diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index f5d1a26e40a..3fb8df6cbaf 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -16,13 +16,14 @@ import { LoadingOverlay } from '../Loading/index.js' import { RelationshipProvider } from '../Table/RelationshipProvider/index.js' import { TableColumnsProvider } from '../TableColumns/index.js' import { MyTableComponent } from './MyTable.js' -import { DrawerLink } from './cells/DrawerLink.js' +import { DrawerLink } from './cells/DrawerLink/index.js' import './index.scss' -const baseClass = 'table-field-header' +const baseClass = 'relationship-table' type RelationshipTableComponentProps = { readonly Label?: React.ReactNode + readonly field: ClientField readonly initialData?: PaginatedDocs readonly relationTo: string } @@ -32,7 +33,7 @@ const filterOptions: Where = {} const defaultLimit = 5 export const RelationshipTable: React.FC = (props) => { - const { Label, initialData, relationTo } = props + const { Label, field, initialData, relationTo } = props const { config: { @@ -125,70 +126,73 @@ export const RelationshipTable: React.FC = (pro } return ( -
-
+
+
{Label}
- Create new - Add existing + {i18n.t('fields:addNew')} + {i18n.t('fields:chooseFromExisting')}
- - + + {getTranslation(collectionConfig.labels.singular, i18n)} + ), + }, + }, + }, + } as ClientField, + }, + }, + ]} + cellProps={[ + { field: { admin: { components: { Cell: { type: 'client', - RenderedComponent: ( - {getTranslation(collectionConfig.labels.singular, i18n)} - ), + Component: DrawerLink, + clientProps: { + field, + }, }, }, }, } as ClientField, }, - }, - ]} - cellProps={[ - { - field: { - admin: { - components: { - Cell: { - type: 'client', - Component: DrawerLink, - }, - }, - }, - } as ClientField, - }, - ]} - collectionSlug={relationTo} - preferenceKey={preferenceKey} - > - + ]} + collectionSlug={relationTo} + preferenceKey={preferenceKey} + > - - - + + +
diff --git a/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.scss b/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.scss index ebdd21e3165..e69de29bb2d 100644 --- a/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.scss +++ b/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.scss @@ -1,3 +0,0 @@ -.relationship-cell { - min-width: 250px; -} diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index 17677e056d1..c929a73cf5d 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -178,7 +178,7 @@ export const TableColumnsProvider: React.FC = ({ cellProps, columnPreferences: currentPreferences?.columns, columns: initialColumns, - enableRowSelections: true, + enableRowSelections, fields, useAsTitle, }), @@ -199,6 +199,7 @@ export const TableColumnsProvider: React.FC = ({ listPreferences, initialColumns, beforeRows, + enableRowSelections, ]) return ( diff --git a/test/joins/config.ts b/test/joins/config.ts index 5fe8dea80a4..47e7875fcac 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -13,7 +13,7 @@ export default buildConfigWithDefaults({ slug: 'posts', admin: { useAsTitle: 'title', - defaultColumns: ['id', 'title', 'category'], + defaultColumns: ['title', 'category'], }, fields: [ { @@ -25,17 +25,17 @@ export default buildConfigWithDefaults({ type: 'relationship', relationTo: 'categories', }, - { - name: 'group', - type: 'group', - fields: [ - { - name: 'category', - type: 'relationship', - relationTo: 'categories', - }, - ], - }, + // { + // name: 'group', + // type: 'group', + // fields: [ + // { + // name: 'category', + // type: 'relationship', + // relationTo: 'categories', + // }, + // ], + // }, ], }, { @@ -54,18 +54,18 @@ export default buildConfigWithDefaults({ collection: 'posts', on: 'category', }, - { - name: 'group', - type: 'group', - fields: [ - { - name: 'posts', - type: 'join', - collection: 'posts', - on: 'group.category', - }, - ], - }, + // { + // name: 'group', + // type: 'group', + // fields: [ + // { + // name: 'posts', + // type: 'join', + // collection: 'posts', + // on: 'group.category', + // }, + // ], + // }, ], }, { diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 7c57f735b4b..b032d91a101 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -54,9 +54,6 @@ export interface Post { id: string; title?: string | null; category?: (string | null) | Category; - group?: { - category?: (string | null) | Category; - }; updatedAt: string; createdAt: string; } @@ -67,7 +64,6 @@ export interface Post { export interface Category { id: string; name?: string | null; - group?: {}; updatedAt: string; createdAt: string; } From e439fba70a13a1bf75b560ee80ae72f3435c33d7 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 22 Aug 2024 14:30:45 -0400 Subject: [PATCH 039/173] chore: locked-document progress --- .../src/elements/DocumentLocked/index.tsx | 7 +- .../src/views/Document/getDocumentData.tsx | 19 +- .../next/src/views/Edit/Default/index.tsx | 177 ++++++++++++++++-- packages/next/src/views/List/index.tsx | 1 + .../payload/src/collections/config/types.ts | 1 + .../src/collections/operations/find.ts | 23 +++ .../src/collections/operations/findByID.ts | 23 +++ .../src/collections/operations/local/find.ts | 3 + .../collections/operations/local/findByID.ts | 3 + packages/payload/src/locks/locksCollection.ts | 15 +- packages/ui/src/elements/SelectRow/index.tsx | 4 +- packages/ui/src/exports/client/index.ts | 1 - packages/ui/src/forms/Form/index.tsx | 4 +- .../ui/src/forms/RenderFields/RenderField.tsx | 6 +- packages/ui/src/forms/RenderFields/index.tsx | 15 +- .../src/forms/buildStateFromSchema/index.tsx | 1 + .../ui/src/hooks/useDocumentLockStatus.ts | 36 ---- .../ui/src/providers/DocumentInfo/index.tsx | 167 ++++++++++++++++- .../ui/src/providers/DocumentInfo/types.ts | 9 + .../ui/src/providers/DocumentLock/index.tsx | 113 ----------- packages/ui/src/providers/Root/index.tsx | 37 ++-- packages/ui/src/utilities/buildFormState.ts | 40 +++- packages/ui/src/utilities/getFormState.ts | 11 +- test/_community/payload-types.ts | 21 ++- test/buildConfigWithDefaults.ts | 4 +- 25 files changed, 510 insertions(+), 231 deletions(-) delete mode 100644 packages/ui/src/hooks/useDocumentLockStatus.ts delete mode 100644 packages/ui/src/providers/DocumentLock/index.tsx diff --git a/packages/next/src/elements/DocumentLocked/index.tsx b/packages/next/src/elements/DocumentLocked/index.tsx index 3cbe4153c9e..a89c93ed902 100644 --- a/packages/next/src/elements/DocumentLocked/index.tsx +++ b/packages/next/src/elements/DocumentLocked/index.tsx @@ -10,9 +10,8 @@ const modalSlug = 'document-locked' const baseClass = 'document-locked' -const formatDate = (dateString) => { - if (!dateString) return '' - const date = new Date(dateString) +const formatDate = (date) => { + if (!date) return '' return new Intl.DateTimeFormat('en-US', { day: 'numeric', hour: 'numeric', @@ -24,7 +23,7 @@ const formatDate = (dateString) => { } export const DocumentLocked: React.FC<{ - editedAt: null | string + editedAt: Date | null handleGoBack: () => void isActive: boolean onReadOnly: () => void diff --git a/packages/next/src/views/Document/getDocumentData.tsx b/packages/next/src/views/Document/getDocumentData.tsx index dce55483069..08cad352332 100644 --- a/packages/next/src/views/Document/getDocumentData.tsx +++ b/packages/next/src/views/Document/getDocumentData.tsx @@ -1,5 +1,6 @@ import type { Data, + FormState, Locale, PayloadRequest, SanitizedCollectionConfig, @@ -16,13 +17,16 @@ export const getDocumentData = async (args: { locale: Locale req: PayloadRequest schemaPath?: string -}): Promise => { +}): Promise<{ + data: Data + formState: FormState +}> => { const { id, collectionConfig, globalConfig, locale, req, schemaPath: schemaPathFromProps } = args const schemaPath = schemaPathFromProps || collectionConfig?.slug || globalConfig?.slug try { - const formState = await buildFormState({ + const { state: formState } = await buildFormState({ req: { ...req, data: { @@ -44,6 +48,15 @@ export const getDocumentData = async (args: { } } catch (error) { console.error('Error getting document data', error) // eslint-disable-line no-console - return {} + return { + data: {}, + formState: { + fields: { + initialValue: undefined, + valid: false, + value: undefined, + }, + }, + } } } diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index 7f13ab25e33..0d42973a9cb 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -1,6 +1,6 @@ 'use client' -import type { ClientCollectionConfig, ClientGlobalConfig } from 'payload' +import type { ClientCollectionConfig, ClientGlobalConfig, ClientUser } from 'payload' import { DocumentControls, @@ -14,14 +14,17 @@ import { useConfig, useDocumentEvents, useDocumentInfo, - useDocumentLock, useEditDepth, + useModal, useUploadEdits, } from '@payloadcms/ui' -import { formatAdminURL, getFormState } from '@payloadcms/ui/shared' +import { formatAdminURL, getFormState, requests } from '@payloadcms/ui/shared' import { useRouter, useSearchParams } from 'next/navigation.js' import React, { Fragment, useCallback, useEffect, useRef, useState } from 'react' +import { toast } from 'sonner' +import { DocumentLocked } from '../../../elements/DocumentLocked/index.js' +import { DocumentTakeOver } from '../../../elements/DocumentTakeOver/index.js' import { LeaveWithoutSaving } from '../../../elements/LeaveWithoutSaving/index.js' import { Auth } from './Auth/index.js' import { SetDocumentStepNav } from './SetDocumentStepNav/index.js' @@ -42,6 +45,7 @@ export const DefaultEditView: React.FC = () => { BeforeFields, action, apiURL, + checkLockStatus, collectionSlug, disableActions, disableLeaveWithoutSaving, @@ -52,15 +56,41 @@ export const DefaultEditView: React.FC = () => { hasPublishPermission, hasSavePermission, initialData: data, + initialEditor, initialState, + isDocumentLocked, isEditing, isInitializing, + lastEditedAt, + lockDocument, onSave: onSaveFromContext, + shouldCheckLockStatus, + unlockDocument, + updateDocumentEditor, } = useDocumentInfo() const { refreshCookieAsync, user } = useAuth() - const { lockDocument, unlockDocument } = useDocumentLock() - const hasLocked = useRef(false) + const { openModal } = useModal() + const [showLockedModal, setShowLockedModal] = useState(false) + const [isReadOnlyForIncomingUser, setIsReadOnlyForIncomingUser] = useState(false) + const [showTakeOverModal, setShowTakeOverModal] = useState(false) + + const [shouldLockDocument, setShouldLockDocument] = useState(false) + + const documentLockStateRef = useRef<{ + isLocked: boolean + user: ClientUser + } | null>(null) + + const isDocumentLockedRef = useRef(false) + + const currentDocumentEditorId = documentLockStateRef.current?.user?.id + + const [isLockedByAnotherUser, setIsLockedByAnotherUser] = useState(false) + + console.log('Initial editor: ', initialEditor) + console.log('User Id: ', user.id) + console.log('Is document locked? ', isDocumentLocked) const { config, @@ -116,19 +146,56 @@ export const DefaultEditView: React.FC = () => { return false }) + const handleTakeOver = useCallback(async () => { + // Update the document for the incoming user + await updateDocumentEditor(id, user) + + // Close the current modal for the incoming user + setShowLockedModal(false) + }, [id, updateDocumentEditor, user]) + + useEffect(() => { + const interval = setInterval(() => { + checkLockStatus() + }, 10000) // 10 seconds + + return () => clearInterval(interval) + }, [checkLockStatus]) + + // Handle modal display logic based on lock state useEffect(() => { - if (id && collectionSlug && !hasLocked.current) { - void lockDocument(id) - hasLocked.current = true + if (isDocumentLocked && initialEditor && initialEditor.id !== user.id) { + // Show the DocumentLocked modal for the incoming user + setShowLockedModal(true) + } else { + setShowLockedModal(false) } + }, [isDocumentLocked, initialEditor, user.id]) - return () => { - if (id && collectionSlug && hasLocked.current) { - void unlockDocument(id) - hasLocked.current = false - } + useEffect(() => { + if (documentLockStateRef.current && documentLockStateRef.current.user.id !== user.id) { + setIsLockedByAnotherUser(true) + } else { + setIsLockedByAnotherUser(false) + } + }, [user.id]) + + useEffect(() => { + if (isLockedByAnotherUser && isDocumentLocked) { + // The current user was the lock owner but is no longer + setShowTakeOverModal(true) + } else { + setShowTakeOverModal(false) } - }, [id, collectionSlug, lockDocument, unlockDocument]) + }, [isLockedByAnotherUser, isDocumentLocked]) + + const handleGoBack = useCallback(() => { + const redirectRoute = formatAdminURL({ + adminRoute, + path: collectionSlug ? `/collections/${collectionSlug}` : `/globals/${globalSlug}`, + }) + router.push(redirectRoute) + }, [adminRoute, collectionSlug, globalSlug, router]) const onSave = useCallback( (json) => { @@ -186,7 +253,14 @@ export const DefaultEditView: React.FC = () => { const onChange: FormProps['onChange'][0] = useCallback( async ({ formState: prevFormState }) => { const docPreferences = await getDocPreferences() - return getFormState({ + + // Lock the document if it's not locked by another user + if (id && !isLockedByAnotherUser && !isDocumentLockedRef.current) { + setShouldLockDocument(true) + } + + // Fire the request immediately with returnLockStatus: true if the document is locked + const { lockedState, state } = await getFormState({ apiRoute, body: { id, @@ -195,14 +269,62 @@ export const DefaultEditView: React.FC = () => { formState: prevFormState, globalSlug, operation, + returnLockStatus: shouldCheckLockStatus, schemaPath, }, serverURL, }) + + if ( + lockedState && + (!documentLockStateRef.current || + lockedState.user.id !== documentLockStateRef.current.user.id) + ) { + documentLockStateRef.current = lockedState + } + + return state }, - [apiRoute, collectionSlug, schemaPath, getDocPreferences, globalSlug, id, operation, serverURL], + [ + apiRoute, + collectionSlug, + schemaPath, + getDocPreferences, + globalSlug, + id, + operation, + serverURL, + isLockedByAnotherUser, + shouldCheckLockStatus, + ], ) + useEffect(() => { + if (id && shouldLockDocument && !isDocumentLockedRef.current) { + const lockDoc = async () => { + try { + await lockDocument(id, user) + isDocumentLockedRef.current = true + } catch (error) { + console.error('Failed to lock the document', error) + } finally { + setShouldLockDocument(false) + } + } + + void lockDoc() + } + }, [shouldLockDocument, lockDocument, id, user]) + + useEffect(() => { + return () => { + if (id) { + void unlockDocument(id) + isDocumentLockedRef.current = false + } + } + }, [id, unlockDocument]) + return (
@@ -210,7 +332,7 @@ export const DefaultEditView: React.FC = () => { action={action} className={`${baseClass}__form`} disableValidationOnSubmit={!validateBeforeSubmit} - disabled={isInitializing || !hasSavePermission} + disabled={isReadOnlyForIncomingUser || isInitializing || !hasSavePermission} initialState={!isInitializing && initialState} isInitializing={isInitializing} method={id ? 'PATCH' : 'POST'} @@ -218,7 +340,24 @@ export const DefaultEditView: React.FC = () => { onSuccess={onSave} > {BeforeDocument} - {preventLeaveWithoutSaving && } + {showLockedModal && ( + setIsReadOnlyForIncomingUser(true)} + onTakeOver={handleTakeOver} + user={initialEditor} + /> + )} + {showTakeOverModal && ( + setIsReadOnlyForIncomingUser(true)} + /> + )} + {!isReadOnlyForIncomingUser && preventLeaveWithoutSaving && } { } docPermissions={docPermissions} fields={(collectionConfig || globalConfig)?.fields} - readOnly={!hasSavePermission} + readOnly={isReadOnlyForIncomingUser || !hasSavePermission} schemaPath={schemaPath} /> {AfterDocument} diff --git a/packages/next/src/views/List/index.tsx b/packages/next/src/views/List/index.tsx index e80c2a9a364..3b48a9d3657 100644 --- a/packages/next/src/views/List/index.tsx +++ b/packages/next/src/views/List/index.tsx @@ -111,6 +111,7 @@ export const ListView: React.FC = async ({ depth: 0, draft: true, fallbackLocale: null, + includeLockStatus: true, limit, locale, overrideAccess: false, diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 5663ab320d3..5337be980ad 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -520,6 +520,7 @@ export type AuthCollection = { } export type TypeWithID = { + docId?: any id: number | string } diff --git a/packages/payload/src/collections/operations/find.ts b/packages/payload/src/collections/operations/find.ts index 294c1b7b149..ae0f3423e5c 100644 --- a/packages/payload/src/collections/operations/find.ts +++ b/packages/payload/src/collections/operations/find.ts @@ -20,6 +20,7 @@ export type Arguments = { depth?: number disableErrors?: boolean draft?: boolean + includeLockStatus?: boolean limit?: number overrideAccess?: boolean page?: number @@ -60,6 +61,7 @@ export const findOperation = async ( depth, disableErrors, draft: draftsEnabled, + includeLockStatus, limit, overrideAccess, page, @@ -150,6 +152,27 @@ export const findOperation = async ( }) } + if (includeLockStatus) { + const lockStatuses = await payload.db.find({ + collection: 'payload-locks', + limit: sanitizedLimit, + pagination: false, + req, + where: { + docId: { + in: result.docs.map((doc) => doc.id), + }, + }, + }) + + const lockedDocIds = new Set(lockStatuses.docs.map((lockDoc) => lockDoc.docId)) + + result.docs = result.docs.map((doc) => ({ + ...doc, + isLocked: lockedDocIds.has(doc.id), + })) + } + // ///////////////////////////////////// // beforeRead - Collection // ///////////////////////////////////// diff --git a/packages/payload/src/collections/operations/findByID.ts b/packages/payload/src/collections/operations/findByID.ts index 98ec17f6f49..8b48992ab91 100644 --- a/packages/payload/src/collections/operations/findByID.ts +++ b/packages/payload/src/collections/operations/findByID.ts @@ -18,6 +18,7 @@ export type Arguments = { disableErrors?: boolean draft?: boolean id: number | string + includeLockStatus?: boolean overrideAccess?: boolean req: PayloadRequest showHiddenFields?: boolean @@ -53,6 +54,7 @@ export const findByIDOperation = async ( depth, disableErrors, draft: draftEnabled = false, + includeLockStatus, overrideAccess = false, req: { fallbackLocale, locale, t }, req, @@ -95,6 +97,27 @@ export const findByIDOperation = async ( return null } + if (includeLockStatus) { + const lockStatus = await req.payload.db.findOne({ + collection: 'payload-locks', + req, + where: { + docId: { + equals: id, + }, + }, + }) + + result.isLocked = lockStatus ? true : false + if (lockStatus) { + result.lockStatus = { + isLocked: true, + } + } else { + result.lockStatus = { isLocked: false } + } + } + // ///////////////////////////////////// // Replace document with draft if available // ///////////////////////////////////// diff --git a/packages/payload/src/collections/operations/local/find.ts b/packages/payload/src/collections/operations/local/find.ts index 1563a7e4430..5b0f599a1c6 100644 --- a/packages/payload/src/collections/operations/local/find.ts +++ b/packages/payload/src/collections/operations/local/find.ts @@ -18,6 +18,7 @@ export type Options = { disableErrors?: boolean draft?: boolean fallbackLocale?: TypedLocale + includeLockStatus?: boolean limit?: number locale?: 'all' | TypedLocale overrideAccess?: boolean @@ -40,6 +41,7 @@ export async function findLocal( depth, disableErrors, draft = false, + includeLockStatus, limit, overrideAccess = true, page, @@ -63,6 +65,7 @@ export async function findLocal( depth, disableErrors, draft, + includeLockStatus, limit, overrideAccess, page, diff --git a/packages/payload/src/collections/operations/local/findByID.ts b/packages/payload/src/collections/operations/local/findByID.ts index 362fb40f8b2..fc949198555 100644 --- a/packages/payload/src/collections/operations/local/findByID.ts +++ b/packages/payload/src/collections/operations/local/findByID.ts @@ -18,6 +18,7 @@ export type Options = { draft?: boolean fallbackLocale?: TypedLocale id: number | string + includeLockStatus?: boolean locale?: 'all' | TypedLocale overrideAccess?: boolean req?: PayloadRequest @@ -36,6 +37,7 @@ export default async function findByIDLocal( depth, disableErrors = false, draft = false, + includeLockStatus, overrideAccess = true, showHiddenFields, } = options @@ -55,6 +57,7 @@ export default async function findByIDLocal( depth, disableErrors, draft, + includeLockStatus, overrideAccess, req: await createLocalReq(options, payload), showHiddenFields, diff --git a/packages/payload/src/locks/locksCollection.ts b/packages/payload/src/locks/locksCollection.ts index a325bebfa0e..ad8aadd6bdd 100644 --- a/packages/payload/src/locks/locksCollection.ts +++ b/packages/payload/src/locks/locksCollection.ts @@ -1,18 +1,8 @@ import type { CollectionConfig } from '../collections/config/types.js' import type { Access, Config } from '../config/types.js' -const lockAccess: Access = ({ req }) => ({ - 'user.value': { - equals: req?.user?.id, - }, -}) - export const getLocksCollection = (config: Config): CollectionConfig => ({ slug: 'payload-locks', - // access: { - // delete: lockAccess, - // read: lockAccess, - // }, // admin: { // hidden: true, // }, @@ -52,5 +42,10 @@ export const getLocksCollection = (config: Config): CollectionConfig => ({ }, ], }, + { + name: 'isLocked', + type: 'checkbox', + defaultValue: false, + }, ], }) diff --git a/packages/ui/src/elements/SelectRow/index.tsx b/packages/ui/src/elements/SelectRow/index.tsx index e38bb49d8ea..e4fe087b6b6 100644 --- a/packages/ui/src/elements/SelectRow/index.tsx +++ b/packages/ui/src/elements/SelectRow/index.tsx @@ -1,5 +1,4 @@ 'use client' -import { useDocumentLockStatus } from '@payloadcms/ui' import React from 'react' import { useTableCell } from '../../elements/Table/TableCellProvider/index.js' @@ -13,9 +12,8 @@ const baseClass = 'select-row' export const SelectRow: React.FC = () => { const { selected, setSelection } = useSelection() const { rowData } = useTableCell() - const isLocked = useDocumentLockStatus(rowData?.id) - if (isLocked) { + if (rowData?.isLocked) { return } diff --git a/packages/ui/src/exports/client/index.ts b/packages/ui/src/exports/client/index.ts index 2aa2e66b406..3304c07b455 100644 --- a/packages/ui/src/exports/client/index.ts +++ b/packages/ui/src/exports/client/index.ts @@ -188,7 +188,6 @@ export { RenderComponent } from '../../providers/Config/RenderComponent.js' export { ConfigProvider, useConfig } from '../../providers/Config/index.js' export { DocumentEventsProvider, useDocumentEvents } from '../../providers/DocumentEvents/index.js' export { DocumentInfoProvider, useDocumentInfo } from '../../providers/DocumentInfo/index.js' -export { DocumentLockProvider, useDocumentLock } from '../../providers/DocumentLock/index.js' export type { DocumentInfoContext, DocumentInfoProps } from '../../providers/DocumentInfo/index.js' export { EditDepthProvider, useEditDepth } from '../../providers/EditDepth/index.js' diff --git a/packages/ui/src/forms/Form/index.tsx b/packages/ui/src/forms/Form/index.tsx index 2cbb2a3ad84..b2f482a6e4a 100644 --- a/packages/ui/src/forms/Form/index.tsx +++ b/packages/ui/src/forms/Form/index.tsx @@ -445,7 +445,7 @@ export const Form: React.FC = (props) => { const reset = useCallback( async (data: unknown) => { - const newState = await getFormState({ + const { state: newState } = await getFormState({ apiRoute, body: { id, @@ -476,7 +476,7 @@ export const Form: React.FC = (props) => { const getFieldStateBySchemaPath = useCallback( async ({ data, schemaPath }) => { - const fieldSchema = await getFormState({ + const { state: fieldSchema } = await getFormState({ apiRoute, body: { collectionSlug, diff --git a/packages/ui/src/forms/RenderFields/RenderField.tsx b/packages/ui/src/forms/RenderFields/RenderField.tsx index c037ca50da2..1bc547c2ca0 100644 --- a/packages/ui/src/forms/RenderFields/RenderField.tsx +++ b/packages/ui/src/forms/RenderFields/RenderField.tsx @@ -53,12 +53,14 @@ export const RenderField: React.FC = ({ return null } + // Combine readOnlyFromContext with the readOnly prop passed down from RenderFields + const isReadOnly = fieldComponentProps.readOnly ?? readOnlyFromContext + // `admin.readOnly` displays the value but prevents the field from being edited fieldComponentProps.readOnly = fieldComponentProps?.field?.admin?.readOnly // if parent field is `readOnly: true`, but this field is `readOnly: false`, the field should still be editable - if (readOnlyFromContext && fieldComponentProps.readOnly !== false) - fieldComponentProps.readOnly = true + if (isReadOnly && fieldComponentProps.readOnly !== false) fieldComponentProps.readOnly = true // if the user does not have access control to begin with, force it to be read-only if (permissions?.[operation]?.permission === false) { diff --git a/packages/ui/src/forms/RenderFields/index.tsx b/packages/ui/src/forms/RenderFields/index.tsx index 47703b492ba..8988446ccd7 100644 --- a/packages/ui/src/forms/RenderFields/index.tsx +++ b/packages/ui/src/forms/RenderFields/index.tsx @@ -13,8 +13,17 @@ const baseClass = 'render-fields' export { Props } export const RenderFields: React.FC = (props) => { - const { className, fields, forceRender, indexPath, margins, path, permissions, schemaPath } = - props + const { + className, + fields, + forceRender, + indexPath, + margins, + path, + permissions, + readOnly, + schemaPath, + } = props const { i18n } = useTranslation() const [hasRendered, setHasRendered] = React.useState(Boolean(forceRender)) @@ -65,7 +74,7 @@ export const RenderFields: React.FC = (props) => { return ( { - const [isLocked, setIsLocked] = useState(false) - const { config } = useConfig() - - useEffect(() => { - const checkLockStatus = async () => { - try { - const request = await requests.get( - `${config.serverURL}${config.routes.api}/payload-locks?where[docId][equals]=${docId}`, - ) - - const { docs } = await request.json() - - if (docs.length > 0) { - setIsLocked(true) - } else { - setIsLocked(false) - } - } catch (error) { - console.error('Failed to check the lock status of the document', error) - setIsLocked(false) - } - } - - if (docId) { - void checkLockStatus() - } - }, [docId, config.serverURL, config.routes.api]) - - return isLocked -} diff --git a/packages/ui/src/providers/DocumentInfo/index.tsx b/packages/ui/src/providers/DocumentInfo/index.tsx index 6199832bb86..3f99b41f3da 100644 --- a/packages/ui/src/providers/DocumentInfo/index.tsx +++ b/packages/ui/src/providers/DocumentInfo/index.tsx @@ -1,5 +1,6 @@ 'use client' import type { + ClientUser, Data, DocumentPermissions, DocumentPreferences, @@ -18,6 +19,7 @@ import React, { createContext, useCallback, useContext, useEffect, useRef, useSt import type { DocumentInfoContext, DocumentInfoProps } from './types.js' +import { requests } from '../../utilities/api.js' import { formatDocTitle } from '../../utilities/formatDocTitle.js' import { getFormState } from '../../utilities/getFormState.js' import { hasSavePermission as getHasSavePermission } from '../../utilities/hasSavePermission.js' @@ -95,6 +97,12 @@ const DocumentInfo: React.FC< const [hasPublishPermission, setHasPublishPermission] = useState( hasPublishPermissionFromProps, ) + + const [isDocumentLocked, setIsDocumentLocked] = useState(false) + const [initialEditor, setInitialEditor] = useState(null) + const [lastEditedAt, setLastEditedAt] = useState(null) + const lockInProgress = useRef(false) + const isInitializing = initialState === undefined || data === undefined const [unpublishedVersions, setUnpublishedVersions] = useState>>(null) @@ -107,6 +115,8 @@ const DocumentInfo: React.FC< // Separate locale cache used for handling permissions const prevLocalePermissions = useRef(locale) + const [shouldCheckLockStatus, setShouldCheckLockStatus] = useState(false) + const versionsConfig = docConfig?.versions const baseURL = `${serverURL}${api}` @@ -133,6 +143,150 @@ const DocumentInfo: React.FC< const operation = isEditing ? 'update' : 'create' const shouldFetchVersions = Boolean(versionsConfig && docPermissions?.readVersions?.permission) + const lockDocument = useCallback( + async (docId: number | string, user: ClientUser) => { + if (lockInProgress.current) return + lockInProgress.current = true + + try { + const request = await requests.get( + `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, + ) + const { docs } = await request.json() + + if (docs.length > 0) { + // Document is already locked, update the state to reflect this + setIsDocumentLocked(true) + return + } + + await requests.post(`${serverURL}${api}/payload-locks`, { + body: JSON.stringify({ + _lastEdited: { + editedAt: new Date(), + user: { relationTo: user?.collection, value: user }, + }, + docId, + isLocked: true, + }), + headers: { + 'Content-Type': 'application/json', + }, + }) + + setIsDocumentLocked(true) + } catch (error) { + if (error.response?.status === 409) { + setIsDocumentLocked(true) + } else { + console.error('Failed to lock the document', error) + } + } finally { + lockInProgress.current = false + } + }, + [serverURL, api], + ) + + const unlockDocument = useCallback( + async (docId: number | string) => { + if (!isDocumentLocked) { + return + } + + try { + const request = await requests.get( + `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, + ) + + const { docs } = await request.json() + + if (docs.length > 0) { + const lockId = docs[0].id + await requests.delete(`${serverURL}${api}/payload-locks/${lockId}`, { + headers: { + 'Content-Type': 'application/json', + }, + }) + setIsDocumentLocked(false) + } + } catch (error) { + console.error('Failed to unlock the document', error) + } + }, + [serverURL, api, isDocumentLocked], + ) + + const updateDocumentEditor = useCallback( + async (docId: number | string, user: ClientUser) => { + if (!isDocumentLocked) { + return + } + + try { + // Check if the document is already locked + const request = await requests.get( + `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, + ) + + const { docs } = await request.json() + + if (docs.length > 0) { + const lockId = docs[0].id + + // Send a patch request to update the _lastEdited info + await requests.patch(`${serverURL}${api}/payload-locks/${lockId}`, { + body: JSON.stringify({ + _lastEdited: { + editedAt: new Date(), + user: { relationTo: user?.collection, value: user?.id }, + }, + }), + headers: { + 'Content-Type': 'application/json', + }, + }) + + setLastEditedAt(new Date()) + } + } catch (error) { + console.error('Failed to update the document editor', error) + } + }, + [serverURL, api, isDocumentLocked], + ) + + const checkLockStatus = useCallback(() => { + if (isDocumentLocked) { + setShouldCheckLockStatus(true) + } else { + setShouldCheckLockStatus(false) + } + }, [isDocumentLocked]) + + useEffect(() => { + const fetchLockState = async () => { + if (id) { + try { + const request = await requests.get( + `${serverURL}${api}/payload-locks?where[docId][equals]=${id}`, + ) + const { docs } = await request.json() + + if (docs.length > 0) { + setIsDocumentLocked(true) + setLastEditedAt(new Date(docs[0]._lastEdited.editedAt)) + setInitialEditor(docs[0]._lastEdited.user.value) + } + } catch (error) { + console.error('Failed to fetch lock state', error) + } + } + } + + void fetchLockState() + }, [id, serverURL, api]) + const getVersions = useCallback(async () => { let versionFetchURL let publishedFetchURL @@ -377,7 +531,7 @@ const DocumentInfo: React.FC< const newData = collectionSlug ? json.doc : json.result - const newState = await getFormState({ + const { state: newState } = await getFormState({ apiRoute: api, body: { id, @@ -394,6 +548,7 @@ const DocumentInfo: React.FC< setInitialState(newState) setData(newData) + await getDocPermissions(newData) }, [ @@ -426,7 +581,7 @@ const DocumentInfo: React.FC< setIsLoading(true) try { - const result = await getFormState({ + const { state: result } = await getFormState({ apiRoute: api, body: { id, @@ -546,6 +701,7 @@ const DocumentInfo: React.FC< const value: DocumentInfoContext = { ...props, action, + checkLockStatus, docConfig, docPermissions, getDocPermissions, @@ -554,16 +710,23 @@ const DocumentInfo: React.FC< hasPublishPermission, hasSavePermission, initialData: data, + initialEditor, initialState, + isDocumentLocked, isInitializing, isLoading, + lastEditedAt, + lockDocument, onSave, preferencesKey, publishedDoc, setDocFieldPreferences, setDocumentTitle, + shouldCheckLockStatus, title: documentTitle, + unlockDocument, unpublishedVersions, + updateDocumentEditor, versions, } diff --git a/packages/ui/src/providers/DocumentInfo/types.ts b/packages/ui/src/providers/DocumentInfo/types.ts index c5b1e794954..94bea70f16f 100644 --- a/packages/ui/src/providers/DocumentInfo/types.ts +++ b/packages/ui/src/providers/DocumentInfo/types.ts @@ -1,6 +1,7 @@ import type { ClientCollectionConfig, ClientGlobalConfig, + ClientUser, Data, DocumentPermissions, DocumentPreferences, @@ -38,14 +39,19 @@ export type DocumentInfoProps = { } export type DocumentInfoContext = { + checkLockStatus: () => void docConfig?: ClientCollectionConfig | ClientGlobalConfig getDocPermissions: (data?: Data) => Promise getDocPreferences: () => Promise getVersions: () => Promise initialData: Data + initialEditor: ClientUser initialState?: FormState + isDocumentLocked: boolean isInitializing: boolean isLoading: boolean + lastEditedAt: Date + lockDocument: (docId: number | string, user: ClientUser) => Promise preferencesKey?: string publishedDoc?: { _status?: string } & TypeWithID & TypeWithTimestamps setDocFieldPreferences: ( @@ -53,9 +59,12 @@ export type DocumentInfoContext = { fieldPreferences: { [key: string]: unknown } & Partial, ) => void setDocumentTitle: (title: string) => void + shouldCheckLockStatus?: boolean slug?: string title: string + unlockDocument: (docId: number | string) => Promise unpublishedVersions?: PaginatedDocs> + updateDocumentEditor: (docId: number | string, user: ClientUser) => Promise versions?: PaginatedDocs> versionsCount?: PaginatedDocs> } & DocumentInfoProps diff --git a/packages/ui/src/providers/DocumentLock/index.tsx b/packages/ui/src/providers/DocumentLock/index.tsx deleted file mode 100644 index 4495d145423..00000000000 --- a/packages/ui/src/providers/DocumentLock/index.tsx +++ /dev/null @@ -1,113 +0,0 @@ -'use client' -import React, { createContext, useCallback, useContext, useRef, useState } from 'react' - -import { requests } from '../../utilities/api.js' -import { useAuth } from '../Auth/index.js' -import { useConfig } from '../Config/index.js' - -type DocumentLockContextType = { - lockDocument: (docId: number | string) => Promise - unlockDocument: (docId: number | string) => Promise -} - -const DocumentLockContext = createContext(undefined) - -export const DocumentLockProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) => { - const { config } = useConfig() - const { user } = useAuth() - const [isLocked, setIsLocked] = useState(false) - const lockInProgress = useRef(false) - - const { - routes: { api }, - serverURL, - } = config - - const lockDocument = useCallback( - async (docId: number | string) => { - if (lockInProgress.current) { - console.log('Lock already in progress, skipping:', docId) - return - } - - lockInProgress.current = true - - console.log('Attempting to lock document:', docId) - - try { - const request = await requests.get( - `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, - ) - - const { docs } = await request.json() - - if (docs.length === 0) { - await requests.post(`${serverURL}${api}/payload-locks`, { - body: JSON.stringify({ - _lastEdited: { - editedAt: new Date(), - user: { relationTo: user?.collection, value: user?.id }, - }, - docId, - }), - headers: { - 'Content-Type': 'application/json', - }, - }) - setIsLocked(true) - console.log('Document locked') - } else { - console.log('Document already locked by this user') - setIsLocked(true) - } - } catch (error) { - console.error('Failed to lock the document', error) - } finally { - lockInProgress.current = false - } - }, - [serverURL, api, user], - ) - - const unlockDocument = useCallback( - async (docId: number | string) => { - console.log('Attempting to unlock document:', docId) - if (!isLocked) { - console.log('Document is not locked, no need to unlock') - return - } - - try { - const request = await requests.get( - `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, - ) - - const { docs } = await request.json() - - if (docs.length > 0) { - const lockId = docs[0].id - await requests.delete(`${serverURL}${api}/payload-locks/${lockId}`, { - headers: { - 'Content-Type': 'application/json', - }, - }) - setIsLocked(false) - console.log('Document unlocked') - } else { - console.log('No lock found for this user, skipping unlock') - } - } catch (error) { - console.error('Failed to unlock the document', error) - } - }, - [serverURL, api, isLocked], - ) - - return ( - - {children} - - ) -} - -export const useDocumentLock = (): DocumentLockContextType => useContext(DocumentLockContext) diff --git a/packages/ui/src/providers/Root/index.tsx b/packages/ui/src/providers/Root/index.tsx index 195dd545d47..4c6dce7ce2f 100644 --- a/packages/ui/src/providers/Root/index.tsx +++ b/packages/ui/src/providers/Root/index.tsx @@ -19,7 +19,6 @@ import { AuthProvider } from '../Auth/index.js' import { ClientFunctionProvider } from '../ClientFunction/index.js' import { ConfigProvider } from '../Config/index.js' import { DocumentEventsProvider } from '../DocumentEvents/index.js' -import { DocumentLockProvider } from '../DocumentLock/index.js' import { FieldComponentsProvider } from '../FieldComponents/index.js' import { LocaleProvider } from '../Locale/index.js' import { ParamsProvider } from '../Params/index.js' @@ -86,25 +85,23 @@ export const RootProvider: React.FC = ({ - - - - - - - - - - {children} - - - - - - - - - + + + + + + + + + {children} + + + + + + + + diff --git a/packages/ui/src/utilities/buildFormState.ts b/packages/ui/src/utilities/buildFormState.ts index 54ec026c903..99f1cedec65 100644 --- a/packages/ui/src/utilities/buildFormState.ts +++ b/packages/ui/src/utilities/buildFormState.ts @@ -1,4 +1,11 @@ -import type { DocumentPreferences, Field, FormState, PayloadRequest, TypeWithID } from 'payload' +import type { + ClientUser, + DocumentPreferences, + Field, + FormState, + PayloadRequest, + TypeWithID, +} from 'payload' import { reduceFieldsToValues } from 'payload/shared' @@ -27,9 +34,14 @@ export const getFieldSchemaMap = (req: PayloadRequest): FieldSchemaMap => { return cached } -export const buildFormState = async ({ req }: { req: PayloadRequest }): Promise => { +export const buildFormState = async ({ + req, +}: { + req: PayloadRequest +}): Promise<{ lockedState?: { isLocked: boolean; user: ClientUser }; state: FormState }> => { const reqData: BuildFormStateArgs = (req.data || {}) as BuildFormStateArgs - const { collectionSlug, formState, globalSlug, locale, operation, schemaPath } = reqData + const { collectionSlug, formState, globalSlug, locale, operation, returnLockStatus, schemaPath } = + reqData const incomingUserSlug = req.user?.collection const adminUserSlug = req.payload.config.admin.user @@ -203,5 +215,25 @@ export const buildFormState = async ({ req }: { req: PayloadRequest }): Promise< } } - return result + if (returnLockStatus) { + const lockStatus = await req.payload.find({ + collection: 'payload-locks', + where: { + docId: { equals: id }, + }, + }) + + if (lockStatus.docs.length > 0) { + const lockedState = { + isLocked: true, + user: lockStatus.docs[0]?._lastEdited?.user.value, + } + + console.log('Building form state:', { lockedState, result }) + + return { lockedState, state: result } + } + } + + return { state: result } } diff --git a/packages/ui/src/utilities/getFormState.ts b/packages/ui/src/utilities/getFormState.ts index 8adb42a343c..9da98200f24 100644 --- a/packages/ui/src/utilities/getFormState.ts +++ b/packages/ui/src/utilities/getFormState.ts @@ -1,4 +1,4 @@ -import type { FormState, SanitizedConfig } from 'payload' +import type { ClientUser, FormState, SanitizedConfig } from 'payload' import type { BuildFormStateArgs } from '../forms/buildStateFromSchema/index.js' @@ -9,7 +9,7 @@ export const getFormState = async (args: { serverURL: SanitizedConfig['serverURL'] signal?: AbortSignal token?: string -}): Promise => { +}): Promise<{ lockedState?: { isLocked: boolean; user: ClientUser }; state: FormState }> => { const { apiRoute, body, onError, serverURL, signal, token } = args const res = await fetch(`${serverURL}${apiRoute}/form-state`, { @@ -23,7 +23,10 @@ export const getFormState = async (args: { signal, }) - const json = (await res.json()) as FormState + const json = (await res.json()) as { + lockedState?: { isLocked: boolean; user: ClientUser } + state: FormState + } if (res.ok) { return json @@ -33,5 +36,5 @@ export const getFormState = async (args: { } } - return body?.formState + return { state: body?.formState } } diff --git a/test/_community/payload-types.ts b/test/_community/payload-types.ts index d1c4db30bff..b2a7975c70a 100644 --- a/test/_community/payload-types.ts +++ b/test/_community/payload-types.ts @@ -15,6 +15,7 @@ export interface Config { simple: Simple; users: User; 'payload-preferences': PayloadPreference; + 'payload-locks': PayloadLock; 'payload-migrations': PayloadMigration; }; db: { @@ -32,7 +33,6 @@ export interface Config { export interface UserAuthOperations { forgotPassword: { email: string; - password: string; }; login: { email: string; @@ -44,7 +44,6 @@ export interface UserAuthOperations { }; unlock: { email: string; - password: string; }; } /** @@ -139,6 +138,24 @@ export interface PayloadPreference { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-locks". + */ +export interface PayloadLock { + id: string; + docId?: string | null; + _lastEdited: { + user: { + relationTo: 'users'; + value: string | User; + }; + editedAt?: string | null; + }; + isLocked?: boolean | null; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-migrations". diff --git a/test/buildConfigWithDefaults.ts b/test/buildConfigWithDefaults.ts index 6b6b8ee99ec..a5f77437004 100644 --- a/test/buildConfigWithDefaults.ts +++ b/test/buildConfigWithDefaults.ts @@ -158,9 +158,7 @@ export async function buildConfigWithDefaults( config.admin.autoLogin = process.env.PAYLOAD_PUBLIC_DISABLE_AUTO_LOGIN === 'true' || options?.disableAutoLogin ? false - : { - email: 'dev@payloadcms.com', - } + : false } if (process.env.PAYLOAD_DISABLE_ADMIN === 'true') { From a3c9278fc5575fbf4ed1971a40ff56e027f249ec Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 22 Aug 2024 14:53:27 -0400 Subject: [PATCH 040/173] supports join cells --- .../DefaultCell/fields/Relationship/index.tsx | 27 +++++++++++++++---- .../Table/DefaultCell/fields/index.tsx | 1 + 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx b/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx index 44967e7df1f..c066eb1e9f8 100644 --- a/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx +++ b/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx @@ -1,8 +1,13 @@ 'use client' -import type { DefaultCellComponentProps, RelationshipFieldClient, UploadFieldClient } from 'payload' +import type { + DefaultCellComponentProps, + JoinFieldClient, + RelationshipFieldClient, + UploadFieldClient, +} from 'payload' import { getTranslation } from '@payloadcms/translations' -import React, { useEffect, useState } from 'react' +import React, { useEffect, useMemo, useState } from 'react' import { useIntersect } from '../../../../../hooks/useIntersect.js' import { useConfig } from '../../../../../providers/Config/index.js' @@ -18,14 +23,26 @@ const baseClass = 'relationship-cell' const totalToShow = 3 export interface RelationshipCellProps - extends DefaultCellComponentProps {} + extends DefaultCellComponentProps< + any, + JoinFieldClient | RelationshipFieldClient | UploadFieldClient + > {} export const RelationshipCell: React.FC = ({ - cellData, + cellData: cellDataFromProps, customCellContext, field, - field: { label, relationTo }, + field: { label }, }) => { + // conditionally extract relationTo both both relationship and join fields + const relationTo = + ('relationTo' in field && field.relationTo) || ('collection' in field && field.collection) + + // conditionally extract docs from join fields + const cellData = useMemo(() => { + return 'collection' in field ? cellDataFromProps?.docs : cellDataFromProps + }, [cellDataFromProps, field]) + const { config } = useConfig() const { collections, routes } = config const [intersectionRef, entry] = useIntersect() diff --git a/packages/ui/src/elements/Table/DefaultCell/fields/index.tsx b/packages/ui/src/elements/Table/DefaultCell/fields/index.tsx index e94af04dc18..e17b1a2dee5 100644 --- a/packages/ui/src/elements/Table/DefaultCell/fields/index.tsx +++ b/packages/ui/src/elements/Table/DefaultCell/fields/index.tsx @@ -17,6 +17,7 @@ export const cellComponents = { checkbox: CheckboxCell, code: CodeCell, date: DateCell, + join: RelationshipCell, json: JSONCell, radio: SelectCell, relationship: RelationshipCell, From 741f30a85f437040ebc078ea34b2ef28354900b3 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 22 Aug 2024 15:15:48 -0400 Subject: [PATCH 041/173] sets proper depth param --- .../src/elements/RelationshipTable/index.tsx | 22 ++++++++++++++----- packages/ui/src/fields/Join/index.tsx | 1 + 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 3fb8df6cbaf..b649e0d8dad 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -1,5 +1,11 @@ 'use client' -import type { ClientCollectionConfig, ClientField, PaginatedDocs, Where } from 'payload' +import type { + ClientCollectionConfig, + ClientField, + JoinFieldProps, + PaginatedDocs, + Where, +} from 'payload' import { getTranslation } from '@payloadcms/translations' import React, { useEffect, useReducer, useState } from 'react' @@ -23,15 +29,13 @@ const baseClass = 'relationship-table' type RelationshipTableComponentProps = { readonly Label?: React.ReactNode - readonly field: ClientField + readonly field: JoinFieldProps['field'] readonly initialData?: PaginatedDocs readonly relationTo: string } const filterOptions: Where = {} -const defaultLimit = 5 - export const RelationshipTable: React.FC = (props) => { const { Label, field, initialData, relationTo } = props @@ -45,7 +49,7 @@ export const RelationshipTable: React.FC = (pro const { i18n } = useTranslation() - const [limit, setLimit] = useState(defaultLimit) + const [limit, setLimit] = useState() const [sort, setSort] = useState(undefined) const [page, setPage] = useState(1) const [where, setWhere] = useState(null) @@ -59,6 +63,9 @@ export const RelationshipTable: React.FC = (pro const [{ data, isError, isLoading: isLoadingList }, { setParams }] = usePayloadAPI(apiURL, { initialData, + initialParams: { + depth: 0, + }, }) useEffect(() => { @@ -69,13 +76,16 @@ export const RelationshipTable: React.FC = (pro const params: { cacheBust?: number + depth?: number draft?: string limit?: number page?: number search?: string sort?: string where?: unknown - } = {} + } = { + depth: 0, + } let copyOfWhere = { ...(where || {}) } diff --git a/packages/ui/src/fields/Join/index.tsx b/packages/ui/src/fields/Join/index.tsx index e3188480a2c..87c2bbe97bc 100644 --- a/packages/ui/src/fields/Join/index.tsx +++ b/packages/ui/src/fields/Join/index.tsx @@ -38,6 +38,7 @@ const JoinFieldComponent: React.FC = (props) => { } + field={field} initialData={value} relationTo={collection} /> From 457dac61c0d42dc8511da2b8e798560535e631fe Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 22 Aug 2024 15:52:20 -0400 Subject: [PATCH 042/173] adds compact appearance to table --- .../elements/RelationshipTable/MyTable.tsx | 1 + .../src/elements/RelationshipTable/index.scss | 1 + .../src/elements/RelationshipTable/index.tsx | 1 + packages/ui/src/elements/Table/index.scss | 46 +++++++++++++++++++ packages/ui/src/elements/Table/index.tsx | 14 +++++- test/joins/config.ts | 12 +++-- 6 files changed, 68 insertions(+), 7 deletions(-) diff --git a/packages/ui/src/elements/RelationshipTable/MyTable.tsx b/packages/ui/src/elements/RelationshipTable/MyTable.tsx index bfadeca4d9d..1e524474059 100644 --- a/packages/ui/src/elements/RelationshipTable/MyTable.tsx +++ b/packages/ui/src/elements/RelationshipTable/MyTable.tsx @@ -20,6 +20,7 @@ export const MyTableComponent: React.FC = ({ return (
= (pro }, }, } as ClientField, + link: false, }, ]} collectionSlug={relationTo} diff --git a/packages/ui/src/elements/Table/index.scss b/packages/ui/src/elements/Table/index.scss index b5db66db433..fce01eac105 100644 --- a/packages/ui/src/elements/Table/index.scss +++ b/packages/ui/src/elements/Table/index.scss @@ -49,6 +49,52 @@ outline-offset: var(--accessibility-outline-offset); } + &--appearance-compact { + thead { + th:first-child { + border-top-left-radius: $style-radius-s; + } + + th:last-child { + border-top-right-radius: $style-radius-s; + } + + background: var(--theme-elevation-50); + } + + tbody { + tr { + &:nth-child(odd) { + background: transparent; + border-radius: 0; + } + } + } + + th, + td { + padding: base(0.3) base(0.3); + + &:first-child { + padding-inline-start: base(0.6); + } + + &:last-child { + padding-inline-end: base(0.6); + } + } + + th { + padding: base(0.2) base(0.3); + } + + tr td, + th { + border: 1px solid var(--theme-elevation-100); + border-collapse: collapse; + } + } + @include mid-break { th, td { diff --git a/packages/ui/src/elements/Table/index.tsx b/packages/ui/src/elements/Table/index.tsx index f58cba3a580..b879ea2d41a 100644 --- a/packages/ui/src/elements/Table/index.tsx +++ b/packages/ui/src/elements/Table/index.tsx @@ -22,13 +22,19 @@ export type Column = { } export type Props = { + readonly appearance?: 'compact' | 'default' readonly columns?: Column[] readonly customCellContext?: Record readonly data: Record[] readonly fields: ClientField[] } -export const Table: React.FC = ({ columns: columnsFromProps, customCellContext, data }) => { +export const Table: React.FC = ({ + appearance, + columns: columnsFromProps, + customCellContext, + data, +}) => { const { columns: columnsFromContext } = useTableColumns() const columns = columnsFromProps || columnsFromContext @@ -40,7 +46,11 @@ export const Table: React.FC = ({ columns: columnsFromProps, customCellCo } return ( -
+
diff --git a/test/joins/config.ts b/test/joins/config.ts index 47e7875fcac..3d72ff46dcc 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -13,7 +13,7 @@ export default buildConfigWithDefaults({ slug: 'posts', admin: { useAsTitle: 'title', - defaultColumns: ['title', 'category'], + defaultColumns: ['title', 'category', 'updatedAt', 'createdAt'], }, fields: [ { @@ -119,7 +119,7 @@ export default buildConfigWithDefaults({ }, }) - const category = await payload.create({ + await payload.create({ collection: 'categories', data: { name: 'example', @@ -127,7 +127,7 @@ export default buildConfigWithDefaults({ }, }) - const post1 = await payload.create({ + await payload.create({ collection: 'posts', data: { category: category.id, @@ -137,7 +137,8 @@ export default buildConfigWithDefaults({ title: 'test', }, }) - const post2 = await payload.create({ + + await payload.create({ collection: 'posts', data: { category: category.id, @@ -147,7 +148,8 @@ export default buildConfigWithDefaults({ title: 'test', }, }) - const post3 = await payload.create({ + + await payload.create({ collection: 'posts', data: { category: category.id, From 07d819ecddd6d26eeea88e2651739951f272fddb Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 22 Aug 2024 15:55:10 -0400 Subject: [PATCH 043/173] fixes joins test config --- test/joins/config.ts | 48 ++++++++++++++++++------------------- test/joins/payload-types.ts | 4 ++++ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/test/joins/config.ts b/test/joins/config.ts index 3d72ff46dcc..582f6061580 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -25,17 +25,17 @@ export default buildConfigWithDefaults({ type: 'relationship', relationTo: 'categories', }, - // { - // name: 'group', - // type: 'group', - // fields: [ - // { - // name: 'category', - // type: 'relationship', - // relationTo: 'categories', - // }, - // ], - // }, + { + name: 'group', + type: 'group', + fields: [ + { + name: 'category', + type: 'relationship', + relationTo: 'categories', + }, + ], + }, ], }, { @@ -54,18 +54,18 @@ export default buildConfigWithDefaults({ collection: 'posts', on: 'category', }, - // { - // name: 'group', - // type: 'group', - // fields: [ - // { - // name: 'posts', - // type: 'join', - // collection: 'posts', - // on: 'group.category', - // }, - // ], - // }, + { + name: 'group', + type: 'group', + fields: [ + { + name: 'posts', + type: 'join', + collection: 'posts', + on: 'group.category', + }, + ], + }, ], }, { @@ -119,7 +119,7 @@ export default buildConfigWithDefaults({ }, }) - await payload.create({ + const category = await payload.create({ collection: 'categories', data: { name: 'example', diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index b032d91a101..7c57f735b4b 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -54,6 +54,9 @@ export interface Post { id: string; title?: string | null; category?: (string | null) | Category; + group?: { + category?: (string | null) | Category; + }; updatedAt: string; createdAt: string; } @@ -64,6 +67,7 @@ export interface Post { export interface Category { id: string; name?: string | null; + group?: {}; updatedAt: string; createdAt: string; } From cc9c73dc95a88a61ec479f6b66b3efa85b0efc5b Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 22 Aug 2024 16:40:13 -0400 Subject: [PATCH 044/173] feat: correctly fire to form-state on a 10 second interval --- .../src/elements/DocumentTakeOver/index.tsx | 9 +- .../next/src/views/Edit/Default/index.tsx | 120 +++++++++++++----- packages/ui/src/exports/client/index.ts | 1 - .../ui/src/providers/DocumentInfo/index.tsx | 12 -- .../ui/src/providers/DocumentInfo/types.ts | 2 - 5 files changed, 89 insertions(+), 55 deletions(-) diff --git a/packages/next/src/elements/DocumentTakeOver/index.tsx b/packages/next/src/elements/DocumentTakeOver/index.tsx index d7a0206ba66..b6bd1572fcf 100644 --- a/packages/next/src/elements/DocumentTakeOver/index.tsx +++ b/packages/next/src/elements/DocumentTakeOver/index.tsx @@ -1,21 +1,18 @@ 'use client' import { Button, Modal, useModal, useTranslation } from '@payloadcms/ui' -import LinkImport from 'next/link.js' import React, { useEffect } from 'react' import './index.scss' -const Link = (LinkImport.default || LinkImport) as unknown as typeof LinkImport.default - const modalSlug = 'document-take-over' const baseClass = 'document-take-over' export const DocumentTakeOver: React.FC<{ - adminRoute: string + handleBackToDashboard: () => void isActive: boolean onReadOnly: () => void -}> = ({ adminRoute, isActive, onReadOnly }) => { +}> = ({ handleBackToDashboard, isActive, onReadOnly }) => { const { closeModal, openModal } = useModal() const { t } = useTranslation() @@ -31,7 +28,7 @@ export const DocumentTakeOver: React.FC<{

Editing taken over

-
@@ -174,6 +188,7 @@ export const RelationshipTable: React.FC = (pro ), }, }, + disableListColumn: true, }, } as ClientField, }, @@ -200,11 +215,19 @@ export const RelationshipTable: React.FC = (pro collectionSlug={relationTo} preferenceKey={preferenceKey} > + +
+ +
+
- ) From bd5234c42b1cee85ad3324d67ba4ae84a83257ac Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 22 Aug 2024 17:02:20 -0400 Subject: [PATCH 046/173] fixes api query --- packages/ui/src/elements/RelationshipTable/index.tsx | 12 +++++------- packages/ui/src/fields/Join/index.tsx | 8 ++++++++ test/joins/config.ts | 6 +++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 49039fa2369..0ff64a8a3ae 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -11,9 +11,7 @@ import { getTranslation } from '@payloadcms/translations' import React, { useEffect, useReducer, useState } from 'react' import AnimateHeightImport from 'react-animate-height' - -const AnimateHeight = (AnimateHeightImport.default || - AnimateHeightImport) as typeof AnimateHeightImport.default +const AnimateHeight = AnimateHeightImport.default || AnimateHeightImport import { Pill } from '../../elements/Pill/index.js' import { usePayloadAPI } from '../../hooks/usePayloadAPI.js' @@ -36,14 +34,13 @@ const baseClass = 'relationship-table' type RelationshipTableComponentProps = { readonly Label?: React.ReactNode readonly field: JoinFieldProps['field'] + readonly filterOptions?: Where | boolean readonly initialData?: PaginatedDocs readonly relationTo: string } -const filterOptions: Where = {} - export const RelationshipTable: React.FC = (props) => { - const { Label, field, initialData, relationTo } = props + const { Label, field, filterOptions, initialData, relationTo } = props const { config: { @@ -126,7 +123,7 @@ export const RelationshipTable: React.FC = (pro if (versions?.drafts) params.draft = 'true' setParams(params) - }, [page, sort, where, search, cacheBust, collectionConfig, setParams, limit]) + }, [page, sort, where, search, cacheBust, collectionConfig, setParams, limit, filterOptions]) const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({ collectionSlug: relationTo, @@ -215,6 +212,7 @@ export const RelationshipTable: React.FC = (pro collectionSlug={relationTo} preferenceKey={preferenceKey} > + {/* @ts-expect-error TODO: get this CJS import to work, eslint keeps removing the type assertion */} = (props) => { const { @@ -25,6 +26,8 @@ const JoinFieldComponent: React.FC = (props) => { }, } = props + const { id: docID } = useDocumentInfo() + const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps() const { path, value } = useField({ @@ -39,6 +42,11 @@ const JoinFieldComponent: React.FC = (props) => { } field={field} + filterOptions={{ + [on]: { + in: [docID], + }, + }} initialData={value} relationTo={collection} /> diff --git a/test/joins/config.ts b/test/joins/config.ts index 582f6061580..d0d97e9d03c 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -134,7 +134,7 @@ export default buildConfigWithDefaults({ group: { category: category.id, }, - title: 'test', + title: 'Test Post 1', }, }) @@ -145,7 +145,7 @@ export default buildConfigWithDefaults({ group: { category: category.id, }, - title: 'test', + title: 'Test Post 2', }, }) @@ -156,7 +156,7 @@ export default buildConfigWithDefaults({ group: { category: category.id, }, - title: 'test', + title: 'Test Post 3', }, }) }, From b5f4badec3019114589c5a15be2f467c4b1cc018 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Thu, 22 Aug 2024 17:24:23 -0400 Subject: [PATCH 047/173] chore: simplify joins with afterRead field hook --- packages/db-mongodb/src/find.ts | 32 +------- packages/db-mongodb/src/findOne.ts | 20 ++--- packages/db-mongodb/src/utilities/setJoins.ts | 76 ------------------- .../drizzle/src/find/buildFindManyArgs.ts | 5 +- packages/drizzle/src/find/findMany.ts | 2 - packages/drizzle/src/find/traverseFields.ts | 53 +------------ .../payload/src/collections/config/client.ts | 4 +- .../src/collections/config/sanitize.ts | 11 +-- .../payload/src/collections/config/types.ts | 16 ---- .../src/collections/operations/create.ts | 1 + .../src/collections/operations/find.ts | 2 +- .../src/collections/operations/findByID.ts | 2 +- .../src/collections/operations/update.ts | 3 + packages/payload/src/database/types.ts | 4 +- .../payload/src/fields/config/sanitize.ts | 42 ++-------- .../src/fields/hooks/afterRead/index.ts | 5 +- .../src/fields/hooks/afterRead/promise.ts | 38 +++++++++- .../relationshipPopulationPromise.ts | 40 ++++------ .../fields/hooks/afterRead/traverseFields.ts | 5 +- test/buildConfigWithDefaults.ts | 4 - test/joins/int.spec.ts | 8 +- 21 files changed, 87 insertions(+), 286 deletions(-) delete mode 100644 packages/db-mongodb/src/utilities/setJoins.ts diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index 9d3b2498aa5..450414fb103 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -7,23 +7,11 @@ import type { MongooseAdapter } from './index.js' import { buildSortParam } from './queries/buildSortParam.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' -import { setJoins } from './utilities/setJoins.js' import { withSession } from './withSession.js' export const find: Find = async function find( this: MongooseAdapter, - { - collection, - joins, - limit, - locale, - page, - pagination, - projection, - req = {} as PayloadRequest, - sort: sortArg, - where, - }, + { collection, limit, locale, page, pagination, req = {} as PayloadRequest, sort: sortArg, where }, ) { const Model = this.collections[collection] const collectionConfig = this.payload.collections[collection].config @@ -62,7 +50,6 @@ export const find: Find = async function find( options, page, pagination, - projection, sort, useEstimatedCount, } @@ -102,23 +89,6 @@ export const find: Find = async function find( } const result = await Model.paginate(query, paginationOptions) - - const joinPromises = [] - - result.docs.forEach((doc) => { - joinPromises.push( - setJoins({ - collection, - doc, - joins, - payload: this.payload, - req, - }), - ) - }) - - await Promise.all(joinPromises) - const docs = JSON.parse(JSON.stringify(result.docs)) return { diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index b8e2a55bbe1..c17e93aea00 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -1,18 +1,17 @@ -import type { QueryOptions } from 'mongoose' -import type { FindOne, PayloadRequest } from 'payload' +import type { MongooseQueryOptions } from 'mongoose' +import type { Document, FindOne, PayloadRequest } from 'payload' import type { MongooseAdapter } from './index.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' -import { setJoins } from './utilities/setJoins.js' import { withSession } from './withSession.js' export const findOne: FindOne = async function findOne( this: MongooseAdapter, - { collection, joins, locale, req = {} as PayloadRequest, where }, + { collection, locale, req = {} as PayloadRequest, where }, ) { const Model = this.collections[collection] - const options: QueryOptions = { + const options: MongooseQueryOptions = { ...(await withSession(this, req)), lean: true, } @@ -29,16 +28,7 @@ export const findOne: FindOne = async function findOne( return null } - let result = await setJoins({ - collection, - doc, - joins, - locale, - payload: this.payload, - req, - }) - - result = JSON.parse(JSON.stringify(result)) + let result: Document = JSON.parse(JSON.stringify(doc)) // custom id type reset result.id = result._id diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts deleted file mode 100644 index 9ad76a32863..00000000000 --- a/packages/db-mongodb/src/utilities/setJoins.ts +++ /dev/null @@ -1,76 +0,0 @@ -import type { Document, FindArgs, JoinQuery, Payload } from 'payload' - -type Args = { - collection: string - doc: Document - joins: JoinQuery - payload: Payload -} & FindArgs - -/** - * fetch docs and add to the keys by path, mutating and returning the doc with paginated results - */ -export const setJoins = async ({ - collection, - doc, - joins = {}, - locale, - payload, - req, -}: Args): Promise => { - // TODO: allow disabling of joining at the top level using `joins: false` or `?joins=false` - // if (joins === false) return doc - const joinConfig = payload.collections[collection].config.joins - - const promises = [] - - Object.keys(joinConfig).forEach((slug) => { - joinConfig[slug].forEach((join) => { - // get the query options for the join off of req - // TODO: allow disabling the join completely - // if (joins[join.schemaPath] === false || req.query[join.schemaPath] === 'false') { - // continue - // } - - const { limit, page, pagination = true, sort } = joins[join.schemaPath] || {} - - promises.push( - payload.db - .find({ - collection: slug, - limit, - locale, - page, - pagination, - projection: { - _id: 1, - }, - req, - sort, - where: { - [join.field.on]: { equals: doc._id.toString() }, - }, - }) - .then((data) => { - // iterate schemaPath and assign to the document - const path = join.schemaPath.split('.') - let current = doc - for (let i = 0; i <= path.length - 1; i++) { - if (i === path.length - 1) { - current[path[i]] = data - } else { - if (!current[path[i]]) { - current[path[i]] = {} - } - current = current[path[i]] - } - } - }), - ) - }) - }) - - await Promise.all(promises) - - return doc -} diff --git a/packages/drizzle/src/find/buildFindManyArgs.ts b/packages/drizzle/src/find/buildFindManyArgs.ts index 861225aa587..8a062c2a2e7 100644 --- a/packages/drizzle/src/find/buildFindManyArgs.ts +++ b/packages/drizzle/src/find/buildFindManyArgs.ts @@ -1,5 +1,5 @@ import type { DBQueryConfig } from 'drizzle-orm' -import type { Field, JoinQuery } from 'payload' +import type { Field } from 'payload' import type { DrizzleAdapter } from '../types.js' @@ -9,7 +9,6 @@ type BuildFindQueryArgs = { adapter: DrizzleAdapter depth: number fields: Field[] - joinQuery?: JoinQuery locale?: string tableName: string } @@ -26,7 +25,6 @@ export const buildFindManyArgs = ({ adapter, depth, fields, - joinQuery, locale, tableName, }: BuildFindQueryArgs): Record => { @@ -83,7 +81,6 @@ export const buildFindManyArgs = ({ currentTableName: tableName, depth, fields, - joinQuery, locale, path: '', topLevelArgs: result, diff --git a/packages/drizzle/src/find/findMany.ts b/packages/drizzle/src/find/findMany.ts index 4ff102718dd..5d5fad0a297 100644 --- a/packages/drizzle/src/find/findMany.ts +++ b/packages/drizzle/src/find/findMany.ts @@ -19,7 +19,6 @@ type Args = { export const findMany = async function find({ adapter, fields, - joins: joinQuery, limit: limitArg, locale, page = 1, @@ -68,7 +67,6 @@ export const findMany = async function find({ adapter, depth: 0, fields, - joinQuery, tableName, }) diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index 8a582c7aca9..36e7668c22e 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -1,15 +1,11 @@ -import type { DBQueryConfig } from 'drizzle-orm' -import type { Field, JoinQuery } from 'payload' +import type { Field } from 'payload' -import { APIError } from 'payload' import { fieldAffectsData, tabHasName } from 'payload/shared' import toSnakeCase from 'to-snake-case' import type { DrizzleAdapter } from '../types.js' import type { Result } from './buildFindManyArgs.js' -import { buildOrderBy } from '../queries/buildOrderBy.js' - type TraverseFieldArgs = { _locales: Result adapter: DrizzleAdapter @@ -17,7 +13,6 @@ type TraverseFieldArgs = { currentTableName: string depth?: number fields: Field[] - joinQuery: JoinQuery locale?: string path: string topLevelArgs: Record @@ -31,7 +26,6 @@ export const traverseFields = ({ currentTableName, depth, fields, - joinQuery = {}, locale, path, topLevelArgs, @@ -60,7 +54,6 @@ export const traverseFields = ({ currentTableName, depth, fields: field.fields, - joinQuery, path, topLevelArgs, topLevelTableName, @@ -80,7 +73,6 @@ export const traverseFields = ({ currentTableName, depth, fields: tab.fields, - joinQuery, path: tabPath, topLevelArgs, topLevelTableName, @@ -125,7 +117,6 @@ export const traverseFields = ({ currentTableName: arrayTableName, depth, fields: field.fields, - joinQuery, path: '', topLevelArgs, topLevelTableName, @@ -182,7 +173,6 @@ export const traverseFields = ({ currentTableName: tableName, depth, fields: block.fields, - joinQuery, path: '', topLevelArgs, topLevelTableName, @@ -200,7 +190,6 @@ export const traverseFields = ({ currentTableName, depth, fields: field.fields, - joinQuery, path: `${path}${field.name}_`, topLevelArgs, topLevelTableName, @@ -208,46 +197,6 @@ export const traverseFields = ({ break - case 'join': { - // when `joinsQuery` is false, do not join - if (joinQuery !== false) { - const { limit = 10, page = 1, sort } = joinQuery[`${path}${field.name}`] || {} - if (page !== 1) { - // we need a second query in read step to complete the join because drizzle doesn't support offset - throw new APIError('Pagination is not supported for joins') - } - const fields = adapter.payload.collections[field.collection].config.fields - const joinTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${ - field.localized && adapter.payload.config.localization ? adapter.localesSuffix : '' - }` - const selectFields = {} - const orderBy = buildOrderBy({ - adapter, - fields, - joins: [], - locale, - selectFields, - sort, - tableName: joinTableName, - }) - const withJoin: DBQueryConfig<'many', true, any, any> = { - columns: { - id: true, - ...selectFields, - }, - // TODO: join a custom query to handle count - // extras: {}, - limit, - orderBy: () => [orderBy.order(orderBy.column)], - } - if (field.localized) { - withJoin.columns._locale = true - } - currentArgs.with[toSnakeCase(`${path}${field.name}`)] = withJoin - } - break - } - default: { break } diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index fddb6a19ad1..6e677117e04 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -6,7 +6,7 @@ import type { SanitizedCollectionConfig } from './types.js' export type ServerOnlyCollectionProperties = keyof Pick< SanitizedCollectionConfig, - 'access' | 'custom' | 'endpoints' | 'hooks' | 'joins' + 'access' | 'custom' | 'endpoints' | 'hooks' > export type ServerOnlyCollectionAdminProperties = keyof Pick< @@ -49,7 +49,7 @@ export type ClientCollectionConfig = { livePreview?: Omit } & Omit< SanitizedCollectionConfig['admin'], - 'components' | 'description' | 'joins' | 'livePreview' | ServerOnlyCollectionAdminProperties + 'components' | 'description' | 'livePreview' | ServerOnlyCollectionAdminProperties > fields: ClientField[] } & Omit diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index 330c85393ce..362bd690f9e 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -1,6 +1,6 @@ import type { LoginWithUsernameOptions } from '../../auth/types.js' import type { Config, SanitizedConfig } from '../../config/types.js' -import type { CollectionConfig, SanitizedCollectionConfig, SanitizedJoins } from './types.js' +import type { CollectionConfig, SanitizedCollectionConfig } from './types.js' import { getBaseAuthFields } from '../../auth/getAuthFields.js' import { TimestampsRequired } from '../../errors/TimestampsRequired.js' @@ -35,14 +35,11 @@ export const sanitizeCollection = async ( // ///////////////////////////////// const validRelationships = config.collections.map((c) => c.slug) || [] - const joins: SanitizedJoins = {} sanitized.fields = await sanitizeFields({ collectionConfig: sanitized, config, fields: sanitized.fields, - joins, richTextSanitizationPromises, - schemaPath: '', validRelationships, }) @@ -180,9 +177,5 @@ export const sanitizeCollection = async ( sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth)) } - const sanitizedConfig = sanitized as SanitizedCollectionConfig - - sanitizedConfig.joins = joins - - return sanitizedConfig + return sanitized as SanitizedCollectionConfig } diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 6acb5e84edb..1321969ec5d 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -470,21 +470,6 @@ export type CollectionConfig = { versions?: IncomingCollectionVersions | boolean } -export type SanitizedJoin = { - /** - * The field configuration defining the join - */ - field: JoinField - /** - * The schemaPath of the join field in dot notation - */ - schemaPath: string -} - -export type SanitizedJoins = { - [collectionSlug: string]: SanitizedJoin[] -} - export interface SanitizedCollectionConfig extends Omit< DeepRequired, @@ -496,7 +481,6 @@ export interface SanitizedCollectionConfig /** * Object of collections to join 'Join Fields object keyed by collection */ - joins: SanitizedJoins upload: SanitizedUploadConfig versions: SanitizedCollectionVersions } diff --git a/packages/payload/src/collections/operations/create.ts b/packages/payload/src/collections/operations/create.ts index 2d5c88f073f..4e12b31dd66 100644 --- a/packages/payload/src/collections/operations/create.ts +++ b/packages/payload/src/collections/operations/create.ts @@ -289,6 +289,7 @@ export const createOperation = async ( draft, fallbackLocale, global: null, + joins: false, locale, overrideAccess, req, diff --git a/packages/payload/src/collections/operations/find.ts b/packages/payload/src/collections/operations/find.ts index 4dc0f5b7898..121155bd6ef 100644 --- a/packages/payload/src/collections/operations/find.ts +++ b/packages/payload/src/collections/operations/find.ts @@ -142,7 +142,6 @@ export const findOperation = async ( result = await payload.db.find>({ collection: collectionConfig.slug, - joins, limit: sanitizedLimit, locale, page: sanitizedPage, @@ -199,6 +198,7 @@ export const findOperation = async ( fallbackLocale, findMany: true, global: null, + joins, locale, overrideAccess, req, diff --git a/packages/payload/src/collections/operations/findByID.ts b/packages/payload/src/collections/operations/findByID.ts index 1682243aee3..bbef564d2e3 100644 --- a/packages/payload/src/collections/operations/findByID.ts +++ b/packages/payload/src/collections/operations/findByID.ts @@ -74,7 +74,6 @@ export const findByIDOperation = async ( const findOneArgs: FindOneArgs = { collection: collectionConfig.slug, - joins, locale, req: { transactionID: req.transactionID, @@ -143,6 +142,7 @@ export const findByIDOperation = async ( draft: draftEnabled, fallbackLocale, global: null, + joins, locale, overrideAccess, req, diff --git a/packages/payload/src/collections/operations/update.ts b/packages/payload/src/collections/operations/update.ts index 3e1e49d8f61..be68d190e70 100644 --- a/packages/payload/src/collections/operations/update.ts +++ b/packages/payload/src/collections/operations/update.ts @@ -185,6 +185,8 @@ export const updateOperation = async ( draft: draftArg, fallbackLocale, global: null, + // TODO: joins needs to come from args + joins: {}, locale, overrideAccess: true, req, @@ -335,6 +337,7 @@ export const updateOperation = async ( draft: draftArg, fallbackLocale: null, global: null, + joins: false, locale, overrideAccess, req, diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 7725a4b35f3..2dffceb6053 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -1,5 +1,5 @@ import type { TypeWithID } from '../collections/config/types.js' -import type { Document, JoinQuery, Payload, PayloadRequest, Where } from '../types/index.js' +import type { Document, Payload, PayloadRequest, Where } from '../types/index.js' import type { TypeWithVersion } from '../versions/types.js' export type { TypeWithVersion } @@ -185,7 +185,6 @@ export type QueryDrafts = (args: QueryDraftsArgs) => Promise(args: FindOneArgs) => Promise fields: Field[] - joins?: SanitizedJoins /** * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present. * @@ -36,7 +34,7 @@ type Args = { * so that you can sanitize them together, after the config has been sanitized. */ richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise> - schemaPath?: string + /** * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array. * This validation will be skipped if validRelationships is null. @@ -49,16 +47,12 @@ export const sanitizeFields = async ({ config, existingFieldNames = new Set(), fields, - joins, requireFieldLevelRichTextEditor = false, richTextSanitizationPromises, - schemaPath: schemaPathArg, validRelationships, }: Args): Promise => { if (!fields) return [] - let schemaPath = schemaPathArg - for (let i = 0; i < fields.length; i++) { const field = fields[i] @@ -93,22 +87,6 @@ export const sanitizeFields = async ({ field.defaultValue = false } - if (field.type === 'join') { - if (typeof joins === 'undefined') { - throw new APIError( - 'Join fields cannot be added to arrays or blocks to avoid duplicate data.', - ) - } - const join = { - field, - schemaPath: `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}`, - } - if (!joins[field.collection]) { - joins[field.collection] = [join] - } else { - joins[field.collection].push(join) - } - } if (field.type === 'relationship' || field.type === 'upload') { if (validRelationships) { const relationships = Array.isArray(field.relationTo) @@ -231,17 +209,12 @@ export const sanitizeFields = async ({ } if ('fields' in field && field.fields) { - if ('name' in field && field.name) { - schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}` - } field.fields = await sanitizeFields({ config, existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames, fields: field.fields, - joins, requireFieldLevelRichTextEditor, richTextSanitizationPromises, - schemaPath, validRelationships, }) } @@ -249,21 +222,16 @@ export const sanitizeFields = async ({ if (field.type === 'tabs') { for (let j = 0; j < field.tabs.length; j++) { const tab = field.tabs[j] - if (tabHasName(tab)) { - schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${tab.name}` - if (typeof tab.label === 'undefined') { - tab.label = toWords(tab.name) - } + if (tabHasName(tab) && typeof tab.label === 'undefined') { + tab.label = toWords(tab.name) } tab.fields = await sanitizeFields({ config, existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames, fields: tab.fields, - joins, requireFieldLevelRichTextEditor, richTextSanitizationPromises, - schemaPath, validRelationships, }) field.tabs[j] = tab diff --git a/packages/payload/src/fields/hooks/afterRead/index.ts b/packages/payload/src/fields/hooks/afterRead/index.ts index 30dfc2c543a..389beeda938 100644 --- a/packages/payload/src/fields/hooks/afterRead/index.ts +++ b/packages/payload/src/fields/hooks/afterRead/index.ts @@ -1,6 +1,6 @@ import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' -import type { JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' +import type { JoinQuery, JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' import { deepCopyObjectSimple } from '../../../utilities/deepCopyObject.js' import { traverseFields } from './traverseFields.js' @@ -16,6 +16,7 @@ type Args = { findMany?: boolean flattenLocales?: boolean global: SanitizedGlobalConfig | null + joins?: JoinQuery locale: string overrideAccess: boolean req: PayloadRequest @@ -44,6 +45,7 @@ export async function afterRead(args: Args): Promise findMany, flattenLocales = true, global, + joins, locale, overrideAccess, req, @@ -75,6 +77,7 @@ export async function afterRead(args: Args): Promise findMany, flattenLocales, global, + joins, locale, overrideAccess, path: [], diff --git a/packages/payload/src/fields/hooks/afterRead/promise.ts b/packages/payload/src/fields/hooks/afterRead/promise.ts index a7d87b40782..655f7c2fb8f 100644 --- a/packages/payload/src/fields/hooks/afterRead/promise.ts +++ b/packages/payload/src/fields/hooks/afterRead/promise.ts @@ -1,7 +1,7 @@ import type { RichTextAdapter } from '../../../admin/RichText.js' import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' -import type { JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' +import type { JoinQuery, JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' import type { Field, TabAsField } from '../../config/types.js' import { MissingEditorProp } from '../../../errors/index.js' @@ -27,6 +27,7 @@ type Args = { findMany: boolean flattenLocales: boolean global: SanitizedGlobalConfig | null + joins: JoinQuery locale: null | string overrideAccess: boolean /** @@ -49,6 +50,7 @@ type Args = { // - Remove hidden fields from response // - Flatten locales into requested locale // - Sanitize outgoing data (point field, etc.) +// - Populate joins // - Execute field hooks // - Execute read access control // - Populate relationships @@ -66,6 +68,7 @@ export const promise = async ({ findMany, flattenLocales, global, + joins, locale, overrideAccess, parentPath, @@ -182,6 +185,36 @@ export const promise = async ({ break } + // Populate joins + case 'join': { + if (joins === false) { + break + } + const joinQuery = joins?.[fieldSchemaPath.join('.')] || {} + const { limit, page, pagination = true, sort } = joinQuery + populationPromises.push( + req.payload + .find({ + collection: field.collection, + // only join the first level of joins + depth: 0, + joins: false, + limit, + page, + pagination, + req, + sort, + where: { + [field.on]: { equals: doc.id }, + }, + }) + .then((result) => { + siblingDoc[field.name] = result + }), + ) + break + } + default: { break } @@ -288,7 +321,7 @@ export const promise = async ({ }) } - if (field.type === 'relationship' || field.type === 'upload' || field.type === 'join') { + if (field.type === 'relationship' || field.type === 'upload') { populationPromises.push( relationshipPopulationPromise({ currentDepth, @@ -324,6 +357,7 @@ export const promise = async ({ findMany, flattenLocales, global, + joins, locale, overrideAccess, path: fieldPath, diff --git a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts index ee73094478e..28706e10b08 100644 --- a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts +++ b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts @@ -1,5 +1,5 @@ -import type { PayloadRequest } from '../../../types/index.js' -import type { JoinField, RelationshipField, UploadField } from '../../config/types.js' +import type { JoinQuery, PayloadRequest } from '../../../types/index.js' +import type { RelationshipField, UploadField } from '../../config/types.js' import { createDataloaderCacheKey } from '../../../collections/dataloader.js' import { fieldHasMaxDepth, fieldSupportsMany } from '../../config/types.js' @@ -11,8 +11,9 @@ type PopulateArgs = { depth: number draft: boolean fallbackLocale: null | string - field: JoinField | RelationshipField | UploadField + field: RelationshipField | UploadField index?: number + joins?: JoinQuery key?: string locale: null | string overrideAccess: boolean @@ -36,16 +37,11 @@ const populate = async ({ showHiddenFields, }: PopulateArgs) => { const dataToUpdate = dataReference - let relation - if (field.type === 'join') { - relation = field.collection - } else { - relation = Array.isArray(field.relationTo) ? (data.relationTo as string) : field.relationTo - } + const relation = Array.isArray(field.relationTo) ? (data.relationTo as string) : field.relationTo const relatedCollection = req.payload.collections[relation] if (relatedCollection) { - let id = field.type === 'relationship' && Array.isArray(field.relationTo) ? data.value : data + let id = Array.isArray(field.relationTo) ? data.value : data let relationshipValue const shouldPopulate = depth && currentDepth <= depth @@ -81,18 +77,18 @@ const populate = async ({ } if (typeof index === 'number' && typeof key === 'string') { - if (field.type === 'relationship' && Array.isArray(field.relationTo)) { + if (Array.isArray(field.relationTo)) { dataToUpdate[field.name][key][index].value = relationshipValue } else { dataToUpdate[field.name][key][index] = relationshipValue } } else if (typeof index === 'number' || typeof key === 'string') { - if (field.type === 'relationship' && Array.isArray(field.relationTo)) { + if (Array.isArray(field.relationTo)) { dataToUpdate[field.name][index ?? key].value = relationshipValue } else { - dataToUpdate[field.name].docs[index ?? key] = relationshipValue + dataToUpdate[field.name][index ?? key] = relationshipValue } - } else if (field.type === 'relationship' && Array.isArray(field.relationTo)) { + } else if (Array.isArray(field.relationTo)) { dataToUpdate[field.name].value = relationshipValue } else { dataToUpdate[field.name] = relationshipValue @@ -105,7 +101,7 @@ type PromiseArgs = { depth: number draft: boolean fallbackLocale: null | string - field: JoinField | RelationshipField | UploadField + field: RelationshipField | UploadField locale: null | string overrideAccess: boolean req: PayloadRequest @@ -129,7 +125,7 @@ export const relationshipPopulationPromise = async ({ const populateDepth = fieldHasMaxDepth(field) && field.maxDepth < depth ? field.maxDepth : depth const rowPromises = [] - if (field.type === 'join' || (fieldSupportsMany(field) && field.hasMany)) { + if (fieldSupportsMany(field) && field.hasMany) { if ( field.localized && locale === 'all' && @@ -160,19 +156,13 @@ export const relationshipPopulationPromise = async ({ }) } }) - } else if ( - Array.isArray(siblingDoc[field.name]) || - Array.isArray(siblingDoc[field.name]?.docs) - ) { - ;(Array.isArray(siblingDoc[field.name]) - ? siblingDoc[field.name] - : siblingDoc[field.name].docs - ).forEach((relatedDoc, index) => { + } else if (Array.isArray(siblingDoc[field.name])) { + siblingDoc[field.name].forEach((relatedDoc, index) => { const rowPromise = async () => { if (relatedDoc) { await populate({ currentDepth, - data: relatedDoc?.id ? relatedDoc.id : relatedDoc, + data: relatedDoc, dataReference: resultingDoc, depth: populateDepth, draft, diff --git a/packages/payload/src/fields/hooks/afterRead/traverseFields.ts b/packages/payload/src/fields/hooks/afterRead/traverseFields.ts index 8098b59b522..92eedd6c516 100644 --- a/packages/payload/src/fields/hooks/afterRead/traverseFields.ts +++ b/packages/payload/src/fields/hooks/afterRead/traverseFields.ts @@ -1,6 +1,6 @@ import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' -import type { JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' +import type { JoinQuery, JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' import type { Field, TabAsField } from '../../config/types.js' import { promise } from './promise.js' @@ -21,6 +21,7 @@ type Args = { findMany: boolean flattenLocales: boolean global: SanitizedGlobalConfig | null + joins?: JoinQuery locale: null | string overrideAccess: boolean path: (number | string)[] @@ -46,6 +47,7 @@ export const traverseFields = ({ findMany, flattenLocales, global, + joins, locale, overrideAccess, path, @@ -72,6 +74,7 @@ export const traverseFields = ({ findMany, flattenLocales, global, + joins, locale, overrideAccess, parentPath: path, diff --git a/test/buildConfigWithDefaults.ts b/test/buildConfigWithDefaults.ts index 6b6b8ee99ec..40094d9eb08 100644 --- a/test/buildConfigWithDefaults.ts +++ b/test/buildConfigWithDefaults.ts @@ -35,10 +35,6 @@ import { reInitEndpoint } from './helpers/reInit.js' import { localAPIEndpoint } from './helpers/sdk/endpoint.js' import { testEmailAdapter } from './testEmailAdapter.js' -// process.env.POSTGRES_URL = 'postgres://postgres:postgres@127.0.0.1:5432/payloadtests' -// process.env.PAYLOAD_DATABASE = 'postgres' -// process.env.PAYLOAD_DATABASE = 'sqlite' - export async function buildConfigWithDefaults( testConfig?: Partial, options?: { diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index 806cf55fe0e..83f0d2c7893 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -73,10 +73,10 @@ describe('Joins Field Tests', () => { collection: 'categories', }) - expect(categoryWithPosts.group.posts.docs).toHaveLength(10) - expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('id') - expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('title') - expect(categoryWithPosts.group.posts.docs[0].title).toStrictEqual('test 9') + expect(categoryWithPosts.posts.docs).toHaveLength(10) + expect(categoryWithPosts.posts.docs[0]).toHaveProperty('id') + expect(categoryWithPosts.posts.docs[0]).toHaveProperty('title') + expect(categoryWithPosts.posts.docs[0].title).toStrictEqual('test 9') }) it('should populate joins using find', async () => { From 58a5566acaa4a11dfb57eb4ed50659ec4250b648 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Thu, 22 Aug 2024 17:38:31 -0400 Subject: [PATCH 048/173] chore: fix drizzle build --- packages/drizzle/src/find.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/drizzle/src/find.ts b/packages/drizzle/src/find.ts index 549ed6e13c2..2e49973182e 100644 --- a/packages/drizzle/src/find.ts +++ b/packages/drizzle/src/find.ts @@ -10,7 +10,6 @@ export const find: Find = async function find( this: DrizzleAdapter, { collection, - joins, limit, locale, page = 1, @@ -28,7 +27,6 @@ export const find: Find = async function find( return findMany({ adapter: this, fields: collectionConfig.fields, - joins, limit, locale, page, From 07d182937065c0b47699c9849ac97310bdcaaca1 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 22 Aug 2024 22:37:18 -0400 Subject: [PATCH 049/173] feat: renders take over modal only once new user starts editing --- .../src/elements/DocumentLocked/index.tsx | 2 +- .../next/src/views/Edit/Default/index.tsx | 52 ++++++++++++------- .../ui/src/providers/DocumentInfo/index.tsx | 1 + 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/packages/next/src/elements/DocumentLocked/index.tsx b/packages/next/src/elements/DocumentLocked/index.tsx index a89c93ed902..f17b0f3a44f 100644 --- a/packages/next/src/elements/DocumentLocked/index.tsx +++ b/packages/next/src/elements/DocumentLocked/index.tsx @@ -27,7 +27,7 @@ export const DocumentLocked: React.FC<{ handleGoBack: () => void isActive: boolean onReadOnly: () => void - onTakeOver: () => Promise + onTakeOver: () => void user?: ClientUser }> = ({ editedAt, handleGoBack, isActive, onReadOnly, onTakeOver, user }) => { const { closeModal, openModal } = useModal() diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index 5c72f23dd48..e3611be8d8c 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -137,13 +137,20 @@ export const DefaultEditView: React.FC = () => { return false }) - const handleTakeOver = useCallback(async () => { - // Update the document for the incoming user - await updateDocumentEditor(id, user) - - // Close the current modal for the incoming user + const handleTakeOver = useCallback(() => { + // Close the modal and mark that the user intends to edit setShowLockedModal(false) - }, [id, updateDocumentEditor, user]) + setIsLockedByAnotherUser(false) + documentLockStateRef.current = { isLocked: true, user } + }, [user]) + + useEffect(() => { + if (documentLockStateRef.current && documentLockStateRef.current.user.id !== user.id) { + setIsLockedByAnotherUser(true) + } else { + setIsLockedByAnotherUser(false) + } + }, [user.id]) // Handle modal display logic based on lock state useEffect(() => { @@ -156,21 +163,21 @@ export const DefaultEditView: React.FC = () => { }, [isDocumentLocked, initialEditor, user.id]) useEffect(() => { - if (documentLockStateRef.current && documentLockStateRef.current.user.id !== user.id) { - setIsLockedByAnotherUser(true) - } else { - setIsLockedByAnotherUser(false) - } - }, [user.id]) + let timeoutId - useEffect(() => { - if (isLockedByAnotherUser && isDocumentLocked) { - // The current user was the lock owner but is no longer - setShowTakeOverModal(true) + if (isLockedByAnotherUser && documentLockStateRef.current?.user?.id !== user.id) { + timeoutId = setTimeout(() => { + setShowTakeOverModal(true) + }, 200) } else { + clearTimeout(timeoutId) setShowTakeOverModal(false) } - }, [isLockedByAnotherUser, isDocumentLocked]) + + return () => { + if (timeoutId) clearTimeout(timeoutId) + } + }, [isLockedByAnotherUser, user.id]) const handleGoBack = useCallback(() => { const redirectRoute = formatAdminURL({ @@ -245,11 +252,18 @@ export const DefaultEditView: React.FC = () => { async ({ formState: prevFormState }) => { const docPreferences = await getDocPreferences() - // Lock the document if it's not locked by another user + // Lock the document if it's not locked by another user and hasn't been locked by this user yet if (id && !isLockedByAnotherUser && !isDocumentLockedRef.current) { setShouldLockDocument(true) } + if (id && isLockedByAnotherUser && documentLockStateRef.current?.user?.id !== user.id) { + documentLockStateRef.current = { isLocked: true, user } + setIsLockedByAnotherUser(false) + + await updateDocumentEditor(id, user) + } + // Fire the request immediately with returnLockStatus: true if the document is locked const { state } = await getFormState({ apiRoute, @@ -279,6 +293,8 @@ export const DefaultEditView: React.FC = () => { serverURL, isLockedByAnotherUser, shouldLockDocument, + updateDocumentEditor, + user, ], ) diff --git a/packages/ui/src/providers/DocumentInfo/index.tsx b/packages/ui/src/providers/DocumentInfo/index.tsx index d61bed5d8ba..2ff82c8a65e 100644 --- a/packages/ui/src/providers/DocumentInfo/index.tsx +++ b/packages/ui/src/providers/DocumentInfo/index.tsx @@ -246,6 +246,7 @@ const DocumentInfo: React.FC< }) setLastEditedAt(new Date()) + setIsDocumentLocked(true) } } catch (error) { console.error('Failed to update the document editor', error) From 8c096d1f82cbad53ea3333b5d1df9f68977af684 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 22 Aug 2024 22:52:10 -0400 Subject: [PATCH 050/173] chore: destructures state where getFormState is called --- .../views/CreateFirstUser/index.client.tsx | 8 +-- .../src/views/LivePreview/index.client.tsx | 4 +- .../blocks/client/component/index.tsx | 4 +- .../utilities/fieldsDrawer/DrawerContent.tsx | 6 ++- .../src/field/elements/link/Button/index.tsx | 54 ++++++++++--------- .../src/field/elements/link/Element/index.tsx | 2 +- .../field/elements/link/LinkDrawer/index.tsx | 4 +- .../upload/Element/UploadDrawer/index.tsx | 6 ++- packages/ui/src/elements/EditMany/index.tsx | 11 ++-- 9 files changed, 57 insertions(+), 42 deletions(-) diff --git a/packages/next/src/views/CreateFirstUser/index.client.tsx b/packages/next/src/views/CreateFirstUser/index.client.tsx index 9c669d026cb..fececeea36b 100644 --- a/packages/next/src/views/CreateFirstUser/index.client.tsx +++ b/packages/next/src/views/CreateFirstUser/index.client.tsx @@ -34,8 +34,8 @@ export const CreateFirstUserClient: React.FC<{ const collectionConfig = getEntityConfig({ collectionSlug: userSlug }) as ClientCollectionConfig const onChange: FormProps['onChange'][0] = React.useCallback( - async ({ formState: prevFormState }) => - getFormState({ + async ({ formState: prevFormState }) => { + const { state } = await getFormState({ apiRoute, body: { collectionSlug: userSlug, @@ -44,7 +44,9 @@ export const CreateFirstUserClient: React.FC<{ schemaPath: `_${userSlug}.auth`, }, serverURL, - }), + }) + return state + }, [apiRoute, userSlug, serverURL], ) diff --git a/packages/next/src/views/LivePreview/index.client.tsx b/packages/next/src/views/LivePreview/index.client.tsx index f04666a5823..84e2a90d80b 100644 --- a/packages/next/src/views/LivePreview/index.client.tsx +++ b/packages/next/src/views/LivePreview/index.client.tsx @@ -117,7 +117,7 @@ const PreviewView: React.FC = ({ async ({ formState: prevFormState }) => { const docPreferences = await getDocPreferences() - return getFormState({ + const { state } = await getFormState({ apiRoute, body: { id, @@ -128,6 +128,8 @@ const PreviewView: React.FC = ({ }, serverURL, }) + + return state }, [serverURL, apiRoute, id, operation, schemaPath, getDocPreferences], ) diff --git a/packages/richtext-lexical/src/features/blocks/client/component/index.tsx b/packages/richtext-lexical/src/features/blocks/client/component/index.tsx index 651120567b2..5f1abeafef5 100644 --- a/packages/richtext-lexical/src/features/blocks/client/component/index.tsx +++ b/packages/richtext-lexical/src/features/blocks/client/component/index.tsx @@ -59,7 +59,7 @@ export const BlockComponent: React.FC = (props) => { // Field Schema useEffect(() => { const awaitInitialState = async () => { - const state = await getFormState({ + const { state } = await getFormState({ apiRoute: config.routes.api, body: { id, @@ -89,7 +89,7 @@ export const BlockComponent: React.FC = (props) => { const onChange: FormProps['onChange'][0] = useCallback( async ({ formState: prevFormState }) => { - const formState = await getFormState({ + const { state: formState } = await getFormState({ apiRoute: config.routes.api, body: { id, diff --git a/packages/richtext-lexical/src/utilities/fieldsDrawer/DrawerContent.tsx b/packages/richtext-lexical/src/utilities/fieldsDrawer/DrawerContent.tsx index 4cb7f27be94..411aba3976b 100644 --- a/packages/richtext-lexical/src/utilities/fieldsDrawer/DrawerContent.tsx +++ b/packages/richtext-lexical/src/utilities/fieldsDrawer/DrawerContent.tsx @@ -46,7 +46,7 @@ export const DrawerContent: React.FC { const awaitInitialState = async () => { - const state = await getFormState({ + const { state } = await getFormState({ apiRoute: config.routes.api, body: { id, @@ -65,7 +65,7 @@ export const DrawerContent: React.FC { - return await getFormState({ + const { state } = await getFormState({ apiRoute: config.routes.api, body: { id, @@ -75,6 +75,8 @@ export const DrawerContent: React.FC { const fields = richTextComponentMap.get(linkFieldsSchemaPath) + const handleClick = async () => { + if (isElementActive(editor, 'link')) { + unwrapLink(editor) + } else { + openModal(drawerSlug) + const isCollapsed = editor.selection && Range.isCollapsed(editor.selection) + + if (!isCollapsed) { + const data = { + text: editor.selection ? Editor.string(editor, editor.selection) : '', + } + + const { state } = await getFormState({ + apiRoute: config.routes.api, + body: { + data, + operation: 'update', + schemaPath: `${schemaPath}.${linkFieldsSchemaPath}`, + }, + serverURL: config.serverURL, + }) + + setInitialState(state) + } + } + } + return ( { - if (isElementActive(editor, 'link')) { - unwrapLink(editor) - } else { - openModal(drawerSlug) - const isCollapsed = editor.selection && Range.isCollapsed(editor.selection) - - if (!isCollapsed) { - const data = { - text: editor.selection ? Editor.string(editor, editor.selection) : '', - } - - const state = await getFormState({ - apiRoute: config.routes.api, - body: { - data, - operation: 'update', - schemaPath: `${schemaPath}.${linkFieldsSchemaPath}`, - }, - serverURL: config.serverURL, - }) - - setInitialState(state) - } - } - }} + onClick={void handleClick} tooltip={t('fields:addLink')} > diff --git a/packages/richtext-slate/src/field/elements/link/Element/index.tsx b/packages/richtext-slate/src/field/elements/link/Element/index.tsx index 51640696c34..798ebe79b17 100644 --- a/packages/richtext-slate/src/field/elements/link/Element/index.tsx +++ b/packages/richtext-slate/src/field/elements/link/Element/index.tsx @@ -98,7 +98,7 @@ export const LinkElement = () => { url: element.url, } - const state = await getFormState({ + const { state } = await getFormState({ apiRoute: config.routes.api, body: { data, diff --git a/packages/richtext-slate/src/field/elements/link/LinkDrawer/index.tsx b/packages/richtext-slate/src/field/elements/link/LinkDrawer/index.tsx index 8e975804ae9..97edab4aa3e 100644 --- a/packages/richtext-slate/src/field/elements/link/LinkDrawer/index.tsx +++ b/packages/richtext-slate/src/field/elements/link/LinkDrawer/index.tsx @@ -38,7 +38,7 @@ export const LinkDrawer: React.FC = ({ const onChange: FormProps['onChange'][0] = useCallback( async ({ formState: prevFormState }) => { - return await getFormState({ + const { state } = await getFormState({ apiRoute: config.routes.api, body: { id, @@ -48,6 +48,8 @@ export const LinkDrawer: React.FC = ({ }, serverURL: config.serverURL, }) + + return state }, [config.routes.api, config.serverURL, fieldMapPath, id], diff --git a/packages/richtext-slate/src/field/elements/upload/Element/UploadDrawer/index.tsx b/packages/richtext-slate/src/field/elements/upload/Element/UploadDrawer/index.tsx index 531c986f2e7..b1d4db9ca1a 100644 --- a/packages/richtext-slate/src/field/elements/upload/Element/UploadDrawer/index.tsx +++ b/packages/richtext-slate/src/field/elements/upload/Element/UploadDrawer/index.tsx @@ -71,7 +71,7 @@ export const UploadDrawer: React.FC<{ const data = deepCopyObject(element?.fields || {}) const awaitInitialState = async () => { - const state = await getFormState({ + const { state } = await getFormState({ apiRoute: config.routes.api, body: { id, @@ -101,7 +101,7 @@ export const UploadDrawer: React.FC<{ const onChange: FormProps['onChange'][0] = useCallback( async ({ formState: prevFormState }) => { - return await getFormState({ + const { state } = await getFormState({ apiRoute: config.routes.api, body: { id, @@ -111,6 +111,8 @@ export const UploadDrawer: React.FC<{ }, serverURL: config.serverURL, }) + + return state }, [config.routes.api, config.serverURL, relatedCollection.slug, schemaPath, id], diff --git a/packages/ui/src/elements/EditMany/index.tsx b/packages/ui/src/elements/EditMany/index.tsx index 562b545d847..4f705deb9c2 100644 --- a/packages/ui/src/elements/EditMany/index.tsx +++ b/packages/ui/src/elements/EditMany/index.tsx @@ -126,7 +126,7 @@ export const EditMany: React.FC = (props) => { React.useEffect(() => { if (!hasInitializedState.current) { const getInitialState = async () => { - const result = await getFormState({ + const { state: result } = await getFormState({ apiRoute, body: { collectionSlug: slug, @@ -146,8 +146,8 @@ export const EditMany: React.FC = (props) => { }, [apiRoute, hasInitializedState, serverURL, slug]) const onChange: FormProps['onChange'][0] = useCallback( - ({ formState: prevFormState }) => - getFormState({ + async ({ formState: prevFormState }) => { + const { state } = await getFormState({ apiRoute, body: { collectionSlug: slug, @@ -156,7 +156,10 @@ export const EditMany: React.FC = (props) => { schemaPath: slug, }, serverURL, - }), + }) + + return state + }, [serverURL, apiRoute, slug], ) From 811cce6ebba76cbc9607046db23ce36f40664150 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 23 Aug 2024 09:52:55 -0400 Subject: [PATCH 051/173] chore: fix build --- .../ui/src/providers/Config/createClientConfig/collections.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/ui/src/providers/Config/createClientConfig/collections.tsx b/packages/ui/src/providers/Config/createClientConfig/collections.tsx index d5c6a903cf6..07695ee6773 100644 --- a/packages/ui/src/providers/Config/createClientConfig/collections.tsx +++ b/packages/ui/src/providers/Config/createClientConfig/collections.tsx @@ -51,7 +51,6 @@ export const createClientCollectionConfig = ({ 'access', 'endpoints', 'custom', - 'joins', // `upload` // `admin` // are all handled separately From 9b5b90ba976da8ea38df81d084c6faf91ad48d0f Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Fri, 23 Aug 2024 11:15:42 -0400 Subject: [PATCH 052/173] wires column sort --- packages/ui/src/elements/SortColumn/index.tsx | 18 ++------ test/joins/payload-types.ts | 42 ++++++++++++++++++- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/packages/ui/src/elements/SortColumn/index.tsx b/packages/ui/src/elements/SortColumn/index.tsx index e5319c8b27a..72828a113c7 100644 --- a/packages/ui/src/elements/SortColumn/index.tsx +++ b/packages/ui/src/elements/SortColumn/index.tsx @@ -1,8 +1,7 @@ 'use client' import type { FieldBase } from 'payload' -// TODO: abstract the `next/navigation` dependency out from this component -import React, { useCallback } from 'react' +import React from 'react' import { ChevronIcon } from '../../icons/Chevron/index.js' import { useListQuery } from '../../providers/ListQuery/index.js' @@ -22,7 +21,7 @@ const baseClass = 'sort-column' export const SortColumn: React.FC = (props) => { const { name, Label, disable = false, label } = props const { searchParams } = useSearchParams() - const { refineListData } = useListQuery() + const { handleSortChange } = useListQuery() const { t } = useTranslation() const { sort } = searchParams @@ -36,15 +35,6 @@ export const SortColumn: React.FC = (props) => { const descClasses = [`${baseClass}__desc`] if (sort === desc) descClasses.push(`${baseClass}--active`) - const setSort = useCallback( - async (newSort: string) => { - await refineListData({ - sort: newSort, - }) - }, - [refineListData], - ) - return (
{Label} @@ -56,7 +46,7 @@ export const SortColumn: React.FC = (props) => { label, })} className={[...ascClasses, `${baseClass}__button`].filter(Boolean).join(' ')} - onClick={() => void setSort(asc)} + onClick={() => void handleSortChange(asc)} type="button" > @@ -67,7 +57,7 @@ export const SortColumn: React.FC = (props) => { label, })} className={[...descClasses, `${baseClass}__button`].filter(Boolean).join(' ')} - onClick={() => void setSort(desc)} + onClick={() => void handleSortChange(desc)} type="button" > diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 7c57f735b4b..c3646d7b6d4 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -67,7 +67,34 @@ export interface Post { export interface Category { id: string; name?: string | null; - group?: {}; + posts?: { + docs?: (string | Post)[] | null; + hasNextPage?: boolean | null; + hasPrevPage?: boolean | null; + limit?: number | null; + nextPage?: number | null; + offset?: number | null; + page?: number | null; + pagingCounter?: number | null; + prevPage?: number | null; + totalDocs?: number | null; + totalPages?: number | null; + } | null; + group?: { + posts?: { + docs?: (string | Post)[] | null; + hasNextPage?: boolean | null; + hasPrevPage?: boolean | null; + limit?: number | null; + nextPage?: number | null; + offset?: number | null; + page?: number | null; + pagingCounter?: number | null; + prevPage?: number | null; + totalDocs?: number | null; + totalPages?: number | null; + } | null; + }; updatedAt: string; createdAt: string; } @@ -89,6 +116,19 @@ export interface LocalizedPost { export interface LocalizedCategory { id: string; name?: string | null; + posts?: { + docs?: (string | LocalizedPost)[] | null; + hasNextPage?: boolean | null; + hasPrevPage?: boolean | null; + limit?: number | null; + nextPage?: number | null; + offset?: number | null; + page?: number | null; + pagingCounter?: number | null; + prevPage?: number | null; + totalDocs?: number | null; + totalPages?: number | null; + } | null; updatedAt: string; createdAt: string; } From 1004275561e348aebe628431fb575e9328275547 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 23 Aug 2024 11:22:44 -0400 Subject: [PATCH 053/173] chore: add where support to joins --- .../rest/utilities/sanitizeJoinParams.ts | 2 ++ .../src/fields/hooks/afterRead/promise.ts | 8 +++++--- packages/payload/src/types/index.ts | 1 + test/joins/int.spec.ts | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts b/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts index 473149da5dd..caa0f0110d1 100644 --- a/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts +++ b/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts @@ -14,6 +14,7 @@ export const sanitizeJoinParams = ( page?: unknown pagination?: unknown sort?: string + where?: unknown } } | false = {}, @@ -30,6 +31,7 @@ export const sanitizeJoinParams = ( ? true : undefined, sort: joins[schemaPath]?.sort ? joins[schemaPath].sort : undefined, + where: joins[schemaPath]?.where ? joins[schemaPath].where : undefined, } }) diff --git a/packages/payload/src/fields/hooks/afterRead/promise.ts b/packages/payload/src/fields/hooks/afterRead/promise.ts index 655f7c2fb8f..7ceb8b8e3c4 100644 --- a/packages/payload/src/fields/hooks/afterRead/promise.ts +++ b/packages/payload/src/fields/hooks/afterRead/promise.ts @@ -4,6 +4,7 @@ import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' import type { JoinQuery, JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' import type { Field, TabAsField } from '../../config/types.js' +import { combineQueries } from '../../../database/combineQueries.js' import { MissingEditorProp } from '../../../errors/index.js' import { fieldAffectsData, tabHasName } from '../../config/types.js' import { getDefaultValue } from '../../getDefaultValue.js' @@ -191,7 +192,8 @@ export const promise = async ({ break } const joinQuery = joins?.[fieldSchemaPath.join('.')] || {} - const { limit, page, pagination = true, sort } = joinQuery + const { limit, page, pagination = true, sort, where } = joinQuery + populationPromises.push( req.payload .find({ @@ -204,9 +206,9 @@ export const promise = async ({ pagination, req, sort, - where: { + where: combineQueries(where, { [field.on]: { equals: doc.id }, - }, + }), }) .then((result) => { siblingDoc[field.name] = result diff --git a/packages/payload/src/types/index.ts b/packages/payload/src/types/index.ts index f6a359977cd..b80ea113505 100644 --- a/packages/payload/src/types/index.ts +++ b/packages/payload/src/types/index.ts @@ -119,6 +119,7 @@ export type JoinQuery = page?: number pagination?: boolean sort?: string + where?: Where } } | false diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index 83f0d2c7893..ebecddd69c7 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -79,6 +79,25 @@ describe('Joins Field Tests', () => { expect(categoryWithPosts.posts.docs[0].title).toStrictEqual('test 9') }) + it('should filter joins using where query', async () => { + const categoryWithPosts = await payload.findByID({ + id: category.id, + joins: { + posts: { + sort: '-title', + where: { + title: { + equals: 'test 9', + }, + }, + }, + }, + collection: 'categories', + }) + + expect(categoryWithPosts.posts.docs).toHaveLength(1) + }) + it('should populate joins using find', async () => { const result = await payload.find({ collection: 'categories', From 86797ada44d3e7e75c19b0862a54b14354d250e4 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 23 Aug 2024 11:39:45 -0400 Subject: [PATCH 054/173] chore: revert simple approach --- packages/db-mongodb/src/find.ts | 32 +++++++- packages/db-mongodb/src/findOne.ts | 20 +++-- packages/db-mongodb/src/utilities/setJoins.ts | 76 +++++++++++++++++++ .../drizzle/src/find/buildFindManyArgs.ts | 5 +- packages/drizzle/src/find/findMany.ts | 2 + packages/drizzle/src/find/traverseFields.ts | 53 ++++++++++++- .../payload/src/collections/config/client.ts | 4 +- .../src/collections/config/sanitize.ts | 11 ++- .../payload/src/collections/config/types.ts | 16 ++++ .../src/collections/operations/create.ts | 1 - .../src/collections/operations/find.ts | 2 +- .../src/collections/operations/findByID.ts | 2 +- .../src/collections/operations/update.ts | 3 - packages/payload/src/database/types.ts | 4 +- .../payload/src/fields/config/sanitize.ts | 42 ++++++++-- .../src/fields/hooks/afterRead/index.ts | 5 +- .../src/fields/hooks/afterRead/promise.ts | 40 +--------- .../relationshipPopulationPromise.ts | 40 ++++++---- .../fields/hooks/afterRead/traverseFields.ts | 5 +- test/buildConfigWithDefaults.ts | 4 + test/joins/int.spec.ts | 8 +- 21 files changed, 286 insertions(+), 89 deletions(-) create mode 100644 packages/db-mongodb/src/utilities/setJoins.ts diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index 450414fb103..9d3b2498aa5 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -7,11 +7,23 @@ import type { MongooseAdapter } from './index.js' import { buildSortParam } from './queries/buildSortParam.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' +import { setJoins } from './utilities/setJoins.js' import { withSession } from './withSession.js' export const find: Find = async function find( this: MongooseAdapter, - { collection, limit, locale, page, pagination, req = {} as PayloadRequest, sort: sortArg, where }, + { + collection, + joins, + limit, + locale, + page, + pagination, + projection, + req = {} as PayloadRequest, + sort: sortArg, + where, + }, ) { const Model = this.collections[collection] const collectionConfig = this.payload.collections[collection].config @@ -50,6 +62,7 @@ export const find: Find = async function find( options, page, pagination, + projection, sort, useEstimatedCount, } @@ -89,6 +102,23 @@ export const find: Find = async function find( } const result = await Model.paginate(query, paginationOptions) + + const joinPromises = [] + + result.docs.forEach((doc) => { + joinPromises.push( + setJoins({ + collection, + doc, + joins, + payload: this.payload, + req, + }), + ) + }) + + await Promise.all(joinPromises) + const docs = JSON.parse(JSON.stringify(result.docs)) return { diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index c17e93aea00..b8e2a55bbe1 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -1,17 +1,18 @@ -import type { MongooseQueryOptions } from 'mongoose' -import type { Document, FindOne, PayloadRequest } from 'payload' +import type { QueryOptions } from 'mongoose' +import type { FindOne, PayloadRequest } from 'payload' import type { MongooseAdapter } from './index.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' +import { setJoins } from './utilities/setJoins.js' import { withSession } from './withSession.js' export const findOne: FindOne = async function findOne( this: MongooseAdapter, - { collection, locale, req = {} as PayloadRequest, where }, + { collection, joins, locale, req = {} as PayloadRequest, where }, ) { const Model = this.collections[collection] - const options: MongooseQueryOptions = { + const options: QueryOptions = { ...(await withSession(this, req)), lean: true, } @@ -28,7 +29,16 @@ export const findOne: FindOne = async function findOne( return null } - let result: Document = JSON.parse(JSON.stringify(doc)) + let result = await setJoins({ + collection, + doc, + joins, + locale, + payload: this.payload, + req, + }) + + result = JSON.parse(JSON.stringify(result)) // custom id type reset result.id = result._id diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts new file mode 100644 index 00000000000..9ad76a32863 --- /dev/null +++ b/packages/db-mongodb/src/utilities/setJoins.ts @@ -0,0 +1,76 @@ +import type { Document, FindArgs, JoinQuery, Payload } from 'payload' + +type Args = { + collection: string + doc: Document + joins: JoinQuery + payload: Payload +} & FindArgs + +/** + * fetch docs and add to the keys by path, mutating and returning the doc with paginated results + */ +export const setJoins = async ({ + collection, + doc, + joins = {}, + locale, + payload, + req, +}: Args): Promise => { + // TODO: allow disabling of joining at the top level using `joins: false` or `?joins=false` + // if (joins === false) return doc + const joinConfig = payload.collections[collection].config.joins + + const promises = [] + + Object.keys(joinConfig).forEach((slug) => { + joinConfig[slug].forEach((join) => { + // get the query options for the join off of req + // TODO: allow disabling the join completely + // if (joins[join.schemaPath] === false || req.query[join.schemaPath] === 'false') { + // continue + // } + + const { limit, page, pagination = true, sort } = joins[join.schemaPath] || {} + + promises.push( + payload.db + .find({ + collection: slug, + limit, + locale, + page, + pagination, + projection: { + _id: 1, + }, + req, + sort, + where: { + [join.field.on]: { equals: doc._id.toString() }, + }, + }) + .then((data) => { + // iterate schemaPath and assign to the document + const path = join.schemaPath.split('.') + let current = doc + for (let i = 0; i <= path.length - 1; i++) { + if (i === path.length - 1) { + current[path[i]] = data + } else { + if (!current[path[i]]) { + current[path[i]] = {} + } + current = current[path[i]] + } + } + }), + ) + }) + }) + + await Promise.all(promises) + + return doc +} diff --git a/packages/drizzle/src/find/buildFindManyArgs.ts b/packages/drizzle/src/find/buildFindManyArgs.ts index 8a062c2a2e7..861225aa587 100644 --- a/packages/drizzle/src/find/buildFindManyArgs.ts +++ b/packages/drizzle/src/find/buildFindManyArgs.ts @@ -1,5 +1,5 @@ import type { DBQueryConfig } from 'drizzle-orm' -import type { Field } from 'payload' +import type { Field, JoinQuery } from 'payload' import type { DrizzleAdapter } from '../types.js' @@ -9,6 +9,7 @@ type BuildFindQueryArgs = { adapter: DrizzleAdapter depth: number fields: Field[] + joinQuery?: JoinQuery locale?: string tableName: string } @@ -25,6 +26,7 @@ export const buildFindManyArgs = ({ adapter, depth, fields, + joinQuery, locale, tableName, }: BuildFindQueryArgs): Record => { @@ -81,6 +83,7 @@ export const buildFindManyArgs = ({ currentTableName: tableName, depth, fields, + joinQuery, locale, path: '', topLevelArgs: result, diff --git a/packages/drizzle/src/find/findMany.ts b/packages/drizzle/src/find/findMany.ts index 5d5fad0a297..4ff102718dd 100644 --- a/packages/drizzle/src/find/findMany.ts +++ b/packages/drizzle/src/find/findMany.ts @@ -19,6 +19,7 @@ type Args = { export const findMany = async function find({ adapter, fields, + joins: joinQuery, limit: limitArg, locale, page = 1, @@ -67,6 +68,7 @@ export const findMany = async function find({ adapter, depth: 0, fields, + joinQuery, tableName, }) diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index 36e7668c22e..8a582c7aca9 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -1,11 +1,15 @@ -import type { Field } from 'payload' +import type { DBQueryConfig } from 'drizzle-orm' +import type { Field, JoinQuery } from 'payload' +import { APIError } from 'payload' import { fieldAffectsData, tabHasName } from 'payload/shared' import toSnakeCase from 'to-snake-case' import type { DrizzleAdapter } from '../types.js' import type { Result } from './buildFindManyArgs.js' +import { buildOrderBy } from '../queries/buildOrderBy.js' + type TraverseFieldArgs = { _locales: Result adapter: DrizzleAdapter @@ -13,6 +17,7 @@ type TraverseFieldArgs = { currentTableName: string depth?: number fields: Field[] + joinQuery: JoinQuery locale?: string path: string topLevelArgs: Record @@ -26,6 +31,7 @@ export const traverseFields = ({ currentTableName, depth, fields, + joinQuery = {}, locale, path, topLevelArgs, @@ -54,6 +60,7 @@ export const traverseFields = ({ currentTableName, depth, fields: field.fields, + joinQuery, path, topLevelArgs, topLevelTableName, @@ -73,6 +80,7 @@ export const traverseFields = ({ currentTableName, depth, fields: tab.fields, + joinQuery, path: tabPath, topLevelArgs, topLevelTableName, @@ -117,6 +125,7 @@ export const traverseFields = ({ currentTableName: arrayTableName, depth, fields: field.fields, + joinQuery, path: '', topLevelArgs, topLevelTableName, @@ -173,6 +182,7 @@ export const traverseFields = ({ currentTableName: tableName, depth, fields: block.fields, + joinQuery, path: '', topLevelArgs, topLevelTableName, @@ -190,6 +200,7 @@ export const traverseFields = ({ currentTableName, depth, fields: field.fields, + joinQuery, path: `${path}${field.name}_`, topLevelArgs, topLevelTableName, @@ -197,6 +208,46 @@ export const traverseFields = ({ break + case 'join': { + // when `joinsQuery` is false, do not join + if (joinQuery !== false) { + const { limit = 10, page = 1, sort } = joinQuery[`${path}${field.name}`] || {} + if (page !== 1) { + // we need a second query in read step to complete the join because drizzle doesn't support offset + throw new APIError('Pagination is not supported for joins') + } + const fields = adapter.payload.collections[field.collection].config.fields + const joinTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${ + field.localized && adapter.payload.config.localization ? adapter.localesSuffix : '' + }` + const selectFields = {} + const orderBy = buildOrderBy({ + adapter, + fields, + joins: [], + locale, + selectFields, + sort, + tableName: joinTableName, + }) + const withJoin: DBQueryConfig<'many', true, any, any> = { + columns: { + id: true, + ...selectFields, + }, + // TODO: join a custom query to handle count + // extras: {}, + limit, + orderBy: () => [orderBy.order(orderBy.column)], + } + if (field.localized) { + withJoin.columns._locale = true + } + currentArgs.with[toSnakeCase(`${path}${field.name}`)] = withJoin + } + break + } + default: { break } diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index 6e677117e04..fddb6a19ad1 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -6,7 +6,7 @@ import type { SanitizedCollectionConfig } from './types.js' export type ServerOnlyCollectionProperties = keyof Pick< SanitizedCollectionConfig, - 'access' | 'custom' | 'endpoints' | 'hooks' + 'access' | 'custom' | 'endpoints' | 'hooks' | 'joins' > export type ServerOnlyCollectionAdminProperties = keyof Pick< @@ -49,7 +49,7 @@ export type ClientCollectionConfig = { livePreview?: Omit } & Omit< SanitizedCollectionConfig['admin'], - 'components' | 'description' | 'livePreview' | ServerOnlyCollectionAdminProperties + 'components' | 'description' | 'joins' | 'livePreview' | ServerOnlyCollectionAdminProperties > fields: ClientField[] } & Omit diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index 362bd690f9e..330c85393ce 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -1,6 +1,6 @@ import type { LoginWithUsernameOptions } from '../../auth/types.js' import type { Config, SanitizedConfig } from '../../config/types.js' -import type { CollectionConfig, SanitizedCollectionConfig } from './types.js' +import type { CollectionConfig, SanitizedCollectionConfig, SanitizedJoins } from './types.js' import { getBaseAuthFields } from '../../auth/getAuthFields.js' import { TimestampsRequired } from '../../errors/TimestampsRequired.js' @@ -35,11 +35,14 @@ export const sanitizeCollection = async ( // ///////////////////////////////// const validRelationships = config.collections.map((c) => c.slug) || [] + const joins: SanitizedJoins = {} sanitized.fields = await sanitizeFields({ collectionConfig: sanitized, config, fields: sanitized.fields, + joins, richTextSanitizationPromises, + schemaPath: '', validRelationships, }) @@ -177,5 +180,9 @@ export const sanitizeCollection = async ( sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth)) } - return sanitized as SanitizedCollectionConfig + const sanitizedConfig = sanitized as SanitizedCollectionConfig + + sanitizedConfig.joins = joins + + return sanitizedConfig } diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 1321969ec5d..6acb5e84edb 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -470,6 +470,21 @@ export type CollectionConfig = { versions?: IncomingCollectionVersions | boolean } +export type SanitizedJoin = { + /** + * The field configuration defining the join + */ + field: JoinField + /** + * The schemaPath of the join field in dot notation + */ + schemaPath: string +} + +export type SanitizedJoins = { + [collectionSlug: string]: SanitizedJoin[] +} + export interface SanitizedCollectionConfig extends Omit< DeepRequired, @@ -481,6 +496,7 @@ export interface SanitizedCollectionConfig /** * Object of collections to join 'Join Fields object keyed by collection */ + joins: SanitizedJoins upload: SanitizedUploadConfig versions: SanitizedCollectionVersions } diff --git a/packages/payload/src/collections/operations/create.ts b/packages/payload/src/collections/operations/create.ts index 4e12b31dd66..2d5c88f073f 100644 --- a/packages/payload/src/collections/operations/create.ts +++ b/packages/payload/src/collections/operations/create.ts @@ -289,7 +289,6 @@ export const createOperation = async ( draft, fallbackLocale, global: null, - joins: false, locale, overrideAccess, req, diff --git a/packages/payload/src/collections/operations/find.ts b/packages/payload/src/collections/operations/find.ts index 121155bd6ef..4dc0f5b7898 100644 --- a/packages/payload/src/collections/operations/find.ts +++ b/packages/payload/src/collections/operations/find.ts @@ -142,6 +142,7 @@ export const findOperation = async ( result = await payload.db.find>({ collection: collectionConfig.slug, + joins, limit: sanitizedLimit, locale, page: sanitizedPage, @@ -198,7 +199,6 @@ export const findOperation = async ( fallbackLocale, findMany: true, global: null, - joins, locale, overrideAccess, req, diff --git a/packages/payload/src/collections/operations/findByID.ts b/packages/payload/src/collections/operations/findByID.ts index bbef564d2e3..1682243aee3 100644 --- a/packages/payload/src/collections/operations/findByID.ts +++ b/packages/payload/src/collections/operations/findByID.ts @@ -74,6 +74,7 @@ export const findByIDOperation = async ( const findOneArgs: FindOneArgs = { collection: collectionConfig.slug, + joins, locale, req: { transactionID: req.transactionID, @@ -142,7 +143,6 @@ export const findByIDOperation = async ( draft: draftEnabled, fallbackLocale, global: null, - joins, locale, overrideAccess, req, diff --git a/packages/payload/src/collections/operations/update.ts b/packages/payload/src/collections/operations/update.ts index be68d190e70..3e1e49d8f61 100644 --- a/packages/payload/src/collections/operations/update.ts +++ b/packages/payload/src/collections/operations/update.ts @@ -185,8 +185,6 @@ export const updateOperation = async ( draft: draftArg, fallbackLocale, global: null, - // TODO: joins needs to come from args - joins: {}, locale, overrideAccess: true, req, @@ -337,7 +335,6 @@ export const updateOperation = async ( draft: draftArg, fallbackLocale: null, global: null, - joins: false, locale, overrideAccess, req, diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 2dffceb6053..7725a4b35f3 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -1,5 +1,5 @@ import type { TypeWithID } from '../collections/config/types.js' -import type { Document, Payload, PayloadRequest, Where } from '../types/index.js' +import type { Document, JoinQuery, Payload, PayloadRequest, Where } from '../types/index.js' import type { TypeWithVersion } from '../versions/types.js' export type { TypeWithVersion } @@ -185,6 +185,7 @@ export type QueryDrafts = (args: QueryDraftsArgs) => Promise(args: FindOneArgs) => Promise fields: Field[] + joins?: SanitizedJoins /** * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present. * @@ -34,7 +36,7 @@ type Args = { * so that you can sanitize them together, after the config has been sanitized. */ richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise> - + schemaPath?: string /** * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array. * This validation will be skipped if validRelationships is null. @@ -47,12 +49,16 @@ export const sanitizeFields = async ({ config, existingFieldNames = new Set(), fields, + joins, requireFieldLevelRichTextEditor = false, richTextSanitizationPromises, + schemaPath: schemaPathArg, validRelationships, }: Args): Promise => { if (!fields) return [] + let schemaPath = schemaPathArg + for (let i = 0; i < fields.length; i++) { const field = fields[i] @@ -87,6 +93,22 @@ export const sanitizeFields = async ({ field.defaultValue = false } + if (field.type === 'join') { + if (typeof joins === 'undefined') { + throw new APIError( + 'Join fields cannot be added to arrays or blocks to avoid duplicate data.', + ) + } + const join = { + field, + schemaPath: `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}`, + } + if (!joins[field.collection]) { + joins[field.collection] = [join] + } else { + joins[field.collection].push(join) + } + } if (field.type === 'relationship' || field.type === 'upload') { if (validRelationships) { const relationships = Array.isArray(field.relationTo) @@ -209,12 +231,17 @@ export const sanitizeFields = async ({ } if ('fields' in field && field.fields) { + if ('name' in field && field.name) { + schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}` + } field.fields = await sanitizeFields({ config, existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames, fields: field.fields, + joins, requireFieldLevelRichTextEditor, richTextSanitizationPromises, + schemaPath, validRelationships, }) } @@ -222,16 +249,21 @@ export const sanitizeFields = async ({ if (field.type === 'tabs') { for (let j = 0; j < field.tabs.length; j++) { const tab = field.tabs[j] - if (tabHasName(tab) && typeof tab.label === 'undefined') { - tab.label = toWords(tab.name) + if (tabHasName(tab)) { + schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${tab.name}` + if (typeof tab.label === 'undefined') { + tab.label = toWords(tab.name) + } } tab.fields = await sanitizeFields({ config, existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames, fields: tab.fields, + joins, requireFieldLevelRichTextEditor, richTextSanitizationPromises, + schemaPath, validRelationships, }) field.tabs[j] = tab diff --git a/packages/payload/src/fields/hooks/afterRead/index.ts b/packages/payload/src/fields/hooks/afterRead/index.ts index 389beeda938..30dfc2c543a 100644 --- a/packages/payload/src/fields/hooks/afterRead/index.ts +++ b/packages/payload/src/fields/hooks/afterRead/index.ts @@ -1,6 +1,6 @@ import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' -import type { JoinQuery, JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' +import type { JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' import { deepCopyObjectSimple } from '../../../utilities/deepCopyObject.js' import { traverseFields } from './traverseFields.js' @@ -16,7 +16,6 @@ type Args = { findMany?: boolean flattenLocales?: boolean global: SanitizedGlobalConfig | null - joins?: JoinQuery locale: string overrideAccess: boolean req: PayloadRequest @@ -45,7 +44,6 @@ export async function afterRead(args: Args): Promise findMany, flattenLocales = true, global, - joins, locale, overrideAccess, req, @@ -77,7 +75,6 @@ export async function afterRead(args: Args): Promise findMany, flattenLocales, global, - joins, locale, overrideAccess, path: [], diff --git a/packages/payload/src/fields/hooks/afterRead/promise.ts b/packages/payload/src/fields/hooks/afterRead/promise.ts index 7ceb8b8e3c4..a7d87b40782 100644 --- a/packages/payload/src/fields/hooks/afterRead/promise.ts +++ b/packages/payload/src/fields/hooks/afterRead/promise.ts @@ -1,10 +1,9 @@ import type { RichTextAdapter } from '../../../admin/RichText.js' import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' -import type { JoinQuery, JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' +import type { JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' import type { Field, TabAsField } from '../../config/types.js' -import { combineQueries } from '../../../database/combineQueries.js' import { MissingEditorProp } from '../../../errors/index.js' import { fieldAffectsData, tabHasName } from '../../config/types.js' import { getDefaultValue } from '../../getDefaultValue.js' @@ -28,7 +27,6 @@ type Args = { findMany: boolean flattenLocales: boolean global: SanitizedGlobalConfig | null - joins: JoinQuery locale: null | string overrideAccess: boolean /** @@ -51,7 +49,6 @@ type Args = { // - Remove hidden fields from response // - Flatten locales into requested locale // - Sanitize outgoing data (point field, etc.) -// - Populate joins // - Execute field hooks // - Execute read access control // - Populate relationships @@ -69,7 +66,6 @@ export const promise = async ({ findMany, flattenLocales, global, - joins, locale, overrideAccess, parentPath, @@ -186,37 +182,6 @@ export const promise = async ({ break } - // Populate joins - case 'join': { - if (joins === false) { - break - } - const joinQuery = joins?.[fieldSchemaPath.join('.')] || {} - const { limit, page, pagination = true, sort, where } = joinQuery - - populationPromises.push( - req.payload - .find({ - collection: field.collection, - // only join the first level of joins - depth: 0, - joins: false, - limit, - page, - pagination, - req, - sort, - where: combineQueries(where, { - [field.on]: { equals: doc.id }, - }), - }) - .then((result) => { - siblingDoc[field.name] = result - }), - ) - break - } - default: { break } @@ -323,7 +288,7 @@ export const promise = async ({ }) } - if (field.type === 'relationship' || field.type === 'upload') { + if (field.type === 'relationship' || field.type === 'upload' || field.type === 'join') { populationPromises.push( relationshipPopulationPromise({ currentDepth, @@ -359,7 +324,6 @@ export const promise = async ({ findMany, flattenLocales, global, - joins, locale, overrideAccess, path: fieldPath, diff --git a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts index 28706e10b08..ee73094478e 100644 --- a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts +++ b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts @@ -1,5 +1,5 @@ -import type { JoinQuery, PayloadRequest } from '../../../types/index.js' -import type { RelationshipField, UploadField } from '../../config/types.js' +import type { PayloadRequest } from '../../../types/index.js' +import type { JoinField, RelationshipField, UploadField } from '../../config/types.js' import { createDataloaderCacheKey } from '../../../collections/dataloader.js' import { fieldHasMaxDepth, fieldSupportsMany } from '../../config/types.js' @@ -11,9 +11,8 @@ type PopulateArgs = { depth: number draft: boolean fallbackLocale: null | string - field: RelationshipField | UploadField + field: JoinField | RelationshipField | UploadField index?: number - joins?: JoinQuery key?: string locale: null | string overrideAccess: boolean @@ -37,11 +36,16 @@ const populate = async ({ showHiddenFields, }: PopulateArgs) => { const dataToUpdate = dataReference - const relation = Array.isArray(field.relationTo) ? (data.relationTo as string) : field.relationTo + let relation + if (field.type === 'join') { + relation = field.collection + } else { + relation = Array.isArray(field.relationTo) ? (data.relationTo as string) : field.relationTo + } const relatedCollection = req.payload.collections[relation] if (relatedCollection) { - let id = Array.isArray(field.relationTo) ? data.value : data + let id = field.type === 'relationship' && Array.isArray(field.relationTo) ? data.value : data let relationshipValue const shouldPopulate = depth && currentDepth <= depth @@ -77,18 +81,18 @@ const populate = async ({ } if (typeof index === 'number' && typeof key === 'string') { - if (Array.isArray(field.relationTo)) { + if (field.type === 'relationship' && Array.isArray(field.relationTo)) { dataToUpdate[field.name][key][index].value = relationshipValue } else { dataToUpdate[field.name][key][index] = relationshipValue } } else if (typeof index === 'number' || typeof key === 'string') { - if (Array.isArray(field.relationTo)) { + if (field.type === 'relationship' && Array.isArray(field.relationTo)) { dataToUpdate[field.name][index ?? key].value = relationshipValue } else { - dataToUpdate[field.name][index ?? key] = relationshipValue + dataToUpdate[field.name].docs[index ?? key] = relationshipValue } - } else if (Array.isArray(field.relationTo)) { + } else if (field.type === 'relationship' && Array.isArray(field.relationTo)) { dataToUpdate[field.name].value = relationshipValue } else { dataToUpdate[field.name] = relationshipValue @@ -101,7 +105,7 @@ type PromiseArgs = { depth: number draft: boolean fallbackLocale: null | string - field: RelationshipField | UploadField + field: JoinField | RelationshipField | UploadField locale: null | string overrideAccess: boolean req: PayloadRequest @@ -125,7 +129,7 @@ export const relationshipPopulationPromise = async ({ const populateDepth = fieldHasMaxDepth(field) && field.maxDepth < depth ? field.maxDepth : depth const rowPromises = [] - if (fieldSupportsMany(field) && field.hasMany) { + if (field.type === 'join' || (fieldSupportsMany(field) && field.hasMany)) { if ( field.localized && locale === 'all' && @@ -156,13 +160,19 @@ export const relationshipPopulationPromise = async ({ }) } }) - } else if (Array.isArray(siblingDoc[field.name])) { - siblingDoc[field.name].forEach((relatedDoc, index) => { + } else if ( + Array.isArray(siblingDoc[field.name]) || + Array.isArray(siblingDoc[field.name]?.docs) + ) { + ;(Array.isArray(siblingDoc[field.name]) + ? siblingDoc[field.name] + : siblingDoc[field.name].docs + ).forEach((relatedDoc, index) => { const rowPromise = async () => { if (relatedDoc) { await populate({ currentDepth, - data: relatedDoc, + data: relatedDoc?.id ? relatedDoc.id : relatedDoc, dataReference: resultingDoc, depth: populateDepth, draft, diff --git a/packages/payload/src/fields/hooks/afterRead/traverseFields.ts b/packages/payload/src/fields/hooks/afterRead/traverseFields.ts index 92eedd6c516..8098b59b522 100644 --- a/packages/payload/src/fields/hooks/afterRead/traverseFields.ts +++ b/packages/payload/src/fields/hooks/afterRead/traverseFields.ts @@ -1,6 +1,6 @@ import type { SanitizedCollectionConfig } from '../../../collections/config/types.js' import type { SanitizedGlobalConfig } from '../../../globals/config/types.js' -import type { JoinQuery, JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' +import type { JsonObject, PayloadRequest, RequestContext } from '../../../types/index.js' import type { Field, TabAsField } from '../../config/types.js' import { promise } from './promise.js' @@ -21,7 +21,6 @@ type Args = { findMany: boolean flattenLocales: boolean global: SanitizedGlobalConfig | null - joins?: JoinQuery locale: null | string overrideAccess: boolean path: (number | string)[] @@ -47,7 +46,6 @@ export const traverseFields = ({ findMany, flattenLocales, global, - joins, locale, overrideAccess, path, @@ -74,7 +72,6 @@ export const traverseFields = ({ findMany, flattenLocales, global, - joins, locale, overrideAccess, parentPath: path, diff --git a/test/buildConfigWithDefaults.ts b/test/buildConfigWithDefaults.ts index 40094d9eb08..6b6b8ee99ec 100644 --- a/test/buildConfigWithDefaults.ts +++ b/test/buildConfigWithDefaults.ts @@ -35,6 +35,10 @@ import { reInitEndpoint } from './helpers/reInit.js' import { localAPIEndpoint } from './helpers/sdk/endpoint.js' import { testEmailAdapter } from './testEmailAdapter.js' +// process.env.POSTGRES_URL = 'postgres://postgres:postgres@127.0.0.1:5432/payloadtests' +// process.env.PAYLOAD_DATABASE = 'postgres' +// process.env.PAYLOAD_DATABASE = 'sqlite' + export async function buildConfigWithDefaults( testConfig?: Partial, options?: { diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index ebecddd69c7..07756ce99ed 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -73,10 +73,10 @@ describe('Joins Field Tests', () => { collection: 'categories', }) - expect(categoryWithPosts.posts.docs).toHaveLength(10) - expect(categoryWithPosts.posts.docs[0]).toHaveProperty('id') - expect(categoryWithPosts.posts.docs[0]).toHaveProperty('title') - expect(categoryWithPosts.posts.docs[0].title).toStrictEqual('test 9') + expect(categoryWithPosts.group.posts.docs).toHaveLength(10) + expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('id') + expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('title') + expect(categoryWithPosts.group.posts.docs[0].title).toStrictEqual('test 9') }) it('should filter joins using where query', async () => { From b5638caedc6dc16944dae68a7fea2225f12297ef Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Fri, 23 Aug 2024 11:42:25 -0400 Subject: [PATCH 055/173] updates parent field when in drawer updates --- .../ui/src/elements/DocumentDrawer/types.ts | 2 +- .../cells/DrawerLink/index.tsx | 14 +++++--- .../src/elements/RelationshipTable/index.tsx | 35 +++++++++++++++---- packages/ui/src/fields/Join/index.tsx | 2 +- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/packages/ui/src/elements/DocumentDrawer/types.ts b/packages/ui/src/elements/DocumentDrawer/types.ts index 040fc23d9de..96395be916d 100644 --- a/packages/ui/src/elements/DocumentDrawer/types.ts +++ b/packages/ui/src/elements/DocumentDrawer/types.ts @@ -18,7 +18,7 @@ export type DocumentTogglerProps = { readonly disabled?: boolean readonly drawerSlug?: string readonly id?: string -} & HTMLAttributes +} & Readonly> export type UseDocumentDrawer = (args: { collectionSlug: string; id?: number | string }) => [ React.FC>, // drawer diff --git a/packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.tsx b/packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.tsx index 1ee3ceb4c97..c6fd86ac5f0 100644 --- a/packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/cells/DrawerLink/index.tsx @@ -1,17 +1,23 @@ 'use client' -import type { CellComponentProps } from 'payload' +import type { CellComponentProps, JoinFieldClient } from 'payload' import React from 'react' +import type { DocumentDrawerProps } from '../../../DocumentDrawer/types.js' + import { EditIcon } from '../../../../icons/Edit/index.js' import { useDocumentDrawer } from '../../../DocumentDrawer/index.js' import { DefaultCell } from '../../../Table/DefaultCell/index.js' import { useTableCell } from '../../../Table/index.js' import './index.scss' -export const DrawerLink: React.FC = (props) => { +export const DrawerLink: React.FC< + { + readonly onDrawerSave?: DocumentDrawerProps['onSave'] + } & CellComponentProps +> = (props) => { const context = useTableCell() - const { field } = props + const { field, onDrawerSave } = props const { cellProps, @@ -30,7 +36,7 @@ export const DrawerLink: React.FC = (props) => { - +
) } diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 0ff64a8a3ae..5d118fb8369 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -2,17 +2,20 @@ import type { ClientCollectionConfig, ClientField, + JoinFieldClient, JoinFieldProps, PaginatedDocs, Where, } from 'payload' import { getTranslation } from '@payloadcms/translations' -import React, { useEffect, useReducer, useState } from 'react' +import React, { useCallback, useEffect, useReducer, useState } from 'react' import AnimateHeightImport from 'react-animate-height' const AnimateHeight = AnimateHeightImport.default || AnimateHeightImport +import type { DocumentDrawerProps } from '../DocumentDrawer/types.js' + import { Pill } from '../../elements/Pill/index.js' import { usePayloadAPI } from '../../hooks/usePayloadAPI.js' import { ChevronIcon } from '../../icons/Chevron/index.js' @@ -21,6 +24,7 @@ import { ListQueryProvider } from '../../providers/ListQuery/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { ColumnSelector } from '../ColumnSelector/index.js' import { useDocumentDrawer } from '../DocumentDrawer/index.js' +import { UseDocumentDrawer } from '../DocumentDrawer/types.js' import { hoistQueryParamsToAnd } from '../ListDrawer/DrawerContent.js' import { LoadingOverlay } from '../Loading/index.js' import { RelationshipProvider } from '../Table/RelationshipProvider/index.js' @@ -40,7 +44,7 @@ type RelationshipTableComponentProps = { } export const RelationshipTable: React.FC = (props) => { - const { Label, field, filterOptions, initialData, relationTo } = props + const { Label, field, filterOptions, initialData: initialDataFromProps, relationTo } = props const { config: { @@ -50,6 +54,8 @@ export const RelationshipTable: React.FC = (pro getEntityConfig, } = useConfig() + const [initialData, setInitialData] = useState(initialDataFromProps) + const { i18n, t } = useTranslation() const [limit, setLimit] = useState() @@ -129,6 +135,21 @@ export const RelationshipTable: React.FC = (pro collectionSlug: relationTo, }) + const onDrawerSave = useCallback( + (args) => { + const foundDocIndex = data?.docs?.findIndex((doc) => doc.id === args.doc.id) + if (foundDocIndex !== -1) { + const newDocs = [...data.docs] + newDocs[foundDocIndex] = args.doc + setInitialData({ + ...data, + docs: newDocs, + }) + } + }, + [data], + ) + const preferenceKey = `${relationTo}-list` if (isLoadingList) { @@ -198,10 +219,12 @@ export const RelationshipTable: React.FC = (pro components: { Cell: { type: 'client', - Component: DrawerLink, - clientProps: { - field, - }, + RenderedComponent: ( + + ), }, }, }, diff --git a/packages/ui/src/fields/Join/index.tsx b/packages/ui/src/fields/Join/index.tsx index 092aada0afe..9227bc346d6 100644 --- a/packages/ui/src/fields/Join/index.tsx +++ b/packages/ui/src/fields/Join/index.tsx @@ -2,7 +2,7 @@ import type { JoinFieldProps, PaginatedDocs } from 'payload' -import React from 'react' +import React, { useCallback } from 'react' import { RelationshipTable } from '../../elements/RelationshipTable/index.js' import { FieldLabel } from '../../fields/FieldLabel/index.js' From 1cd320100f13c7c4366345865b7c533be802553c Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Fri, 23 Aug 2024 12:27:29 -0400 Subject: [PATCH 056/173] fixes cell props lookup --- .../ui/src/elements/ColumnSelector/index.tsx | 6 ++--- .../src/elements/RelationshipTable/index.tsx | 5 ++-- packages/ui/src/elements/Table/index.tsx | 24 ++++++++++++++--- .../TableColumns/buildColumnState.tsx | 22 ++-------------- .../ui/src/elements/TableColumns/index.tsx | 26 +++++++++++-------- 5 files changed, 44 insertions(+), 39 deletions(-) diff --git a/packages/ui/src/elements/ColumnSelector/index.tsx b/packages/ui/src/elements/ColumnSelector/index.tsx index ec620843373..c91386f22e3 100644 --- a/packages/ui/src/elements/ColumnSelector/index.tsx +++ b/packages/ui/src/elements/ColumnSelector/index.tsx @@ -58,9 +58,9 @@ export const ColumnSelector: React.FC = ({ collectionSlug }) => { field: { admin: { // @ts-expect-error // TODO: `Label` does not exist on the UI field - components: { Label }, - }, - }, + components: { Label } = {}, + } = {}, + } = {}, }, } = col diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 5d118fb8369..934ff7d96c5 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -8,12 +8,13 @@ import type { Where, } from 'payload' -import { getTranslation } from '@payloadcms/translations' import React, { useCallback, useEffect, useReducer, useState } from 'react' import AnimateHeightImport from 'react-animate-height' const AnimateHeight = AnimateHeightImport.default || AnimateHeightImport +import { getTranslation } from '@payloadcms/translations' + import type { DocumentDrawerProps } from '../DocumentDrawer/types.js' import { Pill } from '../../elements/Pill/index.js' @@ -24,7 +25,6 @@ import { ListQueryProvider } from '../../providers/ListQuery/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { ColumnSelector } from '../ColumnSelector/index.js' import { useDocumentDrawer } from '../DocumentDrawer/index.js' -import { UseDocumentDrawer } from '../DocumentDrawer/types.js' import { hoistQueryParamsToAnd } from '../ListDrawer/DrawerContent.js' import { LoadingOverlay } from '../Loading/index.js' import { RelationshipProvider } from '../Table/RelationshipProvider/index.js' @@ -213,6 +213,7 @@ export const RelationshipTable: React.FC = (pro }, ]} cellProps={[ + {}, { field: { admin: { diff --git a/packages/ui/src/elements/Table/index.tsx b/packages/ui/src/elements/Table/index.tsx index b879ea2d41a..fc66f5c3c59 100644 --- a/packages/ui/src/elements/Table/index.tsx +++ b/packages/ui/src/elements/Table/index.tsx @@ -35,7 +35,7 @@ export const Table: React.FC = ({ customCellContext, data, }) => { - const { columns: columnsFromContext } = useTableColumns() + const { cellProps, columns: columnsFromContext } = useTableColumns() const columns = columnsFromProps || columnsFromContext @@ -76,8 +76,26 @@ export const Table: React.FC = ({ rowData={row} > diff --git a/packages/ui/src/elements/TableColumns/buildColumnState.tsx b/packages/ui/src/elements/TableColumns/buildColumnState.tsx index eb22b25f9ce..64532099949 100644 --- a/packages/ui/src/elements/TableColumns/buildColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildColumnState.tsx @@ -1,10 +1,5 @@ 'use client' -import type { - CellComponentProps, - ClientField, - SanitizedCollectionConfig, - StaticLabel, -} from 'payload' +import type { ClientField, SanitizedCollectionConfig, StaticLabel } from 'payload' import React from 'react' @@ -20,7 +15,6 @@ import { DefaultCell } from '../Table/DefaultCell/index.js' type Args = { beforeRows?: Column[] - cellProps: Partial[] columnPreferences: ColumnPreferences columns?: ColumnPreferences enableRowSelections: boolean @@ -30,15 +24,7 @@ type Args = { } export const buildColumnState = (args: Args): Column[] => { - const { - beforeRows, - cellProps, - columnPreferences, - columns, - enableRowSelections, - fields, - useAsTitle, - } = args + const { beforeRows, columnPreferences, columns, enableRowSelections, fields, useAsTitle } = args let sortedFieldMap = flattenFieldMap(fields) @@ -136,13 +122,10 @@ export const buildColumnState = (args: Args): Column[] => { accessor: 'name' in field ? field.name : undefined, active, cellProps: { - ...cellProps?.[index], field: { ...(field || ({} as ClientField)), - ...(cellProps?.[index]?.field || ({} as ClientField)), admin: { ...(field.admin || {}), - ...(cellProps?.[index]?.field?.admin || {}), components: { ...(field.admin?.components || {}), Cell: field.admin?.components?.Cell || { @@ -151,7 +134,6 @@ export const buildColumnState = (args: Args): Column[] => { RenderedComponent: null, }, Label, - ...(cellProps?.[index]?.field?.admin?.components || {}), }, }, } as ClientField, diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index c929a73cf5d..b43a55255f6 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { CellComponentProps, SanitizedCollectionConfig } from 'payload' +import type { CellComponentProps, ClientField, SanitizedCollectionConfig } from 'payload' import React, { createContext, useCallback, useContext, useState } from 'react' @@ -13,6 +13,7 @@ import { filterFields } from './filterFields.js' import { getInitialColumns } from './getInitialColumns.js' export interface ITableColumns { + cellProps?: Partial[] columns: Column[] moveColumn: (args: { fromIndex: number; toIndex: number }) => void setActiveColumns: (columns: string[]) => void @@ -67,7 +68,6 @@ export const TableColumnsProvider: React.FC = ({ const [tableColumns, setTableColumns] = React.useState(() => buildColumnState({ beforeRows, - cellProps, columnPreferences: listPreferences?.columns, columns: initialColumns, enableRowSelections, @@ -88,23 +88,28 @@ export const TableColumnsProvider: React.FC = ({ [preferenceKey, setPreference], ) - const reassignLinkColumn = (columns: Column[]): Column[] => { + const reassignLinkColumn = useCallback((columns: Column[]): Column[] => { let foundFirstActive = false + let linkColumn = false + const newColumns = columns.map((col) => { - const linkColumn = col.active && !foundFirstActive && col.accessor !== '_select' + if (col.active) { + linkColumn = !foundFirstActive && col.accessor !== '_select' + } + if (linkColumn) foundFirstActive = true return { ...col, cellProps: { - ...col.cellProps, link: linkColumn, + ...col.cellProps, }, } }) return newColumns - } + }, []) const moveColumn = useCallback( (args: { fromIndex: number; toIndex: number }) => { @@ -118,7 +123,7 @@ export const TableColumnsProvider: React.FC = ({ setTableColumns(newColumns) updateColumnPreferences(newColumns) }, - [tableColumns, updateColumnPreferences], + [tableColumns, updateColumnPreferences, reassignLinkColumn], ) const toggleColumn = useCallback( @@ -139,7 +144,7 @@ export const TableColumnsProvider: React.FC = ({ setTableColumns(newColumns) updateColumnPreferences(newColumns) }, - [tableColumns, updateColumnPreferences], + [tableColumns, updateColumnPreferences, reassignLinkColumn], ) const setActiveColumns = React.useCallback( @@ -154,7 +159,7 @@ export const TableColumnsProvider: React.FC = ({ const newColumns = reassignLinkColumn(activeColumns) updateColumnPreferences(newColumns) }, - [tableColumns, updateColumnPreferences], + [tableColumns, updateColumnPreferences, reassignLinkColumn], ) // ////////////////////////////////////////////// @@ -175,7 +180,6 @@ export const TableColumnsProvider: React.FC = ({ setTableColumns( buildColumnState({ beforeRows, - cellProps, columnPreferences: currentPreferences?.columns, columns: initialColumns, enableRowSelections, @@ -193,7 +197,6 @@ export const TableColumnsProvider: React.FC = ({ getPreference, collectionSlug, fields, - cellProps, defaultColumns, useAsTitle, listPreferences, @@ -205,6 +208,7 @@ export const TableColumnsProvider: React.FC = ({ return ( Date: Fri, 23 Aug 2024 14:45:30 -0400 Subject: [PATCH 057/173] chore: localized joins working in pg --- packages/db-mongodb/src/find.ts | 2 ++ packages/db-mongodb/src/utilities/setJoins.ts | 8 +++++++- packages/drizzle/src/find/traverseFields.ts | 11 +++++++---- test/joins/config.ts | 1 + test/joins/int.spec.ts | 4 ++-- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index 9d3b2498aa5..43e866c052d 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -105,6 +105,8 @@ export const find: Find = async function find( const joinPromises = [] + // TODO: + // we need to convert to aggregation here for performance result.docs.forEach((doc) => { joinPromises.push( setJoins({ diff --git a/packages/db-mongodb/src/utilities/setJoins.ts b/packages/db-mongodb/src/utilities/setJoins.ts index 9ad76a32863..d3521f1ea7e 100644 --- a/packages/db-mongodb/src/utilities/setJoins.ts +++ b/packages/db-mongodb/src/utilities/setJoins.ts @@ -57,7 +57,13 @@ export const setJoins = async ({ let current = doc for (let i = 0; i <= path.length - 1; i++) { if (i === path.length - 1) { - current[path[i]] = data + if (join.field.localized) { + current[path[i]] = { + [locale]: data, + } + } else { + current[path[i]] = data + } } else { if (!current[path[i]]) { current[path[i]] = {} diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index 8a582c7aca9..aa759edf41c 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -1,6 +1,6 @@ -import type { DBQueryConfig } from 'drizzle-orm' import type { Field, JoinQuery } from 'payload' +import { type DBQueryConfig, sql } from 'drizzle-orm' import { APIError } from 'payload' import { fieldAffectsData, tabHasName } from 'payload/shared' import toSnakeCase from 'to-snake-case' @@ -232,17 +232,20 @@ export const traverseFields = ({ }) const withJoin: DBQueryConfig<'many', true, any, any> = { columns: { - id: true, ...selectFields, }, - // TODO: join a custom query to handle count - // extras: {}, limit, orderBy: () => [orderBy.order(orderBy.column)], } + if (field.localized) { withJoin.columns._locale = true + // Masquerade the parent_id as id, for population to work appropriately + withJoin.extras = { id: sql`_parent_id`.as('id') } + } else { + withJoin.columns.id = true } + currentArgs.with[toSnakeCase(`${path}${field.name}`)] = withJoin } break diff --git a/test/joins/config.ts b/test/joins/config.ts index d0d97e9d03c..69283c29f50 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -77,6 +77,7 @@ export default buildConfigWithDefaults({ { name: 'title', type: 'text', + localized: true, }, { name: 'category', diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index 07756ce99ed..064ef1db895 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -125,7 +125,7 @@ describe('Joins Field Tests', () => { collection: 'localized-posts', locale: 'en', data: { - title: 'english post', + title: 'english post 1', category: localizedCategory.id, }, }) @@ -142,7 +142,7 @@ describe('Joins Field Tests', () => { collection: 'localized-posts', locale: 'en', data: { - title: 'spanish post', + title: 'english post 2', category: localizedCategory.id, }, }) From 7fdae3ff5ee2e6959bd4ba7439fea93e5bd419b5 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Fri, 23 Aug 2024 14:07:56 -0400 Subject: [PATCH 058/173] extracts RenderCell component --- packages/ui/src/elements/Table/RenderCell.tsx | 54 +++++++++++++++++++ packages/ui/src/elements/Table/index.tsx | 48 ++++------------- 2 files changed, 65 insertions(+), 37 deletions(-) create mode 100644 packages/ui/src/elements/Table/RenderCell.tsx diff --git a/packages/ui/src/elements/Table/RenderCell.tsx b/packages/ui/src/elements/Table/RenderCell.tsx new file mode 100644 index 00000000000..5efe28dd13d --- /dev/null +++ b/packages/ui/src/elements/Table/RenderCell.tsx @@ -0,0 +1,54 @@ +import type { CellComponentProps, ClientField } from 'payload' + +import React, { useMemo } from 'react' + +import type { Column } from './index.js' + +import { RenderComponent } from '../../providers/Config/RenderComponent.js' +import { TableCellProvider } from './TableCellProvider/index.js' + +export const RenderCell: React.FC<{ + readonly cellPropOverrides?: Partial + readonly col: Column + readonly colIndex: number + readonly customCellContext?: Record + readonly row: Record +}> = (props) => { + const { cellPropOverrides, col, colIndex, customCellContext, row } = props + + const cellProps: Partial = useMemo(() => { + return { + ...col?.cellProps, + ...(cellPropOverrides || {}), + field: { + ...col?.cellProps?.field, + ...(cellPropOverrides?.field || {}), + admin: { + ...col?.cellProps?.field?.admin, + ...(cellPropOverrides?.field?.admin || {}), + components: { + ...col?.cellProps?.field?.admin?.components, + ...(cellPropOverrides?.field?.admin?.components || {}), + }, + }, + } as ClientField, + } + }, [cellPropOverrides, col]) + + return ( +
+ ) +} diff --git a/packages/ui/src/elements/Table/index.tsx b/packages/ui/src/elements/Table/index.tsx index fc66f5c3c59..f28d88cef15 100644 --- a/packages/ui/src/elements/Table/index.tsx +++ b/packages/ui/src/elements/Table/index.tsx @@ -5,8 +5,8 @@ import React from 'react' export * from './TableCellProvider/index.js' -import { RenderComponent } from '../../providers/Config/RenderComponent.js' import { useTableColumns } from '../TableColumns/index.js' +import { RenderCell } from './RenderCell.js' import { TableCellProvider } from './TableCellProvider/index.js' import './index.scss' @@ -65,42 +65,16 @@ export const Table: React.FC = ({ {data && data.map((row, rowIndex) => ( - {activeColumns.map((col, colIndex) => { - return ( - - ) - })} + {activeColumns.map((col, colIndex) => ( + + ))} ))} From 68eb05cef7443049c2cc97212dbe472e8f9375a0 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 23 Aug 2024 15:36:53 -0400 Subject: [PATCH 059/173] chore: merge --- packages/db-mongodb/src/create.ts | 11 +- packages/db-mongodb/src/createGlobal.ts | 15 ++- .../db-mongodb/src/createGlobalVersion.ts | 38 +++--- packages/db-mongodb/src/createVersion.ts | 36 +++--- packages/db-mongodb/src/updateGlobal.ts | 10 +- .../db-mongodb/src/updateGlobalVersion.ts | 22 +++- packages/db-mongodb/src/updateOne.ts | 9 +- packages/db-mongodb/src/updateVersion.ts | 11 +- .../src/utilities/sanitizeRelationshipIDs.ts | 111 ++++++++++++++++++ packages/payload/src/index.ts | 5 +- .../payload/src/utilities/traverseFields.ts | 18 +-- test/databaseAdapter.ts | 22 ++-- test/getDatabaseAdapter.js | 2 - 13 files changed, 240 insertions(+), 70 deletions(-) create mode 100644 packages/db-mongodb/src/utilities/sanitizeRelationshipIDs.ts diff --git a/packages/db-mongodb/src/create.ts b/packages/db-mongodb/src/create.ts index f01a9d6af35..5a104c65073 100644 --- a/packages/db-mongodb/src/create.ts +++ b/packages/db-mongodb/src/create.ts @@ -3,6 +3,7 @@ import type { Create, Document, PayloadRequest } from 'payload' import type { MongooseAdapter } from './index.js' import { handleError } from './utilities/handleError.js' +import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js' import { withSession } from './withSession.js' export const create: Create = async function create( @@ -11,9 +12,17 @@ export const create: Create = async function create( ) { const Model = this.collections[collection] const options = await withSession(this, req) + let doc + + const sanitizedData = sanitizeRelationshipIDs({ + config: this.payload.config, + data, + fields: this.payload.collections[collection].config.fields, + }) + try { - ;[doc] = await Model.create([data], options) + ;[doc] = await Model.create([sanitizedData], options) } catch (error) { handleError({ collection, error, req }) } diff --git a/packages/db-mongodb/src/createGlobal.ts b/packages/db-mongodb/src/createGlobal.ts index 6b6bc9ff417..49fcbec2073 100644 --- a/packages/db-mongodb/src/createGlobal.ts +++ b/packages/db-mongodb/src/createGlobal.ts @@ -3,6 +3,7 @@ import type { CreateGlobal, PayloadRequest } from 'payload' import type { MongooseAdapter } from './index.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' +import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js' import { withSession } from './withSession.js' export const createGlobal: CreateGlobal = async function createGlobal( @@ -10,10 +11,16 @@ export const createGlobal: CreateGlobal = async function createGlobal( { slug, data, req = {} as PayloadRequest }, ) { const Model = this.globals - const global = { - globalType: slug, - ...data, - } + + const global = sanitizeRelationshipIDs({ + config: this.payload.config, + data: { + globalType: slug, + ...data, + }, + fields: this.payload.config.globals.find((globalConfig) => globalConfig.slug === slug).fields, + }) + const options = await withSession(this, req) let [result] = (await Model.create([global], options)) as any diff --git a/packages/db-mongodb/src/createGlobalVersion.ts b/packages/db-mongodb/src/createGlobalVersion.ts index 3d6a004a8da..de1d1cc15a7 100644 --- a/packages/db-mongodb/src/createGlobalVersion.ts +++ b/packages/db-mongodb/src/createGlobalVersion.ts @@ -1,7 +1,13 @@ -import type { CreateGlobalVersion, Document, PayloadRequest } from 'payload' +import { + type CreateGlobalVersion, + type Document, + type PayloadRequest, + buildVersionGlobalFields, +} from 'payload' import type { MongooseAdapter } from './index.js' +import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js' import { withSession } from './withSession.js' export const createGlobalVersion: CreateGlobalVersion = async function createGlobalVersion( @@ -11,20 +17,22 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo const VersionModel = this.versions[globalSlug] const options = await withSession(this, req) - const [doc] = await VersionModel.create( - [ - { - autosave, - createdAt, - latest: true, - parent, - updatedAt, - version: versionData, - }, - ], - options, - req, - ) + const data = sanitizeRelationshipIDs({ + config: this.payload.config, + data: { + autosave, + createdAt, + latest: true, + parent, + updatedAt, + version: versionData, + }, + fields: buildVersionGlobalFields( + this.payload.config.globals.find((global) => global.slug === globalSlug), + ), + }) + + const [doc] = await VersionModel.create([data], options, req) await VersionModel.updateMany( { diff --git a/packages/db-mongodb/src/createVersion.ts b/packages/db-mongodb/src/createVersion.ts index 2093052ccb4..045f15e6580 100644 --- a/packages/db-mongodb/src/createVersion.ts +++ b/packages/db-mongodb/src/createVersion.ts @@ -1,7 +1,13 @@ -import type { CreateVersion, Document, PayloadRequest } from 'payload' +import { + type CreateVersion, + type Document, + type PayloadRequest, + buildVersionCollectionFields, +} from 'payload' import type { MongooseAdapter } from './index.js' +import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js' import { withSession } from './withSession.js' export const createVersion: CreateVersion = async function createVersion( @@ -19,20 +25,20 @@ export const createVersion: CreateVersion = async function createVersion( const VersionModel = this.versions[collectionSlug] const options = await withSession(this, req) - const [doc] = await VersionModel.create( - [ - { - autosave, - createdAt, - latest: true, - parent, - updatedAt, - version: versionData, - }, - ], - options, - req, - ) + const data = sanitizeRelationshipIDs({ + config: this.payload.config, + data: { + autosave, + createdAt, + latest: true, + parent, + updatedAt, + version: versionData, + }, + fields: buildVersionCollectionFields(this.payload.collections[collectionSlug].config), + }) + + const [doc] = await VersionModel.create([data], options, req) await VersionModel.updateMany( { diff --git a/packages/db-mongodb/src/updateGlobal.ts b/packages/db-mongodb/src/updateGlobal.ts index 726a2d98eda..589aad24a58 100644 --- a/packages/db-mongodb/src/updateGlobal.ts +++ b/packages/db-mongodb/src/updateGlobal.ts @@ -3,6 +3,7 @@ import type { PayloadRequest, UpdateGlobal } from 'payload' import type { MongooseAdapter } from './index.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' +import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js' import { withSession } from './withSession.js' export const updateGlobal: UpdateGlobal = async function updateGlobal( @@ -17,7 +18,14 @@ export const updateGlobal: UpdateGlobal = async function updateGlobal( } let result - result = await Model.findOneAndUpdate({ globalType: slug }, data, options) + + const sanitizedData = sanitizeRelationshipIDs({ + config: this.payload.config, + data, + fields: this.payload.config.globals.find((global) => global.slug === slug).fields, + }) + + result = await Model.findOneAndUpdate({ globalType: slug }, sanitizedData, options) result = JSON.parse(JSON.stringify(result)) diff --git a/packages/db-mongodb/src/updateGlobalVersion.ts b/packages/db-mongodb/src/updateGlobalVersion.ts index dc575b65fbd..c11b9abcab8 100644 --- a/packages/db-mongodb/src/updateGlobalVersion.ts +++ b/packages/db-mongodb/src/updateGlobalVersion.ts @@ -1,21 +1,27 @@ -import type { PayloadRequest, TypeWithID, UpdateGlobalVersionArgs } from 'payload' +import { + type PayloadRequest, + type TypeWithID, + type UpdateGlobalVersionArgs, + buildVersionGlobalFields, +} from 'payload' import type { MongooseAdapter } from './index.js' +import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js' import { withSession } from './withSession.js' export async function updateGlobalVersion( this: MongooseAdapter, { id, - global, + global: globalSlug, locale, req = {} as PayloadRequest, versionData, where, }: UpdateGlobalVersionArgs, ) { - const VersionModel = this.versions[global] + const VersionModel = this.versions[globalSlug] const whereToUse = where || { id: { equals: id } } const options = { ...(await withSession(this, req)), @@ -29,7 +35,15 @@ export async function updateGlobalVersion( where: whereToUse, }) - const doc = await VersionModel.findOneAndUpdate(query, versionData, options) + const sanitizedData = sanitizeRelationshipIDs({ + config: this.payload.config, + data: versionData, + fields: buildVersionGlobalFields( + this.payload.config.globals.find((global) => global.slug === globalSlug), + ), + }) + + const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options) const result = JSON.parse(JSON.stringify(doc)) diff --git a/packages/db-mongodb/src/updateOne.ts b/packages/db-mongodb/src/updateOne.ts index 0c751621c2b..b9fa2e8e932 100644 --- a/packages/db-mongodb/src/updateOne.ts +++ b/packages/db-mongodb/src/updateOne.ts @@ -4,6 +4,7 @@ import type { MongooseAdapter } from './index.js' import { handleError } from './utilities/handleError.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' +import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js' import { withSession } from './withSession.js' export const updateOne: UpdateOne = async function updateOne( @@ -26,8 +27,14 @@ export const updateOne: UpdateOne = async function updateOne( let result + const sanitizedData = sanitizeRelationshipIDs({ + config: this.payload.config, + data, + fields: this.payload.collections[collection].config.fields, + }) + try { - result = await Model.findOneAndUpdate(query, data, options) + result = await Model.findOneAndUpdate(query, sanitizedData, options) } catch (error) { handleError({ collection, error, req }) } diff --git a/packages/db-mongodb/src/updateVersion.ts b/packages/db-mongodb/src/updateVersion.ts index 84757e71764..20bff95f29b 100644 --- a/packages/db-mongodb/src/updateVersion.ts +++ b/packages/db-mongodb/src/updateVersion.ts @@ -1,7 +1,8 @@ -import type { PayloadRequest, UpdateVersion } from 'payload' +import { type PayloadRequest, type UpdateVersion, buildVersionCollectionFields } from 'payload' import type { MongooseAdapter } from './index.js' +import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js' import { withSession } from './withSession.js' export const updateVersion: UpdateVersion = async function updateVersion( @@ -22,7 +23,13 @@ export const updateVersion: UpdateVersion = async function updateVersion( where: whereToUse, }) - const doc = await VersionModel.findOneAndUpdate(query, versionData, options) + const sanitizedData = sanitizeRelationshipIDs({ + config: this.payload.config, + data: versionData, + fields: buildVersionCollectionFields(this.payload.collections[collection].config), + }) + + const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options) const result = JSON.parse(JSON.stringify(doc)) diff --git a/packages/db-mongodb/src/utilities/sanitizeRelationshipIDs.ts b/packages/db-mongodb/src/utilities/sanitizeRelationshipIDs.ts new file mode 100644 index 00000000000..7b2d96ae1a3 --- /dev/null +++ b/packages/db-mongodb/src/utilities/sanitizeRelationshipIDs.ts @@ -0,0 +1,111 @@ +import type { CollectionConfig, Field, SanitizedConfig } from 'payload' + +import mongoose from 'mongoose' +import { traverseFields } from 'payload' +import { fieldAffectsData } from 'payload/shared' + +type Args = { + config: SanitizedConfig + data: Record + fields: Field[] +} + +interface RelationObject { + relationTo: string + value: number | string +} + +function isValidRelationObject(value: unknown): value is RelationObject { + return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value +} + +const convertValue = ({ + relatedCollection, + value, +}: { + relatedCollection: CollectionConfig + value: number | string +}): mongoose.Types.ObjectId | number | string => { + const customIDField = relatedCollection.fields.find( + (field) => fieldAffectsData(field) && field.name === 'id', + ) + + if (!customIDField) return new mongoose.Types.ObjectId(value) + + return value +} + +export const sanitizeRelationshipIDs = ({ + config, + data, + fields, +}: Args): Record => { + const sanitize = (field: Field, ref: unknown) => { + if (field.type === 'relationship' || field.type === 'upload') { + const value = ref[field.name] + + let relatedCollection: CollectionConfig | undefined + + const hasManyRelations = typeof field.relationTo !== 'string' + + if (!hasManyRelations) { + relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo) + } + + if (Array.isArray(value)) { + ref[field.name] = value.map((val) => { + // Handle has many + if (relatedCollection && val && (typeof val === 'string' || typeof val === 'number')) { + return convertValue({ + relatedCollection, + value: val, + }) + } + + // Handle has many - polymorphic + if (isValidRelationObject(val)) { + const relatedCollectionForSingleValue = config.collections?.find( + ({ slug }) => slug === val.relationTo, + ) + + if (relatedCollectionForSingleValue) { + return { + relationTo: val.relationTo, + value: convertValue({ + relatedCollection: relatedCollectionForSingleValue, + value: val.value, + }), + } + } + } + + return val + }) + } + + // Handle has one - polymorphic + if (isValidRelationObject(value)) { + relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo) + + if (relatedCollection) { + ref[field.name] = { + relationTo: value.relationTo, + value: convertValue({ relatedCollection, value: value.value }), + } + } + } + + // Handle has one + if (relatedCollection && value && (typeof value === 'string' || typeof value === 'number')) { + ref[field.name] = convertValue({ + relatedCollection, + value, + }) + } + } + } + + traverseFields(fields, sanitize, data, data) + + return data +} diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index 36ac706ab36..69e613dfa93 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -1067,15 +1067,16 @@ export { default as isolateObjectProperty } from './utilities/isolateObjectPrope export { killTransaction } from './utilities/killTransaction.js' export { mapAsync } from './utilities/mapAsync.js' export { mergeListSearchAndWhere } from './utilities/mergeListSearchAndWhere.js' +export { traverseFields } from './utilities/traverseFields.js' export { buildVersionCollectionFields } from './versions/buildCollectionFields.js' -export { buildVersionGlobalFields } from './versions/buildGlobalFields.js' export { getDependencies } +export { buildVersionGlobalFields } from './versions/buildGlobalFields.js' export { versionDefaults } from './versions/defaults.js' export { deleteCollectionVersions } from './versions/deleteCollectionVersions.js' export { enforceMaxVersions } from './versions/enforceMaxVersions.js' export { getLatestCollectionVersion } from './versions/getLatestCollectionVersion.js' export { getLatestGlobalVersion } from './versions/getLatestGlobalVersion.js' export { saveVersion } from './versions/saveVersion.js' -export type { TypeWithVersion } from './versions/types.js' +export type { TypeWithVersion } from './versions/types.js' export { deepMergeSimple } from '@payloadcms/translations/utilities' diff --git a/packages/payload/src/utilities/traverseFields.ts b/packages/payload/src/utilities/traverseFields.ts index 4b84953a96f..144662705dd 100644 --- a/packages/payload/src/utilities/traverseFields.ts +++ b/packages/payload/src/utilities/traverseFields.ts @@ -2,10 +2,6 @@ import type { Field } from '../fields/config/types.js' import { fieldHasSubFields } from '../fields/config/types.js' -type Ref = { - [key: string]: Ref -} - /** * Iterate a recurse an array of fields, calling a callback for each field * @@ -15,16 +11,20 @@ type Ref = { * @param parentRef */ export const traverseFields = ( - fields: (Field)[], - callback?: (field: Field, ref: Ref, parentRef: Ref) => boolean | void, - ref: Ref = {}, - parentRef: Ref = {}, + fields: Field[], + callback?: ( + field: Field, + ref: Record | unknown, + parentRef: Record | unknown, + ) => boolean | void, + ref: Record | unknown = {}, + parentRef: Record | unknown = {}, ): void => { fields.some((field) => { if (fieldHasSubFields(field)) { const parentRef = ref if ('name' in field && field.name) { - ref[field.name] = {} + if (typeof ref[field.name] === 'undefined') ref[field.name] = {} ref = ref[field.name] } if (callback && callback(field, ref, parentRef)) { diff --git a/test/databaseAdapter.ts b/test/databaseAdapter.ts index a36c0d0c13e..e1073b34c17 100644 --- a/test/databaseAdapter.ts +++ b/test/databaseAdapter.ts @@ -1,16 +1,10 @@ +// DO NOT MODIFY. This file is automatically generated in initDevAndTest.ts - // DO NOT MODIFY. This file is automatically generated in initDevAndTest.ts +import { mongooseAdapter } from '@payloadcms/db-mongodb' - - import { mongooseAdapter } from '@payloadcms/db-mongodb' - - export const databaseAdapter = mongooseAdapter({ - url: - process.env.MONGODB_MEMORY_SERVER_URI || - process.env.DATABASE_URI || - 'mongodb://127.0.0.1/payloadtests', - collation: { - strength: 1, - }, - }) - \ No newline at end of file +export const databaseAdapter = mongooseAdapter({ + url: 'mongodb://127.0.0.1/payloadtests', + collation: { + strength: 1, + }, +}) diff --git a/test/getDatabaseAdapter.js b/test/getDatabaseAdapter.js index 669bef5f137..816a637b62e 100644 --- a/test/getDatabaseAdapter.js +++ b/test/getDatabaseAdapter.js @@ -4,8 +4,6 @@ export const allDatabaseAdapters = { export const databaseAdapter = mongooseAdapter({ url: - process.env.MONGODB_MEMORY_SERVER_URI || - process.env.DATABASE_URI || 'mongodb://127.0.0.1/payloadtests', collation: { strength: 1, From 3cff24e1153dbdcf5c73041537b63701dd6198b1 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 23 Aug 2024 15:38:48 -0400 Subject: [PATCH 060/173] chore: remove deprecated relationship objectid plugin --- .../plugin-relationship-object-ids/.gitignore | 7 -- .../plugin-relationship-object-ids/.swcrc | 15 --- .../plugin-relationship-object-ids/README.md | 40 ------- .../eslint.config.js | 20 ---- .../package.json | 60 ---------- .../src/hooks/afterRead.ts | 101 ----------------- .../src/hooks/beforeChange.ts | 94 ---------------- .../src/index.ts | 105 ------------------ .../tsconfig.json | 24 ---- 9 files changed, 466 deletions(-) delete mode 100644 packages/plugin-relationship-object-ids/.gitignore delete mode 100644 packages/plugin-relationship-object-ids/.swcrc delete mode 100644 packages/plugin-relationship-object-ids/README.md delete mode 100644 packages/plugin-relationship-object-ids/eslint.config.js delete mode 100644 packages/plugin-relationship-object-ids/package.json delete mode 100644 packages/plugin-relationship-object-ids/src/hooks/afterRead.ts delete mode 100644 packages/plugin-relationship-object-ids/src/hooks/beforeChange.ts delete mode 100644 packages/plugin-relationship-object-ids/src/index.ts delete mode 100644 packages/plugin-relationship-object-ids/tsconfig.json diff --git a/packages/plugin-relationship-object-ids/.gitignore b/packages/plugin-relationship-object-ids/.gitignore deleted file mode 100644 index 4baaac85f04..00000000000 --- a/packages/plugin-relationship-object-ids/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules -.env -dist -demo/uploads -build -.DS_Store -package-lock.json diff --git a/packages/plugin-relationship-object-ids/.swcrc b/packages/plugin-relationship-object-ids/.swcrc deleted file mode 100644 index 14463f4b08b..00000000000 --- a/packages/plugin-relationship-object-ids/.swcrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/swcrc", - "sourceMaps": true, - "jsc": { - "target": "esnext", - "parser": { - "syntax": "typescript", - "tsx": true, - "dts": true - } - }, - "module": { - "type": "es6" - } -} diff --git a/packages/plugin-relationship-object-ids/README.md b/packages/plugin-relationship-object-ids/README.md deleted file mode 100644 index a0fc9fe3fbe..00000000000 --- a/packages/plugin-relationship-object-ids/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# Payload Relationship ObjectID Plugin - -This plugin automatically enables all Payload `relationship` and `upload` field types to be stored as `ObjectID`s in MongoDB. - -Minimum required version of Payload: `1.9.5` - -## What it does - -It injects a `beforeChange` field hook into each `relationship` and `upload` field, which converts string-based IDs to `ObjectID`s immediately prior to storage. - -By default, it also injects an `afterRead` field hook into the above fields, which ensures that the values are re-formatted back to strings after having been read from the database. - -#### Usage - -Simply import and install the plugin to make it work: - -```ts -import { relationshipsAsObjectID } from '@payloadcms/plugin-relationship-object-ids' -import { buildConfig } from 'payload' - -export default buildConfig({ - // your config here - plugins: [ - // Call the plugin within your `plugins` array - relationshipsAsObjectID({ - // Optionally keep relationship values as ObjectID - // when they are retrieved from the database. - keepAfterRead: true, - }), - ], -}) -``` - -### Migration - -Note - this plugin will only store newly created or resaved documents' relations as `ObjectID`s. It will not modify any of your existing data. If you'd like to convert existing data into an `ObjectID` format, you should write a migration script to loop over all documents in your database and then simply resave each one. - -### Support - -If you need help with this plugin, [join our Discord](https://t.co/30APlsQUPB) and we'd be happy to give you a hand. diff --git a/packages/plugin-relationship-object-ids/eslint.config.js b/packages/plugin-relationship-object-ids/eslint.config.js deleted file mode 100644 index e62b92c8092..00000000000 --- a/packages/plugin-relationship-object-ids/eslint.config.js +++ /dev/null @@ -1,20 +0,0 @@ -import { rootEslintConfig, rootParserOptions } from '../../eslint.config.js' - -/** @typedef {import('eslint').Linter.FlatConfig} */ -let FlatConfig - -/** @type {FlatConfig[]} */ -export const index = [ - ...rootEslintConfig, - { - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigDirName: import.meta.dirname, - ...rootParserOptions, - }, - }, - }, -] - -export default index diff --git a/packages/plugin-relationship-object-ids/package.json b/packages/plugin-relationship-object-ids/package.json deleted file mode 100644 index 01deefbb2bb..00000000000 --- a/packages/plugin-relationship-object-ids/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@payloadcms/plugin-relationship-object-ids", - "version": "3.0.0-beta.90", - "description": "A Payload plugin to store all relationship IDs as ObjectIDs", - "repository": { - "type": "git", - "url": "https://github.com/payloadcms/payload.git", - "directory": "packages/plugin-relationship-object-ids" - }, - "license": "MIT", - "author": "Payload (https://payloadcms.com)", - "maintainers": [ - { - "name": "Payload", - "email": "info@payloadcms.com", - "url": "https://payloadcms.com" - } - ], - "type": "module", - "exports": { - ".": { - "import": "./src/index.ts", - "types": "./src/index.ts", - "default": "./src/index.ts" - } - }, - "main": "./src/index.ts", - "types": "./src/index.ts", - "files": [ - "dist" - ], - "scripts": { - "build": "pnpm copyfiles && pnpm build:types && pnpm build:swc", - "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths", - "build:types": "tsc --emitDeclarationOnly --outDir dist", - "clean": "rimraf {dist,*.tsbuildinfo}", - "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/", - "prepublishOnly": "pnpm clean && pnpm turbo build" - }, - "devDependencies": { - "@payloadcms/eslint-config": "workspace:*", - "payload": "workspace:*" - }, - "peerDependencies": { - "mongoose": "6.12.3", - "payload": "workspace:*" - }, - "publishConfig": { - "exports": { - ".": { - "import": "./dist/index.js", - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - } - }, - "main": "./dist/index.js", - "types": "./dist/index.d.ts" - }, - "homepage:": "https://payloadcms.com" -} diff --git a/packages/plugin-relationship-object-ids/src/hooks/afterRead.ts b/packages/plugin-relationship-object-ids/src/hooks/afterRead.ts deleted file mode 100644 index e9cc5fd3797..00000000000 --- a/packages/plugin-relationship-object-ids/src/hooks/afterRead.ts +++ /dev/null @@ -1,101 +0,0 @@ -import type { CollectionConfig, Config, FieldHook, RelationshipField, UploadField } from 'payload' - -import mongoose from 'mongoose' -import { fieldAffectsData } from 'payload/shared' - -const convertValue = ({ - relatedCollection, - value, -}: { - relatedCollection: CollectionConfig - value: number | string -}): mongoose.Types.ObjectId | number | string => { - const customIDField = relatedCollection.fields.find( - (field) => fieldAffectsData(field) && field.name === 'id', - ) - - if (!customIDField && mongoose.Types.ObjectId.isValid(value)) { - return value.toString() - } - - return value -} - -interface RelationObject { - relationTo: string - value: number | string -} - -function isValidRelationObject(value: unknown): value is RelationObject { - return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value -} - -interface Args { - config: Config - field: RelationshipField | UploadField -} - -export const getAfterReadHook = - ({ config, field }: Args): FieldHook => - ({ value }) => { - let relatedCollection: CollectionConfig | undefined - - const hasManyRelations = typeof field.relationTo !== 'string' - - if (!hasManyRelations) { - relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo) - } - - if (Array.isArray(value)) { - return value.map((val) => { - // Handle has many - if (relatedCollection && val) { - return convertValue({ - relatedCollection, - value: val, - }) - } - - // Handle has many - polymorphic - if (isValidRelationObject(val)) { - const relatedCollectionForSingleValue = config.collections?.find( - ({ slug }) => slug === val.relationTo, - ) - - if (relatedCollectionForSingleValue) { - return { - relationTo: val.relationTo, - value: convertValue({ - relatedCollection: relatedCollectionForSingleValue, - value: val.value, - }), - } - } - } - - return val - }) - } - - // Handle has one - polymorphic - if (isValidRelationObject(value)) { - relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo) - - if (relatedCollection) { - return { - relationTo: value.relationTo, - value: convertValue({ relatedCollection, value: value.value }), - } - } - } - - // Handle has one - if (relatedCollection && value) { - return convertValue({ - relatedCollection, - value, - }) - } - - return value - } diff --git a/packages/plugin-relationship-object-ids/src/hooks/beforeChange.ts b/packages/plugin-relationship-object-ids/src/hooks/beforeChange.ts deleted file mode 100644 index f0994990692..00000000000 --- a/packages/plugin-relationship-object-ids/src/hooks/beforeChange.ts +++ /dev/null @@ -1,94 +0,0 @@ -import type { CollectionConfig, Config, FieldHook, RelationshipField, UploadField } from 'payload' - -import mongoose from 'mongoose' -import { fieldAffectsData } from 'payload/shared' - -const convertValue = ({ - relatedCollection, - value, -}: { - relatedCollection: CollectionConfig - value: number | string -}): mongoose.Types.ObjectId | number | string => { - const customIDField = relatedCollection.fields.find( - (field) => fieldAffectsData(field) && field.name === 'id', - ) - - if (!customIDField) return new mongoose.Types.ObjectId(value) - - return value -} - -interface RelationObject { - relationTo: string - value: number | string -} - -function isValidRelationObject(value: unknown): value is RelationObject { - return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value -} - -export const getBeforeChangeHook = - ({ config, field }: { config: Config; field: RelationshipField | UploadField }): FieldHook => - ({ value }) => { - let relatedCollection: CollectionConfig | undefined - - const hasManyRelations = typeof field.relationTo !== 'string' - - if (!hasManyRelations) { - relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo) - } - - if (Array.isArray(value)) { - return value.map((val) => { - // Handle has many - if (relatedCollection && val && (typeof val === 'string' || typeof val === 'number')) { - return convertValue({ - relatedCollection, - value: val, - }) - } - - // Handle has many - polymorphic - if (isValidRelationObject(val)) { - const relatedCollectionForSingleValue = config.collections?.find( - ({ slug }) => slug === val.relationTo, - ) - - if (relatedCollectionForSingleValue) { - return { - relationTo: val.relationTo, - value: convertValue({ - relatedCollection: relatedCollectionForSingleValue, - value: val.value, - }), - } - } - } - - return val - }) - } - - // Handle has one - polymorphic - if (isValidRelationObject(value)) { - relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo) - - if (relatedCollection) { - return { - relationTo: value.relationTo, - value: convertValue({ relatedCollection, value: value.value }), - } - } - } - - // Handle has one - if (relatedCollection && value && (typeof value === 'string' || typeof value === 'number')) { - return convertValue({ - relatedCollection, - value, - }) - } - - return value - } diff --git a/packages/plugin-relationship-object-ids/src/index.ts b/packages/plugin-relationship-object-ids/src/index.ts deleted file mode 100644 index c35e06701d1..00000000000 --- a/packages/plugin-relationship-object-ids/src/index.ts +++ /dev/null @@ -1,105 +0,0 @@ -import type { Config, Field, FieldHook } from 'payload' - -import { getAfterReadHook } from './hooks/afterRead.js' -import { getBeforeChangeHook } from './hooks/beforeChange.js' - -interface TraverseFieldsArgs { - config: Config - fields: Field[] - keepAfterRead: boolean -} - -const traverseFields = ({ config, fields, keepAfterRead }: TraverseFieldsArgs): Field[] => { - return fields.map((field) => { - if (field.type === 'relationship' || field.type === 'upload') { - const afterRead: FieldHook[] = [...(field.hooks?.afterRead || [])] - - if (!keepAfterRead) { - afterRead.unshift(getAfterReadHook({ config, field })) - } - - return { - ...field, - hooks: { - ...(field.hooks || {}), - afterRead, - beforeChange: [ - ...(field.hooks?.beforeChange || []), - getBeforeChangeHook({ config, field }), - ], - }, - } - } - - if ('fields' in field) { - return { - ...field, - fields: traverseFields({ config, fields: field.fields, keepAfterRead }), - } - } - - if (field.type === 'tabs') { - return { - ...field, - tabs: field.tabs.map((tab) => { - return { - ...tab, - fields: traverseFields({ config, fields: tab.fields, keepAfterRead }), - } - }), - } - } - - if (field.type === 'blocks') { - return { - ...field, - blocks: field.blocks.map((block) => { - return { - ...block, - fields: traverseFields({ config, fields: block.fields, keepAfterRead }), - } - }), - } - } - - return field - }) -} - -interface Args { - /* - If you want to keep ObjectIDs as ObjectIDs after read, you can enable this flag. - By default, all relationship ObjectIDs are stringified within the AfterRead hook. - */ - keepAfterRead?: boolean -} - -export const relationshipsAsObjectID = - (args?: Args) => - (config: Config): Config => { - const keepAfterRead = typeof args?.keepAfterRead === 'boolean' ? args.keepAfterRead : false - - return { - ...config, - collections: (config.collections || []).map((collection) => { - return { - ...collection, - fields: traverseFields({ - config, - fields: collection.fields, - keepAfterRead, - }), - } - }), - globals: (config.globals || []).map((global) => { - return { - ...global, - fields: traverseFields({ - config, - fields: global.fields, - keepAfterRead, - }), - } - }), - } - } diff --git a/packages/plugin-relationship-object-ids/tsconfig.json b/packages/plugin-relationship-object-ids/tsconfig.json deleted file mode 100644 index 79d535b16e7..00000000000 --- a/packages/plugin-relationship-object-ids/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "composite": true, // Make sure typescript knows that this module depends on their references - "noEmit": false /* Do not emit outputs. */, - "emitDeclarationOnly": true, - "outDir": "./dist" /* Specify an output folder for all emitted files. */, - "rootDir": "./src" /* Specify the root folder within your source files. */ - }, - "exclude": [ - "dist", - "build", - "tests", - "test", - "node_modules", - "eslint.config.js", - "src/**/*.spec.js", - "src/**/*.spec.jsx", - "src/**/*.spec.ts", - "src/**/*.spec.tsx" - ], - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.d.ts", "src/**/*.json"], - "references": [{ "path": "../payload" }] -} From 2761b0ce67047abb01a35725d8c2cbcee7861a70 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 23 Aug 2024 15:46:42 -0400 Subject: [PATCH 061/173] chore: removes unused files --- packages/db-mongodb/package.json | 1 + test/package.json | 1 - .../plugin-relationship-object-ids/.gitignore | 1 - test/plugin-relationship-object-ids/config.ts | 140 -------------- .../eslint.config.js | 21 --- .../int.spec.ts | 119 ------------ .../payload-logo.png | Bin 12542 -> 0 bytes .../payload-types.ts | 175 ------------------ .../tsconfig.eslint.json | 13 -- .../tsconfig.json | 3 - test/setupProd.ts | 1 - 11 files changed, 1 insertion(+), 474 deletions(-) delete mode 100644 test/plugin-relationship-object-ids/.gitignore delete mode 100644 test/plugin-relationship-object-ids/config.ts delete mode 100644 test/plugin-relationship-object-ids/eslint.config.js delete mode 100644 test/plugin-relationship-object-ids/int.spec.ts delete mode 100644 test/plugin-relationship-object-ids/payload-logo.png delete mode 100644 test/plugin-relationship-object-ids/payload-types.ts delete mode 100644 test/plugin-relationship-object-ids/tsconfig.eslint.json delete mode 100644 test/plugin-relationship-object-ids/tsconfig.json diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 6f7ee6de1bf..9b57b9e4ab9 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -36,6 +36,7 @@ "bson-objectid": "2.0.4", "http-status": "1.6.2", "mongoose": "6.12.3", + "mongoose-aggregate-paginate-v2": "1.0.9", "mongoose-paginate-v2": "1.7.22", "prompts": "2.4.2", "uuid": "10.0.0" diff --git a/test/package.json b/test/package.json index 9a567deec31..ad8fb2efee3 100644 --- a/test/package.json +++ b/test/package.json @@ -43,7 +43,6 @@ "@payloadcms/plugin-form-builder": "workspace:*", "@payloadcms/plugin-nested-docs": "workspace:*", "@payloadcms/plugin-redirects": "workspace:*", - "@payloadcms/plugin-relationship-object-ids": "workspace:*", "@payloadcms/plugin-search": "workspace:*", "@payloadcms/plugin-sentry": "workspace:*", "@payloadcms/plugin-seo": "workspace:*", diff --git a/test/plugin-relationship-object-ids/.gitignore b/test/plugin-relationship-object-ids/.gitignore deleted file mode 100644 index 3f549faf910..00000000000 --- a/test/plugin-relationship-object-ids/.gitignore +++ /dev/null @@ -1 +0,0 @@ -uploads diff --git a/test/plugin-relationship-object-ids/config.ts b/test/plugin-relationship-object-ids/config.ts deleted file mode 100644 index 09cdc01f406..00000000000 --- a/test/plugin-relationship-object-ids/config.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { relationshipsAsObjectID } from '@payloadcms/plugin-relationship-object-ids' -import path from 'path' -const filename = fileURLToPath(import.meta.url) -const dirname = path.dirname(filename) -import { fileURLToPath } from 'node:url' - -import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' - -export default buildConfigWithDefaults({ - admin: { - importMap: { - baseDir: path.resolve(dirname), - }, - }, - collections: [ - { - slug: 'uploads', - upload: true, - fields: [], - }, - { - slug: 'pages', - fields: [ - { - name: 'title', - type: 'text', - required: true, - }, - ], - }, - { - slug: 'posts', - fields: [ - { - name: 'title', - type: 'text', - required: true, - }, - ], - }, - { - slug: 'relations', - fields: [ - { - name: 'hasOne', - type: 'relationship', - relationTo: 'posts', - filterOptions: ({ id }) => ({ id: { not_equals: id } }), - }, - { - name: 'hasOnePoly', - type: 'relationship', - relationTo: ['pages', 'posts'], - }, - { - name: 'hasMany', - type: 'relationship', - relationTo: 'posts', - hasMany: true, - }, - { - name: 'hasManyPoly', - type: 'relationship', - relationTo: ['pages', 'posts'], - hasMany: true, - }, - { - name: 'upload', - type: 'upload', - relationTo: 'uploads', - }, - ], - }, - ], - plugins: [relationshipsAsObjectID()], - onInit: async (payload) => { - if (payload.db.name === 'mongoose') { - await payload.create({ - collection: 'users', - data: { - email: 'dev@payloadcms.com', - password: 'test', - }, - }) - - const page = await payload.create({ - collection: 'pages', - data: { - title: 'page', - }, - }) - - const post1 = await payload.create({ - collection: 'posts', - data: { - title: 'post 1', - }, - }) - - const post2 = await payload.create({ - collection: 'posts', - data: { - title: 'post 2', - }, - }) - - const upload = await payload.create({ - collection: 'uploads', - data: {}, - filePath: path.resolve(dirname, './payload-logo.png'), - }) - - await payload.create({ - collection: 'relations', - depth: 0, - data: { - hasOne: post1.id, - hasOnePoly: { relationTo: 'pages', value: page.id }, - hasMany: [post1.id, post2.id], - hasManyPoly: [ - { relationTo: 'posts', value: post1.id }, - { relationTo: 'pages', value: page.id }, - ], - upload: upload.id, - }, - }) - - await payload.create({ - collection: 'relations', - depth: 0, - data: { - hasOnePoly: { relationTo: 'pages', value: page.id }, - }, - }) - } - }, - typescript: { - outputFile: path.resolve(dirname, 'payload-types.ts'), - }, -}) diff --git a/test/plugin-relationship-object-ids/eslint.config.js b/test/plugin-relationship-object-ids/eslint.config.js deleted file mode 100644 index e07b96468ef..00000000000 --- a/test/plugin-relationship-object-ids/eslint.config.js +++ /dev/null @@ -1,21 +0,0 @@ -import { rootParserOptions } from '../../eslint.config.js' -import testEslintConfig from '../eslint.config.js' - -/** @typedef {import('eslint').Linter.FlatConfig} */ -let FlatConfig - -/** @type {FlatConfig[]} */ -export const index = [ - ...testEslintConfig, - { - languageOptions: { - parserOptions: { - project: './tsconfig.eslint.json', - tsconfigDirName: import.meta.dirname, - ...rootParserOptions, - }, - }, - }, -] - -export default index diff --git a/test/plugin-relationship-object-ids/int.spec.ts b/test/plugin-relationship-object-ids/int.spec.ts deleted file mode 100644 index aab6ab1e9c9..00000000000 --- a/test/plugin-relationship-object-ids/int.spec.ts +++ /dev/null @@ -1,119 +0,0 @@ -import type { Payload } from 'payload' - -import path from 'path' -import { fileURLToPath } from 'url' - -import type { Post, Relation } from './payload-types.js' - -import { initPayloadInt } from '../helpers/initPayloadInt.js' - -const filename = fileURLToPath(import.meta.url) -const dirname = path.dirname(filename) - -describe('Relationship Object IDs Plugin', () => { - let relations: Relation[] - let posts: Post[] - let payload: Payload - - beforeAll(async () => { - ;({ payload } = await initPayloadInt(dirname)) - }) - - it('seeds data accordingly', async () => { - // eslint-disable-next-line jest/no-conditional-in-test - if (payload.db.name === 'mongoose') { - const relationsQuery = await payload.find({ - collection: 'relations', - sort: 'createdAt', - }) - - relations = relationsQuery.docs - - const postsQuery = await payload.find({ - collection: 'posts', - sort: 'createdAt', - }) - - posts = postsQuery.docs - - expect(relationsQuery.totalDocs).toStrictEqual(2) - expect(postsQuery.totalDocs).toStrictEqual(2) - } - }) - - it('stores relations as object ids', async () => { - // eslint-disable-next-line jest/no-conditional-in-test - if (payload.db.name === 'mongoose') { - const docs = await payload.db.collections.relations.find() - expect(typeof docs[0].hasOne).toBe('object') - expect(typeof docs[0].hasOnePoly.value).toBe('object') - expect(typeof docs[0].hasMany[0]).toBe('object') - expect(typeof docs[0].hasManyPoly[0].value).toBe('object') - expect(typeof docs[0].upload).toBe('object') - } - }) - - it('can query by relationship id', async () => { - // eslint-disable-next-line jest/no-conditional-in-test - if (payload.db.name === 'mongoose') { - const { totalDocs } = await payload.find({ - collection: 'relations', - where: { - hasOne: { - equals: posts[0].id, - }, - }, - }) - - expect(totalDocs).toStrictEqual(1) - } - }) - - it('populates relations', () => { - // eslint-disable-next-line jest/no-conditional-in-test - if (payload.db.name === 'mongoose') { - const populatedPostTitle = - // eslint-disable-next-line jest/no-conditional-in-test - typeof relations[0].hasOne === 'object' ? relations[0].hasOne.title : undefined - expect(populatedPostTitle).toBeDefined() - - const populatedUploadFilename = - // eslint-disable-next-line jest/no-conditional-in-test - typeof relations[0].upload === 'object' ? relations[0].upload.filename : undefined - - expect(populatedUploadFilename).toBeDefined() - } - }) - - it('can query by nested property', async () => { - // eslint-disable-next-line jest/no-conditional-in-test - if (payload.db.name === 'mongoose') { - const { totalDocs } = await payload.find({ - collection: 'relations', - where: { - 'hasOne.title': { - equals: 'post 1', - }, - }, - }) - - expect(totalDocs).toStrictEqual(1) - } - }) - - it('can query using the "in" operator', async () => { - // eslint-disable-next-line jest/no-conditional-in-test - if (payload.db.name === 'mongoose') { - const { totalDocs } = await payload.find({ - collection: 'relations', - where: { - hasMany: { - in: [posts[0].id], - }, - }, - }) - - expect(totalDocs).toStrictEqual(1) - } - }) -}) diff --git a/test/plugin-relationship-object-ids/payload-logo.png b/test/plugin-relationship-object-ids/payload-logo.png deleted file mode 100644 index 1a66766146dad0e16da32eec5e15a04e90e50aff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12542 zcmcJ#c{tSH`#(NoL?T+=DY8_evP7oHGL{x9MG<1Ml$b1ojCE!(QZE&eY*|MM+4n65 zvrFeoGI5YP!mS({$~ zm6POVfrc=`^oA)2RFxpUes2c|q?L5_lIiVGFk@^v<@Wb5oh9dNL1YT9Y^MqM&PkBw zwf1?C@Gg@J;GO?zKP}mAAtWxgQw}G6qVk2wd2lJ>ymH1p5s!~dc!Td4jhST>y~+@U zh4Tl?3g^m-HODtPz`%@m`l)z%;ENj&1LOs1fxufWkt4Yf5U3p_90)WH;c$|`2ePLZ zAaDf<=>rW36BAK@2)y(EgeY7nl24^cN+}w({1pSH(+OYZC`$VDW$OA#TH%cdp;P4L zU!S65huSvg+Z2FVhvOQAcxEsRXJKjbdy*QWXFq9kDaKfC^k zD$fD!%$#a&MJsO(U~VD{F z?%8Wa$y-9JTbj5yb`94U@KgVnxc!|lJ3kKX<9Kd+eC(cHa>_oA4=62w1GC`(JL@kE z7RZTBiP53uP~)fDk|l}F6kd_R1S28^yw#|L?bS7&0}FIGA4%)CyT$=S@V#!*_IxDa zM#=jvW&Sb~W|PA>3nQ2Hnq4Clwr9d0&viNBzAyr^)Zj$MH~f4vSH1&{Vo^K&VVWm>Y2D46w!v{o4v-{CNgLs<8uDH zgy665wx%C066|0(3t^v|f~H4Pw7VgtanckXZxDKv{l%>2a ziinP#Nr;auY+DMEvz8{2|D$|M&25UPQpH}IuQ|JaCD+u5Y;8yTkwNhp2Sko*PCDvN z=Jq`9^TO}hSitU|NNZc4y65SFUH&o=qZo01ea^m3zw{R)Ek+$|>Hl%7IqYMtwE_wR5h^^kydihn~NX{p0wPa8?hX4L!I>xHADA zv`jy!>AcR0^oxQ)QW!fx?ZXkl!%@Py$tY!sPgk^)d{2oSaP%ktniTN4nyC;&?B6B) zJp~YMdEr>Dxf+Jt?W0_&TSWQh+WY8E!@4NQRlQkk=7z@)Xr^z{Y1azJJAS5u)%hX7 zga;d%w{}W2w1N10oPhE82?mK&Qn$1T9@opcbr5I|R?Yu+NMV^xL)cM}Nu&^OFR<^- z!4C)(!H+z1fDLbNuO?s^OQilnE5HO(S|A|y(OefmsqM`p?Bo`4;C@>LoCI(%7P4PS zf_h_c5s0lmmw!-C}dKh`)7j050%PHzd~6o!Q14sF1YEF|115=W}QA z51ouxR6YJvL6kaZH;Ld!cH^m=fODJgc($^komBpKC&*Ps2pvUyM^AZ`0~pAbBmO-w z`am)E30wGgatfWCmz;JYw~$bCP!!a@mfUy{FhljJt)uck{`gO9x}a7=$;UcfCIXTO z0(I}{jU8dge|W`tkF-v2Z}s4>EQ~godHcL{<4FNpY zhu6VVQ{8DXqEZTS=>5QjOFEHTVKQQHQ#q6Do{eUDWhXZp9FzzBG8E#y0FH=lUpd9{nj~*r1XTC;JSVEv*XN7pKz#xmR47SAj z>V0{AQ2VSf+Z0e~>T9=Qbe(dAOPdjJ*kr-su7FUG@&kGu&|ZM z-#h%_GLzlc(LuOziY%M>mp(8^rZ+Znpyj-93T}3p+)|yjCGl4VftMp)L<-_m~pvh4mYaYuZPoC7lejhays z=5XWsx0QnZS>x6HSpBFqIZKVswsM<*h4ZD6g4Ll527y06JBwr2!sIx<@5VYhxdGx4 zSto{$4ZW}HWbj4@Z&V;e3Q=PeD~MJDYMt1^AOvEirdT0TV{y3FGi3`fmlfe40~LsF zO73vSDfu#0PbFw>I_WZbg^v|s(6BuA?3c~dV1uFDpnXy9lSY2`G>y|9MpIyNo#t2S zaX%K_?=d}A!U{Behl=Q^-vRK^&-a`E!9M)%Js|Qq!Fbc|M;f`!zU_gxF#9E7GNX2C zn_^exPW}?Q-i46fi<{BAqOuO6Ju!6dJg3V{P8CPZn z8&5ei^&Eb5RlpyT1)1}iM(I%vQgx>B!ZnGM-#YuVxC5W>la;QT|71DVMX_428}>C< zN52C0*Z5N5t!J4GJ5W^tcs~H%eDMo8QMc5BzBJJhbC7w?7$Xv=0R0OeRbL8C4fOPQ zo|;&%3_b=q754Jx)i;sG%vr!I9OR;y;OM*_*X8EEx}&BfYY$za)8ucdbk!RE^?s{{S%u?^_a8p;0qpGdvui z)utXDgw%RC-_~ub{Z`jntF06!&TTnbk25+7c$OfKqH51&M!obP?Q$&fo?uAB> za|7M-^*@`6<$mq$wSrpwn%7&Z|7X;|v%+KNbXr}$cug{)!K=o2V>zM2rNr*#N;6I1 z+hzKiytnrR@K|i@8l*-Wez1vnBg!R8F^Dq-N_A5~Kj3pe?RKlw?*6y2Ne1F_IJ6tr zalK}CExXS$8~tEPy7p%C>hAOg{oz+V=OP93F3j>tClmbWqmgE4Xq1M<2`%}!u3r7u zfmgH--5NMUWW8N!dKLdmTFB1eMDt^%EMEktJ&oyDvTL|n+7VHSr z_=n&R>VCS>8(~Pj&T%1^2wK@ww%wOnx_mvA8zk=Ch;TGkjNIhYLZC^fbD1|iu5Y=q zR5?)Tt^)Y&WryP?i%mqBJfT>!w2qEX`;-V1ZIymkucg+Q;!3$_6r0#R22bgT;|@4q z_=szD>l(ioS2Nd`WjbQ8a4|uY+Y}wnShp!pjbC|I8@h(zApa$WkK5Rq zL@xdM6jdTdA3Ch@o_SA)b61Ix@Vc5$@Oj7KFsQMtQG_78&9FTYc&AQHO*B0n3yGr6 zE^8Ttyz=X@?rPymXiWwUFcagw#^L;?RHDNBm(Im;`e1^W%1OLUYe*jQjh!CLU9dKw z{YN<~(ou+Z^036TW7z>x|HgF6wd4}Y?^?Aoq(hAciJnBBUH;PE zIMArCYrOx{w})AYHgC)ma1kU4G*j}PfmdnIG1@eNUPHw6sQYY;VvZX#P~-f4wpQuO zWfGP$*AHpr+V|wpIGEald48qmUMD9b5^~SAnKvOYBCXP2;TUYD@-dAM4fTy7BVk5` zoYtXN^j>FXnFI6%j#Sq-Jegt%msOlkaOIojnEFBY!rm*T+(eU3PtTgvOS;!`@uYhR zmKQ0LwLL{xeS4$mE(i8r-4`WjE1ekr9e5|Pr?zk93Hw~CJjW-N#n0Cu&Htp;)wyUK zY3P?hOa7gvp*Pmo?(JSH*E$H!CIb!^H4`*BP?YJmI`g1**V`BA@tlwb5;B3K4Hjg@ zGpZ!c-cD_zGZoyW2`kS2oV8BtdcySeq2+~zWs!(Z=uhPAHD{!BaL>xD&W9?qnfbjw za4nbnxaI1*Lu@#lR@Zslrd89s_L2ALi_e1nrUr^*DArXTwHR-4;XvO@BL+S$3GKs! zyT|Ru;X%!P`q2YW>rRIIs>lTk(z^zd&j7zCZuR6u-JJ8y@r|l;AsSMPdC|j&6_NF>a5c`ajin477QdTTs3!aIa-Pn5!CbVmh#MQY6zfg8ZhMbyjX= zc~`|6H1q{y>_3ZA`}2~pa|>baCzP_I<&@KJV9}|u1%!pF_`o7kAUwgv{r#@eV$7$S z<%{0J&#(#m=q%xFGH?i9&ThAOYSL761dk>yO zk_E}+fFg_zf&S8s}Ed^^_w+(uT(WyPAPM{GvZOdnriW3 z;dq@kx6XEPuPc`$wQ6+wOw`fn`v+3A%d`tZZo2U9e6cFZfsuoXPI|UIzuSh@Exw4Z zc)5y(^=G=Q|30WF%*x+f9ECsTVTAPCC((Yb!SEFM3}S|T$Ty=C@*Tu|w@Krgw#Pyj zTB}W1NfLAmrpzQur6o+Co&<;>>o^e~6%p)g68WX6MwzNqISzsamqH|hb?LkvTy#^M-#?8quQ+(ga&)dDthO|8Ca(G>z#B`*L ztXgz)Z*?#X+?DnOb!2qGv|FAk_ec+XVv`%@5DZfN<5 zLkRi5J0mt&_z=x1#VDMlR$^crbY;vS3m>q7vb||h=sg(|W?QH=6d^v}i&4D%bCOjw z%sfKFKxde%4>8rVzaQ3kAz6)H2Wn<)qXO8Nynv?yx?n5tel9l&ng&%bG$7ykgr?{$NZ}9tiOY~Rr z{8W>c;HwI0Sx3vWoQm(}g=H6$7&-bc@iy{D%qY9p^ImC3meSzh=cSNV-b_-R7Rq5kRm)Mr?cCOcUwIa6rVjhTPs_Y%klHeQh3 zYz|>66qkjmu=iQQX!TyX_tXpsc0KAEf~JBFy92!}E@y6!U65~f_=a;3?hv6?P~Aei zectvv?%O{6)x#3b6ubDZ#aMh;tLC{Yx56Tk_c$${Oj{Gt;i9q_x);5)?s`n+{ptH^ zhl6cJ*vbgxO4u~Bc&5D}JFi64R#j);v z$6qJR#jn^I&(}W6OKWO?PH{_%Va{HzHE7OyLz{qc&w`^B>zi~Qm!%7x2QgD*(We;NR=M(-E z@0_u{SKBEj+(n(Y75Sne_2jt8?bglu>rc*TJVH{e|4}{liRJ~@K^;f}h+a;;QG&+s zZO(OAkFAyJlWv6ZF~xyEa$RhOtX;o*SsZwe|epF+{*Fl}OBdEDXe8K}-{ z3>)_=#aWjtRNppW_?Q9k{dvga0onm@xNpjk?$MBL?hw&^5l{?1C7o3!kNP)2)gnl3 z=&e0*QN_Qfg|l3*3i(%JK>w6tx%yG*UbHOMA|)M{%yW)qIgF(xzGyl9H{Nw z3LJ$QW$zxFzE_Kfz7QL@;C97NeMgAr!UyQC;ENNULA!#Rh zwpPbW3R2X`@QY9&KO=uw+2~qewXJuz$<|npBoH!PL@56<%W=#%s_6{9`Uzp4Y}_II%|nzCT> zZJgrq_sHP2@&`x4JT3m2dx0nd9=lzZ%RU3qDUA74N(~mFeQ1dCC!P8mRS_06lQpG~ zS;ah-TTxmDC0oSool(B0G}U!#Bzt)xm2>teQYyQ>yV$_V*0j#4P+7n3K>iS5mUdw- zJ%gv+Q!Bi#wtr*5sW8}EL*z;h<#!^4r#^vAtz)N&&8S^NOak%fHMOYI6rV7m!MK_z zjpT+A8LwKV)fYt8e8{4<_!L8M@=;q;7dYkzFLBMe)};Kt=XL0ATu-BY8m{&6S-Vq+ zp(tV1DR7oUrt}Ao-BV>sA8s&C3>-Xw4=JB&0u$b~j4d+kq0td2%=x`a$P0&$ALt^} zHz=B5Lf+^@hX(s9$Z39H_qAQF)0>uL!;Iic`H zLS|;r?vMEyLD(E!x83?DEILyB7d;@BDWLISh*5;{Gv?HJvlC8nM`;~xiB-km8U#M5?>D*KZy`t|;-Srh>#t3QLI=MwPv!az#YOKH z;)yM|idB}@79OB`**`Q`Z&(U<0?}fHNAe-)_Z`@Nob#ER&bF;m7I5v{!ekhf4&O=d z?2M}q4t?*omrOXF(iVd=(g6!nwXfl2avZuf!Dx%dlAWP+eaT;8NcWD)ab{Jxj)gts zc%X5_`d_n6M&D-efJkV~8Nj&UZ%nPulZk5&qY8K93bH*Jk21v+N4_!r3T_&>sqF9d z`zF%@>bBT@RQo)Ms9|@d5PPQA^qC%AyM*z>g&Pec-nGo|AYFb z`_Dh$0D{skDiE*5fgYihMA>@>v*^vqeBXllzoYZkFbJMGDRCHB z=|Azl5_9};WH{`QE3g_q@xU(O;-l4dmb^UJ!LnetFJZqYUHN&f- ztY#c|sQ-}s%BxZMdHrq)mxu)5WTPJ6RlSMEn&<3tyRw}d%2hITLja^kbl*~tL8wD zEKQhAqE}iqi=M45cPeTM@g$-(Q&e?7cT*T!cO=YbEN;S3nBBn-ng*hPIx#tusvP;x zfg&!gSiJ{Y__8MrUUXK@mNheOD{7v%pf|5@8?gmk!o;WZWWtVoyDElP z$+c3gIWIP?q_7Op$_(6zPPS1wd;Cqpu#AsK>CfU}!TLuh3ad?HOs@vRXV|8GBlWG7 zXRYheSl3~pxim+sEf`a_# zC#>X}gw}fBuLvvsqyyPYB_3UB`e|KMzls2n@YLe3dm-q>B8BKDp0VZ%CtoItTBtEA z45RCfZW?+|u@;5U2J|x%cl8WRTm~4vpYQ2Efe&Yg5B9aZApNxk-Z0nVgtKLIuFsXB zMZ)JH4xTL4$QT>M9W{<$qk7FW{EoJE0Q~Nl%IaT*+gA%RgUFR*!t8p|I*=#K+|U;C zvHcQHP0PR7_|)H-P{PV69(=19>5L5FDyPGYZv=s;XnYw@fTxVxN~KOm$c9h1$TVq` zOU%GE_u|9e1sw##Ub;PQg7$z1``u3bDSJ}tfFS32<<VZDe?U!@m*UoDsW&wRM> zaG&bMOGaE9p}Ps6`sA7$cYNQW)X+J=wGVn~o+5F2eJD~ebkEL46p+nOnGt^ja>qXC z#6vat&mR_Q6P8*^b~blH6D?xuB~JRhUAcdI;IIQSC_owM?A{zQx8N0YI5DcPY}5*P zMVGa-nJMNrTCNi6>Q6z?tv(~`J%DjPx@~;DA<%Gefn4z7+CTLQdYV%Vx1v^Vz;BYY zZ5z`@^m8%ww}x$=&s&Z1mNxDE0=n_$TBULgIj1uaOvpyG4t$k!wM(gS9iX4lL~?LB z^HqU`+B7`yU@e^u;;e-gLmYU4@XX5L;Xl5fTn54Cwqw=g5i&2|;Aa<=Y=7nmN?q`=>_*FNMYmuQw_ZQj zFCSJu>{ESVRgfYxTQ=$f&ssMAG7UldmM2%!-Lv)D8zpjDYtnEzmb^a1J9}cTnxBi= zD!sAJfqngut?VkMnGJLCv`D!=U~66 z^Jg$deTXyYXIBbCET9oeC5K)$sSDbElqj<{(8Qbs9%1YnJnK6_!*<+G-X%T)wQOQvv!PC77bQ3k@k9;4pwkv{Lo-Lmtc)+F^h+ z-Gtl#cT$@2Mg?@h?XZeo7(NRse;v=C$^IO- z&U{pnd~2vn<^9f??k?Q*Rdtv6o!ysuo}rWL=`8v1{q;Y%BUj)pUkrcb1sub7Kg?f5 z{&KYt?+5F0&itWDG}}EBZ&z}w3bW}hwkJ;mMdZ&e z=cN9{mQa5u@)uy#-}%Z}csOiXPpl(y{f}adZ2PxW3RRd<35Lm+38Oj-z{I!c$;h9( zeODyrZ*kD;%$M&wDc@~|2?VnQ2lmW?XMV@R2NjsgpU}_A^_}VqA8N8;#c~-hB2Rz` zJf8CVO?u=8eb3MmkS=UiMf&|CK7-6&>xhw(&lJ&0oO8&$6%t0;S4J=_cO@=6C;jWrnYcoK%m>U)>BL_C;Y=Yq>@|c zmXbLF93Q>a4BNxX67;6jcnlLkc@_=MW9VyS4b7d4RcN9Q?Tjv?QM_?S-ue`ol15_( zxNcpe=DRw)C8lrNLft{7=9r9^BN0HFJS6fTcmE^YLFbMziM_qluxYp+Z6A(mL9hO3 z^P}tgkYv#smu18WI8LNbeoUyXvR&1;9Pi<9WRpERnVgTznp;kbOlQF$Ha`8v-4*8i zBV&~ZQ#Fn@hfg}?^}PdX6+$2E52sdUG0_!dW~X9g%bO+|M&<6gT*RecBw>UQ)O5F6l^ujBu>Ex^QV75~wq8EDUQY&}X#_n{YPt7!e$;8H6D83xb z)9{59cq3)gvJ$=P22DKO>u0N^1$U|`Kq9KUdW5axog>4q6Adz}yk_E;UAWgn4>VIa zzq`~!aA__?cDgCQr8tOgKMRYE za1b9=s{L|+oUZ^WP}+@KwL9}c`|+2dT>3??`CU&?pz`Xk)3=na-6^}X9~KbfUUq|$ z+)$w=KU-R;a4)Ytams+gLUo1T`|~e1`j|!JB0=Q6HmJUn!`M!5n8k{+IbZ4r<#6+p z4vCUqa%@SjU#?4#>RjAZ;9-0oI)+^4iML|r+7brC#VHicO-`}Z8MiY%p6K+Wp>LN6j2G`5>3pf>;#}};l_j%bVB|E&o)h1 zm&7#1xBdO1DM^dqGw#{Bca~0Byw2XivbGj!x3zX`>Rjmx+?f!f>CDs9Lmz;PEMY`y z$2S%5gBLz-Oc;3o!}6$r6r}0?f%9b9;O?;TTbMtmaiC=MySLaMMq%etfV~1ol5W9pnddSH~Qbi$(pux{%P2&1~Z^K zIZHe$;I?fF*hqAki62nC^3M)b;VfYr%ONd+cg8*&X%QZq=#L8V-cX3k&J|XamLDRg z&=N=De|^lCuDK1JYEB8@j;O|PRs;*uTc{I2H8uC91Gs^z?+s4ZTfZ2|W1Y-O zC@aex>n9>xxt`*E(=QL@dPte#DWY%R{Tp8PDyQDBKsAN%gf%1En;AFPf?cx)SSem9 z4El=bpzBLpkaPW}N@o>p_p5U2-`YBojG~gFir7)+igCo%H_J2Sc6I(^?N`3^WuBw{ zSvN9XU%EJ?eA%KqgXO>%8FEn0HTR7hJal+WBsaY%Z#=$r?QZ8gU}Ev31l}5+*(+=Q z@lnRzih92vKKV_^L97Kd11S=mYFeIoTZ0%{Y!+-t&b>M4>(@h$++f9m{~;h%njKC2 z96gf&h)%|zc%EH8Dw8&$0<7g*vWl~_4qI*&!#*xao_PcL;!RY~O8;Tl#rv(oNHJO^mh{d-0Tq8=|`BoA7g4@kU zKPk@++(^IS$Nkwri)f~VaL&IWH*WrWsx_1^6%#dOAz;t;cO;##lEe%Q-j6>%w z{4QzuT7LiYZ{(J^B~AJkAVL1Ka$T_qN12Nif3e20Mw*E4XV?;&CL}259-8_+*Jj?0 z;fyr6mTQ!w)(v4?Sq0j~Sy4=UL|?EFIw>af@r0dDo5N#VD-sEFbe2_`DM^v8$1_GA z4M5)qHL_}gRO+?ot8AN2pQ^d**rk&lX;~Z9Y?tVtsdL1biq~^#mh40>+ol{V?`WhP zxq~Tp4iQjlYMcxpjt$iWoB~D-bFjBTP5xgEM(D0y8<8<+bZae8Tfd4>z-gcjCRHBc zQ7!2>c}JNa*Ud{nw;ev#!s;vgbwPI#Nnpa&rSBvET-cNM5TQ#7uHDt%M{%6UKZO)^ z?bea+%`}YL|BMsip)em1tkm9PtDfYQX%23;yRo-7kMXK(A$z<}CUEN?cTUT@78pYd z~0(aYUo(T0WPu}+{SR3PfYkcwg z1CWOnatl6q-hJH6a{d>qsh>^!bkY$p;b5Lyt-2em~ zzP#n>Q1H%qqU}9U*6B~93wj_drCbOtmqs{@r0b_ETg7PBOm8t>uMuC#S5@5F%57f{>#L4asl5(6o zo8aXnM@?j!>Z3h~U|$u3YQ@d9zpKB$#Kw-Wt}$dJK{dnSCJDq`gbHk80Z2Y62A+T8 zVxXfT4+BXaB!4DGB#;0BYetaI`L@XfrUe|4<9#{{;uD)q1;0teMLeyiHuvgO1p8zF zaTE0cM-C?=HZ%0lof(Y5Tf|@U?ks332T_y#%Xf>qnhEg`Co%YoaKz&9Ssb#vW_XMB zzFxm8Bm7`k=+dwIuau3!!}W%-U{^aKp2kTGEft73p>#kQKKQ<1kjIH!yvYcEIN%0F zpH-?S>dLp?kzXs18xfm9+~gRg{#Odr8gITrv-mB@HCTw3o=iwM8hyM;1c+MSSWviz z2(YV^F#G9AjElKPm(7<~WG5}rHx^x#Iwol0Ij&X9of-bVCe;#d-PX2uUN|K{1!tfcvuZgfVea1 z-*0*9BSEb1uJezy8Xkz@2>cb3g8)pbrj5&_8Lu<^A`O;2%d(u(mD&wg46pAYt92F@ zJrlwKDI${N2)_nF-a_5&{aKNCvpiYe72}w16EU3WMGZX`Z01s+Uu z@P&?ndhs`Y1L?8f$ppl7D1ahBW`_kM4w3*+FKmCW=<9SgjKRsFK_UAGGXPZd&Y2F+ z{PFZ#IYBxE`JyD6jTQh{4DFO#&@*_Z3w`mKQo z7S!G&Hlwccb~Mow0JRqG?bXW!3=IUL@9))fFsK;=LSzt*wT*Z8w*U}#t;0J3BHZPc z1KS|`aKFf4U^K`MC Date: Fri, 23 Aug 2024 15:59:02 -0400 Subject: [PATCH 062/173] chore: initiates aggregate pagination for joins --- packages/db-mongodb/package.json | 4 +- packages/db-mongodb/src/find.ts | 14 ++- packages/db-mongodb/src/init.ts | 7 +- .../src/models/buildCollectionSchema.ts | 5 ++ packages/db-mongodb/src/types.ts | 14 ++- pnpm-lock.yaml | 87 ++++++++++++------- 6 files changed, 89 insertions(+), 42 deletions(-) diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 9b57b9e4ab9..17ac80a954e 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -36,14 +36,14 @@ "bson-objectid": "2.0.4", "http-status": "1.6.2", "mongoose": "6.12.3", - "mongoose-aggregate-paginate-v2": "1.0.9", + "mongoose-aggregate-paginate-v2": "1.0.6", "mongoose-paginate-v2": "1.7.22", "prompts": "2.4.2", "uuid": "10.0.0" }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", - "@types/mongoose-aggregate-paginate-v2": "1.0.9", + "@types/mongoose-aggregate-paginate-v2": "1.0.6", "mongodb": "4.17.1", "mongodb-memory-server": "^9", "payload": "workspace:*" diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index 43e866c052d..f14653c3c58 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -1,4 +1,4 @@ -import type { PaginateOptions } from 'mongoose' +import type { Aggregate, PaginateOptions } from 'mongoose' import type { Find, PayloadRequest } from 'payload' import { flattenWhereToOperators } from 'payload' @@ -101,12 +101,18 @@ export const find: Find = async function find( } } - const result = await Model.paginate(query, paginationOptions) + let result + + if (Object.keys(collectionConfig.joins).length > 0) { + const aggregate = [] as unknown as Aggregate + // Do some aggregation here + result = await Model.aggregatePaginate(aggregate, paginationOptions) + } else { + result = await Model.paginate(query, paginationOptions) + } const joinPromises = [] - // TODO: - // we need to convert to aggregation here for performance result.docs.forEach((doc) => { joinPromises.push( setJoins({ diff --git a/packages/db-mongodb/src/init.ts b/packages/db-mongodb/src/init.ts index ee1f9fe3865..72b70e5d580 100644 --- a/packages/db-mongodb/src/init.ts +++ b/packages/db-mongodb/src/init.ts @@ -2,6 +2,7 @@ import type { PaginateOptions } from 'mongoose' import type { Init, SanitizedCollectionConfig } from 'payload' import mongoose from 'mongoose' +import mongooseAggregatePaginate from 'mongoose-aggregate-paginate-v2' import paginate from 'mongoose-paginate-v2' import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' @@ -40,12 +41,16 @@ export const init: Init = function init(this: MongooseAdapter) { }), ) + if (Object.keys(collection.joins).length > 0) { + versionSchema.plugin(mongooseAggregatePaginate) + } + const model = mongoose.model( versionModelName, versionSchema, this.autoPluralization === true ? undefined : versionModelName, ) as CollectionModel - // this.payload.versions[collection.slug] = model; + this.versions[collection.slug] = model } diff --git a/packages/db-mongodb/src/models/buildCollectionSchema.ts b/packages/db-mongodb/src/models/buildCollectionSchema.ts index 08eaf9d29d7..9122ee30ede 100644 --- a/packages/db-mongodb/src/models/buildCollectionSchema.ts +++ b/packages/db-mongodb/src/models/buildCollectionSchema.ts @@ -1,6 +1,7 @@ import type { PaginateOptions, Schema } from 'mongoose' import type { SanitizedCollectionConfig, SanitizedConfig } from 'payload' +import mongooseAggregatePaginate from 'mongoose-aggregate-paginate-v2' import paginate from 'mongoose-paginate-v2' import getBuildQueryPlugin from '../queries/buildQuery.js' @@ -42,6 +43,10 @@ const buildCollectionSchema = ( .plugin(paginate, { useEstimatedCount: true }) .plugin(getBuildQueryPlugin({ collectionSlug: collection.slug })) + if (Object.keys(collection.joins).length > 0) { + schema.plugin(mongooseAggregatePaginate) + } + return schema } diff --git a/packages/db-mongodb/src/types.ts b/packages/db-mongodb/src/types.ts index efa53c69799..701411d795c 100644 --- a/packages/db-mongodb/src/types.ts +++ b/packages/db-mongodb/src/types.ts @@ -1,4 +1,11 @@ -import type { IndexDefinition, IndexOptions, Model, PaginateModel, SchemaOptions } from 'mongoose' +import type { + AggregatePaginateModel, + IndexDefinition, + IndexOptions, + Model, + PaginateModel, + SchemaOptions, +} from 'mongoose' import type { ArrayField, BlockField, @@ -28,7 +35,10 @@ import type { import type { BuildQueryArgs } from './queries/buildQuery.js' -export interface CollectionModel extends Model, PaginateModel { +export interface CollectionModel + extends Model, + PaginateModel, + AggregatePaginateModel { /** buildQuery is used to transform payload's where operator into what can be used by mongoose (e.g. id => _id) */ buildQuery: (args: BuildQueryArgs) => Promise> // TODO: Delete this } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 030cb1bcd26..19c489c1ca6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -143,7 +143,7 @@ importers: version: 9.4.1(@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))) next: specifier: 15.0.0-canary.104 - version: 15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + version: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) open: specifier: ^10.1.0 version: 10.1.0 @@ -271,6 +271,9 @@ importers: mongoose: specifier: 6.12.3 version: 6.12.3(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + mongoose-aggregate-paginate-v2: + specifier: 1.0.6 + version: 1.0.6 mongoose-paginate-v2: specifier: 1.7.22 version: 1.7.22 @@ -285,8 +288,8 @@ importers: specifier: workspace:* version: link:../eslint-config '@types/mongoose-aggregate-paginate-v2': - specifier: 1.0.9 - version: 1.0.9(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + specifier: 1.0.6 + version: 1.0.6(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) mongodb: specifier: 4.17.1 version: 4.17.1(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) @@ -714,7 +717,7 @@ importers: version: 1.6.2 next: specifier: ^15.0.0-canary.104 - version: 15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + version: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) path-to-regexp: specifier: ^6.2.1 version: 6.2.2 @@ -942,7 +945,7 @@ importers: version: link:../payload ts-jest: specifier: ^29.1.0 - version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.19.12)(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) + version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) packages/plugin-cloud-storage: dependencies: @@ -1045,19 +1048,6 @@ importers: specifier: workspace:* version: link:../payload - packages/plugin-relationship-object-ids: - dependencies: - mongoose: - specifier: 6.12.3 - version: 6.12.3(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) - devDependencies: - '@payloadcms/eslint-config': - specifier: workspace:* - version: link:../eslint-config - payload: - specifier: workspace:* - version: link:../payload - packages/plugin-search: dependencies: '@payloadcms/ui': @@ -1139,7 +1129,7 @@ importers: version: link:../payload ts-jest: specifier: ^29.1.0 - version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.19.12)(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) + version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) packages/plugin-seo: dependencies: @@ -1446,7 +1436,7 @@ importers: version: link:../plugin-cloud-storage uploadthing: specifier: ^6.10.1 - version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) + version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) devDependencies: payload: specifier: workspace:* @@ -1691,9 +1681,6 @@ importers: '@payloadcms/plugin-redirects': specifier: workspace:* version: link:../packages/plugin-redirects - '@payloadcms/plugin-relationship-object-ids': - specifier: workspace:* - version: link:../packages/plugin-relationship-object-ids '@payloadcms/plugin-search': specifier: workspace:* version: link:../packages/plugin-search @@ -1777,7 +1764,7 @@ importers: version: 0.17.0 next: specifier: 15.0.0-canary.104 - version: 15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + version: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) payload: specifier: workspace:* version: link:../packages/payload @@ -1807,7 +1794,7 @@ importers: version: 5.5.4 uploadthing: specifier: ^6.10.1 - version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) + version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) uuid: specifier: 10.0.0 version: 10.0.0 @@ -4429,8 +4416,8 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/mongoose-aggregate-paginate-v2@1.0.9': - resolution: {integrity: sha512-YKDKtSuE1vzMY/SAtlDTWJr52UhTYdrOypCqyx7T2xFYEWfybLnV98m4ZoVgYJH0XowVl7Y2Gnn6p1sF+3NbLA==} + '@types/mongoose-aggregate-paginate-v2@1.0.6': + resolution: {integrity: sha512-EXkgB/nJ1x3UcoEk1pD67+uXtijveHZtbg2H3wtZk2SnCFBB5cMw7MQRu9/GgyEP/KKXuWFt1JABv7m+Kls0ug==} '@types/node@20.12.5': resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==} @@ -7228,7 +7215,6 @@ packages: libsql@0.3.19: resolution: {integrity: sha512-Aj5cQ5uk/6fHdmeW0TiXK42FqUlwx7ytmMLPSaUQPin5HKKKuUPD62MAbN4OEweGBBI7q1BekoEN4gPUEL6MZA==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lie@3.1.1: @@ -7496,6 +7482,10 @@ packages: snappy: optional: true + mongoose-aggregate-paginate-v2@1.0.6: + resolution: {integrity: sha512-UuALu+mjhQa1K9lMQvjLL3vm3iALvNw8PQNIh2gp1b+tO5hUa0NC0Wf6/8QrT9PSJVTihXaD8hQVy3J4e0jO0Q==} + engines: {node: '>=4.0.0'} + mongoose-paginate-v2@1.7.22: resolution: {integrity: sha512-xW5GugkE21DJiu9e13EOxKt4ejEKQkRP/S1PkkXRjnk2rRZVKBcld1nPV+VJ/YCPfm8hb3sz9OvI7O38RmixkA==} engines: {node: '>=4.0.0'} @@ -13108,7 +13098,7 @@ snapshots: '@types/minimist@1.2.5': {} - '@types/mongoose-aggregate-paginate-v2@1.0.9(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))': + '@types/mongoose-aggregate-paginate-v2@1.0.6(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))': dependencies: mongoose: 6.12.3(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) transitivePeerDependencies: @@ -16839,6 +16829,8 @@ snapshots: '@aws-sdk/credential-providers': 3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) '@mongodb-js/saslprep': 1.1.8 + mongoose-aggregate-paginate-v2@1.0.6: {} + mongoose-paginate-v2@1.7.22: {} mongoose@6.12.3(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)): @@ -16927,6 +16919,36 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4): + dependencies: + '@next/env': 15.0.0-canary.104 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.12 + busboy: 1.6.0 + caniuse-lite: 1.0.30001651 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + styled-jsx: 5.1.6(@babel/core@7.25.2)(babel-plugin-macros@3.1.0)(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.0-canary.104 + '@next/swc-darwin-x64': 15.0.0-canary.104 + '@next/swc-linux-arm64-gnu': 15.0.0-canary.104 + '@next/swc-linux-arm64-musl': 15.0.0-canary.104 + '@next/swc-linux-x64-gnu': 15.0.0-canary.104 + '@next/swc-linux-x64-musl': 15.0.0-canary.104 + '@next/swc-win32-arm64-msvc': 15.0.0-canary.104 + '@next/swc-win32-ia32-msvc': 15.0.0-canary.104 + '@next/swc-win32-x64-msvc': 15.0.0-canary.104 + '@playwright/test': 1.46.0 + babel-plugin-react-compiler: 0.0.0-experimental-1cd8995-20240814 + sass: 1.77.4 + sharp: 0.33.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nice-napi@1.0.2: dependencies: node-addon-api: 3.2.1 @@ -18519,7 +18541,7 @@ snapshots: dependencies: typescript: 5.5.4 - ts-jest@29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.19.12)(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4): + ts-jest@29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -18537,7 +18559,6 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - esbuild: 0.19.12 tslib@1.14.1: {} @@ -18705,7 +18726,7 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 - uploadthing@6.13.2(express@4.19.2)(next@15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)): + uploadthing@6.13.2(express@4.19.2)(next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)): dependencies: '@effect/schema': 0.68.12(effect@3.4.5) '@uploadthing/mime-types': 0.2.10 @@ -18715,7 +18736,7 @@ snapshots: std-env: 3.7.0 optionalDependencies: express: 4.19.2 - next: 15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + next: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-1cd8995-20240814)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) uri-js@4.4.1: dependencies: From 2e2ca0e88931938e18298cffaf5848da60ab05ea Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 23 Aug 2024 17:16:42 -0400 Subject: [PATCH 063/173] chore: wip join aggregation --- packages/db-mongodb/src/find.ts | 115 ++++++++++++++++++++++++++------ 1 file changed, 94 insertions(+), 21 deletions(-) diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index f14653c3c58..ab8c749e306 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -1,4 +1,4 @@ -import type { Aggregate, PaginateOptions } from 'mongoose' +import type { PaginateOptions, PipelineStage } from 'mongoose' import type { Find, PayloadRequest } from 'payload' import { flattenWhereToOperators } from 'payload' @@ -7,14 +7,13 @@ import type { MongooseAdapter } from './index.js' import { buildSortParam } from './queries/buildSortParam.js' import sanitizeInternalFields from './utilities/sanitizeInternalFields.js' -import { setJoins } from './utilities/setJoins.js' import { withSession } from './withSession.js' export const find: Find = async function find( this: MongooseAdapter, { collection, - joins, + joins = {}, limit, locale, page, @@ -103,29 +102,103 @@ export const find: Find = async function find( let result - if (Object.keys(collectionConfig.joins).length > 0) { - const aggregate = [] as unknown as Aggregate + if (Object.keys(collectionConfig.joins).length > 0 && joins !== false) { + const joinConfig = this.payload.collections[collection].config.joins + const aggregate: PipelineStage[] = [{ $match: query }] // Do some aggregation here - result = await Model.aggregatePaginate(aggregate, paginationOptions) + + Object.keys(joinConfig).forEach((slug) => { + joinConfig[slug].forEach((join) => { + // get the query options for the join off of req + // if (joins[join.schemaPath] === false || req.query[join.schemaPath] === 'false') { + // continue + // } + + const { limit, page, pagination = true, sort } = joins[join.schemaPath] || {} + + // skip if joins doesn't have the schemaPath !== false + + // add lookup to join the doc ids and localize the key as needed + // if locale all, do every locale + + // $lookup + // from: collection + // localField: _id + // foreignField: on (localized) + // as collection + + if (this.payload.config.localization && locale === 'all') { + this.payload.config.localization.localeCodes.forEach((code) => { + aggregate.push({ + $lookup: { + as: `${join.schemaPath}.${code}`, + foreignField: `${join.field.on}.${code}`, + from: slug, + localField: '_id', + }, + // $count to count the docs + }) + }) + // $count to count the docs + // $slice to limit the docs + } else { + const localeSuffix = + join.field.localized && this.payload.config.localization && locale ? `.${locale}` : '' + const as = `${join.schemaPath}${localeSuffix}` + const asAlias = `${join.schemaPath}${localeSuffix}`.replaceAll('.', '_') + aggregate.push({ + $lookup: { + as, + foreignField: `${join.field.on}${localeSuffix}`, + from: slug, + localField: '_id', + }, + }) + aggregate.push({ + $addFields: { + [asAlias]: as, + }, + }) + aggregate.push({ + $unwind: `$${asAlias}`, + }) + aggregate.push({ + $group: { + _id: '$_id', + [asAlias]: { $push: `$${as}._id` }, + }, + }) + aggregate.push({ + $addFields: { + [as]: asAlias, + }, + }) + // $count to count the docs + // $slice to limit the docs + } + }) + }) + + result = await Model.aggregatePaginate(Model.aggregate(aggregate), paginationOptions) } else { result = await Model.paginate(query, paginationOptions) } - const joinPromises = [] - - result.docs.forEach((doc) => { - joinPromises.push( - setJoins({ - collection, - doc, - joins, - payload: this.payload, - req, - }), - ) - }) - - await Promise.all(joinPromises) + // const joinPromises = [] + + // result.docs.forEach((doc) => { + // joinPromises.push( + // setJoins({ + // collection, + // doc, + // joins, + // payload: this.payload, + // req, + // }), + // ) + // }) + + // await Promise.all(joinPromises) const docs = JSON.parse(JSON.stringify(result.docs)) From bb714bd4861e030b0eef81e953b0c128ed46be2a Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Mon, 26 Aug 2024 14:44:55 -0400 Subject: [PATCH 064/173] prefills document drawer from relationship table --- .../elements/DocumentDrawer/DrawerContent.tsx | 4 ++ .../ui/src/elements/DocumentDrawer/types.ts | 3 ++ .../src/elements/RelationshipTable/index.tsx | 23 ++++++++++- .../ui/src/providers/DocumentInfo/index.tsx | 8 +++- .../ui/src/providers/DocumentInfo/types.ts | 38 +++++++++---------- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/packages/ui/src/elements/DocumentDrawer/DrawerContent.tsx b/packages/ui/src/elements/DocumentDrawer/DrawerContent.tsx index 394e25a9a00..46635e352e0 100644 --- a/packages/ui/src/elements/DocumentDrawer/DrawerContent.tsx +++ b/packages/ui/src/elements/DocumentDrawer/DrawerContent.tsx @@ -23,6 +23,8 @@ export const DocumentDrawerContent: React.FC = ({ Header, collectionSlug, drawerSlug, + initialData, + initialState, onSave: onSaveFromProps, }) => { const { config } = useConfig() @@ -101,6 +103,8 @@ export const DocumentDrawerContent: React.FC = ({ disableActions disableLeaveWithoutSaving id={docID} + initialData={initialData} + initialState={initialState} isEditing={isEditing} onLoadError={onLoadError} onSave={onSave} diff --git a/packages/ui/src/elements/DocumentDrawer/types.ts b/packages/ui/src/elements/DocumentDrawer/types.ts index 96395be916d..7cc56e6ca9d 100644 --- a/packages/ui/src/elements/DocumentDrawer/types.ts +++ b/packages/ui/src/elements/DocumentDrawer/types.ts @@ -1,3 +1,4 @@ +import type { Data, FormState } from 'payload' import type React from 'react' import type { HTMLAttributes } from 'react' @@ -8,6 +9,8 @@ export type DocumentDrawerProps = { readonly collectionSlug: string readonly drawerSlug?: string readonly id?: null | number | string + readonly initialData?: Data + readonly initialState?: FormState readonly onSave?: DocumentInfoContext['onSave'] } & Pick diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 934ff7d96c5..7ebfd955c13 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -21,6 +21,7 @@ import { Pill } from '../../elements/Pill/index.js' import { usePayloadAPI } from '../../hooks/usePayloadAPI.js' import { ChevronIcon } from '../../icons/Chevron/index.js' import { useConfig } from '../../providers/Config/index.js' +import { useDocumentInfo } from '../../providers/DocumentInfo/index.js' import { ListQueryProvider } from '../../providers/ListQuery/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { ColumnSelector } from '../ColumnSelector/index.js' @@ -54,6 +55,8 @@ export const RelationshipTable: React.FC = (pro getEntityConfig, } = useConfig() + const { id: docID } = useDocumentInfo() + const [initialData, setInitialData] = useState(initialDataFromProps) const { i18n, t } = useTranslation() @@ -138,6 +141,7 @@ export const RelationshipTable: React.FC = (pro const onDrawerSave = useCallback( (args) => { const foundDocIndex = data?.docs?.findIndex((doc) => doc.id === args.doc.id) + if (foundDocIndex !== -1) { const newDocs = [...data.docs] newDocs[foundDocIndex] = args.doc @@ -145,6 +149,11 @@ export const RelationshipTable: React.FC = (pro ...data, docs: newDocs, }) + } else { + setInitialData({ + ...data, + docs: [args.doc, ...data.docs], + }) } }, [data], @@ -250,7 +259,19 @@ export const RelationshipTable: React.FC = (pro - + ) } diff --git a/packages/ui/src/providers/DocumentInfo/index.tsx b/packages/ui/src/providers/DocumentInfo/index.tsx index 6199832bb86..8b4d987764d 100644 --- a/packages/ui/src/providers/DocumentInfo/index.tsx +++ b/packages/ui/src/providers/DocumentInfo/index.tsx @@ -37,7 +37,7 @@ export const useDocumentInfo = (): DocumentInfoContext => useContext(Context) const DocumentInfo: React.FC< { - children: React.ReactNode + readonly children: React.ReactNode } & DocumentInfoProps > = ({ children, ...props }) => { const { @@ -419,6 +419,12 @@ const DocumentInfo: React.FC< initialDataFromProps === undefined || localeChanged ) { + console.log( + 'DocumentInfo useEffect', + initialStateFromProps, + initialDataFromProps, + localeChanged, + ) if (localeChanged) prevLocale.current = locale const getInitialState = async () => { diff --git a/packages/ui/src/providers/DocumentInfo/types.ts b/packages/ui/src/providers/DocumentInfo/types.ts index c5b1e794954..22c8a9148c8 100644 --- a/packages/ui/src/providers/DocumentInfo/types.ts +++ b/packages/ui/src/providers/DocumentInfo/types.ts @@ -16,25 +16,25 @@ import type { import type React from 'react' export type DocumentInfoProps = { - AfterDocument?: React.ReactNode - AfterFields?: React.ReactNode - BeforeDocument?: React.ReactNode - BeforeFields?: React.ReactNode - action?: string - apiURL?: string - collectionSlug?: SanitizedCollectionConfig['slug'] - disableActions?: boolean - disableLeaveWithoutSaving?: boolean - docPermissions?: DocumentPermissions - globalSlug?: SanitizedGlobalConfig['slug'] - hasPublishPermission?: boolean - hasSavePermission?: boolean - id: null | number | string - initialData?: Data - initialState?: FormState - isEditing?: boolean - onLoadError?: (data?: any) => Promise | void - onSave?: (data: Data) => Promise | void + readonly AfterDocument?: React.ReactNode + readonly AfterFields?: React.ReactNode + readonly BeforeDocument?: React.ReactNode + readonly BeforeFields?: React.ReactNode + readonly action?: string + readonly apiURL?: string + readonly collectionSlug?: SanitizedCollectionConfig['slug'] + readonly disableActions?: boolean + readonly disableLeaveWithoutSaving?: boolean + readonly docPermissions?: DocumentPermissions + readonly globalSlug?: SanitizedGlobalConfig['slug'] + readonly hasPublishPermission?: boolean + readonly hasSavePermission?: boolean + readonly id: null | number | string + readonly initialData?: Data + readonly initialState?: FormState + readonly isEditing?: boolean + readonly onLoadError?: (data?: any) => Promise | void + readonly onSave?: (data: Data) => Promise | void } export type DocumentInfoContext = { From c24b63fa4846297e28f7c75f1b85134a060eefb4 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Mon, 26 Aug 2024 14:55:11 -0400 Subject: [PATCH 065/173] closes drawer on create --- packages/ui/src/elements/RelationshipTable/index.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 7ebfd955c13..658e088e078 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -134,7 +134,7 @@ export const RelationshipTable: React.FC = (pro setParams(params) }, [page, sort, where, search, cacheBust, collectionConfig, setParams, limit, filterOptions]) - const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({ + const [DocumentDrawer, DocumentDrawerToggler, { closeDrawer }] = useDocumentDrawer({ collectionSlug: relationTo, }) @@ -142,6 +142,8 @@ export const RelationshipTable: React.FC = (pro (args) => { const foundDocIndex = data?.docs?.findIndex((doc) => doc.id === args.doc.id) + closeDrawer() + if (foundDocIndex !== -1) { const newDocs = [...data.docs] newDocs[foundDocIndex] = args.doc @@ -156,7 +158,7 @@ export const RelationshipTable: React.FC = (pro }) } }, - [data], + [data, closeDrawer], ) const preferenceKey = `${relationTo}-list` From 5211f58966705d50d66cfce8efa801278e94e15c Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Mon, 26 Aug 2024 15:26:44 -0400 Subject: [PATCH 066/173] feat: adds Locked component & translations for DocumentLocked comp & Locked comp --- .../src/elements/DocumentLocked/index.tsx | 7 ++-- packages/translations/src/clientKeys.ts | 3 ++ packages/translations/src/languages/ar.ts | 4 +++ packages/translations/src/languages/az.ts | 4 +++ packages/translations/src/languages/bg.ts | 4 +++ packages/translations/src/languages/cs.ts | 4 +++ packages/translations/src/languages/de.ts | 4 +++ packages/translations/src/languages/en.ts | 4 +++ packages/translations/src/languages/es.ts | 4 +++ packages/translations/src/languages/fa.ts | 4 +++ packages/translations/src/languages/fr.ts | 4 +++ packages/translations/src/languages/he.ts | 4 +++ packages/translations/src/languages/hr.ts | 4 +++ packages/translations/src/languages/hu.ts | 4 +++ packages/translations/src/languages/it.ts | 4 +++ packages/translations/src/languages/ja.ts | 4 +++ packages/translations/src/languages/ko.ts | 4 +++ packages/translations/src/languages/my.ts | 4 +++ packages/translations/src/languages/nb.ts | 4 +++ packages/translations/src/languages/nl.ts | 4 +++ packages/translations/src/languages/pl.ts | 4 +++ packages/translations/src/languages/pt.ts | 4 +++ packages/translations/src/languages/ro.ts | 4 +++ packages/translations/src/languages/rs.ts | 4 +++ .../translations/src/languages/rsLatin.ts | 4 +++ packages/translations/src/languages/ru.ts | 4 +++ packages/translations/src/languages/sk.ts | 4 +++ packages/translations/src/languages/sv.ts | 4 +++ packages/translations/src/languages/th.ts | 4 +++ packages/translations/src/languages/tr.ts | 4 +++ packages/translations/src/languages/uk.ts | 4 +++ packages/translations/src/languages/vi.ts | 4 +++ packages/translations/src/languages/zh.ts | 4 +++ packages/translations/src/languages/zhTw.ts | 4 +++ packages/ui/src/elements/Locked/index.scss | 14 ++++++++ packages/ui/src/elements/Locked/index.tsx | 36 +++++++++++++++++++ 36 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 packages/ui/src/elements/Locked/index.scss create mode 100644 packages/ui/src/elements/Locked/index.tsx diff --git a/packages/next/src/elements/DocumentLocked/index.tsx b/packages/next/src/elements/DocumentLocked/index.tsx index f17b0f3a44f..e46997a8b5e 100644 --- a/packages/next/src/elements/DocumentLocked/index.tsx +++ b/packages/next/src/elements/DocumentLocked/index.tsx @@ -43,10 +43,11 @@ export const DocumentLocked: React.FC<{

{t('general:documentLocked')}

-

{`${user?.email ?? user?.id} is currently editing this document. If you take over, they will be blocked from continuing to eit, and may also lose unsaved changes.`}

- {`Edited since `} - {formatDate(editedAt)} + {user?.email ?? user?.id} {t('general:currentlyEditing')} +

+

+ {t('general:editedSince')} {formatDate(editedAt)}

diff --git a/packages/translations/src/clientKeys.ts b/packages/translations/src/clientKeys.ts index 6e26b249616..d55006682f0 100644 --- a/packages/translations/src/clientKeys.ts +++ b/packages/translations/src/clientKeys.ts @@ -150,6 +150,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'general:createNewLabel', 'general:creating', 'general:creatingNewLabel', + 'general:currentlyEditing', 'general:custom', 'general:dark', 'general:dashboard', @@ -169,6 +170,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'general:editing', 'general:editingLabel', 'general:editLabel', + 'general:editedSince', 'general:email', 'general:emailAddress', 'general:enterAValue', @@ -180,6 +182,7 @@ export const clientTranslationKeys = createClientTranslationKeys([ 'general:filterWhere', 'general:globals', 'general:goBack', + 'general:isEditing', 'general:language', 'general:lastModified', 'general:leaveAnyway', diff --git a/packages/translations/src/languages/ar.ts b/packages/translations/src/languages/ar.ts index 555a67cf089..b66b3c55e4a 100644 --- a/packages/translations/src/languages/ar.ts +++ b/packages/translations/src/languages/ar.ts @@ -201,6 +201,8 @@ export const arTranslations: DefaultTranslationsObject = { createdAt: 'تمّ الإنشاء في', creating: 'يتمّ الإنشاء', creatingNewLabel: 'جاري إنشاء {{label}} جديد', + currentlyEditing: + 'يقوم حاليًا بتحرير هذا المستند. إذا توليت، سيتم منعه من الاستمرار في التحرير وقد يفقد التغييرات غير المحفوظة.', custom: 'مخصص', dark: 'غامق', dashboard: 'لوحة التّحكّم', @@ -218,6 +220,7 @@ export const arTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'استنساخ بدون حفظ التغييرات', edit: 'تعديل', editLabel: 'تعديل {{label}}', + editedSince: 'تم التحرير منذ', editing: 'جاري التعديل', editingLabel_many: 'تعديل {{count}} {{label}}', editingLabel_one: 'تعديل {{count}} {{label}}', @@ -234,6 +237,7 @@ export const arTranslations: DefaultTranslationsObject = { filters: 'عوامل التصفية', globals: 'عامة', goBack: 'العودة', + isEditing: 'يحرر', language: 'اللغة', lastModified: 'آخر تعديل', leaveAnyway: 'المغادرة على أي حال', diff --git a/packages/translations/src/languages/az.ts b/packages/translations/src/languages/az.ts index b96a6c220a5..8dcd854014f 100644 --- a/packages/translations/src/languages/az.ts +++ b/packages/translations/src/languages/az.ts @@ -203,6 +203,8 @@ export const azTranslations: DefaultTranslationsObject = { createdAt: 'Yaradıldığı tarix', creating: 'Yaradılır', creatingNewLabel: 'Yeni {{label}} yaradılır', + currentlyEditing: + 'hazırda bu sənədi redaktə edir. Siz öhdəliyi götürsəniz, redaktəni davam etdirməkdən bloklanacaqlar və qeydə alınmamış dəyişiklikləri itirə bilərlər.', custom: 'Xüsusi', dark: 'Tünd', dashboard: 'Panel', @@ -220,6 +222,7 @@ export const azTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Dəyişiklikləri saxlamadan dublikatla', edit: 'Redaktə et', editLabel: '{{label}} redaktə et', + editedSince: 'Redaktə edilib', editing: 'Redaktə olunur', editingLabel_many: '{{count}} {{label}} redaktə olunur', editingLabel_one: '{{count}} {{label}} redaktə olunur', @@ -236,6 +239,7 @@ export const azTranslations: DefaultTranslationsObject = { filters: 'Filtərlər', globals: 'Qloballar', goBack: 'Geri qayıt', + isEditing: 'redaktə edir', language: 'Dil', lastModified: 'Son dəyişdirildi', leaveAnyway: 'Heç olmasa çıx', diff --git a/packages/translations/src/languages/bg.ts b/packages/translations/src/languages/bg.ts index 0cbf7aad51e..01303dc6262 100644 --- a/packages/translations/src/languages/bg.ts +++ b/packages/translations/src/languages/bg.ts @@ -202,6 +202,8 @@ export const bgTranslations: DefaultTranslationsObject = { createdAt: 'Създаден на', creating: 'Създава се', creatingNewLabel: 'Създаване на нов {{label}}', + currentlyEditing: + 'в момента редактира този документ. Ако поемете управлението, те ще бъдат блокирани от продължаване на редактирането и може да загубят незаписаните промени.', custom: 'Персонализиран', dark: 'Тъмна', dashboard: 'Табло', @@ -219,6 +221,7 @@ export const bgTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Дупликирай без да запазваш промените', edit: 'Редактирай', editLabel: 'Редактирай {{label}}', + editedSince: 'Редактирано от', editing: 'Редактиране', editingLabel_many: 'Редактиране на {{count}} {{label}}', editingLabel_one: 'Редактиране на {{count}} {{label}}', @@ -235,6 +238,7 @@ export const bgTranslations: DefaultTranslationsObject = { filters: 'Филтри', globals: 'Глобални', goBack: 'Върни се', + isEditing: 'редактира', language: 'Език', lastModified: 'Последно променено', leaveAnyway: 'Напусни въпреки това', diff --git a/packages/translations/src/languages/cs.ts b/packages/translations/src/languages/cs.ts index 47ac3f59cfc..1d639ad856c 100644 --- a/packages/translations/src/languages/cs.ts +++ b/packages/translations/src/languages/cs.ts @@ -202,6 +202,8 @@ export const csTranslations: DefaultTranslationsObject = { createdAt: 'Vytvořeno v', creating: 'Vytváření', creatingNewLabel: 'Vytváření nového {{label}}', + currentlyEditing: + 'právě upravuje tento dokument. Pokud převezmete kontrolu, budou zablokováni v pokračování úprav a mohou také přijít o neuložené změny.', custom: 'Vlastní', dark: 'Tmavý', dashboard: 'Nástěnka', @@ -219,6 +221,7 @@ export const csTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Duplikovat bez uložení změn', edit: 'Upravit', editLabel: 'Upravit {{label}}', + editedSince: 'Upraveno od', editing: 'Úprava', editingLabel_many: 'Úprava {{count}} {{label}}', editingLabel_one: 'Úprava {{count}} {{label}}', @@ -235,6 +238,7 @@ export const csTranslations: DefaultTranslationsObject = { filters: 'Filtry', globals: 'Globální', goBack: 'Vrátit se', + isEditing: 'upravuje', language: 'Jazyk', lastModified: 'Naposledy změněno', leaveAnyway: 'Přesto odejít', diff --git a/packages/translations/src/languages/de.ts b/packages/translations/src/languages/de.ts index 4773124696c..0b5686b091c 100644 --- a/packages/translations/src/languages/de.ts +++ b/packages/translations/src/languages/de.ts @@ -207,6 +207,8 @@ export const deTranslations: DefaultTranslationsObject = { createdAt: 'Erstellt am', creating: 'Erstelle', creatingNewLabel: 'Erstelle {{label}}', + currentlyEditing: + 'bearbeitet gerade dieses Dokument. Wenn Sie übernehmen, wird die Bearbeitung blockiert und nicht gespeicherte Änderungen können verloren gehen.', custom: 'Benutzerdefiniert', dark: 'Dunkel', dashboard: 'Übersicht', @@ -224,6 +226,7 @@ export const deTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Dupliziere ohne Änderungen zu speichern', edit: 'Bearbeiten', editLabel: '{{label}} bearbeiten', + editedSince: 'Bearbeitet seit', editing: 'Bearbeite', editingLabel_many: 'Bearbeiten von {{count}} {{label}}', editingLabel_one: 'Bearbeiten von {{count}} {{label}}', @@ -240,6 +243,7 @@ export const deTranslations: DefaultTranslationsObject = { filters: 'Filter', globals: 'Globale Dokumente', goBack: 'Zurück', + isEditing: 'bearbeitet', language: 'Sprache', lastModified: 'Zuletzt geändert', leaveAnyway: 'Trotzdem verlassen', diff --git a/packages/translations/src/languages/en.ts b/packages/translations/src/languages/en.ts index 7f932b224e9..6970945dca7 100644 --- a/packages/translations/src/languages/en.ts +++ b/packages/translations/src/languages/en.ts @@ -205,6 +205,8 @@ export const enTranslations = { createdAt: 'Created At', creating: 'Creating', creatingNewLabel: 'Creating new {{label}}', + currentlyEditing: + 'is currently editing this document. If you take over, they will be blocked from continuing to edit, and may also lose unsaved changes.', custom: 'Custom', dark: 'Dark', dashboard: 'Dashboard', @@ -222,6 +224,7 @@ export const enTranslations = { duplicateWithoutSaving: 'Duplicate without saving changes', edit: 'Edit', editLabel: 'Edit {{label}}', + editedSince: 'Edited since', editing: 'Editing', editingLabel_many: 'Editing {{count}} {{label}}', editingLabel_one: 'Editing {{count}} {{label}}', @@ -238,6 +241,7 @@ export const enTranslations = { filters: 'Filters', globals: 'Globals', goBack: 'Go back', + isEditing: 'is editing', language: 'Language', lastModified: 'Last Modified', leaveAnyway: 'Leave anyway', diff --git a/packages/translations/src/languages/es.ts b/packages/translations/src/languages/es.ts index 632171841b4..f8899b91484 100644 --- a/packages/translations/src/languages/es.ts +++ b/packages/translations/src/languages/es.ts @@ -207,6 +207,8 @@ export const esTranslations: DefaultTranslationsObject = { createdAt: 'Fecha de creación', creating: 'Creando', creatingNewLabel: 'Creando nuevo {{label}}', + currentlyEditing: + 'está editando este documento. Si tomas el control, se les bloqueará para que no continúen editando y podrían perder los cambios no guardados.', custom: 'Personalizado', dark: 'Oscuro', dashboard: 'Tablero', @@ -224,6 +226,7 @@ export const esTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Duplicar sin guardar cambios', edit: 'Editar', editLabel: 'Editar {{label}}', + editedSince: 'Editado desde', editing: 'Editando', editingLabel_many: 'Edición de {{count}} {{label}}', editingLabel_one: 'Editando {{count}} {{label}}', @@ -240,6 +243,7 @@ export const esTranslations: DefaultTranslationsObject = { filters: 'Filtros', globals: 'Globales', goBack: 'Volver', + isEditing: 'está editando', language: 'Idioma', lastModified: 'Última modificación', leaveAnyway: 'Salir de todos modos', diff --git a/packages/translations/src/languages/fa.ts b/packages/translations/src/languages/fa.ts index 3eb6038252f..d83243799cc 100644 --- a/packages/translations/src/languages/fa.ts +++ b/packages/translations/src/languages/fa.ts @@ -202,6 +202,8 @@ export const faTranslations: DefaultTranslationsObject = { createdAt: 'ساخته شده در', creating: 'در حال ساخت', creatingNewLabel: 'در حال ساختن {{label}} تازه', + currentlyEditing: + 'در حال حاضر در حال ویرایش این سند است. اگر شما مسئولیت را به عهده بگیرید، از ادامه ویرایش مسدود خواهد شد و ممکن است تغییرات ذخیره نشده را از دست بدهند.', custom: 'سفارشی', dark: 'تاریک', dashboard: 'پیشخوان', @@ -219,6 +221,7 @@ export const faTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'رونوشت بدون ذخیره کردن تغییرات', edit: 'نگارش', editLabel: 'نگارش {{label}}', + editedSince: 'ویرایش شده از', editing: 'در حال نگارش', editingLabel_many: 'در حال نگارش {{count}} از {{label}}', editingLabel_one: 'در حال نگارش {{count}} از {{label}}', @@ -235,6 +238,7 @@ export const faTranslations: DefaultTranslationsObject = { filters: 'علامت‌گذاری‌ها', globals: 'سراسری', goBack: 'برگشت', + isEditing: 'در حال ویرایش است', language: 'زبان', lastModified: 'آخرین نگارش', leaveAnyway: 'به هر حال ترک کن', diff --git a/packages/translations/src/languages/fr.ts b/packages/translations/src/languages/fr.ts index bd7f5f878af..2e681d2dca8 100644 --- a/packages/translations/src/languages/fr.ts +++ b/packages/translations/src/languages/fr.ts @@ -210,6 +210,8 @@ export const frTranslations: DefaultTranslationsObject = { createdAt: 'Créé(e) à', creating: 'création en cours', creatingNewLabel: 'Création d’un(e) nouveau ou nouvelle {{label}}', + currentlyEditing: + 'est en train de modifier ce document. Si vous prenez le contrôle, ils seront bloqués pour continuer à modifier et pourraient également perdre les modifications non enregistrées.', custom: 'Personnalisé', dark: 'Sombre', dashboard: 'Tableau de bord', @@ -227,6 +229,7 @@ export const frTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Dupliquer sans enregistrer les modifications', edit: 'Éditer', editLabel: 'Modifier {{label}}', + editedSince: 'Modifié depuis', editing: 'Modification en cours', editingLabel_many: 'Modification des {{count}} {{label}}', editingLabel_one: 'Modification de {{count}} {{label}}', @@ -243,6 +246,7 @@ export const frTranslations: DefaultTranslationsObject = { filters: 'Filtres', globals: 'Globals(es)', goBack: 'Retourner', + isEditing: 'est en train de modifier', language: 'Langue', lastModified: 'Dernière modification', leaveAnyway: 'Quitter quand même', diff --git a/packages/translations/src/languages/he.ts b/packages/translations/src/languages/he.ts index d8aa42bc01d..9a0dd74362c 100644 --- a/packages/translations/src/languages/he.ts +++ b/packages/translations/src/languages/he.ts @@ -198,6 +198,8 @@ export const heTranslations: DefaultTranslationsObject = { createdAt: 'נוצר בתאריך', creating: 'יצירה', creatingNewLabel: 'יצירת {{label}} חדש', + currentlyEditing: + 'עורך כעת את המסמך הזה. אם תשתלט, הם ייחסמו מהמשך העריכה וייתכן שגם יאבדו שינויים שלא נשמרו.', custom: 'מותאם אישית', dark: 'כהה', dashboard: 'לוח מחוונים', @@ -215,6 +217,7 @@ export const heTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'שכפול ללא שמירת שינויים', edit: 'עריכה', editLabel: 'עריכת {{label}}', + editedSince: 'נערך מאז', editing: 'עריכה', editingLabel_many: 'עריכת {{count}} {{label}}', editingLabel_one: 'עריכת {{label}} אחד', @@ -231,6 +234,7 @@ export const heTranslations: DefaultTranslationsObject = { filters: 'מסננים', globals: 'גלובלים', goBack: 'חזור', + isEditing: 'עורך', language: 'שפה', lastModified: 'נערך לאחרונה', leaveAnyway: 'צא בכל זאת', diff --git a/packages/translations/src/languages/hr.ts b/packages/translations/src/languages/hr.ts index a023b7ecefd..b22d7281852 100644 --- a/packages/translations/src/languages/hr.ts +++ b/packages/translations/src/languages/hr.ts @@ -203,6 +203,8 @@ export const hrTranslations: DefaultTranslationsObject = { createdAt: 'Kreirano u', creating: 'Kreira se', creatingNewLabel: 'Kreiranje novog {{label}}', + currentlyEditing: + 'trenutno uređuje ovaj dokument. Ako preuzmete, bit će im onemogućeno daljnje uređivanje i mogu izgubiti nespremljene promjene.', custom: 'Prilagođen', dark: 'Tamno', dashboard: 'Nadzorna ploča', @@ -220,6 +222,7 @@ export const hrTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Dupliciraj bez spremanja promjena', edit: 'Uredi', editLabel: 'Uredi {{label}}', + editedSince: 'Uređeno od', editing: 'Uređivanje', editingLabel_many: 'Uređivanje {{count}} {{label}}', editingLabel_one: 'Uređivanje {{count}} {{label}}', @@ -236,6 +239,7 @@ export const hrTranslations: DefaultTranslationsObject = { filters: 'Filteri', globals: 'Globali', goBack: 'Vrati se', + isEditing: 'uređuje', language: 'Jezik', lastModified: 'Zadnja promjena', leaveAnyway: 'Svejedno napusti', diff --git a/packages/translations/src/languages/hu.ts b/packages/translations/src/languages/hu.ts index 1e581b54868..f48e25a936a 100644 --- a/packages/translations/src/languages/hu.ts +++ b/packages/translations/src/languages/hu.ts @@ -205,6 +205,8 @@ export const huTranslations: DefaultTranslationsObject = { createdAt: 'Létrehozva:', creating: 'Létrehozás', creatingNewLabel: 'Új {{label}} létrehozása', + currentlyEditing: + 'jelenleg szerkeszti ezt a dokumentumot. Ha átveszed, nem tudja folytatni a szerkesztést, és elveszítheti a mentetlen módosításokat.', custom: 'Egyéni', dark: 'Sötét', dashboard: 'Irányítópult', @@ -222,6 +224,7 @@ export const huTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Duplikálás a módosítások mentése nélkül', edit: 'Szerkesztés', editLabel: '{{label}} szerkesztése', + editedSince: 'Szerkesztve', editing: 'Szerkesztés', editingLabel_many: '{{count}} {{label}} szerkesztése', editingLabel_one: '{{count}} {{label}} szerkesztése', @@ -238,6 +241,7 @@ export const huTranslations: DefaultTranslationsObject = { filters: 'Szűrők', globals: 'Globálisok', goBack: 'Vissza', + isEditing: 'szerkeszt', language: 'Nyelv', lastModified: 'Utoljára módosítva', leaveAnyway: 'Távozás mindenképp', diff --git a/packages/translations/src/languages/it.ts b/packages/translations/src/languages/it.ts index 8c9bfddd366..7955c72a6c4 100644 --- a/packages/translations/src/languages/it.ts +++ b/packages/translations/src/languages/it.ts @@ -205,6 +205,8 @@ export const itTranslations: DefaultTranslationsObject = { createdAt: 'Creato il', creating: 'Crea nuovo', creatingNewLabel: 'Creazione di un nuovo {{label}}', + currentlyEditing: + 'sta attualmente modificando questo documento. Se prendi il controllo, verranno bloccati dal continuare a modificare e potrebbero anche perdere le modifiche non salvate.', custom: 'Personalizzato', dark: 'Scuro', dashboard: 'Dashboard', @@ -222,6 +224,7 @@ export const itTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Duplica senza salvare le modifiche', edit: 'Modificare', editLabel: 'Modifica {{label}}', + editedSince: 'Modificato da', editing: 'Modifica', editingLabel_many: 'Modificare {{count}} {{label}}', editingLabel_one: 'Modifica {{count}} {{label}}', @@ -238,6 +241,7 @@ export const itTranslations: DefaultTranslationsObject = { filters: 'Filtri', globals: 'Globali', goBack: 'Torna indietro', + isEditing: 'sta modificando', language: 'Lingua', lastModified: 'Ultima modifica', leaveAnyway: 'Esci comunque', diff --git a/packages/translations/src/languages/ja.ts b/packages/translations/src/languages/ja.ts index bc9c85d62ba..2e7a363b36d 100644 --- a/packages/translations/src/languages/ja.ts +++ b/packages/translations/src/languages/ja.ts @@ -203,6 +203,8 @@ export const jaTranslations: DefaultTranslationsObject = { createdAt: '作成日', creating: '作成中', creatingNewLabel: '{{label}} を新規作成しています', + currentlyEditing: + 'このドキュメントを編集中です。あなたが引き継ぐと、編集を続けることができなくなり、未保存の変更が失われる可能性があります。', custom: 'カスタム', dark: 'ダークモード', dashboard: 'ダッシュボード', @@ -220,6 +222,7 @@ export const jaTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: '変更を保存せずに複製', edit: '編集', editLabel: '{{label}} を編集', + editedSince: 'から編集', editing: '編集', editingLabel_many: '{{count}}つの{{label}}を編集しています', editingLabel_one: '{{count}}つの{{label}}を編集しています', @@ -236,6 +239,7 @@ export const jaTranslations: DefaultTranslationsObject = { filters: '絞り込み', globals: 'グローバル', goBack: '戻る', + isEditing: '編集中', language: '言語', lastModified: '最終更新', leaveAnyway: 'すぐに画面を離れる', diff --git a/packages/translations/src/languages/ko.ts b/packages/translations/src/languages/ko.ts index d8365584047..75b6684e716 100644 --- a/packages/translations/src/languages/ko.ts +++ b/packages/translations/src/languages/ko.ts @@ -202,6 +202,8 @@ export const koTranslations: DefaultTranslationsObject = { createdAt: '생성 일시', creating: '생성 중', creatingNewLabel: '{{label}} 생성 중', + currentlyEditing: + '현재 이 문서를 편집 중입니다. 당신이 인수하면, 편집을 계속할 수 없게 되고, 저장되지 않은 변경 사항이 손실될 수 있습니다.', custom: '사용자 정의', dark: '다크', dashboard: '대시보드', @@ -219,6 +221,7 @@ export const koTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: '변경 사항 저장 없이 복제', edit: '수정', editLabel: '{{label}} 수정', + editedSince: '편집됨', editing: '수정 중', editingLabel_many: '{{count}}개의 {{label}} 수정 중', editingLabel_one: '{{count}}개의 {{label}} 수정 중', @@ -235,6 +238,7 @@ export const koTranslations: DefaultTranslationsObject = { filters: '필터', globals: '글로벌', goBack: '돌아가기', + isEditing: '편집 중', language: '언어', lastModified: '마지막 수정 일시', leaveAnyway: '그래도 나가시겠습니까?', diff --git a/packages/translations/src/languages/my.ts b/packages/translations/src/languages/my.ts index 595ccc452c4..4c7c2215c53 100644 --- a/packages/translations/src/languages/my.ts +++ b/packages/translations/src/languages/my.ts @@ -205,6 +205,8 @@ export const myTranslations: DefaultTranslationsObject = { createdAt: 'ဖန်တီးခဲ့သည့်အချိန်', creating: 'ဖန်တီးနေသည်။', creatingNewLabel: '{{label}} အသစ် ဖန်တီးနေသည်။', + currentlyEditing: + 'ဒီစာရွက်စာတမ်းကိုလက်ရှိပြင်ဆင်နေသည်။ သင်ဤတာဝန်ကိုယူပါက၊ သူတို့သည်ဆက်လက်ပြင်ဆင်ခွင့်မရအောင်ပိတ်ထားမည်ဖြစ်ပြီး၊ မသိမ်းဆည်းရသေးသောပြင်ဆင်မှုများကိုလည်းဆုံးရှုံးနိုင်သည်။', custom: 'ထုတ်ကုန် စိတ်ကြိုက်', dark: 'အမှောင်', dashboard: 'ပင်မစာမျက်နှာ', @@ -222,6 +224,7 @@ export const myTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'သေချာပါပြီ။', edit: 'တည်းဖြတ်ပါ။', editLabel: '{{label}} ပြင်ဆင်မည်။', + editedSince: 'ကစပြီးတည်းဖြတ်ခဲ့သည်', editing: 'ပြင်ဆင်နေသည်။', editingLabel_many: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', editingLabel_one: 'တည်းဖြတ်ခြင်း {{count}} {{label}}', @@ -238,6 +241,7 @@ export const myTranslations: DefaultTranslationsObject = { filters: 'စစ်ထုတ်မှုများ', globals: 'Globals', goBack: 'နောက်သို့', + isEditing: 'ပြင်ဆင်နေသည်', language: 'ဘာသာစကား', lastModified: 'နောက်ဆုံးပြင်ဆင်ထားသည်။', leaveAnyway: 'ဘာဖြစ်ဖြစ် ထွက်မည်။', diff --git a/packages/translations/src/languages/nb.ts b/packages/translations/src/languages/nb.ts index 73254532d23..90869c3fb12 100644 --- a/packages/translations/src/languages/nb.ts +++ b/packages/translations/src/languages/nb.ts @@ -203,6 +203,8 @@ export const nbTranslations: DefaultTranslationsObject = { createdAt: 'Opprettet', creating: 'Oppretter', creatingNewLabel: 'Oppretter ny {{label}}', + currentlyEditing: + 'redigerer for øyeblikket dette dokumentet. Hvis du tar over, blir de blokkert fra å fortsette å redigere, og de kan også miste ulagrede endringer.', custom: 'Tilpasset', dark: 'Mørk', dashboard: 'Kontrollpanel', @@ -220,6 +222,7 @@ export const nbTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Dupliser uten å lagre endringer', edit: 'Redigere', editLabel: 'Rediger {{label}}', + editedSince: 'Redigert siden', editing: 'Redigerer', editingLabel_many: 'Redigerer {{count}} {{label}}', editingLabel_one: 'Redigerer {{count}} {{label}}', @@ -236,6 +239,7 @@ export const nbTranslations: DefaultTranslationsObject = { filters: 'Filter', globals: 'Globale variabler', goBack: 'Gå tilbake', + isEditing: 'redigerer', language: 'Språk', lastModified: 'Sist endret', leaveAnyway: 'Forlat likevel', diff --git a/packages/translations/src/languages/nl.ts b/packages/translations/src/languages/nl.ts index c21345492da..7b61a0c6373 100644 --- a/packages/translations/src/languages/nl.ts +++ b/packages/translations/src/languages/nl.ts @@ -205,6 +205,8 @@ export const nlTranslations: DefaultTranslationsObject = { createdAt: 'Aangemaakt op', creating: 'Aanmaken', creatingNewLabel: 'Nieuw(e) {{label}} aanmaken', + currentlyEditing: + 'is momenteel dit document aan het bewerken. Als je het overneemt, wordt voorkomen dat ze doorgaan met bewerken en kunnen ze ook niet-opgeslagen wijzigingen verliezen.', custom: 'Aangepast', dark: 'Donker', dashboard: 'Dashboard', @@ -222,6 +224,7 @@ export const nlTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Dupliceren zonder wijzigingen te bewaren', edit: 'Bewerk', editLabel: 'Bewerk {{label}}', + editedSince: 'Bewerkt sinds', editing: 'Bewerken', editingLabel_many: 'Bewerken {{count}} {{label}}', editingLabel_one: 'Bewerken {{count}} {{label}}', @@ -238,6 +241,7 @@ export const nlTranslations: DefaultTranslationsObject = { filters: 'Filters', globals: 'Globalen', goBack: 'Ga terug', + isEditing: 'is aan het bewerken', language: 'Taal', lastModified: 'Laatst gewijzigd', leaveAnyway: 'Toch weggaan', diff --git a/packages/translations/src/languages/pl.ts b/packages/translations/src/languages/pl.ts index 4e052366fda..702ba85b8aa 100644 --- a/packages/translations/src/languages/pl.ts +++ b/packages/translations/src/languages/pl.ts @@ -203,6 +203,8 @@ export const plTranslations: DefaultTranslationsObject = { createdAt: 'Data utworzenia', creating: 'Tworzenie', creatingNewLabel: 'Tworzenie nowego {{label}}', + currentlyEditing: + 'obecnie edytuje ten dokument. Jeśli przejmiesz kontrolę, zostaną zablokowani przed dalszą edycją i mogą również utracić niezapisane zmiany.', custom: 'Niestandardowy', dark: 'Ciemny', dashboard: 'Panel', @@ -220,6 +222,7 @@ export const plTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Zduplikuj bez zapisywania zmian', edit: 'Edytuj', editLabel: 'Edytuj {{label}}', + editedSince: 'Edytowano od', editing: 'Edycja', editingLabel_many: 'Edytowanie {{count}} {{label}}', editingLabel_one: 'Edytowanie {{count}} {{label}}', @@ -236,6 +239,7 @@ export const plTranslations: DefaultTranslationsObject = { filters: 'Filtry', globals: 'Globalne', goBack: 'Wróć', + isEditing: 'edytuje', language: 'Język', lastModified: 'Ostatnio zmodyfikowany', leaveAnyway: 'Wyjdź mimo to', diff --git a/packages/translations/src/languages/pt.ts b/packages/translations/src/languages/pt.ts index b5c8e392ffb..6e8948ac5c9 100644 --- a/packages/translations/src/languages/pt.ts +++ b/packages/translations/src/languages/pt.ts @@ -204,6 +204,8 @@ export const ptTranslations: DefaultTranslationsObject = { createdAt: 'Criado Em', creating: 'Criando', creatingNewLabel: 'Criando novo(a) {{label}}', + currentlyEditing: + 'está editando este documento no momento. Se você assumir, eles serão impedidos de continuar editando e poderão perder alterações não salvas.', custom: 'Personalizado', dark: 'Escuro', dashboard: 'Painel de Controle', @@ -221,6 +223,7 @@ export const ptTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Duplicar sem salvar alterações', edit: 'Editar', editLabel: 'Editar {{label}}', + editedSince: 'Editado desde', editing: 'Editando', editingLabel_many: 'Editando {{count}} {{label}}', editingLabel_one: 'Editando {{count}} {{label}}', @@ -237,6 +240,7 @@ export const ptTranslations: DefaultTranslationsObject = { filters: 'Filtros', globals: 'Globais', goBack: 'Voltar', + isEditing: 'está editando', language: 'Idioma', lastModified: 'Última modificação', leaveAnyway: 'Sair mesmo assim', diff --git a/packages/translations/src/languages/ro.ts b/packages/translations/src/languages/ro.ts index 1936a938cb2..69b37ecf1b8 100644 --- a/packages/translations/src/languages/ro.ts +++ b/packages/translations/src/languages/ro.ts @@ -207,6 +207,8 @@ export const roTranslations: DefaultTranslationsObject = { createdAt: 'Creat la', creating: 'Creare', creatingNewLabel: 'Crearea unui nou {{label}}', + currentlyEditing: + 'editează în prezent acest document. Dacă preiei controlul, vor fi blocați să continue editarea și ar putea pierde modificările nesalvate.', custom: 'Personalizat', dark: 'Dark', dashboard: 'Panoul de bord', @@ -224,6 +226,7 @@ export const roTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Duplicați fără salvarea modificărilor', edit: 'Editează', editLabel: 'Editați {{label}}', + editedSince: 'Editat din', editing: 'Editare', editingLabel_many: 'Editare {{count}} {{label}}', editingLabel_one: 'Editare {{count}} {{label}}', @@ -240,6 +243,7 @@ export const roTranslations: DefaultTranslationsObject = { filters: 'Filtre', globals: 'Globale', goBack: 'Înapoi', + isEditing: 'editează', language: 'Limba', lastModified: 'Ultima modificare', leaveAnyway: 'Pleacă oricum', diff --git a/packages/translations/src/languages/rs.ts b/packages/translations/src/languages/rs.ts index 1ba61e9b351..c25319f2520 100644 --- a/packages/translations/src/languages/rs.ts +++ b/packages/translations/src/languages/rs.ts @@ -202,6 +202,8 @@ export const rsTranslations: DefaultTranslationsObject = { createdAt: 'Креирано у', creating: 'Креира се', creatingNewLabel: 'Креирање новог {{label}}', + currentlyEditing: + 'тренутно уређује овај документ. Ако преузмете контролу, биће блокирани да наставе са уређивањем и могу изгубити несачуване измене.', custom: 'Prilagođeno', dark: 'Тамно', dashboard: 'Контролни панел', @@ -219,6 +221,7 @@ export const rsTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Понови без чувања промена', edit: 'Уреди', editLabel: 'Уреди {{label}}', + editedSince: 'Измењено од', editing: 'Уређивање', editingLabel_many: 'Уређивање {{count}} {{label}}', editingLabel_one: 'Уређивање {{count}} {{label}}', @@ -235,6 +238,7 @@ export const rsTranslations: DefaultTranslationsObject = { filters: 'Филтери', globals: 'Глобали', goBack: 'Врати се', + isEditing: 'уређује', language: 'Језик', lastModified: 'Задња промена', leaveAnyway: 'Свеједно напусти', diff --git a/packages/translations/src/languages/rsLatin.ts b/packages/translations/src/languages/rsLatin.ts index e35185d1127..19e65caf41e 100644 --- a/packages/translations/src/languages/rsLatin.ts +++ b/packages/translations/src/languages/rsLatin.ts @@ -202,6 +202,8 @@ export const rsLatinTranslations: DefaultTranslationsObject = { createdAt: 'Kreirano u', creating: 'Kreira se', creatingNewLabel: 'Kreiranje novog {{label}}', + currentlyEditing: + 'trenutno uređuje ovaj dokument. Ako preuzmete kontrolu, biće blokirani da nastave sa uređivanjem i mogu izgubiti nesačuvane izmene.', custom: 'Prilagođen', dark: 'Tamno', dashboard: 'Kontrolni panel', @@ -219,6 +221,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Ponovi bez čuvanja promena', edit: 'Uredi', editLabel: 'Uredi {{label}}', + editedSince: 'Izmenjeno od', editing: 'Uređivanje', editingLabel_many: 'Uređivanje {{count}} {{label}}', editingLabel_one: 'Uređivanje {{count}} {{label}}', @@ -235,6 +238,7 @@ export const rsLatinTranslations: DefaultTranslationsObject = { filters: 'Filteri', globals: 'Globali', goBack: 'Vrati se', + isEditing: 'uređuje', language: 'Jezik', lastModified: 'Zadnja promena', leaveAnyway: 'Svejedno napusti', diff --git a/packages/translations/src/languages/ru.ts b/packages/translations/src/languages/ru.ts index 01271391e94..b53aa3d6daa 100644 --- a/packages/translations/src/languages/ru.ts +++ b/packages/translations/src/languages/ru.ts @@ -205,6 +205,8 @@ export const ruTranslations: DefaultTranslationsObject = { createdAt: 'Дата создания', creating: 'Создание', creatingNewLabel: 'Создание нового {{label}}', + currentlyEditing: + 'в настоящее время редактирует этот документ. Если вы возьмете на себя, они будут заблокированы от продолжения редактирования и могут потерять несохраненные изменения.', custom: 'Обычай', dark: 'Тёмная', dashboard: 'Панель', @@ -222,6 +224,7 @@ export const ruTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Дублирование без сохранения изменений', edit: 'Редактировать', editLabel: 'Редактировать {{label}}', + editedSince: 'Отредактировано с', editing: 'Редактирование', editingLabel_many: 'Редактирование {{count}} {{label}}', editingLabel_one: 'Редактирование {{count}} {{label}}', @@ -238,6 +241,7 @@ export const ruTranslations: DefaultTranslationsObject = { filters: 'Фильтры', globals: 'Глобальные', goBack: 'Назад', + isEditing: 'редактирует', language: 'Язык', lastModified: 'Последнее изменение', leaveAnyway: 'Все равно уйти', diff --git a/packages/translations/src/languages/sk.ts b/packages/translations/src/languages/sk.ts index 11c0fb9fc38..a02e86ae8e6 100644 --- a/packages/translations/src/languages/sk.ts +++ b/packages/translations/src/languages/sk.ts @@ -204,6 +204,8 @@ export const skTranslations: DefaultTranslationsObject = { createdAt: 'Vytvorené v', creating: 'Vytváranie', creatingNewLabel: 'Vytváranie nového {{label}}', + currentlyEditing: + 'práve upravuje tento dokument. Ak prevezmete kontrolu, budú zablokovaní z pokračovania v úpravách a môžu tiež stratiť neuložené zmeny.', custom: 'Vlastný', dark: 'Tmavý', dashboard: 'Nástenka', @@ -221,6 +223,7 @@ export const skTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Duplikovať bez uloženia zmien', edit: 'Upraviť', editLabel: 'Upraviť {{label}}', + editedSince: 'Upravené od', editing: 'Úpravy', editingLabel_many: 'Úprava {{count}} {{label}}', editingLabel_one: 'Úprava {{count}} {{label}}', @@ -237,6 +240,7 @@ export const skTranslations: DefaultTranslationsObject = { filters: 'Filtry', globals: 'Globalné', goBack: 'Vrátiť sa', + isEditing: 'upravuje', language: 'Jazyk', lastModified: 'Naposledy zmenené', leaveAnyway: 'Presto odísť', diff --git a/packages/translations/src/languages/sv.ts b/packages/translations/src/languages/sv.ts index edb22dee858..1551eb254ca 100644 --- a/packages/translations/src/languages/sv.ts +++ b/packages/translations/src/languages/sv.ts @@ -203,6 +203,8 @@ export const svTranslations: DefaultTranslationsObject = { createdAt: 'Skapad Vid', creating: 'Skapar', creatingNewLabel: 'Skapar ny {{label}}', + currentlyEditing: + 'redigerar för närvarande detta dokument. Om du tar över kommer de att blockeras från att fortsätta redigera och kan också förlora osparade ändringar.', custom: 'Anpassad', dark: 'Mörk', dashboard: 'Manöverpanel', @@ -220,6 +222,7 @@ export const svTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Duplicera utan att spara ändringar', edit: 'Redigera', editLabel: 'Redigera {{label}}', + editedSince: 'Redigerad sedan', editing: 'Redigerar', editingLabel_many: 'Redigerar {{count}} {{label}}', editingLabel_one: 'Redigerar {{count}} {{label}}', @@ -236,6 +239,7 @@ export const svTranslations: DefaultTranslationsObject = { filters: 'Filter', globals: 'Globala', goBack: 'Gå tillbaka', + isEditing: 'redigerar', language: 'Språk', lastModified: 'Senast Ändrad', leaveAnyway: 'Lämna ändå', diff --git a/packages/translations/src/languages/th.ts b/packages/translations/src/languages/th.ts index 879f0353549..512856c1d1e 100644 --- a/packages/translations/src/languages/th.ts +++ b/packages/translations/src/languages/th.ts @@ -199,6 +199,8 @@ export const thTranslations: DefaultTranslationsObject = { createdAt: 'สร้างเมื่อ', creating: 'กำลังสร้าง', creatingNewLabel: 'กำลังสร้าง {{label}} ใหม่', + currentlyEditing: + 'กำลังแก้ไขเอกสารนี้อยู่ในขณะนี้ หากคุณเข้าครอบครอง พวกเขาจะถูกบล็อกจากการแก้ไขต่อไป และอาจสูญเสียการเปลี่ยนแปลงที่ไม่ได้บันทึก', custom: 'ที่ทำขึ้นเฉพาะ', dark: 'มืด', dashboard: 'แดชบอร์ด', @@ -216,6 +218,7 @@ export const thTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'สำเนาโดยไม่บันทึกการแก้ไข', edit: 'แก้ไข', editLabel: 'แก้ไข {{label}}', + editedSince: 'แก้ไขตั้งแต่', editing: 'แก้ไข', editingLabel_many: 'กำลังแก้ไข {{count}} {{label}}', editingLabel_one: 'กำลังแก้ไข {{count}} {{label}}', @@ -232,6 +235,7 @@ export const thTranslations: DefaultTranslationsObject = { filters: 'กรอง', globals: 'Globals', goBack: 'กลับไป', + isEditing: 'กำลังแก้ไข', language: 'ภาษา', lastModified: 'แก้ไขล่าสุดเมื่อ', leaveAnyway: 'ออกจากหน้านี้', diff --git a/packages/translations/src/languages/tr.ts b/packages/translations/src/languages/tr.ts index f7c78abdf09..d04ae8d1d6f 100644 --- a/packages/translations/src/languages/tr.ts +++ b/packages/translations/src/languages/tr.ts @@ -206,6 +206,8 @@ export const trTranslations: DefaultTranslationsObject = { createdAt: 'Oluşturma tarihi', creating: 'Oluşturuluyor', creatingNewLabel: 'Yeni bir {{label}} oluşturuluyor', + currentlyEditing: + 'şu anda bu belgeyi düzenliyor. Devralırsanız, düzenlemeye devam etmeleri engellenecek ve kaydedilmemiş değişiklikleri de kaybedebilirler.', custom: 'Özel', dark: 'Karanlık', dashboard: 'Anasayfa', @@ -223,6 +225,7 @@ export const trTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Ayarları kaydetmeden çoğalt', edit: 'Düzenle', editLabel: '{{label}} düzenle', + editedSince: 'O tarihten itibaren düzenlendi', editing: 'Düzenleniyor', editingLabel_many: '{{count}} {{label}} düzenleniyor', editingLabel_one: '{{count}} {{label}} düzenleniyor', @@ -239,6 +242,7 @@ export const trTranslations: DefaultTranslationsObject = { filters: 'Filtreler', globals: 'Globaller', goBack: 'Geri dön', + isEditing: 'düzenliyor', language: 'Dil', lastModified: 'Son değiştirme', leaveAnyway: 'Yine de ayrıl', diff --git a/packages/translations/src/languages/uk.ts b/packages/translations/src/languages/uk.ts index 820e805a839..6e555268511 100644 --- a/packages/translations/src/languages/uk.ts +++ b/packages/translations/src/languages/uk.ts @@ -203,6 +203,8 @@ export const ukTranslations: DefaultTranslationsObject = { createdAt: 'Дата створення', creating: 'Створення', creatingNewLabel: 'Створення нового {{label}}', + currentlyEditing: + 'зараз редагує цей документ. Якщо ви переберете контроль, їм буде заблоковано продовження редагування, і вони також можуть втратити незбережені зміни.', custom: 'Спеціальне замовлення', dark: 'Темна', dashboard: 'Головна', @@ -220,6 +222,7 @@ export const ukTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Дублювання без збереження змін', edit: 'Редагувати', editLabel: 'Редагувати {{label}}', + editedSince: 'Відредаговано з', editing: 'Редагування', editingLabel_many: 'Редагування {{count}} {{label}}', editingLabel_one: 'Редагування {{count}} {{label}}', @@ -236,6 +239,7 @@ export const ukTranslations: DefaultTranslationsObject = { filters: 'Фільтри', globals: 'Глобальні', goBack: 'Повернутися', + isEditing: 'редагує', language: 'Мова', lastModified: 'Останні зміни', leaveAnyway: 'Все одно вийти', diff --git a/packages/translations/src/languages/vi.ts b/packages/translations/src/languages/vi.ts index 5b07e7a56fd..cf668413fdb 100644 --- a/packages/translations/src/languages/vi.ts +++ b/packages/translations/src/languages/vi.ts @@ -201,6 +201,8 @@ export const viTranslations: DefaultTranslationsObject = { createdAt: 'Ngày tạo', creating: 'Đang tạo', creatingNewLabel: 'Đang tạo mới {{label}}', + currentlyEditing: + 'hiện đang chỉnh sửa tài liệu này. Nếu bạn tiếp quản, họ sẽ bị chặn tiếp tục chỉnh sửa và cũng có thể mất các thay đổi chưa lưu.', custom: 'Tùy chỉnh', dark: 'Nền tối', dashboard: 'Bảng điều khiển', @@ -218,6 +220,7 @@ export const viTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: 'Không lưu dữ liệu và tạo bản sao', edit: 'Chỉnh sửa', editLabel: 'Chỉnh sửa: {{label}}', + editedSince: 'Được chỉnh sửa từ', editing: 'Đang chỉnh sửa', editingLabel_many: 'Đang chỉnh sửa {{count}} {{label}}', editingLabel_one: 'Đang chỉnh sửa {{count}} {{label}}', @@ -234,6 +237,7 @@ export const viTranslations: DefaultTranslationsObject = { filters: 'Bộ lọc', globals: 'Toàn thể (globals)', goBack: 'Quay lại', + isEditing: 'đang chỉnh sửa', language: 'Ngôn ngữ', lastModified: 'Chỉnh sửa lần cuối vào lúc', leaveAnyway: 'Tiếp tục thoát', diff --git a/packages/translations/src/languages/zh.ts b/packages/translations/src/languages/zh.ts index b2f7c485c51..1cd0cc5373c 100644 --- a/packages/translations/src/languages/zh.ts +++ b/packages/translations/src/languages/zh.ts @@ -196,6 +196,8 @@ export const zhTranslations: DefaultTranslationsObject = { createdAt: '创建于', creating: '创建中', creatingNewLabel: '正在创建新的{{label}}', + currentlyEditing: + '当前正在编辑此文档。如果您接管,他们将无法继续编辑,并且可能会丢失未保存的更改。', custom: '定制', dark: '深色', dashboard: '仪表板', @@ -213,6 +215,7 @@ export const zhTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: '重复而不保存更改。', edit: '编辑', editLabel: '编辑{{label}}', + editedSince: '自...以来编辑', editing: '编辑中', editingLabel_many: '编辑 {{count}} {{label}}', editingLabel_one: '编辑 {{count}} {{label}}', @@ -229,6 +232,7 @@ export const zhTranslations: DefaultTranslationsObject = { filters: '过滤器', globals: '全局', goBack: '返回', + isEditing: '正在编辑', language: '语言', lastModified: '最后修改', leaveAnyway: '无论如何都要离开', diff --git a/packages/translations/src/languages/zhTw.ts b/packages/translations/src/languages/zhTw.ts index b106612d303..cf1e96b350b 100644 --- a/packages/translations/src/languages/zhTw.ts +++ b/packages/translations/src/languages/zhTw.ts @@ -196,6 +196,8 @@ export const zhTwTranslations: DefaultTranslationsObject = { createdAt: '建立於', creating: '建立中', creatingNewLabel: '正在建立新的{{label}}', + currentlyEditing: + '目前正在編輯此文件。如果您接管,他們將無法繼續編輯,並且可能會丟失未保存的更改。', custom: '自訂', dark: '深色', dashboard: '控制面板', @@ -213,6 +215,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { duplicateWithoutSaving: '複製而不儲存變更。', edit: '編輯', editLabel: '編輯{{label}}', + editedSince: '自...以來編輯', editing: '編輯中', editingLabel_many: '編輯 {{count}} 個 {{label}}', editingLabel_one: '編輯 {{count}} 個 {{label}}', @@ -229,6 +232,7 @@ export const zhTwTranslations: DefaultTranslationsObject = { filters: '過濾器', globals: '全域', goBack: '返回', + isEditing: '正在編輯', language: '語言', lastModified: '最後修改', leaveAnyway: '無論如何都要離開', diff --git a/packages/ui/src/elements/Locked/index.scss b/packages/ui/src/elements/Locked/index.scss new file mode 100644 index 00000000000..95cf809c63f --- /dev/null +++ b/packages/ui/src/elements/Locked/index.scss @@ -0,0 +1,14 @@ +@import '../../scss/styles.scss'; + +.locked { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + pointer-events: all; + + &__tooltip { + left: 0; + transform: translate3d(-0%, calc(var(--caret-size) * -1), 0); + } +} diff --git a/packages/ui/src/elements/Locked/index.tsx b/packages/ui/src/elements/Locked/index.tsx new file mode 100644 index 00000000000..adc74768d4a --- /dev/null +++ b/packages/ui/src/elements/Locked/index.tsx @@ -0,0 +1,36 @@ +'use client' +import type { ClientUser } from 'payload' + +import React, { useState } from 'react' + +import { useTableCell } from '../../elements/Table/TableCellProvider/index.js' +import { LockIcon } from '../../icons/Lock/index.js' +import { useTranslation } from '../../providers/Translation/index.js' +import { Tooltip } from '../Tooltip/index.js' +import './index.scss' + +const baseClass = 'locked' + +export const Locked: React.FC<{ className?: string; user: ClientUser }> = ({ className, user }) => { + const { rowData } = useTableCell() + const [hovered, setHovered] = useState(false) + const { t } = useTranslation() + + const userToUse = user ? user?.email ?? user?.id : rowData?.id + + return ( +
setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {`${userToUse} ${t('general:isEditing')}`} + +
+ ) +} From 184698e8f40add5770dcdfe5fb02dbfe1344a11a Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Mon, 26 Aug 2024 15:28:22 -0400 Subject: [PATCH 067/173] feat: adds Locked comp and take over button to document-controls comp --- .../next/src/views/Edit/Default/index.tsx | 4 +++- .../next/src/views/List/Default/index.scss | 1 + .../src/elements/DocumentControls/index.scss | 8 +++++++ .../src/elements/DocumentControls/index.tsx | 24 ++++++++++++++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index e3611be8d8c..9354623b671 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -67,7 +67,6 @@ export const DefaultEditView: React.FC = () => { } = useDocumentInfo() const { refreshCookieAsync, user } = useAuth() - const { openModal } = useModal() const [showLockedModal, setShowLockedModal] = useState(false) const [isReadOnlyForIncomingUser, setIsReadOnlyForIncomingUser] = useState(false) const [showTakeOverModal, setShowTakeOverModal] = useState(false) @@ -447,8 +446,11 @@ export const DefaultEditView: React.FC = () => { hasSavePermission={hasSavePermission} id={id} isEditing={isEditing} + onTakeOver={handleTakeOver} permissions={docPermissions} + readOnlyForIncomingUser={isReadOnlyForIncomingUser} slug={collectionConfig?.slug || globalConfig?.slug} + user={initialEditor} /> void readonly permissions: CollectionPermission | GlobalPermission | null + readonly readOnlyForIncomingUser?: boolean readonly slug: SanitizedCollectionConfig['slug'] + readonly user?: ClientUser }> = (props) => { const { id, @@ -48,10 +54,13 @@ export const DocumentControls: React.FC<{ hasSavePermission, isAccountView, isEditing, + onTakeOver, permissions, + readOnlyForIncomingUser, + user, } = props - const { i18n } = useTranslation() + const { i18n, t } = useTranslation() const { config, getEntityConfig } = useConfig() @@ -106,6 +115,9 @@ export const DocumentControls: React.FC<{

)} + {user && readOnlyForIncomingUser && ( + + )} {(collectionConfig?.versions?.drafts || globalConfig?.versions?.drafts) && ( {(globalConfig || (collectionConfig && isEditing)) && ( @@ -200,6 +212,16 @@ export const DocumentControls: React.FC<{ )} )} + {user && readOnlyForIncomingUser && ( + + )}
{showDotMenu && ( Date: Mon, 26 Aug 2024 15:30:11 -0400 Subject: [PATCH 068/173] feat: updates new collection name to payload-locked-documents --- .../payload/src/collections/operations/find.ts | 17 +++++++++++------ .../src/collections/operations/findByID.ts | 18 ++++-------------- packages/payload/src/config/sanitize.ts | 4 ++-- .../lockedDocumentsCollection.ts} | 12 ++++++------ .../ui/src/providers/DocumentInfo/index.tsx | 14 +++++++------- packages/ui/src/utilities/buildFormState.ts | 4 +--- 6 files changed, 31 insertions(+), 38 deletions(-) rename packages/payload/src/{locks/locksCollection.ts => lockedDocuments/lockedDocumentsCollection.ts} (83%) diff --git a/packages/payload/src/collections/operations/find.ts b/packages/payload/src/collections/operations/find.ts index ae0f3423e5c..468ba027d83 100644 --- a/packages/payload/src/collections/operations/find.ts +++ b/packages/payload/src/collections/operations/find.ts @@ -153,8 +153,9 @@ export const findOperation = async ( } if (includeLockStatus) { - const lockStatuses = await payload.db.find({ - collection: 'payload-locks', + const lockStatuses = await payload.find({ + collection: 'payload-locked-documents', + depth: 2, limit: sanitizedLimit, pagination: false, req, @@ -167,10 +168,14 @@ export const findOperation = async ( const lockedDocIds = new Set(lockStatuses.docs.map((lockDoc) => lockDoc.docId)) - result.docs = result.docs.map((doc) => ({ - ...doc, - isLocked: lockedDocIds.has(doc.id), - })) + result.docs = result.docs.map((doc) => { + const lockDoc = lockStatuses.docs.find((lock) => lock.docId === doc.id) + return { + ...doc, + isLocked: lockedDocIds.has(doc.id), + userEditing: lockDoc ? (lockDoc as any)?._lastEdited?.user?.value || null : null, + } + }) } // ///////////////////////////////////// diff --git a/packages/payload/src/collections/operations/findByID.ts b/packages/payload/src/collections/operations/findByID.ts index 8b48992ab91..e452903edbb 100644 --- a/packages/payload/src/collections/operations/findByID.ts +++ b/packages/payload/src/collections/operations/findByID.ts @@ -98,24 +98,14 @@ export const findByIDOperation = async ( } if (includeLockStatus) { - const lockStatus = await req.payload.db.findOne({ - collection: 'payload-locks', + const lockStatus = await req.payload.findByID({ + id, + collection: 'payload-locked-documents', req, - where: { - docId: { - equals: id, - }, - }, }) result.isLocked = lockStatus ? true : false - if (lockStatus) { - result.lockStatus = { - isLocked: true, - } - } else { - result.lockStatus = { isLocked: false } - } + result.userEditing = lockStatus ? (lockStatus as any)?._lastEdited?.user?.value || null : null } // ///////////////////////////////////// diff --git a/packages/payload/src/config/sanitize.ts b/packages/payload/src/config/sanitize.ts index 04e601cac00..ed383332863 100644 --- a/packages/payload/src/config/sanitize.ts +++ b/packages/payload/src/config/sanitize.ts @@ -15,7 +15,7 @@ import { sanitizeCollection } from '../collections/config/sanitize.js' import { migrationsCollection } from '../database/migrations/migrationsCollection.js' import { InvalidConfiguration } from '../errors/index.js' import { sanitizeGlobals } from '../globals/config/sanitize.js' -import { getLocksCollection } from '../locks/locksCollection.js' +import { getLockedDocumentsCollection } from '../lockedDocuments/lockedDocumentsCollection.js' import getPreferencesCollection from '../preferences/preferencesCollection.js' import checkDuplicateCollections from '../utilities/checkDuplicateCollections.js' import { defaults } from './defaults.js' @@ -148,7 +148,7 @@ export const sanitizeConfig = async (incomingConfig: Config): Promise Promise> = [] diff --git a/packages/payload/src/locks/locksCollection.ts b/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts similarity index 83% rename from packages/payload/src/locks/locksCollection.ts rename to packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts index ad8aadd6bdd..665734fa46e 100644 --- a/packages/payload/src/locks/locksCollection.ts +++ b/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts @@ -1,11 +1,11 @@ import type { CollectionConfig } from '../collections/config/types.js' -import type { Access, Config } from '../config/types.js' +import type { Config } from '../config/types.js' -export const getLocksCollection = (config: Config): CollectionConfig => ({ - slug: 'payload-locks', - // admin: { - // hidden: true, - // }, +export const getLockedDocumentsCollection = (config: Config): CollectionConfig => ({ + slug: 'payload-locked-documents', + admin: { + hidden: true, + }, fields: [ { name: 'docId', diff --git a/packages/ui/src/providers/DocumentInfo/index.tsx b/packages/ui/src/providers/DocumentInfo/index.tsx index 2ff82c8a65e..2cbabe8e278 100644 --- a/packages/ui/src/providers/DocumentInfo/index.tsx +++ b/packages/ui/src/providers/DocumentInfo/index.tsx @@ -148,7 +148,7 @@ const DocumentInfo: React.FC< try { const request = await requests.get( - `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, + `${serverURL}${api}/payload-locked-documents?where[docId][equals]=${docId}`, ) const { docs } = await request.json() @@ -158,7 +158,7 @@ const DocumentInfo: React.FC< return } - await requests.post(`${serverURL}${api}/payload-locks`, { + await requests.post(`${serverURL}${api}/payload-locked-documents`, { body: JSON.stringify({ _lastEdited: { editedAt: new Date(), @@ -194,14 +194,14 @@ const DocumentInfo: React.FC< try { const request = await requests.get( - `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, + `${serverURL}${api}/payload-locked-documents?where[docId][equals]=${docId}`, ) const { docs } = await request.json() if (docs.length > 0) { const lockId = docs[0].id - await requests.delete(`${serverURL}${api}/payload-locks/${lockId}`, { + await requests.delete(`${serverURL}${api}/payload-locked-documents/${lockId}`, { headers: { 'Content-Type': 'application/json', }, @@ -224,7 +224,7 @@ const DocumentInfo: React.FC< try { // Check if the document is already locked const request = await requests.get( - `${serverURL}${api}/payload-locks?where[docId][equals]=${docId}`, + `${serverURL}${api}/payload-locked-documents?where[docId][equals]=${docId}`, ) const { docs } = await request.json() @@ -233,7 +233,7 @@ const DocumentInfo: React.FC< const lockId = docs[0].id // Send a patch request to update the _lastEdited info - await requests.patch(`${serverURL}${api}/payload-locks/${lockId}`, { + await requests.patch(`${serverURL}${api}/payload-locked-documents/${lockId}`, { body: JSON.stringify({ _lastEdited: { editedAt: new Date(), @@ -260,7 +260,7 @@ const DocumentInfo: React.FC< if (id) { try { const request = await requests.get( - `${serverURL}${api}/payload-locks?where[docId][equals]=${id}`, + `${serverURL}${api}/payload-locked-documents?where[docId][equals]=${id}`, ) const { docs } = await request.json() diff --git a/packages/ui/src/utilities/buildFormState.ts b/packages/ui/src/utilities/buildFormState.ts index 99f1cedec65..95e9d482889 100644 --- a/packages/ui/src/utilities/buildFormState.ts +++ b/packages/ui/src/utilities/buildFormState.ts @@ -217,7 +217,7 @@ export const buildFormState = async ({ if (returnLockStatus) { const lockStatus = await req.payload.find({ - collection: 'payload-locks', + collection: 'payload-locked-documents', where: { docId: { equals: id }, }, @@ -229,8 +229,6 @@ export const buildFormState = async ({ user: lockStatus.docs[0]?._lastEdited?.user.value, } - console.log('Building form state:', { lockedState, result }) - return { lockedState, state: result } } } From 2a4e429560ecc449c4280ffeae9b4e239a5fcfd6 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Mon, 26 Aug 2024 15:32:24 -0400 Subject: [PATCH 069/173] feat: prevents locked documents from being selected in the list view --- packages/ui/src/elements/SelectRow/index.tsx | 9 ++++++--- packages/ui/src/elements/Tooltip/index.scss | 4 ++-- packages/ui/src/elements/Tooltip/index.tsx | 4 +++- packages/ui/src/providers/Selection/index.tsx | 20 ++++++++++++++----- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/packages/ui/src/elements/SelectRow/index.tsx b/packages/ui/src/elements/SelectRow/index.tsx index e4fe087b6b6..aaf56678c39 100644 --- a/packages/ui/src/elements/SelectRow/index.tsx +++ b/packages/ui/src/elements/SelectRow/index.tsx @@ -3,8 +3,8 @@ import React from 'react' import { useTableCell } from '../../elements/Table/TableCellProvider/index.js' import { CheckboxInput } from '../../fields/Checkbox/Input.js' -import { LockIcon } from '../../icons/Lock/index.js' import { useSelection } from '../../providers/Selection/index.js' +import { Locked } from '../Locked/index.js' import './index.scss' const baseClass = 'select-row' @@ -12,9 +12,12 @@ const baseClass = 'select-row' export const SelectRow: React.FC = () => { const { selected, setSelection } = useSelection() const { rowData } = useTableCell() + const { isLocked, userEditing } = rowData || {} - if (rowData?.isLocked) { - return + const documentIsLocked = isLocked && userEditing + + if (documentIsLocked) { + return } return ( diff --git a/packages/ui/src/elements/Tooltip/index.scss b/packages/ui/src/elements/Tooltip/index.scss index 98c2c3f0b2e..875739afded 100644 --- a/packages/ui/src/elements/Tooltip/index.scss +++ b/packages/ui/src/elements/Tooltip/index.scss @@ -53,7 +53,7 @@ } &--position-top { - top: calc(var(--base) * -0.6 - 13px); + top: calc(var(--base) * -1.25); transform: translate3d(-50%, calc(var(--caret-size) * -1), 0); &::after { @@ -63,7 +63,7 @@ } &--position-bottom { - bottom: calc(var(--base) * -0.6 - 13px); + bottom: calc(var(--base) * -1.25); transform: translate3d(-50%, var(--caret-size), 0); &::after { diff --git a/packages/ui/src/elements/Tooltip/index.tsx b/packages/ui/src/elements/Tooltip/index.tsx index 906474873a5..198ab1a2811 100644 --- a/packages/ui/src/elements/Tooltip/index.tsx +++ b/packages/ui/src/elements/Tooltip/index.tsx @@ -10,6 +10,7 @@ export type Props = { children: React.ReactNode className?: string delay?: number + position?: 'bottom' | 'top' show?: boolean /** * If the tooltip position should not change depending on if the toolbar is outside the boundingRef. @default false @@ -24,6 +25,7 @@ export const Tooltip: React.FC = (props) => { children, className, delay = 350, + position: positionFromProps, show: showFromProps = true, staticPositioning = false, } = props @@ -85,7 +87,7 @@ export const Tooltip: React.FC = (props) => { className, show && 'tooltip--show', `tooltip--caret-${alignCaret}`, - `tooltip--position-${position}`, + `tooltip--position-${positionFromProps || position}`, ] .filter(Boolean) .join(' ')} diff --git a/packages/ui/src/providers/Selection/index.tsx b/packages/ui/src/providers/Selection/index.tsx index 4b3983eda86..2fcdadc0567 100644 --- a/packages/ui/src/providers/Selection/index.tsx +++ b/packages/ui/src/providers/Selection/index.tsx @@ -54,8 +54,10 @@ export const SelectionProvider: React.FC = ({ children, docs = [], totalD const rows = {} if (allAvailable) { setSelectAll(SelectAllStatus.AllAvailable) - docs.forEach(({ id }) => { - rows[id] = true + docs.forEach(({ id, isLocked }) => { + if (!isLocked) { + rows[id] = true + } }) } else if ( selectAll === SelectAllStatus.AllAvailable || @@ -66,8 +68,10 @@ export const SelectionProvider: React.FC = ({ children, docs = [], totalD rows[id] = false }) } else { - docs.forEach(({ id }) => { - rows[id] = selectAll !== SelectAllStatus.Some + docs.forEach(({ id, isLocked }) => { + if (!isLocked) { + rows[id] = selectAll !== SelectAllStatus.Some + } }) } setSelected(rows) @@ -77,17 +81,23 @@ export const SelectionProvider: React.FC = ({ children, docs = [], totalD const setSelection = useCallback( (id) => { + const doc = docs.find((doc) => doc.id === id) + if (doc?.isLocked) { + return // Prevent selection if the document is locked + } + const isSelected = !selected[id] const newSelected = { ...selected, [id]: isSelected, } + if (!isSelected) { setSelectAll(SelectAllStatus.Some) } setSelected(newSelected) }, - [selected], + [selected, docs], ) const getQueryParams = useCallback( From b7264019a99fb8e774f1b12a07852eaded5e0b88 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Mon, 26 Aug 2024 15:48:57 -0400 Subject: [PATCH 070/173] feat: adds editingTakenOver to translations for DocumentTakeOver modal --- packages/next/src/elements/DocumentTakeOver/index.tsx | 2 +- packages/translations/src/clientKeys.ts | 1 + packages/translations/src/languages/ar.ts | 1 + packages/translations/src/languages/az.ts | 1 + packages/translations/src/languages/bg.ts | 1 + packages/translations/src/languages/cs.ts | 1 + packages/translations/src/languages/de.ts | 1 + packages/translations/src/languages/en.ts | 1 + packages/translations/src/languages/es.ts | 1 + packages/translations/src/languages/fa.ts | 1 + packages/translations/src/languages/fr.ts | 1 + packages/translations/src/languages/he.ts | 1 + packages/translations/src/languages/hr.ts | 1 + packages/translations/src/languages/hu.ts | 1 + packages/translations/src/languages/it.ts | 1 + packages/translations/src/languages/ja.ts | 1 + packages/translations/src/languages/ko.ts | 1 + packages/translations/src/languages/my.ts | 1 + packages/translations/src/languages/nb.ts | 1 + packages/translations/src/languages/nl.ts | 1 + packages/translations/src/languages/pl.ts | 1 + packages/translations/src/languages/pt.ts | 1 + packages/translations/src/languages/ro.ts | 1 + packages/translations/src/languages/rs.ts | 1 + packages/translations/src/languages/rsLatin.ts | 1 + packages/translations/src/languages/ru.ts | 1 + packages/translations/src/languages/sk.ts | 1 + packages/translations/src/languages/sv.ts | 1 + packages/translations/src/languages/th.ts | 1 + packages/translations/src/languages/tr.ts | 1 + packages/translations/src/languages/uk.ts | 1 + packages/translations/src/languages/vi.ts | 1 + packages/translations/src/languages/zh.ts | 1 + packages/translations/src/languages/zhTw.ts | 1 + 34 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/next/src/elements/DocumentTakeOver/index.tsx b/packages/next/src/elements/DocumentTakeOver/index.tsx index b6bd1572fcf..3e8b3c550c2 100644 --- a/packages/next/src/elements/DocumentTakeOver/index.tsx +++ b/packages/next/src/elements/DocumentTakeOver/index.tsx @@ -25,7 +25,7 @@ export const DocumentTakeOver: React.FC<{
-

Editing taken over

+

{t('general:editingTakenOver')}

+ + + +
- - - -
readonly data: Record[] diff --git a/test/joins/config.ts b/test/joins/config.ts index d0d97e9d03c..38b71625c66 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -50,6 +50,7 @@ export default buildConfigWithDefaults({ }, { name: 'posts', + label: 'Related Posts', type: 'join', collection: 'posts', on: 'category', @@ -60,6 +61,7 @@ export default buildConfigWithDefaults({ fields: [ { name: 'posts', + label: 'Related Posts (Group)', type: 'join', collection: 'posts', on: 'group.category', From 00b114a69deb4e063d4bbb277f494fe54df4a2c1 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Tue, 27 Aug 2024 12:17:06 -0400 Subject: [PATCH 079/173] feat: handles global document locking --- .../src/views/Dashboard/Default/index.scss | 5 ++ .../src/views/Dashboard/Default/index.tsx | 21 ++++++- packages/next/src/views/Dashboard/index.tsx | 30 +++++++++- .../next/src/views/Edit/Default/index.tsx | 30 +++++----- .../src/collections/operations/find.ts | 53 +++++++++++------- .../src/collections/operations/findByID.ts | 38 ++++++++++--- .../payload/src/globals/operations/findOne.ts | 33 +++++++++++ .../src/globals/operations/local/findOne.ts | 3 + .../lockedDocumentsCollection.ts | 9 ++- packages/ui/src/exports/client/index.ts | 1 + .../ui/src/providers/DocumentInfo/index.tsx | 55 +++++++++++++------ .../ui/src/providers/DocumentInfo/types.ts | 6 +- packages/ui/src/utilities/buildFormState.ts | 38 +++++++++---- 13 files changed, 245 insertions(+), 77 deletions(-) diff --git a/packages/next/src/views/Dashboard/Default/index.scss b/packages/next/src/views/Dashboard/Default/index.scss index 803b54e3633..cbd00878ab5 100644 --- a/packages/next/src/views/Dashboard/Default/index.scss +++ b/packages/next/src/views/Dashboard/Default/index.scss @@ -35,6 +35,11 @@ } } + &__locked.locked { + align-items: unset; + justify-content: unset; + } + @include large-break { --cols: 4; } diff --git a/packages/next/src/views/Dashboard/Default/index.tsx b/packages/next/src/views/Dashboard/Default/index.tsx index 6b0deaa76fc..501def4ca26 100644 --- a/packages/next/src/views/Dashboard/Default/index.tsx +++ b/packages/next/src/views/Dashboard/Default/index.tsx @@ -1,8 +1,8 @@ import type { groupNavItems } from '@payloadcms/ui/shared' -import type { Permissions, ServerProps, VisibleEntities } from 'payload' +import type { ClientUser, Permissions, ServerProps, VisibleEntities } from 'payload' import { getTranslation } from '@payloadcms/translations' -import { Button, Card, Gutter, SetStepNav, SetViewActions } from '@payloadcms/ui' +import { Button, Card, Gutter, Locked, SetStepNav, SetViewActions } from '@payloadcms/ui' import { EntityType, RenderComponent, @@ -17,6 +17,7 @@ const baseClass = 'dashboard' export type DashboardProps = { Link: React.ComponentType + globalData: Array<{ data: { isLocked: boolean; userEditing: ClientUser | null }; slug: string }> navGroups?: ReturnType permissions: Permissions visibleEntities: VisibleEntities @@ -25,6 +26,7 @@ export type DashboardProps = { export const DefaultDashboard: React.FC = (props) => { const { Link, + globalData, i18n, i18n: { t }, locale, @@ -93,6 +95,8 @@ export const DefaultDashboard: React.FC = (props) => { let createHREF: string let href: string let hasCreatePermission: boolean + let lockStatus = null + let userEditing = null if (type === EntityType.collection) { title = getTranslation(entity.labels.plural, i18n) @@ -121,6 +125,15 @@ export const DefaultDashboard: React.FC = (props) => { adminRoute, path: `/globals/${entity.slug}`, }) + + // Find the lock status for the global + const globalLockData = globalData.find( + (global) => global.slug === entity.slug, + ) + if (globalLockData) { + lockStatus = globalLockData.data.isLocked + userEditing = globalLockData.data.userEditing + } } return ( @@ -128,7 +141,9 @@ export const DefaultDashboard: React.FC = (props) => { + ) : hasCreatePermission && type === EntityType.collection ? ( - {activeColumns.map((col, colIndex) => ( - - ))} + {activeColumns.map((col, colIndex) => { + const isLink = + (colIndex === 0 && col.accessor !== '_select') || + (colIndex === 1 && activeColumns[0]?.accessor === '_select') + + return ( + + ) + })} ))} diff --git a/packages/ui/src/elements/TableColumns/buildColumnState.tsx b/packages/ui/src/elements/TableColumns/buildColumnState.tsx index 9d24d786e70..caa8d4c77e1 100644 --- a/packages/ui/src/elements/TableColumns/buildColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildColumnState.tsx @@ -92,8 +92,6 @@ export const buildColumnState = (args: Args): Column[] => { activeColumnsIndices.push(index) } - const isFirstActiveColumn = activeColumnsIndices[0] === index - const CustomLabelToRender = field && 'admin' in field && @@ -148,7 +146,6 @@ export const buildColumnState = (args: Args): Column[] => { }, }, } as ClientField, - link: isFirstActiveColumn, }, } diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index 28830493c91..44b70eef7cd 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { CellComponentProps, ClientField, SanitizedCollectionConfig } from 'payload' +import type { CellComponentProps, SanitizedCollectionConfig } from 'payload' import React, { createContext, useCallback, useContext, useState } from 'react' @@ -92,40 +92,9 @@ export const TableColumnsProvider: React.FC = ({ [preferenceKey, setPreference], ) - const reassignLinkColumn = useCallback((columns: Column[]): Column[] => { - let foundFirstActive = false - let linkColumn = false - - const newColumns = columns.map((col) => { - if (col.active) { - linkColumn = !foundFirstActive && col.accessor !== '_select' - } - - if (linkColumn) foundFirstActive = true - - return { - ...col, - cellProps: { - link: linkColumn, - ...col.cellProps, - }, - } - }) - - return newColumns - }, []) - const moveColumn = useCallback( - (args: { fromIndex: number; toIndex: number }) => { - const { fromIndex, toIndex } = args - const withMovedColumn = [...tableColumns] - const [columnToMove] = withMovedColumn.splice(fromIndex, 1) - withMovedColumn.splice(toIndex, 0, columnToMove) - const newColumns = reassignLinkColumn(withMovedColumn) - setTableColumns(newColumns) - updateColumnPreferences(newColumns) - }, - [tableColumns, updateColumnPreferences, reassignLinkColumn], + (args: { fromIndex: number; toIndex: number }) => {}, + [tableColumns, updateColumnPreferences], ) const toggleColumn = useCallback( @@ -142,11 +111,10 @@ export const TableColumnsProvider: React.FC = ({ } }) - const newColumns = reassignLinkColumn(toggledColumns) - setTableColumns(newColumns) - updateColumnPreferences(newColumns) + setTableColumns(toggledColumns) + updateColumnPreferences(toggledColumns) }, - [tableColumns, updateColumnPreferences, reassignLinkColumn], + [tableColumns, updateColumnPreferences], ) const setActiveColumns = React.useCallback( @@ -157,11 +125,9 @@ export const TableColumnsProvider: React.FC = ({ active: activeColumnAccessors.includes(col.accessor), } }) - - const newColumns = reassignLinkColumn(activeColumns) - updateColumnPreferences(newColumns) + updateColumnPreferences(activeColumns) }, - [tableColumns, updateColumnPreferences, reassignLinkColumn], + [tableColumns, updateColumnPreferences], ) // ////////////////////////////////////////////// diff --git a/test/joins/config.ts b/test/joins/config.ts index 38b71625c66..08730d7a24f 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -55,19 +55,19 @@ export default buildConfigWithDefaults({ collection: 'posts', on: 'category', }, - { - name: 'group', - type: 'group', - fields: [ - { - name: 'posts', - label: 'Related Posts (Group)', - type: 'join', - collection: 'posts', - on: 'group.category', - }, - ], - }, + // { + // name: 'group', + // type: 'group', + // fields: [ + // { + // name: 'posts', + // label: 'Related Posts (Group)', + // type: 'join', + // collection: 'posts', + // on: 'group.category', + // }, + // ], + // }, ], }, { @@ -125,7 +125,7 @@ export default buildConfigWithDefaults({ collection: 'categories', data: { name: 'example', - group: {}, + // group: {}, }, }) @@ -133,9 +133,9 @@ export default buildConfigWithDefaults({ collection: 'posts', data: { category: category.id, - group: { - category: category.id, - }, + // group: { + // category: category.id, + // }, title: 'Test Post 1', }, }) @@ -144,9 +144,9 @@ export default buildConfigWithDefaults({ collection: 'posts', data: { category: category.id, - group: { - category: category.id, - }, + // group: { + // category: category.id, + // }, title: 'Test Post 2', }, }) @@ -155,9 +155,9 @@ export default buildConfigWithDefaults({ collection: 'posts', data: { category: category.id, - group: { - category: category.id, - }, + // group: { + // category: category.id, + // }, title: 'Test Post 3', }, }) diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index c3646d7b6d4..6d51c474e2b 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -80,21 +80,6 @@ export interface Category { totalDocs?: number | null; totalPages?: number | null; } | null; - group?: { - posts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - hasPrevPage?: boolean | null; - limit?: number | null; - nextPage?: number | null; - offset?: number | null; - page?: number | null; - pagingCounter?: number | null; - prevPage?: number | null; - totalDocs?: number | null; - totalPages?: number | null; - } | null; - }; updatedAt: string; createdAt: string; } From cb69a89b5cf8d362015b9e7c7f5ae406cab8e613 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 27 Aug 2024 14:43:05 -0400 Subject: [PATCH 082/173] chore(db-mongodb): tests passing --- packages/db-mongodb/src/find.ts | 2 + .../src/utilities/buildJoinAggregation.ts | 42 +++--- .../src/utilities/sanitizeRelationshipIDs.ts | 131 +++++++++++------- test/joins/int.spec.ts | 67 +++------ 4 files changed, 122 insertions(+), 120 deletions(-) diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index fbb3883898b..686cd481d99 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -108,7 +108,9 @@ export const find: Find = async function find( collection, collectionConfig, joins, + limit, locale, + query, }) // build join aggregation if (aggregate) { diff --git a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts index 52b94b31518..59460f7e307 100644 --- a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts +++ b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts @@ -84,18 +84,19 @@ export const buildJoinAggregation = async ({ } else if (limitJoin > 0) { $limit = limitJoin } - const pipeline = [ - // { - // $match, - // }, + const pipeline: Exclude[] = [ + { $match }, { $sort: { [sortProperty]: sortDirection }, }, - { - $limit, - }, ] + if ($limit) { + pipeline.push({ + $limit, + }) + } + if (adapter.payload.config.localization && locale === 'all') { adapter.payload.config.localization.localeCodes.forEach((code) => { const as = `${join.schemaPath}${code}` @@ -110,9 +111,6 @@ export const buildJoinAggregation = async ({ pipeline, }, }, - // { - // $sort: { [sortProperty]: sortDirection }, - // }, { $addFields: { [`${as}.docs`]: { @@ -122,17 +120,21 @@ export const buildJoinAggregation = async ({ input: `$${as}.docs`, }, }, // Slicing the docs to match the limit - [`${as}.hasNextPage`]: { $gt: [{ $size: `$${as}.docs` }, limitJoin] }, // Boolean indicating if more docs than limit + [`${as}.hasNextPage`]: { + $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE], + }, // Boolean indicating if more docs than limit }, }, - { + ) + if (limitJoin > 0) { + aggregate.push({ $addFields: { [`${as}.docs`]: { $slice: [`$${as}.docs`, limitJoin], }, }, - }, - ) + }) + } }) } else { const localeSuffix = @@ -158,17 +160,21 @@ export const buildJoinAggregation = async ({ input: `$${as}.docs`, }, }, // Slicing the docs to match the limit - [`${as}.hasNextPage`]: { $gt: [{ $size: `$${as}.docs` }, limitJoin] }, // Boolean indicating if more docs than limit + [`${as}.hasNextPage`]: { + $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE], + }, // Boolean indicating if more docs than limit }, }, - { + ) + if (limitJoin > 0) { + aggregate.push({ $addFields: { [`${as}.docs`]: { $slice: [`$${as}.docs`, limitJoin], }, }, - }, - ) + }) + } } } } diff --git a/packages/db-mongodb/src/utilities/sanitizeRelationshipIDs.ts b/packages/db-mongodb/src/utilities/sanitizeRelationshipIDs.ts index 7b2d96ae1a3..3c55b22de35 100644 --- a/packages/db-mongodb/src/utilities/sanitizeRelationshipIDs.ts +++ b/packages/db-mongodb/src/utilities/sanitizeRelationshipIDs.ts @@ -35,71 +35,98 @@ const convertValue = ({ return value } -export const sanitizeRelationshipIDs = ({ - config, - data, - fields, -}: Args): Record => { - const sanitize = (field: Field, ref: unknown) => { - if (field.type === 'relationship' || field.type === 'upload') { - const value = ref[field.name] +const sanitizeRelationship = ({ config, field, locale, ref, value }) => { + let relatedCollection: CollectionConfig | undefined + let result = value - let relatedCollection: CollectionConfig | undefined + const hasManyRelations = typeof field.relationTo !== 'string' - const hasManyRelations = typeof field.relationTo !== 'string' + if (!hasManyRelations) { + relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo) + } - if (!hasManyRelations) { - relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo) + if (Array.isArray(value)) { + result = value.map((val) => { + // Handle has many + if (relatedCollection && val && (typeof val === 'string' || typeof val === 'number')) { + return convertValue({ + relatedCollection, + value: val, + }) } - if (Array.isArray(value)) { - ref[field.name] = value.map((val) => { - // Handle has many - if (relatedCollection && val && (typeof val === 'string' || typeof val === 'number')) { - return convertValue({ - relatedCollection, - value: val, - }) + // Handle has many - polymorphic + if (isValidRelationObject(val)) { + const relatedCollectionForSingleValue = config.collections?.find( + ({ slug }) => slug === val.relationTo, + ) + + if (relatedCollectionForSingleValue) { + return { + relationTo: val.relationTo, + value: convertValue({ + relatedCollection: relatedCollectionForSingleValue, + value: val.value, + }), } + } + } - // Handle has many - polymorphic - if (isValidRelationObject(val)) { - const relatedCollectionForSingleValue = config.collections?.find( - ({ slug }) => slug === val.relationTo, - ) - - if (relatedCollectionForSingleValue) { - return { - relationTo: val.relationTo, - value: convertValue({ - relatedCollection: relatedCollectionForSingleValue, - value: val.value, - }), - } - } - } + return val + }) + } - return val - }) + // Handle has one - polymorphic + if (isValidRelationObject(value)) { + relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo) + + if (relatedCollection) { + result = { + relationTo: value.relationTo, + value: convertValue({ relatedCollection, value: value.value }), } + } + } - // Handle has one - polymorphic - if (isValidRelationObject(value)) { - relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo) + // Handle has one + if (relatedCollection && value && (typeof value === 'string' || typeof value === 'number')) { + result = convertValue({ + relatedCollection, + value, + }) + } + if (locale) { + ref[locale] = result + } else { + ref[field.name] = result + } +} - if (relatedCollection) { - ref[field.name] = { - relationTo: value.relationTo, - value: convertValue({ relatedCollection, value: value.value }), +export const sanitizeRelationshipIDs = ({ + config, + data, + fields, +}: Args): Record => { + const sanitize = (field: Field, ref: unknown) => { + if (field.type === 'relationship' || field.type === 'upload') { + // handle localized relationships + if (config.localization && field.localized) { + const locales = config.localization.locales + const fieldRef = ref[field.name] + for (const { code } of locales) { + if (ref[field.name][code]) { + const value = ref[field.name][code] + sanitizeRelationship({ config, field, locale: code, ref: fieldRef, value }) } } - } - - // Handle has one - if (relatedCollection && value && (typeof value === 'string' || typeof value === 'number')) { - ref[field.name] = convertValue({ - relatedCollection, - value, + } else { + // handle non-localized relationships + sanitizeRelationship({ + config, + field, + locale: undefined, + ref, + value: ref[field.name], }) } } diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index 064ef1db895..feb6ce96869 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -45,7 +45,7 @@ describe('Joins Field Tests', () => { }, }) - for (let i = 0; i < 10; i++) { + for (let i = 0; i < 15; i++) { await createPost({ title: `test ${i}`, category: category.id, @@ -66,7 +66,7 @@ describe('Joins Field Tests', () => { const categoryWithPosts = await payload.findByID({ id: category.id, joins: { - posts: { + 'group.posts': { sort: '-title', }, }, @@ -96,6 +96,7 @@ describe('Joins Field Tests', () => { }) expect(categoryWithPosts.posts.docs).toHaveLength(1) + expect(categoryWithPosts.posts.hasNextPage).toStrictEqual(false) }) it('should populate joins using find', async () => { @@ -107,7 +108,7 @@ describe('Joins Field Tests', () => { expect(categoryWithPosts.group.posts.docs).toHaveLength(10) expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('title') - expect(categoryWithPosts.group.posts.docs[0].title).toBe('test 9') + expect(categoryWithPosts.group.posts.docs[0].title).toBe('test 14') }) describe('Joins with localization', () => { @@ -165,8 +166,7 @@ describe('Joins Field Tests', () => { }) describe('REST', () => { - it('should paginate joins', async () => { - let page = 1 + it('should have simple paginate for joins', async () => { const query = { depth: 1, where: { @@ -174,56 +174,23 @@ describe('Joins Field Tests', () => { }, joins: { posts: { - limit: 4, sort: 'createdAt', - get page() { - return page - }, + limit: 4, }, }, } + const pageWithLimit = await restClient.GET(`/categories`, { query }).then((res) => res.json()) + + query.joins.posts.limit = 0 + const unlimited = await restClient.GET(`/categories`, { query }).then((res) => res.json()) + + expect(pageWithLimit.docs[0].posts.docs).toHaveLength(4) + expect(pageWithLimit.docs[0].posts.docs[0].title).toStrictEqual('test 0') + expect(pageWithLimit.docs[0].posts.hasNextPage).toStrictEqual(true) - const page1 = await restClient.GET(`/categories`, { query }).then((res) => res.json()) - page = 2 - const page2 = await restClient.GET(`/categories`, { query }).then((res) => res.json()) - page = 3 - const page3 = await restClient.GET(`/categories`, { query }).then((res) => res.json()) - - expect(page1.docs[0].posts.docs).toHaveLength(4) - expect(page1.docs[0].posts.docs[0].title).toStrictEqual('test 0') - expect(page1.docs[0].posts.hasNextPage).toStrictEqual(true) - expect(page1.docs[0].posts.hasPrevPage).toStrictEqual(false) - expect(page1.docs[0].posts.limit).toStrictEqual(4) - expect(page1.docs[0].posts.nextPage).toStrictEqual(2) - expect(page1.docs[0].posts.page).toStrictEqual(1) - expect(page1.docs[0].posts.pagingCounter).toStrictEqual(1) - expect(page1.docs[0].posts.prevPage).toStrictEqual(null) - expect(page1.docs[0].posts.totalDocs).toStrictEqual(10) - expect(page1.docs[0].posts.totalPages).toStrictEqual(3) - - expect(page2.docs[0].posts.docs).toHaveLength(4) - expect(page2.docs[0].posts.docs[0].title).toStrictEqual('test 4') - expect(page2.docs[0].posts.hasNextPage).toStrictEqual(true) - expect(page2.docs[0].posts.hasPrevPage).toStrictEqual(true) - expect(page2.docs[0].posts.limit).toStrictEqual(4) - expect(page2.docs[0].posts.nextPage).toStrictEqual(3) - expect(page2.docs[0].posts.page).toStrictEqual(2) - expect(page2.docs[0].posts.pagingCounter).toStrictEqual(5) - expect(page2.docs[0].posts.prevPage).toStrictEqual(1) - expect(page2.docs[0].posts.totalDocs).toStrictEqual(10) - expect(page2.docs[0].posts.totalPages).toStrictEqual(3) - - expect(page3.docs[0].posts.docs).toHaveLength(2) - expect(page3.docs[0].posts.docs[0].title).toStrictEqual('test 8') - expect(page3.docs[0].posts.hasNextPage).toStrictEqual(false) - expect(page3.docs[0].posts.hasPrevPage).toStrictEqual(true) - expect(page3.docs[0].posts.limit).toStrictEqual(4) - expect(page3.docs[0].posts.nextPage).toStrictEqual(null) - expect(page3.docs[0].posts.page).toStrictEqual(3) - expect(page3.docs[0].posts.pagingCounter).toStrictEqual(9) - expect(page3.docs[0].posts.prevPage).toStrictEqual(2) - expect(page3.docs[0].posts.totalDocs).toStrictEqual(10) - expect(page3.docs[0].posts.totalPages).toStrictEqual(3) + expect(unlimited.docs[0].posts.docs).toHaveLength(15) + expect(unlimited.docs[0].posts.docs[0].title).toStrictEqual('test 0') + expect(unlimited.docs[0].posts.hasNextPage).toStrictEqual(false) }) it('should sort joins', async () => { const response = await restClient From b4cd2565456d21434e483ed9194937ae47dd0b4c Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 27 Aug 2024 15:38:30 -0400 Subject: [PATCH 083/173] chore: building again --- .../db-mongodb/src/utilities/buildJoinAggregation.ts | 5 +---- packages/drizzle/src/find/traverseFields.ts | 6 +----- packages/payload/src/database/types.ts | 2 +- packages/payload/src/index.ts | 1 - packages/payload/src/utilities/configToJSONSchema.ts | 9 --------- 5 files changed, 3 insertions(+), 20 deletions(-) diff --git a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts index 59460f7e307..e1b42c76986 100644 --- a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts +++ b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts @@ -10,7 +10,7 @@ type BuildJoinAggregationArgs = { collection: CollectionSlug collectionConfig: SanitizedCollectionConfig joins: JoinQuery - // the limit on number of docs at the top collection level + // the number of docs to get at the top collection level limit?: number locale: string // the where clause for the top collection @@ -30,7 +30,6 @@ export const buildJoinAggregation = async ({ return } - const promises = [] const joinConfig = adapter.payload.collections[collection].config.joins const aggregate: PipelineStage[] = [ { @@ -179,7 +178,5 @@ export const buildJoinAggregation = async ({ } } - await Promise.all(promises) - return aggregate } diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index aa759edf41c..a744be548f3 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -211,11 +211,7 @@ export const traverseFields = ({ case 'join': { // when `joinsQuery` is false, do not join if (joinQuery !== false) { - const { limit = 10, page = 1, sort } = joinQuery[`${path}${field.name}`] || {} - if (page !== 1) { - // we need a second query in read step to complete the join because drizzle doesn't support offset - throw new APIError('Pagination is not supported for joins') - } + const { limit = 10, sort } = joinQuery[`${path}${field.name}`] || {} const fields = adapter.payload.collections[field.collection].config.fields const joinTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${ field.localized && adapter.payload.config.localization ? adapter.localesSuffix : '' diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 7725a4b35f3..6f90bfd7110 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -49,7 +49,7 @@ export interface BaseDatabaseAdapter { */ destroy?: Destroy - find: (args: FindArgs) => Promise> + find: Find findGlobal: FindGlobal diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index f3ac9cc5eed..69e613dfa93 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -837,7 +837,6 @@ export type { QueryDrafts, QueryDraftsArgs, RollbackTransaction, - SimplePaginatedDocs, Transaction, UpdateGlobal, UpdateGlobalArgs, diff --git a/packages/payload/src/utilities/configToJSONSchema.ts b/packages/payload/src/utilities/configToJSONSchema.ts index c34aab3b84c..128985bda82 100644 --- a/packages/payload/src/utilities/configToJSONSchema.ts +++ b/packages/payload/src/utilities/configToJSONSchema.ts @@ -310,15 +310,6 @@ export function fieldsToJSONSchema( }, }, hasNextPage: { type: withNullableJSONSchemaType('boolean', false) }, - hasPrevPage: { type: withNullableJSONSchemaType('boolean', false) }, - limit: { type: withNullableJSONSchemaType('integer', false) }, - nextPage: { type: withNullableJSONSchemaType('integer', false) }, - offset: { type: withNullableJSONSchemaType('integer', false) }, - page: { type: withNullableJSONSchemaType('integer', false) }, - pagingCounter: { type: withNullableJSONSchemaType('integer', false) }, - prevPage: { type: withNullableJSONSchemaType('integer', false) }, - totalDocs: { type: withNullableJSONSchemaType('integer', false) }, - totalPages: { type: withNullableJSONSchemaType('integer', false) }, }, } break From 58b8b5c5fa97c935ca77f927f5a2646f59247361 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 27 Aug 2024 16:31:50 -0400 Subject: [PATCH 084/173] chore: fix relationship population promise --- .../fields/hooks/afterRead/relationshipPopulationPromise.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts index ee73094478e..44dbf304876 100644 --- a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts +++ b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts @@ -81,18 +81,18 @@ const populate = async ({ } if (typeof index === 'number' && typeof key === 'string') { - if (field.type === 'relationship' && Array.isArray(field.relationTo)) { + if (field.type !== 'join' && Array.isArray(field.relationTo)) { dataToUpdate[field.name][key][index].value = relationshipValue } else { dataToUpdate[field.name][key][index] = relationshipValue } } else if (typeof index === 'number' || typeof key === 'string') { - if (field.type === 'relationship' && Array.isArray(field.relationTo)) { + if (field.type !== 'join' && Array.isArray(field.relationTo)) { dataToUpdate[field.name][index ?? key].value = relationshipValue } else { dataToUpdate[field.name].docs[index ?? key] = relationshipValue } - } else if (field.type === 'relationship' && Array.isArray(field.relationTo)) { + } else if (field.type !== 'join' && Array.isArray(field.relationTo)) { dataToUpdate[field.name].value = relationshipValue } else { dataToUpdate[field.name] = relationshipValue From f2eab0e1703459c4d2f9c5ffce355bb9d880f870 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 27 Aug 2024 17:02:10 -0400 Subject: [PATCH 085/173] chore: fix relationship population promise for uploads --- .../src/fields/hooks/afterRead/relationshipPopulationPromise.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts index 44dbf304876..664f5bd59f1 100644 --- a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts +++ b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts @@ -45,7 +45,7 @@ const populate = async ({ const relatedCollection = req.payload.collections[relation] if (relatedCollection) { - let id = field.type === 'relationship' && Array.isArray(field.relationTo) ? data.value : data + let id = field.type !== 'join' && Array.isArray(field.relationTo) ? data.value : data let relationshipValue const shouldPopulate = depth && currentDepth <= depth From e8d834a1e4b414703a25d49ae5155b258d69fd5e Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Tue, 27 Aug 2024 14:32:53 -0400 Subject: [PATCH 086/173] restructures test suite and scaffolds initial e2e test --- packages/ui/src/fields/Join/index.tsx | 35 +++--- test/helpers/e2e/navigateToFirstCellLink.ts | 4 +- test/joins/collections/Categories.ts | 36 ++++++ test/joins/collections/Posts.ts | 33 +++++ test/joins/config.ts | 129 +++----------------- test/joins/e2e.spec.ts | 19 +-- test/joins/payload-types.ts | 15 +++ test/joins/seed.ts | 65 ++++++++++ test/joins/shared.ts | 14 +++ tsconfig.json | 2 +- 10 files changed, 211 insertions(+), 141 deletions(-) create mode 100644 test/joins/collections/Categories.ts create mode 100644 test/joins/collections/Posts.ts create mode 100644 test/joins/seed.ts create mode 100644 test/joins/shared.ts diff --git a/packages/ui/src/fields/Join/index.tsx b/packages/ui/src/fields/Join/index.tsx index 9227bc346d6..6ddf79403f5 100644 --- a/packages/ui/src/fields/Join/index.tsx +++ b/packages/ui/src/fields/Join/index.tsx @@ -2,7 +2,7 @@ import type { JoinFieldProps, PaginatedDocs } from 'payload' -import React, { useCallback } from 'react' +import React from 'react' import { RelationshipTable } from '../../elements/RelationshipTable/index.js' import { FieldLabel } from '../../fields/FieldLabel/index.js' @@ -10,6 +10,7 @@ import { useFieldProps } from '../../forms/FieldPropsProvider/index.js' import { useField } from '../../forms/useField/index.js' import { withCondition } from '../../forms/withCondition/index.js' import { useDocumentInfo } from '../../providers/DocumentInfo/index.js' +import { fieldBaseClass } from '../index.js' const JoinFieldComponent: React.FC = (props) => { const { @@ -35,21 +36,23 @@ const JoinFieldComponent: React.FC = (props) => { }) return ( - - - - } - field={field} - filterOptions={{ - [on]: { - in: [docID], - }, - }} - initialData={value} - relationTo={collection} - /> +
+ + + + } + field={field} + filterOptions={{ + [on]: { + in: [docID], + }, + }} + initialData={value} + relationTo={collection} + /> +
) } diff --git a/test/helpers/e2e/navigateToFirstCellLink.ts b/test/helpers/e2e/navigateToFirstCellLink.ts index 5a31a4b81d6..9212a26e724 100644 --- a/test/helpers/e2e/navigateToFirstCellLink.ts +++ b/test/helpers/e2e/navigateToFirstCellLink.ts @@ -1,7 +1,7 @@ import type { Page } from '@playwright/test' -export async function navigateToListCellLink(page: Page, selector = '.cell-id') { - const cellLink = page.locator(`${selector} a`).first() +export async function navigateToListCellLink(page: Page) { + const cellLink = page.locator(`tbody tr:first-child td a`).first() const linkURL = await cellLink.getAttribute('href') await cellLink.click() await page.waitForURL(`**${linkURL}`) diff --git a/test/joins/collections/Categories.ts b/test/joins/collections/Categories.ts new file mode 100644 index 00000000000..a9adfe43360 --- /dev/null +++ b/test/joins/collections/Categories.ts @@ -0,0 +1,36 @@ +import type { CollectionConfig } from 'payload' + +import { categoriesSlug, postsSlug } from '../shared.js' + +export const Categories: CollectionConfig = { + slug: categoriesSlug, + admin: { + useAsTitle: 'name', + }, + fields: [ + { + name: 'name', + type: 'text', + }, + { + name: postsSlug, + label: 'Related Posts', + type: 'join', + collection: postsSlug, + on: 'category', + }, + { + name: 'group', + type: 'group', + fields: [ + { + name: postsSlug, + label: 'Related Posts (Group)', + type: 'join', + collection: postsSlug, + on: 'group.category', + }, + ], + }, + ], +} diff --git a/test/joins/collections/Posts.ts b/test/joins/collections/Posts.ts new file mode 100644 index 00000000000..01d3e3fd12d --- /dev/null +++ b/test/joins/collections/Posts.ts @@ -0,0 +1,33 @@ +import type { CollectionConfig } from 'payload' + +import { categoriesSlug, postsSlug } from '../shared.js' + +export const Posts: CollectionConfig = { + slug: postsSlug, + admin: { + useAsTitle: 'title', + defaultColumns: ['title', 'category', 'updatedAt', 'createdAt'], + }, + fields: [ + { + name: 'title', + type: 'text', + }, + { + name: 'category', + type: 'relationship', + relationTo: categoriesSlug, + }, + { + name: 'group', + type: 'group', + fields: [ + { + name: 'category', + type: 'relationship', + relationTo: categoriesSlug, + }, + ], + }, + ], +} diff --git a/test/joins/config.ts b/test/joins/config.ts index 264659207b1..6c2396bb735 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -2,76 +2,20 @@ import { fileURLToPath } from 'node:url' import path from 'path' import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' -import { devUser } from '../credentials.js' +import { Categories } from './collections/Categories.js' +import { Posts } from './collections/Posts.js' +import { seed } from './seed.js' +import { localizedCategoriesSlug, localizedPostsSlug, postsSlug } from './shared.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) export default buildConfigWithDefaults({ collections: [ + Posts, + Categories, { - slug: 'posts', - admin: { - useAsTitle: 'title', - defaultColumns: ['title', 'category', 'updatedAt', 'createdAt'], - }, - fields: [ - { - name: 'title', - type: 'text', - }, - { - name: 'category', - type: 'relationship', - relationTo: 'categories', - }, - { - name: 'group', - type: 'group', - fields: [ - { - name: 'category', - type: 'relationship', - relationTo: 'categories', - }, - ], - }, - ], - }, - { - slug: 'categories', - admin: { - useAsTitle: 'name', - }, - fields: [ - { - name: 'name', - type: 'text', - }, - { - name: 'posts', - label: 'Related Posts', - type: 'join', - collection: 'posts', - on: 'category', - }, - // { - // name: 'group', - // type: 'group', - // fields: [ - // { - // name: 'posts', - // label: 'Related Posts (Group)', - // type: 'join', - // collection: 'posts', - // on: 'group.category', - // }, - // ], - // }, - ], - }, - { - slug: 'localized-posts', + slug: localizedPostsSlug, admin: { useAsTitle: 'title', }, @@ -85,12 +29,12 @@ export default buildConfigWithDefaults({ name: 'category', type: 'relationship', localized: true, - relationTo: 'localized-categories', + relationTo: localizedCategoriesSlug, }, ], }, { - slug: 'localized-categories', + slug: localizedCategoriesSlug, admin: { useAsTitle: 'name', }, @@ -100,9 +44,9 @@ export default buildConfigWithDefaults({ type: 'text', }, { - name: 'posts', + name: postsSlug, type: 'join', - collection: 'localized-posts', + collection: localizedPostsSlug, on: 'category', localized: true, }, @@ -114,54 +58,9 @@ export default buildConfigWithDefaults({ defaultLocale: 'en', }, onInit: async (payload) => { - await payload.create({ - collection: 'users', - data: { - email: devUser.email, - password: devUser.password, - }, - }) - - const category = await payload.create({ - collection: 'categories', - data: { - name: 'example', - // group: {}, - }, - }) - - await payload.create({ - collection: 'posts', - data: { - category: category.id, - // group: { - // category: category.id, - // }, - title: 'Test Post 1', - }, - }) - - await payload.create({ - collection: 'posts', - data: { - category: category.id, - // group: { - // category: category.id, - // }, - title: 'Test Post 2', - }, - }) - - await payload.create({ - collection: 'posts', - data: { - category: category.id, - // group: { - // category: category.id, - // }, - title: 'Test Post 3', - }, - }) + if (process.env.SEED_IN_CONFIG_ONINIT !== 'false') { + await seed(payload) + } }, typescript: { outputFile: path.resolve(dirname, 'payload-types.ts'), diff --git a/test/joins/e2e.spec.ts b/test/joins/e2e.spec.ts index 35e1fb60dfb..399af08a3c2 100644 --- a/test/joins/e2e.spec.ts +++ b/test/joins/e2e.spec.ts @@ -6,21 +6,25 @@ import { fileURLToPath } from 'url' import { ensureCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' +import { navigateToDoc } from '../helpers/e2e/navigateToDoc.js' import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' import { TEST_TIMEOUT_LONG } from '../playwright.config.js' +import { categoriesSlug, postsSlug } from './shared.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) test.describe('Admin Panel', () => { let page: Page - let url: AdminUrlUtil + let categoriesURL: AdminUrlUtil + let postsURL: AdminUrlUtil test.beforeAll(async ({ browser }, testInfo) => { testInfo.setTimeout(TEST_TIMEOUT_LONG) const { payload, serverURL } = await initPayloadE2ENoConfig({ dirname }) - url = new AdminUrlUtil(serverURL, 'posts') + postsURL = new AdminUrlUtil(serverURL, postsSlug) + categoriesURL = new AdminUrlUtil(serverURL, categoriesSlug) const context = await browser.newContext() page = await context.newPage() @@ -28,10 +32,11 @@ test.describe('Admin Panel', () => { await ensureCompilationIsDone({ page, serverURL }) }) - test('example test', async () => { - await page.goto(url.list) - - const textCell = page.locator('.row-1 .cell-text') - await expect(textCell).toHaveText('example post') + test('renders join field with initial rows', async () => { + await navigateToDoc(page, categoriesURL) + const joinField = page.locator('.field-type.join').first() + await expect(joinField).toBeVisible() + const columns = await joinField.locator('.relationship-table tbody tr').count() + expect(columns).toBe(3) }) }) diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 6d51c474e2b..c3646d7b6d4 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -80,6 +80,21 @@ export interface Category { totalDocs?: number | null; totalPages?: number | null; } | null; + group?: { + posts?: { + docs?: (string | Post)[] | null; + hasNextPage?: boolean | null; + hasPrevPage?: boolean | null; + limit?: number | null; + nextPage?: number | null; + offset?: number | null; + page?: number | null; + pagingCounter?: number | null; + prevPage?: number | null; + totalDocs?: number | null; + totalPages?: number | null; + } | null; + }; updatedAt: string; createdAt: string; } diff --git a/test/joins/seed.ts b/test/joins/seed.ts new file mode 100644 index 00000000000..26656958687 --- /dev/null +++ b/test/joins/seed.ts @@ -0,0 +1,65 @@ +import type { Payload } from 'payload' + +import { devUser } from '../credentials.js' +import { seedDB } from '../helpers/seed.js' +import { categoriesSlug, collectionSlugs, postsSlug } from './shared.js' + +export const seed = async (_payload) => { + await _payload.create({ + collection: 'users', + data: { + email: devUser.email, + password: devUser.password, + }, + }) + + const category = await _payload.create({ + collection: categoriesSlug, + data: { + name: 'example', + group: {}, + }, + }) + + await _payload.create({ + collection: postsSlug, + data: { + category: category.id, + group: { + category: category.id, + }, + title: 'Test Post 1', + }, + }) + + await _payload.create({ + collection: postsSlug, + data: { + category: category.id, + group: { + category: category.id, + }, + title: 'Test Post 2', + }, + }) + + await _payload.create({ + collection: postsSlug, + data: { + category: category.id, + group: { + category: category.id, + }, + title: 'Test Post 3', + }, + }) +} + +export async function clearAndSeedEverything(_payload: Payload) { + return await seedDB({ + _payload, + collectionSlugs, + seedFunction: seed, + snapshotKey: 'adminTest', + }) +} diff --git a/test/joins/shared.ts b/test/joins/shared.ts new file mode 100644 index 00000000000..cf4af79035a --- /dev/null +++ b/test/joins/shared.ts @@ -0,0 +1,14 @@ +export const categoriesSlug = 'categories' + +export const postsSlug = 'posts' + +export const localizedPostsSlug = 'localized-posts' + +export const localizedCategoriesSlug = 'localized-categories' + +export const collectionSlugs = [ + categoriesSlug, + postsSlug, + localizedPostsSlug, + localizedCategoriesSlug, +] diff --git a/tsconfig.json b/tsconfig.json index ae27597fb03..e4444f4d18e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,7 +37,7 @@ ], "paths": { "@payload-config": [ - "./test/_community/config.ts" + "./test/joins/config.ts" ], "@payloadcms/live-preview": [ "./packages/live-preview/src" From 06393fd0af67478dce0bfa0cfe1937d31625c247 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 28 Aug 2024 10:12:15 -0400 Subject: [PATCH 087/173] sanitizes joins from client collecton config --- packages/next/src/layouts/Root/index.tsx | 2 +- .../Config/createClientConfig/collections.tsx | 1 + test/joins/collections/Categories.ts | 4 +-- test/joins/config.ts | 4 +-- test/joins/payload-types.ts | 33 ++----------------- 5 files changed, 9 insertions(+), 35 deletions(-) diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index b759fc717bf..57e12fe9d5d 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -137,7 +137,7 @@ export const RootLayout = async ({ )?.docs?.[0] : null - const isNavOpen = (navPreferences?.value as any)?.open ?? true + const isNavOpen = navPreferences?.value?.open ?? true return ( diff --git a/packages/ui/src/providers/Config/createClientConfig/collections.tsx b/packages/ui/src/providers/Config/createClientConfig/collections.tsx index 6f5ae2de4cc..fc79335c363 100644 --- a/packages/ui/src/providers/Config/createClientConfig/collections.tsx +++ b/packages/ui/src/providers/Config/createClientConfig/collections.tsx @@ -24,6 +24,7 @@ const serverOnlyCollectionProperties: Partial[] 'access', 'endpoints', 'custom', + 'joins', // `upload` // `admin` // are all handled separately diff --git a/test/joins/collections/Categories.ts b/test/joins/collections/Categories.ts index a9adfe43360..6044db17966 100644 --- a/test/joins/collections/Categories.ts +++ b/test/joins/collections/Categories.ts @@ -13,7 +13,7 @@ export const Categories: CollectionConfig = { type: 'text', }, { - name: postsSlug, + name: 'relatedPosts', label: 'Related Posts', type: 'join', collection: postsSlug, @@ -24,7 +24,7 @@ export const Categories: CollectionConfig = { type: 'group', fields: [ { - name: postsSlug, + name: 'relatedPosts', label: 'Related Posts (Group)', type: 'join', collection: postsSlug, diff --git a/test/joins/config.ts b/test/joins/config.ts index 6c2396bb735..c1815cdccde 100644 --- a/test/joins/config.ts +++ b/test/joins/config.ts @@ -5,7 +5,7 @@ import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' import { Categories } from './collections/Categories.js' import { Posts } from './collections/Posts.js' import { seed } from './seed.js' -import { localizedCategoriesSlug, localizedPostsSlug, postsSlug } from './shared.js' +import { localizedCategoriesSlug, localizedPostsSlug } from './shared.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -44,7 +44,7 @@ export default buildConfigWithDefaults({ type: 'text', }, { - name: postsSlug, + name: 'relatedPosts', type: 'join', collection: localizedPostsSlug, on: 'category', diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index c3646d7b6d4..9099e3e9ac6 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -67,32 +67,14 @@ export interface Post { export interface Category { id: string; name?: string | null; - posts?: { + relatedPosts?: { docs?: (string | Post)[] | null; hasNextPage?: boolean | null; - hasPrevPage?: boolean | null; - limit?: number | null; - nextPage?: number | null; - offset?: number | null; - page?: number | null; - pagingCounter?: number | null; - prevPage?: number | null; - totalDocs?: number | null; - totalPages?: number | null; } | null; group?: { - posts?: { + relatedPosts?: { docs?: (string | Post)[] | null; hasNextPage?: boolean | null; - hasPrevPage?: boolean | null; - limit?: number | null; - nextPage?: number | null; - offset?: number | null; - page?: number | null; - pagingCounter?: number | null; - prevPage?: number | null; - totalDocs?: number | null; - totalPages?: number | null; } | null; }; updatedAt: string; @@ -116,18 +98,9 @@ export interface LocalizedPost { export interface LocalizedCategory { id: string; name?: string | null; - posts?: { + relatedPosts?: { docs?: (string | LocalizedPost)[] | null; hasNextPage?: boolean | null; - hasPrevPage?: boolean | null; - limit?: number | null; - nextPage?: number | null; - offset?: number | null; - page?: number | null; - pagingCounter?: number | null; - prevPage?: number | null; - totalDocs?: number | null; - totalPages?: number | null; } | null; updatedAt: string; createdAt: string; From 09320143b3f9c7711cbd9dbc1cf0aaec92bbc74b Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 28 Aug 2024 10:17:03 -0400 Subject: [PATCH 088/173] chore: fix mongodb querying by object id --- packages/db-mongodb/src/queries/sanitizeQueryValue.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts index 5cbedc19f27..1685cf2672f 100644 --- a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts +++ b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts @@ -1,5 +1,6 @@ import type { Field, TabAsField } from 'payload' +import ObjectIdImport from 'bson-objectid' import mongoose from 'mongoose' import { createArrayFromCommaDelineated } from 'payload' @@ -11,6 +12,8 @@ type SanitizeQueryValueArgs = { val: any } +const ObjectId = (ObjectIdImport.default || + ObjectIdImport) as unknown as typeof ObjectIdImport.default export const sanitizeQueryValue = ({ field, hasCustomID, @@ -33,7 +36,7 @@ export const sanitizeQueryValue = ({ if (!isValid) { return { operator: formattedOperator, val: undefined } } else { - formattedValue = new mongoose.Types.ObjectId(val) + formattedValue = ObjectId(val) } } From ed5c3b04af758a379b1b658aca2a721045aa1b4f Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 28 Aug 2024 11:48:35 -0400 Subject: [PATCH 089/173] chore: fix traversefields tabs object --- packages/payload/src/utilities/traverseFields.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/payload/src/utilities/traverseFields.ts b/packages/payload/src/utilities/traverseFields.ts index 144662705dd..cbad7e66f38 100644 --- a/packages/payload/src/utilities/traverseFields.ts +++ b/packages/payload/src/utilities/traverseFields.ts @@ -36,7 +36,9 @@ export const traverseFields = ( if (field.type === 'tabs' && 'tabs' in field) { field.tabs.forEach((tab) => { if ('name' in tab && tab.name) { - ref[tab.name] = {} + if (typeof ref[tab.name] === 'undefined') { + ref[tab.name] = {} + } ref = ref[tab.name] } traverseFields(tab.fields, callback, ref, parentRef) From 7d433ab3ba601bb8f24376272756dd9e7a6d7e82 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 28 Aug 2024 12:08:38 -0400 Subject: [PATCH 090/173] chore: fix relationship population error --- .../hooks/afterRead/relationshipPopulationPromise.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts index 664f5bd59f1..93ccc47f9d7 100644 --- a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts +++ b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts @@ -79,18 +79,19 @@ const populate = async ({ // ids are visible regardless of access controls relationshipValue = id } - if (typeof index === 'number' && typeof key === 'string') { - if (field.type !== 'join' && Array.isArray(field.relationTo)) { + if (Array.isArray(field.relationTo)) { dataToUpdate[field.name][key][index].value = relationshipValue } else { dataToUpdate[field.name][key][index] = relationshipValue } } else if (typeof index === 'number' || typeof key === 'string') { - if (field.type !== 'join' && Array.isArray(field.relationTo)) { + if (field.type === 'join') { + dataToUpdate[field.name].docs[index ?? key] = relationshipValue + } else if (Array.isArray(field.relationTo)) { dataToUpdate[field.name][index ?? key].value = relationshipValue } else { - dataToUpdate[field.name].docs[index ?? key] = relationshipValue + dataToUpdate[field.name][index ?? key] = relationshipValue } } else if (field.type !== 'join' && Array.isArray(field.relationTo)) { dataToUpdate[field.name].value = relationshipValue From f027e0549b946d525c7bba0e606c9add0db45bbf Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 28 Aug 2024 12:20:29 -0400 Subject: [PATCH 091/173] chore: relationship population type error --- .../src/fields/hooks/afterRead/relationshipPopulationPromise.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts index 93ccc47f9d7..8d2599094da 100644 --- a/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts +++ b/packages/payload/src/fields/hooks/afterRead/relationshipPopulationPromise.ts @@ -80,7 +80,7 @@ const populate = async ({ relationshipValue = id } if (typeof index === 'number' && typeof key === 'string') { - if (Array.isArray(field.relationTo)) { + if (field.type !== 'join' && Array.isArray(field.relationTo)) { dataToUpdate[field.name][key][index].value = relationshipValue } else { dataToUpdate[field.name][key][index] = relationshipValue From 38276564074af468e04484cca9910311973f590c Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 28 Aug 2024 11:17:34 -0400 Subject: [PATCH 092/173] scaffolds more e2e tests --- test/admin/e2e/2/e2e.spec.ts | 45 ++---------------------- test/helpers/e2e/reorderColumns.ts | 56 ++++++++++++++++++++++++++++++ test/joins/e2e.spec.ts | 44 ++++++++++++++++++++++- tsconfig.json | 2 +- 4 files changed, 103 insertions(+), 44 deletions(-) create mode 100644 test/helpers/e2e/reorderColumns.ts diff --git a/test/admin/e2e/2/e2e.spec.ts b/test/admin/e2e/2/e2e.spec.ts index 255e2865543..2cb1577a941 100644 --- a/test/admin/e2e/2/e2e.spec.ts +++ b/test/admin/e2e/2/e2e.spec.ts @@ -2,7 +2,6 @@ import type { Page } from '@playwright/test' import { expect, test } from '@playwright/test' import { mapAsync } from 'payload' -import { wait } from 'payload/shared' import * as qs from 'qs-esm' import type { Config, Geo, Post } from '../../payload-types.js' @@ -32,6 +31,7 @@ import { fileURLToPath } from 'url' import type { PayloadTestSDK } from '../../../helpers/sdk/index.js' +import { reorderColumns } from '../../../helpers/e2e/reorderColumns.js' import { reInitializeDB } from '../../../helpers/reInitializeDB.js' import { POLL_TOPASS_TIMEOUT, TEST_TIMEOUT_LONG } from '../../../playwright.config.js' const filename = fileURLToPath(import.meta.url) @@ -483,49 +483,10 @@ describe('admin2', () => { }) describe('table columns', () => { - const reorderColumns = async () => { - // open the column controls - await page.locator('.list-controls__toggle-columns').click() - // wait until the column toggle UI is visible and fully expanded - await expect(page.locator('.list-controls__columns.rah-static--height-auto')).toBeVisible() - - const numberBoundingBox = await page - .locator(`.column-selector .column-selector__column`, { - hasText: exactText('Number'), - }) - - .boundingBox() - - const idBoundingBox = await page - .locator(`.column-selector .column-selector__column`, { - hasText: exactText('ID'), - }) - .boundingBox() - - if (!numberBoundingBox || !idBoundingBox) return - - // drag the "number" column to the left of the "ID" column - await page.mouse.move(numberBoundingBox.x + 2, numberBoundingBox.y + 2, { steps: 10 }) - await page.mouse.down() - await wait(300) - - await page.mouse.move(idBoundingBox.x - 2, idBoundingBox.y - 2, { steps: 10 }) - await page.mouse.up() - - // ensure the "number" column is now first - await expect( - page.locator('.list-controls .column-selector .column-selector__column').first(), - ).toHaveText('Number') - await expect(page.locator('table thead tr th').nth(1)).toHaveText('Number') - - // TODO: This wait makes sure the preferences are actually saved. Just waiting for the UI to update is not enough. We should replace this wait - await wait(1000) - } - test('should drag to reorder columns and save to preferences', async () => { await createPost() - await reorderColumns() + await reorderColumns(page, { fromColumn: 'Number', toColumn: 'ID' }) // reload to ensure the preferred order was stored in the database await page.reload() @@ -538,7 +499,7 @@ describe('admin2', () => { test('should render drawer columns in order', async () => { // Re-order columns like done in the previous test await createPost() - await reorderColumns() + await reorderColumns(page, { fromColumn: 'Number', toColumn: 'ID' }) await page.reload() diff --git a/test/helpers/e2e/reorderColumns.ts b/test/helpers/e2e/reorderColumns.ts new file mode 100644 index 00000000000..bb7adc0e330 --- /dev/null +++ b/test/helpers/e2e/reorderColumns.ts @@ -0,0 +1,56 @@ +import type { Page } from '@playwright/test' + +import { expect } from '@playwright/test' +import { wait } from 'payload/shared' +import { POLL_TOPASS_TIMEOUT } from 'playwright.config.js' + +import { exactText } from '../../helpers.js' + +export const reorderColumns = async ( + page: Page, + { + togglerSelector = '.list-controls__toggle-columns', + columnContainerSelector = '.list-controls__columns', + fromColumn = 'Number', + toColumn = 'ID', + }: { + columnContainerSelector?: string + fromColumn: string + toColumn: string + togglerSelector?: string + }, +) => { + await page.locator(togglerSelector).click() + const columnContainer = page.locator(columnContainerSelector) + + await expect(page.locator(`${columnContainerSelector}.rah-static--height-auto`)).toBeVisible() + + const fromBoundingBox = await columnContainer + .locator(`.column-selector .column-selector__column`, { + hasText: exactText(fromColumn), + }) + .boundingBox() + + const toBoundingBox = await columnContainer + .locator(`.column-selector .column-selector__column`, { + hasText: exactText(toColumn), + }) + .boundingBox() + + if (!fromBoundingBox || !toBoundingBox) return + + // drag the "from" column to the left of the "to" column + await page.mouse.move(fromBoundingBox.x + 2, fromBoundingBox.y + 2, { steps: 10 }) + await page.mouse.down() + await wait(300) + await page.mouse.move(toBoundingBox.x - 2, toBoundingBox.y - 2, { steps: 10 }) + await page.mouse.up() + + await expect( + columnContainer.locator('.column-selector .column-selector__column').first(), + ).toHaveText(fromColumn) + + await expect(page.locator('table thead tr th').nth(1)).toHaveText(fromColumn) + // TODO: This wait makes sure the preferences are actually saved. Just waiting for the UI to update is not enough. We should replace this wait + await wait(1000) +} diff --git a/test/joins/e2e.spec.ts b/test/joins/e2e.spec.ts index 399af08a3c2..43b8bcea00a 100644 --- a/test/joins/e2e.spec.ts +++ b/test/joins/e2e.spec.ts @@ -1,6 +1,7 @@ import type { Page } from '@playwright/test' import { expect, test } from '@playwright/test' +import { reorderColumns } from 'helpers/e2e/reorderColumns.js' import * as path from 'path' import { fileURLToPath } from 'url' @@ -32,11 +33,52 @@ test.describe('Admin Panel', () => { await ensureCompilationIsDone({ page, serverURL }) }) - test('renders join field with initial rows', async () => { + test('populates joined relationships in table cells of list view', async () => { + await page.goto(categoriesURL.list) + const cell = page.locator('tbody tr:first-child td.cell-relatedPosts') + const text = await cell.textContent() + expect(text).toContain('Test Post 1') + expect(text).toContain('Test Post 2') + expect(text).toContain('Test Post 3') + }) + + test('should render initial rows within relationship table', async () => { await navigateToDoc(page, categoriesURL) const joinField = page.locator('.field-type.join').first() await expect(joinField).toBeVisible() const columns = await joinField.locator('.relationship-table tbody tr').count() expect(columns).toBe(3) }) + + test('should render collection type in first column of relationship table', async () => { + await navigateToDoc(page, categoriesURL) + const joinField = page.locator('.field-type.join').first() + await expect(joinField).toBeVisible() + const collectionTypeColumn = joinField.locator('thead tr th#heading-collection:first-child') + const text = collectionTypeColumn + await expect(text).toHaveText('Type') + const cells = joinField.locator('.relationship-table tbody tr td:first-child .pill__label') + for (const cell of cells) { + const text = cell + await expect(text).toHaveText('Post') + } + }) + + test('should render drawer toggler without document link in second column of relationship table', async () => { + await navigateToDoc(page, categoriesURL) + const joinField = page.locator('.field-type.join').first() + await expect(joinField).toBeVisible() + const actionColumn = joinField.locator('tbody tr td:nth-child(2)') + const toggler = actionColumn.locator('button.doc-drawer__toggler') + await expect(toggler).toBeVisible() + const link = actionColumn.locator('a') + await expect(link).toBeHidden() + // change column order and ensure this behavior remains on the second column + await reorderColumns(page, { + togglerSelector: '.relationship-table__toggle-columns', + columnContainerSelector: '.relationship-table__columns', + fromColumn: 'Title', + toColumn: 'Category', + }) + }) }) diff --git a/tsconfig.json b/tsconfig.json index e4444f4d18e..ae27597fb03 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,7 +37,7 @@ ], "paths": { "@payload-config": [ - "./test/joins/config.ts" + "./test/_community/config.ts" ], "@payloadcms/live-preview": [ "./packages/live-preview/src" From 5050db712403212d84662dce15c6f60fb8310db4 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 28 Aug 2024 12:39:39 -0400 Subject: [PATCH 093/173] passing tests --- test/helpers/e2e/reorderColumns.ts | 7 +++---- test/joins/e2e.spec.ts | 30 ++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/test/helpers/e2e/reorderColumns.ts b/test/helpers/e2e/reorderColumns.ts index bb7adc0e330..55f23358908 100644 --- a/test/helpers/e2e/reorderColumns.ts +++ b/test/helpers/e2e/reorderColumns.ts @@ -2,7 +2,6 @@ import type { Page } from '@playwright/test' import { expect } from '@playwright/test' import { wait } from 'payload/shared' -import { POLL_TOPASS_TIMEOUT } from 'playwright.config.js' import { exactText } from '../../helpers.js' @@ -20,8 +19,8 @@ export const reorderColumns = async ( togglerSelector?: string }, ) => { - await page.locator(togglerSelector).click() - const columnContainer = page.locator(columnContainerSelector) + await page.locator(togglerSelector).first().click() + const columnContainer = page.locator(columnContainerSelector).first() await expect(page.locator(`${columnContainerSelector}.rah-static--height-auto`)).toBeVisible() @@ -50,7 +49,7 @@ export const reorderColumns = async ( columnContainer.locator('.column-selector .column-selector__column').first(), ).toHaveText(fromColumn) - await expect(page.locator('table thead tr th').nth(1)).toHaveText(fromColumn) + await expect(page.locator('table thead tr th').nth(1).first()).toHaveText(fromColumn) // TODO: This wait makes sure the preferences are actually saved. Just waiting for the UI to update is not enough. We should replace this wait await wait(1000) } diff --git a/test/joins/e2e.spec.ts b/test/joins/e2e.spec.ts index 43b8bcea00a..592cf4f4ee7 100644 --- a/test/joins/e2e.spec.ts +++ b/test/joins/e2e.spec.ts @@ -5,7 +5,7 @@ import { reorderColumns } from 'helpers/e2e/reorderColumns.js' import * as path from 'path' import { fileURLToPath } from 'url' -import { ensureCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js' +import { ensureCompilationIsDone, exactText, initPageConsoleErrorCatch } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' import { navigateToDoc } from '../helpers/e2e/navigateToDoc.js' import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' @@ -35,11 +35,16 @@ test.describe('Admin Panel', () => { test('populates joined relationships in table cells of list view', async () => { await page.goto(categoriesURL.list) - const cell = page.locator('tbody tr:first-child td.cell-relatedPosts') - const text = await cell.textContent() - expect(text).toContain('Test Post 1') - expect(text).toContain('Test Post 2') - expect(text).toContain('Test Post 3') + await expect + .poll( + async () => + await page + .locator('tbody tr:first-child td.cell-relatedPosts', { + hasText: exactText('Test Post 3, Test Post 2, Test Post 1'), + }) + .isVisible(), + ) + .toBeTruthy() }) test('should render initial rows within relationship table', async () => { @@ -58,9 +63,14 @@ test.describe('Admin Panel', () => { const text = collectionTypeColumn await expect(text).toHaveText('Type') const cells = joinField.locator('.relationship-table tbody tr td:first-child .pill__label') - for (const cell of cells) { - const text = cell - await expect(text).toHaveText('Post') + + const count = await cells.count() + + for (let i = 0; i < count; i++) { + const element = cells.nth(i) + // Perform actions on each element + await expect(element).toBeVisible() + await expect(element).toHaveText('Post') } }) @@ -68,7 +78,7 @@ test.describe('Admin Panel', () => { await navigateToDoc(page, categoriesURL) const joinField = page.locator('.field-type.join').first() await expect(joinField).toBeVisible() - const actionColumn = joinField.locator('tbody tr td:nth-child(2)') + const actionColumn = joinField.locator('tbody tr td:nth-child(2)').first() const toggler = actionColumn.locator('button.doc-drawer__toggler') await expect(toggler).toBeVisible() const link = actionColumn.locator('a') From f6cfa317f95ea532edf3e4ac511a429a30db7510 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 28 Aug 2024 13:13:18 -0400 Subject: [PATCH 094/173] restores moveColumn callback --- packages/ui/src/elements/TableColumns/index.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index 44b70eef7cd..419dac8f723 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -93,7 +93,14 @@ export const TableColumnsProvider: React.FC = ({ ) const moveColumn = useCallback( - (args: { fromIndex: number; toIndex: number }) => {}, + (args: { fromIndex: number; toIndex: number }) => { + const { fromIndex, toIndex } = args + const withMovedColumn = [...tableColumns] + const [columnToMove] = withMovedColumn.splice(fromIndex, 1) + withMovedColumn.splice(toIndex, 0, columnToMove) + setTableColumns(withMovedColumn) + updateColumnPreferences(withMovedColumn) + }, [tableColumns, updateColumnPreferences], ) From 89612aa38b83baf9dba17ebdd293c5394ea43c98 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Wed, 28 Aug 2024 13:23:59 -0400 Subject: [PATCH 095/173] feat: removes polling & updates user off of form-state in onChange call --- .../next/src/views/Edit/Default/index.tsx | 209 ++++++++---------- .../ui/src/providers/DocumentInfo/index.tsx | 7 +- .../ui/src/providers/DocumentInfo/types.ts | 3 +- 3 files changed, 103 insertions(+), 116 deletions(-) diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index 9921e1df64d..26ed7e12871 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -44,6 +44,7 @@ export const DefaultEditView: React.FC = () => { action, apiURL, collectionSlug, + currentEditor, disableActions, disableLeaveWithoutSaving, docPermissions, @@ -53,7 +54,6 @@ export const DefaultEditView: React.FC = () => { hasPublishPermission, hasSavePermission, initialData: data, - initialEditor, initialState, isDocumentLocked, isEditing, @@ -61,6 +61,7 @@ export const DefaultEditView: React.FC = () => { lastEditedAt, lockDocument, onSave: onSaveFromContext, + setCurrentEditor, unlockDocument, updateDocumentEditor, } = useDocumentInfo() @@ -78,7 +79,6 @@ export const DefaultEditView: React.FC = () => { } | null>(null) const isDocumentLockedRef = useRef(false) - const [isLockedByAnotherUser, setIsLockedByAnotherUser] = useState(false) const { @@ -101,6 +101,8 @@ export const DefaultEditView: React.FC = () => { const collectionConfig = getEntityConfig({ collectionSlug }) as ClientCollectionConfig + const lockWhenEditingProp = collectionConfig.lockWhenEditing + const globalConfig = getEntityConfig({ globalSlug }) as ClientGlobalConfig const entitySlug = collectionConfig?.slug || globalConfig?.slug @@ -120,7 +122,7 @@ export const DefaultEditView: React.FC = () => { if (globalSlug) classes.push(`global-edit--${globalSlug}`) if (collectionSlug) classes.push(`collection-edit--${collectionSlug}`) - const [schemaPath, setSchemaPath] = React.useState(() => { + const [schemaPath, setSchemaPath] = useState(() => { if (operation === 'create' && auth && !auth.disableLocalStrategy) { return `_${entitySlug}.auth` } @@ -135,11 +137,30 @@ export const DefaultEditView: React.FC = () => { return false }) + const lockTimer = useRef(null) + + const resetLockTimer = useCallback(() => { + if (lockTimer.current) { + clearTimeout(lockTimer.current) + } + + const duration = + typeof lockWhenEditingProp === 'object' && 'lockDuration' in lockWhenEditingProp + ? lockWhenEditingProp.lockDuration + : 300 + + lockTimer.current = setTimeout(() => { + if (id || globalSlug) { + void unlockDocument(id, collectionSlug ?? globalSlug) + } + }, duration * 1000) + }, [lockWhenEditingProp, id, globalSlug, collectionSlug, unlockDocument]) + + // Closes Document Locked modal upon take over const handleTakeOver = useCallback(() => { - // Close the modal and mark that the user intends to edit setShowLockedModal(false) setIsLockedByAnotherUser(false) - documentLockStateRef.current = { isLocked: true, user } + setShowTakeOverModal(false) }, [user]) useEffect(() => { @@ -150,37 +171,19 @@ export const DefaultEditView: React.FC = () => { } }, [user.id]) - // Handle modal display logic based on lock state useEffect(() => { - if (isDocumentLocked && initialEditor && initialEditor.id !== user.id) { + if (isDocumentLocked && currentEditor && currentEditor.id !== user.id && !showTakeOverModal) { // Show the DocumentLocked modal for the incoming user setShowLockedModal(true) } else { setShowLockedModal(false) } - }, [isDocumentLocked, initialEditor, user.id]) - - useEffect(() => { - let timeoutId - - if (isLockedByAnotherUser && documentLockStateRef.current?.user?.id !== user.id) { - timeoutId = setTimeout(() => { - setShowTakeOverModal(true) - }, 200) - } else { - clearTimeout(timeoutId) - setShowTakeOverModal(false) - } - - return () => { - if (timeoutId) clearTimeout(timeoutId) - } - }, [isLockedByAnotherUser, user.id]) + }, [isDocumentLocked, user.id]) const handleGoBack = useCallback(() => { const redirectRoute = formatAdminURL({ adminRoute, - path: collectionSlug ? `/collections/${collectionSlug}` : `/`, + path: collectionSlug ? `/collections/${collectionSlug}` : '/', }) router.push(redirectRoute) }, [adminRoute, collectionSlug, router]) @@ -216,6 +219,11 @@ export const DefaultEditView: React.FC = () => { }) } + // Unlock the document after save + if (id || globalSlug) { + void unlockDocument(id, collectionSlug ?? globalSlug) + } + if (!isEditing && depth < 2) { // Redirect to the same locale if it's been set const redirectRoute = formatAdminURL({ @@ -243,6 +251,8 @@ export const DefaultEditView: React.FC = () => { router, locale, resetUploadEdits, + unlockDocument, + globalSlug, ], ) @@ -250,24 +260,7 @@ export const DefaultEditView: React.FC = () => { async ({ formState: prevFormState }) => { const docPreferences = await getDocPreferences() - // Lock the document if it's not locked by another user and hasn't been locked by this user yet - if ((id || globalSlug) && !isLockedByAnotherUser && !isDocumentLockedRef.current) { - setShouldLockDocument(true) - } - - if ( - (id || globalSlug) && - isLockedByAnotherUser && - documentLockStateRef.current?.user?.id !== user.id - ) { - documentLockStateRef.current = { isLocked: true, user } - setIsLockedByAnotherUser(false) - - await updateDocumentEditor(id, collectionSlug ?? globalSlug, user) - } - - // Fire the request immediately with returnLockStatus: true if the document is locked - const { state } = await getFormState({ + const { lockedState, state } = await getFormState({ apiRoute, body: { id, @@ -276,12 +269,58 @@ export const DefaultEditView: React.FC = () => { formState: prevFormState, globalSlug, operation, - returnLockStatus: shouldLockDocument, + returnLockStatus: true, schemaPath, }, serverURL, }) + console.log('Locked State user email: ', lockedState?.user?.email) + console.log('Locked State user ID: ', lockedState?.user?.id) + console.log('Document Lock state ref user ID: ', documentLockStateRef.current?.user?.id) + console.log('USER ID: ', user?.id) + + const previousOwnerId = documentLockStateRef.current?.user?.id + + if (lockedState) { + if (!documentLockStateRef.current || lockedState.user.id !== previousOwnerId) { + if (previousOwnerId === user.id && lockedState.user.id !== user.id) { + console.log("Triggering the takeover modal on the previous user's screen") + setShowTakeOverModal(true) + } + + console.log('Updating Document Lock State Ref to:', lockedState.user.id) + documentLockStateRef.current = lockedState + + setCurrentEditor(lockedState.user) + + if (lockedState.user.id !== user.id) { + console.log('The document is locked by another user') + setIsLockedByAnotherUser(true) + } else { + setIsLockedByAnotherUser(false) + } + } + } + + if ( + isLockedByAnotherUser && + documentLockStateRef.current?.user?.id !== user.id && + !showTakeOverModal + ) { + console.log('Taking over the document') + documentLockStateRef.current = { isLocked: true, user } + setCurrentEditor(user) + + await updateDocumentEditor(id, collectionSlug ?? globalSlug, user) + } + + if ((id || globalSlug) && !isLockedByAnotherUser && !isDocumentLockedRef.current) { + console.log('Locking the document') + setShouldLockDocument(true) + resetLockTimer() + } + return state }, [ @@ -297,76 +336,21 @@ export const DefaultEditView: React.FC = () => { shouldLockDocument, updateDocumentEditor, user, + resetLockTimer, + documentLockStateRef, + showTakeOverModal, ], ) - const intervalRef = useRef(null) - - const checkLockStatus = useCallback(async () => { - if (!isDocumentLockedRef.current) return - - const docPreferences = await getDocPreferences() - - const { lockedState } = await getFormState({ - apiRoute, - body: { - id, - collectionSlug, - docPreferences, - formState: {}, - globalSlug, - operation, - returnLockStatus: true, - schemaPath, - }, - serverURL, - }) - - if (lockedState) { - if ( - !documentLockStateRef.current || - lockedState.user.id !== documentLockStateRef.current.user.id - ) { - documentLockStateRef.current = lockedState - - if (lockedState.user.id !== user.id) { - setIsLockedByAnotherUser(true) - } else { - setIsLockedByAnotherUser(false) - } - } - } - }, [ - apiRoute, - collectionSlug, - getDocPreferences, - globalSlug, - id, - operation, - schemaPath, - serverURL, - user.id, - ]) - useEffect(() => { if ((id || globalSlug) && shouldLockDocument && !isDocumentLockedRef.current) { const lockDoc = async () => { try { - console.log('hit') await lockDocument(id, collectionSlug ?? globalSlug, user) isDocumentLockedRef.current = true - // Immediately check the lock status after locking - await checkLockStatus() - - // Start the interval to check the lock status every 10 seconds - if (!intervalRef.current) { - intervalRef.current = setInterval(() => { - void checkLockStatus() - }, 10000) // 10 seconds - } + resetLockTimer() // Start the lock timer } catch (error) { - // eslint-disable-next-line no-console console.error('Failed to lock the document', error) } finally { setShouldLockDocument(false) @@ -375,27 +359,28 @@ export const DefaultEditView: React.FC = () => { void lockDoc() } - }, [shouldLockDocument, lockDocument, id, user, checkLockStatus, globalSlug]) + }, [shouldLockDocument, lockDocument, id, user, resetLockTimer, globalSlug]) // Clean up when the component unmounts or when the document is unlocked useEffect(() => { return () => { if ((id || globalSlug) && isDocumentLockedRef.current) { - // Only unlock the document if the current user is the one who locked it if (documentLockStateRef.current?.user?.id === user.id) { void unlockDocument(id, collectionSlug ?? globalSlug) } isDocumentLockedRef.current = false - if (intervalRef.current) { - clearInterval(intervalRef.current) - intervalRef.current = null + if (lockTimer.current) { + clearTimeout(lockTimer.current) + lockTimer.current = null } } } }, [id, unlockDocument, user.id, globalSlug]) + console.log('Current Editor: ', currentEditor) + return (
@@ -418,7 +403,7 @@ export const DefaultEditView: React.FC = () => { isActive={showLockedModal} onReadOnly={() => setIsReadOnlyForIncomingUser(true)} onTakeOver={handleTakeOver} - user={initialEditor} + user={currentEditor} /> )} {showTakeOverModal && ( @@ -450,11 +435,11 @@ export const DefaultEditView: React.FC = () => { hasSavePermission={hasSavePermission} id={id} isEditing={isEditing} - onTakeOver={handleTakeOver} + onTakeOver={() => setIsReadOnlyForIncomingUser(false)} permissions={docPermissions} readOnlyForIncomingUser={isReadOnlyForIncomingUser} slug={collectionConfig?.slug || globalConfig?.slug} - user={initialEditor} + user={currentEditor} /> (false) - const [initialEditor, setInitialEditor] = useState(null) + const [currentEditor, setCurrentEditor] = useState(null) const [lastEditedAt, setLastEditedAt] = useState(null) const lockInProgress = useRef(false) @@ -288,7 +288,7 @@ const DocumentInfo: React.FC< if (docs.length > 0) { setIsDocumentLocked(true) setLastEditedAt(new Date(docs[0]._lastEdited.editedAt)) - setInitialEditor(docs[0]._lastEdited.user.value) + setCurrentEditor(docs[0]._lastEdited.user.value) } } catch (error) { console.error('Failed to fetch lock state', error) @@ -713,6 +713,7 @@ const DocumentInfo: React.FC< const value: DocumentInfoContext = { ...props, action, + currentEditor, docConfig, docPermissions, getDocPermissions, @@ -721,7 +722,6 @@ const DocumentInfo: React.FC< hasPublishPermission, hasSavePermission, initialData: data, - initialEditor, initialState, isDocumentLocked, isInitializing, @@ -731,6 +731,7 @@ const DocumentInfo: React.FC< onSave, preferencesKey, publishedDoc, + setCurrentEditor, setDocFieldPreferences, setDocumentTitle, title: documentTitle, diff --git a/packages/ui/src/providers/DocumentInfo/types.ts b/packages/ui/src/providers/DocumentInfo/types.ts index 0d490aa1ea7..64ee2670f50 100644 --- a/packages/ui/src/providers/DocumentInfo/types.ts +++ b/packages/ui/src/providers/DocumentInfo/types.ts @@ -39,12 +39,12 @@ export type DocumentInfoProps = { } export type DocumentInfoContext = { + currentEditor?: ClientUser docConfig?: ClientCollectionConfig | ClientGlobalConfig getDocPermissions: (data?: Data) => Promise getDocPreferences: () => Promise getVersions: () => Promise initialData: Data - initialEditor: ClientUser initialState?: FormState isDocumentLocked: boolean isInitializing: boolean @@ -53,6 +53,7 @@ export type DocumentInfoContext = { lockDocument: (docId: number | string, slug: string, user: ClientUser) => Promise preferencesKey?: string publishedDoc?: { _status?: string } & TypeWithID & TypeWithTimestamps + setCurrentEditor?: React.Dispatch> setDocFieldPreferences: ( field: string, fieldPreferences: { [key: string]: unknown } & Partial, From 1fe4cfff12fa977064ab6709ebc0d3a2d52dbd3f Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 28 Aug 2024 13:27:48 -0400 Subject: [PATCH 096/173] nav icon sizing --- packages/ui/src/elements/Hamburger/index.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/ui/src/elements/Hamburger/index.scss b/packages/ui/src/elements/Hamburger/index.scss index 5ba074905b3..ec67bf9d613 100644 --- a/packages/ui/src/elements/Hamburger/index.scss +++ b/packages/ui/src/elements/Hamburger/index.scss @@ -18,6 +18,7 @@ transition-property: box-shadow, background-color; transition-duration: 100ms; transition-timing-function: cubic-bezier(0, 0.2, 0.2, 1); + --hamburger-size: var(--base); &:hover { background-color: var(--theme-elevation-100); @@ -36,5 +37,8 @@ &__close-icon { width: var(--hamburger-size); height: var(--hamburger-size); + display: flex; + align-items: center; + justify-content: center; } } From b615a29e9124ea2d4044ff3334b69653b16a0079 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 28 Aug 2024 13:39:35 -0400 Subject: [PATCH 097/173] adds test for relationship table sort --- test/joins/e2e.spec.ts | 44 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/test/joins/e2e.spec.ts b/test/joins/e2e.spec.ts index 592cf4f4ee7..7065dae3a19 100644 --- a/test/joins/e2e.spec.ts +++ b/test/joins/e2e.spec.ts @@ -83,7 +83,21 @@ test.describe('Admin Panel', () => { await expect(toggler).toBeVisible() const link = actionColumn.locator('a') await expect(link).toBeHidden() - // change column order and ensure this behavior remains on the second column + + await reorderColumns(page, { + togglerSelector: '.relationship-table__toggle-columns', + columnContainerSelector: '.relationship-table__columns', + fromColumn: 'Category', + toColumn: 'Title', + }) + + const newActionColumn = joinField.locator('tbody tr td:nth-child(2)').first() + const newToggler = newActionColumn.locator('button.doc-drawer__toggler') + await expect(newToggler).toBeVisible() + const newLink = newActionColumn.locator('a') + await expect(newLink).toBeHidden() + + // put columns back in original order for the next test await reorderColumns(page, { togglerSelector: '.relationship-table__toggle-columns', columnContainerSelector: '.relationship-table__columns', @@ -91,4 +105,32 @@ test.describe('Admin Panel', () => { toColumn: 'Category', }) }) + + test('should sort relationship table by clicking on column headers', async () => { + await navigateToDoc(page, categoriesURL) + const joinField = page.locator('.field-type.join').first() + await expect(joinField).toBeVisible() + const titleColumn = joinField.locator('thead tr th#heading-title') + const titleAscButton = titleColumn.locator('button.sort-column__asc') + await expect(titleAscButton).toBeVisible() + await titleAscButton.click() + await expect(joinField.locator('tbody tr:first-child td:nth-child(2)')).toHaveText( + 'Test Post 1', + ) + + const titleDescButton = titleColumn.locator('button.sort-column__desc') + await expect(titleDescButton).toBeVisible() + await titleDescButton.click() + await expect(joinField.locator('tbody tr:first-child td:nth-child(2)')).toHaveText( + 'Test Post 3', + ) + }) + + test.skip('should update relationship table when new document is created', async () => { + // TODO: Implement this test + }) + + test.skip('should update relationship table when document is updated', async () => { + // TODO: Implement this test + }) }) From a80112d6601bdb004a4aeca6046827c2c992755e Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 28 Aug 2024 13:57:13 -0400 Subject: [PATCH 098/173] adds more e2e tests --- test/joins/e2e.spec.ts | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/test/joins/e2e.spec.ts b/test/joins/e2e.spec.ts index 7065dae3a19..01fbb8c4676 100644 --- a/test/joins/e2e.spec.ts +++ b/test/joins/e2e.spec.ts @@ -126,11 +126,40 @@ test.describe('Admin Panel', () => { ) }) - test.skip('should update relationship table when new document is created', async () => { - // TODO: Implement this test + test('should update relationship table when new document is created', async () => { + await navigateToDoc(page, categoriesURL) + const joinField = page.locator('.field-type.join').first() + await expect(joinField).toBeVisible() + const addButton = joinField.locator('button.doc-drawer__toggler') + await addButton.click() + const drawer = page.locator('[id^=doc-drawer_posts_1_]') + await expect(drawer).toBeVisible() + const categoryField = drawer.locator('#field-category') + await expect(categoryField).toBeVisible() + await expect(categoryField).toHaveText('Category') + const titleField = drawer.locator('#field-title') + await expect(titleField).toBeVisible() + await titleField.fill('Test Post 4') + await drawer.locator('button[id="action-save"]').click() + await expect(drawer).toBeHidden() + await expect(joinField.locator('tbody tr:last-child td:nth-child(2)')).toHaveText('Test Post 4') }) test.skip('should update relationship table when document is updated', async () => { - // TODO: Implement this test + await navigateToDoc(page, categoriesURL) + const joinField = page.locator('.field-type.join').first() + await expect(joinField).toBeVisible() + const editButton = joinField.locator('tbody tr:first-child td:nth-child(3) button') + await editButton.click() + const drawer = page.locator('[id^=doc-drawer_posts_1_]') + await expect(drawer).toBeVisible() + const titleField = drawer.locator('#field-title') + await expect(titleField).toBeVisible() + await titleField.fill('Test Post 1 Updated') + await drawer.locator('button[id="action-save"]').click() + await expect(drawer).toBeHidden() + await expect(joinField.locator('tbody tr:first-child td:nth-child(2)')).toHaveText( + 'Test Post 1 Updated', + ) }) }) From f2fc0d907a36de487d9c4416c32be8737029c6e2 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 28 Aug 2024 15:07:02 -0400 Subject: [PATCH 099/173] chore(db-mongodb): fix sanitizeQueryValue of array of ids --- .../src/queries/sanitizeQueryValue.ts | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts index 1685cf2672f..9af7643a55a 100644 --- a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts +++ b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts @@ -29,23 +29,39 @@ export const sanitizeQueryValue = ({ let formattedOperator = operator // Disregard invalid _ids - if (path === '_id' && typeof val === 'string' && val.split(',').length === 1) { - if (!hasCustomID) { - const isValid = mongoose.Types.ObjectId.isValid(val) - - if (!isValid) { - return { operator: formattedOperator, val: undefined } - } else { - formattedValue = ObjectId(val) + if (path === '_id') { + if (typeof val === 'string' && val.split(',').length === 1) { + if (!hasCustomID) { + const isValid = mongoose.Types.ObjectId.isValid(val) + + if (!isValid) { + return { operator: formattedOperator, val: undefined } + } else { + formattedValue = ObjectId(val) + } } - } - if (field.type === 'number') { - const parsedNumber = parseFloat(val) + if (field.type === 'number') { + const parsedNumber = parseFloat(val) - if (Number.isNaN(parsedNumber)) { - return { operator: formattedOperator, val: undefined } + if (Number.isNaN(parsedNumber)) { + return { operator: formattedOperator, val: undefined } + } } + } else if (Array.isArray(val)) { + formattedValue = formattedValue.reduce((formattedValues, inVal) => { + const newValues = [inVal] + if (!hasCustomID) { + if (mongoose.Types.ObjectId.isValid(inVal)) newValues.push(ObjectId(inVal)) + } + + if (field.type === 'number') { + const parsedNumber = parseFloat(inVal) + if (!Number.isNaN(parsedNumber)) newValues.push(parsedNumber) + } + + return [...formattedValues, ...newValues] + }, []) } } @@ -97,11 +113,10 @@ export const sanitizeQueryValue = ({ } } - if (operator === 'in' && Array.isArray(formattedValue)) { + if (['in', 'not_in'].includes(operator) && Array.isArray(formattedValue)) { formattedValue = formattedValue.reduce((formattedValues, inVal) => { const newValues = [inVal] - if (mongoose.Types.ObjectId.isValid(inVal)) - newValues.push(new mongoose.Types.ObjectId(inVal)) + if (mongoose.Types.ObjectId.isValid(inVal)) newValues.push(ObjectId(inVal)) const parsedNumber = parseFloat(inVal) if (!Number.isNaN(parsedNumber)) newValues.push(parsedNumber) From b2e9db1c8dc24dc3ca03955f9f8b00224934efed Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 28 Aug 2024 16:24:22 -0400 Subject: [PATCH 100/173] chore: update join names int test --- test/joins/int.spec.ts | 46 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index feb6ce96869..7789d1d9c23 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -66,24 +66,24 @@ describe('Joins Field Tests', () => { const categoryWithPosts = await payload.findByID({ id: category.id, joins: { - 'group.posts': { + 'group.relatedPosts': { sort: '-title', }, }, collection: 'categories', }) - expect(categoryWithPosts.group.posts.docs).toHaveLength(10) - expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('id') - expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('title') - expect(categoryWithPosts.group.posts.docs[0].title).toStrictEqual('test 9') + expect(categoryWithPosts.group.relatedPosts.docs).toHaveLength(10) + expect(categoryWithPosts.group.relatedPosts.docs[0]).toHaveProperty('id') + expect(categoryWithPosts.group.relatedPosts.docs[0]).toHaveProperty('title') + expect(categoryWithPosts.group.relatedPosts.docs[0].title).toStrictEqual('test 9') }) it('should filter joins using where query', async () => { const categoryWithPosts = await payload.findByID({ id: category.id, joins: { - posts: { + relatedPosts: { sort: '-title', where: { title: { @@ -95,8 +95,8 @@ describe('Joins Field Tests', () => { collection: 'categories', }) - expect(categoryWithPosts.posts.docs).toHaveLength(1) - expect(categoryWithPosts.posts.hasNextPage).toStrictEqual(false) + expect(categoryWithPosts.relatedPosts.docs).toHaveLength(1) + expect(categoryWithPosts.relatedPosts.hasNextPage).toStrictEqual(false) }) it('should populate joins using find', async () => { @@ -106,9 +106,9 @@ describe('Joins Field Tests', () => { const [categoryWithPosts] = result.docs - expect(categoryWithPosts.group.posts.docs).toHaveLength(10) - expect(categoryWithPosts.group.posts.docs[0]).toHaveProperty('title') - expect(categoryWithPosts.group.posts.docs[0].title).toBe('test 14') + expect(categoryWithPosts.group.relatedPosts.docs).toHaveLength(10) + expect(categoryWithPosts.group.relatedPosts.docs[0]).toHaveProperty('title') + expect(categoryWithPosts.group.relatedPosts.docs[0].title).toBe('test 14') }) describe('Joins with localization', () => { @@ -160,8 +160,8 @@ describe('Joins Field Tests', () => { collection: 'localized-categories', locale: 'es', }) - expect(enCategory.posts.docs).toHaveLength(2) - expect(esCategory.posts.docs).toHaveLength(1) + expect(enCategory.relatedPosts.docs).toHaveLength(2) + expect(esCategory.relatedPosts.docs).toHaveLength(1) }) }) @@ -173,7 +173,7 @@ describe('Joins Field Tests', () => { name: { equals: 'paginate example' }, }, joins: { - posts: { + relatedPosts: { sort: 'createdAt', limit: 4, }, @@ -181,22 +181,22 @@ describe('Joins Field Tests', () => { } const pageWithLimit = await restClient.GET(`/categories`, { query }).then((res) => res.json()) - query.joins.posts.limit = 0 + query.joins.relatedPosts.limit = 0 const unlimited = await restClient.GET(`/categories`, { query }).then((res) => res.json()) - expect(pageWithLimit.docs[0].posts.docs).toHaveLength(4) - expect(pageWithLimit.docs[0].posts.docs[0].title).toStrictEqual('test 0') - expect(pageWithLimit.docs[0].posts.hasNextPage).toStrictEqual(true) + expect(pageWithLimit.docs[0].relatedPosts.docs).toHaveLength(4) + expect(pageWithLimit.docs[0].relatedPosts.docs[0].title).toStrictEqual('test 0') + expect(pageWithLimit.docs[0].relatedPosts.hasNextPage).toStrictEqual(true) - expect(unlimited.docs[0].posts.docs).toHaveLength(15) - expect(unlimited.docs[0].posts.docs[0].title).toStrictEqual('test 0') - expect(unlimited.docs[0].posts.hasNextPage).toStrictEqual(false) + expect(unlimited.docs[0].relatedPosts.docs).toHaveLength(15) + expect(unlimited.docs[0].relatedPosts.docs[0].title).toStrictEqual('test 0') + expect(unlimited.docs[0].relatedPosts.hasNextPage).toStrictEqual(false) }) it('should sort joins', async () => { const response = await restClient - .GET(`/categories/${category.id}?joins[posts][sort]=-title`) + .GET(`/categories/${category.id}?joins[relatedPosts][sort]=-title`) .then((res) => res.json()) - expect(response.posts.docs[0].title).toStrictEqual('test 9') + expect(response.relatedPosts.docs[0].title).toStrictEqual('test 9') }) }) }) From 1aee03525f8ddb680916a98dcc479fdb56be225b Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 28 Aug 2024 16:39:03 -0400 Subject: [PATCH 101/173] chore: fix sanitizeQueryValue to handle arrays of ids --- .../src/queries/sanitizeQueryValue.ts | 8 +++- test/joins/int.spec.ts | 19 ++++++++ test/joins/payload-types.ts | 45 ++++++++++++------- 3 files changed, 54 insertions(+), 18 deletions(-) diff --git a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts index 9af7643a55a..d0442f0092f 100644 --- a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts +++ b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts @@ -37,7 +37,13 @@ export const sanitizeQueryValue = ({ if (!isValid) { return { operator: formattedOperator, val: undefined } } else { - formattedValue = ObjectId(val) + if (['in', 'not_in'].includes(operator)) { + formattedValue = createArrayFromCommaDelineated(formattedValue).map((id) => + ObjectId(id), + ) + } else { + formattedValue = ObjectId(val) + } } } diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index 7789d1d9c23..c59e93a1aac 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -79,6 +79,17 @@ describe('Joins Field Tests', () => { expect(categoryWithPosts.group.relatedPosts.docs[0].title).toStrictEqual('test 9') }) + it('should populate relationships in joins', async () => { + const { docs } = await payload.find({ + limit: 1, + collection: 'posts', + }) + + expect(docs[0].category.id).toBeDefined() + expect(docs[0].category.name).toBeDefined() + expect(docs[0].category.relatedPosts.docs).toHaveLength(10) + }) + it('should filter joins using where query', async () => { const categoryWithPosts = await payload.findByID({ id: category.id, @@ -192,12 +203,20 @@ describe('Joins Field Tests', () => { expect(unlimited.docs[0].relatedPosts.docs[0].title).toStrictEqual('test 0') expect(unlimited.docs[0].relatedPosts.hasNextPage).toStrictEqual(false) }) + it('should sort joins', async () => { const response = await restClient .GET(`/categories/${category.id}?joins[relatedPosts][sort]=-title`) .then((res) => res.json()) expect(response.relatedPosts.docs[0].title).toStrictEqual('test 9') }) + + it('should query in on collections with joins', async () => { + const response = await restClient + .GET(`/categories?where[id][in]=${category.id}`) + .then((res) => res.json()) + expect(response.docs[0].name).toStrictEqual(category.name) + }) }) }) diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 9099e3e9ac6..a20e50000bf 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -11,6 +11,7 @@ export interface Config { users: UserAuthOperations; }; collections: { + relation: Relation; posts: Post; categories: Category; 'localized-posts': LocalizedPost; @@ -46,6 +47,33 @@ export interface UserAuthOperations { password: string; }; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "relation". + */ +export interface Relation { + id: string; + related?: (string | null) | User; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users". + */ +export interface User { + id: string; + updatedAt: string; + createdAt: string; + email: string; + resetPasswordToken?: string | null; + resetPasswordExpiration?: string | null; + salt?: string | null; + hash?: string | null; + loginAttempts?: number | null; + lockUntil?: string | null; + password?: string | null; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "posts". @@ -105,23 +133,6 @@ export interface LocalizedCategory { updatedAt: string; createdAt: string; } -/** - * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "users". - */ -export interface User { - id: string; - updatedAt: string; - createdAt: string; - email: string; - resetPasswordToken?: string | null; - resetPasswordExpiration?: string | null; - salt?: string | null; - hash?: string | null; - loginAttempts?: number | null; - lockUntil?: string | null; - password?: string | null; -} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-preferences". From f93b5e544f23358b38c6e755767f402d8dc10ae6 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 28 Aug 2024 17:39:06 -0400 Subject: [PATCH 102/173] fixes query when creating new and adjusts tests --- .../src/elements/RelationshipTable/index.tsx | 10 ++++- packages/ui/src/fields/Join/index.tsx | 21 +++++---- test/databaseAdapter.ts | 20 +++++---- test/helpers/e2e/reorderColumns.ts | 6 ++- test/joins/e2e.spec.ts | 17 ++++++- test/joins/payload-types.ts | 45 +++++++------------ 6 files changed, 70 insertions(+), 49 deletions(-) diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 7e21fd39f88..f64785b319a 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -8,7 +8,7 @@ import type { Where, } from 'payload' -import React, { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useEffect, useRef, useState } from 'react' import AnimateHeightImport from 'react-animate-height' const AnimateHeight = AnimateHeightImport.default || AnimateHeightImport @@ -66,6 +66,7 @@ export const RelationshipTable: React.FC = (pro const [where, setWhere] = useState(null) const [search, setSearch] = useState('') const [openColumnSelector, setOpenColumnSelector] = useState(false) + const hasInitialized = useRef(false) const collectionConfig = getEntityConfig({ collectionSlug: relationTo }) as ClientCollectionConfig @@ -79,6 +80,11 @@ export const RelationshipTable: React.FC = (pro }) useEffect(() => { + if (initialData !== undefined && !hasInitialized.current) { + hasInitialized.current = true + return + } + const { admin: { listSearchableFields, useAsTitle } = {} as ClientCollectionConfig['admin'], versions, @@ -128,7 +134,7 @@ export const RelationshipTable: React.FC = (pro if (versions?.drafts) params.draft = 'true' setParams(params) - }, [page, sort, where, search, collectionConfig, setParams, limit, filterOptions]) + }, [page, sort, where, search, collectionConfig, setParams, limit, filterOptions, initialData]) const [DocumentDrawer, DocumentDrawerToggler, { closeDrawer }] = useDocumentDrawer({ collectionSlug: relationTo, diff --git a/packages/ui/src/fields/Join/index.tsx b/packages/ui/src/fields/Join/index.tsx index 6ddf79403f5..e7d08a8a343 100644 --- a/packages/ui/src/fields/Join/index.tsx +++ b/packages/ui/src/fields/Join/index.tsx @@ -1,8 +1,8 @@ 'use client' -import type { JoinFieldProps, PaginatedDocs } from 'payload' +import type { JoinFieldProps, PaginatedDocs, Where } from 'payload' -import React from 'react' +import React, { useMemo } from 'react' import { RelationshipTable } from '../../elements/RelationshipTable/index.js' import { FieldLabel } from '../../fields/FieldLabel/index.js' @@ -35,6 +35,15 @@ const JoinFieldComponent: React.FC = (props) => { path: pathFromContext ?? pathFromProps ?? name, }) + const filterOptions: Where = useMemo( + () => ({ + [on]: { + in: [docID || null], + }, + }), + [docID, on], + ) + return (
= (props) => { } field={field} - filterOptions={{ - [on]: { - in: [docID], - }, - }} - initialData={value} + filterOptions={filterOptions} + initialData={docID && value ? value : ({ docs: [] } as PaginatedDocs)} relationTo={collection} />
diff --git a/test/databaseAdapter.ts b/test/databaseAdapter.ts index e1073b34c17..9e10c2d80cd 100644 --- a/test/databaseAdapter.ts +++ b/test/databaseAdapter.ts @@ -1,10 +1,14 @@ -// DO NOT MODIFY. This file is automatically generated in initDevAndTest.ts -import { mongooseAdapter } from '@payloadcms/db-mongodb' + // DO NOT MODIFY. This file is automatically generated in initDevAndTest.ts -export const databaseAdapter = mongooseAdapter({ - url: 'mongodb://127.0.0.1/payloadtests', - collation: { - strength: 1, - }, -}) + + import { mongooseAdapter } from '@payloadcms/db-mongodb' + + export const databaseAdapter = mongooseAdapter({ + url: + 'mongodb://127.0.0.1/payloadtests', + collation: { + strength: 1, + }, + }) + \ No newline at end of file diff --git a/test/helpers/e2e/reorderColumns.ts b/test/helpers/e2e/reorderColumns.ts index 55f23358908..2dfff2e45fc 100644 --- a/test/helpers/e2e/reorderColumns.ts +++ b/test/helpers/e2e/reorderColumns.ts @@ -19,8 +19,12 @@ export const reorderColumns = async ( togglerSelector?: string }, ) => { - await page.locator(togglerSelector).first().click() const columnContainer = page.locator(columnContainerSelector).first() + const isAlreadyOpen = await columnContainer.isVisible() + + if (!isAlreadyOpen) { + await page.locator(togglerSelector).first().click() + } await expect(page.locator(`${columnContainerSelector}.rah-static--height-auto`)).toBeVisible() diff --git a/test/joins/e2e.spec.ts b/test/joins/e2e.spec.ts index 01fbb8c4676..66f47001f03 100644 --- a/test/joins/e2e.spec.ts +++ b/test/joins/e2e.spec.ts @@ -130,7 +130,13 @@ test.describe('Admin Panel', () => { await navigateToDoc(page, categoriesURL) const joinField = page.locator('.field-type.join').first() await expect(joinField).toBeVisible() - const addButton = joinField.locator('button.doc-drawer__toggler') + + const addButton = joinField.locator('.relationship-table__actions button.doc-drawer__toggler', { + hasText: exactText('Add new'), + }) + + await expect(addButton).toBeVisible() + await addButton.click() const drawer = page.locator('[id^=doc-drawer_posts_1_]') await expect(drawer).toBeVisible() @@ -145,7 +151,7 @@ test.describe('Admin Panel', () => { await expect(joinField.locator('tbody tr:last-child td:nth-child(2)')).toHaveText('Test Post 4') }) - test.skip('should update relationship table when document is updated', async () => { + test('should update relationship table when document is updated', async () => { await navigateToDoc(page, categoriesURL) const joinField = page.locator('.field-type.join').first() await expect(joinField).toBeVisible() @@ -162,4 +168,11 @@ test.describe('Admin Panel', () => { 'Test Post 1 Updated', ) }) + + test('ensures relationship table empty when creating new document', async () => { + await navigateToDoc(page, categoriesURL) + const joinField = page.locator('.field-type.join').first() + await expect(joinField).toBeVisible() + await expect(joinField.locator('.relationship-table tbody tr')).toBeHidden() + }) }) diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index a20e50000bf..9099e3e9ac6 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -11,7 +11,6 @@ export interface Config { users: UserAuthOperations; }; collections: { - relation: Relation; posts: Post; categories: Category; 'localized-posts': LocalizedPost; @@ -47,33 +46,6 @@ export interface UserAuthOperations { password: string; }; } -/** - * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "relation". - */ -export interface Relation { - id: string; - related?: (string | null) | User; - updatedAt: string; - createdAt: string; -} -/** - * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "users". - */ -export interface User { - id: string; - updatedAt: string; - createdAt: string; - email: string; - resetPasswordToken?: string | null; - resetPasswordExpiration?: string | null; - salt?: string | null; - hash?: string | null; - loginAttempts?: number | null; - lockUntil?: string | null; - password?: string | null; -} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "posts". @@ -133,6 +105,23 @@ export interface LocalizedCategory { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users". + */ +export interface User { + id: string; + updatedAt: string; + createdAt: string; + email: string; + resetPasswordToken?: string | null; + resetPasswordExpiration?: string | null; + salt?: string | null; + hash?: string | null; + loginAttempts?: number | null; + lockUntil?: string | null; + password?: string | null; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-preferences". From 543cbc45799853023df8ef38ee0c0ade73c23b16 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 28 Aug 2024 18:19:15 -0400 Subject: [PATCH 103/173] adjusts e2e tests --- test/joins/e2e.spec.ts | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/test/joins/e2e.spec.ts b/test/joins/e2e.spec.ts index 66f47001f03..6e127743c74 100644 --- a/test/joins/e2e.spec.ts +++ b/test/joins/e2e.spec.ts @@ -33,7 +33,7 @@ test.describe('Admin Panel', () => { await ensureCompilationIsDone({ page, serverURL }) }) - test('populates joined relationships in table cells of list view', async () => { + test('should populate joined relationships in table cells of list view', async () => { await page.goto(categoriesURL.list) await expect .poll( @@ -142,20 +142,28 @@ test.describe('Admin Panel', () => { await expect(drawer).toBeVisible() const categoryField = drawer.locator('#field-category') await expect(categoryField).toBeVisible() - await expect(categoryField).toHaveText('Category') + const categoryValue = categoryField.locator('.relationship--single-value__text') + await expect(categoryValue).toHaveText('example') const titleField = drawer.locator('#field-title') await expect(titleField).toBeVisible() await titleField.fill('Test Post 4') await drawer.locator('button[id="action-save"]').click() await expect(drawer).toBeHidden() - await expect(joinField.locator('tbody tr:last-child td:nth-child(2)')).toHaveText('Test Post 4') + await expect( + joinField.locator('tbody tr td:nth-child(2)', { + hasText: exactText('Test Post 4'), + }), + ).toBeVisible() }) test('should update relationship table when document is updated', async () => { await navigateToDoc(page, categoriesURL) const joinField = page.locator('.field-type.join').first() await expect(joinField).toBeVisible() - const editButton = joinField.locator('tbody tr:first-child td:nth-child(3) button') + const editButton = joinField.locator( + 'tbody tr:first-child td:nth-child(2) button.doc-drawer__toggler', + ) + await expect(editButton).toBeVisible() await editButton.click() const drawer = page.locator('[id^=doc-drawer_posts_1_]') await expect(drawer).toBeVisible() @@ -169,8 +177,8 @@ test.describe('Admin Panel', () => { ) }) - test('ensures relationship table empty when creating new document', async () => { - await navigateToDoc(page, categoriesURL) + test('should render empty relationship table when creating new document', async () => { + await page.goto(categoriesURL.create) const joinField = page.locator('.field-type.join').first() await expect(joinField).toBeVisible() await expect(joinField.locator('.relationship-table tbody tr')).toBeHidden() From 3fe58f660d82b90eb7143e2ba4c7b43da089f63d Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 29 Aug 2024 00:34:30 -0400 Subject: [PATCH 104/173] feat: more translations & updates to effects --- .../src/elements/DocumentTakeOver/index.tsx | 1 + .../next/src/views/Edit/Default/index.tsx | 28 ++++++++++++++----- packages/translations/src/clientKeys.ts | 1 + packages/translations/src/languages/ar.ts | 1 + packages/translations/src/languages/az.ts | 1 + packages/translations/src/languages/bg.ts | 1 + packages/translations/src/languages/cs.ts | 1 + packages/translations/src/languages/de.ts | 1 + packages/translations/src/languages/en.ts | 1 + packages/translations/src/languages/es.ts | 1 + packages/translations/src/languages/fa.ts | 1 + packages/translations/src/languages/fr.ts | 1 + packages/translations/src/languages/he.ts | 1 + packages/translations/src/languages/hr.ts | 1 + packages/translations/src/languages/hu.ts | 1 + packages/translations/src/languages/it.ts | 2 ++ packages/translations/src/languages/ja.ts | 1 + packages/translations/src/languages/ko.ts | 1 + packages/translations/src/languages/my.ts | 1 + packages/translations/src/languages/nb.ts | 1 + packages/translations/src/languages/nl.ts | 1 + packages/translations/src/languages/pl.ts | 1 + packages/translations/src/languages/pt.ts | 1 + packages/translations/src/languages/ro.ts | 1 + packages/translations/src/languages/rs.ts | 1 + .../translations/src/languages/rsLatin.ts | 1 + packages/translations/src/languages/ru.ts | 1 + packages/translations/src/languages/sk.ts | 1 + packages/translations/src/languages/sv.ts | 1 + packages/translations/src/languages/th.ts | 1 + packages/translations/src/languages/tr.ts | 1 + packages/translations/src/languages/uk.ts | 1 + packages/translations/src/languages/vi.ts | 1 + packages/translations/src/languages/zh.ts | 1 + packages/translations/src/languages/zhTw.ts | 1 + .../ui/src/providers/DocumentInfo/index.tsx | 23 +++++++-------- 36 files changed, 68 insertions(+), 18 deletions(-) diff --git a/packages/next/src/elements/DocumentTakeOver/index.tsx b/packages/next/src/elements/DocumentTakeOver/index.tsx index 3e8b3c550c2..a7fe6c4f2bc 100644 --- a/packages/next/src/elements/DocumentTakeOver/index.tsx +++ b/packages/next/src/elements/DocumentTakeOver/index.tsx @@ -26,6 +26,7 @@ export const DocumentTakeOver: React.FC<{

{t('general:editingTakenOver')}

+

{t('general:anotherUserTakenOver')}

diff --git a/packages/ui/src/elements/Table/index.tsx b/packages/ui/src/elements/Table/index.tsx index eb7fd0e7d77..0ac7187d87f 100644 --- a/packages/ui/src/elements/Table/index.tsx +++ b/packages/ui/src/elements/Table/index.tsx @@ -72,7 +72,7 @@ export const Table: React.FC = ({ return ( Date: Thu, 29 Aug 2024 13:25:03 -0400 Subject: [PATCH 108/173] uses deepmergesimple --- packages/ui/package.json | 1 - packages/ui/src/elements/Table/RenderCell.tsx | 4 +- packages/ui/src/utilities/deepMerge.ts | 25 +++++++++ pnpm-lock.yaml | 53 ++++++++++++++----- 4 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 packages/ui/src/utilities/deepMerge.ts diff --git a/packages/ui/package.json b/packages/ui/package.json index 6a0080f8a98..293e82c90d1 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -82,7 +82,6 @@ "body-scroll-lock": "4.0.0-beta.0", "bson-objectid": "2.0.4", "date-fns": "3.3.1", - "deepmerge": "4.3.1", "dequal": "2.0.3", "md5": "2.3.0", "object-to-formdata": "4.5.1", diff --git a/packages/ui/src/elements/Table/RenderCell.tsx b/packages/ui/src/elements/Table/RenderCell.tsx index 6f0f9249834..6fd10afe2e4 100644 --- a/packages/ui/src/elements/Table/RenderCell.tsx +++ b/packages/ui/src/elements/Table/RenderCell.tsx @@ -1,11 +1,11 @@ import type { CellComponentProps } from 'payload' -import deepMerge from 'deepmerge' import React, { useMemo } from 'react' import type { Column } from './index.js' import { RenderComponent } from '../../providers/Config/RenderComponent.js' +import { deepMergeSimple } from '../../utilities/deepMerge.js' import { TableCellProvider } from './TableCellProvider/index.js' export const RenderCell: React.FC<{ @@ -18,7 +18,7 @@ export const RenderCell: React.FC<{ const { cellProps: cellPropsFromProps, col, colIndex, customCellContext, row } = props const cellProps: Partial = useMemo( - () => deepMerge(col?.cellProps || {}, cellPropsFromProps || {}) as Partial, + () => deepMergeSimple(col?.cellProps || {}, cellPropsFromProps || {}), [cellPropsFromProps, col.cellProps], ) diff --git a/packages/ui/src/utilities/deepMerge.ts b/packages/ui/src/utilities/deepMerge.ts new file mode 100644 index 00000000000..6de2acfdbd4 --- /dev/null +++ b/packages/ui/src/utilities/deepMerge.ts @@ -0,0 +1,25 @@ +/** + * Very simple, but fast deepMerge implementation. Only deepMerges objects, not arrays and clones everything. + * Do not use this if your object contains any complex objects like React Components, or if you would like to combine Arrays. + * If you only have simple objects and need a fast deepMerge, this is the function for you. + * + * obj2 takes precedence over obj1 - thus if obj2 has a key that obj1 also has, obj2's value will be used. + * + * @param obj1 base object + * @param obj2 object to merge "into" obj1 + */ +export function deepMergeSimple(obj1: object, obj2: object): T { + const output = { ...obj1 } + + for (const key in obj2) { + if (Object.prototype.hasOwnProperty.call(obj2, key)) { + if (typeof obj2[key] === 'object' && !Array.isArray(obj2[key]) && obj1[key]) { + output[key] = deepMergeSimple(obj1[key], obj2[key]) + } else { + output[key] = obj2[key] + } + } + } + + return output as T +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cec89062fab..54de567646d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -143,7 +143,7 @@ importers: version: 9.4.1(@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))) next: specifier: 15.0.0-canary.104 - version: 15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + version: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) open: specifier: ^10.1.0 version: 10.1.0 @@ -963,7 +963,7 @@ importers: version: link:../payload ts-jest: specifier: ^29.1.0 - version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.19.12)(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) + version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) packages/plugin-cloud-storage: dependencies: @@ -1147,7 +1147,7 @@ importers: version: link:../payload ts-jest: specifier: ^29.1.0 - version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.19.12)(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) + version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) packages/plugin-seo: dependencies: @@ -1460,7 +1460,7 @@ importers: version: link:../plugin-cloud-storage uploadthing: specifier: ^6.10.1 - version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) + version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) devDependencies: payload: specifier: workspace:* @@ -1539,9 +1539,6 @@ importers: date-fns: specifier: 3.3.1 version: 3.3.1 - deepmerge: - specifier: 4.3.1 - version: 4.3.1 dequal: specifier: 2.0.3 version: 2.0.3 @@ -1791,7 +1788,7 @@ importers: version: 0.17.0 next: specifier: 15.0.0-canary.104 - version: 15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + version: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) payload: specifier: workspace:* version: link:../packages/payload @@ -1821,7 +1818,7 @@ importers: version: 5.5.4 uploadthing: specifier: ^6.10.1 - version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) + version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) uuid: specifier: 10.0.0 version: 10.0.0 @@ -7181,7 +7178,6 @@ packages: libsql@0.3.19: resolution: {integrity: sha512-Aj5cQ5uk/6fHdmeW0TiXK42FqUlwx7ytmMLPSaUQPin5HKKKuUPD62MAbN4OEweGBBI7q1BekoEN4gPUEL6MZA==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lie@3.1.1: @@ -16744,6 +16740,36 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4): + dependencies: + '@next/env': 15.0.0-canary.104 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.12 + busboy: 1.6.0 + caniuse-lite: 1.0.30001651 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + styled-jsx: 5.1.6(@babel/core@7.25.2)(babel-plugin-macros@3.1.0)(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.0-canary.104 + '@next/swc-darwin-x64': 15.0.0-canary.104 + '@next/swc-linux-arm64-gnu': 15.0.0-canary.104 + '@next/swc-linux-arm64-musl': 15.0.0-canary.104 + '@next/swc-linux-x64-gnu': 15.0.0-canary.104 + '@next/swc-linux-x64-musl': 15.0.0-canary.104 + '@next/swc-win32-arm64-msvc': 15.0.0-canary.104 + '@next/swc-win32-ia32-msvc': 15.0.0-canary.104 + '@next/swc-win32-x64-msvc': 15.0.0-canary.104 + '@playwright/test': 1.46.0 + babel-plugin-react-compiler: 0.0.0-experimental-48eb8f4-20240822 + sass: 1.77.4 + sharp: 0.33.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nice-napi@1.0.2: dependencies: node-addon-api: 3.2.1 @@ -18321,7 +18347,7 @@ snapshots: dependencies: typescript: 5.5.4 - ts-jest@29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.19.12)(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4): + ts-jest@29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -18339,7 +18365,6 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - esbuild: 0.19.12 tslib@1.14.1: {} @@ -18505,7 +18530,7 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 - uploadthing@6.13.2(express@4.19.2)(next@15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)): + uploadthing@6.13.2(express@4.19.2)(next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)): dependencies: '@effect/schema': 0.68.12(effect@3.4.5) '@uploadthing/mime-types': 0.2.10 @@ -18515,7 +18540,7 @@ snapshots: std-env: 3.7.0 optionalDependencies: express: 4.19.2 - next: 15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + next: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) uri-js@4.4.1: dependencies: From 6fc89e8eac848ac416e1026b7013120b41e03525 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 29 Aug 2024 14:06:34 -0400 Subject: [PATCH 109/173] feat: locking and updating functionality & adds proper reset timer --- .../next/src/views/Edit/Default/index.tsx | 177 +++++++++++++----- .../ui/src/providers/DocumentInfo/index.tsx | 4 + 2 files changed, 133 insertions(+), 48 deletions(-) diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index 1435fed1a9b..d2f582db402 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -138,6 +138,7 @@ export const DefaultEditView: React.FC = () => { }) const lockTimer = useRef(null) + const isManualUnlockRef = useRef(false) const resetLockTimer = useCallback(() => { if (lockTimer.current) { @@ -151,23 +152,111 @@ export const DefaultEditView: React.FC = () => { lockTimer.current = setTimeout(() => { if (id || globalSlug) { - void unlockDocument(id, collectionSlug ?? globalSlug) + // Check if this user is still the current editor + if (documentLockStateRef.current?.user.id !== user.id) { + return // Stop execution if the user is no longer the owner + } + + try { + void unlockDocument(id, collectionSlug ?? globalSlug) + + // Reset the locked state + isDocumentLockedRef.current = false + documentLockStateRef.current = null + setCurrentEditor(null) + + // Set manual unlock flag to prevent immediate relock + isManualUnlockRef.current = true + } catch (error) { + // eslint-disable-next-line no-console + console.error('Failed to unlock the document', error) + } } }, duration * 1000) - }, [lockWhenEditingProp, id, globalSlug, collectionSlug, unlockDocument]) + }, [ + lockWhenEditingProp, + id, + globalSlug, + collectionSlug, + unlockDocument, + setCurrentEditor, + user.id, + ]) - // Closes Document Locked modal upon take over const handleTakeOver = useCallback(() => { - setShowLockedModal(false) - setIsLockedByAnotherUser(false) - setShowTakeOverModal(false) - }, []) + // Invalidate the previous user's timer + if (lockTimer.current) { + clearTimeout(lockTimer.current) + } + + try { + // Call updateDocumentEditor to update the document's owner to the current user + void updateDocumentEditor(id, collectionSlug ?? globalSlug, user) + + // Update the locked state to reflect the current user as the owner + documentLockStateRef.current = { isLocked: true, user } + setCurrentEditor(user) + setIsLockedByAnotherUser(false) + + // Reset the lock timer after takeover + resetLockTimer() + + // Close modals if any were open + setShowLockedModal(false) + setShowTakeOverModal(false) + } catch (error) { + // eslint-disable-next-line no-console + console.error('Error during document takeover:', error) + } + }, [ + updateDocumentEditor, + id, + collectionSlug, + globalSlug, + user, + setCurrentEditor, + setIsLockedByAnotherUser, + resetLockTimer, + ]) const handleTakeOverWithinDoc = useCallback(() => { - setShowLockedModal(false) - setShowTakeOverModal(false) - setIsReadOnlyForIncomingUser(false) - }, []) + // Invalidate the previous user's timer + if (lockTimer.current) { + clearTimeout(lockTimer.current) + } + + try { + // Call updateDocumentEditor to update the document's owner to the current user + void updateDocumentEditor(id, collectionSlug ?? globalSlug, user) + + // Update the locked state to reflect the current user as the owner + documentLockStateRef.current = { isLocked: true, user } + setCurrentEditor(user) + setIsLockedByAnotherUser(false) + + // Reset the lock timer after takeover + resetLockTimer() + + // Ensure the document is editable for the incoming user + setIsReadOnlyForIncomingUser(false) + + // Close modals if any were open + setShowLockedModal(false) + setShowTakeOverModal(false) + } catch (error) { + // eslint-disable-next-line no-console + console.error('Error during document takeover:', error) + } + }, [ + updateDocumentEditor, + id, + collectionSlug, + globalSlug, + user, + setCurrentEditor, + setIsLockedByAnotherUser, + resetLockTimer, + ]) useEffect(() => { if (documentLockStateRef.current && documentLockStateRef.current.user.id !== user.id) { @@ -199,6 +288,13 @@ export const DefaultEditView: React.FC = () => { adminRoute, path: '/', }) + + // Clear the lock timer if they are still running + if (lockTimer.current) { + clearTimeout(lockTimer.current) + lockTimer.current = null + } + router.push(redirectRoute) }, [adminRoute, router]) @@ -264,6 +360,12 @@ export const DefaultEditView: React.FC = () => { const onChange: FormProps['onChange'][0] = useCallback( async ({ formState: prevFormState }) => { + // If the document was manually unlocked, skip further processing + if (isManualUnlockRef.current) { + isManualUnlockRef.current = false + return prevFormState // Return the previous form state unchanged + } + const docPreferences = await getDocPreferences() const { lockedState, state } = await getFormState({ @@ -281,27 +383,18 @@ export const DefaultEditView: React.FC = () => { serverURL, }) - console.log('Locked State user email: ', lockedState?.user?.email) - console.log('Locked State user ID: ', lockedState?.user?.id) - console.log('Document Lock state ref user ID: ', documentLockStateRef.current?.user?.id) - console.log('USER ID: ', user?.id) - const previousOwnerId = documentLockStateRef.current?.user?.id if (lockedState) { if (!documentLockStateRef.current || lockedState.user.id !== previousOwnerId) { if (previousOwnerId === user.id && lockedState.user.id !== user.id) { - console.log("Triggering the takeover modal on the previous user's screen") setShowTakeOverModal(true) } - console.log('Updating Document Lock State Ref to:', lockedState.user.id) documentLockStateRef.current = lockedState - setCurrentEditor(lockedState.user) if (lockedState.user.id !== user.id) { - console.log('The document is locked by another user') setIsLockedByAnotherUser(true) } else { setIsLockedByAnotherUser(false) @@ -309,25 +402,13 @@ export const DefaultEditView: React.FC = () => { } } - console.log('Is locked by another user: ', isLockedByAnotherUser) - console.log('Show take over modal: ', showTakeOverModal) - - if ( - isLockedByAnotherUser && - documentLockStateRef.current?.user?.id !== user.id && - !showTakeOverModal - ) { - console.log('Taking over the document') - documentLockStateRef.current = { isLocked: true, user } - setCurrentEditor(user) - - await updateDocumentEditor(id, collectionSlug ?? globalSlug, user) + if ((id || globalSlug) && !isLockedByAnotherUser) { + resetLockTimer() // Reset the timer on every change } + // Lock the document if it's not locked and this user is the current editor if ((id || globalSlug) && !isLockedByAnotherUser && !isDocumentLockedRef.current) { - console.log('Locking the document') setShouldLockDocument(true) - resetLockTimer() } return state @@ -342,11 +423,9 @@ export const DefaultEditView: React.FC = () => { operation, serverURL, isLockedByAnotherUser, - updateDocumentEditor, user, resetLockTimer, documentLockStateRef, - showTakeOverModal, setCurrentEditor, ], ) @@ -357,9 +436,8 @@ export const DefaultEditView: React.FC = () => { try { await lockDocument(id, collectionSlug ?? globalSlug, user) isDocumentLockedRef.current = true - - resetLockTimer() // Start the lock timer } catch (error) { + // eslint-disable-next-line no-console console.error('Failed to lock the document', error) } finally { setShouldLockDocument(false) @@ -368,29 +446,32 @@ export const DefaultEditView: React.FC = () => { void lockDoc() } - }, [shouldLockDocument, lockDocument, id, user, resetLockTimer, globalSlug, collectionSlug]) + }, [shouldLockDocument, lockDocument, id, user, globalSlug, collectionSlug]) // Clean up when the component unmounts or when the document is unlocked useEffect(() => { return () => { if ((id || globalSlug) && isDocumentLockedRef.current) { + // Check if this user is still the current editor if (documentLockStateRef.current?.user?.id === user.id) { void unlockDocument(id, collectionSlug ?? globalSlug) - } - isDocumentLockedRef.current = false + // Reset the locked state + isDocumentLockedRef.current = false + documentLockStateRef.current = null + setCurrentEditor(null) - if (lockTimer.current) { - clearTimeout(lockTimer.current) - lockTimer.current = null + // Clear the lock timer + if (lockTimer.current) { + clearTimeout(lockTimer.current) + lockTimer.current = null + } } } setShowTakeOverModal(false) } - }, [collectionSlug, globalSlug, id, unlockDocument, user.id]) - - console.log('Current Editor: ', currentEditor) + }, [collectionSlug, globalSlug, id, unlockDocument, user.id, setCurrentEditor]) return (
diff --git a/packages/ui/src/providers/DocumentInfo/index.tsx b/packages/ui/src/providers/DocumentInfo/index.tsx index da74629c8a9..f47c32aa4af 100644 --- a/packages/ui/src/providers/DocumentInfo/index.tsx +++ b/packages/ui/src/providers/DocumentInfo/index.tsx @@ -182,6 +182,7 @@ const DocumentInfo: React.FC< if (error.response?.status === 409) { setIsDocumentLocked(true) } else { + // eslint-disable-next-line no-console console.error('Failed to lock the document', error) } } finally { @@ -218,6 +219,7 @@ const DocumentInfo: React.FC< setIsDocumentLocked(false) } } catch (error) { + // eslint-disable-next-line no-console console.error('Failed to unlock the document', error) } }, @@ -262,6 +264,7 @@ const DocumentInfo: React.FC< setIsDocumentLocked(true) } } catch (error) { + // eslint-disable-next-line no-console console.error('Failed to update the document editor', error) } }, @@ -293,6 +296,7 @@ const DocumentInfo: React.FC< setIsDocumentLocked(false) } } catch (error) { + // eslint-disable-next-line no-console console.error('Failed to fetch lock state', error) } } From d6abec977a7f7ee10057265be4991da10d5278f3 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 29 Aug 2024 15:23:15 -0400 Subject: [PATCH 110/173] feat: disables document locking if lockWhenEditing is false --- .../next/src/views/Edit/Default/index.tsx | 94 ++++++++++++------- 1 file changed, 59 insertions(+), 35 deletions(-) diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index 33d6169b711..ac0293ca1d3 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -101,7 +101,15 @@ export const DefaultEditView: React.FC = () => { const collectionConfig = getEntityConfig({ collectionSlug }) as ClientCollectionConfig - const lockWhenEditingProp = collectionConfig.lockWhenEditing + const lockWhenEditingProp = + collectionConfig.lockWhenEditing !== undefined ? collectionConfig.lockWhenEditing : true + + const isLockingEnabled = lockWhenEditingProp === true || typeof lockWhenEditingProp === 'object' + + const lockDuration = + typeof lockWhenEditingProp === 'object' && 'lockDuration' in lockWhenEditingProp + ? lockWhenEditingProp.lockDuration + : 300 // default to 300 seconds if no lockDuration is provided const globalConfig = getEntityConfig({ globalSlug }) as ClientGlobalConfig @@ -145,15 +153,12 @@ export const DefaultEditView: React.FC = () => { const isManualUnlockRef = useRef(false) const resetLockTimer = useCallback(() => { + if (!isLockingEnabled) {return} + if (lockTimer.current) { clearTimeout(lockTimer.current) } - const duration = - typeof lockWhenEditingProp === 'object' && 'lockDuration' in lockWhenEditingProp - ? lockWhenEditingProp.lockDuration - : 300 - lockTimer.current = setTimeout(() => { if (id || globalSlug) { // Check if this user is still the current editor @@ -176,18 +181,21 @@ export const DefaultEditView: React.FC = () => { console.error('Failed to unlock the document', error) } } - }, duration * 1000) + }, lockDuration * 1000) }, [ - lockWhenEditingProp, id, globalSlug, collectionSlug, unlockDocument, setCurrentEditor, user.id, + lockDuration, + isLockingEnabled, ]) const handleTakeOver = useCallback(() => { + if (!isLockingEnabled) {return} + // Invalidate the previous user's timer if (lockTimer.current) { clearTimeout(lockTimer.current) @@ -221,9 +229,12 @@ export const DefaultEditView: React.FC = () => { setCurrentEditor, setIsLockedByAnotherUser, resetLockTimer, + isLockingEnabled, ]) const handleTakeOverWithinDoc = useCallback(() => { + if (!isLockingEnabled) {return} + // Invalidate the previous user's timer if (lockTimer.current) { clearTimeout(lockTimer.current) @@ -260,24 +271,29 @@ export const DefaultEditView: React.FC = () => { setCurrentEditor, setIsLockedByAnotherUser, resetLockTimer, + isLockingEnabled, ]) useEffect(() => { + if (!isLockingEnabled) {return} + if (documentLockStateRef.current && documentLockStateRef.current.user.id !== user.id) { setIsLockedByAnotherUser(true) } else { setIsLockedByAnotherUser(false) } - }, [user.id]) + }, [user.id, isLockingEnabled]) useEffect(() => { + if (!isLockingEnabled) {return} + if (isDocumentLocked && currentEditor && currentEditor.id !== user.id && !showTakeOverModal) { // Show the DocumentLocked modal for the incoming user setShowLockedModal(true) } else { setShowLockedModal(false) } - }, [currentEditor, isDocumentLocked, showTakeOverModal, user.id]) + }, [currentEditor, isDocumentLocked, showTakeOverModal, user.id, isLockingEnabled]) const handleGoBack = useCallback(() => { const redirectRoute = formatAdminURL({ @@ -326,7 +342,7 @@ export const DefaultEditView: React.FC = () => { } // Unlock the document after save - if (id || globalSlug) { + if ((id || globalSlug) && isLockingEnabled) { void unlockDocument(id, collectionSlug ?? globalSlug) } @@ -359,6 +375,7 @@ export const DefaultEditView: React.FC = () => { resetUploadEdits, unlockDocument, globalSlug, + isLockingEnabled, ], ) @@ -381,38 +398,40 @@ export const DefaultEditView: React.FC = () => { formState: prevFormState, globalSlug, operation, - returnLockStatus: true, + returnLockStatus: isLockingEnabled ? true : false, schemaPath, }, serverURL, }) - const previousOwnerId = documentLockStateRef.current?.user?.id + if (isLockingEnabled) { + const previousOwnerId = documentLockStateRef.current?.user?.id - if (lockedState) { - if (!documentLockStateRef.current || lockedState.user.id !== previousOwnerId) { - if (previousOwnerId === user.id && lockedState.user.id !== user.id) { - setShowTakeOverModal(true) - } + if (lockedState) { + if (!documentLockStateRef.current || lockedState.user.id !== previousOwnerId) { + if (previousOwnerId === user.id && lockedState.user.id !== user.id) { + setShowTakeOverModal(true) + } - documentLockStateRef.current = lockedState - setCurrentEditor(lockedState.user) + documentLockStateRef.current = lockedState + setCurrentEditor(lockedState.user) - if (lockedState.user.id !== user.id) { - setIsLockedByAnotherUser(true) - } else { - setIsLockedByAnotherUser(false) + if (lockedState.user.id !== user.id) { + setIsLockedByAnotherUser(true) + } else { + setIsLockedByAnotherUser(false) + } } } - } - if ((id || globalSlug) && !isLockedByAnotherUser) { - resetLockTimer() // Reset the timer on every change - } + if ((id || globalSlug) && !isLockedByAnotherUser) { + resetLockTimer() // Reset the timer on every change + } - // Lock the document if it's not locked and this user is the current editor - if ((id || globalSlug) && !isLockedByAnotherUser && !isDocumentLockedRef.current) { - setShouldLockDocument(true) + // Lock the document if it's not locked and this user is the current editor + if ((id || globalSlug) && !isLockedByAnotherUser && !isDocumentLockedRef.current) { + setShouldLockDocument(true) + } } return state @@ -431,10 +450,13 @@ export const DefaultEditView: React.FC = () => { resetLockTimer, documentLockStateRef, setCurrentEditor, + isLockingEnabled, ], ) useEffect(() => { + if (!isLockingEnabled) {return} + if ((id || globalSlug) && shouldLockDocument && !isDocumentLockedRef.current) { const lockDoc = async () => { try { @@ -450,11 +472,13 @@ export const DefaultEditView: React.FC = () => { void lockDoc() } - }, [shouldLockDocument, lockDocument, id, user, globalSlug, collectionSlug]) + }, [shouldLockDocument, lockDocument, id, user, globalSlug, collectionSlug, isLockingEnabled]) // Clean up when the component unmounts or when the document is unlocked useEffect(() => { return () => { + if (!isLockingEnabled) {return} + if ((id || globalSlug) && isDocumentLockedRef.current) { // Check if this user is still the current editor if (documentLockStateRef.current?.user?.id === user.id) { @@ -475,7 +499,7 @@ export const DefaultEditView: React.FC = () => { setShowTakeOverModal(false) } - }, [collectionSlug, globalSlug, id, unlockDocument, user.id, setCurrentEditor]) + }, [collectionSlug, globalSlug, id, unlockDocument, user.id, setCurrentEditor, isLockingEnabled]) return (
@@ -492,7 +516,7 @@ export const DefaultEditView: React.FC = () => { onSuccess={onSave} > {BeforeDocument} - {showLockedModal && ( + {isLockingEnabled && showLockedModal && ( { user={currentEditor} /> )} - {showTakeOverModal && ( + {isLockingEnabled && showTakeOverModal && ( Date: Thu, 29 Aug 2024 16:22:29 -0400 Subject: [PATCH 111/173] prevents unnecessary api requests and wires pagination --- packages/ui/src/elements/Pagination/index.tsx | 4 ++- .../RelationshipTable/TableWrapper.tsx | 8 +++--- .../src/elements/RelationshipTable/index.tsx | 26 ++++++++++++++----- packages/ui/src/hooks/usePayloadAPI.ts | 1 + 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/packages/ui/src/elements/Pagination/index.tsx b/packages/ui/src/elements/Pagination/index.tsx index b2d678d8928..074f68c15c8 100644 --- a/packages/ui/src/elements/Pagination/index.tsx +++ b/packages/ui/src/elements/Pagination/index.tsx @@ -52,7 +52,7 @@ export const Pagination: React.FC = (props) => { totalPages = null, } = props - if (!totalPages || totalPages <= 1) { + if (!hasNextPage && !hasPrevPage) { return null } @@ -82,6 +82,7 @@ export const Pagination: React.FC = (props) => { if (currentPage - numberOfNeighbors - 1 >= 2) { nodes.unshift({ type: 'Separator' }) } + // Add first page if necessary if (currentPage > numberOfNeighbors + 1) { nodes.unshift({ @@ -98,6 +99,7 @@ export const Pagination: React.FC = (props) => { if (currentPage + numberOfNeighbors + 1 < totalPages) { nodes.push({ type: 'Separator' }) } + // Add last page if necessary if (rangeEndIndex < totalPages) { nodes.push({ diff --git a/packages/ui/src/elements/RelationshipTable/TableWrapper.tsx b/packages/ui/src/elements/RelationshipTable/TableWrapper.tsx index 351e388c19e..3ecdedccff2 100644 --- a/packages/ui/src/elements/RelationshipTable/TableWrapper.tsx +++ b/packages/ui/src/elements/RelationshipTable/TableWrapper.tsx @@ -32,10 +32,12 @@ export const RelationshipTableWrapper: React.FC hasNextPage={data.hasNextPage} hasPrevPage={data.hasPrevPage} limit={data.limit} - nextPage={data.nextPage || undefined} + nextPage={data.nextPage || 2} numberOfNeighbors={1} - onChange={() => handlePageChange} - page={data.page} + onChange={(e) => { + void handlePageChange(e) + }} + page={data.page || 1} prevPage={data.prevPage || undefined} totalPages={data.totalPages} /> diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index f64785b319a..22b3082b97f 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -68,7 +68,9 @@ export const RelationshipTable: React.FC = (pro const [openColumnSelector, setOpenColumnSelector] = useState(false) const hasInitialized = useRef(false) - const collectionConfig = getEntityConfig({ collectionSlug: relationTo }) as ClientCollectionConfig + const [collectionConfig] = useState( + () => getEntityConfig({ collectionSlug: relationTo }) as ClientCollectionConfig, + ) const apiURL = `${serverURL}${api}/${collectionConfig.slug}` @@ -127,14 +129,24 @@ export const RelationshipTable: React.FC = (pro } } - if (limit) params.limit = limit - if (page) params.page = page - if (sort) params.sort = sort - if (copyOfWhere) params.where = copyOfWhere - if (versions?.drafts) params.draft = 'true' + if (limit) { + params.limit = limit + } + if (page) { + params.page = page + } + if (sort) { + params.sort = sort + } + if (copyOfWhere) { + params.where = copyOfWhere + } + if (versions?.drafts) { + params.draft = 'true' + } setParams(params) - }, [page, sort, where, search, collectionConfig, setParams, limit, filterOptions, initialData]) + }, [page, sort, where, search, collectionConfig, filterOptions, initialData, limit, setParams]) const [DocumentDrawer, DocumentDrawerToggler, { closeDrawer }] = useDocumentDrawer({ collectionSlug: relationTo, diff --git a/packages/ui/src/hooks/usePayloadAPI.ts b/packages/ui/src/hooks/usePayloadAPI.ts index ee81c88a2cd..6677289a07f 100644 --- a/packages/ui/src/hooks/usePayloadAPI.ts +++ b/packages/ui/src/hooks/usePayloadAPI.ts @@ -73,6 +73,7 @@ export const usePayloadAPI: UsePayloadAPI = (url, options = {}) => { } const json = await response.json() + setData(json) setIsLoading(false) } catch (error) { From ee14b8b7d64f6d756d999629d15e76743d3595c9 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Thu, 29 Aug 2024 17:05:42 -0400 Subject: [PATCH 112/173] chore: fix build --- packages/ui/src/elements/BulkUpload/EditForm/index.tsx | 2 +- packages/ui/src/elements/BulkUpload/FormsManager/index.tsx | 2 +- packages/ui/src/elements/DocumentControls/index.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/elements/BulkUpload/EditForm/index.tsx b/packages/ui/src/elements/BulkUpload/EditForm/index.tsx index 2ed5d0c0129..11e0f940c4f 100644 --- a/packages/ui/src/elements/BulkUpload/EditForm/index.tsx +++ b/packages/ui/src/elements/BulkUpload/EditForm/index.tsx @@ -114,7 +114,7 @@ export function EditForm({ submitted }: EditFormProps) { const onChange: NonNullable[0] = useCallback( async ({ formState: prevFormState }) => { const docPreferences = await getDocPreferences() - const newFormState = await getFormState({ + const { state: newFormState } = await getFormState({ apiRoute, body: { collectionSlug, diff --git a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx index 3cfc4596c10..362ac23c877 100644 --- a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx +++ b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx @@ -152,7 +152,7 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { } try { - const formStateWithoutFiles = await getFormState({ + const { state: formStateWithoutFiles } = await getFormState({ apiRoute: config.routes.api, body: { collectionSlug, diff --git a/packages/ui/src/elements/DocumentControls/index.tsx b/packages/ui/src/elements/DocumentControls/index.tsx index 3de7d8c1237..bf1af30764a 100644 --- a/packages/ui/src/elements/DocumentControls/index.tsx +++ b/packages/ui/src/elements/DocumentControls/index.tsx @@ -40,7 +40,7 @@ export const DocumentControls: React.FC<{ readonly id?: number | string readonly isAccountView?: boolean readonly isEditing?: boolean - onTakeOver: () => void + readonly onTakeOver?: () => void readonly permissions: CollectionPermission | GlobalPermission | null readonly readOnlyForIncomingUser?: boolean readonly slug: SanitizedCollectionConfig['slug'] From 1f412f8348becd699475d945fe2a1d41e7e1ca48 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 29 Aug 2024 22:51:37 -0400 Subject: [PATCH 113/173] loads initial data client-side --- packages/ui/src/elements/RelationshipTable/index.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 22b3082b97f..1bd0e20c4e1 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -8,7 +8,7 @@ import type { Where, } from 'payload' -import React, { useCallback, useEffect, useRef, useState } from 'react' +import React, { useCallback, useEffect, useState } from 'react' import AnimateHeightImport from 'react-animate-height' const AnimateHeight = AnimateHeightImport.default || AnimateHeightImport @@ -66,7 +66,6 @@ export const RelationshipTable: React.FC = (pro const [where, setWhere] = useState(null) const [search, setSearch] = useState('') const [openColumnSelector, setOpenColumnSelector] = useState(false) - const hasInitialized = useRef(false) const [collectionConfig] = useState( () => getEntityConfig({ collectionSlug: relationTo }) as ClientCollectionConfig, @@ -82,11 +81,6 @@ export const RelationshipTable: React.FC = (pro }) useEffect(() => { - if (initialData !== undefined && !hasInitialized.current) { - hasInitialized.current = true - return - } - const { admin: { listSearchableFields, useAsTitle } = {} as ClientCollectionConfig['admin'], versions, From 3b58e44dae406540cc8b6a8090939833941da878 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 29 Aug 2024 22:57:53 -0400 Subject: [PATCH 114/173] regenerates lockfile --- pnpm-lock.yaml | 18796 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 18796 insertions(+) create mode 100644 pnpm-lock.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000000..b63851a5e77 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,18796 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/react-dom': npm:types-react-dom@19.0.0-rc.0 + copyfiles: 2.4.1 + cross-env: 7.0.3 + dotenv: 16.4.5 + drizzle-orm: 0.32.1 + graphql: ^16.8.1 + mongodb-memory-server: ^9.0 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + typescript: 5.5.4 + +importers: + + .: + devDependencies: + '@jest/globals': + specifier: 29.7.0 + version: 29.7.0 + '@libsql/client': + specifier: 0.6.2 + version: 0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@next/bundle-analyzer': + specifier: 15.0.0-canary.104 + version: 15.0.0-canary.104(bufferutil@4.0.8) + '@payloadcms/db-postgres': + specifier: workspace:* + version: link:packages/db-postgres + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:packages/eslint-config + '@payloadcms/eslint-plugin': + specifier: workspace:* + version: link:packages/eslint-plugin + '@payloadcms/live-preview-react': + specifier: workspace:* + version: link:packages/live-preview-react + '@playwright/test': + specifier: 1.46.0 + version: 1.46.0 + '@swc-node/register': + specifier: 1.10.9 + version: 1.10.9(@swc/core@1.7.10(@swc/helpers@0.5.12))(@swc/types@0.1.12)(typescript@5.5.4) + '@swc/cli': + specifier: 0.4.0 + version: 0.4.0(@swc/core@1.7.10(@swc/helpers@0.5.12))(chokidar@3.6.0) + '@swc/jest': + specifier: 0.2.36 + version: 0.2.36(@swc/core@1.7.10(@swc/helpers@0.5.12)) + '@types/fs-extra': + specifier: ^11.0.2 + version: 11.0.4 + '@types/jest': + specifier: 29.5.12 + version: 29.5.12 + '@types/minimist': + specifier: 1.2.5 + version: 1.2.5 + '@types/node': + specifier: 20.12.5 + version: 20.12.5 + '@types/prompts': + specifier: ^2.4.5 + version: 2.4.9 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + '@types/semver': + specifier: ^7.5.3 + version: 7.5.8 + '@types/shelljs': + specifier: 0.8.15 + version: 0.8.15 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + changelogen: + specifier: ^0.5.5 + version: 0.5.5 + comment-json: + specifier: ^4.2.3 + version: 4.2.5 + copyfiles: + specifier: 2.4.1 + version: 2.4.1 + create-payload-app: + specifier: workspace:* + version: link:packages/create-payload-app + cross-env: + specifier: 7.0.3 + version: 7.0.3 + dotenv: + specifier: 16.4.5 + version: 16.4.5 + drizzle-kit: + specifier: 0.23.2-df9e596 + version: 0.23.2-df9e596 + drizzle-orm: + specifier: 0.32.1 + version: 0.32.1(@libsql/client@0.6.2(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + escape-html: + specifier: ^1.0.3 + version: 1.0.3 + execa: + specifier: 5.1.1 + version: 5.1.1 + form-data: + specifier: 3.0.1 + version: 3.0.1 + fs-extra: + specifier: 10.1.0 + version: 10.1.0 + globby: + specifier: 11.1.0 + version: 11.1.0 + husky: + specifier: 9.0.11 + version: 9.0.11 + jest: + specifier: 29.7.0 + version: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + jest-environment-jsdom: + specifier: 29.7.0 + version: 29.7.0(bufferutil@4.0.8) + lint-staged: + specifier: 15.2.7 + version: 15.2.7 + minimist: + specifier: 1.2.8 + version: 1.2.8 + mongodb-memory-server: + specifier: ^9.0 + version: 9.4.1(@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))) + next: + specifier: 15.0.0-canary.104 + version: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + open: + specifier: ^10.1.0 + version: 10.1.0 + p-limit: + specifier: ^5.0.0 + version: 5.0.0 + playwright: + specifier: 1.46.0 + version: 1.46.0 + playwright-core: + specifier: 1.46.0 + version: 1.46.0 + prettier: + specifier: 3.3.3 + version: 3.3.3 + prompts: + specifier: 2.4.2 + version: 2.4.2 + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + rimraf: + specifier: 3.0.2 + version: 3.0.2 + semver: + specifier: ^7.5.4 + version: 7.6.3 + sharp: + specifier: 0.32.6 + version: 0.32.6 + shelljs: + specifier: 0.8.5 + version: 0.8.5 + slash: + specifier: 3.0.0 + version: 3.0.0 + sort-package-json: + specifier: ^2.10.0 + version: 2.10.0 + swc-plugin-transform-remove-imports: + specifier: 1.15.0 + version: 1.15.0 + tempy: + specifier: 1.0.1 + version: 1.0.1 + tsx: + specifier: 4.17.0 + version: 4.17.0 + turbo: + specifier: ^2.1.0 + version: 2.1.0 + typescript: + specifier: 5.5.4 + version: 5.5.4 + + packages/create-payload-app: + dependencies: + '@clack/prompts': + specifier: ^0.7.0 + version: 0.7.0 + '@sindresorhus/slugify': + specifier: ^1.1.0 + version: 1.1.2 + '@swc/core': + specifier: 1.7.10 + version: 1.7.10(@swc/helpers@0.5.12) + arg: + specifier: ^5.0.0 + version: 5.0.2 + chalk: + specifier: ^4.1.0 + version: 4.1.2 + comment-json: + specifier: ^4.2.3 + version: 4.2.5 + degit: + specifier: ^2.8.4 + version: 2.8.4 + esprima-next: + specifier: ^6.0.3 + version: 6.0.3 + execa: + specifier: ^5.0.0 + version: 5.1.1 + figures: + specifier: ^6.1.0 + version: 6.1.0 + fs-extra: + specifier: ^9.0.1 + version: 9.1.0 + globby: + specifier: 11.1.0 + version: 11.1.0 + terminal-link: + specifier: ^2.1.1 + version: 2.1.1 + devDependencies: + '@types/degit': + specifier: ^2.8.3 + version: 2.8.6 + '@types/esprima': + specifier: ^4.0.6 + version: 4.0.6 + '@types/fs-extra': + specifier: ^9.0.12 + version: 9.0.13 + '@types/jest': + specifier: 29.5.12 + version: 29.5.12 + '@types/node': + specifier: 20.12.5 + version: 20.12.5 + + packages/db-mongodb: + dependencies: + bson-objectid: + specifier: 2.0.4 + version: 2.0.4 + http-status: + specifier: 1.6.2 + version: 1.6.2 + mongoose: + specifier: 6.12.3 + version: 6.12.3(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + mongoose-aggregate-paginate-v2: + specifier: 1.0.6 + version: 1.0.6 + mongoose-paginate-v2: + specifier: 1.7.22 + version: 1.7.22 + prompts: + specifier: 2.4.2 + version: 2.4.2 + uuid: + specifier: 10.0.0 + version: 10.0.0 + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/mongoose-aggregate-paginate-v2': + specifier: 1.0.6 + version: 1.0.6(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + mongodb: + specifier: 4.17.1 + version: 4.17.1(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + mongodb-memory-server: + specifier: ^9.0 + version: 9.4.1(@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))) + payload: + specifier: workspace:* + version: link:../payload + + packages/db-postgres: + dependencies: + '@payloadcms/drizzle': + specifier: workspace:* + version: link:../drizzle + console-table-printer: + specifier: 2.11.2 + version: 2.11.2 + drizzle-kit: + specifier: 0.23.2-df9e596 + version: 0.23.2-df9e596 + drizzle-orm: + specifier: 0.32.1 + version: 0.32.1(@libsql/client@0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + pg: + specifier: 8.11.3 + version: 8.11.3 + prompts: + specifier: 2.4.2 + version: 2.4.2 + to-snake-case: + specifier: 1.0.0 + version: 1.0.0 + uuid: + specifier: 10.0.0 + version: 10.0.0 + devDependencies: + '@hyrious/esbuild-plugin-commonjs': + specifier: ^0.2.4 + version: 0.2.4(cjs-module-lexer@1.3.1)(esbuild@0.23.1) + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/pg': + specifier: 8.10.2 + version: 8.10.2 + '@types/to-snake-case': + specifier: 1.0.0 + version: 1.0.0 + esbuild: + specifier: 0.23.1 + version: 0.23.1 + payload: + specifier: workspace:* + version: link:../payload + + packages/db-sqlite: + dependencies: + '@libsql/client': + specifier: ^0.6.2 + version: 0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@payloadcms/drizzle': + specifier: workspace:* + version: link:../drizzle + console-table-printer: + specifier: 2.11.2 + version: 2.11.2 + drizzle-kit: + specifier: 0.23.2-df9e596 + version: 0.23.2-df9e596 + drizzle-orm: + specifier: 0.32.1 + version: 0.32.1(@libsql/client@0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + prompts: + specifier: 2.4.2 + version: 2.4.2 + to-snake-case: + specifier: 1.0.0 + version: 1.0.0 + uuid: + specifier: 9.0.0 + version: 9.0.0 + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/pg': + specifier: 8.10.2 + version: 8.10.2 + '@types/to-snake-case': + specifier: 1.0.0 + version: 1.0.0 + payload: + specifier: workspace:* + version: link:../payload + + packages/db-vercel-postgres: + dependencies: + '@payloadcms/drizzle': + specifier: workspace:* + version: link:../drizzle + '@vercel/postgres': + specifier: ^0.9.0 + version: 0.9.0 + console-table-printer: + specifier: 2.11.2 + version: 2.11.2 + drizzle-kit: + specifier: 0.23.2-df9e596 + version: 0.23.2-df9e596 + drizzle-orm: + specifier: 0.32.1 + version: 0.32.1(@libsql/client@0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + prompts: + specifier: 2.4.2 + version: 2.4.2 + to-snake-case: + specifier: 1.0.0 + version: 1.0.0 + uuid: + specifier: 10.0.0 + version: 10.0.0 + devDependencies: + '@hyrious/esbuild-plugin-commonjs': + specifier: ^0.2.4 + version: 0.2.4(cjs-module-lexer@1.3.1)(esbuild@0.23.1) + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/pg': + specifier: 8.10.2 + version: 8.10.2 + '@types/to-snake-case': + specifier: 1.0.0 + version: 1.0.0 + esbuild: + specifier: 0.23.1 + version: 0.23.1 + payload: + specifier: workspace:* + version: link:../payload + + packages/drizzle: + dependencies: + console-table-printer: + specifier: 2.11.2 + version: 2.11.2 + drizzle-orm: + specifier: 0.32.1 + version: 0.32.1(@libsql/client@0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + prompts: + specifier: 2.4.2 + version: 2.4.2 + to-snake-case: + specifier: 1.0.0 + version: 1.0.0 + uuid: + specifier: 9.0.0 + version: 9.0.0 + devDependencies: + '@libsql/client': + specifier: ^0.6.2 + version: 0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/pg': + specifier: 8.10.2 + version: 8.10.2 + '@types/to-snake-case': + specifier: 1.0.0 + version: 1.0.0 + payload: + specifier: workspace:* + version: link:../payload + + packages/email-nodemailer: + dependencies: + nodemailer: + specifier: 6.9.10 + version: 6.9.10 + devDependencies: + '@types/nodemailer': + specifier: 6.4.14 + version: 6.4.14 + payload: + specifier: workspace:* + version: link:../payload + + packages/email-resend: + devDependencies: + '@types/jest': + specifier: 29.5.12 + version: 29.5.12 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + payload: + specifier: workspace:* + version: link:../payload + + packages/eslint-config: + dependencies: + '@eslint-react/eslint-plugin': + specifier: 1.12.3 + version: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint/js': + specifier: 9.9.1 + version: 9.9.1 + '@payloadcms/eslint-plugin': + specifier: workspace:* + version: link:../eslint-plugin + '@types/eslint': + specifier: 9.6.1 + version: 9.6.1 + '@types/eslint__js': + specifier: 8.42.3 + version: 8.42.3 + '@typescript-eslint/parser': + specifier: 8.3.0 + version: 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: + specifier: 9.9.1 + version: 9.9.1(jiti@1.21.6) + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-import-x: + specifier: 4.1.1 + version: 4.1.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-jest: + specifier: 28.8.1 + version: 28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) + eslint-plugin-jest-dom: + specifier: 5.4.0 + version: 5.4.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-jsx-a11y: + specifier: 6.9.0 + version: 6.9.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-perfectionist: + specifier: 3.3.0 + version: 3.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-react-hooks: + specifier: 5.1.0-rc-a19a8ab4-20240829 + version: 5.1.0-rc-a19a8ab4-20240829(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-regexp: + specifier: 2.6.0 + version: 2.6.0(eslint@9.9.1(jiti@1.21.6)) + globals: + specifier: 15.9.0 + version: 15.9.0 + typescript: + specifier: 5.5.4 + version: 5.5.4 + typescript-eslint: + specifier: 8.3.0 + version: 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + + packages/eslint-plugin: + dependencies: + '@eslint-react/eslint-plugin': + specifier: 1.12.3 + version: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint/js': + specifier: 9.9.1 + version: 9.9.1 + '@types/eslint': + specifier: 9.6.1 + version: 9.6.1 + '@types/eslint__js': + specifier: 8.42.3 + version: 8.42.3 + '@typescript-eslint/parser': + specifier: 8.3.0 + version: 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: + specifier: 9.9.1 + version: 9.9.1(jiti@1.21.6) + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-import-x: + specifier: 4.1.1 + version: 4.1.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-jest: + specifier: 28.8.1 + version: 28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) + eslint-plugin-jest-dom: + specifier: 5.4.0 + version: 5.4.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-jsx-a11y: + specifier: 6.9.0 + version: 6.9.0(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-perfectionist: + specifier: 3.3.0 + version: 3.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-react-hooks: + specifier: 5.1.0-rc-a19a8ab4-20240829 + version: 5.1.0-rc-a19a8ab4-20240829(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-regexp: + specifier: 2.6.0 + version: 2.6.0(eslint@9.9.1(jiti@1.21.6)) + globals: + specifier: 15.9.0 + version: 15.9.0 + typescript: + specifier: 5.5.4 + version: 5.5.4 + typescript-eslint: + specifier: 8.3.0 + version: 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + + packages/graphql: + dependencies: + graphql: + specifier: ^16.8.1 + version: 16.9.0 + graphql-scalars: + specifier: 1.22.2 + version: 1.22.2(graphql@16.9.0) + pluralize: + specifier: 8.0.0 + version: 8.0.0 + ts-essentials: + specifier: 7.0.3 + version: 7.0.3(typescript@5.5.4) + tsx: + specifier: 4.17.0 + version: 4.17.0 + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/pluralize': + specifier: ^0.0.33 + version: 0.0.33 + graphql-http: + specifier: ^1.22.0 + version: 1.22.1(graphql@16.9.0) + payload: + specifier: workspace:* + version: link:../payload + + packages/live-preview: + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + payload: + specifier: workspace:* + version: link:../payload + + packages/live-preview-react: + dependencies: + '@payloadcms/live-preview': + specifier: workspace:* + version: link:../live-preview + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + payload: + specifier: workspace:* + version: link:../payload + + packages/live-preview-vue: + dependencies: + '@payloadcms/live-preview': + specifier: workspace:* + version: link:../live-preview + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + payload: + specifier: workspace:* + version: link:../payload + vue: + specifier: ^3.0.0 + version: 3.4.37(typescript@5.5.4) + + packages/next: + dependencies: + '@dnd-kit/core': + specifier: 6.0.8 + version: 6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@payloadcms/graphql': + specifier: workspace:* + version: link:../graphql + '@payloadcms/translations': + specifier: workspace:* + version: link:../translations + '@payloadcms/ui': + specifier: workspace:* + version: link:../ui + busboy: + specifier: ^1.6.0 + version: 1.6.0 + file-type: + specifier: 17.1.6 + version: 17.1.6 + graphql: + specifier: ^16.8.1 + version: 16.9.0 + graphql-http: + specifier: ^1.22.0 + version: 1.22.1(graphql@16.9.0) + graphql-playground-html: + specifier: 1.6.30 + version: 1.6.30 + http-status: + specifier: 1.6.2 + version: 1.6.2 + next: + specifier: ^15.0.0-canary.104 + version: 15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + path-to-regexp: + specifier: ^6.2.1 + version: 6.2.2 + qs-esm: + specifier: 7.0.2 + version: 7.0.2 + react-diff-viewer-continued: + specifier: 3.2.6 + version: 3.2.6(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + sass: + specifier: 1.77.4 + version: 1.77.4 + sonner: + specifier: ^1.5.0 + version: 1.5.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + uuid: + specifier: 10.0.0 + version: 10.0.0 + ws: + specifier: ^8.16.0 + version: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + devDependencies: + '@babel/cli': + specifier: ^7.24.5 + version: 7.24.8(@babel/core@7.25.2) + '@babel/core': + specifier: ^7.24.5 + version: 7.25.2 + '@babel/preset-env': + specifier: ^7.24.5 + version: 7.25.3(@babel/core@7.25.2) + '@babel/preset-react': + specifier: ^7.24.1 + version: 7.24.7(@babel/core@7.25.2) + '@babel/preset-typescript': + specifier: ^7.24.1 + version: 7.24.7(@babel/core@7.25.2) + '@next/eslint-plugin-next': + specifier: 15.0.0-canary.104 + version: 15.0.0-canary.104 + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/busboy': + specifier: 1.5.4 + version: 1.5.4 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + '@types/uuid': + specifier: 10.0.0 + version: 10.0.0 + '@types/ws': + specifier: ^8.5.10 + version: 8.5.12 + babel-plugin-react-compiler: + specifier: 0.0.0-experimental-48eb8f4-20240822 + version: 0.0.0-experimental-48eb8f4-20240822 + esbuild: + specifier: 0.23.1 + version: 0.23.1 + esbuild-sass-plugin: + specifier: 3.3.1 + version: 3.3.1(esbuild@0.23.1)(sass-embedded@1.77.8) + eslint-plugin-react-compiler: + specifier: 0.0.0-experimental-72f06b2-20240822 + version: 0.0.0-experimental-72f06b2-20240822(eslint@9.9.1(jiti@1.21.6)) + payload: + specifier: workspace:* + version: link:../payload + swc-plugin-transform-remove-imports: + specifier: 1.15.0 + version: 1.15.0 + + packages/payload: + dependencies: + '@monaco-editor/react': + specifier: 4.6.0 + version: 4.6.0(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@next/env': + specifier: ^15.0.0-canary.104 + version: 15.0.0-rc.0 + '@payloadcms/translations': + specifier: workspace:* + version: link:../translations + '@types/busboy': + specifier: 1.5.4 + version: 1.5.4 + ajv: + specifier: 8.14.0 + version: 8.14.0 + bson-objectid: + specifier: 2.0.4 + version: 2.0.4 + ci-info: + specifier: ^4.0.0 + version: 4.0.0 + console-table-printer: + specifier: 2.11.2 + version: 2.11.2 + dataloader: + specifier: 2.2.2 + version: 2.2.2 + deepmerge: + specifier: 4.3.1 + version: 4.3.1 + file-type: + specifier: 17.1.6 + version: 17.1.6 + find-up: + specifier: 7.0.0 + version: 7.0.0 + get-tsconfig: + specifier: ^4.7.2 + version: 4.7.6 + graphql: + specifier: ^16.8.1 + version: 16.9.0 + http-status: + specifier: 1.6.2 + version: 1.6.2 + image-size: + specifier: ^1.1.1 + version: 1.1.1 + json-schema-to-typescript: + specifier: 15.0.1 + version: 15.0.1 + jsonwebtoken: + specifier: 9.0.1 + version: 9.0.1 + minimist: + specifier: 1.2.8 + version: 1.2.8 + pino: + specifier: 9.3.1 + version: 9.3.1 + pino-pretty: + specifier: 11.2.1 + version: 11.2.1 + pluralize: + specifier: 8.0.0 + version: 8.0.0 + sanitize-filename: + specifier: 1.6.3 + version: 1.6.3 + scmp: + specifier: 2.1.0 + version: 2.1.0 + ts-essentials: + specifier: 7.0.3 + version: 7.0.3(typescript@5.5.4) + tsx: + specifier: 4.17.0 + version: 4.17.0 + uuid: + specifier: 10.0.0 + version: 10.0.0 + devDependencies: + '@hyrious/esbuild-plugin-commonjs': + specifier: ^0.2.4 + version: 0.2.4(cjs-module-lexer@1.3.1)(esbuild@0.23.1) + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/json-schema': + specifier: 7.0.15 + version: 7.0.15 + '@types/jsonwebtoken': + specifier: 8.5.9 + version: 8.5.9 + '@types/minimist': + specifier: 1.2.2 + version: 1.2.2 + '@types/nodemailer': + specifier: 6.4.14 + version: 6.4.14 + '@types/pluralize': + specifier: 0.0.33 + version: 0.0.33 + '@types/react-datepicker': + specifier: 6.2.0 + version: 6.2.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@types/uuid': + specifier: 10.0.0 + version: 10.0.0 + copyfiles: + specifier: 2.4.1 + version: 2.4.1 + cross-env: + specifier: 7.0.3 + version: 7.0.3 + esbuild: + specifier: 0.23.1 + version: 0.23.1 + graphql-http: + specifier: ^1.22.0 + version: 1.22.1(graphql@16.9.0) + rimraf: + specifier: 3.0.2 + version: 3.0.2 + sharp: + specifier: 0.32.6 + version: 0.32.6 + + packages/plugin-cloud: + dependencies: + '@aws-sdk/client-cognito-identity': + specifier: ^3.614.0 + version: 3.629.0 + '@aws-sdk/client-s3': + specifier: ^3.614.0 + version: 3.629.0 + '@aws-sdk/credential-providers': + specifier: ^3.614.0 + version: 3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + '@aws-sdk/lib-storage': + specifier: ^3.614.0 + version: 3.629.0(@aws-sdk/client-s3@3.629.0) + '@payloadcms/email-nodemailer': + specifier: workspace:* + version: link:../email-nodemailer + amazon-cognito-identity-js: + specifier: ^6.1.2 + version: 6.3.12 + nodemailer: + specifier: 6.9.10 + version: 6.9.10 + resend: + specifier: ^0.17.2 + version: 0.17.2 + devDependencies: + '@types/jest': + specifier: 29.5.12 + version: 29.5.12 + '@types/nodemailer': + specifier: 6.4.14 + version: 6.4.14 + payload: + specifier: workspace:* + version: link:../payload + ts-jest: + specifier: ^29.1.0 + version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) + + packages/plugin-cloud-storage: + dependencies: + '@azure/abort-controller': + specifier: ^1.0.0 + version: 1.1.0 + find-node-modules: + specifier: ^2.1.3 + version: 2.1.3 + range-parser: + specifier: ^1.2.1 + version: 1.2.1 + devDependencies: + '@aws-sdk/client-s3': + specifier: ^3.614.0 + version: 3.629.0 + '@aws-sdk/lib-storage': + specifier: ^3.614.0 + version: 3.629.0(@aws-sdk/client-s3@3.629.0) + '@azure/storage-blob': + specifier: ^12.11.0 + version: 12.24.0 + '@google-cloud/storage': + specifier: ^7.7.0 + version: 7.12.1 + '@types/find-node-modules': + specifier: ^2.1.2 + version: 2.1.2 + '@vercel/blob': + specifier: ^0.22.3 + version: 0.22.3 + payload: + specifier: workspace:* + version: link:../payload + + packages/plugin-form-builder: + dependencies: + '@payloadcms/ui': + specifier: workspace:* + version: link:../ui + escape-html: + specifier: ^1.0.3 + version: 1.0.3 + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/escape-html': + specifier: ^1.0.4 + version: 1.0.4 + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + copyfiles: + specifier: 2.4.1 + version: 2.4.1 + cross-env: + specifier: 7.0.3 + version: 7.0.3 + payload: + specifier: workspace:* + version: link:../payload + + packages/plugin-nested-docs: + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + payload: + specifier: workspace:* + version: link:../payload + + packages/plugin-redirects: + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/express': + specifier: ^4.17.9 + version: 4.17.21 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + payload: + specifier: workspace:* + version: link:../payload + + packages/plugin-search: + dependencies: + '@payloadcms/ui': + specifier: workspace:* + version: link:../ui + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/express': + specifier: ^4.17.9 + version: 4.17.21 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + payload: + specifier: workspace:* + version: link:../payload + + packages/plugin-sentry: + dependencies: + '@sentry/node': + specifier: ^7.55.2 + version: 7.118.0 + '@sentry/types': + specifier: ^7.54.0 + version: 7.118.0 + express: + specifier: ^4.18.2 + version: 4.19.2 + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/express': + specifier: ^4.17.9 + version: 4.17.21 + '@types/jest': + specifier: 29.5.12 + version: 29.5.12 + '@types/node': + specifier: 20.12.5 + version: 20.12.5 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + copyfiles: + specifier: 2.4.1 + version: 2.4.1 + cross-env: + specifier: 7.0.3 + version: 7.0.3 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + nodemon: + specifier: 3.0.3 + version: 3.0.3 + payload: + specifier: workspace:* + version: link:../payload + ts-jest: + specifier: ^29.1.0 + version: 29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) + + packages/plugin-seo: + dependencies: + '@payloadcms/translations': + specifier: workspace:* + version: link:../translations + '@payloadcms/ui': + specifier: workspace:* + version: link:../ui + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@payloadcms/next': + specifier: workspace:* + version: link:../next + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + payload: + specifier: workspace:* + version: link:../payload + + packages/plugin-stripe: + dependencies: + '@payloadcms/translations': + specifier: workspace:* + version: link:../translations + '@payloadcms/ui': + specifier: workspace:* + version: link:../ui + lodash.get: + specifier: ^4.4.2 + version: 4.4.2 + stripe: + specifier: ^10.2.0 + version: 10.17.0 + uuid: + specifier: 10.0.0 + version: 10.0.0 + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@payloadcms/next': + specifier: workspace:* + version: link:../next + '@types/express': + specifier: ^4.17.9 + version: 4.17.21 + '@types/lodash.get': + specifier: ^4.4.7 + version: 4.4.9 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + '@types/uuid': + specifier: 10.0.0 + version: 10.0.0 + payload: + specifier: workspace:* + version: link:../payload + + packages/richtext-lexical: + dependencies: + '@faceless-ui/modal': + specifier: 3.0.0-beta.2 + version: 3.0.0-beta.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@faceless-ui/scroll-info': + specifier: 2.0.0-beta.0 + version: 2.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@lexical/headless': + specifier: 0.17.0 + version: 0.17.0 + '@lexical/link': + specifier: 0.17.0 + version: 0.17.0 + '@lexical/list': + specifier: 0.17.0 + version: 0.17.0 + '@lexical/mark': + specifier: 0.17.0 + version: 0.17.0 + '@lexical/markdown': + specifier: 0.17.0 + version: 0.17.0 + '@lexical/react': + specifier: 0.17.0 + version: 0.17.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(yjs@13.6.18) + '@lexical/rich-text': + specifier: 0.17.0 + version: 0.17.0 + '@lexical/selection': + specifier: 0.17.0 + version: 0.17.0 + '@lexical/table': + specifier: 0.17.0 + version: 0.17.0 + '@lexical/utils': + specifier: 0.17.0 + version: 0.17.0 + '@payloadcms/next': + specifier: workspace:* + version: link:../next + '@payloadcms/translations': + specifier: workspace:* + version: link:../translations + '@payloadcms/ui': + specifier: workspace:* + version: link:../ui + '@types/uuid': + specifier: 10.0.0 + version: 10.0.0 + bson-objectid: + specifier: 2.0.4 + version: 2.0.4 + dequal: + specifier: 2.0.3 + version: 2.0.3 + escape-html: + specifier: 1.0.3 + version: 1.0.3 + lexical: + specifier: 0.17.0 + version: 0.17.0 + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-error-boundary: + specifier: 4.0.13 + version: 4.0.13(react@19.0.0-rc-06d0b89e-20240801) + uuid: + specifier: 10.0.0 + version: 10.0.0 + devDependencies: + '@babel/cli': + specifier: ^7.24.5 + version: 7.24.8(@babel/core@7.25.2) + '@babel/core': + specifier: ^7.24.5 + version: 7.25.2 + '@babel/preset-env': + specifier: ^7.24.5 + version: 7.25.3(@babel/core@7.25.2) + '@babel/preset-react': + specifier: ^7.24.1 + version: 7.24.7(@babel/core@7.25.2) + '@babel/preset-typescript': + specifier: ^7.24.1 + version: 7.24.7(@babel/core@7.25.2) + '@lexical/eslint-plugin': + specifier: 0.17.0 + version: 0.17.0(eslint@9.9.1(jiti@1.21.6)) + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/escape-html': + specifier: 1.0.4 + version: 1.0.4 + '@types/json-schema': + specifier: 7.0.15 + version: 7.0.15 + '@types/node': + specifier: 20.12.5 + version: 20.12.5 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + babel-plugin-react-compiler: + specifier: 0.0.0-experimental-48eb8f4-20240822 + version: 0.0.0-experimental-48eb8f4-20240822 + babel-plugin-transform-remove-imports: + specifier: ^1.8.0 + version: 1.8.0(@babel/core@7.25.2) + esbuild: + specifier: 0.23.1 + version: 0.23.1 + esbuild-sass-plugin: + specifier: 3.3.1 + version: 3.3.1(esbuild@0.23.1)(sass-embedded@1.77.8) + eslint-plugin-react-compiler: + specifier: 0.0.0-experimental-72f06b2-20240822 + version: 0.0.0-experimental-72f06b2-20240822(eslint@9.9.1(jiti@1.21.6)) + payload: + specifier: workspace:* + version: link:../payload + swc-plugin-transform-remove-imports: + specifier: 1.15.0 + version: 1.15.0 + + packages/richtext-slate: + dependencies: + '@payloadcms/translations': + specifier: workspace:* + version: link:../translations + '@payloadcms/ui': + specifier: workspace:* + version: link:../ui + is-hotkey: + specifier: 0.2.0 + version: 0.2.0 + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + slate: + specifier: 0.91.4 + version: 0.91.4 + slate-history: + specifier: 0.86.0 + version: 0.86.0(slate@0.91.4) + slate-hyperscript: + specifier: 0.81.3 + version: 0.81.3(slate@0.91.4) + slate-react: + specifier: 0.92.0 + version: 0.92.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(slate@0.91.4) + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/is-hotkey': + specifier: ^0.1.10 + version: 0.1.10 + '@types/node': + specifier: 20.12.5 + version: 20.12.5 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + payload: + specifier: workspace:* + version: link:../payload + + packages/storage-azure: + dependencies: + '@azure/abort-controller': + specifier: ^1.1.0 + version: 1.1.0 + '@azure/storage-blob': + specifier: ^12.11.0 + version: 12.24.0 + '@payloadcms/plugin-cloud-storage': + specifier: workspace:* + version: link:../plugin-cloud-storage + range-parser: + specifier: ^1.2.1 + version: 1.2.1 + devDependencies: + '@types/range-parser': + specifier: ^1.2.7 + version: 1.2.7 + payload: + specifier: workspace:* + version: link:../payload + + packages/storage-gcs: + dependencies: + '@google-cloud/storage': + specifier: ^7.7.0 + version: 7.12.1 + '@payloadcms/plugin-cloud-storage': + specifier: workspace:* + version: link:../plugin-cloud-storage + devDependencies: + payload: + specifier: workspace:* + version: link:../payload + + packages/storage-s3: + dependencies: + '@aws-sdk/client-s3': + specifier: ^3.614.0 + version: 3.629.0 + '@aws-sdk/lib-storage': + specifier: ^3.614.0 + version: 3.629.0(@aws-sdk/client-s3@3.629.0) + '@payloadcms/plugin-cloud-storage': + specifier: workspace:* + version: link:../plugin-cloud-storage + devDependencies: + payload: + specifier: workspace:* + version: link:../payload + + packages/storage-uploadthing: + dependencies: + '@payloadcms/plugin-cloud-storage': + specifier: workspace:* + version: link:../plugin-cloud-storage + uploadthing: + specifier: ^6.10.1 + version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) + devDependencies: + payload: + specifier: workspace:* + version: link:../payload + + packages/storage-vercel-blob: + dependencies: + '@payloadcms/plugin-cloud-storage': + specifier: workspace:* + version: link:../plugin-cloud-storage + '@vercel/blob': + specifier: ^0.22.3 + version: 0.22.3 + devDependencies: + payload: + specifier: workspace:* + version: link:../payload + + packages/translations: + dependencies: + date-fns: + specifier: 3.3.1 + version: 3.3.1 + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@swc/core': + specifier: 1.7.10 + version: 1.7.10(@swc/helpers@0.5.12) + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + dotenv: + specifier: 16.4.5 + version: 16.4.5 + prettier: + specifier: 3.3.3 + version: 3.3.3 + typescript: + specifier: 5.5.4 + version: 5.5.4 + + packages/ui: + dependencies: + '@dnd-kit/core': + specifier: 6.0.8 + version: 6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@dnd-kit/sortable': + specifier: 7.0.2 + version: 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@faceless-ui/modal': + specifier: 3.0.0-beta.2 + version: 3.0.0-beta.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@faceless-ui/scroll-info': + specifier: 2.0.0-beta.0 + version: 2.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@faceless-ui/window-info': + specifier: 3.0.0-beta.0 + version: 3.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@monaco-editor/react': + specifier: 4.6.0 + version: 4.6.0(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@payloadcms/translations': + specifier: workspace:* + version: link:../translations + body-scroll-lock: + specifier: 4.0.0-beta.0 + version: 4.0.0-beta.0 + bson-objectid: + specifier: 2.0.4 + version: 2.0.4 + date-fns: + specifier: 3.3.1 + version: 3.3.1 + dequal: + specifier: 2.0.3 + version: 2.0.3 + md5: + specifier: 2.3.0 + version: 2.3.0 + next: + specifier: ^15.0.0-canary.104 + version: 15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + object-to-formdata: + specifier: 4.5.1 + version: 4.5.1 + qs-esm: + specifier: 7.0.2 + version: 7.0.2 + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-animate-height: + specifier: 2.1.2 + version: 2.1.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + react-datepicker: + specifier: 6.9.0 + version: 6.9.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-image-crop: + specifier: 10.1.8 + version: 10.1.8(react@19.0.0-rc-06d0b89e-20240801) + react-select: + specifier: 5.8.0 + version: 5.8.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + scheduler: + specifier: 0.25.0-rc-f994737d14-20240522 + version: 0.25.0-rc-f994737d14-20240522 + sonner: + specifier: ^1.5.0 + version: 1.5.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + ts-essentials: + specifier: 7.0.3 + version: 7.0.3(typescript@5.5.4) + use-context-selector: + specifier: 2.0.0 + version: 2.0.0(react@19.0.0-rc-06d0b89e-20240801)(scheduler@0.25.0-rc-f994737d14-20240522) + uuid: + specifier: 10.0.0 + version: 10.0.0 + devDependencies: + '@babel/cli': + specifier: ^7.24.5 + version: 7.24.8(@babel/core@7.25.2) + '@babel/core': + specifier: ^7.24.5 + version: 7.25.2 + '@babel/preset-env': + specifier: ^7.24.5 + version: 7.25.3(@babel/core@7.25.2) + '@babel/preset-react': + specifier: ^7.24.1 + version: 7.24.7(@babel/core@7.25.2) + '@babel/preset-typescript': + specifier: ^7.24.1 + version: 7.24.7(@babel/core@7.25.2) + '@hyrious/esbuild-plugin-commonjs': + specifier: ^0.2.4 + version: 0.2.4(cjs-module-lexer@1.3.1)(esbuild@0.23.1) + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/body-scroll-lock': + specifier: ^3.1.0 + version: 3.1.2 + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-datepicker': + specifier: 6.2.0 + version: 6.2.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + '@types/uuid': + specifier: 10.0.0 + version: 10.0.0 + babel-plugin-react-compiler: + specifier: 0.0.0-experimental-48eb8f4-20240822 + version: 0.0.0-experimental-48eb8f4-20240822 + esbuild: + specifier: 0.23.1 + version: 0.23.1 + esbuild-sass-plugin: + specifier: 3.3.1 + version: 3.3.1(esbuild@0.23.1)(sass-embedded@1.77.8) + eslint-plugin-react-compiler: + specifier: 0.0.0-experimental-72f06b2-20240822 + version: 0.0.0-experimental-72f06b2-20240822(eslint@9.9.1(jiti@1.21.6)) + payload: + specifier: workspace:* + version: link:../payload + + test: + devDependencies: + '@aws-sdk/client-s3': + specifier: ^3.614.0 + version: 3.629.0 + '@lexical/headless': + specifier: 0.17.0 + version: 0.17.0 + '@lexical/markdown': + specifier: 0.17.0 + version: 0.17.0 + '@payloadcms/db-mongodb': + specifier: workspace:* + version: link:../packages/db-mongodb + '@payloadcms/db-postgres': + specifier: workspace:* + version: link:../packages/db-postgres + '@payloadcms/db-sqlite': + specifier: workspace:* + version: link:../packages/db-sqlite + '@payloadcms/db-vercel-postgres': + specifier: workspace:* + version: link:../packages/db-vercel-postgres + '@payloadcms/drizzle': + specifier: workspace:* + version: link:../packages/drizzle + '@payloadcms/email-nodemailer': + specifier: workspace:* + version: link:../packages/email-nodemailer + '@payloadcms/email-resend': + specifier: workspace:* + version: link:../packages/email-resend + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../packages/eslint-config + '@payloadcms/eslint-plugin': + specifier: workspace:* + version: link:../packages/eslint-plugin + '@payloadcms/graphql': + specifier: workspace:* + version: link:../packages/graphql + '@payloadcms/live-preview': + specifier: workspace:* + version: link:../packages/live-preview + '@payloadcms/live-preview-react': + specifier: workspace:* + version: link:../packages/live-preview-react + '@payloadcms/next': + specifier: workspace:* + version: link:../packages/next + '@payloadcms/plugin-cloud': + specifier: workspace:* + version: link:../packages/plugin-cloud + '@payloadcms/plugin-cloud-storage': + specifier: workspace:* + version: link:../packages/plugin-cloud-storage + '@payloadcms/plugin-form-builder': + specifier: workspace:* + version: link:../packages/plugin-form-builder + '@payloadcms/plugin-nested-docs': + specifier: workspace:* + version: link:../packages/plugin-nested-docs + '@payloadcms/plugin-redirects': + specifier: workspace:* + version: link:../packages/plugin-redirects + '@payloadcms/plugin-search': + specifier: workspace:* + version: link:../packages/plugin-search + '@payloadcms/plugin-sentry': + specifier: workspace:* + version: link:../packages/plugin-sentry + '@payloadcms/plugin-seo': + specifier: workspace:* + version: link:../packages/plugin-seo + '@payloadcms/plugin-stripe': + specifier: workspace:* + version: link:../packages/plugin-stripe + '@payloadcms/richtext-lexical': + specifier: workspace:* + version: link:../packages/richtext-lexical + '@payloadcms/richtext-slate': + specifier: workspace:* + version: link:../packages/richtext-slate + '@payloadcms/storage-azure': + specifier: workspace:* + version: link:../packages/storage-azure + '@payloadcms/storage-gcs': + specifier: workspace:* + version: link:../packages/storage-gcs + '@payloadcms/storage-s3': + specifier: workspace:* + version: link:../packages/storage-s3 + '@payloadcms/storage-uploadthing': + specifier: workspace:* + version: link:../packages/storage-uploadthing + '@payloadcms/storage-vercel-blob': + specifier: workspace:* + version: link:../packages/storage-vercel-blob + '@payloadcms/translations': + specifier: workspace:* + version: link:../packages/translations + '@payloadcms/ui': + specifier: workspace:* + version: link:../packages/ui + '@sentry/react': + specifier: ^7.77.0 + version: 7.118.0(react@19.0.0-rc-06d0b89e-20240801) + '@types/react': + specifier: npm:types-react@19.0.0-rc.0 + version: types-react@19.0.0-rc.0 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.0 + version: types-react-dom@19.0.0-rc.0 + babel-plugin-react-compiler: + specifier: 0.0.0-experimental-48eb8f4-20240822 + version: 0.0.0-experimental-48eb8f4-20240822 + comment-json: + specifier: ^4.2.3 + version: 4.2.5 + create-payload-app: + specifier: workspace:* + version: link:../packages/create-payload-app + dotenv: + specifier: 16.4.5 + version: 16.4.5 + drizzle-kit: + specifier: 0.23.2-df9e596 + version: 0.23.2-df9e596 + eslint-plugin-playwright: + specifier: 1.6.2 + version: 1.6.2(eslint-plugin-jest@28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)) + execa: + specifier: 5.1.1 + version: 5.1.1 + file-type: + specifier: 17.1.6 + version: 17.1.6 + http-status: + specifier: 1.6.2 + version: 1.6.2 + jwt-decode: + specifier: 4.0.0 + version: 4.0.0 + lexical: + specifier: 0.17.0 + version: 0.17.0 + next: + specifier: 15.0.0-canary.104 + version: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + payload: + specifier: workspace:* + version: link:../packages/payload + qs-esm: + specifier: 7.0.2 + version: 7.0.2 + react: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801 + react-dom: + specifier: 19.0.0-rc-06d0b89e-20240801 + version: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + server-only: + specifier: ^0.0.1 + version: 0.0.1 + slate: + specifier: 0.91.4 + version: 0.91.4 + tempy: + specifier: ^1.0.1 + version: 1.0.1 + ts-essentials: + specifier: 7.0.3 + version: 7.0.3(typescript@5.5.4) + typescript: + specifier: 5.5.4 + version: 5.5.4 + uploadthing: + specifier: ^6.10.1 + version: 6.13.2(express@4.19.2)(next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)) + uuid: + specifier: 10.0.0 + version: 10.0.0 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@apidevtools/json-schema-ref-parser@11.7.0': + resolution: {integrity: sha512-pRrmXMCwnmrkS3MLgAIW5dXRzeTv6GLjkjb4HmxNnvAKXN1Nfzp4KmGADBQvlVUcqi+a5D+hfGDLLnd5NnYxog==} + engines: {node: '>= 16'} + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@1.2.2': + resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@1.2.2': + resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-cognito-identity@3.629.0': + resolution: {integrity: sha512-bWwp3f8XLCQgXmSWqDMjIb4WHWaEgMEX5D/WLAq7FHMiikdeJgpZIhWcDV05nEW/f9wGS6cxT3ZyXc/PRXMWrQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-s3@3.629.0': + resolution: {integrity: sha512-Q0YXKdUA7NboPl94JOKD4clHHuERG1Kwy0JPbU+3Hvmz/UuwUGBmlfaRAqd9y4LXsTv/2xKtFPW9R+nBfy9mwA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso-oidc@3.629.0': + resolution: {integrity: sha512-3if0LauNJPqubGYf8vnlkp+B3yAeKRuRNxfNbHlE6l510xWGcKK/ZsEmiFmfePzKKSRrDh/cxMFMScgOrXptNg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.629.0 + + '@aws-sdk/client-sso@3.629.0': + resolution: {integrity: sha512-2w8xU4O0Grca5HmT2dXZ5fF0g39RxODtmoqHJDsK5DSt750LqDG4w3ktmBvQs3+SrpkkJOjlX5v/hb2PCxVbww==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sts@3.629.0': + resolution: {integrity: sha512-RjOs371YwnSVGxhPjuluJKaxl4gcPYTAky0nPjwBime0i9/iS9nI8R8l5j7k7ec9tpFWjBPvNnThCU07pvjdzw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/core@3.629.0': + resolution: {integrity: sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.629.0': + resolution: {integrity: sha512-Cdq7Q0OGdze0/GWClJMcyQRfQmZFryxDIHVFP1FVoQPeKucHU5ZFVPEs+U4UOfs7XquG/+NYCX/jTPdI4ATfgQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-env@3.620.1': + resolution: {integrity: sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-http@3.622.0': + resolution: {integrity: sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-ini@3.629.0': + resolution: {integrity: sha512-r9fI7BABARvVDp77DBUImQzYdvarAIdhbvpCEZib0rlpvfWu3zxE9KZcapCAAi0MPjxeDfb7RMehFQIkAP7mYw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.629.0 + + '@aws-sdk/credential-provider-node@3.629.0': + resolution: {integrity: sha512-868hnVOLlXOBHk91Rl0jZIRgr/M4WJCa0nOrW9A9yidsQxuZp9P0vshDmm4hMvNZadmPIfo0Rra2MpA4RELoCw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-process@3.620.1': + resolution: {integrity: sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-sso@3.629.0': + resolution: {integrity: sha512-Lf4XOuj6jamxgGZGrVojERh5S+NS2t2S4CUOnAu6tJ5U0GPlpjhINUKlcVxJBpsIXudMGW1nkumAd3+kazCPig==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.621.0': + resolution: {integrity: sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.621.0 + + '@aws-sdk/credential-providers@3.630.0': + resolution: {integrity: sha512-fuF/lAZ5pj0DooT8wA1lcrR8vtzBNdTHA5dAmmV930eDoT5XZ+/NeQnclWds40xGj2KDi5YEhuMwOqEZqEQ0Aw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/lib-storage@3.629.0': + resolution: {integrity: sha512-o7gyawMHSeDKCiMLPArr5nR0bf6wM/lH9+wzCxmBkRQMvrHcUfbHMrzughcQACHEQJqna+uxby2zk2KjSAbRmA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-s3': ^3.629.0 + + '@aws-sdk/middleware-bucket-endpoint@3.620.0': + resolution: {integrity: sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-expect-continue@3.620.0': + resolution: {integrity: sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.620.0': + resolution: {integrity: sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-host-header@3.620.0': + resolution: {integrity: sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-location-constraint@3.609.0': + resolution: {integrity: sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-logger@3.609.0': + resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.620.0': + resolution: {integrity: sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.629.0': + resolution: {integrity: sha512-FRXLcnPWXBoq/T9mnGnrpqhrSKNSm22rqJ0L7P14KESmbGuwhF/7ELYYxXIpgnIpb/CIUVmIU5EE8lsW1VTe8A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-ssec@3.609.0': + resolution: {integrity: sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-user-agent@3.620.0': + resolution: {integrity: sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/region-config-resolver@3.614.0': + resolution: {integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.629.0': + resolution: {integrity: sha512-GPX6dnmuLGDFp7CsGqGCzleEoNyr9ekgOzSBtcL5nKX++NruxO7f1QzJAbcYvz0gdKvz958UO0EKsGM6hnkTSg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/token-providers@3.614.0': + resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.614.0 + + '@aws-sdk/types@3.609.0': + resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-arn-parser@3.568.0': + resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-endpoints@3.614.0': + resolution: {integrity: sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-locate-window@3.568.0': + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-user-agent-browser@3.609.0': + resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==} + + '@aws-sdk/util-user-agent-node@3.614.0': + resolution: {integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/util-utf8-browser@3.259.0': + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + + '@aws-sdk/xml-builder@3.609.0': + resolution: {integrity: sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==} + engines: {node: '>=16.0.0'} + + '@azure/abort-controller@1.1.0': + resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} + engines: {node: '>=12.0.0'} + + '@azure/abort-controller@2.1.2': + resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} + engines: {node: '>=18.0.0'} + + '@azure/core-auth@1.7.2': + resolution: {integrity: sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==} + engines: {node: '>=18.0.0'} + + '@azure/core-client@1.9.2': + resolution: {integrity: sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==} + engines: {node: '>=18.0.0'} + + '@azure/core-http-compat@2.1.2': + resolution: {integrity: sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==} + engines: {node: '>=18.0.0'} + + '@azure/core-lro@2.7.2': + resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} + engines: {node: '>=18.0.0'} + + '@azure/core-paging@1.6.2': + resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} + engines: {node: '>=18.0.0'} + + '@azure/core-rest-pipeline@1.16.3': + resolution: {integrity: sha512-VxLk4AHLyqcHsfKe4MZ6IQ+D+ShuByy+RfStKfSjxJoL3WBWq17VNmrz8aT8etKzqc2nAeIyLxScjpzsS4fz8w==} + engines: {node: '>=18.0.0'} + + '@azure/core-tracing@1.1.2': + resolution: {integrity: sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==} + engines: {node: '>=18.0.0'} + + '@azure/core-util@1.9.2': + resolution: {integrity: sha512-l1Qrqhi4x1aekkV+OlcqsJa4AnAkj5p0JV8omgwjaV9OAbP41lvrMvs+CptfetKkeEaGRGSzby7sjPZEX7+kkQ==} + engines: {node: '>=18.0.0'} + + '@azure/core-xml@1.4.3': + resolution: {integrity: sha512-D6G7FEmDiTctPKuWegX2WTrS1enKZwqYwdKTO6ZN6JMigcCehlT0/CYl+zWpI9vQ9frwwp7GQT3/owaEXgnOsA==} + engines: {node: '>=18.0.0'} + + '@azure/logger@1.1.4': + resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} + engines: {node: '>=18.0.0'} + + '@azure/storage-blob@12.24.0': + resolution: {integrity: sha512-l8cmWM4C7RoNCBOImoFMxhTXe1Lr+8uQ/IgnhRNMpfoA9bAFWoLG4XrWm6O5rKXortreVQuD+fc1hbzWklOZbw==} + engines: {node: '>=18.0.0'} + + '@babel/cli@7.24.8': + resolution: {integrity: sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.2': + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.2.0': + resolution: {integrity: sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==} + + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.0': + resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.25.2': + resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.24.8': + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.0': + resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.25.0': + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.0': + resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3': + resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0': + resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0': + resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0': + resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-methods@7.18.6': + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.24.7': + resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.24.7': + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.24.7': + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.25.0': + resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.24.7': + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.24.7': + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.25.0': + resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.24.7': + resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.24.7': + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.0': + resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.24.7': + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.24.8': + resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.24.7': + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.24.7': + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0': + resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.24.7': + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.24.7': + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.24.7': + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.24.7': + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.25.1': + resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.24.7': + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.25.2': + resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7': + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.24.7': + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.24.7': + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.8': + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.0': + resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.24.7': + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.24.7': + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.24.7': + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.24.7': + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.24.7': + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.24.7': + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.24.8': + resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.24.7': + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.24.7': + resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.24.7': + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.24.7': + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.24.7': + resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.24.7': + resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.25.2': + resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.24.7': + resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.24.7': + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-reserved-words@7.24.7': + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.24.7': + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.24.7': + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.24.7': + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.24.7': + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.24.8': + resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.2': + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.24.7': + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.24.7': + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.24.7': + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.24.7': + resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.25.3': + resolution: {integrity: sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.24.7': + resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.24.7': + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.3': + resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@bufbuild/protobuf@1.10.0': + resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==} + + '@clack/core@0.3.4': + resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} + + '@clack/prompts@0.7.0': + resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} + bundledDependencies: + - is-unicode-supported + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@dnd-kit/accessibility@3.1.0': + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + '@dnd-kit/core@6.0.8': + resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + '@dnd-kit/sortable@7.0.2': + resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} + peerDependencies: + '@dnd-kit/core': ^6.0.7 + react: 19.0.0-rc-06d0b89e-20240801 + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + '@drizzle-team/brocli@0.8.2': + resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==} + + '@effect/schema@0.68.12': + resolution: {integrity: sha512-UWJsFXzeYTBQYnftwI1KR2uaxIZ8fk+kffDS7BnJwnGjPPgODq3/AzeoBDSu1MAlnwBKOz+QRdMuSMxrT/pHig==} + peerDependencies: + effect: ^3.4.5 + + '@emnapi/core@1.2.0': + resolution: {integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==} + + '@emnapi/runtime@1.2.0': + resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + + '@emnapi/wasi-threads@1.0.1': + resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + + '@emotion/babel-plugin@11.12.0': + resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + + '@emotion/cache@11.13.1': + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + + '@emotion/css@11.13.0': + resolution: {integrity: sha512-BUk99ylT+YHl+W/HN7nv1RCTkDYmKKqa1qbvM/qLSQEg61gipuBF5Hptk/2/ERmX2DCv0ccuFGhz9i0KSZOqPg==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.13.0': + resolution: {integrity: sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==} + peerDependencies: + '@types/react': '*' + react: 19.0.0-rc-06d0b89e-20240801 + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.0': + resolution: {integrity: sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.9.0': + resolution: {integrity: sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0': + resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + '@emotion/utils@1.4.0': + resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint-react/ast@1.12.3': + resolution: {integrity: sha512-3uRe9EBiaLpyzHKyhvm4ZXGo3h+hp9kvhRBE6mjU5up2RmUkD4qtaTVwKoHrYECADNSvzBtwHH2URARXKQ7oHg==} + + '@eslint-react/core@1.12.3': + resolution: {integrity: sha512-MKwkzrgouFyxdI01GzHY1iifK0KPeGnThqHiRc+IGk+Dgg/8Rq2T0glUx+15J10hRbIg1bl4Cja12R/dv4R9jA==} + + '@eslint-react/eslint-plugin@1.12.3': + resolution: {integrity: sha512-S9Y3mdvbZLKH5ah1LHvAiSd9tc8ijzKjAENMPvfW5WWzyfs6+oRfUrmlrJS3u4k16Fi6zweIlV5hk7gjaFWniQ==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: 5.5.4 + peerDependenciesMeta: + typescript: + optional: true + + '@eslint-react/jsx@1.12.3': + resolution: {integrity: sha512-aKuJRjcwEPUbeAXu7VLKICFeVZk/NhbeQIwIRdjw0JAmfNtEO5QD2wqWDZLCb4+f1moR2W3+QD8e9t0opo70QQ==} + + '@eslint-react/shared@1.12.3': + resolution: {integrity: sha512-4zBS9ISXbb/1OM6W0x5FH2Bu2+ULmfWLQRGc3GFcWiIcHMVBB4bQGK8CsYAcxSIUxaERh3PgPKMx4aZDwBNIhQ==} + + '@eslint-react/tools@1.12.3': + resolution: {integrity: sha512-Q5HRbzY0lkJwdeatPkFsPgmBhP9KPGaVxtRKazsGcCO3edg2wTJP0C8khw2fplaIAce+Tj3I3YasUlp1uKQeCw==} + + '@eslint-react/types@1.12.3': + resolution: {integrity: sha512-Ph6vXLz/NDeGE0/EvDTfWOrqtlE/qLcMhITCdt+ynGOP0HtRn1E8jrEZ0zTH6ri8wng6tlSHEPDnsZMNwe4hOg==} + + '@eslint-react/var@1.12.3': + resolution: {integrity: sha512-K9lBA5Ap3bFfH2OxcpZYyK7HieWmJOtyjAmvC2E2StsPcQlBci+ID82xQEqrPvdL1qdRYWKpSzvSd8Xu4cJf/w==} + + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.9.1': + resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@faceless-ui/modal@3.0.0-beta.2': + resolution: {integrity: sha512-UmXvz7Iw3KMO4Pm3llZczU4uc5pPQDb6rdqwoBvYDFgWvkraOAHKx0HxSZgwqQvqOhn8joEFBfFp6/Do2562ow==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + '@faceless-ui/scroll-info@2.0.0-beta.0': + resolution: {integrity: sha512-pUBhQP8vduA7rVndNsjhaCcds1BykA/Q4iV23JWijU6ZFL/M3Fm9P3ypDS+0VVxolqemNhw8S3FXPwZGgjH4Rw==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + '@faceless-ui/window-info@3.0.0-beta.0': + resolution: {integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@floating-ui/core@1.6.7': + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + + '@floating-ui/react-dom@2.1.1': + resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + '@floating-ui/react@0.26.22': + resolution: {integrity: sha512-LNv4azPt8SpT4WW7Kku5JNVjLk2GcS0bGGjFTAgqOONRFo9r/aaGHHPpdiIuQbB1t8shmWyWqTTUDmZ9fcNshg==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + + '@google-cloud/paginator@5.0.2': + resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} + engines: {node: '>=14.0.0'} + + '@google-cloud/projectify@4.0.0': + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/promisify@4.0.0': + resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} + engines: {node: '>=14'} + + '@google-cloud/storage@7.12.1': + resolution: {integrity: sha512-Z3ZzOnF3YKLuvpkvF+TjQ6lztxcAyTILp+FjKonmVpEwPa9vFvxpZjubLR4sB6bf19i/8HL2AXRjA0YFgHFRmQ==} + engines: {node: '>=14'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} + + '@hyrious/esbuild-plugin-commonjs@0.2.4': + resolution: {integrity: sha512-NKR8bsDbNP7EpM//cjoo8Bpihmc97gPpnwrggG+18iSGow6oaJpfmy3Bv+oBgPkPlxcGzC9SXh+6szoCoKFvCw==} + engines: {node: '>=14'} + peerDependencies: + cjs-module-lexer: '*' + esbuild: '*' + peerDependenciesMeta: + cjs-module-lexer: + optional: true + + '@img/sharp-darwin-arm64@0.33.4': + resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.4': + resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.2': + resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.2': + resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.2': + resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.2': + resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.2': + resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.2': + resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.2': + resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.4': + resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.4': + resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.4': + resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} + engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.4': + resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.4': + resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.4': + resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.4': + resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.4': + resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.4': + resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/create-cache-key-function@29.7.0': + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@24.9.0': + resolution: {integrity: sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==} + engines: {node: '>= 6'} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@lexical/clipboard@0.17.0': + resolution: {integrity: sha512-wYtC6VJhuSxUZc69VTU+vBgzB4HQqhve2hLrr3v+3tR2aimx3KnKphCCP1TexCntxpEnOTPXafEgpOW/EVQE+Q==} + + '@lexical/code@0.17.0': + resolution: {integrity: sha512-8zrgHzf27aYySfUVeSKw8YP/LkRlXHSwD03BKlkSZAb4HX/WC60SGmdXUhtyTIBucqe0pnuGsRYfR9euD0/tfw==} + + '@lexical/devtools-core@0.17.0': + resolution: {integrity: sha512-0ftqWsoCb96oTc8Ok+uvjGAXZpsN9oc6ml3d46BdufdZyxHXC4qU3YVoPfLkgAHzH+4fQlNypu7u3Ym3dZ2rJg==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + '@lexical/dragon@0.17.0': + resolution: {integrity: sha512-XSsrHVwhjBIVF9VN9MFm6Go8fquj5H/jlYuyNzemHq0tOli8NaoSovGc5q0LwXr88RPsuIt1jluazR7Q1+kxTQ==} + + '@lexical/eslint-plugin@0.17.0': + resolution: {integrity: sha512-O6RyQBXAdi90jlthWwfOuxYG4zqzWkpNwsX1V6N8t5iH80Te04LsnfG+hIB/5V8rxm8WPkTjMrqAX3UEZy5Shg==} + peerDependencies: + eslint: '>=7.31.0 || ^8.0.0' + + '@lexical/hashtag@0.17.0': + resolution: {integrity: sha512-E6nSoz9haB6JypQtYxG5OYr36AHgam/FBMu77OWNl1KsJbkP8nInm+P22QFsNnEvs4Hk6/0FJ5g42+lTEnGmIg==} + + '@lexical/headless@0.17.0': + resolution: {integrity: sha512-yKvXcq2F6S1lwDLcwv+bHht/al1LcFmidPT3rjISRxLX+/YjUcUT8MmvV773Du4piV4rFPbVlBPFBZfHJkDxXw==} + + '@lexical/history@0.17.0': + resolution: {integrity: sha512-SfeUKAXf9pZpqee9rMOTt33V0J0p/AS9TZLT9Un9dU6wAaHfv6NFax1ND0JoG1a9YkTc539mufxVLNjsNRc0ag==} + + '@lexical/html@0.17.0': + resolution: {integrity: sha512-sI458CEP/j+Gd2YEo1+vTax31ZAjdq5jmRJMgSKxzKlkVYAUY9eH5u3Y3awPLwLVXJHiIopMX02GeZytibuTiw==} + + '@lexical/link@0.17.0': + resolution: {integrity: sha512-Kux6yvPit6y0ksPpwimv3seVrXAsggkqB6oT6oAVBaDpYuygVEwNDqg/rCTtB3mHQ4eeuU33mdK7MSXZ34bZRQ==} + + '@lexical/list@0.17.0': + resolution: {integrity: sha512-anDuSUykTv+lqyCwl1m+sThrB15OKCa00Eo68/d2HQSHDD3KNWgSx709dcR17bD9oT204yOhMJbQGywuzcEyGQ==} + + '@lexical/mark@0.17.0': + resolution: {integrity: sha512-Ynqh9KHXUcB9qLOTGC9s+bbWtawOwRStkeIeAugTqrwckyYWeDaePpyJ6IhBBJy1E1CfpiZn71NDeP+FuRjnXQ==} + + '@lexical/markdown@0.17.0': + resolution: {integrity: sha512-6IuJ2l5p/Ma+VBUIStIRXwTC01GEzx21gvqqywuqBUzAOiMr1oRM+DGsQgrzZrcjX+LzUlZ5ZgjuWtK8XKVAZw==} + + '@lexical/offset@0.17.0': + resolution: {integrity: sha512-onE6SD2mIAwBLTT5v5fVBVtRg/NpQj+o10vTWJ1ImvEUERpSoCyHMTy3IMoSMuCRwuOG9C0cFEret2u+QS8Icw==} + + '@lexical/overflow@0.17.0': + resolution: {integrity: sha512-dh+nQAmeobKvZFodWyzNh1ZjX043Patk/1Lwct9XmtAGMUdXL+tB0bbguWVcDfY8OYu1CTQGfbdq2oMEJYzwsg==} + + '@lexical/plain-text@0.17.0': + resolution: {integrity: sha512-AEk+3ttbRyRi7m9UbU1CdLUtGsXh4FFZkBC12twV3U82lZHOdHocLlTutP+lcbYlGjeq6UF43NxOSGzsYEunsA==} + + '@lexical/react@0.17.0': + resolution: {integrity: sha512-HZ3joq+5g2++2vo/6scTd60Y2bsu8ya8EUdopyudnmGZGKAcAPue9pLOlBaEpsYZ7vqTuGjiPgtEBfFzDy9rlg==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + '@lexical/rich-text@0.17.0': + resolution: {integrity: sha512-XJc8gQBSwppCkESQaNcGtyTaPXZaeCQDcUVpnDjDK0vM/ZZN8TErxbujwbSqA3kO2dBds9N8WxNboSwuncMBcQ==} + + '@lexical/selection@0.17.0': + resolution: {integrity: sha512-UTjlvyhFY/lmHtBaIaVRwYnRfO9gR4I32+PT7vHQr4v3VfcgS63YEGSgEZy3Gh1pfeJqaZATN58+jCuMAQXlWQ==} + + '@lexical/table@0.17.0': + resolution: {integrity: sha512-RQF7IG0rGL2/bPaPFUIMgDA3QMdDflvXSnE7Udgbj9yMqSKhYkaERVfNyoLckDUSuusGJd6XV+qum6JWn0nSNA==} + + '@lexical/text@0.17.0': + resolution: {integrity: sha512-kFH0V6yjW8YswmoY7vHT4zHFDflGfamuUxTPHROpdnq/JMjHeaVwtmFBdrP0gknaC8XMRXdr3EsemQ7cbOoDPA==} + + '@lexical/utils@0.17.0': + resolution: {integrity: sha512-B/n0rRGDmdMrqi2qnprLt6SntC6jb4JItLmPl8zDDdg7/HxMdLq3F93vogeiXQJn0mlNqgiENWHvLAy5K2C2uQ==} + + '@lexical/yjs@0.17.0': + resolution: {integrity: sha512-xJv3frcK/jskssLbzdY4yfBaM7+LWaZD4YjYkJ/bvRDTey2w+McF+SvsJ/yBA8YF1oaL3rT+0aIQJ7rfH+AxjA==} + peerDependencies: + yjs: '>=13.5.22' + + '@libsql/client@0.6.2': + resolution: {integrity: sha512-xRNfRLv/dOCbV4qd+M0baQwGmvuZpMd2wG2UAPs8XmcdaPvu5ErkcaeITkxlm3hDEJVabQM1cFhMBxsugWW9fQ==} + + '@libsql/core@0.6.2': + resolution: {integrity: sha512-c2P4M+4u/4b2L02A0KjggO3UW51rGkhxr/7fzJO0fEAqsqrWGxuNj2YtRkina/oxfYvAof6xjp8RucNoIV/Odw==} + + '@libsql/darwin-arm64@0.3.19': + resolution: {integrity: sha512-rmOqsLcDI65zzxlUOoEiPJLhqmbFsZF6p4UJQ2kMqB+Kc0Rt5/A1OAdOZ/Wo8fQfJWjR1IbkbpEINFioyKf+nQ==} + cpu: [arm64] + os: [darwin] + + '@libsql/darwin-x64@0.3.19': + resolution: {integrity: sha512-q9O55B646zU+644SMmOQL3FIfpmEvdWpRpzubwFc2trsa+zoBlSkHuzU9v/C+UNoPHQVRMP7KQctJ455I/h/xw==} + cpu: [x64] + os: [darwin] + + '@libsql/hrana-client@0.6.2': + resolution: {integrity: sha512-MWxgD7mXLNf9FXXiM0bc90wCjZSpErWKr5mGza7ERy2FJNNMXd7JIOv+DepBA1FQTIfI8TFO4/QDYgaQC0goNw==} + + '@libsql/isomorphic-fetch@0.2.5': + resolution: {integrity: sha512-8s/B2TClEHms2yb+JGpsVRTPBfy1ih/Pq6h6gvyaNcYnMVJvgQRY7wAa8U2nD0dppbCuDU5evTNMEhrQ17ZKKg==} + engines: {node: '>=18.0.0'} + + '@libsql/isomorphic-ws@0.1.5': + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + + '@libsql/linux-arm64-gnu@0.3.19': + resolution: {integrity: sha512-mgeAUU1oqqh57k7I3cQyU6Trpdsdt607eFyEmH5QO7dv303ti+LjUvh1pp21QWV6WX7wZyjeJV1/VzEImB+jRg==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-arm64-musl@0.3.19': + resolution: {integrity: sha512-VEZtxghyK6zwGzU9PHohvNxthruSxBEnRrX7BSL5jQ62tN4n2JNepJ6SdzXp70pdzTfwroOj/eMwiPt94gkVRg==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-x64-gnu@0.3.19': + resolution: {integrity: sha512-2t/J7LD5w2f63wGihEO+0GxfTyYIyLGEvTFEsMO16XI5o7IS9vcSHrxsvAJs4w2Pf907uDjmc7fUfMg6L82BrQ==} + cpu: [x64] + os: [linux] + + '@libsql/linux-x64-musl@0.3.19': + resolution: {integrity: sha512-BLsXyJaL8gZD8+3W2LU08lDEd9MIgGds0yPy5iNPp8tfhXx3pV/Fge2GErN0FC+nzt4DYQtjL+A9GUMglQefXQ==} + cpu: [x64] + os: [linux] + + '@libsql/win32-x64-msvc@0.3.19': + resolution: {integrity: sha512-ay1X9AobE4BpzG0XPw1gplyLZPGHIgJOovvW23gUrukRegiUP62uzhpRbKNogLlUOynyXeq//prHgPXiebUfWg==} + cpu: [x64] + os: [win32] + + '@mole-inc/bin-wrapper@8.0.1': + resolution: {integrity: sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + '@monaco-editor/loader@1.4.0': + resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} + peerDependencies: + monaco-editor: '>= 0.21.0 < 1' + + '@monaco-editor/react@4.6.0': + resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} + peerDependencies: + monaco-editor: '>= 0.25.0 < 1' + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + '@mongodb-js/saslprep@1.1.8': + resolution: {integrity: sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==} + + '@napi-rs/wasm-runtime@0.2.4': + resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + + '@neon-rs/load@0.0.4': + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + + '@neondatabase/serverless@0.9.4': + resolution: {integrity: sha512-D0AXgJh6xkf+XTlsO7iwE2Q1w8981E1cLCPAALMU2YKtkF/1SF6BiAzYARZFYo175ON+b1RNIy9TdSFHm5nteg==} + + '@next/bundle-analyzer@15.0.0-canary.104': + resolution: {integrity: sha512-p/KzdaP6UCqTXm6cAZC6Ae+hJ4LkcdcoJ9qAeQ5UHQikCk4BB05Tt0WROf/agrj0lzX8bdMLluR24FixXffiLQ==} + + '@next/env@15.0.0-canary.104': + resolution: {integrity: sha512-7wOJhe62uL4ViZOumMwuPev4IxQaXJ4g97iMsXelOF+Q5QuuFXzbxIXh4OJMVAHZJMYkM5VyD2zxV66iYU01DQ==} + + '@next/env@15.0.0-rc.0': + resolution: {integrity: sha512-6W0ndQvHR9sXcqcKeR/inD2UTRCs9+VkSK3lfaGmEuZs7EjwwXMO2BPYjz9oBrtfPL3xuTjtXsHKSsalYQ5l1Q==} + + '@next/eslint-plugin-next@15.0.0-canary.104': + resolution: {integrity: sha512-mkvTl0zmSfRDWabHc1NQie9sw8DZHsqBx77jEu+CKaoXRJ2/zLUb29CJL0YHMIIzr/026NI8AFsg1SxrxllUsw==} + + '@next/swc-darwin-arm64@15.0.0-canary.104': + resolution: {integrity: sha512-tLrkGDlVAch+dwLr0lwZt6t//KQhwJQamTt86bFeSEgmuWg8escVD5608XjIicpy4oYUeTG2e7EDjvW1/9C7+Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.0.0-canary.104': + resolution: {integrity: sha512-NokpzlJHGzldMdx5ALJi9w8sZbFVQj3KPjMg1EKutvkX8Z0TgZguoj0Hb+0Dh7o6fBK0CqH1mYQd/IgYeqvYew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.0.0-canary.104': + resolution: {integrity: sha512-U9P1bXaxMyGrY7HdJ1fdtS5vy2yfWF7z1Qt/8OBcZi5y6WWHloZmJ/jRMXxoHJ1lcLSsC1EcubYHgV5ys1NDcA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.0.0-canary.104': + resolution: {integrity: sha512-PDOS3ySD0/YBVvKn/JhQ8xjh4HU4v2MCvqFHaoahu9v1ydmUOeuDRjQk4hUliXgvKuE/ZZksP3a9TrzpbDScsA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.0.0-canary.104': + resolution: {integrity: sha512-jYNKOIkqL4puFpeNjIZ/riK0+adDyjENjACMlU3HyuG7A0xCYAFxBIbmwjbGmpSv99+PPB/gAbGnB0TT2PDHUQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.0.0-canary.104': + resolution: {integrity: sha512-xX3ZUWM4syINdEqsUhvQWBjoFa2P8PL96adQUfph4cpUrkrUbnBQbWA2vSdSvwoC6a80wSX+buuhJptvxzEl3A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.0.0-canary.104': + resolution: {integrity: sha512-kUMeZOhueb5wXZTQTPvdl4V4wtJKh49TcVAHS7kcDTU9m8jrIQ3beKURWtzjD4iizgl/iar8CHuYS5CAnCGqAw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@15.0.0-canary.104': + resolution: {integrity: sha512-6q5HYiACa6GH7+RyTlLMdUlivwi75bw2L9PRYRBuw4C0SvLYMwBf7SlshbrCrNYbIAaGajYJLZjv3IXFnsZBjA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@15.0.0-canary.104': + resolution: {integrity: sha512-OeY5GRHRv5qMPwK2e1ipX+EeTDPmRITM9OBeaeIllubWprLGeLxnC1NbKYKCt6IfCboX+wanZKQcbuyH5RMtlg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@oxc-resolver/binding-darwin-arm64@1.10.2': + resolution: {integrity: sha512-aOCZYXqmFL+2sXlaVkYbAOtICGGeTFtmdul8OimQfOXHJods6YHJ2nR6+rEeBcJzaXyXPP18ne1IsEc4AYL1IA==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@1.10.2': + resolution: {integrity: sha512-6WD7lHGkoduFZfUgnC2suKOlqttQRKxWsiVXiiGPu3mfXvQAhMd/gekuH1t8vOhFlPJduaww15n5UB0bSjCK+w==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@1.10.2': + resolution: {integrity: sha512-nEqHWx/Ot5p7Mafj8qH6vFlLSvHjECxAcZwhnAMqRuQu1NgXC/QM3emkdhVGy7QJgsxZbHpPaF6TERNf5/NL9Q==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@1.10.2': + resolution: {integrity: sha512-+AlZI0fPnpfArh8aC5k2295lmQrxa2p8gBLxC3buvCkz0ZpbVLxyyAXz3J2jGwJnmc5MUPLEqPYw6ZlAGH4XHA==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@1.10.2': + resolution: {integrity: sha512-8fZ8NszFaUZaoA8eUwkF2lHjgUs76aFiewWgG/cjcZmwKp+ErZQLW8eOvIWZ4SohHQ+ScvhVsSaU2PU38c88gw==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-musl@1.10.2': + resolution: {integrity: sha512-oPrLICrw96Ym9n04FWXWGkbkpF6qJtZ57JSnqI3oQ24xHTt4iWyjHKHQO46NbJAK9sFb3Qce4BzV8faDI5Rifg==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@1.10.2': + resolution: {integrity: sha512-eli74jTAUiIfqi8IPFqiPxQS69Alcr6w/IFRyf3XxrkxeFGgcgxJkRIxWNTKJ6T3EXxjuma+49LdZn6l9rEj7A==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@1.10.2': + resolution: {integrity: sha512-HH9zmjNSQo3rkbqJH5nIjGrtjC+QPrUy0KGGMR/oRCSLuD0cNFJ/Uly1XAugwSm4oEw0+rv6PmeclXmVTKsxhw==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-wasm32-wasi@1.10.2': + resolution: {integrity: sha512-3ItX23q33sfVBtMMdMhVDSe0NX5zBHxHfmFiXhSJuwNaVIwGpLFU7WU2nmq9oNdnmTOvjL8vlhOqiGvumBLlRA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@1.10.2': + resolution: {integrity: sha512-aVoj2V+jmQ1N+lVy9AhaLmzssJM0lcKt8D0UL83aNLZJ5lSN7hgBuUXTVmL+VF268f167khjo38z+fbELDVm8Q==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@1.10.2': + resolution: {integrity: sha512-l8BDQWyP0Piw8hlmYPUqTRKLsq+ceG9h+9p6ZrjNzwW9AmJX7T7T2hgoVVHqS6f4WNA/CFkb3RyZP9QTzNkyyA==} + cpu: [x64] + os: [win32] + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.46.0': + resolution: {integrity: sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==} + engines: {node: '>=18'} + hasBin: true + + '@polka/url@1.0.0-next.25': + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + + '@react-email/render@0.0.7': + resolution: {integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==} + engines: {node: '>=16.0.0'} + + '@selderee/plugin-htmlparser2@0.10.0': + resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} + + '@sentry-internal/feedback@7.118.0': + resolution: {integrity: sha512-IYOGRcqIqKJJpMwBBv+0JTu0FPpXnakJYvOx/XEa/SNyF5+l7b9gGEjUVWh1ok50kTLW/XPnpnXNAGQcoKHg+w==} + engines: {node: '>=12'} + + '@sentry-internal/replay-canvas@7.118.0': + resolution: {integrity: sha512-XxHlCClvrxmVKpiZetFYyiBaPQNiojoBGFFVgbbWBIAPc+fWeLJ2BMoQEBjn/0NA/8u8T6lErK5YQo/eIx9+XQ==} + engines: {node: '>=12'} + + '@sentry-internal/tracing@7.118.0': + resolution: {integrity: sha512-dERAshKlQLrBscHSarhHyUeGsu652bDTUN1FK0m4e3X48M3I5/s+0N880Qjpe5MprNLcINlaIgdQ9jkisvxjfw==} + engines: {node: '>=8'} + + '@sentry/browser@7.118.0': + resolution: {integrity: sha512-8onDOFV1VLEoBuqA5yaJeR3FF1JNuxr5C7p1oN3OwY724iTVqQnOLmZKZaSnHV3RkY67wKDGQkQIie14sc+42g==} + engines: {node: '>=8'} + + '@sentry/core@7.118.0': + resolution: {integrity: sha512-ol0xBdp3/K11IMAYSQE0FMxBOOH9hMsb/rjxXWe0hfM5c72CqYWL3ol7voPci0GELJ5CZG+9ImEU1V9r6gK64g==} + engines: {node: '>=8'} + + '@sentry/integrations@7.118.0': + resolution: {integrity: sha512-C2rR4NvIMjokF8jP5qzSf1o2zxDx7IeYnr8u15Kb2+HdZtX559owALR0hfgwnfeElqMhGlJBaKUWZ48lXJMzCQ==} + engines: {node: '>=8'} + + '@sentry/node@7.118.0': + resolution: {integrity: sha512-79N63DvYKkNPqzmc0cjO+vMZ/nU7+CbE3K3COQNiV7gk58+666G9mRZQJuZVOVebatq5wM5UR0G4LPkwD+J84g==} + engines: {node: '>=8'} + + '@sentry/react@7.118.0': + resolution: {integrity: sha512-oEYe5TGk8S7YzPsFqDf4xDHjfzs35/QFE+dou3S2d24OYpso8Tq4C5f1VzYmnOOyy85T7JNicYLSo0n0NSJvQg==} + engines: {node: '>=8'} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + '@sentry/replay@7.118.0': + resolution: {integrity: sha512-boQfCL+1L/tSZ9Huwi00+VtU+Ih1Lcg8HtxBuAsBCJR9pQgUL5jp7ECYdTeeHyCh/RJO7JqV1CEoGTgohe10mA==} + engines: {node: '>=12'} + + '@sentry/types@7.118.0': + resolution: {integrity: sha512-2drqrD2+6kgeg+W/ycmiti3G4lJrV3hGjY9PpJ3bJeXrh6T2+LxKPzlgSEnKFaeQWkXdZ4eaUbtTXVebMjb5JA==} + engines: {node: '>=8'} + + '@sentry/utils@7.118.0': + resolution: {integrity: sha512-43qItc/ydxZV1Zb3Kn2M54RwL9XXFa3IAYBO8S82Qvq5YUYmU2AmJ1jgg7DabXlVSWgMA1HntwqnOV3JLaEnTQ==} + engines: {node: '>=8'} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sindresorhus/slugify@1.1.2': + resolution: {integrity: sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==} + engines: {node: '>=10'} + + '@sindresorhus/transliterate@0.1.2': + resolution: {integrity: sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==} + engines: {node: '>=10'} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@smithy/abort-controller@3.1.1': + resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} + engines: {node: '>=16.0.0'} + + '@smithy/chunked-blob-reader-native@3.0.0': + resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==} + + '@smithy/chunked-blob-reader@3.0.0': + resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} + + '@smithy/config-resolver@3.0.5': + resolution: {integrity: sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==} + engines: {node: '>=16.0.0'} + + '@smithy/core@2.3.2': + resolution: {integrity: sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==} + engines: {node: '>=16.0.0'} + + '@smithy/credential-provider-imds@3.2.0': + resolution: {integrity: sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-codec@3.1.2': + resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==} + + '@smithy/eventstream-serde-browser@3.0.6': + resolution: {integrity: sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-config-resolver@3.0.3': + resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-node@3.0.5': + resolution: {integrity: sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-universal@3.0.5': + resolution: {integrity: sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ==} + engines: {node: '>=16.0.0'} + + '@smithy/fetch-http-handler@3.2.4': + resolution: {integrity: sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==} + + '@smithy/hash-blob-browser@3.1.2': + resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==} + + '@smithy/hash-node@3.0.3': + resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} + engines: {node: '>=16.0.0'} + + '@smithy/hash-stream-node@3.1.2': + resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==} + engines: {node: '>=16.0.0'} + + '@smithy/invalid-dependency@3.0.3': + resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@3.0.0': + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} + + '@smithy/md5-js@3.0.3': + resolution: {integrity: sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==} + + '@smithy/middleware-content-length@3.0.5': + resolution: {integrity: sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-endpoint@3.1.0': + resolution: {integrity: sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-retry@3.0.14': + resolution: {integrity: sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-serde@3.0.3': + resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-stack@3.0.3': + resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} + engines: {node: '>=16.0.0'} + + '@smithy/node-config-provider@3.1.4': + resolution: {integrity: sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==} + engines: {node: '>=16.0.0'} + + '@smithy/node-http-handler@3.1.4': + resolution: {integrity: sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==} + engines: {node: '>=16.0.0'} + + '@smithy/property-provider@3.1.3': + resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} + engines: {node: '>=16.0.0'} + + '@smithy/protocol-http@4.1.0': + resolution: {integrity: sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-builder@3.0.3': + resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-parser@3.0.3': + resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} + engines: {node: '>=16.0.0'} + + '@smithy/service-error-classification@3.0.3': + resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} + engines: {node: '>=16.0.0'} + + '@smithy/shared-ini-file-loader@3.1.4': + resolution: {integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==} + engines: {node: '>=16.0.0'} + + '@smithy/signature-v4@4.1.0': + resolution: {integrity: sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==} + engines: {node: '>=16.0.0'} + + '@smithy/smithy-client@3.1.12': + resolution: {integrity: sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==} + engines: {node: '>=16.0.0'} + + '@smithy/types@3.3.0': + resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} + engines: {node: '>=16.0.0'} + + '@smithy/url-parser@3.0.3': + resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} + + '@smithy/util-base64@3.0.0': + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-body-length-browser@3.0.0': + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + + '@smithy/util-body-length-node@3.0.0': + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@3.0.0': + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-config-provider@3.0.0': + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-defaults-mode-browser@3.0.14': + resolution: {integrity: sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-defaults-mode-node@3.0.14': + resolution: {integrity: sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-endpoints@2.0.5': + resolution: {integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-hex-encoding@3.0.0': + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-middleware@3.0.3': + resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} + engines: {node: '>=16.0.0'} + + '@smithy/util-retry@3.0.3': + resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} + engines: {node: '>=16.0.0'} + + '@smithy/util-stream@3.1.3': + resolution: {integrity: sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==} + engines: {node: '>=16.0.0'} + + '@smithy/util-uri-escape@3.0.0': + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@3.0.0': + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-waiter@3.1.2': + resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} + engines: {node: '>=16.0.0'} + + '@swc-node/core@1.13.3': + resolution: {integrity: sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==} + engines: {node: '>= 10'} + peerDependencies: + '@swc/core': '>= 1.4.13' + '@swc/types': '>= 0.1' + + '@swc-node/register@1.10.9': + resolution: {integrity: sha512-iXy2sjP0phPEpK2yivjRC3PAgoLaT4sjSk0LDWCTdcTBJmR4waEog0E6eJbvoOkLkOtWw37SB8vCkl/bbh4+8A==} + peerDependencies: + '@swc/core': '>= 1.4.13' + typescript: 5.5.4 + + '@swc-node/sourcemap-support@0.5.1': + resolution: {integrity: sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==} + + '@swc/cli@0.4.0': + resolution: {integrity: sha512-4JdVrPtF/4rCMXp6Q1h5I6YkYZrCCcqod7Wk97ZQq7K8vNGzJUryBv4eHCvqx5sJOJBrbYm9fcswe1B0TygNoA==} + engines: {node: '>= 16.14.0'} + hasBin: true + peerDependencies: + '@swc/core': ^1.2.66 + chokidar: ^3.5.1 + peerDependenciesMeta: + chokidar: + optional: true + + '@swc/core-darwin-arm64@1.7.10': + resolution: {integrity: sha512-TYp4x/9w/C/yMU1olK5hTKq/Hi7BjG71UJ4V1U1WxI1JA3uokjQ/GoktDfmH5V5pX4dgGSOJwUe2RjoN8Z/XnA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.7.10': + resolution: {integrity: sha512-P3LJjAWh5yLc6p5IUwV5LgRfA3R1oDCZDMabYyb2BVQuJTD4MfegW9DhBcUUF5dhBLwq3191KpLVzE+dLTbiXw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.7.10': + resolution: {integrity: sha512-yGOFjE7w/akRTmqGY3FvWYrqbxO7OB2N2FHj2LO5HtzXflfoABb5RyRvdEquX+17J6mEpu4EwjYNraTD/WHIEQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.7.10': + resolution: {integrity: sha512-SPWsgWHfdWKKjLrYlvhxcdBJ7Ruy6crJbPoE9NfD95eJEjMnS2yZTqj2ChFsY737WeyhWYlHzgYhYOVCp83YwQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.7.10': + resolution: {integrity: sha512-PUi50bkNqnBL3Z/Zq6jSfwgN9A/taA6u2Zou0tjDJi7oVdpjdr7SxNgCGzMJ/nNg5D/IQn1opM1jktMvpsPAuQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.7.10': + resolution: {integrity: sha512-Sc+pY55gknCAmBQBR6DhlA7jZSxHaLSDb5Sevzi6DOFMXR79NpA6zWTNKwp1GK2AnRIkbAfvYLgOxS5uWTFVpg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.7.10': + resolution: {integrity: sha512-g5NKx2LXaGd0K26hmEts1Cvb7ptIvq3MHSgr6/D1tRPcDZw1Sp0dYsmyOv0ho4F5GOJyiCooG3oE9FXdb7jIpQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.7.10': + resolution: {integrity: sha512-plRIsOcfy9t9Q/ivm5DA7I0HaIvfAWPbI+bvVRrr3C/1K2CSqnqZJjEWOAmx2LiyipijNnEaFYuLBp0IkGuJpg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.7.10': + resolution: {integrity: sha512-GntrVNT23viHtbfzmlK8lfBiKeajH24GzbDT7qXhnoO20suUPcyYZxyvCb4gWM2zu8ZBTPHNlqfrNsriQCZ+lQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.7.10': + resolution: {integrity: sha512-uXIF8GuSappe1imm6Lf7pHGepfCBjDQlS+qTqvEGE0wZAsL1IVATK9P/cH/OCLfJXeQDTLeSYmrpwjtXNt46tQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.7.10': + resolution: {integrity: sha512-l0xrFwBQ9atizhmV94yC2nwcecTk/oftofwMNPiFMGe56dqdmi2ArHaTV3PCtMlgaUH6rGCehoRMt5OrCI1ktg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.12': + resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} + + '@swc/jest@0.2.36': + resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} + engines: {npm: '>= 7.0.0'} + peerDependencies: + '@swc/core': '*' + + '@swc/types@0.1.12': + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/body-scroll-lock@3.1.2': + resolution: {integrity: sha512-ELhtuphE/YbhEcpBf/rIV9Tl3/O0A0gpCVD+oYFSS8bWstHFJUgA4nNw1ZakVlRC38XaQEIsBogUZKWIPBvpfQ==} + + '@types/busboy@1.5.4': + resolution: {integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/caseless@0.12.5': + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/degit@2.8.6': + resolution: {integrity: sha512-y0M7sqzsnHB6cvAeTCBPrCQNQiZe8U4qdzf8uBVmOWYap5MMTN/gB2iEqrIqFiYcsyvP74GnGD5tgsHttielFw==} + + '@types/escape-html@1.0.4': + resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/eslint__js@8.42.3': + resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} + + '@types/esprima@4.0.6': + resolution: {integrity: sha512-lIk+kSt9lGv5hxK6aZNjiUEGZqKmOTpmg0tKiJQI+Ow98fLillxsiZNik5+RcP7mXL929KiTH/D9jGtpDlMbVw==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/find-node-modules@2.1.2': + resolution: {integrity: sha512-5hRcqDclY6MTkHXJBc5q79z5luG+IJRlGR01wluMVMM9lYogYc2sfclXTVU5Edp0Ja4viIOCDI1lXhFRlsNTKA==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/is-hotkey@0.1.10': + resolution: {integrity: sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@1.1.2': + resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/jsdom@20.0.1': + resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/jsonwebtoken@8.5.9': + resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lodash.get@4.4.9': + resolution: {integrity: sha512-J5dvW98sxmGnamqf+/aLP87PYXyrha9xIgc2ZlHl6OHMFR2Ejdxep50QfU0abO1+CH6+ugx+8wEUN1toImAinA==} + + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/minimist@1.2.2': + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/mongoose-aggregate-paginate-v2@1.0.6': + resolution: {integrity: sha512-EXkgB/nJ1x3UcoEk1pD67+uXtijveHZtbg2H3wtZk2SnCFBB5cMw7MQRu9/GgyEP/KKXuWFt1JABv7m+Kls0ug==} + + '@types/node@20.12.5': + resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==} + + '@types/nodemailer@6.4.14': + resolution: {integrity: sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/pg@8.10.2': + resolution: {integrity: sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw==} + + '@types/pg@8.11.6': + resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} + + '@types/pluralize@0.0.33': + resolution: {integrity: sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==} + + '@types/prompts@2.4.9': + resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-datepicker@6.2.0': + resolution: {integrity: sha512-+JtO4Fm97WLkJTH8j8/v3Ldh7JCNRwjMYjRaKh4KHH0M3jJoXtwiD3JBCsdlg3tsFIw9eQSqyAPeVDN2H2oM9Q==} + + '@types/react-transition-group@4.4.11': + resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + + '@types/request@2.48.12': + resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/shelljs@0.8.15': + resolution: {integrity: sha512-vzmnCHl6hViPu9GNLQJ+DZFd6BQI2DBTUeOvYHqkWQLMfKAAQYMb/xAmZkTogZI/vqXHCWkqDRymDI5p0QTi5Q==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/to-snake-case@1.0.0': + resolution: {integrity: sha512-9YtLP+wuIL2EwOqyUjwTzWK6CGVnsP13vJ3i0U8S7O+SLAxrsi1jwC2TkHkdqVqfGLQWnk5H+Z+sSPT7SJeGYg==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@8.2.2': + resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} + + '@types/ws@8.5.12': + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@13.0.12': + resolution: {integrity: sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@typescript-eslint/eslint-plugin@8.3.0': + resolution: {integrity: sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.3.0': + resolution: {integrity: sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.3.0': + resolution: {integrity: sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.3.0': + resolution: {integrity: sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.3.0': + resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.3.0': + resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.3.0': + resolution: {integrity: sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/visitor-keys@8.3.0': + resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@uploadthing/mime-types@0.2.10': + resolution: {integrity: sha512-kz3F0oEgAyts25NAGXlUBCWh3mXonbSOQJFGFMawHuIgbUbnzXbe4w5WI+0XdneCbjNmikfWrdWrs8m/7HATfQ==} + + '@uploadthing/shared@6.7.8': + resolution: {integrity: sha512-dLNa9GpdeiCHc/Nd0+BfaJ3wXvWIztBAaWIsNNPoaKiU3qhHoQd+5jDVx4oYKYVANqnv9s2CJW7di8Th5xy7Cw==} + + '@vercel/blob@0.22.3': + resolution: {integrity: sha512-l0t2KhbOO/I8ZNOl9zypYf1NE0837aO4/CPQNGR/RAxtj8FpdYKjhyUADUXj2gERLQmnhun+teaVs/G7vZJ/TQ==} + engines: {node: '>=16.14'} + + '@vercel/postgres@0.9.0': + resolution: {integrity: sha512-WiI2g3+ce2g1u1gP41MoDj2DsMuQQ+us7vHobysRixKECGaLHpfTI7DuVZmHU087ozRAGr3GocSyqmWLLo+fig==} + engines: {node: '>=14.6'} + + '@vue/compiler-core@3.4.37': + resolution: {integrity: sha512-ZDDT/KiLKuCRXyzWecNzC5vTcubGz4LECAtfGPENpo0nrmqJHwuWtRLxk/Sb9RAKtR9iFflFycbkjkY+W/PZUQ==} + + '@vue/compiler-dom@3.4.37': + resolution: {integrity: sha512-rIiSmL3YrntvgYV84rekAtU/xfogMUJIclUMeIKEtVBFngOL3IeZHhsH3UaFEgB5iFGpj6IW+8YuM/2Up+vVag==} + + '@vue/compiler-sfc@3.4.37': + resolution: {integrity: sha512-vCfetdas40Wk9aK/WWf8XcVESffsbNkBQwS5t13Y/PcfqKfIwJX2gF+82th6dOpnpbptNMlMjAny80li7TaCIg==} + + '@vue/compiler-ssr@3.4.37': + resolution: {integrity: sha512-TyAgYBWrHlFrt4qpdACh8e9Ms6C/AZQ6A6xLJaWrCL8GCX5DxMzxyeFAEMfU/VFr4tylHm+a2NpfJpcd7+20XA==} + + '@vue/reactivity@3.4.37': + resolution: {integrity: sha512-UmdKXGx0BZ5kkxPqQr3PK3tElz6adTey4307NzZ3whZu19i5VavYal7u2FfOmAzlcDVgE8+X0HZ2LxLb/jgbYw==} + + '@vue/runtime-core@3.4.37': + resolution: {integrity: sha512-MNjrVoLV/sirHZoD7QAilU1Ifs7m/KJv4/84QVbE6nyAZGQNVOa1HGxaOzp9YqCG+GpLt1hNDC4RbH+KtanV7w==} + + '@vue/runtime-dom@3.4.37': + resolution: {integrity: sha512-Mg2EwgGZqtwKrqdL/FKMF2NEaOHuH+Ks9TQn3DHKyX//hQTYOun+7Tqp1eo0P4Ds+SjltZshOSRq6VsU0baaNg==} + + '@vue/server-renderer@3.4.37': + resolution: {integrity: sha512-jZ5FAHDR2KBq2FsRUJW6GKDOAG9lUTX8aBEGq4Vf6B/35I9fPce66BornuwmqmKgfiSlecwuOb6oeoamYMohkg==} + peerDependencies: + vue: 3.4.37 + + '@vue/shared@3.4.37': + resolution: {integrity: sha512-nIh8P2fc3DflG8+5Uw8PT/1i17ccFn0xxN/5oE9RfV5SVnd7G0XEFRwakrnNFE/jlS95fpGXDVG5zDETS26nmg==} + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-globals@7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.14.0: + resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} + + amazon-cognito-identity-js@6.3.12: + resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + async-mutex@0.4.1: + resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.10.0: + resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} + engines: {node: '>=4'} + + axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + + axobject-query@3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822: + resolution: {integrity: sha512-yMkqwmqBtn6R8sY5b6I4aEQxzaX8sDHLa2JnU44wmZT6UFKh6GqPxtHw1mPNvxEadIXeyClT+JEZda/cA//F2g==} + + babel-plugin-transform-remove-imports@1.8.0: + resolution: {integrity: sha512-QdE5ZnIjON1pSgTPU8KzLnl/LEzdq9PLmZNuHgGKTx0LOI9PBrHBj0fz9uCg2CdssiTw7v/zVRYs8GJxbvhKnQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + + bare-fs@2.3.1: + resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} + + bare-os@2.4.0: + resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==} + + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + + bare-stream@2.1.3: + resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + bin-check@4.1.0: + resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==} + engines: {node: '>=4'} + + bin-version-check@5.1.0: + resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} + engines: {node: '>=12'} + + bin-version@6.0.0: + resolution: {integrity: sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==} + engines: {node: '>=12'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + birecord@0.1.1: + resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-scroll-lock@4.0.0-beta.0: + resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + bson-objectid@2.0.4: + resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} + + bson@4.7.2: + resolution: {integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==} + engines: {node: '>=6.9.0'} + + bson@5.5.1: + resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==} + engines: {node: '>=14.20.1'} + + buffer-builder@0.2.0: + resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-writer@2.0.0: + resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} + engines: {node: '>=4'} + + buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + + buffer@5.6.0: + resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + c12@1.11.1: + resolution: {integrity: sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg==} + peerDependencies: + magicast: ^0.3.4 + peerDependenciesMeta: + magicast: + optional: true + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + changelogen@0.5.5: + resolution: {integrity: sha512-IzgToIJ/R9NhVKmL+PW33ozYkv53bXvufDNUSH3GTKXq1iCHGgkbgbtqEWbo8tnWNnt7nPDpjL8PwSG2iS8RVw==} + hasBin: true + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-json@4.2.5: + resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} + engines: {node: '>= 6'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + console-table-printer@2.11.2: + resolution: {integrity: sha512-uuUHie0sfPP542TKGzPFal0W1wo1beuKAqIZdaavcONx8OoqdnJRKjkinbRTOta4FaCa1RcIL+7mMJWX3pQGVg==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-gitmoji@0.1.5: + resolution: {integrity: sha512-4wqOafJdk2tqZC++cjcbGcaJ13BZ3kwldf06PTiAQRAB76Z1KJwZNL1SaRZMi2w1FM9RYTgZ6QErS8NUl/GBmQ==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + copyfiles@2.4.1: + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} + hasBin: true + + core-js-compat@3.38.0: + resolution: {integrity: sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + + cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dataloader@2.2.2: + resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + + date-fns@3.3.1: + resolution: {integrity: sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + degit@2.8.4: + resolution: {integrity: sha512-vqYuzmSA5I50J882jd+AbAhQtgK6bdKUJIex1JNfEUPENCgYsxugzKVZlFyMwV4i06MmnV47/Iqi5Io86zf3Ng==} + engines: {node: '>=8.0.0'} + hasBin: true + + del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + direction@1.0.4: + resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} + hasBin: true + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + deprecated: Use your platform's native DOMException instead + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + drizzle-kit@0.23.2-df9e596: + resolution: {integrity: sha512-MOvoeDE1c05XGevXLqhRVu/TNHwueibPZqMUH/kG1v6DOHD5pB2poRpjphr4sjae2QDS6h+PU5pCfzqEa6le6Q==} + hasBin: true + + drizzle-orm@0.32.1: + resolution: {integrity: sha512-Wq1J+lL8PzwR5K3a1FfoWsbs8powjr3pGA4+5+2ueN1VTLDNFYEolUyUWFtqy8DVRvYbL2n7sXZkgVmK9dQkng==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.1.1' + '@libsql/client': '*' + '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': npm:types-react@19.0.0-rc.0 + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + react: 19.0.0-rc-06d0b89e-20240801 + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + effect@3.4.5: + resolution: {integrity: sha512-aTonOH68tUttSdYwMkiuky3hjgn3pu7yInNaE8rU2EDKQ8zr9Me78WcvWBQKe4u1gvbBH77y9dAKqn98lNIfNQ==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.6: + resolution: {integrity: sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@5.0.0: + resolution: {integrity: sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==} + engines: {node: '>=0.12'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild-sass-plugin@3.3.1: + resolution: {integrity: sha512-SnO1ls+d52n6j8gRRpjexXI8MsHEaumS0IdDHaYM29Y6gakzZYMls6i9ql9+AWMSQk/eryndmUpXEgT34QrX1A==} + peerDependencies: + esbuild: '>=0.20.1' + sass-embedded: ^1.71.1 + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-plugin-import-x@4.1.1: + resolution: {integrity: sha512-dBEM8fACIFNt4H7GoOaRmnH6evJW6JSTJTYYgmRd3vI4geBTjgDM/JyUDKUwIw0HDSyI+u7Vs3vFRXUo/BOAtA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + eslint-plugin-jest-dom@5.4.0: + resolution: {integrity: sha512-yBqvFsnpS5Sybjoq61cJiUsenRkC9K32hYQBFS9doBR7nbQZZ5FyO+X7MlmfM1C48Ejx/qTuOCgukDUNyzKZ7A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} + peerDependencies: + '@testing-library/dom': ^8.0.0 || ^9.0.0 || ^10.0.0 + eslint: ^6.8.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + '@testing-library/dom': + optional: true + + eslint-plugin-jest@28.8.1: + resolution: {integrity: sha512-G46XMyYu6PtSNJUkQ0hsPjzXYpzq/O4vpCciMizTKRJG8kNsRreGoMRDG6H9FIB/xVgfFuclVnuX4XRvFUzrZQ==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-jsx-a11y@6.9.0: + resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-perfectionist@3.3.0: + resolution: {integrity: sha512-sGgShkEqDBqIZ3WlenGHwLe1cl3vHKTfeh9b1XXAamaxSC7AY4Os0jdNCXnGJW4l0TlpismT5t2r7CXY7sfKlw==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + astro-eslint-parser: ^1.0.2 + eslint: '>=8.0.0' + svelte: '>=3.0.0' + svelte-eslint-parser: ^0.41.0 + vue-eslint-parser: '>=9.0.0' + peerDependenciesMeta: + astro-eslint-parser: + optional: true + svelte: + optional: true + svelte-eslint-parser: + optional: true + vue-eslint-parser: + optional: true + + eslint-plugin-playwright@1.6.2: + resolution: {integrity: sha512-mraN4Em3b5jLt01q7qWPyLg0Q5v3KAWfJSlEWwldyUXoa7DSPrBR4k6B6LROLqipsG8ndkwWMdjl1Ffdh15tag==} + engines: {node: '>=16.6.0'} + peerDependencies: + eslint: '>=8.40.0' + eslint-plugin-jest: '>=25' + peerDependenciesMeta: + eslint-plugin-jest: + optional: true + + eslint-plugin-react-compiler@0.0.0-experimental-72f06b2-20240822: + resolution: {integrity: sha512-tmcPYVSeSCktvNgGNE/CKY5Gn29wMMSdHMb/IglSTWoddtDZ5YhAoGgiTAerKN+rmB0bBtjFSRjh1ZjmgH+mhQ==} + engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} + peerDependencies: + eslint: '>=7' + + eslint-plugin-react-debug@1.12.3: + resolution: {integrity: sha512-rtKsmDWFz1aG5EMj27fNfbVIxsdhqA1MIv9G4CSRhXWgqlIdg4NMWvk+2yRJjBzLWfAh1TlpLeXjuLd0PDmreQ==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: 5.5.4 + peerDependenciesMeta: + typescript: + optional: true + + eslint-plugin-react-dom@1.12.3: + resolution: {integrity: sha512-bZOcY1Dew7WqYrdn9FLQPTL9U0qeBIpSpC2mOXKxgsvGC/B+BYQKp89K05WeRBubmqDfDKVdrqVcAku2f7BU7w==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: 5.5.4 + peerDependenciesMeta: + typescript: + optional: true + + eslint-plugin-react-hooks-extra@1.12.3: + resolution: {integrity: sha512-QdTOf+GddxSBA3UBme+2DwUaUJA4YzYIP+JYI3AD8Ja04nEoMqvSu4SOXVtmRr1aLWeWgR/fC3SNFXgGZUaI9A==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: 5.5.4 + peerDependenciesMeta: + typescript: + optional: true + + eslint-plugin-react-hooks@5.1.0-rc-a19a8ab4-20240829: + resolution: {integrity: sha512-lWHTnMQqgAvQ4S5VVyXSxdNnfqbSiH4VAb7hbN1scbQaB9DmXkE2r1EOi2RigeA3x994TOcrFb73l1UZD4PvXQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-naming-convention@1.12.3: + resolution: {integrity: sha512-PKKXx3Wvh/KUftE7nh+imyOrUzkIyF41i9TaPbDxuEt+ggIY0cuvYOE/bcDCVJBDq0ROb2ZhERe9i46RaJoG/Q==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: 5.5.4 + peerDependenciesMeta: + typescript: + optional: true + + eslint-plugin-react-web-api@1.12.3: + resolution: {integrity: sha512-I5UgttFfAUYQ4lSWoHs02pHb0Pp2ou3xJ4L3xRv7Uce2s8sRPKazYOt7frxqfvBMxdzStS4/g0Gu7k5/PtPypA==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: 5.5.4 + peerDependenciesMeta: + typescript: + optional: true + + eslint-plugin-react-x@1.12.3: + resolution: {integrity: sha512-LfmjFDiqleIEFqOOcAbsPqQnTkkT68tlYEpeXZBa+IWUtQVC4jxIRTmus+m/h9Td6wf2XGVEzwwSqmYQQzcb7w==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: 5.5.4 + peerDependenciesMeta: + typescript: + optional: true + + eslint-plugin-regexp@2.6.0: + resolution: {integrity: sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==} + engines: {node: ^18 || >=20} + peerDependencies: + eslint: '>=8.44.0' + + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.9.1: + resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima-next@6.0.3: + resolution: {integrity: sha512-fVfE+9qIOJSbS3AR7roIuL0gCeS+tC86bJV9GlJtwXCRoo67q6tsGGUjThW+JtR5IQSShnHqaDqX8D0IYDfRGA==} + engines: {node: '>=12'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + + ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-base64-decode@1.0.0: + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + + fast-check@3.21.0: + resolution: {integrity: sha512-QpmbiqRFRZ+SIlBJh6xi5d/PgXciUc/xWKc4Vi2RWEHHIRx6oM3f0fWNna++zP9VB5HUBTObUK9gTKQP3vVcrQ==} + engines: {node: '>=8.0.0'} + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + hasBin: true + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-type@17.1.6: + resolution: {integrity: sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filename-reserved-regex@3.0.0: + resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + filenamify@5.1.1: + resolution: {integrity: sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==} + engines: {node: '>=12.20'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + find-versions@5.1.0: + resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} + engines: {node: '>=12'} + + findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + focus-trap@7.5.4: + resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + + form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + + gcp-metadata@6.1.0: + resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} + engines: {node: '>=14'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + + giget@1.2.3: + resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} + hasBin: true + + git-hooks-list@3.1.0: + resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + google-auth-library@9.13.0: + resolution: {integrity: sha512-p9Y03Uzp/Igcs36zAaB0XTSwZ8Y0/tpYiz5KIde5By+H9DCVUSYtDWZu6aFXsWTqENMb8BD/pDT3hR8NVrPkfA==} + engines: {node: '>=14'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql-http@1.22.1: + resolution: {integrity: sha512-4Jor+LRbA7SfSaw7dfDUs2UBzvWg3cKrykfHRgKsOIvQaLuf+QOcG2t3Mx5N9GzSNJcuqMqJWz0ta5+BryEmXg==} + engines: {node: '>=12'} + peerDependencies: + graphql: ^16.8.1 + + graphql-playground-html@1.6.30: + resolution: {integrity: sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==} + + graphql-scalars@1.22.2: + resolution: {integrity: sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^16.8.1 + + graphql@16.9.0: + resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + hermes-estree@0.20.1: + resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} + + hermes-parser@0.20.1: + resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-to-text@9.0.3: + resolution: {integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==} + engines: {node: '>=14'} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http-status@1.6.2: + resolution: {integrity: sha512-oUExvfNckrpTpDazph7kNG8sQi5au3BeTo0idaZFXEhTaJKu7GNJCLHI0rYY2wljm548MSTM+Ljj/c6anqu2zQ==} + engines: {node: '>= 0.4.0'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hotkey@0.1.8: + resolution: {integrity: sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==} + + is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + + is-immutable-type@5.0.0: + resolution: {integrity: sha512-mcvHasqbRBWJznuPqqHRKiJgYAz60sZ0mvO3bN70JbkuK7ksfmgc489aKZYxMEjIbRvyOseaTjaRZLRF/xFeRA==} + peerDependencies: + eslint: '*' + typescript: 5.5.4 + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-jsdom@29.7.0: + resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + + jsdom@20.0.3: + resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-to-typescript@15.0.1: + resolution: {integrity: sha512-gSSg20skxv+ZQqR8Y8itZt+2iYFGNgneuTgf/Va0TBw+zo6JsykDG1bqhkhMs5g/vIdqmZx55oQJLbgOEuxPJw==} + engines: {node: '>=16.0.0'} + hasBin: true + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonwebtoken@9.0.1: + resolution: {integrity: sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==} + engines: {node: '>=12', npm: '>=6'} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + + kareem@2.5.1: + resolution: {integrity: sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==} + engines: {node: '>=12.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lexical@0.17.0: + resolution: {integrity: sha512-cCFmANO5rIf34NF0go/hxp5S3V5Z8G2Rsa1FJy50qF2WM5EJNJ/MqN75TApjfgMkfrbO6gau3X12nCqwsT7aDg==} + + lib0@0.2.97: + resolution: {integrity: sha512-Q4d1ekgvufi9FiHkkL46AhecfNjznSL9MRNoJRQ76gBHS9OqU2ArfQK0FvBpuxgWeJeNI0LVgAYMIpsGeX4gYg==} + engines: {node: '>=16'} + hasBin: true + + libsql@0.3.19: + resolution: {integrity: sha512-Aj5cQ5uk/6fHdmeW0TiXK42FqUlwx7ytmMLPSaUQPin5HKKKuUPD62MAbN4OEweGBBI7q1BekoEN4gPUEL6MZA==} + os: [darwin, linux, win32] + + lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@15.2.7: + resolution: {integrity: sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} + engines: {node: '>=18.0.0'} + + localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.deburr@4.1.0: + resolution: {integrity: sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + + monaco-editor@0.38.0: + resolution: {integrity: sha512-11Fkh6yzEmwx7O0YoLxeae0qEGFwmyPRlVxpg7oF9czOOCB/iCjdJrG5I67da5WiXK3YJCxoz9TJFE8Tfq/v9A==} + + mongodb-connection-string-url@2.6.0: + resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + + mongodb-memory-server-core@9.4.1: + resolution: {integrity: sha512-lobapXaysH64zrn521NTkmqHc3krSPUFkuuZ8A/BmQV8ON7p2SzAEvpoJPDXIeJkxIzYw06dYL6Gn5OcZdEElA==} + engines: {node: '>=14.20.1'} + + mongodb-memory-server@9.4.1: + resolution: {integrity: sha512-qONlW4sKPbtk9pqFnlPn7R73G3Q4TuebJJ5pHfoiKTqVJquojQ8xWmkCyz+/YnpA2vYBo/jib+nXvjfKwh7cjg==} + engines: {node: '>=14.20.1'} + + mongodb@4.17.1: + resolution: {integrity: sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==} + engines: {node: '>=12.9.0'} + + mongodb@5.9.2: + resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==} + engines: {node: '>=14.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.0.0 + kerberos: ^1.0.0 || ^2.0.0 + mongodb-client-encryption: '>=2.3.0 <3' + snappy: ^7.2.2 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + + mongoose-aggregate-paginate-v2@1.0.6: + resolution: {integrity: sha512-UuALu+mjhQa1K9lMQvjLL3vm3iALvNw8PQNIh2gp1b+tO5hUa0NC0Wf6/8QrT9PSJVTihXaD8hQVy3J4e0jO0Q==} + engines: {node: '>=4.0.0'} + + mongoose-paginate-v2@1.7.22: + resolution: {integrity: sha512-xW5GugkE21DJiu9e13EOxKt4ejEKQkRP/S1PkkXRjnk2rRZVKBcld1nPV+VJ/YCPfm8hb3sz9OvI7O38RmixkA==} + engines: {node: '>=4.0.0'} + + mongoose@6.12.3: + resolution: {integrity: sha512-MNJymaaXali7w7rHBxVUoQ3HzHHMk/7I/+yeeoSa4rUzdjZwIWQznBNvVgc0A8ghuJwsuIkb5LyLV6gSjGjWyQ==} + engines: {node: '>=12.0.0'} + + mpath@0.9.0: + resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} + engines: {node: '>=4.0.0'} + + mquery@4.0.3: + resolution: {integrity: sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==} + engines: {node: '>=12.0.0'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + new-find-package-json@2.0.0: + resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} + engines: {node: '>=12.22.0'} + + next@15.0.0-canary.104: + resolution: {integrity: sha512-LVzRmV/p/BGGYmTjlZSmCULmBQ2S5ov1nQAXYssu4cEMhkpklQVgh2I+uHHgo/xgdqIIcEBlUgsfV+CfKVsM6Q==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + nice-napi@1.0.2: + resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} + os: ['!win32'] + + node-abi@3.65.0: + resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} + engines: {node: '>=10'} + + node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + nodemailer@6.9.10: + resolution: {integrity: sha512-qtoKfGFhvIFW5kLfrkw2R6Nm6Ur4LNUMykyqu6n9BRKJuyQrqEGwdXXUAbwWEKt33dlWUGXb7rzmJP/p4+O+CA==} + engines: {node: '>=6.0.0'} + + nodemon@3.0.3: + resolution: {integrity: sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ==} + engines: {node: '>=10'} + hasBin: true + + noms@0.0.0: + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nwsapi@2.2.12: + resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + + nypm@0.3.9: + resolution: {integrity: sha512-BI2SdqqTHg2d4wJh8P9A1W+bslg33vOE9IZDY6eR2QC+Pu1iNBVZUqczrd43rJb+fMzHU7ltAYKsEFY/kHMFcw==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-to-formdata@4.5.1: + resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + ofetch@1.3.4: + resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + + ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + os-filter-obj@2.0.0: + resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==} + engines: {node: '>=4'} + + oxc-resolver@1.10.2: + resolution: {integrity: sha512-NIbwVqoU8Bhl7PVtItHCg+VFFokIDwBgIgFUwFG2Y8ePhxftFh5xG+KLar5PLWXlCP4WunPIuXD3jr3v6/MfRw==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + packet-reader@1.0.0: + resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseley@0.11.0: + resolution: {integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + peberminta@0.8.0: + resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} + + peek-readable@5.1.4: + resolution: {integrity: sha512-E7mY2VmKqw9jYuXrSWGHFuPCW2SLQenzXLF3amGaY6lXXg4/b3gj5HVM7h8ZjCO/nZS9ICs0Cz285+32FvNd/A==} + engines: {node: '>=14.16'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + + pg-pool@3.6.2: + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + + pg@8.11.3: + resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-pretty@11.2.1: + resolution: {integrity: sha512-O05NuD9tkRasFRWVaF/uHLOvoRDFD7tb5VMertr78rbsYFjYp48Vg3477EshVAF5eZaEw+OpDl/tu+B0R5o+7g==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.3.1: + resolution: {integrity: sha512-afSfrq/hUiW/MFmQcLEwV9Zh8Ry6MrMTOyBU53o/fc0gEl+1OZ/Fks/xQCM2nOC0C/OfDtQMnT2d8c3kpcfSzA==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + piscina@4.6.1: + resolution: {integrity: sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.1.3: + resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + + playwright-core@1.46.0: + resolution: {integrity: sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.46.0: + resolution: {integrity: sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==} + engines: {node: '>=18'} + hasBin: true + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} + hasBin: true + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@24.9.0: + resolution: {integrity: sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==} + engines: {node: '>= 6'} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + qs-esm@7.0.2: + resolution: {integrity: sha512-D8NAthKSD7SGn748v+GLaaO6k08Mvpoqroa35PqIQC4gtUa8/Pb/k+r0m0NnGBVbHDP1gKZ2nVywqfMisRhV5A==} + engines: {node: '>=18'} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-animate-height@2.1.2: + resolution: {integrity: sha512-A9jfz/4CTdsIsE7WCQtO9UkOpMBcBRh8LxyHl2eoZz1ki02jpyUL5xt58gabd0CyeLQ8fRyQ+s2lyV2Ufu8Owg==} + engines: {node: '>= 6.0.0'} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + react-datepicker@6.9.0: + resolution: {integrity: sha512-QTxuzeem7BUfVFWv+g5WuvzT0c5BPo+XTCNbMTZKSZQLU+cMMwSUHwspaxuIcDlwNcOH0tiJ+bh1fJ2yxOGYWA==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + react-diff-viewer-continued@3.2.6: + resolution: {integrity: sha512-GrzyqQnjIMoej+jMjWvtVSsQqhXgzEGqpXlJ2dAGfOk7Q26qcm8Gu6xtI430PBUyZsERe8BJSQf+7VZZo8IBNQ==} + engines: {node: '>= 8'} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + react-dom@19.0.0-rc-06d0b89e-20240801: + resolution: {integrity: sha512-6JIbEXFwsRkI3gLKhcmjvQ3GKsP4NR/BjPyTKyp7xYeQEeiH01TypGVbc/K6nU1/y4jNGFGkxH3ZFbKKZwCecw==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + react-error-boundary@3.1.4: + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + react-error-boundary@4.0.13: + resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + react-image-crop@10.1.8: + resolution: {integrity: sha512-4rb8XtXNx7ZaOZarKKnckgz4xLMvds/YrU6mpJfGhGAsy2Mg4mIw1x+DCCGngVGq2soTBVVOxx2s/C6mTX9+pA==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-onclickoutside@6.13.1: + resolution: {integrity: sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + react-select@5.8.0: + resolution: {integrity: sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + react@19.0.0-rc-06d0b89e-20240801: + resolution: {integrity: sha512-moBKIME1GBgs8onH1xCs+gzPWyLF62m+2XbD4GpirxeRDca7GLA8UQZO9IuQvf1uxCpVWCG8FrpU/D2x7Plknw==} + engines: {node: '>=0.10.0'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resend@0.17.2: + resolution: {integrity: sha512-lakm76u4MiIDeMF1s2tCmjtksOhwZOs4WcAXkA7aUTvl+63/h+0h6Q6WnkB8RGtj6GakUhQuUkiZshfXgtIrGw==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retry-request@7.0.2: + resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} + engines: {node: '>=14'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + + sass-embedded-android-arm64@1.77.8: + resolution: {integrity: sha512-EmWHLbEx0Zo/f/lTFzMeH2Du+/I4RmSRlEnERSUKQWVp3aBSO04QDvdxfFezgQ+2Yt/ub9WMqBpma9P/8MPsLg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + hasBin: true + + sass-embedded-android-arm@1.77.8: + resolution: {integrity: sha512-GpGL7xZ7V1XpFbnflib/NWbM0euRzineK0iwoo31/ntWKAXGj03iHhGzkSiOwWSFcXgsJJi3eRA5BTmBvK5Q+w==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [android] + hasBin: true + + sass-embedded-android-ia32@1.77.8: + resolution: {integrity: sha512-+GjfJ3lDezPi4dUUyjQBxlNKXNa+XVWsExtGvVNkv1uKyaOxULJhubVo2G6QTJJU0esJdfeXf5Ca5/J0ph7+7w==} + engines: {node: '>=14.0.0'} + cpu: [ia32] + os: [android] + hasBin: true + + sass-embedded-android-x64@1.77.8: + resolution: {integrity: sha512-YZbFDzGe5NhaMCygShqkeCWtzjhkWxGVunc7ULR97wmxYPQLPeVyx7XFQZc84Aj0lKAJBJS4qRZeqphMqZEJsQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [android] + hasBin: true + + sass-embedded-darwin-arm64@1.77.8: + resolution: {integrity: sha512-aifgeVRNE+i43toIkDFFJc/aPLMo0PJ5s5hKb52U+oNdiJE36n65n2L8F/8z3zZRvCa6eYtFY2b7f1QXR3B0LA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + hasBin: true + + sass-embedded-darwin-x64@1.77.8: + resolution: {integrity: sha512-/VWZQtcWIOek60Zj6Sxk6HebXA1Qyyt3sD8o5qwbTgZnKitB1iEBuNunyGoAgMNeUz2PRd6rVki6hvbas9hQ6w==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + hasBin: true + + sass-embedded-linux-arm64@1.77.8: + resolution: {integrity: sha512-6iIOIZtBFa2YfMsHqOb3qake3C9d/zlKxjooKKnTSo+6g6z+CLTzMXe1bOfayb7yxeenElmFoK1k54kWD/40+g==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + hasBin: true + + sass-embedded-linux-arm@1.77.8: + resolution: {integrity: sha512-2edZMB6jf0whx3T0zlgH+p131kOEmWp+I4wnKj7ZMUeokiY4Up05d10hSvb0Q63lOrSjFAWu6P5/pcYUUx8arQ==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + hasBin: true + + sass-embedded-linux-ia32@1.77.8: + resolution: {integrity: sha512-63GsFFHWN5yRLTWiSef32TM/XmjhCBx1DFhoqxmj+Yc6L9Z1h0lDHjjwdG6Sp5XTz5EmsaFKjpDgnQTP9hJX3Q==} + engines: {node: '>=14.0.0'} + cpu: [ia32] + os: [linux] + hasBin: true + + sass-embedded-linux-musl-arm64@1.77.8: + resolution: {integrity: sha512-j8cgQxNWecYK+aH8ESFsyam/Q6G+9gg8eJegiRVpA9x8yk3ykfHC7UdQWwUcF22ZcuY4zegrjJx8k+thsgsOVA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + sass-embedded-linux-musl-arm@1.77.8: + resolution: {integrity: sha512-nFkhSl3uu9btubm+JBW7uRglNVJ8W8dGfzVqh3fyQJKS1oyBC3vT3VOtfbT9YivXk28wXscSHpqXZwY7bUuopA==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + sass-embedded-linux-musl-ia32@1.77.8: + resolution: {integrity: sha512-oWveMe+8TFlP8WBWPna/+Ec5TV0CE+PxEutyi0ltSruBds2zxRq9dPVOqrpPcDN9QUx50vNZC0Afgch0aQEd0g==} + engines: {node: '>=14.0.0'} + cpu: [ia32] + os: [linux] + + sass-embedded-linux-musl-x64@1.77.8: + resolution: {integrity: sha512-2NtRpMXHeFo9kaYxuZ+Ewwo39CE7BTS2JDfXkTjZTZqd8H+8KC53eBh516YQnn2oiqxSiKxm7a6pxbxGZGwXOQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + sass-embedded-linux-x64@1.77.8: + resolution: {integrity: sha512-ND5qZLWUCpOn7LJfOf0gLSZUWhNIysY+7NZK1Ctq+pM6tpJky3JM5I1jSMplNxv5H3o8p80n0gSm+fcjsEFfjQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + hasBin: true + + sass-embedded-win32-arm64@1.77.8: + resolution: {integrity: sha512-7L8zT6xzEvTYj86MvUWnbkWYCNQP+74HvruLILmiPPE+TCgOjgdi750709BtppVJGGZSs40ZuN6mi/YQyGtwXg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + hasBin: true + + sass-embedded-win32-ia32@1.77.8: + resolution: {integrity: sha512-7Buh+4bP0WyYn6XPbthkIa3M2vtcR8QIsFVg3JElVlr+8Ng19jqe0t0SwggDgbMX6AdQZC+Wj4F1BprZSok42A==} + engines: {node: '>=14.0.0'} + cpu: [ia32] + os: [win32] + hasBin: true + + sass-embedded-win32-x64@1.77.8: + resolution: {integrity: sha512-rZmLIx4/LLQm+4GW39sRJW0MIlDqmyV0fkRzTmhFP5i/wVC7cuj8TUubPHw18rv2rkHFfBZKZJTCkPjCS5Z+SA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + hasBin: true + + sass-embedded@1.77.8: + resolution: {integrity: sha512-WGXA6jcaoBo5Uhw0HX/s6z/sl3zyYQ7ZOnLOJzqwpctFcFmU4L07zn51e2VSkXXFpQZFAdMZNqOGz/7h/fvcRA==} + engines: {node: '>=16.0.0'} + + sass@1.77.4: + resolution: {integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==} + engines: {node: '>=14.0.0'} + hasBin: true + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.25.0-rc-06d0b89e-20240801: + resolution: {integrity: sha512-5RF+494IBigvBHUPYId9MhAWyN0cZZq3o82oAbYvZuc2IFc4mZYHS3z2MuJ5Lwm39zGWDEzB404X6BO47zbt5w==} + + scheduler@0.25.0-rc-f994737d14-20240522: + resolution: {integrity: sha512-qS+xGFF7AljP2APO2iJe8zESNsK20k25MACz+WGOXPybUsRdi1ssvaoF93im2nSX2q/XT3wKkjdz6RQfbmaxdw==} + + scmp@2.1.0: + resolution: {integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==} + + scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + + scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + selderee@0.10.0: + resolution: {integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==} + + semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + + semver-truncate@3.0.0: + resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} + engines: {node: '>=12'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + + sharp@0.33.4: + resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} + engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + short-unique-id@5.2.0: + resolution: {integrity: sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==} + hasBin: true + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + sift@16.0.1: + resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + simple-wcswidth@1.0.1: + resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slate-history@0.86.0: + resolution: {integrity: sha512-OxObL9tbhgwvSlnKSCpGIh7wnuaqvOj5jRExGjEyCU2Ke8ctf22HjT+jw7GEi9ttLzNTUmTEU3YIzqKGeqN+og==} + peerDependencies: + slate: '>=0.65.3' + + slate-hyperscript@0.81.3: + resolution: {integrity: sha512-A/jvoLTAgeRcJaUPQCYOikCJxSws6+/jkL7mM+QuZljNd7EA5YqafGA7sVBJRFpcoSsDRUIah1yNiC/7vxZPYg==} + peerDependencies: + slate: '>=0.65.3' + + slate-react@0.92.0: + resolution: {integrity: sha512-xEDKu5RKw5f0N95l1UeNQnrB0Pxh4JPjpIZR/BVsMo0ININnLAknR99gLo46bl/Ffql4mr7LeaxQRoXxbFtJOQ==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + slate: '>=0.65.3' + + slate@0.91.4: + resolution: {integrity: sha512-aUJ3rpjrdi5SbJ5G1Qjr3arytfRkEStTmHjBfWq2A2Q8MybacIzkScSvGJjQkdTk3djCK9C9SEOt39sSeZFwTw==} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonic-boom@4.0.1: + resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} + + sonner@1.5.0: + resolution: {integrity: sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801 + + sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + + sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-package-json@2.10.0: + resolution: {integrity: sha512-MYecfvObMwJjjJskhxYfuOADkXp1ZMMnCFC8yhp+9HDsk7HhR336hd7eiBs96lTXfiqmUNI+WQCeCMRBhl251g==} + hasBin: true + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + state-local@1.0.7: + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + stream-events@1.0.5: + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + streamx@2.18.0: + resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-ts@2.2.0: + resolution: {integrity: sha512-VTP0LLZo4Jp9Gz5IiDVMS9WyLx/3IeYh0PXUn0NdPqusUFNgkHPWiEdbB9TU2Iv3myUskraD5WtYEdHUrQEIlQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.includes@2.0.0: + resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-outer@2.0.0: + resolution: {integrity: sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + stripe@10.17.0: + resolution: {integrity: sha512-JHV2KoL+nMQRXu3m9ervCZZvi4DDCJfzHUE6CmtJxR9TmizyYfrVuhGvnsZLLnheby9Qrnf4Hq6iOEcejGwnGQ==} + engines: {node: ^8.1 || >=10.*} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + strtok3@7.1.1: + resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} + engines: {node: '>=16'} + + stubs@3.0.0: + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: 19.0.0-rc-06d0b89e-20240801 + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swc-plugin-transform-remove-imports@1.15.0: + resolution: {integrity: sha512-mjJgcRyXbwLOG7rzLtjVaNcvRJEzEnx8gRCPKraDGJY+0uaInmcFTpu1i0ILQCErME9YbYA6FRDRRsRfqjykAw==} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + teeny-request@9.0.0: + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} + engines: {node: '>=14'} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + tempy@1.0.1: + resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} + engines: {node: '>=10'} + + terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-decoder@1.1.1: + resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + tiny-invariant@1.0.6: + resolution: {integrity: sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-no-case@1.0.2: + resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-snake-case@1.0.0: + resolution: {integrity: sha512-joRpzBAk1Bhi2eGEYBjukEWHOe/IvclOkiJl3DtA91jV6NwQ3MwXA4FHYeqk8BNp/D8bmi9tcNbRu/SozP0jbQ==} + + to-space-case@1.0.0: + resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + trim-repeated@2.0.0: + resolution: {integrity: sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==} + engines: {node: '>=12'} + + trim-right@1.0.1: + resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} + engines: {node: '>=0.10.0'} + + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: 5.5.4 + + ts-declaration-location@1.0.4: + resolution: {integrity: sha512-r4JoxYhKULbZuH81Pjrp9OEG5St7XWk7zXwGkLKhmVcjiBVHTJXV5wK6dEa9JKW5QGSTW6b1lOjxAKp8R1SQhg==} + peerDependencies: + typescript: 5.5.4 + + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: 5.5.4 + + ts-jest@29.2.4: + resolution: {integrity: sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: 5.5.4 + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-pattern@5.3.1: + resolution: {integrity: sha512-1RUMKa8jYQdNfmnK4jyzBK3/PS/tnjcZ1CW0v1vWDeYe5RBklc/nquw03MEoB66hVBm4BnlCfmOqDVxHyT1DpA==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tsx@4.17.0: + resolution: {integrity: sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==} + engines: {node: '>=18.0.0'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + turbo-darwin-64@2.1.0: + resolution: {integrity: sha512-gHwpDk2gyB7qZ57gUUwDIS/IkglqEjjVtPZCTxmCRg28Tiwjui0azsLVKrnHP9UZHllozwbi28x8HXLXLEFF1w==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@2.1.0: + resolution: {integrity: sha512-GLaqGetNC6eS4eqXgsheLOHic/OcnGCGDi5boVf+TFZTXYH6YE15L4ugZha4xHXCr1KouCLILHh+f8EHEmWylg==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@2.1.0: + resolution: {integrity: sha512-VzBOsj7JyGoZtiNZZ6brjnY7UehRnClluw7pwznuLPzClkqOOPMd2jOcgkWxnP/xW4NBmOoFANXXrtvKBD4f2w==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@2.1.0: + resolution: {integrity: sha512-St7svJnOO5g4F6R7Z32e10I/0M3e6qpNjEYybXwPNul9NSfnUXeky4WoKaALwqNhyJ7nYemoFpZ1d+i8hFQTHg==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@2.1.0: + resolution: {integrity: sha512-iSobNud2MrJ1SZ1upVPlErT8xexsr0MQtKapdfq6z0M0rBnrDGEq5bUCSScWyGu+O4+glB4br9xkTAkGFqaxqQ==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@2.1.0: + resolution: {integrity: sha512-d61jN4rjE5PnUfF66GKrKoj8S8Ql4FGXzFFzZz4kjsHpZZzCTtqlzPZBmd1byzGYhDPTorTqG3G1USohbdyohA==} + cpu: [arm64] + os: [win32] + + turbo@2.1.0: + resolution: {integrity: sha512-A969/LO/sPHKlapIarY2VVzqQ5JnnW2/1kksZlnMEpsRD6gwOELvVL+ozfMiO7av9RILt3UeN02L17efr6HUCA==} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@3.13.0: + resolution: {integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==} + engines: {node: '>=14.16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + types-react-dom@19.0.0-rc.0: + resolution: {integrity: sha512-wGlQSD6H6EeCxhH+dSip1cPcCU7nNTOwHEr29rjiNtGkUPlmEofOizoQaPMEqQH2V76ME3NLvBDLGajRu3xZOw==} + + types-react@19.0.0-rc.0: + resolution: {integrity: sha512-JFd3qtgXZ+EdHht8WXMPSF231brd6Bu4yLKqyo0JjpzhmjYxJptT6TBh/xFqOhx+ee2Nagj7Ttkh5F/jc49TVQ==} + + typescript-eslint@8.3.0: + resolution: {integrity: sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uploadthing@6.13.2: + resolution: {integrity: sha512-hrxwOgqKs8siczPloop72drRBiUYaFDHMp45OR/sSAaAbOPyGBmBL88Bi4UWCvgC+aBWCLRxtMEGeoqrfu+OMg==} + engines: {node: '>=18.13.0'} + peerDependencies: + '@effect/platform': '*' + express: '*' + fastify: '*' + h3: '*' + next: '*' + tailwindcss: '*' + peerDependenciesMeta: + '@effect/platform': + optional: true + express: + optional: true + fastify: + optional: true + h3: + optional: true + next: + optional: true + tailwindcss: + optional: true + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-context-selector@2.0.0: + resolution: {integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==} + peerDependencies: + react: 19.0.0-rc-06d0b89e-20240801 + scheduler: '>=0.19.0' + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: 19.0.0-rc-06d0b89e-20240801 + peerDependenciesMeta: + '@types/react': + optional: true + + utf-8-validate@6.0.4: + resolution: {integrity: sha512-xu9GQDeFp+eZ6LnCywXN/zBancWvOpUMzgjLPSjy4BRHSmTelvn2E0DG0o1sTiw5hkCKBHo8rwSKncfRfv2EEQ==} + engines: {node: '>=6.14.2'} + + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vue@3.4.37: + resolution: {integrity: sha512-3vXvNfkKTBsSJ7JP+LyR7GBuwQuckbWvuwAid3xbqK9ppsKt/DUvfqgZ48fgOLEfpy1IacL5f8QhUVl77RaI7A==} + peerDependencies: + typescript: 5.5.4 + peerDependenciesMeta: + typescript: + optional: true + + w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-bundle-analyzer@4.10.1: + resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} + engines: {node: '>= 10.13.0'} + hasBin: true + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.4: + resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@3.1.3: + resolution: {integrity: sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==} + engines: {node: '>=12'} + + yjs@13.6.18: + resolution: {integrity: sha512-GBTjO4QCmv2HFKFkYIJl7U77hIB1o22vSCSQD1Ge8ZxWbIbn8AltI4gyXbtL+g5/GJep67HCMq3Y5AmNwDSyEg==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zod-validation-error@2.1.0: + resolution: {integrity: sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + + zod-validation-error@3.3.1: + resolution: {integrity: sha512-uFzCZz7FQis256dqw4AhPQgD6f3pzNca/Zh62RNELavlumQB3nDIUFbF5JQfFLcMbO1s02Q7Xg/gpcOBlEnYZA==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@apidevtools/json-schema-ref-parser@11.7.0': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.0 + + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.3 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.3 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-crypto/sha256-js@1.2.2': + dependencies: + '@aws-crypto/util': 1.2.2 + '@aws-sdk/types': 3.609.0 + tslib: 1.14.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.3 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.6.3 + + '@aws-crypto/util@1.2.2': + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-sdk/client-cognito-identity@3.629.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.629.0(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/client-sts': 3.629.0 + '@aws-sdk/core': 3.629.0 + '@aws-sdk/credential-provider-node': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.620.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.3.2 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.14 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.14 + '@smithy/util-defaults-mode-node': 3.0.14 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-s3@3.629.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.629.0(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/client-sts': 3.629.0 + '@aws-sdk/core': 3.629.0 + '@aws-sdk/credential-provider-node': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/middleware-bucket-endpoint': 3.620.0 + '@aws-sdk/middleware-expect-continue': 3.620.0 + '@aws-sdk/middleware-flexible-checksums': 3.620.0 + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-location-constraint': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-sdk-s3': 3.629.0 + '@aws-sdk/middleware-ssec': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.620.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/signature-v4-multi-region': 3.629.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@aws-sdk/xml-builder': 3.609.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.3.2 + '@smithy/eventstream-serde-browser': 3.0.6 + '@smithy/eventstream-serde-config-resolver': 3.0.3 + '@smithy/eventstream-serde-node': 3.0.5 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-blob-browser': 3.1.2 + '@smithy/hash-node': 3.0.3 + '@smithy/hash-stream-node': 3.1.2 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/md5-js': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.14 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.14 + '@smithy/util-defaults-mode-node': 3.0.14 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-stream': 3.1.3 + '@smithy/util-utf8': 3.0.0 + '@smithy/util-waiter': 3.1.2 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.629.0 + '@aws-sdk/core': 3.629.0 + '@aws-sdk/credential-provider-node': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.620.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.3.2 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.14 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.14 + '@smithy/util-defaults-mode-node': 3.0.14 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.629.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.629.0 + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.620.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.3.2 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.14 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.14 + '@smithy/util-defaults-mode-node': 3.0.14 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.629.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.629.0(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/core': 3.629.0 + '@aws-sdk/credential-provider-node': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/middleware-host-header': 3.620.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.620.0 + '@aws-sdk/middleware-user-agent': 3.620.0 + '@aws-sdk/region-config-resolver': 3.614.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.614.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.3.2 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.5 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.14 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.14 + '@smithy/util-defaults-mode-node': 3.0.14 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.629.0': + dependencies: + '@smithy/core': 2.3.2 + '@smithy/node-config-provider': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + fast-xml-parser: 4.4.1 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-cognito-identity@3.629.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.629.0 + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-env@3.620.1': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-http@3.622.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/util-stream': 3.1.3 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-ini@3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))(@aws-sdk/client-sts@3.629.0)': + dependencies: + '@aws-sdk/client-sts': 3.629.0 + '@aws-sdk/credential-provider-env': 3.620.1 + '@aws-sdk/credential-provider-http': 3.622.0 + '@aws-sdk/credential-provider-process': 3.620.1 + '@aws-sdk/credential-provider-sso': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.2.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-node@3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))(@aws-sdk/client-sts@3.629.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.620.1 + '@aws-sdk/credential-provider-http': 3.622.0 + '@aws-sdk/credential-provider-ini': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/credential-provider-process': 3.620.1 + '@aws-sdk/credential-provider-sso': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.2.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-process@3.620.1': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-sso@3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))': + dependencies: + '@aws-sdk/client-sso': 3.629.0 + '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.621.0(@aws-sdk/client-sts@3.629.0)': + dependencies: + '@aws-sdk/client-sts': 3.629.0 + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))': + dependencies: + '@aws-sdk/client-cognito-identity': 3.629.0 + '@aws-sdk/client-sso': 3.629.0 + '@aws-sdk/client-sts': 3.629.0 + '@aws-sdk/credential-provider-cognito-identity': 3.629.0 + '@aws-sdk/credential-provider-env': 3.620.1 + '@aws-sdk/credential-provider-http': 3.622.0 + '@aws-sdk/credential-provider-ini': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/credential-provider-node': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/credential-provider-process': 3.620.1 + '@aws-sdk/credential-provider-sso': 3.629.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.2.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/lib-storage@3.629.0(@aws-sdk/client-s3@3.629.0)': + dependencies: + '@aws-sdk/client-s3': 3.629.0 + '@smithy/abort-controller': 3.1.1 + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/smithy-client': 3.1.12 + buffer: 5.6.0 + events: 3.3.0 + stream-browserify: 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-bucket-endpoint@3.620.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-expect-continue@3.620.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-flexible-checksums@3.620.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-host-header@3.620.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-location-constraint@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-logger@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-recursion-detection@3.620.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-sdk-s3@3.629.0': + dependencies: + '@aws-sdk/core': 3.629.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/core': 2.3.2 + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-stream': 3.1.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-ssec@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-user-agent@3.620.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.614.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/region-config-resolver@3.614.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@aws-sdk/signature-v4-multi-region@3.629.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.629.0 + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/signature-v4': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.629.0(@aws-sdk/client-sts@3.629.0) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/types@3.609.0': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/util-arn-parser@3.568.0': + dependencies: + tslib: 2.6.3 + + '@aws-sdk/util-endpoints@3.614.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + '@smithy/util-endpoints': 2.0.5 + tslib: 2.6.3 + + '@aws-sdk/util-locate-window@3.568.0': + dependencies: + tslib: 2.6.3 + + '@aws-sdk/util-user-agent-browser@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + bowser: 2.11.0 + tslib: 2.6.3 + + '@aws-sdk/util-user-agent-node@3.614.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/util-utf8-browser@3.259.0': + dependencies: + tslib: 2.6.3 + + '@aws-sdk/xml-builder@3.609.0': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@azure/abort-controller@1.1.0': + dependencies: + tslib: 2.6.3 + + '@azure/abort-controller@2.1.2': + dependencies: + tslib: 2.6.3 + + '@azure/core-auth@1.7.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.9.2 + tslib: 2.6.3 + + '@azure/core-client@1.9.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.7.2 + '@azure/core-rest-pipeline': 1.16.3 + '@azure/core-tracing': 1.1.2 + '@azure/core-util': 1.9.2 + '@azure/logger': 1.1.4 + tslib: 2.6.3 + transitivePeerDependencies: + - supports-color + + '@azure/core-http-compat@2.1.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-client': 1.9.2 + '@azure/core-rest-pipeline': 1.16.3 + transitivePeerDependencies: + - supports-color + + '@azure/core-lro@2.7.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.9.2 + '@azure/logger': 1.1.4 + tslib: 2.6.3 + + '@azure/core-paging@1.6.2': + dependencies: + tslib: 2.6.3 + + '@azure/core-rest-pipeline@1.16.3': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.7.2 + '@azure/core-tracing': 1.1.2 + '@azure/core-util': 1.9.2 + '@azure/logger': 1.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + tslib: 2.6.3 + transitivePeerDependencies: + - supports-color + + '@azure/core-tracing@1.1.2': + dependencies: + tslib: 2.6.3 + + '@azure/core-util@1.9.2': + dependencies: + '@azure/abort-controller': 2.1.2 + tslib: 2.6.3 + + '@azure/core-xml@1.4.3': + dependencies: + fast-xml-parser: 4.4.1 + tslib: 2.6.3 + + '@azure/logger@1.1.4': + dependencies: + tslib: 2.6.3 + + '@azure/storage-blob@12.24.0': + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.7.2 + '@azure/core-client': 1.9.2 + '@azure/core-http-compat': 2.1.2 + '@azure/core-lro': 2.7.2 + '@azure/core-paging': 1.6.2 + '@azure/core-rest-pipeline': 1.16.3 + '@azure/core-tracing': 1.1.2 + '@azure/core-util': 1.9.2 + '@azure/core-xml': 1.4.3 + '@azure/logger': 1.1.4 + events: 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - supports-color + + '@babel/cli@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@jridgewell/trace-mapping': 0.3.25 + commander: 6.2.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.6.0 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.25.2': {} + + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.2.0': + dependencies: + '@babel/types': 7.25.2 + jsesc: 2.5.2 + lodash: 4.17.21 + source-map: 0.5.7 + trim-right: 1.0.1 + + '@babel/generator@7.25.0': + dependencies: + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.25.2 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.6(supports-color@5.5.0) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.24.8': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.25.2 + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-wrap-function': 7.25.0 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + dependencies: + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helper-wrap-function@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3 + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.25.3': + dependencies: + '@babel/types': 7.25.2 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/traverse': 7.25.3 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 + + '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + + '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + + '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + + '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/preset-env@7.25.3(@babel/core@7.25.2)': + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.25.2 + esutils: 2.0.3 + + '@babel/preset-react@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/regjsgen@0.8.0': {} + + '@babel/runtime@7.25.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + + '@babel/traverse@7.25.3': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.6(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@bufbuild/protobuf@1.10.0': {} + + '@clack/core@0.3.4': + dependencies: + picocolors: 1.0.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.7.0': + dependencies: + '@clack/core': 0.3.4 + picocolors: 1.0.1 + sisteransi: 1.0.5 + + '@discoveryjs/json-ext@0.5.7': {} + + '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + tslib: 2.6.3 + + '@dnd-kit/core@6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-06d0b89e-20240801) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-06d0b89e-20240801) + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + tslib: 2.6.3 + + '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@dnd-kit/core': 6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-06d0b89e-20240801) + react: 19.0.0-rc-06d0b89e-20240801 + tslib: 2.6.3 + + '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + tslib: 2.6.3 + + '@drizzle-team/brocli@0.8.2': {} + + '@effect/schema@0.68.12(effect@3.4.5)': + dependencies: + effect: 3.4.5 + fast-check: 3.21.0 + + '@emnapi/core@1.2.0': + dependencies: + '@emnapi/wasi-threads': 1.0.1 + tslib: 2.6.3 + optional: true + + '@emnapi/runtime@1.2.0': + dependencies: + tslib: 2.6.3 + optional: true + + '@emnapi/wasi-threads@1.0.1': + dependencies: + tslib: 2.6.3 + optional: true + + '@emotion/babel-plugin@11.12.0': + dependencies: + '@babel/helper-module-imports': 7.24.7 + '@babel/runtime': 7.25.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.0 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.13.1': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/css@11.13.0': + dependencies: + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.0 + transitivePeerDependencies: + - supports-color + + '@emotion/hash@0.9.2': {} + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.13.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0)': + dependencies: + '@babel/runtime': 7.25.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-06d0b89e-20240801) + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.0': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.9.0 + '@emotion/utils': 1.4.0 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.9.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + '@emotion/utils@1.4.0': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.7.6 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.9.1(jiti@1.21.6))': + dependencies: + eslint: 9.9.1(jiti@1.21.6) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint-react/ast@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + birecord: 0.1.1 + string-ts: 2.2.0 + ts-pattern: 5.3.1 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@eslint-react/core@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + birecord: 0.1.1 + short-unique-id: 5.2.0 + ts-pattern: 5.3.1 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@eslint-react/eslint-plugin@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + eslint-plugin-react-debug: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-react-dom: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-react-hooks-extra: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-react-naming-convention: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-react-web-api: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint-plugin-react-x: 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@eslint-react/jsx@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + ts-pattern: 5.3.1 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@eslint-react/shared@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-react/tools': 1.12.3 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + picomatch: 4.0.2 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@eslint-react/tools@1.12.3': {} + + '@eslint-react/types@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-react/tools': 1.12.3 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@eslint-react/var@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + ts-pattern: 5.3.1 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.6(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.1.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.6(supports-color@5.5.0) + espree: 10.1.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.9.1': {} + + '@eslint/object-schema@2.1.4': {} + + '@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + body-scroll-lock: 4.0.0-beta.0 + focus-trap: 7.5.4 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + + '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@fastify/busboy@2.1.1': {} + + '@floating-ui/core@1.6.7': + dependencies: + '@floating-ui/utils': 0.2.7 + + '@floating-ui/dom@1.6.10': + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 + + '@floating-ui/react-dom@2.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@floating-ui/dom': 1.6.10 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@floating-ui/react@0.26.22(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@floating-ui/react-dom': 2.1.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@floating-ui/utils': 0.2.7 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.7': {} + + '@google-cloud/paginator@5.0.2': + dependencies: + arrify: 2.0.1 + extend: 3.0.2 + + '@google-cloud/projectify@4.0.0': {} + + '@google-cloud/promisify@4.0.0': {} + + '@google-cloud/storage@7.12.1': + dependencies: + '@google-cloud/paginator': 5.0.2 + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.0.0 + abort-controller: 3.0.0 + async-retry: 1.3.3 + duplexify: 4.1.3 + fast-xml-parser: 4.4.1 + gaxios: 6.7.1 + google-auth-library: 9.13.0 + html-entities: 2.5.2 + mime: 3.0.0 + p-limit: 3.1.0 + retry-request: 7.0.2 + teeny-request: 9.0.0 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.0': {} + + '@hyrious/esbuild-plugin-commonjs@0.2.4(cjs-module-lexer@1.3.1)(esbuild@0.23.1)': + dependencies: + esbuild: 0.23.1 + optionalDependencies: + cjs-module-lexer: 1.3.1 + + '@img/sharp-darwin-arm64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.2 + optional: true + + '@img/sharp-darwin-x64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.2 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.2': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.2': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.2': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.2': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.2': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.2': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.2': + optional: true + + '@img/sharp-linux-arm64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.2 + optional: true + + '@img/sharp-linux-arm@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.2 + optional: true + + '@img/sharp-linux-s390x@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.2 + optional: true + + '@img/sharp-linux-x64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.2 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + optional: true + + '@img/sharp-wasm32@0.33.4': + dependencies: + '@emnapi/runtime': 1.2.0 + optional: true + + '@img/sharp-win32-ia32@0.33.4': + optional: true + + '@img/sharp-win32-x64@0.33.4': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/create-cache-key-function@29.7.0': + dependencies: + '@jest/types': 29.6.3 + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.12.5 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 20.12.5 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.25.2 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@24.9.0': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 1.1.2 + '@types/yargs': 13.0.12 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.12.5 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jsdevtools/ono@7.1.3': {} + + '@juggle/resize-observer@3.4.0': {} + + '@lexical/clipboard@0.17.0': + dependencies: + '@lexical/html': 0.17.0 + '@lexical/list': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/code@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + prismjs: 1.29.0 + + '@lexical/devtools-core@0.17.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@lexical/html': 0.17.0 + '@lexical/link': 0.17.0 + '@lexical/mark': 0.17.0 + '@lexical/table': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@lexical/dragon@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/eslint-plugin@0.17.0(eslint@9.9.1(jiti@1.21.6))': + dependencies: + eslint: 9.9.1(jiti@1.21.6) + + '@lexical/hashtag@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/headless@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/history@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/html@0.17.0': + dependencies: + '@lexical/selection': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/link@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/list@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/mark@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/markdown@0.17.0': + dependencies: + '@lexical/code': 0.17.0 + '@lexical/link': 0.17.0 + '@lexical/list': 0.17.0 + '@lexical/rich-text': 0.17.0 + '@lexical/text': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/offset@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/overflow@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/plain-text@0.17.0': + dependencies: + '@lexical/clipboard': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/react@0.17.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(yjs@13.6.18)': + dependencies: + '@lexical/clipboard': 0.17.0 + '@lexical/code': 0.17.0 + '@lexical/devtools-core': 0.17.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@lexical/dragon': 0.17.0 + '@lexical/hashtag': 0.17.0 + '@lexical/history': 0.17.0 + '@lexical/link': 0.17.0 + '@lexical/list': 0.17.0 + '@lexical/mark': 0.17.0 + '@lexical/markdown': 0.17.0 + '@lexical/overflow': 0.17.0 + '@lexical/plain-text': 0.17.0 + '@lexical/rich-text': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/table': 0.17.0 + '@lexical/text': 0.17.0 + '@lexical/utils': 0.17.0 + '@lexical/yjs': 0.17.0(yjs@13.6.18) + lexical: 0.17.0 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-error-boundary: 3.1.4(react@19.0.0-rc-06d0b89e-20240801) + transitivePeerDependencies: + - yjs + + '@lexical/rich-text@0.17.0': + dependencies: + '@lexical/clipboard': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/selection@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/table@0.17.0': + dependencies: + '@lexical/utils': 0.17.0 + lexical: 0.17.0 + + '@lexical/text@0.17.0': + dependencies: + lexical: 0.17.0 + + '@lexical/utils@0.17.0': + dependencies: + '@lexical/list': 0.17.0 + '@lexical/selection': 0.17.0 + '@lexical/table': 0.17.0 + lexical: 0.17.0 + + '@lexical/yjs@0.17.0(yjs@13.6.18)': + dependencies: + '@lexical/offset': 0.17.0 + lexical: 0.17.0 + yjs: 13.6.18 + + '@libsql/client@0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@libsql/core': 0.6.2 + '@libsql/hrana-client': 0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + js-base64: 3.7.7 + libsql: 0.3.19 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/core@0.6.2': + dependencies: + js-base64: 3.7.7 + + '@libsql/darwin-arm64@0.3.19': + optional: true + + '@libsql/darwin-x64@0.3.19': + optional: true + + '@libsql/hrana-client@0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@libsql/isomorphic-fetch': 0.2.5 + '@libsql/isomorphic-ws': 0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) + js-base64: 3.7.7 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/isomorphic-fetch@0.2.5': {} + + '@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + '@types/ws': 8.5.12 + ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/linux-arm64-gnu@0.3.19': + optional: true + + '@libsql/linux-arm64-musl@0.3.19': + optional: true + + '@libsql/linux-x64-gnu@0.3.19': + optional: true + + '@libsql/linux-x64-musl@0.3.19': + optional: true + + '@libsql/win32-x64-msvc@0.3.19': + optional: true + + '@mole-inc/bin-wrapper@8.0.1': + dependencies: + bin-check: 4.1.0 + bin-version-check: 5.1.0 + content-disposition: 0.5.4 + ext-name: 5.0.0 + file-type: 17.1.6 + filenamify: 5.1.1 + got: 11.8.6 + os-filter-obj: 2.0.0 + + '@monaco-editor/loader@1.4.0(monaco-editor@0.38.0)': + dependencies: + monaco-editor: 0.38.0 + state-local: 1.0.7 + + '@monaco-editor/react@4.6.0(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@monaco-editor/loader': 1.4.0(monaco-editor@0.38.0) + monaco-editor: 0.38.0 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@mongodb-js/saslprep@1.1.8': + dependencies: + sparse-bitfield: 3.0.3 + optional: true + + '@napi-rs/wasm-runtime@0.2.4': + dependencies: + '@emnapi/core': 1.2.0 + '@emnapi/runtime': 1.2.0 + '@tybys/wasm-util': 0.9.0 + optional: true + + '@neon-rs/load@0.0.4': {} + + '@neondatabase/serverless@0.9.4': + dependencies: + '@types/pg': 8.11.6 + + '@next/bundle-analyzer@15.0.0-canary.104(bufferutil@4.0.8)': + dependencies: + webpack-bundle-analyzer: 4.10.1(bufferutil@4.0.8) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@next/env@15.0.0-canary.104': {} + + '@next/env@15.0.0-rc.0': {} + + '@next/eslint-plugin-next@15.0.0-canary.104': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.0.0-canary.104': + optional: true + + '@next/swc-darwin-x64@15.0.0-canary.104': + optional: true + + '@next/swc-linux-arm64-gnu@15.0.0-canary.104': + optional: true + + '@next/swc-linux-arm64-musl@15.0.0-canary.104': + optional: true + + '@next/swc-linux-x64-gnu@15.0.0-canary.104': + optional: true + + '@next/swc-linux-x64-musl@15.0.0-canary.104': + optional: true + + '@next/swc-win32-arm64-msvc@15.0.0-canary.104': + optional: true + + '@next/swc-win32-ia32-msvc@15.0.0-canary.104': + optional: true + + '@next/swc-win32-x64-msvc@15.0.0-canary.104': + optional: true + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@one-ini/wasm@0.1.1': {} + + '@oxc-resolver/binding-darwin-arm64@1.10.2': + optional: true + + '@oxc-resolver/binding-darwin-x64@1.10.2': + optional: true + + '@oxc-resolver/binding-freebsd-x64@1.10.2': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@1.10.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@1.10.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@1.10.2': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@1.10.2': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@1.10.2': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@1.10.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.4 + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@1.10.2': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@1.10.2': + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@playwright/test@1.46.0': + dependencies: + playwright: 1.46.0 + + '@polka/url@1.0.0-next.25': {} + + '@react-email/render@0.0.7': + dependencies: + html-to-text: 9.0.3 + pretty: 2.0.0 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + '@selderee/plugin-htmlparser2@0.10.0': + dependencies: + domhandler: 5.0.3 + selderee: 0.10.0 + + '@sentry-internal/feedback@7.118.0': + dependencies: + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + + '@sentry-internal/replay-canvas@7.118.0': + dependencies: + '@sentry/core': 7.118.0 + '@sentry/replay': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + + '@sentry-internal/tracing@7.118.0': + dependencies: + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + + '@sentry/browser@7.118.0': + dependencies: + '@sentry-internal/feedback': 7.118.0 + '@sentry-internal/replay-canvas': 7.118.0 + '@sentry-internal/tracing': 7.118.0 + '@sentry/core': 7.118.0 + '@sentry/integrations': 7.118.0 + '@sentry/replay': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + + '@sentry/core@7.118.0': + dependencies: + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + + '@sentry/integrations@7.118.0': + dependencies: + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + localforage: 1.10.0 + + '@sentry/node@7.118.0': + dependencies: + '@sentry-internal/tracing': 7.118.0 + '@sentry/core': 7.118.0 + '@sentry/integrations': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + + '@sentry/react@7.118.0(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@sentry/browser': 7.118.0 + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + hoist-non-react-statics: 3.3.2 + react: 19.0.0-rc-06d0b89e-20240801 + + '@sentry/replay@7.118.0': + dependencies: + '@sentry-internal/tracing': 7.118.0 + '@sentry/core': 7.118.0 + '@sentry/types': 7.118.0 + '@sentry/utils': 7.118.0 + + '@sentry/types@7.118.0': {} + + '@sentry/utils@7.118.0': + dependencies: + '@sentry/types': 7.118.0 + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@4.6.0': {} + + '@sindresorhus/slugify@1.1.2': + dependencies: + '@sindresorhus/transliterate': 0.1.2 + escape-string-regexp: 4.0.0 + + '@sindresorhus/transliterate@0.1.2': + dependencies: + escape-string-regexp: 2.0.0 + lodash.deburr: 4.1.0 + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@smithy/abort-controller@3.1.1': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/chunked-blob-reader-native@3.0.0': + dependencies: + '@smithy/util-base64': 3.0.0 + tslib: 2.6.3 + + '@smithy/chunked-blob-reader@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/config-resolver@3.0.5': + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@smithy/core@2.3.2': + dependencies: + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-retry': 3.0.14 + '@smithy/middleware-serde': 3.0.3 + '@smithy/protocol-http': 4.1.0 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@smithy/credential-provider-imds@3.2.0': + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + tslib: 2.6.3 + + '@smithy/eventstream-codec@3.1.2': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 3.3.0 + '@smithy/util-hex-encoding': 3.0.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-browser@3.0.6': + dependencies: + '@smithy/eventstream-serde-universal': 3.0.5 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-config-resolver@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-node@3.0.5': + dependencies: + '@smithy/eventstream-serde-universal': 3.0.5 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-universal@3.0.5': + dependencies: + '@smithy/eventstream-codec': 3.1.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/fetch-http-handler@3.2.4': + dependencies: + '@smithy/protocol-http': 4.1.0 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + '@smithy/util-base64': 3.0.0 + tslib: 2.6.3 + + '@smithy/hash-blob-browser@3.1.2': + dependencies: + '@smithy/chunked-blob-reader': 3.0.0 + '@smithy/chunked-blob-reader-native': 3.0.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/hash-node@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/hash-stream-node@3.1.2': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/invalid-dependency@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.6.3 + + '@smithy/is-array-buffer@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/md5-js@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/middleware-content-length@3.0.5': + dependencies: + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/middleware-endpoint@3.1.0': + dependencies: + '@smithy/middleware-serde': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@smithy/middleware-retry@3.0.14': + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/protocol-http': 4.1.0 + '@smithy/service-error-classification': 3.0.3 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + tslib: 2.6.3 + uuid: 9.0.1 + + '@smithy/middleware-serde@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/middleware-stack@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/node-config-provider@3.1.4': + dependencies: + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/node-http-handler@3.1.4': + dependencies: + '@smithy/abort-controller': 3.1.1 + '@smithy/protocol-http': 4.1.0 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/property-provider@3.1.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/protocol-http@4.1.0': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/querystring-builder@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-uri-escape': 3.0.0 + tslib: 2.6.3 + + '@smithy/querystring-parser@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/service-error-classification@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + + '@smithy/shared-ini-file-loader@3.1.4': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/signature-v4@4.1.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/smithy-client@3.1.12': + dependencies: + '@smithy/middleware-endpoint': 3.1.0 + '@smithy/middleware-stack': 3.0.3 + '@smithy/protocol-http': 4.1.0 + '@smithy/types': 3.3.0 + '@smithy/util-stream': 3.1.3 + tslib: 2.6.3 + + '@smithy/types@3.3.0': + dependencies: + tslib: 2.6.3 + + '@smithy/url-parser@3.0.3': + dependencies: + '@smithy/querystring-parser': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-base64@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-body-length-browser@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-body-length-node@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.6.3 + + '@smithy/util-buffer-from@3.0.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-config-provider@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-defaults-mode-browser@3.0.14': + dependencies: + '@smithy/property-provider': 3.1.3 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + bowser: 2.11.0 + tslib: 2.6.3 + + '@smithy/util-defaults-mode-node@3.0.14': + dependencies: + '@smithy/config-resolver': 3.0.5 + '@smithy/credential-provider-imds': 3.2.0 + '@smithy/node-config-provider': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/smithy-client': 3.1.12 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-endpoints@2.0.5': + dependencies: + '@smithy/node-config-provider': 3.1.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-hex-encoding@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-middleware@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-retry@3.0.3': + dependencies: + '@smithy/service-error-classification': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-stream@3.1.3': + dependencies: + '@smithy/fetch-http-handler': 3.2.4 + '@smithy/node-http-handler': 3.1.4 + '@smithy/types': 3.3.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-uri-escape@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.6.3 + + '@smithy/util-utf8@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-waiter@3.1.2': + dependencies: + '@smithy/abort-controller': 3.1.1 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@swc-node/core@1.13.3(@swc/core@1.7.10(@swc/helpers@0.5.12))(@swc/types@0.1.12)': + dependencies: + '@swc/core': 1.7.10(@swc/helpers@0.5.12) + '@swc/types': 0.1.12 + + '@swc-node/register@1.10.9(@swc/core@1.7.10(@swc/helpers@0.5.12))(@swc/types@0.1.12)(typescript@5.5.4)': + dependencies: + '@swc-node/core': 1.13.3(@swc/core@1.7.10(@swc/helpers@0.5.12))(@swc/types@0.1.12) + '@swc-node/sourcemap-support': 0.5.1 + '@swc/core': 1.7.10(@swc/helpers@0.5.12) + colorette: 2.0.20 + debug: 4.3.6(supports-color@5.5.0) + oxc-resolver: 1.10.2 + pirates: 4.0.6 + tslib: 2.6.3 + typescript: 5.5.4 + transitivePeerDependencies: + - '@swc/types' + - supports-color + + '@swc-node/sourcemap-support@0.5.1': + dependencies: + source-map-support: 0.5.21 + tslib: 2.6.3 + + '@swc/cli@0.4.0(@swc/core@1.7.10(@swc/helpers@0.5.12))(chokidar@3.6.0)': + dependencies: + '@mole-inc/bin-wrapper': 8.0.1 + '@swc/core': 1.7.10(@swc/helpers@0.5.12) + '@swc/counter': 0.1.3 + commander: 8.3.0 + fast-glob: 3.3.2 + minimatch: 9.0.5 + piscina: 4.6.1 + semver: 7.6.3 + slash: 3.0.0 + source-map: 0.7.4 + optionalDependencies: + chokidar: 3.6.0 + + '@swc/core-darwin-arm64@1.7.10': + optional: true + + '@swc/core-darwin-x64@1.7.10': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.7.10': + optional: true + + '@swc/core-linux-arm64-gnu@1.7.10': + optional: true + + '@swc/core-linux-arm64-musl@1.7.10': + optional: true + + '@swc/core-linux-x64-gnu@1.7.10': + optional: true + + '@swc/core-linux-x64-musl@1.7.10': + optional: true + + '@swc/core-win32-arm64-msvc@1.7.10': + optional: true + + '@swc/core-win32-ia32-msvc@1.7.10': + optional: true + + '@swc/core-win32-x64-msvc@1.7.10': + optional: true + + '@swc/core@1.7.10(@swc/helpers@0.5.12)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.12 + optionalDependencies: + '@swc/core-darwin-arm64': 1.7.10 + '@swc/core-darwin-x64': 1.7.10 + '@swc/core-linux-arm-gnueabihf': 1.7.10 + '@swc/core-linux-arm64-gnu': 1.7.10 + '@swc/core-linux-arm64-musl': 1.7.10 + '@swc/core-linux-x64-gnu': 1.7.10 + '@swc/core-linux-x64-musl': 1.7.10 + '@swc/core-win32-arm64-msvc': 1.7.10 + '@swc/core-win32-ia32-msvc': 1.7.10 + '@swc/core-win32-x64-msvc': 1.7.10 + '@swc/helpers': 0.5.12 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.12': + dependencies: + tslib: 2.6.3 + + '@swc/jest@0.2.36(@swc/core@1.7.10(@swc/helpers@0.5.12))': + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@swc/core': 1.7.10(@swc/helpers@0.5.12) + '@swc/counter': 0.1.3 + jsonc-parser: 3.3.1 + + '@swc/types@0.1.12': + dependencies: + '@swc/counter': 0.1.3 + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tokenizer/token@0.3.0': {} + + '@tootallnate/once@2.0.0': {} + + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.6.3 + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.25.2 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.25.2 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.12.5 + + '@types/body-scroll-lock@3.1.2': {} + + '@types/busboy@1.5.4': + dependencies: + '@types/node': 20.12.5 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.12.5 + '@types/responselike': 1.0.3 + + '@types/caseless@0.12.5': {} + + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.12.5 + + '@types/degit@2.8.6': {} + + '@types/escape-html@1.0.4': {} + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/eslint__js@8.42.3': + dependencies: + '@types/eslint': 9.6.1 + + '@types/esprima@4.0.6': + dependencies: + '@types/estree': 1.0.5 + + '@types/estree@1.0.5': {} + + '@types/express-serve-static-core@4.19.5': + dependencies: + '@types/node': 20.12.5 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + + '@types/find-node-modules@2.1.2': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 20.12.5 + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 20.12.5 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.12.5 + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 20.12.5 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/http-errors@2.0.4': {} + + '@types/is-hotkey@0.1.10': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@1.1.2': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-lib-report': 3.0.3 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.12': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/jsdom@20.0.1': + dependencies: + '@types/node': 20.12.5 + '@types/tough-cookie': 4.0.5 + parse5: 7.1.2 + + '@types/json-schema@7.0.15': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 20.12.5 + + '@types/jsonwebtoken@8.5.9': + dependencies: + '@types/node': 20.12.5 + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.12.5 + + '@types/lodash.get@4.4.9': + dependencies: + '@types/lodash': 4.17.7 + + '@types/lodash@4.17.7': {} + + '@types/mime@1.3.5': {} + + '@types/minimatch@5.1.2': {} + + '@types/minimist@1.2.2': {} + + '@types/minimist@1.2.5': {} + + '@types/mongoose-aggregate-paginate-v2@1.0.6(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))': + dependencies: + mongoose: 6.12.3(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - supports-color + + '@types/node@20.12.5': + dependencies: + undici-types: 5.26.5 + + '@types/nodemailer@6.4.14': + dependencies: + '@types/node': 20.12.5 + + '@types/parse-json@4.0.2': {} + + '@types/pg@8.10.2': + dependencies: + '@types/node': 20.12.5 + pg-protocol: 1.6.1 + pg-types: 4.0.2 + + '@types/pg@8.11.6': + dependencies: + '@types/node': 20.12.5 + pg-protocol: 1.6.1 + pg-types: 4.0.2 + + '@types/pluralize@0.0.33': {} + + '@types/prompts@2.4.9': + dependencies: + '@types/node': 20.12.5 + kleur: 3.0.3 + + '@types/qs@6.9.15': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-datepicker@6.2.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)': + dependencies: + '@floating-ui/react': 0.26.22(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + '@types/react': types-react@19.0.0-rc.0 + date-fns: 3.3.1 + transitivePeerDependencies: + - react + - react-dom + + '@types/react-transition-group@4.4.11': + dependencies: + '@types/react': types-react@19.0.0-rc.0 + + '@types/request@2.48.12': + dependencies: + '@types/caseless': 0.12.5 + '@types/node': 20.12.5 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.1 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.12.5 + + '@types/semver@7.5.8': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.12.5 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 20.12.5 + '@types/send': 0.17.4 + + '@types/shelljs@0.8.15': + dependencies: + '@types/glob': 7.2.0 + '@types/node': 20.12.5 + + '@types/stack-utils@2.0.3': {} + + '@types/to-snake-case@1.0.0': {} + + '@types/tough-cookie@4.0.5': {} + + '@types/uuid@10.0.0': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@8.2.2': + dependencies: + '@types/node': 20.12.5 + '@types/webidl-conversions': 7.0.3 + + '@types/ws@8.5.12': + dependencies: + '@types/node': 20.12.5 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@13.0.12': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.3.0 + eslint: 9.9.1(jiti@1.21.6) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.3.0 + debug: 4.3.6(supports-color@5.5.0) + eslint: 9.9.1(jiti@1.21.6) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.3.0': + dependencies: + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 + + '@typescript-eslint/type-utils@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + debug: 4.3.6(supports-color@5.5.0) + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - eslint + - supports-color + + '@typescript-eslint/types@8.3.0': {} + + '@typescript-eslint/typescript-estree@8.3.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 + debug: 4.3.6(supports-color@5.5.0) + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@8.3.0': + dependencies: + '@typescript-eslint/types': 8.3.0 + eslint-visitor-keys: 3.4.3 + + '@uploadthing/mime-types@0.2.10': {} + + '@uploadthing/shared@6.7.8': + dependencies: + '@uploadthing/mime-types': 0.2.10 + effect: 3.4.5 + std-env: 3.7.0 + + '@vercel/blob@0.22.3': + dependencies: + async-retry: 1.3.3 + bytes: 3.1.2 + is-buffer: 2.0.5 + undici: 5.28.4 + + '@vercel/postgres@0.9.0': + dependencies: + '@neondatabase/serverless': 0.9.4 + bufferutil: 4.0.8 + utf-8-validate: 6.0.4 + ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + + '@vue/compiler-core@3.4.37': + dependencies: + '@babel/parser': 7.25.3 + '@vue/shared': 3.4.37 + entities: 5.0.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.37': + dependencies: + '@vue/compiler-core': 3.4.37 + '@vue/shared': 3.4.37 + + '@vue/compiler-sfc@3.4.37': + dependencies: + '@babel/parser': 7.25.3 + '@vue/compiler-core': 3.4.37 + '@vue/compiler-dom': 3.4.37 + '@vue/compiler-ssr': 3.4.37 + '@vue/shared': 3.4.37 + estree-walker: 2.0.2 + magic-string: 0.30.11 + postcss: 8.4.41 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.37': + dependencies: + '@vue/compiler-dom': 3.4.37 + '@vue/shared': 3.4.37 + + '@vue/reactivity@3.4.37': + dependencies: + '@vue/shared': 3.4.37 + + '@vue/runtime-core@3.4.37': + dependencies: + '@vue/reactivity': 3.4.37 + '@vue/shared': 3.4.37 + + '@vue/runtime-dom@3.4.37': + dependencies: + '@vue/reactivity': 3.4.37 + '@vue/runtime-core': 3.4.37 + '@vue/shared': 3.4.37 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.37(vue@3.4.37(typescript@5.5.4))': + dependencies: + '@vue/compiler-ssr': 3.4.37 + '@vue/shared': 3.4.37 + vue: 3.4.37(typescript@5.5.4) + + '@vue/shared@3.4.37': {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-globals@7.0.1: + dependencies: + acorn: 8.12.1 + acorn-walk: 8.3.3 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + agent-base@7.1.1: + dependencies: + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.14.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + amazon-cognito-identity-js@6.3.12: + dependencies: + '@aws-crypto/sha256-js': 1.2.2 + buffer: 4.9.2 + fast-base64-decode: 1.0.0 + isomorphic-unfetch: 3.1.0 + js-cookie: 2.2.1 + transitivePeerDependencies: + - encoding + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arch@2.2.0: {} + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.1.3: + dependencies: + deep-equal: 2.2.3 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-flatten@1.1.1: {} + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-timsort@1.0.3: {} + + array-union@2.1.0: {} + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + arrify@2.0.1: {} + + ast-types-flow@0.0.8: {} + + async-mutex@0.4.1: + dependencies: + tslib: 2.6.3 + + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + async@3.2.5: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + atomic-sleep@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axe-core@4.10.0: {} + + axios@1.4.0: + dependencies: + follow-redirects: 1.15.6(debug@4.3.6) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@3.1.1: + dependencies: + deep-equal: 2.2.3 + + b4a@1.6.6: {} + + babel-jest@29.7.0(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.25.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.24.8 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.25.0 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822: + dependencies: + '@babel/generator': 7.2.0 + '@babel/types': 7.25.2 + chalk: 4.1.2 + invariant: 2.2.4 + pretty-format: 24.9.0 + zod: 3.23.8 + zod-validation-error: 2.1.0(zod@3.23.8) + + babel-plugin-transform-remove-imports@1.8.0(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + + babel-preset-jest@29.6.3(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) + + balanced-match@1.0.2: {} + + bare-events@2.4.2: + optional: true + + bare-fs@2.3.1: + dependencies: + bare-events: 2.4.2 + bare-path: 2.1.3 + bare-stream: 2.1.3 + optional: true + + bare-os@2.4.0: + optional: true + + bare-path@2.1.3: + dependencies: + bare-os: 2.4.0 + optional: true + + bare-stream@2.1.3: + dependencies: + streamx: 2.18.0 + optional: true + + base64-js@1.5.1: {} + + big-integer@1.6.52: {} + + bignumber.js@9.1.2: {} + + bin-check@4.1.0: + dependencies: + execa: 0.7.0 + executable: 4.1.1 + + bin-version-check@5.1.0: + dependencies: + bin-version: 6.0.0 + semver: 7.6.3 + semver-truncate: 3.0.0 + + bin-version@6.0.0: + dependencies: + execa: 5.1.1 + find-versions: 5.1.0 + + binary-extensions@2.3.0: {} + + birecord@0.1.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + body-scroll-lock@4.0.0-beta.0: {} + + bowser@2.11.0: {} + + bplist-parser@0.2.0: + dependencies: + big-integer: 1.6.52 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.6 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + bson-objectid@2.0.4: {} + + bson@4.7.2: + dependencies: + buffer: 5.7.1 + + bson@5.5.1: {} + + buffer-builder@0.2.0: {} + + buffer-crc32@0.2.13: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer-writer@2.0.0: {} + + buffer@4.9.2: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + + buffer@5.6.0: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.0.8: + dependencies: + node-gyp-build: 4.8.1 + + bundle-name@3.0.0: + dependencies: + run-applescript: 5.0.0 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytes@3.1.2: {} + + c12@1.11.1: + dependencies: + chokidar: 3.6.0 + confbox: 0.1.7 + defu: 6.1.4 + dotenv: 16.4.5 + giget: 1.2.3 + jiti: 1.21.6 + mlly: 1.7.1 + ohash: 1.1.3 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.1.3 + rc9: 2.1.2 + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001651: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + changelogen@0.5.5: + dependencies: + c12: 1.11.1 + colorette: 2.0.20 + consola: 3.2.3 + convert-gitmoji: 0.1.5 + execa: 8.0.1 + mri: 1.2.0 + node-fetch-native: 1.6.4 + ofetch: 1.3.4 + open: 9.1.0 + pathe: 1.1.2 + pkg-types: 1.1.3 + scule: 1.3.0 + semver: 7.6.3 + std-env: 3.7.0 + yaml: 2.5.0 + transitivePeerDependencies: + - magicast + + char-regex@1.0.2: {} + + charenc@0.0.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + chownr@2.0.0: {} + + ci-info@3.9.0: {} + + ci-info@4.0.0: {} + + citty@0.1.6: + dependencies: + consola: 3.2.3 + + cjs-module-lexer@1.3.1: {} + + classnames@2.5.1: {} + + clean-stack@2.2.0: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + client-only@0.0.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clsx@2.1.1: {} + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + + commander@6.2.1: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + comment-json@4.2.5: + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + has-own-prop: 2.0.0 + repeat-string: 1.6.1 + + comment-parser@1.4.1: {} + + commondir@1.0.1: {} + + compute-scroll-into-view@1.0.20: {} + + concat-map@0.0.1: {} + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + confbox@0.1.7: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + consola@3.2.3: {} + + console-table-printer@2.11.2: + dependencies: + simple-wcswidth: 1.0.1 + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-gitmoji@0.1.5: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.6.0: {} + + copyfiles@2.4.1: + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + noms: 0.0.0 + through2: 2.0.5 + untildify: 4.0.0 + yargs: 16.2.0 + + core-js-compat@3.38.0: + dependencies: + browserslist: 4.23.3 + + core-util-is@1.0.3: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + create-jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.3 + + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypt@0.0.2: {} + + crypto-random-string@2.0.0: {} + + cssfilter@0.0.10: {} + + cssom@0.3.8: {} + + cssom@0.5.0: {} + + cssstyle@2.3.0: + dependencies: + cssom: 0.3.8 + + csstype@3.1.3: {} + + damerau-levenshtein@1.0.8: {} + + data-uri-to-buffer@4.0.1: {} + + data-urls@3.0.2: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dataloader@2.2.2: {} + + date-fns@3.3.1: {} + + dateformat@4.6.3: {} + + debounce@1.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.6(supports-color@5.5.0): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 5.5.0 + + decimal.js@10.4.3: {} + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + dedent@1.5.3(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 + + deep-equal@2.2.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + isarray: 2.0.5 + object-is: 1.1.6 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.6 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + default-browser-id@3.0.0: + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + + default-browser-id@5.0.0: {} + + default-browser@4.0.0: + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.4: {} + + degit@2.8.4: {} + + del@6.1.1: + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destr@2.0.3: {} + + destroy@1.2.0: {} + + detect-file@1.0.0: {} + + detect-indent@7.0.1: {} + + detect-libc@2.0.2: {} + + detect-libc@2.0.3: {} + + detect-newline@3.1.0: {} + + detect-newline@4.0.1: {} + + diff-sequences@29.6.3: {} + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + direction@1.0.4: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.25.0 + csstype: 3.1.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domexception@4.0.0: + dependencies: + webidl-conversions: 7.0.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dotenv@16.4.5: {} + + drizzle-kit@0.23.2-df9e596: + dependencies: + '@drizzle-team/brocli': 0.8.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.19.12 + esbuild-register: 3.6.0(esbuild@0.19.12) + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.32.1(@libsql/client@0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + optionalDependencies: + '@libsql/client': 0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@neondatabase/serverless': 0.9.4 + '@types/pg': 8.10.2 + '@types/react': types-react@19.0.0-rc.0 + '@vercel/postgres': 0.9.0 + pg: 8.11.3 + react: 19.0.0-rc-06d0b89e-20240801 + + drizzle-orm@0.32.1(@libsql/client@0.6.2(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + optionalDependencies: + '@libsql/client': 0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@neondatabase/serverless': 0.9.4 + '@types/pg': 8.11.6 + '@types/react': types-react@19.0.0-rc.0 + '@vercel/postgres': 0.9.0 + pg: 8.11.3 + react: 19.0.0-rc-06d0b89e-20240801 + + duplexer@0.1.2: {} + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.3 + + ee-first@1.1.1: {} + + effect@3.4.5: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.6: {} + + emittery@0.13.1: {} + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + entities@4.5.0: {} + + entities@5.0.0: {} + + environment@1.1.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-get-iterator@1.1.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + + es-iterator-helpers@1.0.19: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esbuild-register@3.6.0(esbuild@0.19.12): + dependencies: + debug: 4.3.6(supports-color@5.5.0) + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + + esbuild-sass-plugin@3.3.1(esbuild@0.23.1)(sass-embedded@1.77.8): + dependencies: + esbuild: 0.23.1 + resolve: 1.22.8 + safe-identifier: 0.4.2 + sass: 1.77.4 + sass-embedded: 1.77.8 + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-config-prettier@9.1.0(eslint@9.9.1(jiti@1.21.6)): + dependencies: + eslint: 9.9.1(jiti@1.21.6) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.15.0 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import-x@4.1.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + debug: 4.3.6(supports-color@5.5.0) + doctrine: 3.0.0 + eslint: 9.9.1(jiti@1.21.6) + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.7.6 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + stable-hash: 0.0.4 + tslib: 2.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jest-dom@5.4.0(eslint@9.9.1(jiti@1.21.6)): + dependencies: + '@babel/runtime': 7.25.0 + eslint: 9.9.1(jiti@1.21.6) + requireindex: 1.2.0 + + eslint-plugin-jest@28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4): + dependencies: + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + jest: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jsx-a11y@6.9.0(eslint@9.9.1(jiti@1.21.6)): + dependencies: + aria-query: 5.1.3 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.10.0 + axobject-query: 3.1.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 + eslint: 9.9.1(jiti@1.21.6) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.0.3 + string.prototype.includes: 2.0.0 + + eslint-plugin-perfectionist@3.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + minimatch: 10.0.1 + natural-compare-lite: 1.4.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-playwright@1.6.2(eslint-plugin-jest@28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)): + dependencies: + eslint: 9.9.1(jiti@1.21.6) + globals: 13.24.0 + optionalDependencies: + eslint-plugin-jest: 28.8.1(@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4) + + eslint-plugin-react-compiler@0.0.0-experimental-72f06b2-20240822(eslint@9.9.1(jiti@1.21.6)): + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.3 + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.25.2) + eslint: 9.9.1(jiti@1.21.6) + hermes-parser: 0.20.1 + zod: 3.23.8 + zod-validation-error: 3.3.1(zod@3.23.8) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-debug@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + string-ts: 2.2.0 + ts-pattern: 5.3.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-dom@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + ts-pattern: 5.3.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-hooks-extra@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + ts-pattern: 5.3.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-hooks@5.1.0-rc-a19a8ab4-20240829(eslint@9.9.1(jiti@1.21.6)): + dependencies: + eslint: 9.9.1(jiti@1.21.6) + + eslint-plugin-react-naming-convention@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + ts-pattern: 5.3.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-web-api@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + birecord: 0.1.1 + eslint: 9.9.1(jiti@1.21.6) + ts-pattern: 5.3.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-x@1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@eslint-react/ast': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/core': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/jsx': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/shared': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/tools': 1.12.3 + '@eslint-react/types': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@eslint-react/var': 1.12.3(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + is-immutable-type: 5.0.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + ts-pattern: 5.3.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + eslint-plugin-regexp@2.6.0(eslint@9.9.1(jiti@1.21.6)): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + '@eslint-community/regexpp': 4.11.0 + comment-parser: 1.4.1 + eslint: 9.9.1(jiti@1.21.6) + jsdoc-type-pratt-parser: 4.1.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scslre: 0.3.0 + + eslint-scope@8.0.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.0.0: {} + + eslint@9.9.1(jiti@1.21.6): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.18.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.9.1 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6(supports-color@5.5.0) + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 + transitivePeerDependencies: + - supports-color + + espree@10.1.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + + esprima-next@6.0.3: {} + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + execa@0.7.0: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@7.2.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + executable@4.1.1: + dependencies: + pify: 2.3.0 + + exit@0.1.2: {} + + expand-template@2.0.3: {} + + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + express@4.19.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + ext-list@2.2.2: + dependencies: + mime-db: 1.53.0 + + ext-name@5.0.0: + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fast-base64-decode@1.0.0: {} + + fast-check@3.21.0: + dependencies: + pure-rand: 6.1.0 + + fast-copy@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fast-xml-parser@4.4.1: + dependencies: + strnum: 1.0.5 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.0.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + file-type@17.1.6: + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.1.1 + token-types: 5.0.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + filename-reserved-regex@3.0.0: {} + + filenamify@5.1.1: + dependencies: + filename-reserved-regex: 3.0.0 + strip-outer: 2.0.0 + trim-repeated: 2.0.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.2.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-node-modules@2.1.3: + dependencies: + findup-sync: 4.0.0 + merge: 2.1.1 + + find-root@1.1.0: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + find-versions@5.1.0: + dependencies: + semver-regex: 4.0.5 + + findup-sync@4.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.7 + resolve-dir: 1.0.1 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + focus-trap@7.5.4: + dependencies: + tabbable: 6.2.0 + + follow-redirects@1.15.6(debug@4.3.6): + optionalDependencies: + debug: 4.3.6(supports-color@5.5.0) + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@2.5.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@3.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs-readdir-recursive@1.1.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + gaxios@6.7.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.5 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@6.1.0: + dependencies: + gaxios: 6.7.1 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-package-type@0.1.0: {} + + get-stdin@9.0.0: {} + + get-stream@3.0.0: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.0 + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.7.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + giget@1.2.3: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + defu: 6.1.4 + node-fetch-native: 1.6.4 + nypm: 0.3.9 + ohash: 1.1.3 + pathe: 1.1.2 + tar: 6.2.1 + + git-hooks-list@3.1.0: {} + + github-from-package@0.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-modules@1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + global-prefix@1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globals@15.9.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + + google-auth-library@9.13.0: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.7.1 + gcp-metadata: 6.1.0 + gtoken: 7.1.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + graphql-http@1.22.1(graphql@16.9.0): + dependencies: + graphql: 16.9.0 + + graphql-playground-html@1.6.30: + dependencies: + xss: 1.0.15 + + graphql-scalars@1.22.2(graphql@16.9.0): + dependencies: + graphql: 16.9.0 + tslib: 2.6.3 + + graphql@16.9.0: {} + + gtoken@7.1.0: + dependencies: + gaxios: 6.7.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-own-prop@2.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + help-me@5.0.0: {} + + hermes-estree@0.20.1: {} + + hermes-parser@0.20.1: + dependencies: + hermes-estree: 0.20.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + + html-encoding-sniffer@3.0.0: + dependencies: + whatwg-encoding: 2.0.0 + + html-entities@2.5.2: {} + + html-escaper@2.0.2: {} + + html-to-text@9.0.3: + dependencies: + '@selderee/plugin-htmlparser2': 0.10.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.10.0 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + http-cache-semantics@4.1.1: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + http-status@1.6.2: {} + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@4.3.1: {} + + human-signals@5.0.0: {} + + husky@9.0.11: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore-by-default@1.0.1: {} + + ignore@5.3.2: {} + + image-size@1.1.1: + dependencies: + queue: 6.0.2 + + immediate@3.0.6: {} + + immer@9.0.21: {} + + immutable@4.3.7: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + interpret@1.4.0: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + ipaddr.js@1.9.1: {} + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.2: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-buffer@2.0.5: {} + + is-callable@1.2.7: {} + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-generator-fn@2.1.0: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hotkey@0.1.8: {} + + is-hotkey@0.2.0: {} + + is-immutable-type@5.0.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6) + ts-api-utils: 1.3.0(typescript@5.5.4) + ts-declaration-location: 1.0.4(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-cwd@2.2.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@5.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@1.1.0: {} + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-unicode-supported@2.0.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-whitespace@0.3.0: {} + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isomorphic-unfetch@3.1.0: + dependencies: + node-fetch: 2.7.0 + unfetch: 4.2.0 + transitivePeerDependencies: + - encoding + + isomorphic.js@0.2.5: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.6(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.2: + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.5 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0(babel-plugin-macros@3.1.0): + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3(babel-plugin-macros@3.1.0) + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.12.5 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-jsdom@29.7.0(bufferutil@4.0.8): + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/jsdom': 20.0.1 + '@types/node': 20.12.5 + jest-mock: 29.7.0 + jest-util: 29.7.0 + jsdom: 20.0.3(bufferutil@4.0.8) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.12.5 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.7 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.24.7 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + chalk: 4.1.2 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.25.2 + '@babel/generator': 7.25.0 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.2 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.12.5 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jiti@1.21.6: {} + + joycon@3.1.1: {} + + js-base64@3.7.7: {} + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@2.2.1: {} + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + jsdoc-type-pratt-parser@4.1.0: {} + + jsdom@20.0.3(bufferutil@4.0.8): + dependencies: + abab: 2.0.6 + acorn: 8.12.1 + acorn-globals: 7.0.1 + cssom: 0.5.0 + cssstyle: 2.3.0 + data-urls: 3.0.2 + decimal.js: 10.4.3 + domexception: 4.0.0 + escodegen: 2.1.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.12 + parse5: 7.1.2 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@0.5.0: {} + + jsesc@2.5.2: {} + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.1.2 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-to-typescript@15.0.1: + dependencies: + '@apidevtools/json-schema-ref-parser': 11.7.0 + '@types/json-schema': 7.0.15 + glob: 10.4.5 + is-glob: 4.0.3 + js-yaml: 4.1.0 + lodash: 4.17.21 + minimist: 1.2.8 + prettier: 3.3.2 + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonwebtoken@9.0.1: + dependencies: + jws: 3.2.2 + lodash: 4.17.21 + ms: 2.1.3 + semver: 7.6.3 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jwa@2.0.0: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + jws@4.0.0: + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + + jwt-decode@4.0.0: {} + + kareem@2.5.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kleur@3.0.3: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + leac@0.6.0: {} + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lexical@0.17.0: {} + + lib0@0.2.97: + dependencies: + isomorphic.js: 0.2.5 + + libsql@0.3.19: + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.3.19 + '@libsql/darwin-x64': 0.3.19 + '@libsql/linux-arm64-gnu': 0.3.19 + '@libsql/linux-arm64-musl': 0.3.19 + '@libsql/linux-x64-gnu': 0.3.19 + '@libsql/linux-x64-musl': 0.3.19 + '@libsql/win32-x64-msvc': 0.3.19 + + lie@3.1.1: + dependencies: + immediate: 3.0.6 + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + lint-staged@15.2.7: + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.6(supports-color@5.5.0) + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.4 + micromatch: 4.0.7 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.4.5 + transitivePeerDependencies: + - supports-color + + listr2@8.2.4: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + localforage@1.10.0: + dependencies: + lie: 3.1.1 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.debounce@4.0.8: {} + + lodash.deburr@4.1.0: {} + + lodash.get@4.4.2: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + media-typer@0.3.0: {} + + memoize-one@6.0.0: {} + + memory-pager@1.5.0: + optional: true + + merge-descriptors@1.0.1: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + merge@2.1.1: {} + + methods@1.1.2: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.53.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mime@3.0.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + + mlly@1.7.1: + dependencies: + acorn: 8.12.1 + pathe: 1.1.2 + pkg-types: 1.1.3 + ufo: 1.5.4 + + monaco-editor@0.38.0: {} + + mongodb-connection-string-url@2.6.0: + dependencies: + '@types/whatwg-url': 8.2.2 + whatwg-url: 11.0.0 + + mongodb-memory-server-core@9.4.1(@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))): + dependencies: + async-mutex: 0.4.1 + camelcase: 6.3.0 + debug: 4.3.6(supports-color@5.5.0) + find-cache-dir: 3.3.2 + follow-redirects: 1.15.6(debug@4.3.6) + https-proxy-agent: 7.0.5 + mongodb: 5.9.2(@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))) + new-find-package-json: 2.0.0 + semver: 7.6.3 + tar-stream: 3.1.7 + tslib: 2.6.3 + yauzl: 3.1.3 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - kerberos + - mongodb-client-encryption + - snappy + - supports-color + + mongodb-memory-server@9.4.1(@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))): + dependencies: + mongodb-memory-server-core: 9.4.1(@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))) + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - kerberos + - mongodb-client-encryption + - snappy + - supports-color + + mongodb@4.17.1(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)): + dependencies: + bson: 4.7.2 + mongodb-connection-string-url: 2.6.0 + socks: 2.8.3 + optionalDependencies: + '@aws-sdk/credential-providers': 3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + '@mongodb-js/saslprep': 1.1.8 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + mongodb@5.9.2(@aws-sdk/credential-providers@3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0))): + dependencies: + bson: 5.5.1 + mongodb-connection-string-url: 2.6.0 + socks: 2.8.3 + optionalDependencies: + '@aws-sdk/credential-providers': 3.630.0(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + '@mongodb-js/saslprep': 1.1.8 + + mongoose-aggregate-paginate-v2@1.0.6: {} + + mongoose-paginate-v2@1.7.22: {} + + mongoose@6.12.3(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)): + dependencies: + bson: 4.7.2 + kareem: 2.5.1 + mongodb: 4.17.1(@aws-sdk/client-sso-oidc@3.629.0(@aws-sdk/client-sts@3.629.0)) + mpath: 0.9.0 + mquery: 4.0.3 + ms: 2.1.3 + sift: 16.0.1 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - supports-color + + mpath@0.9.0: {} + + mquery@4.0.3: + dependencies: + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + mri@1.2.0: {} + + mrmime@2.0.0: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + nanoid@3.3.7: {} + + napi-build-utils@1.0.2: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + new-find-package-json@2.0.0: + dependencies: + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + next@15.0.0-canary.104(@babel/core@7.25.2)(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4): + dependencies: + '@next/env': 15.0.0-canary.104 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.12 + busboy: 1.6.0 + caniuse-lite: 1.0.30001651 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + styled-jsx: 5.1.6(@babel/core@7.25.2)(babel-plugin-macros@3.1.0)(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.0-canary.104 + '@next/swc-darwin-x64': 15.0.0-canary.104 + '@next/swc-linux-arm64-gnu': 15.0.0-canary.104 + '@next/swc-linux-arm64-musl': 15.0.0-canary.104 + '@next/swc-linux-x64-gnu': 15.0.0-canary.104 + '@next/swc-linux-x64-musl': 15.0.0-canary.104 + '@next/swc-win32-arm64-msvc': 15.0.0-canary.104 + '@next/swc-win32-ia32-msvc': 15.0.0-canary.104 + '@next/swc-win32-x64-msvc': 15.0.0-canary.104 + '@playwright/test': 1.46.0 + babel-plugin-react-compiler: 0.0.0-experimental-48eb8f4-20240822 + sass: 1.77.4 + sharp: 0.33.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4): + dependencies: + '@next/env': 15.0.0-canary.104 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.12 + busboy: 1.6.0 + caniuse-lite: 1.0.30001651 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + styled-jsx: 5.1.6(@babel/core@7.25.2)(babel-plugin-macros@3.1.0)(react@19.0.0-rc-06d0b89e-20240801) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.0-canary.104 + '@next/swc-darwin-x64': 15.0.0-canary.104 + '@next/swc-linux-arm64-gnu': 15.0.0-canary.104 + '@next/swc-linux-arm64-musl': 15.0.0-canary.104 + '@next/swc-linux-x64-gnu': 15.0.0-canary.104 + '@next/swc-linux-x64-musl': 15.0.0-canary.104 + '@next/swc-win32-arm64-msvc': 15.0.0-canary.104 + '@next/swc-win32-ia32-msvc': 15.0.0-canary.104 + '@next/swc-win32-x64-msvc': 15.0.0-canary.104 + '@playwright/test': 1.46.0 + babel-plugin-react-compiler: 0.0.0-experimental-48eb8f4-20240822 + sass: 1.77.4 + sharp: 0.33.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nice-napi@1.0.2: + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.8.1 + optional: true + + node-abi@3.65.0: + dependencies: + semver: 7.6.3 + + node-addon-api@3.2.1: + optional: true + + node-addon-api@6.1.0: {} + + node-domexception@1.0.0: {} + + node-fetch-native@1.6.4: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-gyp-build@4.8.1: {} + + node-int64@0.4.0: {} + + node-releases@2.0.18: {} + + nodemailer@6.9.10: {} + + nodemon@3.0.3: + dependencies: + chokidar: 3.6.0 + debug: 4.3.6(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.6.3 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + + noms@0.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 1.0.34 + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-path@3.0.0: {} + + normalize-url@6.1.0: {} + + npm-run-path@2.0.2: + dependencies: + path-key: 2.0.1 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nwsapi@2.2.12: {} + + nypm@0.3.9: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + execa: 8.0.1 + pathe: 1.1.2 + pkg-types: 1.1.3 + ufo: 1.5.4 + + object-assign@4.1.1: {} + + object-inspect@1.13.2: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object-to-formdata@4.5.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.values@1.2.0: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + obuf@1.1.2: {} + + ofetch@1.3.4: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 + + ohash@1.1.3: {} + + on-exit-leak-free@2.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + open@9.1.0: + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + + opener@1.5.2: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + os-filter-obj@2.0.0: + dependencies: + arch: 2.2.0 + + oxc-resolver@1.10.2: + optionalDependencies: + '@oxc-resolver/binding-darwin-arm64': 1.10.2 + '@oxc-resolver/binding-darwin-x64': 1.10.2 + '@oxc-resolver/binding-freebsd-x64': 1.10.2 + '@oxc-resolver/binding-linux-arm-gnueabihf': 1.10.2 + '@oxc-resolver/binding-linux-arm64-gnu': 1.10.2 + '@oxc-resolver/binding-linux-arm64-musl': 1.10.2 + '@oxc-resolver/binding-linux-x64-gnu': 1.10.2 + '@oxc-resolver/binding-linux-x64-musl': 1.10.2 + '@oxc-resolver/binding-wasm32-wasi': 1.10.2 + '@oxc-resolver/binding-win32-arm64-msvc': 1.10.2 + '@oxc-resolver/binding-win32-x64-msvc': 1.10.2 + + p-cancelable@2.1.1: {} + + p-finally@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.0: {} + + packet-reader@1.0.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-passwd@1.0.0: {} + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + parseley@0.11.0: + dependencies: + leac: 0.6.0 + peberminta: 0.8.0 + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.7: {} + + path-to-regexp@6.2.2: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + peberminta@0.8.0: {} + + peek-readable@5.1.4: {} + + pend@1.2.0: {} + + perfect-debounce@1.0.0: {} + + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.6.4: {} + + pg-int8@1.0.1: {} + + pg-numeric@1.0.2: {} + + pg-pool@3.6.2(pg@8.11.3): + dependencies: + pg: 8.11.3 + + pg-protocol@1.6.1: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg-types@4.0.2: + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + + pg@8.11.3: + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.11.3) + pg-protocol: 1.6.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pidtree@0.6.0: {} + + pify@2.3.0: {} + + pify@4.0.1: {} + + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + + pino-pretty@11.2.1: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pump: 3.0.0 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 4.0.1 + strip-json-comments: 3.1.1 + + pino-std-serializers@7.0.0: {} + + pino@9.3.1: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 7.0.0 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 4.0.1 + thread-stream: 3.1.0 + + pirates@4.0.6: {} + + piscina@4.6.1: + optionalDependencies: + nice-napi: 1.0.2 + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-types@1.1.3: + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + + playwright-core@1.46.0: {} + + playwright@1.46.0: + dependencies: + playwright-core: 1.46.0 + optionalDependencies: + fsevents: 2.3.2 + + pluralize@8.0.0: {} + + possible-typed-array-names@1.0.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + postgres-array@2.0.0: {} + + postgres-array@3.0.2: {} + + postgres-bytea@1.0.0: {} + + postgres-bytea@3.0.0: + dependencies: + obuf: 1.1.2 + + postgres-date@1.0.7: {} + + postgres-date@2.1.0: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + postgres-interval@3.0.0: {} + + postgres-range@1.1.4: {} + + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.65.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + + prelude-ls@1.2.1: {} + + prettier@3.3.2: {} + + prettier@3.3.3: {} + + pretty-format@24.9.0: + dependencies: + '@jest/types': 24.9.0 + ansi-regex: 4.1.1 + ansi-styles: 3.2.1 + react-is: 16.13.1 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + prismjs@1.29.0: {} + + process-nextick-args@2.0.1: {} + + process-warning@3.0.0: {} + + process@0.11.10: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + pseudomap@1.0.2: {} + + psl@1.9.0: {} + + pstree.remy@1.1.8: {} + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + qs-esm@7.0.2: {} + + qs@6.11.0: + dependencies: + side-channel: 1.0.6 + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + queue-tick@1.0.1: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + quick-format-unescaped@4.0.4: {} + + quick-lru@5.1.1: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.3 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-animate-height@2.1.2(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + classnames: 2.5.1 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + react-datepicker@6.9.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@floating-ui/react': 0.26.22(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + clsx: 2.1.1 + date-fns: 3.3.1 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-onclickoutside: 6.13.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + + react-diff-viewer-continued@3.2.6(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@emotion/css': 11.13.0 + classnames: 2.5.1 + diff: 5.2.0 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + transitivePeerDependencies: + - supports-color + + react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + scheduler: 0.25.0-rc-06d0b89e-20240801 + + react-error-boundary@3.1.4(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@babel/runtime': 7.25.0 + react: 19.0.0-rc-06d0b89e-20240801 + + react-error-boundary@4.0.13(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@babel/runtime': 7.25.0 + react: 19.0.0-rc-06d0b89e-20240801 + + react-image-crop@10.1.8(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-onclickoutside@6.13.1(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + react-select@5.8.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + dependencies: + '@babel/runtime': 7.25.0 + '@emotion/cache': 11.13.1 + '@emotion/react': 11.13.0(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + '@floating-ui/dom': 1.6.10 + '@types/react-transition-group': 4.4.11 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801) + use-isomorphic-layout-effect: 1.1.2(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0) + transitivePeerDependencies: + - '@types/react' + - supports-color + + react-transition-group@4.4.5(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + '@babel/runtime': 7.25.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + react@19.0.0-rc-06d0b89e-20240801: {} + + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readable-web-to-node-stream@3.0.2: + dependencies: + readable-stream: 3.6.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + real-require@0.2.0: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + + refa@0.12.1: + dependencies: + '@eslint-community/regexpp': 4.11.0 + + reflect.getprototypeof@1.0.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.4 + + regenerate-unicode-properties@10.1.1: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.25.0 + + regexp-ast-analysis@0.7.1: + dependencies: + '@eslint-community/regexpp': 4.11.0 + refa: 0.12.1 + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regexpu-core@5.3.2: + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + + regjsparser@0.9.1: + dependencies: + jsesc: 0.5.0 + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requireindex@1.2.0: {} + + requires-port@1.0.0: {} + + resend@0.17.2: + dependencies: + '@react-email/render': 0.0.7 + axios: 1.4.0 + type-fest: 3.13.0 + transitivePeerDependencies: + - debug + + resolve-alpn@1.2.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-dir@1.0.1: + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + retry-request@7.0.2: + dependencies: + '@types/request': 2.48.12 + extend: 3.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + retry@0.13.1: {} + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-applescript@5.0.0: + dependencies: + execa: 5.1.1 + + run-applescript@7.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.3 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-identifier@0.4.2: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safe-stable-stringify@2.4.3: {} + + safer-buffer@2.1.2: {} + + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sass-embedded-android-arm64@1.77.8: + optional: true + + sass-embedded-android-arm@1.77.8: + optional: true + + sass-embedded-android-ia32@1.77.8: + optional: true + + sass-embedded-android-x64@1.77.8: + optional: true + + sass-embedded-darwin-arm64@1.77.8: + optional: true + + sass-embedded-darwin-x64@1.77.8: + optional: true + + sass-embedded-linux-arm64@1.77.8: + optional: true + + sass-embedded-linux-arm@1.77.8: + optional: true + + sass-embedded-linux-ia32@1.77.8: + optional: true + + sass-embedded-linux-musl-arm64@1.77.8: + optional: true + + sass-embedded-linux-musl-arm@1.77.8: + optional: true + + sass-embedded-linux-musl-ia32@1.77.8: + optional: true + + sass-embedded-linux-musl-x64@1.77.8: + optional: true + + sass-embedded-linux-x64@1.77.8: + optional: true + + sass-embedded-win32-arm64@1.77.8: + optional: true + + sass-embedded-win32-ia32@1.77.8: + optional: true + + sass-embedded-win32-x64@1.77.8: + optional: true + + sass-embedded@1.77.8: + dependencies: + '@bufbuild/protobuf': 1.10.0 + buffer-builder: 0.2.0 + immutable: 4.3.7 + rxjs: 7.8.1 + supports-color: 8.1.1 + varint: 6.0.0 + optionalDependencies: + sass-embedded-android-arm: 1.77.8 + sass-embedded-android-arm64: 1.77.8 + sass-embedded-android-ia32: 1.77.8 + sass-embedded-android-x64: 1.77.8 + sass-embedded-darwin-arm64: 1.77.8 + sass-embedded-darwin-x64: 1.77.8 + sass-embedded-linux-arm: 1.77.8 + sass-embedded-linux-arm64: 1.77.8 + sass-embedded-linux-ia32: 1.77.8 + sass-embedded-linux-musl-arm: 1.77.8 + sass-embedded-linux-musl-arm64: 1.77.8 + sass-embedded-linux-musl-ia32: 1.77.8 + sass-embedded-linux-musl-x64: 1.77.8 + sass-embedded-linux-x64: 1.77.8 + sass-embedded-win32-arm64: 1.77.8 + sass-embedded-win32-ia32: 1.77.8 + sass-embedded-win32-x64: 1.77.8 + + sass@1.77.4: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.7 + source-map-js: 1.2.0 + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.25.0-rc-06d0b89e-20240801: {} + + scheduler@0.25.0-rc-f994737d14-20240522: {} + + scmp@2.1.0: {} + + scroll-into-view-if-needed@2.2.31: + dependencies: + compute-scroll-into-view: 1.0.20 + + scslre@0.3.0: + dependencies: + '@eslint-community/regexpp': 4.11.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + + scule@1.3.0: {} + + secure-json-parse@2.7.0: {} + + selderee@0.10.0: + dependencies: + parseley: 0.11.0 + + semver-regex@4.0.5: {} + + semver-truncate@3.0.0: + dependencies: + semver: 7.6.3 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + send@0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + server-only@0.0.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + sharp@0.32.6: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + node-addon-api: 6.1.0 + prebuild-install: 7.1.2 + semver: 7.6.3 + simple-get: 4.0.1 + tar-fs: 3.0.6 + tunnel-agent: 0.6.0 + + sharp@0.33.4: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.4 + '@img/sharp-darwin-x64': 0.33.4 + '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-linux-arm': 0.33.4 + '@img/sharp-linux-arm64': 0.33.4 + '@img/sharp-linux-s390x': 0.33.4 + '@img/sharp-linux-x64': 0.33.4 + '@img/sharp-linuxmusl-arm64': 0.33.4 + '@img/sharp-linuxmusl-x64': 0.33.4 + '@img/sharp-wasm32': 0.33.4 + '@img/sharp-win32-ia32': 0.33.4 + '@img/sharp-win32-x64': 0.33.4 + optional: true + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + short-unique-id@5.2.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + sift@16.0.1: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.6.3 + + simple-wcswidth@1.0.1: {} + + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 2.0.0 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + slash@2.0.0: {} + + slash@3.0.0: {} + + slash@4.0.0: {} + + slate-history@0.86.0(slate@0.91.4): + dependencies: + is-plain-object: 5.0.0 + slate: 0.91.4 + + slate-hyperscript@0.81.3(slate@0.91.4): + dependencies: + is-plain-object: 5.0.0 + slate: 0.91.4 + + slate-react@0.92.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(slate@0.91.4): + dependencies: + '@juggle/resize-observer': 3.4.0 + '@types/is-hotkey': 0.1.10 + '@types/lodash': 4.17.7 + direction: 1.0.4 + is-hotkey: 0.1.8 + is-plain-object: 5.0.0 + lodash: 4.17.21 + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + scroll-into-view-if-needed: 2.2.31 + slate: 0.91.4 + tiny-invariant: 1.0.6 + + slate@0.91.4: + dependencies: + immer: 9.0.21 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + smart-buffer@4.2.0: {} + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + sonic-boom@4.0.1: + dependencies: + atomic-sleep: 1.0.0 + + sonner@1.5.0(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) + + sort-keys-length@1.0.1: + dependencies: + sort-keys: 1.1.2 + + sort-keys@1.1.2: + dependencies: + is-plain-obj: 1.1.0 + + sort-object-keys@1.1.3: {} + + sort-package-json@2.10.0: + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.1 + get-stdin: 9.0.0 + git-hooks-list: 3.1.0 + globby: 13.2.2 + is-plain-obj: 4.1.0 + semver: 7.6.3 + sort-object-keys: 1.1.3 + + source-map-js@1.2.0: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + optional: true + + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + + sprintf-js@1.1.3: {} + + stable-hash@0.0.4: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + state-local@1.0.7: {} + + statuses@2.0.1: {} + + std-env@3.7.0: {} + + stop-iteration-iterator@1.0.0: + dependencies: + internal-slot: 1.0.7 + + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + stream-events@1.0.5: + dependencies: + stubs: 3.0.0 + + stream-shift@1.0.3: {} + + streamsearch@1.1.0: {} + + streamx@2.18.0: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.1.1 + optionalDependencies: + bare-events: 2.4.2 + + string-argv@0.3.2: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-ts@2.2.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string.prototype.includes@2.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@0.10.31: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@4.0.0: {} + + strip-eof@1.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + strip-outer@2.0.0: {} + + stripe@10.17.0: + dependencies: + '@types/node': 20.12.5 + qs: 6.13.0 + + strnum@1.0.5: {} + + strtok3@7.1.1: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.1.4 + + stubs@3.0.0: {} + + styled-jsx@5.1.6(@babel/core@7.25.2)(babel-plugin-macros@3.1.0)(react@19.0.0-rc-06d0b89e-20240801): + dependencies: + client-only: 0.0.1 + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@babel/core': 7.25.2 + babel-plugin-macros: 3.1.0 + + stylis@4.2.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@2.3.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + swc-plugin-transform-remove-imports@1.15.0: {} + + symbol-tree@3.2.4: {} + + tabbable@6.2.0: {} + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-fs@3.0.6: + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.1 + bare-path: 2.1.3 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.18.0 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + teeny-request@9.0.0: + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + stream-events: 1.0.5 + uuid: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + temp-dir@2.0.0: {} + + tempy@1.0.1: + dependencies: + del: 6.1.1 + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + + terminal-link@2.1.1: + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-decoder@1.1.1: + dependencies: + b4a: 1.6.6 + + text-table@0.2.0: {} + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + tiny-invariant@1.0.6: {} + + tiny-warning@1.0.3: {} + + titleize@3.0.0: {} + + tmpl@1.0.5: {} + + to-fast-properties@2.0.0: {} + + to-no-case@1.0.2: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-snake-case@1.0.0: + dependencies: + to-space-case: 1.0.0 + + to-space-case@1.0.0: + dependencies: + to-no-case: 1.0.2 + + toidentifier@1.0.1: {} + + token-types@5.0.1: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + totalist@3.0.1: {} + + touch@3.1.1: {} + + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@0.0.3: {} + + tr46@3.0.0: + dependencies: + punycode: 2.3.1 + + trim-repeated@2.0.0: + dependencies: + escape-string-regexp: 5.0.0 + + trim-right@1.0.1: {} + + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + + ts-api-utils@1.3.0(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-declaration-location@1.0.4(typescript@5.5.4): + dependencies: + minimatch: 10.0.1 + typescript: 5.5.4 + + ts-essentials@7.0.3(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-jest@29.2.4(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@20.12.5)(babel-plugin-macros@3.1.0) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-pattern@5.3.1: {} + + tslib@1.14.1: {} + + tslib@2.6.3: {} + + tsx@4.17.0: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + turbo-darwin-64@2.1.0: + optional: true + + turbo-darwin-arm64@2.1.0: + optional: true + + turbo-linux-64@2.1.0: + optional: true + + turbo-linux-arm64@2.1.0: + optional: true + + turbo-windows-64@2.1.0: + optional: true + + turbo-windows-arm64@2.1.0: + optional: true + + turbo@2.1.0: + optionalDependencies: + turbo-darwin-64: 2.1.0 + turbo-darwin-arm64: 2.1.0 + turbo-linux-64: 2.1.0 + turbo-linux-arm64: 2.1.0 + turbo-windows-64: 2.1.0 + turbo-windows-arm64: 2.1.0 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.16.0: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@3.13.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + types-react-dom@19.0.0-rc.0: + dependencies: + '@types/react': types-react@19.0.0-rc.0 + + types-react@19.0.0-rc.0: + dependencies: + csstype: 3.1.3 + + typescript-eslint@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/parser': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - eslint + - supports-color + + typescript@5.5.4: {} + + ufo@1.5.4: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + undefsafe@2.0.5: {} + + undici-types@5.26.5: {} + + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + + unfetch@4.2.0: {} + + unicode-canonical-property-names-ecmascript@2.0.0: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.1.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unicorn-magic@0.1.0: {} + + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + + universalify@0.2.0: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + untildify@4.0.0: {} + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + uploadthing@6.13.2(express@4.19.2)(next@15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4)): + dependencies: + '@effect/schema': 0.68.12(effect@3.4.5) + '@uploadthing/mime-types': 0.2.10 + '@uploadthing/shared': 6.7.8 + consola: 3.2.3 + effect: 3.4.5 + std-env: 3.7.0 + optionalDependencies: + express: 4.19.2 + next: 15.0.0-canary.104(@playwright/test@1.46.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@0.0.0-experimental-48eb8f4-20240822)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@19.0.0-rc-06d0b89e-20240801)(sass@1.77.4) + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + use-context-selector@2.0.0(react@19.0.0-rc-06d0b89e-20240801)(scheduler@0.25.0-rc-f994737d14-20240522): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + scheduler: 0.25.0-rc-f994737d14-20240522 + + use-isomorphic-layout-effect@1.1.2(react@19.0.0-rc-06d0b89e-20240801)(types-react@19.0.0-rc.0): + dependencies: + react: 19.0.0-rc-06d0b89e-20240801 + optionalDependencies: + '@types/react': types-react@19.0.0-rc.0 + + utf-8-validate@6.0.4: + dependencies: + node-gyp-build: 4.8.1 + + utf8-byte-length@1.0.5: {} + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@10.0.0: {} + + uuid@8.3.2: {} + + uuid@9.0.0: {} + + uuid@9.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + varint@6.0.0: {} + + vary@1.1.2: {} + + vue@3.4.37(typescript@5.5.4): + dependencies: + '@vue/compiler-dom': 3.4.37 + '@vue/compiler-sfc': 3.4.37 + '@vue/runtime-dom': 3.4.37 + '@vue/server-renderer': 3.4.37(vue@3.4.37(typescript@5.5.4)) + '@vue/shared': 3.4.37 + optionalDependencies: + typescript: 5.5.4 + + w3c-xmlserializer@4.0.0: + dependencies: + xml-name-validator: 4.0.0 + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@3.0.1: {} + + webidl-conversions@7.0.0: {} + + webpack-bundle-analyzer@4.10.1(bufferutil@4.0.8): + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.12.1 + acorn-walk: 8.3.3 + commander: 7.2.0 + debounce: 1.2.1 + escape-string-regexp: 4.0.0 + gzip-size: 6.0.0 + html-escaper: 2.0.2 + is-plain-object: 5.0.0 + opener: 1.5.2 + picocolors: 1.0.1 + sirv: 2.0.4 + ws: 7.5.10(bufferutil@4.0.8) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + whatwg-encoding@2.0.0: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@3.0.0: {} + + whatwg-url@11.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-builtin-type@1.1.4: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + ws@7.5.10(bufferutil@4.0.8): + optionalDependencies: + bufferutil: 4.0.8 + + ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.4 + + xml-name-validator@4.0.0: {} + + xmlchars@2.2.0: {} + + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@2.1.2: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yaml@2.4.5: {} + + yaml@2.5.0: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@3.1.3: + dependencies: + buffer-crc32: 0.2.13 + pend: 1.2.0 + + yjs@13.6.18: + dependencies: + lib0: 0.2.97 + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + zod-validation-error@2.1.0(zod@3.23.8): + dependencies: + zod: 3.23.8 + + zod-validation-error@3.3.1(zod@3.23.8): + dependencies: + zod: 3.23.8 + + zod@3.23.8: {} From 9b004e398e8c5108e79902b4230ef1697fef790f Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 29 Aug 2024 23:04:31 -0400 Subject: [PATCH 115/173] resolves leftover merge conflicts --- .../payload/src/fields/config/sanitize.ts | 1 - packages/ui/src/elements/SortColumn/index.tsx | 10 +--------- packages/ui/src/elements/Table/index.tsx | 19 ++----------------- 3 files changed, 3 insertions(+), 27 deletions(-) diff --git a/packages/payload/src/fields/config/sanitize.ts b/packages/payload/src/fields/config/sanitize.ts index c2b11a1b2ae..5c588a6aaa8 100644 --- a/packages/payload/src/fields/config/sanitize.ts +++ b/packages/payload/src/fields/config/sanitize.ts @@ -12,7 +12,6 @@ import { MissingEditorProp, MissingFieldType, } from '../../errors/index.js' -import { MissingEditorProp } from '../../errors/MissingEditorProp.js' import { formatLabels, toWords } from '../../utilities/formatLabels.js' import { baseBlockFields } from '../baseFields/baseBlockFields.js' import { baseIDField } from '../baseFields/baseIDField.js' diff --git a/packages/ui/src/elements/SortColumn/index.tsx b/packages/ui/src/elements/SortColumn/index.tsx index 3a82d51ab27..9092c7833fe 100644 --- a/packages/ui/src/elements/SortColumn/index.tsx +++ b/packages/ui/src/elements/SortColumn/index.tsx @@ -10,11 +10,7 @@ import { useTranslation } from '../../providers/Translation/index.js' import './index.scss' export type SortColumnProps = { -<<<<<<< HEAD - readonly Label: React.ReactNode readonly appearance?: 'condensed' | 'default' -======= ->>>>>>> beta readonly disable?: boolean readonly Label: React.ReactNode readonly label?: FieldBase['label'] @@ -24,11 +20,7 @@ export type SortColumnProps = { const baseClass = 'sort-column' export const SortColumn: React.FC = (props) => { -<<<<<<< HEAD - const { name, Label, appearance, disable = false, label } = props -======= - const { name, disable = false, Label, label } = props ->>>>>>> beta + const { name, appearance, disable = false, Label, label } = props const { searchParams } = useSearchParams() const { handleSortChange } = useListQuery() const { t } = useTranslation() diff --git a/packages/ui/src/elements/Table/index.tsx b/packages/ui/src/elements/Table/index.tsx index 53d5a58e5e8..0b30a1dfa64 100644 --- a/packages/ui/src/elements/Table/index.tsx +++ b/packages/ui/src/elements/Table/index.tsx @@ -6,12 +6,8 @@ import React from 'react' export * from './TableCellProvider/index.js' import { useTableColumns } from '../TableColumns/index.js' -<<<<<<< HEAD -import { RenderCell } from './RenderCell.js' -import { TableCellProvider } from './TableCellProvider/index.js' -======= ->>>>>>> beta import './index.scss' +import { RenderCell } from './RenderCell.js' import { TableCellProvider } from './TableCellProvider/index.js' export { TableCellProvider } @@ -19,21 +15,10 @@ export { TableCellProvider } const baseClass = 'table' export type Column = { -<<<<<<< HEAD - readonly Heading: React.ReactNode readonly accessor: string readonly active: boolean readonly cellProps?: Partial -======= - readonly accessor: string - readonly active: boolean - readonly cellProps?: Partial - readonly components: { - Cell: MappedComponent - Heading: React.ReactNode - } - readonly Label: React.ReactNode ->>>>>>> beta + readonly Heading: React.ReactNode } export type Props = { From 3f5cd79711e6a92bbb8f01057faca905e092332a Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Fri, 30 Aug 2024 09:44:26 -0400 Subject: [PATCH 116/173] chore: merge beta --- packages/db-mongodb/src/connect.ts | 2 +- packages/db-mongodb/src/index.ts | 8 +- packages/db-mongodb/src/models/buildSchema.ts | 8 +- .../src/queries/buildSearchParams.ts | 10 +- .../db-mongodb/src/queries/parseParams.ts | 2 +- .../src/queries/sanitizeQueryValue.ts | 12 +-- .../src/transactions/commitTransaction.ts | 2 +- packages/db-mongodb/src/types.ts | 2 +- .../db-mongodb/src/utilities/getDBName.ts | 2 +- packages/db-mongodb/src/withSession.ts | 2 +- packages/db-postgres/src/connect.ts | 4 +- .../v2-v3/fetchAndResave/traverseFields.ts | 2 +- .../v2-v3/migrateRelationships.ts | 6 +- packages/db-postgres/src/types.ts | 2 +- packages/db-sqlite/src/connect.ts | 4 +- packages/db-sqlite/src/schema/build.ts | 10 +- packages/db-sqlite/src/schema/createIndex.ts | 2 +- .../db-sqlite/src/schema/traverseFields.ts | 92 +++++++++---------- packages/db-sqlite/src/schema/withDefault.ts | 2 +- packages/db-sqlite/src/types.ts | 2 +- packages/db-vercel-postgres/src/connect.ts | 6 +- .../v2-v3/fetchAndResave/traverseFields.ts | 2 +- .../v2-v3/migrateRelationships.ts | 6 +- packages/db-vercel-postgres/src/types.ts | 2 +- packages/drizzle/src/createTableName.ts | 4 +- packages/drizzle/src/createVersion.ts | 2 +- packages/drizzle/src/destroy.ts | 2 +- packages/drizzle/src/findMigrationDir.ts | 2 +- packages/drizzle/src/migrateReset.ts | 2 +- .../convertPathToJSONTraversal.ts | 2 +- packages/drizzle/src/postgres/schema/build.ts | 10 +- .../src/postgres/schema/createIndex.ts | 2 +- .../src/postgres/schema/traverseFields.ts | 92 +++++++++---------- .../src/postgres/schema/withDefault.ts | 2 +- packages/drizzle/src/postgres/types.ts | 2 +- .../src/queries/getTableColumnFromPath.ts | 2 +- packages/drizzle/src/queries/operatorMap.ts | 6 +- .../drizzle/src/queries/sanitizeQueryValue.ts | 10 +- .../src/transactions/commitTransaction.ts | 2 +- .../drizzle/src/transform/write/blocks.ts | 10 +- .../src/transform/write/relationships.ts | 4 +- .../src/transform/write/traverseFields.ts | 8 +- packages/drizzle/src/types.ts | 2 +- .../src/upsertRow/deleteExistingRowsByPath.ts | 4 +- packages/drizzle/src/upsertRow/index.ts | 8 +- .../drizzle/src/utilities/createBlocksMap.ts | 2 +- .../src/utilities/createRelationshipMap.ts | 2 +- .../drizzle/src/utilities/hasLocalesTable.ts | 8 +- .../src/elements/DocumentLocked/index.tsx | 6 +- .../src/elements/DocumentTakeOver/index.tsx | 4 +- .../src/views/Dashboard/Default/index.tsx | 4 +- packages/next/src/views/Dashboard/index.tsx | 2 +- .../next/src/views/Edit/Default/index.tsx | 2 +- packages/translations/src/languages/ar.ts | 2 +- packages/translations/src/languages/az.ts | 2 +- packages/translations/src/languages/bg.ts | 2 +- packages/translations/src/languages/cs.ts | 2 +- packages/translations/src/languages/de.ts | 2 +- packages/translations/src/languages/en.ts | 2 +- packages/translations/src/languages/es.ts | 2 +- packages/translations/src/languages/fa.ts | 2 +- packages/translations/src/languages/fr.ts | 2 +- packages/translations/src/languages/he.ts | 2 +- packages/translations/src/languages/hr.ts | 2 +- packages/translations/src/languages/hu.ts | 2 +- packages/translations/src/languages/it.ts | 2 +- packages/translations/src/languages/ja.ts | 2 +- packages/translations/src/languages/ko.ts | 2 +- packages/translations/src/languages/my.ts | 2 +- packages/translations/src/languages/nb.ts | 2 +- packages/translations/src/languages/nl.ts | 2 +- packages/translations/src/languages/pl.ts | 2 +- packages/translations/src/languages/pt.ts | 2 +- packages/translations/src/languages/ro.ts | 2 +- packages/translations/src/languages/rs.ts | 2 +- .../translations/src/languages/rsLatin.ts | 2 +- packages/translations/src/languages/ru.ts | 2 +- packages/translations/src/languages/sk.ts | 2 +- packages/translations/src/languages/sv.ts | 2 +- packages/translations/src/languages/th.ts | 2 +- packages/translations/src/languages/tr.ts | 2 +- packages/translations/src/languages/uk.ts | 2 +- packages/translations/src/languages/vi.ts | 2 +- packages/translations/src/languages/zh.ts | 2 +- packages/translations/src/languages/zhTw.ts | 2 +- 85 files changed, 232 insertions(+), 232 deletions(-) diff --git a/packages/db-mongodb/src/connect.ts b/packages/db-mongodb/src/connect.ts index 0fba10bc98b..51529392f4a 100644 --- a/packages/db-mongodb/src/connect.ts +++ b/packages/db-mongodb/src/connect.ts @@ -29,7 +29,7 @@ export const connect: Connect = async function connect( useFacet: undefined, } - if (hotReload) connectionOptions.autoIndex = false + if (hotReload) {connectionOptions.autoIndex = false} try { this.connection = (await mongoose.connect(urlToConnect, connectionOptions)).connection diff --git a/packages/db-mongodb/src/index.ts b/packages/db-mongodb/src/index.ts index 0b304183b3c..3fb1a9b7507 100644 --- a/packages/db-mongodb/src/index.ts +++ b/packages/db-mongodb/src/index.ts @@ -1,6 +1,6 @@ import type { CollationOptions, TransactionOptions } from 'mongodb' import type { MongoMemoryReplSet } from 'mongodb-memory-server' -import type { ClientSession, ConnectOptions, Connection } from 'mongoose' +import type { ClientSession, Connection, ConnectOptions } from 'mongoose' import type { BaseDatabaseAdapter, DatabaseAdapterObj, Payload } from 'payload' import fs from 'fs' @@ -83,7 +83,7 @@ export interface Args { name: string up: (args: MigrateUpArgs) => Promise }[] - transactionOptions?: TransactionOptions | false + transactionOptions?: false | TransactionOptions /** The URL to connect to MongoDB or false to start payload and prevent connecting */ url: false | string } @@ -150,8 +150,8 @@ export function mongooseAdapter({ // Mongoose-specific autoPluralization, collections: {}, - connectOptions: connectOptions || {}, connection: undefined, + connectOptions: connectOptions || {}, count, disableIndexHints, globals: undefined, @@ -221,7 +221,7 @@ function findMigrationDir(migrationDir?: string): string { const relativeMigrations = path.resolve(cwd, 'migrations') // Use arg if provided - if (migrationDir) return migrationDir + if (migrationDir) {return migrationDir} // Check other common locations if (fs.existsSync(srcDir)) { diff --git a/packages/db-mongodb/src/models/buildSchema.ts b/packages/db-mongodb/src/models/buildSchema.ts index c2535def3b3..5c791cab380 100644 --- a/packages/db-mongodb/src/models/buildSchema.ts +++ b/packages/db-mongodb/src/models/buildSchema.ts @@ -24,8 +24,8 @@ import type { SelectField, Tab, TabsField, - TextField, TextareaField, + TextField, UploadField, } from 'payload' @@ -92,7 +92,7 @@ const formatBaseSchema = (field: FieldAffectingData, buildSchemaOptions: BuildSc const localizeSchema = ( entity: NonPresentationalField | Tab, schema, - localization: SanitizedLocalizationConfig | false, + localization: false | SanitizedLocalizationConfig, ) => { if (fieldIsLocalized(entity) && localization && Array.isArray(localization.locales)) { return { @@ -384,7 +384,7 @@ const fieldToSchemaMap: Record = { ...formatBaseSchema(field, buildSchemaOptions), type: String, enum: field.options.map((option) => { - if (typeof option === 'object') return option.value + if (typeof option === 'object') {return option.value} return option }), } @@ -511,7 +511,7 @@ const fieldToSchemaMap: Record = { ...formatBaseSchema(field, buildSchemaOptions), type: String, enum: field.options.map((option) => { - if (typeof option === 'object') return option.value + if (typeof option === 'object') {return option.value} return option }), } diff --git a/packages/db-mongodb/src/queries/buildSearchParams.ts b/packages/db-mongodb/src/queries/buildSearchParams.ts index aaa629dbc61..885ce9507ba 100644 --- a/packages/db-mongodb/src/queries/buildSearchParams.ts +++ b/packages/db-mongodb/src/queries/buildSearchParams.ts @@ -48,7 +48,7 @@ export async function buildSearchParam({ }): Promise { // Replace GraphQL nested field double underscore formatting let sanitizedPath = incomingPath.replace(/__/g, '.') - if (sanitizedPath === 'id') sanitizedPath = '_id' + if (sanitizedPath === 'id') {sanitizedPath = '_id'} let paths: PathToQuery[] = [] @@ -99,7 +99,7 @@ export async function buildSearchParam({ val, }) - if (rawQuery) return { value: rawQuery } + if (rawQuery) {return { value: rawQuery }} // If there are multiple collections to search through, // Recursively build up a list of query constraints @@ -190,7 +190,7 @@ export async function buildSearchParam({ if (field.type === 'relationship' || field.type === 'upload') { let hasNumberIDRelation let multiIDCondition = '$or' - if (operatorKey === '$ne') multiIDCondition = '$and' + if (operatorKey === '$ne') {multiIDCondition = '$and'} const result = { value: { @@ -216,9 +216,9 @@ export async function buildSearchParam({ ) if (hasNumberIDRelation) - result.value[multiIDCondition].push({ + {result.value[multiIDCondition].push({ [path]: { [operatorKey]: parseFloat(formattedValue) }, - }) + })} } } diff --git a/packages/db-mongodb/src/queries/parseParams.ts b/packages/db-mongodb/src/queries/parseParams.ts index 611055fa7a5..7addb9c31e3 100644 --- a/packages/db-mongodb/src/queries/parseParams.ts +++ b/packages/db-mongodb/src/queries/parseParams.ts @@ -43,7 +43,7 @@ export async function parseParams({ payload, where: condition, }) - if (builtConditions.length > 0) result[conditionOperator] = builtConditions + if (builtConditions.length > 0) {result[conditionOperator] = builtConditions} } else { // It's a path - and there can be multiple comparisons on a single path. // For example - title like 'test' and title not equal to 'tester' diff --git a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts index 096227afb77..1c12f37516d 100644 --- a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts +++ b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts @@ -46,8 +46,8 @@ export const sanitizeQueryValue = ({ // Cast incoming values as proper searchable types if (field.type === 'checkbox' && typeof val === 'string') { - if (val.toLowerCase() === 'true') formattedValue = true - if (val.toLowerCase() === 'false') formattedValue = false + if (val.toLowerCase() === 'true') {formattedValue = true} + if (val.toLowerCase() === 'false') {formattedValue = false} } if (['all', 'in', 'not_in'].includes(operator) && typeof formattedValue === 'string') { @@ -96,10 +96,10 @@ export const sanitizeQueryValue = ({ formattedValue = formattedValue.reduce((formattedValues, inVal) => { const newValues = [inVal] if (mongoose.Types.ObjectId.isValid(inVal)) - newValues.push(new mongoose.Types.ObjectId(inVal)) + {newValues.push(new mongoose.Types.ObjectId(inVal))} const parsedNumber = parseFloat(inVal) - if (!Number.isNaN(parsedNumber)) newValues.push(parsedNumber) + if (!Number.isNaN(parsedNumber)) {newValues.push(parsedNumber)} return [...formattedValues, ...newValues] }, []) @@ -129,8 +129,8 @@ export const sanitizeQueryValue = ({ $geometry: { type: 'Point', coordinates: [parseFloat(lng), parseFloat(lat)] }, } - if (maxDistance) formattedValue.$maxDistance = parseFloat(maxDistance) - if (minDistance) formattedValue.$minDistance = parseFloat(minDistance) + if (maxDistance) {formattedValue.$maxDistance = parseFloat(maxDistance)} + if (minDistance) {formattedValue.$minDistance = parseFloat(minDistance)} } } diff --git a/packages/db-mongodb/src/transactions/commitTransaction.ts b/packages/db-mongodb/src/transactions/commitTransaction.ts index e0ebd917d41..c3285312d1d 100644 --- a/packages/db-mongodb/src/transactions/commitTransaction.ts +++ b/packages/db-mongodb/src/transactions/commitTransaction.ts @@ -1,7 +1,7 @@ import type { CommitTransaction } from 'payload' export const commitTransaction: CommitTransaction = async function commitTransaction(id) { - if (id instanceof Promise) return + if (id instanceof Promise) {return} if (!this.sessions[id]?.inTransaction()) { return diff --git a/packages/db-mongodb/src/types.ts b/packages/db-mongodb/src/types.ts index ba1d34b1c4d..f66ea271820 100644 --- a/packages/db-mongodb/src/types.ts +++ b/packages/db-mongodb/src/types.ts @@ -20,8 +20,8 @@ import type { SanitizedConfig, SelectField, TabsField, - TextField, TextareaField, + TextField, UploadField, } from 'payload' diff --git a/packages/db-mongodb/src/utilities/getDBName.ts b/packages/db-mongodb/src/utilities/getDBName.ts index ae78695f907..8c249b18e32 100644 --- a/packages/db-mongodb/src/utilities/getDBName.ts +++ b/packages/db-mongodb/src/utilities/getDBName.ts @@ -35,7 +35,7 @@ export const getDBName = ({ result = name ?? slug } - if (versions) result = `_${result}_versions` + if (versions) {result = `_${result}_versions`} return result } diff --git a/packages/db-mongodb/src/withSession.ts b/packages/db-mongodb/src/withSession.ts index 51d7054a5c2..1516aceb19b 100644 --- a/packages/db-mongodb/src/withSession.ts +++ b/packages/db-mongodb/src/withSession.ts @@ -17,5 +17,5 @@ export async function withSession( transactionID = await req.transactionID } - if (req) return db.sessions[transactionID] ? { session: db.sessions[transactionID] } : {} + if (req) {return db.sessions[transactionID] ? { session: db.sessions[transactionID] } : {}} } diff --git a/packages/db-postgres/src/connect.ts b/packages/db-postgres/src/connect.ts index 45c5132cdc5..efb59302474 100644 --- a/packages/db-postgres/src/connect.ts +++ b/packages/db-postgres/src/connect.ts @@ -77,7 +77,7 @@ export const connect: Connect = async function connect( } } catch (err) { this.payload.logger.error(`Error: cannot connect to Postgres. Details: ${err.message}`, err) - if (typeof this.rejectInitializing === 'function') this.rejectInitializing() + if (typeof this.rejectInitializing === 'function') {this.rejectInitializing()} process.exit(1) } @@ -90,7 +90,7 @@ export const connect: Connect = async function connect( await pushDevSchema(this as unknown as DrizzleAdapter) } - if (typeof this.resolveInitializing === 'function') this.resolveInitializing() + if (typeof this.resolveInitializing === 'function') {this.resolveInitializing()} if (process.env.NODE_ENV === 'production' && this.prodMigrations) { await this.migrate({ migrations: this.prodMigrations }) diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts index 768cff23c82..42d2926c1e6 100644 --- a/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts @@ -193,7 +193,7 @@ export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => { const matchedRelationship = rows.find((row) => { const matchesPath = row.path === relationshipPath - if (locale) return matchesPath && locale === row.locale + if (locale) {return matchesPath && locale === row.locale} return row.path === relationshipPath }) diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts index 3415da74124..c93f35c5d31 100644 --- a/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts @@ -35,7 +35,7 @@ export const migrateRelationships = async ({ req, tableName, }: Args) => { - if (pathsToQuery.size === 0) return + if (pathsToQuery.size === 0) {return} let offset = 0 @@ -54,7 +54,7 @@ export const migrateRelationships = async ({ paginationResult = await adapter.drizzle.execute(sql.raw(`${paginationStatement}`)) - if (paginationResult.rows.length === 0) return + if (paginationResult.rows.length === 0) {return} offset += 1 @@ -74,7 +74,7 @@ export const migrateRelationships = async ({ const parentID = row.parent_id if (typeof parentID === 'string' || typeof parentID === 'number') { - if (!docsToResave[parentID]) docsToResave[parentID] = [] + if (!docsToResave[parentID]) {docsToResave[parentID] = []} docsToResave[parentID].push(row) } }) diff --git a/packages/db-postgres/src/types.ts b/packages/db-postgres/src/types.ts index b044bf9dcd7..6904e116d9f 100644 --- a/packages/db-postgres/src/types.ts +++ b/packages/db-postgres/src/types.ts @@ -28,7 +28,7 @@ export type Args = { * @experimental This only works when there are not other tables or enums of the same name in the database under a different schema. Awaiting fix from Drizzle. */ schemaName?: string - transactionOptions?: PgTransactionConfig | false + transactionOptions?: false | PgTransactionConfig versionsSuffix?: string } diff --git a/packages/db-sqlite/src/connect.ts b/packages/db-sqlite/src/connect.ts index a710e819e34..2a102da3041 100644 --- a/packages/db-sqlite/src/connect.ts +++ b/packages/db-sqlite/src/connect.ts @@ -38,7 +38,7 @@ export const connect: Connect = async function connect( } } catch (err) { this.payload.logger.error(`Error: cannot connect to SQLite. Details: ${err.message}`, err) - if (typeof this.rejectInitializing === 'function') this.rejectInitializing() + if (typeof this.rejectInitializing === 'function') {this.rejectInitializing()} process.exit(1) } @@ -51,7 +51,7 @@ export const connect: Connect = async function connect( await pushDevSchema(this as unknown as DrizzleAdapter) } - if (typeof this.resolveInitializing === 'function') this.resolveInitializing() + if (typeof this.resolveInitializing === 'function') {this.resolveInitializing()} if (process.env.NODE_ENV === 'production' && this.prodMigrations) { await this.migrate({ migrations: this.prodMigrations }) diff --git a/packages/db-sqlite/src/schema/build.ts b/packages/db-sqlite/src/schema/build.ts index 22fa7a0f349..df20729c2ee 100644 --- a/packages/db-sqlite/src/schema/build.ts +++ b/packages/db-sqlite/src/schema/build.ts @@ -51,8 +51,8 @@ type Args = { disableUnique: boolean fields: Field[] locales?: [string, ...string[]] - rootRelationsToBuild?: RelationMap rootRelationships?: Set + rootRelationsToBuild?: RelationMap rootTableIDColType?: IDType rootTableName?: string tableName: string @@ -82,8 +82,8 @@ export const buildTable = ({ disableUnique = false, fields, locales, - rootRelationsToBuild, rootRelationships, + rootRelationsToBuild, rootTableIDColType, rootTableName: incomingRootTableName, tableName, @@ -131,8 +131,8 @@ export const buildTable = ({ localesIndexes, newTableName: tableName, parentTableName: tableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild: rootRelationsToBuild || relationsToBuild, rootTableIDColType: rootTableIDColType || idColType, rootTableName, @@ -375,8 +375,8 @@ export const buildTable = ({ const relatedCollectionCustomIDType = adapter.payload.collections[relationshipConfig.slug]?.customIDType - if (relatedCollectionCustomIDType === 'number') colType = 'numeric' - if (relatedCollectionCustomIDType === 'text') colType = 'text' + if (relatedCollectionCustomIDType === 'number') {colType = 'numeric'} + if (relatedCollectionCustomIDType === 'text') {colType = 'text'} relationshipColumns[`${relationTo}ID`] = getIDColumn({ name: `${formattedRelationTo}_id`, diff --git a/packages/db-sqlite/src/schema/createIndex.ts b/packages/db-sqlite/src/schema/createIndex.ts index ba6b1b4411b..1e067fb8bd6 100644 --- a/packages/db-sqlite/src/schema/createIndex.ts +++ b/packages/db-sqlite/src/schema/createIndex.ts @@ -21,7 +21,7 @@ export const createIndex = ({ name, columnName, tableName, unique }: CreateIndex columns = [table[name]] } if (unique) - return uniqueIndex(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) + {return uniqueIndex(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1))} return index(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) } } diff --git a/packages/db-sqlite/src/schema/traverseFields.ts b/packages/db-sqlite/src/schema/traverseFields.ts index 107b58a6bb9..9dc9195fc72 100644 --- a/packages/db-sqlite/src/schema/traverseFields.ts +++ b/packages/db-sqlite/src/schema/traverseFields.ts @@ -9,13 +9,13 @@ import { } from '@payloadcms/drizzle' import { relations } from 'drizzle-orm' import { - SQLiteIntegerBuilder, - SQLiteNumericBuilder, - SQLiteTextBuilder, foreignKey, index, integer, numeric, + SQLiteIntegerBuilder, + SQLiteNumericBuilder, + SQLiteTextBuilder, text, } from 'drizzle-orm/sqlite-core' import { InvalidConfiguration } from 'payload' @@ -46,8 +46,8 @@ type Args = { localesIndexes: Record IndexBuilder> newTableName: string parentTableName: string - relationsToBuild: RelationMap relationships: Set + relationsToBuild: RelationMap rootRelationsToBuild?: RelationMap rootTableIDColType: IDType rootTableName: string @@ -83,8 +83,8 @@ export const traverseFields = ({ localesIndexes, newTableName, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -99,12 +99,12 @@ export const traverseFields = ({ let hasLocalizedManyNumberField = false let parentIDColType: IDType = 'integer' - if (columns.id instanceof SQLiteIntegerBuilder) parentIDColType = 'integer' - if (columns.id instanceof SQLiteNumericBuilder) parentIDColType = 'numeric' - if (columns.id instanceof SQLiteTextBuilder) parentIDColType = 'text' + if (columns.id instanceof SQLiteIntegerBuilder) {parentIDColType = 'integer'} + if (columns.id instanceof SQLiteNumericBuilder) {parentIDColType = 'numeric'} + if (columns.id instanceof SQLiteTextBuilder) {parentIDColType = 'text'} fields.forEach((field) => { - if ('name' in field && field.name === 'id') return + if ('name' in field && field.name === 'id') {return} let columnName: string let fieldName: string @@ -379,8 +379,8 @@ export const traverseFields = ({ disableNotNull: disableNotNullFromHere, disableUnique, fields: disableUnique ? idToUUID(field.fields) : field.fields, - rootRelationsToBuild, rootRelationships: relationships, + rootRelationsToBuild, rootTableIDColType, rootTableName, tableName: arrayTableName, @@ -402,11 +402,11 @@ export const traverseFields = ({ if (subHasManyTextField) { if (!hasManyTextField || subHasManyTextField === 'index') - hasManyTextField = subHasManyTextField + {hasManyTextField = subHasManyTextField} } if (subHasManyNumberField) { if (!hasManyNumberField || subHasManyNumberField === 'index') - hasManyNumberField = subHasManyNumberField + {hasManyNumberField = subHasManyNumberField} } relationsToBuild.set(fieldName, { @@ -481,13 +481,13 @@ export const traverseFields = ({ const baseExtraConfig: BaseExtraConfig = { _orderIdx: (cols) => index(`${blockTableName}_order_idx`).on(cols._order), - _parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID), _parentIdFk: (cols) => foreignKey({ name: `${blockTableName}_parent_id_fk`, columns: [cols._parentID], foreignColumns: [adapter.tables[rootTableName].id], }).onDelete('cascade'), + _parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID), _pathIdx: (cols) => index(`${blockTableName}_path_idx`).on(cols._path), } @@ -515,8 +515,8 @@ export const traverseFields = ({ disableNotNull: disableNotNullFromHere, disableUnique, fields: disableUnique ? idToUUID(block.fields) : block.fields, - rootRelationsToBuild, rootRelationships: relationships, + rootRelationsToBuild, rootTableIDColType, rootTableName, tableName: blockTableName, @@ -538,12 +538,12 @@ export const traverseFields = ({ if (subHasManyTextField) { if (!hasManyTextField || subHasManyTextField === 'index') - hasManyTextField = subHasManyTextField + {hasManyTextField = subHasManyTextField} } if (subHasManyNumberField) { if (!hasManyNumberField || subHasManyNumberField === 'index') - hasManyNumberField = subHasManyNumberField + {hasManyNumberField = subHasManyNumberField} } adapter.relations[`relations_${blockTableName}`] = relations( @@ -629,8 +629,8 @@ export const traverseFields = ({ localesIndexes, newTableName, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -638,12 +638,12 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (groupHasLocalizedField) hasLocalizedField = true - if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (groupHasManyTextField) hasManyTextField = true - if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (groupHasManyNumberField) hasManyNumberField = true - if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (groupHasLocalizedField) {hasLocalizedField = true} + if (groupHasLocalizedRelationshipField) {hasLocalizedRelationshipField = true} + if (groupHasManyTextField) {hasManyTextField = true} + if (groupHasLocalizedManyTextField) {hasLocalizedManyTextField = true} + if (groupHasManyNumberField) {hasManyNumberField = true} + if (groupHasLocalizedManyNumberField) {hasLocalizedManyNumberField = true} break } @@ -671,8 +671,8 @@ export const traverseFields = ({ localesIndexes, newTableName: `${parentTableName}_${columnName}`, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -680,12 +680,12 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (groupHasLocalizedField) hasLocalizedField = true - if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (groupHasManyTextField) hasManyTextField = true - if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (groupHasManyNumberField) hasManyNumberField = true - if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (groupHasLocalizedField) {hasLocalizedField = true} + if (groupHasLocalizedRelationshipField) {hasLocalizedRelationshipField = true} + if (groupHasManyTextField) {hasManyTextField = true} + if (groupHasLocalizedManyTextField) {hasLocalizedManyTextField = true} + if (groupHasManyNumberField) {hasManyNumberField = true} + if (groupHasLocalizedManyNumberField) {hasLocalizedManyNumberField = true} break } @@ -714,8 +714,8 @@ export const traverseFields = ({ localesIndexes, newTableName, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -723,12 +723,12 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (tabHasLocalizedField) hasLocalizedField = true - if (tabHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (tabHasManyTextField) hasManyTextField = true - if (tabHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (tabHasManyNumberField) hasManyNumberField = true - if (tabHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (tabHasLocalizedField) {hasLocalizedField = true} + if (tabHasLocalizedRelationshipField) {hasLocalizedRelationshipField = true} + if (tabHasManyTextField) {hasManyTextField = true} + if (tabHasLocalizedManyTextField) {hasLocalizedManyTextField = true} + if (tabHasManyNumberField) {hasManyNumberField = true} + if (tabHasLocalizedManyNumberField) {hasLocalizedManyNumberField = true} break } @@ -757,8 +757,8 @@ export const traverseFields = ({ localesIndexes, newTableName, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -766,12 +766,12 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (rowHasLocalizedField) hasLocalizedField = true - if (rowHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (rowHasManyTextField) hasManyTextField = true - if (rowHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (rowHasManyNumberField) hasManyNumberField = true - if (rowHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (rowHasLocalizedField) {hasLocalizedField = true} + if (rowHasLocalizedRelationshipField) {hasLocalizedRelationshipField = true} + if (rowHasManyTextField) {hasManyTextField = true} + if (rowHasLocalizedManyTextField) {hasLocalizedManyTextField = true} + if (rowHasManyNumberField) {hasManyNumberField = true} + if (rowHasLocalizedManyNumberField) {hasLocalizedManyNumberField = true} break } @@ -792,8 +792,8 @@ export const traverseFields = ({ const relatedCollectionCustomID = relationshipConfig.fields.find( (field) => fieldAffectsData(field) && field.name === 'id', ) - if (relatedCollectionCustomID?.type === 'number') colType = 'numeric' - if (relatedCollectionCustomID?.type === 'text') colType = 'text' + if (relatedCollectionCustomID?.type === 'number') {colType = 'numeric'} + if (relatedCollectionCustomID?.type === 'text') {colType = 'text'} // make the foreign key column for relationship using the correct id column type targetTable[fieldName] = getIDColumn({ diff --git a/packages/db-sqlite/src/schema/withDefault.ts b/packages/db-sqlite/src/schema/withDefault.ts index beb974e043e..5006f8dd273 100644 --- a/packages/db-sqlite/src/schema/withDefault.ts +++ b/packages/db-sqlite/src/schema/withDefault.ts @@ -6,7 +6,7 @@ export const withDefault = ( field: FieldAffectingData, ): SQLiteColumnBuilder => { if (typeof field.defaultValue === 'undefined' || typeof field.defaultValue === 'function') - return column + {return column} if (typeof field.defaultValue === 'string' && field.defaultValue.includes("'")) { const escapedString = field.defaultValue.replaceAll("'", "''") diff --git a/packages/db-sqlite/src/types.ts b/packages/db-sqlite/src/types.ts index 754910bedab..a9e1decb1d1 100644 --- a/packages/db-sqlite/src/types.ts +++ b/packages/db-sqlite/src/types.ts @@ -26,7 +26,7 @@ export type Args = { push?: boolean relationshipsSuffix?: string schemaName?: string - transactionOptions?: SQLiteTransactionConfig | false + transactionOptions?: false | SQLiteTransactionConfig versionsSuffix?: string } diff --git a/packages/db-vercel-postgres/src/connect.ts b/packages/db-vercel-postgres/src/connect.ts index f90f4e74519..c81db150eed 100644 --- a/packages/db-vercel-postgres/src/connect.ts +++ b/packages/db-vercel-postgres/src/connect.ts @@ -2,7 +2,7 @@ import type { DrizzleAdapter } from '@payloadcms/drizzle/types' import type { Connect } from 'payload' import { pushDevSchema } from '@payloadcms/drizzle' -import { VercelPool, sql } from '@vercel/postgres' +import { sql, VercelPool } from '@vercel/postgres' import { drizzle } from 'drizzle-orm/node-postgres' import type { VercelPostgresAdapter } from './types.js' @@ -40,7 +40,7 @@ export const connect: Connect = async function connect( } } catch (err) { this.payload.logger.error(`Error: cannot connect to Postgres. Details: ${err.message}`, err) - if (typeof this.rejectInitializing === 'function') this.rejectInitializing() + if (typeof this.rejectInitializing === 'function') {this.rejectInitializing()} process.exit(1) } @@ -53,7 +53,7 @@ export const connect: Connect = async function connect( await pushDevSchema(this as unknown as DrizzleAdapter) } - if (typeof this.resolveInitializing === 'function') this.resolveInitializing() + if (typeof this.resolveInitializing === 'function') {this.resolveInitializing()} if (process.env.NODE_ENV === 'production' && this.prodMigrations) { await this.migrate({ migrations: this.prodMigrations }) diff --git a/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts b/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts index 768cff23c82..42d2926c1e6 100644 --- a/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts +++ b/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts @@ -193,7 +193,7 @@ export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => { const matchedRelationship = rows.find((row) => { const matchesPath = row.path === relationshipPath - if (locale) return matchesPath && locale === row.locale + if (locale) {return matchesPath && locale === row.locale} return row.path === relationshipPath }) diff --git a/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts b/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts index c88b3dcff7b..9798356d2a5 100644 --- a/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts +++ b/packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts @@ -35,7 +35,7 @@ export const migrateRelationships = async ({ req, tableName, }: Args) => { - if (pathsToQuery.size === 0) return + if (pathsToQuery.size === 0) {return} let offset = 0 @@ -54,7 +54,7 @@ export const migrateRelationships = async ({ paginationResult = await adapter.drizzle.execute(sql.raw(`${paginationStatement}`)) - if (paginationResult.rows.length === 0) return + if (paginationResult.rows.length === 0) {return} offset += 1 @@ -74,7 +74,7 @@ export const migrateRelationships = async ({ const parentID = row.parent_id if (typeof parentID === 'string' || typeof parentID === 'number') { - if (!docsToResave[parentID]) docsToResave[parentID] = [] + if (!docsToResave[parentID]) {docsToResave[parentID] = []} docsToResave[parentID].push(row) } }) diff --git a/packages/db-vercel-postgres/src/types.ts b/packages/db-vercel-postgres/src/types.ts index 23767950538..3732d5c9e01 100644 --- a/packages/db-vercel-postgres/src/types.ts +++ b/packages/db-vercel-postgres/src/types.ts @@ -33,7 +33,7 @@ export type Args = { * @experimental This only works when there are not other tables or enums of the same name in the database under a different schema. Awaiting fix from Drizzle. */ schemaName?: string - transactionOptions?: PgTransactionConfig | false + transactionOptions?: false | PgTransactionConfig versionsSuffix?: string } diff --git a/packages/drizzle/src/createTableName.ts b/packages/drizzle/src/createTableName.ts index 55ffa041567..3dc3375e3ee 100644 --- a/packages/drizzle/src/createTableName.ts +++ b/packages/drizzle/src/createTableName.ts @@ -47,7 +47,7 @@ export const createTableName = ({ let defaultTableName = `${prefix}${toSnakeCase(name ?? slug)}` - if (versions) defaultTableName = `_${defaultTableName}${adapter.versionsSuffix}` + if (versions) {defaultTableName = `_${defaultTableName}${adapter.versionsSuffix}`} let customTableNameResult: string @@ -62,7 +62,7 @@ export const createTableName = ({ : customNameDefinition if (versionsCustomName) - customTableNameResult = `_${customTableNameResult}${adapter.versionsSuffix}` + {customTableNameResult = `_${customTableNameResult}${adapter.versionsSuffix}`} } const result = customTableNameResult || defaultTableName diff --git a/packages/drizzle/src/createVersion.ts b/packages/drizzle/src/createVersion.ts index 3e0c8c15bc8..e8d0862694c 100644 --- a/packages/drizzle/src/createVersion.ts +++ b/packages/drizzle/src/createVersion.ts @@ -25,7 +25,7 @@ export async function createVersion( const tableName = this.tableNameMap.get(`_${defaultTableName}${this.versionsSuffix}`) const version = { ...versionData } - if (version.id) delete version.id + if (version.id) {delete version.id} const result = await upsertRow>({ adapter: this, diff --git a/packages/drizzle/src/destroy.ts b/packages/drizzle/src/destroy.ts index 3731cdf904d..7fa1a2a2340 100644 --- a/packages/drizzle/src/destroy.ts +++ b/packages/drizzle/src/destroy.ts @@ -4,7 +4,7 @@ import type { DrizzleAdapter } from './types.js' // eslint-disable-next-line @typescript-eslint/require-await export const destroy: Destroy = async function destroy(this: DrizzleAdapter) { - if (this.enums) this.enums = {} + if (this.enums) {this.enums = {}} this.schema = {} this.tables = {} this.relations = {} diff --git a/packages/drizzle/src/findMigrationDir.ts b/packages/drizzle/src/findMigrationDir.ts index e0f90b05187..e1348fc1eec 100644 --- a/packages/drizzle/src/findMigrationDir.ts +++ b/packages/drizzle/src/findMigrationDir.ts @@ -22,7 +22,7 @@ export function findMigrationDir(migrationDir?: string): string { const relativeMigrations = path.resolve(cwd, 'migrations') // Use arg if provided - if (migrationDir) return migrationDir + if (migrationDir) {return migrationDir} // Check other common locations if (fs.existsSync(srcDir)) { diff --git a/packages/drizzle/src/migrateReset.ts b/packages/drizzle/src/migrateReset.ts index 7c1a33ddaf7..341b0e1a2b9 100644 --- a/packages/drizzle/src/migrateReset.ts +++ b/packages/drizzle/src/migrateReset.ts @@ -57,7 +57,7 @@ export async function migrateReset(this: DrizzleAdapter): Promise { } catch (err: unknown) { let msg = `Error running migration ${migrationFile.name}.` - if (err instanceof Error) msg += ` ${err.message}` + if (err instanceof Error) {msg += ` ${err.message}`} await killTransaction(req) payload.logger.error({ diff --git a/packages/drizzle/src/postgres/createJSONQuery/convertPathToJSONTraversal.ts b/packages/drizzle/src/postgres/createJSONQuery/convertPathToJSONTraversal.ts index 0aa171e0a32..0afd25de155 100644 --- a/packages/drizzle/src/postgres/createJSONQuery/convertPathToJSONTraversal.ts +++ b/packages/drizzle/src/postgres/createJSONQuery/convertPathToJSONTraversal.ts @@ -7,7 +7,7 @@ export const convertPathToJSONTraversal = (incomingSegments: string[]) => { return segments.reduce((res, segment, i) => { const formattedSegment = formatJSONPathSegment(segment) - if (i + 1 === segments.length) return `${res}->>${formattedSegment}` + if (i + 1 === segments.length) {return `${res}->>${formattedSegment}`} return `${res}->${formattedSegment}` }, '') } diff --git a/packages/drizzle/src/postgres/schema/build.ts b/packages/drizzle/src/postgres/schema/build.ts index 0caf25ca7b5..37787a621f6 100644 --- a/packages/drizzle/src/postgres/schema/build.ts +++ b/packages/drizzle/src/postgres/schema/build.ts @@ -47,8 +47,8 @@ type Args = { disableNotNull: boolean disableUnique: boolean fields: Field[] - rootRelationsToBuild?: RelationMap rootRelationships?: Set + rootRelationsToBuild?: RelationMap rootTableIDColType?: string rootTableName?: string tableName: string @@ -77,8 +77,8 @@ export const buildTable = ({ disableNotNull, disableUnique = false, fields, - rootRelationsToBuild, rootRelationships, + rootRelationsToBuild, rootTableIDColType, rootTableName: incomingRootTableName, tableName, @@ -125,8 +125,8 @@ export const buildTable = ({ localesIndexes, newTableName: tableName, parentTableName: tableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild: rootRelationsToBuild || relationsToBuild, rootTableIDColType: rootTableIDColType || idColType, rootTableName, @@ -358,8 +358,8 @@ export const buildTable = ({ const relatedCollectionCustomIDType = adapter.payload.collections[relationshipConfig.slug]?.customIDType - if (relatedCollectionCustomIDType === 'number') colType = 'numeric' - if (relatedCollectionCustomIDType === 'text') colType = 'varchar' + if (relatedCollectionCustomIDType === 'number') {colType = 'numeric'} + if (relatedCollectionCustomIDType === 'text') {colType = 'varchar'} relationshipColumns[`${relationTo}ID`] = parentIDColumnMap[colType]( `${formattedRelationTo}_id`, diff --git a/packages/drizzle/src/postgres/schema/createIndex.ts b/packages/drizzle/src/postgres/schema/createIndex.ts index bda062639ca..29ea8408677 100644 --- a/packages/drizzle/src/postgres/schema/createIndex.ts +++ b/packages/drizzle/src/postgres/schema/createIndex.ts @@ -21,7 +21,7 @@ export const createIndex = ({ name, columnName, tableName, unique }: CreateIndex columns = [table[name]] } if (unique) - return uniqueIndex(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) + {return uniqueIndex(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1))} return index(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) } } diff --git a/packages/drizzle/src/postgres/schema/traverseFields.ts b/packages/drizzle/src/postgres/schema/traverseFields.ts index 39a29d7b3f6..03cca20db19 100644 --- a/packages/drizzle/src/postgres/schema/traverseFields.ts +++ b/packages/drizzle/src/postgres/schema/traverseFields.ts @@ -4,15 +4,15 @@ import type { Field, TabAsField } from 'payload' import { relations } from 'drizzle-orm' import { - PgNumericBuilder, - PgUUIDBuilder, - PgVarcharBuilder, boolean, foreignKey, index, integer, jsonb, numeric, + PgNumericBuilder, + PgUUIDBuilder, + PgVarcharBuilder, text, timestamp, varchar, @@ -52,8 +52,8 @@ type Args = { localesIndexes: Record IndexBuilder> newTableName: string parentTableName: string - relationsToBuild: RelationMap relationships: Set + relationsToBuild: RelationMap rootRelationsToBuild?: RelationMap rootTableIDColType: string rootTableName: string @@ -88,8 +88,8 @@ export const traverseFields = ({ localesIndexes, newTableName, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -105,12 +105,12 @@ export const traverseFields = ({ let hasLocalizedManyNumberField = false let parentIDColType: IDType = 'integer' - if (columns.id instanceof PgUUIDBuilder) parentIDColType = 'uuid' - if (columns.id instanceof PgNumericBuilder) parentIDColType = 'numeric' - if (columns.id instanceof PgVarcharBuilder) parentIDColType = 'varchar' + if (columns.id instanceof PgUUIDBuilder) {parentIDColType = 'uuid'} + if (columns.id instanceof PgNumericBuilder) {parentIDColType = 'numeric'} + if (columns.id instanceof PgVarcharBuilder) {parentIDColType = 'varchar'} fields.forEach((field) => { - if ('name' in field && field.name === 'id') return + if ('name' in field && field.name === 'id') {return} let columnName: string let fieldName: string @@ -396,8 +396,8 @@ export const traverseFields = ({ disableNotNull: disableNotNullFromHere, disableUnique, fields: disableUnique ? idToUUID(field.fields) : field.fields, - rootRelationsToBuild, rootRelationships: relationships, + rootRelationsToBuild, rootTableIDColType, rootTableName, tableName: arrayTableName, @@ -419,11 +419,11 @@ export const traverseFields = ({ if (subHasManyTextField) { if (!hasManyTextField || subHasManyTextField === 'index') - hasManyTextField = subHasManyTextField + {hasManyTextField = subHasManyTextField} } if (subHasManyNumberField) { if (!hasManyNumberField || subHasManyNumberField === 'index') - hasManyNumberField = subHasManyNumberField + {hasManyNumberField = subHasManyNumberField} } relationsToBuild.set(fieldName, { @@ -494,13 +494,13 @@ export const traverseFields = ({ const baseExtraConfig: BaseExtraConfig = { _orderIdx: (cols) => index(`${blockTableName}_order_idx`).on(cols._order), - _parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID), _parentIdFk: (cols) => foreignKey({ name: `${blockTableName}_parent_id_fk`, columns: [cols._parentID], foreignColumns: [adapter.tables[rootTableName].id], }).onDelete('cascade'), + _parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID), _pathIdx: (cols) => index(`${blockTableName}_path_idx`).on(cols._path), } @@ -528,8 +528,8 @@ export const traverseFields = ({ disableNotNull: disableNotNullFromHere, disableUnique, fields: disableUnique ? idToUUID(block.fields) : block.fields, - rootRelationsToBuild, rootRelationships: relationships, + rootRelationsToBuild, rootTableIDColType, rootTableName, tableName: blockTableName, @@ -551,12 +551,12 @@ export const traverseFields = ({ if (subHasManyTextField) { if (!hasManyTextField || subHasManyTextField === 'index') - hasManyTextField = subHasManyTextField + {hasManyTextField = subHasManyTextField} } if (subHasManyNumberField) { if (!hasManyNumberField || subHasManyNumberField === 'index') - hasManyNumberField = subHasManyNumberField + {hasManyNumberField = subHasManyNumberField} } adapter.relations[`relations_${blockTableName}`] = relations( @@ -641,8 +641,8 @@ export const traverseFields = ({ localesIndexes, newTableName, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -650,12 +650,12 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (groupHasLocalizedField) hasLocalizedField = true - if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (groupHasManyTextField) hasManyTextField = true - if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (groupHasManyNumberField) hasManyNumberField = true - if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (groupHasLocalizedField) {hasLocalizedField = true} + if (groupHasLocalizedRelationshipField) {hasLocalizedRelationshipField = true} + if (groupHasManyTextField) {hasManyTextField = true} + if (groupHasLocalizedManyTextField) {hasLocalizedManyTextField = true} + if (groupHasManyNumberField) {hasManyNumberField = true} + if (groupHasLocalizedManyNumberField) {hasLocalizedManyNumberField = true} break } @@ -682,8 +682,8 @@ export const traverseFields = ({ localesIndexes, newTableName: `${parentTableName}_${columnName}`, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -691,12 +691,12 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (groupHasLocalizedField) hasLocalizedField = true - if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (groupHasManyTextField) hasManyTextField = true - if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (groupHasManyNumberField) hasManyNumberField = true - if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (groupHasLocalizedField) {hasLocalizedField = true} + if (groupHasLocalizedRelationshipField) {hasLocalizedRelationshipField = true} + if (groupHasManyTextField) {hasManyTextField = true} + if (groupHasLocalizedManyTextField) {hasLocalizedManyTextField = true} + if (groupHasManyNumberField) {hasManyNumberField = true} + if (groupHasLocalizedManyNumberField) {hasLocalizedManyNumberField = true} break } @@ -724,8 +724,8 @@ export const traverseFields = ({ localesIndexes, newTableName, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -733,12 +733,12 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (tabHasLocalizedField) hasLocalizedField = true - if (tabHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (tabHasManyTextField) hasManyTextField = true - if (tabHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (tabHasManyNumberField) hasManyNumberField = true - if (tabHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (tabHasLocalizedField) {hasLocalizedField = true} + if (tabHasLocalizedRelationshipField) {hasLocalizedRelationshipField = true} + if (tabHasManyTextField) {hasManyTextField = true} + if (tabHasLocalizedManyTextField) {hasLocalizedManyTextField = true} + if (tabHasManyNumberField) {hasManyNumberField = true} + if (tabHasLocalizedManyNumberField) {hasLocalizedManyNumberField = true} break } @@ -766,8 +766,8 @@ export const traverseFields = ({ localesIndexes, newTableName, parentTableName, - relationsToBuild, relationships, + relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, @@ -775,12 +775,12 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (rowHasLocalizedField) hasLocalizedField = true - if (rowHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (rowHasManyTextField) hasManyTextField = true - if (rowHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (rowHasManyNumberField) hasManyNumberField = true - if (rowHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (rowHasLocalizedField) {hasLocalizedField = true} + if (rowHasLocalizedRelationshipField) {hasLocalizedRelationshipField = true} + if (rowHasManyTextField) {hasManyTextField = true} + if (rowHasLocalizedManyTextField) {hasLocalizedManyTextField = true} + if (rowHasManyNumberField) {hasManyNumberField = true} + if (rowHasLocalizedManyNumberField) {hasLocalizedManyNumberField = true} break } @@ -801,8 +801,8 @@ export const traverseFields = ({ const relatedCollectionCustomID = relationshipConfig.fields.find( (field) => fieldAffectsData(field) && field.name === 'id', ) - if (relatedCollectionCustomID?.type === 'number') colType = 'numeric' - if (relatedCollectionCustomID?.type === 'text') colType = 'varchar' + 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( diff --git a/packages/drizzle/src/postgres/schema/withDefault.ts b/packages/drizzle/src/postgres/schema/withDefault.ts index 1214c52e3ac..42a193e740c 100644 --- a/packages/drizzle/src/postgres/schema/withDefault.ts +++ b/packages/drizzle/src/postgres/schema/withDefault.ts @@ -6,7 +6,7 @@ export const withDefault = ( field: FieldAffectingData, ): PgColumnBuilder => { if (typeof field.defaultValue === 'undefined' || typeof field.defaultValue === 'function') - return column + {return column} if (typeof field.defaultValue === 'string' && field.defaultValue.includes("'")) { const escapedString = field.defaultValue.replaceAll("'", "''") diff --git a/packages/drizzle/src/postgres/types.ts b/packages/drizzle/src/postgres/types.ts index a9070ab2c21..84aeb4a5ae7 100644 --- a/packages/drizzle/src/postgres/types.ts +++ b/packages/drizzle/src/postgres/types.ts @@ -13,11 +13,11 @@ import type { IndexBuilder, PgColumn, PgEnum, + pgEnum, PgInsertOnConflictDoUpdateConfig, PgSchema, PgTableWithColumns, UniqueConstraintBuilder, - pgEnum, } from 'drizzle-orm/pg-core' import type { PgTableFn } from 'drizzle-orm/pg-core/table' import type { Payload, PayloadRequest } from 'payload' diff --git a/packages/drizzle/src/queries/getTableColumnFromPath.ts b/packages/drizzle/src/queries/getTableColumnFromPath.ts index f311ad1d816..e1549efd976 100644 --- a/packages/drizzle/src/queries/getTableColumnFromPath.ts +++ b/packages/drizzle/src/queries/getTableColumnFromPath.ts @@ -539,7 +539,7 @@ export const getTableColumnFromPath = ({ field, getNotNullColumnByValue: (val) => { const matchedRelation = relationTo.find((relation) => relation === val) - if (matchedRelation) return `${matchedRelation}ID` + if (matchedRelation) {return `${matchedRelation}ID`} return undefined }, table: aliasRelationshipTable, diff --git a/packages/drizzle/src/queries/operatorMap.ts b/packages/drizzle/src/queries/operatorMap.ts index 6b0139106c1..e583f644d03 100644 --- a/packages/drizzle/src/queries/operatorMap.ts +++ b/packages/drizzle/src/queries/operatorMap.ts @@ -1,8 +1,6 @@ import { - type Column, - type SQL, - type SQLWrapper, and, + type Column, eq, gt, gte, @@ -15,6 +13,8 @@ import { ne, notInArray, or, + type SQL, + type SQLWrapper, } from 'drizzle-orm' type OperatorKeys = diff --git a/packages/drizzle/src/queries/sanitizeQueryValue.ts b/packages/drizzle/src/queries/sanitizeQueryValue.ts index 1758d028b8c..94d662d8905 100644 --- a/packages/drizzle/src/queries/sanitizeQueryValue.ts +++ b/packages/drizzle/src/queries/sanitizeQueryValue.ts @@ -1,4 +1,4 @@ -import { APIError, type Field, type TabAsField, createArrayFromCommaDelineated } from 'payload' +import { APIError, createArrayFromCommaDelineated, type Field, type TabAsField } from 'payload' import { fieldAffectsData } from 'payload/shared' import type { DrizzleAdapter } from '../types.js' @@ -21,7 +21,7 @@ export const sanitizeQueryValue = ({ let operator = operatorArg let formattedValue = val - if (!fieldAffectsData(field)) return { operator, value: formattedValue } + if (!fieldAffectsData(field)) {return { operator, value: formattedValue }} if ( (field.type === 'relationship' || field.type === 'upload') && @@ -43,8 +43,8 @@ export const sanitizeQueryValue = ({ // Cast incoming values as proper searchable types if (field.type === 'checkbox' && typeof val === 'string') { - if (val.toLowerCase() === 'true') formattedValue = true - if (val.toLowerCase() === 'false') formattedValue = false + if (val.toLowerCase() === 'true') {formattedValue = true} + if (val.toLowerCase() === 'false') {formattedValue = false} } if (['all', 'in', 'not_in'].includes(operator)) { @@ -71,7 +71,7 @@ export const sanitizeQueryValue = ({ if (Number.isNaN(Date.parse(formattedValue))) { return { operator, value: undefined } } - } else if (typeof val === 'number') formattedValue = new Date(val).toISOString() + } else if (typeof val === 'number') {formattedValue = new Date(val).toISOString()} } if (field.type === 'relationship' || field.type === 'upload') { diff --git a/packages/drizzle/src/transactions/commitTransaction.ts b/packages/drizzle/src/transactions/commitTransaction.ts index c985ca64f93..e68e52264cb 100644 --- a/packages/drizzle/src/transactions/commitTransaction.ts +++ b/packages/drizzle/src/transactions/commitTransaction.ts @@ -1,7 +1,7 @@ import type { CommitTransaction } from 'payload' export const commitTransaction: CommitTransaction = async function commitTransaction(id) { - if (id instanceof Promise) return + if (id instanceof Promise) {return} // if the session was deleted it has already been aborted if (!this.sessions[id]) { diff --git a/packages/drizzle/src/transform/write/blocks.ts b/packages/drizzle/src/transform/write/blocks.ts index c70ca5d0477..0645672dd3c 100644 --- a/packages/drizzle/src/transform/write/blocks.ts +++ b/packages/drizzle/src/transform/write/blocks.ts @@ -48,12 +48,12 @@ export const transformBlocks = ({ withinArrayOrBlockLocale, }: Args) => { data.forEach((blockRow, i) => { - if (typeof blockRow.blockType !== 'string') return + if (typeof blockRow.blockType !== 'string') {return} const matchedBlock = field.blocks.find(({ slug }) => slug === blockRow.blockType) - if (!matchedBlock) return + if (!matchedBlock) {return} const blockType = toSnakeCase(blockRow.blockType) - if (!blocks[blockType]) blocks[blockType] = [] + if (!blocks[blockType]) {blocks[blockType] = []} const newRow: BlockRowToInsert = { arrays: {}, @@ -64,8 +64,8 @@ export const transformBlocks = ({ }, } - if (field.localized && locale) newRow.row._locale = locale - if (withinArrayOrBlockLocale) newRow.row._locale = withinArrayOrBlockLocale + if (field.localized && locale) {newRow.row._locale = locale} + if (withinArrayOrBlockLocale) {newRow.row._locale = withinArrayOrBlockLocale} const blockTableName = adapter.tableNameMap.get(`${baseTableName}_blocks_${blockType}`) diff --git a/packages/drizzle/src/transform/write/relationships.ts b/packages/drizzle/src/transform/write/relationships.ts index 445feef31c4..3f9528ae1c8 100644 --- a/packages/drizzle/src/transform/write/relationships.ts +++ b/packages/drizzle/src/transform/write/relationships.ts @@ -15,14 +15,14 @@ export const transformRelationship = ({ baseRow, data, field, relationships }: A relations.forEach((relation, i) => { if (relation) { const relationRow = { ...baseRow } - if ('hasMany' in field && field.hasMany) relationRow.order = i + 1 + if ('hasMany' in field && field.hasMany) {relationRow.order = i + 1} if (Array.isArray(field.relationTo) && valueIsValueWithRelation(relation)) { relationRow[`${relation.relationTo}ID`] = relation.value relationships.push(relationRow) } else { relationRow[`${field.relationTo}ID`] = relation - if (relation) relationships.push(relationRow) + if (relation) {relationships.push(relationRow)} } } }) diff --git a/packages/drizzle/src/transform/write/traverseFields.ts b/packages/drizzle/src/transform/write/traverseFields.ts index 3fa26a9d18d..3031fdd7469 100644 --- a/packages/drizzle/src/transform/write/traverseFields.ts +++ b/packages/drizzle/src/transform/write/traverseFields.ts @@ -101,7 +101,7 @@ export const traverseFields = ({ if (field.type === 'array') { const arrayTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`) - if (!arrays[arrayTableName]) arrays[arrayTableName] = [] + if (!arrays[arrayTableName]) {arrays[arrayTableName] = []} if (field.localized) { if (typeof data[field.name] === 'object' && data[field.name] !== null) { @@ -502,7 +502,7 @@ export const traverseFields = ({ if (field.type === 'select' && field.hasMany) { const selectTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`) - if (!selects[selectTableName]) selects[selectTableName] = [] + if (!selects[selectTableName]) {selects[selectTableName] = []} if (field.localized) { if (typeof data[field.name] === 'object' && data[field.name] !== null) { @@ -537,7 +537,7 @@ export const traverseFields = ({ if (field.localized) { if (typeof fieldData === 'object' && fieldData !== null) { Object.entries(fieldData).forEach(([localeKey, localeData]) => { - if (!locales[localeKey]) locales[localeKey] = {} + if (!locales[localeKey]) {locales[localeKey] = {}} valuesToTransform.push({ localeKey, @@ -550,7 +550,7 @@ export const traverseFields = ({ let ref = row if (forcedLocale) { - if (!locales[forcedLocale]) locales[forcedLocale] = {} + if (!locales[forcedLocale]) {locales[forcedLocale] = {}} ref = locales[forcedLocale] } diff --git a/packages/drizzle/src/types.ts b/packages/drizzle/src/types.ts index 3a197b28963..ca3023bac83 100644 --- a/packages/drizzle/src/types.ts +++ b/packages/drizzle/src/types.ts @@ -162,7 +162,7 @@ export interface DrizzleAdapter extends BaseDatabaseAdapter { deleteWhere: DeleteWhere drizzle: LibSQLDatabase | PostgresDB dropDatabase: DropDatabase - enums?: Record | never + enums?: never | Record execute: Execute features: { json?: boolean diff --git a/packages/drizzle/src/upsertRow/deleteExistingRowsByPath.ts b/packages/drizzle/src/upsertRow/deleteExistingRowsByPath.ts index 3940eee48ef..945c04b55e4 100644 --- a/packages/drizzle/src/upsertRow/deleteExistingRowsByPath.ts +++ b/packages/drizzle/src/upsertRow/deleteExistingRowsByPath.ts @@ -43,7 +43,7 @@ export const deleteExistingRowsByPath = async ({ const whereConstraints = [eq(table[parentColumnName], parentID)] if (pathColumnName) - whereConstraints.push(inArray(table[pathColumnName], Array.from(localizedPathsToDelete))) + {whereConstraints.push(inArray(table[pathColumnName], Array.from(localizedPathsToDelete)))} await adapter.deleteWhere({ db, @@ -56,7 +56,7 @@ export const deleteExistingRowsByPath = async ({ const whereConstraints = [eq(table[parentColumnName], parentID)] if (pathColumnName) - whereConstraints.push(inArray(table[pathColumnName], Array.from(pathsToDelete))) + {whereConstraints.push(inArray(table[pathColumnName], Array.from(pathsToDelete)))} await adapter.deleteWhere({ db, diff --git a/packages/drizzle/src/upsertRow/index.ts b/packages/drizzle/src/upsertRow/index.ts index acc8f233106..5750b0f99bd 100644 --- a/packages/drizzle/src/upsertRow/index.ts +++ b/packages/drizzle/src/upsertRow/index.ts @@ -116,7 +116,7 @@ export const upsertRow = async | TypeWithID>( if (typeof row.parent === 'undefined') { row.parent = insertedRow.id } - if (!selectsToInsert[selectTableName]) selectsToInsert[selectTableName] = [] + if (!selectsToInsert[selectTableName]) {selectsToInsert[selectTableName] = []} selectsToInsert[selectTableName].push(row) }) }) @@ -127,7 +127,7 @@ export const upsertRow = async | TypeWithID>( Object.keys(rowToInsert.blocks).forEach((blockName) => { rowToInsert.blocks[blockName].forEach((blockRow) => { blockRow.row._parentID = insertedRow.id - if (!blocksToInsert[blockName]) blocksToInsert[blockName] = [] + if (!blocksToInsert[blockName]) {blocksToInsert[blockName] = []} if (blockRow.row.uuid) { delete blockRow.row.uuid } @@ -361,7 +361,7 @@ export const upsertRow = async | TypeWithID>( const replacedConstraint = error.constraint.replace(replacement, '') if (replacedConstraint && adapter.fieldConstraints[tableName]?.[replacedConstraint]) - fieldName = adapter.fieldConstraints[tableName][replacedConstraint] + {fieldName = adapter.fieldConstraints[tableName][replacedConstraint]} } } } @@ -396,7 +396,7 @@ export const upsertRow = async | TypeWithID>( } } - if (ignoreResult) return data as T + if (ignoreResult) {return data as T} // ////////////////////////////////// // RETRIEVE NEWLY UPDATED ROW diff --git a/packages/drizzle/src/utilities/createBlocksMap.ts b/packages/drizzle/src/utilities/createBlocksMap.ts index c3ce6ee871d..da26141fc0d 100644 --- a/packages/drizzle/src/utilities/createBlocksMap.ts +++ b/packages/drizzle/src/utilities/createBlocksMap.ts @@ -11,7 +11,7 @@ export const createBlocksMap = (data: Record): BlocksMap => { rows.forEach((row) => { if ('_path' in row) { - if (!(row._path in blocksMap)) blocksMap[row._path] = [] + if (!(row._path in blocksMap)) {blocksMap[row._path] = []} row.blockType = blockType blocksMap[row._path].push(row) diff --git a/packages/drizzle/src/utilities/createRelationshipMap.ts b/packages/drizzle/src/utilities/createRelationshipMap.ts index c05c356ebd7..78efc309def 100644 --- a/packages/drizzle/src/utilities/createRelationshipMap.ts +++ b/packages/drizzle/src/utilities/createRelationshipMap.ts @@ -11,7 +11,7 @@ export const createPathMap = (rows: unknown): Record { return fields.some((field) => { // arrays always get a separate table - if (field.type === 'array') return false - if (fieldAffectsData(field) && field.localized) return true - if (fieldHasSubFields(field)) return hasLocalesTable(field.fields) - if (field.type === 'tabs') return field.tabs.some((tab) => hasLocalesTable(tab.fields)) + if (field.type === 'array') {return false} + if (fieldAffectsData(field) && field.localized) {return true} + if (fieldHasSubFields(field)) {return hasLocalesTable(field.fields)} + if (field.type === 'tabs') {return field.tabs.some((tab) => hasLocalesTable(tab.fields))} return false }) } diff --git a/packages/next/src/elements/DocumentLocked/index.tsx b/packages/next/src/elements/DocumentLocked/index.tsx index e46997a8b5e..ba0f85d4299 100644 --- a/packages/next/src/elements/DocumentLocked/index.tsx +++ b/packages/next/src/elements/DocumentLocked/index.tsx @@ -11,7 +11,7 @@ const modalSlug = 'document-locked' const baseClass = 'document-locked' const formatDate = (date) => { - if (!date) return '' + if (!date) {return ''} return new Intl.DateTimeFormat('en-US', { day: 'numeric', hour: 'numeric', @@ -34,8 +34,8 @@ export const DocumentLocked: React.FC<{ const { t } = useTranslation() useEffect(() => { - if (isActive) openModal(modalSlug) - else closeModal(modalSlug) + if (isActive) {openModal(modalSlug)} + else {closeModal(modalSlug)} }, [isActive, openModal, closeModal]) return ( diff --git a/packages/next/src/elements/DocumentTakeOver/index.tsx b/packages/next/src/elements/DocumentTakeOver/index.tsx index a7fe6c4f2bc..3905c52d187 100644 --- a/packages/next/src/elements/DocumentTakeOver/index.tsx +++ b/packages/next/src/elements/DocumentTakeOver/index.tsx @@ -17,8 +17,8 @@ export const DocumentTakeOver: React.FC<{ const { t } = useTranslation() useEffect(() => { - if (isActive) openModal(modalSlug) - else closeModal(modalSlug) + if (isActive) {openModal(modalSlug)} + else {closeModal(modalSlug)} }, [isActive, openModal, closeModal]) return ( diff --git a/packages/next/src/views/Dashboard/Default/index.tsx b/packages/next/src/views/Dashboard/Default/index.tsx index 69644169236..1f9a34e1cab 100644 --- a/packages/next/src/views/Dashboard/Default/index.tsx +++ b/packages/next/src/views/Dashboard/Default/index.tsx @@ -16,8 +16,8 @@ import './index.scss' const baseClass = 'dashboard' export type DashboardProps = { - Link: React.ComponentType globalData: Array<{ data: { isLocked: boolean; userEditing: ClientUser | null }; slug: string }> + Link: React.ComponentType navGroups?: ReturnType permissions: Permissions visibleEntities: VisibleEntities @@ -25,10 +25,10 @@ export type DashboardProps = { export const DefaultDashboard: React.FC = (props) => { const { - Link, globalData, i18n, i18n: { t }, + Link, locale, navGroups, params, diff --git a/packages/next/src/views/Dashboard/index.tsx b/packages/next/src/views/Dashboard/index.tsx index c3a4bbe682f..7c7bb39aad2 100644 --- a/packages/next/src/views/Dashboard/index.tsx +++ b/packages/next/src/views/Dashboard/index.tsx @@ -97,9 +97,9 @@ export const Dashboard: React.FC = async ({ const createMappedComponent = getCreateMappedComponent({ importMap: payload.importMap, serverProps: { - Link, globalData, i18n, + Link, locale, navGroups, params, diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index 190d06fe080..eac07576567 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -521,8 +521,8 @@ export const DefaultEditView: React.FC = () => {
Date: Fri, 30 Aug 2024 09:53:38 -0400 Subject: [PATCH 117/173] chore: adds locked-documents test suite --- .vscode/launch.json | 7 + test/locked-documents/.gitignore | 2 + .../collections/Pages/index.ts | 48 + .../collections/Posts/index.ts | 50 + .../collections/Users/index.ts | 15 + test/locked-documents/config.ts | 192 ++ test/locked-documents/e2e.spec.ts | 37 + test/locked-documents/eslint.config.js | 24 + test/locked-documents/globals/Menu/index.ts | 13 + test/locked-documents/int.spec.ts | 76 + test/locked-documents/payload-types.ts | 282 +++ test/locked-documents/schema.graphql | 1902 +++++++++++++++++ test/locked-documents/tsconfig.eslint.json | 13 + test/locked-documents/tsconfig.json | 3 + 14 files changed, 2664 insertions(+) create mode 100644 test/locked-documents/.gitignore create mode 100644 test/locked-documents/collections/Pages/index.ts create mode 100644 test/locked-documents/collections/Posts/index.ts create mode 100644 test/locked-documents/collections/Users/index.ts create mode 100644 test/locked-documents/config.ts create mode 100644 test/locked-documents/e2e.spec.ts create mode 100644 test/locked-documents/eslint.config.js create mode 100644 test/locked-documents/globals/Menu/index.ts create mode 100644 test/locked-documents/int.spec.ts create mode 100644 test/locked-documents/payload-types.ts create mode 100644 test/locked-documents/schema.graphql create mode 100644 test/locked-documents/tsconfig.eslint.json create mode 100644 test/locked-documents/tsconfig.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 6a907551958..43bdde6cb77 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -118,6 +118,13 @@ "request": "launch", "type": "node-terminal" }, + { + "command": "node --no-deprecation test/dev.js locked-documents", + "cwd": "${workspaceFolder}", + "name": "Run Dev Locked Documents", + "request": "launch", + "type": "node-terminal" + }, { "command": "node --no-deprecation test/dev.js uploads", "cwd": "${workspaceFolder}", diff --git a/test/locked-documents/.gitignore b/test/locked-documents/.gitignore new file mode 100644 index 00000000000..cce01755f4f --- /dev/null +++ b/test/locked-documents/.gitignore @@ -0,0 +1,2 @@ +/media +/media-gif diff --git a/test/locked-documents/collections/Pages/index.ts b/test/locked-documents/collections/Pages/index.ts new file mode 100644 index 00000000000..7d24e8d0525 --- /dev/null +++ b/test/locked-documents/collections/Pages/index.ts @@ -0,0 +1,48 @@ +import type { CollectionConfig } from 'payload' + +export const pagesSlug = 'pages' + +export const PagesCollection: CollectionConfig = { + slug: pagesSlug, + admin: { + useAsTitle: 'text', + }, + lockWhenEditing: false, + fields: [ + { + name: 'text', + type: 'text', + }, + { + name: 'richText', + type: 'richText', + }, + { + name: 'myBlocks', + type: 'blocks', + blocks: [ + { + slug: 'test', + fields: [ + { + name: 'test', + type: 'text', + }, + ], + }, + { + slug: 'someBlock2', + fields: [ + { + name: 'test2', + type: 'text', + }, + ], + }, + ], + }, + ], + versions: { + drafts: true, + }, +} diff --git a/test/locked-documents/collections/Posts/index.ts b/test/locked-documents/collections/Posts/index.ts new file mode 100644 index 00000000000..fdf48a9dee9 --- /dev/null +++ b/test/locked-documents/collections/Posts/index.ts @@ -0,0 +1,50 @@ +import type { CollectionConfig } from 'payload' + +export const postsSlug = 'posts' + +export const PostsCollection: CollectionConfig = { + slug: postsSlug, + admin: { + useAsTitle: 'text', + }, + lockWhenEditing: { + lockDuration: 60, + }, + fields: [ + { + name: 'text', + type: 'text', + }, + { + name: 'richText', + type: 'richText', + }, + { + name: 'myBlocks', + type: 'blocks', + blocks: [ + { + slug: 'test', + fields: [ + { + name: 'test', + type: 'text', + }, + ], + }, + { + slug: 'someBlock2', + fields: [ + { + name: 'test2', + type: 'text', + }, + ], + }, + ], + }, + ], + versions: { + drafts: true, + }, +} diff --git a/test/locked-documents/collections/Users/index.ts b/test/locked-documents/collections/Users/index.ts new file mode 100644 index 00000000000..c2d95459368 --- /dev/null +++ b/test/locked-documents/collections/Users/index.ts @@ -0,0 +1,15 @@ +import type { CollectionConfig } from 'payload' + +export const Users: CollectionConfig = { + slug: 'users', + admin: { + useAsTitle: 'name', + }, + auth: true, + fields: [ + { + name: 'name', + type: 'text', + }, + ], +} diff --git a/test/locked-documents/config.ts b/test/locked-documents/config.ts new file mode 100644 index 00000000000..79f0ceb6d23 --- /dev/null +++ b/test/locked-documents/config.ts @@ -0,0 +1,192 @@ +import { BlocksFeature, lexicalEditor } from '@payloadcms/richtext-lexical' +import { fileURLToPath } from 'node:url' +import path from 'path' + +import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' +import { devUser, regularUser } from '../credentials.js' +import { PagesCollection, pagesSlug } from './collections/Pages/index.js' +import { PostsCollection, postsSlug } from './collections/Posts/index.js' +import { Users } from './collections/Users/index.js' +import { MenuGlobal } from './globals/Menu/index.js' +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +export default buildConfigWithDefaults({ + collections: [ + PagesCollection, + PostsCollection, + { + slug: 'simple', + fields: [ + { + name: 'text', + type: 'text', + }, + ], + }, + Users, + ], + admin: { + importMap: { + baseDir: path.resolve(dirname), + }, + }, + editor: lexicalEditor({ + features: ({ defaultFeatures }) => [ + ...defaultFeatures, + BlocksFeature({ + blocks: [ + { + slug: 'test', + fields: [ + { + name: 'test', + type: 'text', + }, + ], + }, + { + slug: 'someBlock2', + fields: [ + { + name: 'test2', + type: 'text', + }, + ], + }, + ], + inlineBlocks: [ + { + slug: 'test', + fields: [ + { + name: 'test', + type: 'text', + }, + ], + }, + { + slug: 'someBlock2', + fields: [ + { + name: 'test2', + type: 'text', + }, + ], + }, + ], + }), + ], + }), + cors: ['http://localhost:3000', 'http://localhost:3001'], + globals: [ + MenuGlobal, + { + slug: 'custom-ts', + fields: [ + { + name: 'custom', + type: 'text', + typescriptSchema: [ + () => ({ + enum: ['hello', 'world'], + }), + ], + }, + { + name: 'withDefinitionsUsage', + type: 'text', + typescriptSchema: [ + () => ({ + type: 'array', + items: { + $ref: `#/definitions/objectWithNumber`, + }, + }), + ], + }, + { + name: 'json', + type: 'json', + jsonSchema: { + fileMatch: ['a://b/foo.json'], + schema: { + type: 'array', + items: { + type: 'object', + additionalProperties: false, + properties: { + id: { + type: 'string', + }, + name: { + type: 'string', + }, + age: { + type: 'integer', + }, + // Add other properties here + }, + required: ['id', 'name'], // Specify which properties are required + }, + }, + uri: 'a://b/foo.json', + }, + required: true, + }, + ], + }, + ], + onInit: async (payload) => { + await payload.create({ + collection: 'users', + data: { + email: devUser.email, + password: devUser.password, + name: 'Admin', + }, + }) + + await payload.create({ + collection: 'users', + data: { + email: regularUser.email, + password: regularUser.password, + name: 'Dev', + }, + }) + + await payload.create({ + collection: pagesSlug, + data: { + text: 'Some page', + }, + }) + + await payload.create({ + collection: postsSlug, + data: { + text: 'example post', + }, + }) + }, + typescript: { + outputFile: path.resolve(dirname, 'payload-types.ts'), + schema: [ + ({ jsonSchema }) => { + jsonSchema.definitions.objectWithNumber = { + type: 'object', + additionalProperties: false, + properties: { + id: { + type: 'number', + required: true, + }, + }, + required: true, + } + return jsonSchema + }, + ], + }, +}) diff --git a/test/locked-documents/e2e.spec.ts b/test/locked-documents/e2e.spec.ts new file mode 100644 index 00000000000..5472479609d --- /dev/null +++ b/test/locked-documents/e2e.spec.ts @@ -0,0 +1,37 @@ +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import * as path from 'path' +import { fileURLToPath } from 'url' + +import { ensureCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js' +import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' +import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' +import { TEST_TIMEOUT } from '../playwright.config.js' + +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +test.describe('Admin Panel', () => { + let page: Page + let url: AdminUrlUtil + + test.beforeAll(async ({ browser }, testInfo) => { + testInfo.setTimeout(TEST_TIMEOUT) + + const { payload, serverURL } = await initPayloadE2ENoConfig({ dirname }) + url = new AdminUrlUtil(serverURL, 'posts') + + const context = await browser.newContext() + page = await context.newPage() + initPageConsoleErrorCatch(page) + await ensureCompilationIsDone({ page, serverURL }) + }) + + test('example test', async () => { + await page.goto(url.list) + + const textCell = page.locator('.row-1 .cell-text') + await expect(textCell).toHaveText('example post') + }) +}) diff --git a/test/locked-documents/eslint.config.js b/test/locked-documents/eslint.config.js new file mode 100644 index 00000000000..5f9c923b27a --- /dev/null +++ b/test/locked-documents/eslint.config.js @@ -0,0 +1,24 @@ +import { rootParserOptions } from '../../eslint.config.js' +import { testEslintConfig } from '../eslint.config.js' + +/** @typedef {import('eslint').Linter.FlatConfig} */ +let FlatConfig + +/** @type {FlatConfig[]} */ +export const index = [ + ...testEslintConfig, + { + languageOptions: { + parserOptions: { + projectService: { + allowDefaultProject: ['./*.ts', './*.tsx'], + defaultProject: './tsconfig.json', + }, + tsconfigDirName: import.meta.dirname, + ...rootParserOptions, + }, + }, + }, +] + +export default index diff --git a/test/locked-documents/globals/Menu/index.ts b/test/locked-documents/globals/Menu/index.ts new file mode 100644 index 00000000000..f9f603d7861 --- /dev/null +++ b/test/locked-documents/globals/Menu/index.ts @@ -0,0 +1,13 @@ +import type { GlobalConfig } from 'payload' + +export const menuSlug = 'menu' + +export const MenuGlobal: GlobalConfig = { + slug: menuSlug, + fields: [ + { + name: 'globalText', + type: 'text', + }, + ], +} diff --git a/test/locked-documents/int.spec.ts b/test/locked-documents/int.spec.ts new file mode 100644 index 00000000000..49cd59407bd --- /dev/null +++ b/test/locked-documents/int.spec.ts @@ -0,0 +1,76 @@ +import type { Payload } from 'payload' + +import path from 'path' +import { fileURLToPath } from 'url' + +import type { NextRESTClient } from '../helpers/NextRESTClient.js' + +import { devUser } from '../credentials.js' +import { initPayloadInt } from '../helpers/initPayloadInt.js' +import { postsSlug } from './collections/Posts/index.js' + +let payload: Payload +let token: string +let restClient: NextRESTClient + +const { email, password } = devUser +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +describe('Locked Documents Tests', () => { + // --__--__--__--__--__--__--__--__--__ + // Boilerplate test setup/teardown + // --__--__--__--__--__--__--__--__--__ + beforeAll(async () => { + const initialized = await initPayloadInt(dirname) + ;({ payload, restClient } = initialized) + + const data = await restClient + .POST('/users/login', { + body: JSON.stringify({ + email, + password, + }), + }) + .then((res) => res.json()) + + token = data.token + }) + + afterAll(async () => { + if (typeof payload.db.destroy === 'function') { + await payload.db.destroy() + } + }) + + // --__--__--__--__--__--__--__--__--__ + // You can run tests against the local API or the REST API + // use the tests below as a guide + // --__--__--__--__--__--__--__--__--__ + + it('local API example', async () => { + const newPost = await payload.create({ + collection: postsSlug, + data: { + text: 'LOCAL API EXAMPLE', + }, + }) + + expect(newPost.text).toEqual('LOCAL API EXAMPLE') + }) + + it('rest API example', async () => { + const data = await restClient + .POST(`/${postsSlug}`, { + body: JSON.stringify({ + text: 'REST API EXAMPLE', + }), + headers: { + Authorization: `JWT ${token}`, + }, + }) + .then((res) => res.json()) + + expect(data.doc.text).toEqual('REST API EXAMPLE') + }) +}) diff --git a/test/locked-documents/payload-types.ts b/test/locked-documents/payload-types.ts new file mode 100644 index 00000000000..7d02310add6 --- /dev/null +++ b/test/locked-documents/payload-types.ts @@ -0,0 +1,282 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * This file was automatically generated by Payload. + * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config, + * and re-run `payload generate:types` to regenerate this file. + */ + +export interface Config { + auth: { + users: UserAuthOperations; + }; + collections: { + pages: Page; + posts: Post; + simple: Simple; + users: User; + 'payload-preferences': PayloadPreference; + 'payload-locked-documents': PayloadLockedDocument; + 'payload-migrations': PayloadMigration; + }; + db: { + defaultIDType: string; + }; + globals: { + menu: Menu; + 'custom-ts': CustomT; + }; + locale: null; + user: User & { + collection: 'users'; + }; +} +export interface UserAuthOperations { + forgotPassword: { + email: string; + password: string; + }; + login: { + email: string; + password: string; + }; + registerFirstUser: { + email: string; + password: string; + }; + unlock: { + email: string; + password: string; + }; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "pages". + */ +export interface Page { + id: string; + text?: string | null; + richText?: { + root: { + type: string; + children: { + type: string; + version: number; + [k: string]: unknown; + }[]; + direction: ('ltr' | 'rtl') | null; + format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; + indent: number; + version: number; + }; + [k: string]: unknown; + } | null; + myBlocks?: + | ( + | { + test?: string | null; + id?: string | null; + blockName?: string | null; + blockType: 'test'; + } + | { + test2?: string | null; + id?: string | null; + blockName?: string | null; + blockType: 'someBlock2'; + } + )[] + | null; + updatedAt: string; + createdAt: string; + _status?: ('draft' | 'published') | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "posts". + */ +export interface Post { + id: string; + text?: string | null; + richText?: { + root: { + type: string; + children: { + type: string; + version: number; + [k: string]: unknown; + }[]; + direction: ('ltr' | 'rtl') | null; + format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; + indent: number; + version: number; + }; + [k: string]: unknown; + } | null; + myBlocks?: + | ( + | { + test?: string | null; + id?: string | null; + blockName?: string | null; + blockType: 'test'; + } + | { + test2?: string | null; + id?: string | null; + blockName?: string | null; + blockType: 'someBlock2'; + } + )[] + | null; + updatedAt: string; + createdAt: string; + _status?: ('draft' | 'published') | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "simple". + */ +export interface Simple { + id: string; + text?: string | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users". + */ +export interface User { + id: string; + name?: string | null; + updatedAt: string; + createdAt: string; + email: string; + resetPasswordToken?: string | null; + resetPasswordExpiration?: string | null; + salt?: string | null; + hash?: string | null; + loginAttempts?: number | null; + lockUntil?: string | null; + password?: string | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-preferences". + */ +export interface PayloadPreference { + id: string; + user: { + relationTo: 'users'; + value: string | User; + }; + key?: string | null; + value?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-locked-documents". + */ +export interface PayloadLockedDocument { + id: string; + document?: + | ({ + relationTo: 'pages'; + value: string | Page; + } | null) + | ({ + relationTo: 'posts'; + value: string | Post; + } | null) + | ({ + relationTo: 'simple'; + value: string | Simple; + } | null) + | ({ + relationTo: 'users'; + value: string | User; + } | null) + | ({ + relationTo: 'payload-preferences'; + value: string | PayloadPreference; + } | null); + globalSlug?: string | null; + _lastEdited: { + user: { + relationTo: 'users'; + value: string | User; + }; + editedAt?: string | null; + }; + isLocked?: boolean | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-migrations". + */ +export interface PayloadMigration { + id: string; + name?: string | null; + batch?: number | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "menu". + */ +export interface Menu { + id: string; + globalText?: string | null; + updatedAt?: string | null; + createdAt?: string | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "custom-ts". + */ +export interface CustomT { + id: string; + custom?: 'hello' | 'world'; + withDefinitionsUsage?: ObjectWithNumber[]; + json: { + id: string; + name: string; + age?: number; + }[]; + updatedAt?: string | null; + createdAt?: string | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "objectWithNumber". + */ +export interface ObjectWithNumber { + id?: number; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "auth". + */ +export interface Auth { + [k: string]: unknown; +} + + +declare module 'payload' { + // @ts-ignore + export interface GeneratedTypes extends Config {} +} \ No newline at end of file diff --git a/test/locked-documents/schema.graphql b/test/locked-documents/schema.graphql new file mode 100644 index 00000000000..1038d843d62 --- /dev/null +++ b/test/locked-documents/schema.graphql @@ -0,0 +1,1902 @@ +type Query { + Post(id: String!, draft: Boolean): Post + Posts(draft: Boolean, where: Post_where, limit: Int, page: Int, sort: String): Posts + countPosts(draft: Boolean, where: Post_where): countPosts + docAccessPost(id: String!): postsDocAccess + versionPost(id: String): PostVersion + versionsPosts(where: versionsPost_where, limit: Int, page: Int, sort: String): versionsPosts + User(id: String!, draft: Boolean): User + Users(draft: Boolean, where: User_where, limit: Int, page: Int, sort: String): Users + countUsers(draft: Boolean, where: User_where): countUsers + docAccessUser(id: String!): usersDocAccess + meUser: usersMe + initializedUser: Boolean + PayloadPreference(id: String!, draft: Boolean): PayloadPreference + PayloadPreferences( + draft: Boolean + where: PayloadPreference_where + limit: Int + page: Int + sort: String + ): PayloadPreferences + countPayloadPreferences(draft: Boolean, where: PayloadPreference_where): countPayloadPreferences + docAccessPayloadPreference(id: String!): payload_preferencesDocAccess + Menu(draft: Boolean): Menu + docAccessMenu: menuDocAccess + Access: Access +} + +type Post { + id: String + text: String + richText(depth: Int): JSON + richText2(depth: Int): JSON + updatedAt: DateTime + createdAt: DateTime + _status: Post__status +} + +""" +The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSON + @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf") + +""" +A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. +""" +scalar DateTime + +enum Post__status { + draft + published +} + +type Posts { + docs: [Post] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input Post_where { + text: Post_text_operator + richText: Post_richText_operator + richText2: Post_richText2_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + _status: Post__status_operator + id: Post_id_operator + AND: [Post_where_and] + OR: [Post_where_or] +} + +input Post_text_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_richText_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + exists: Boolean +} + +input Post_richText2_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + exists: Boolean +} + +input Post_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Post_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input Post__status_operator { + equals: Post__status_Input + not_equals: Post__status_Input + in: [Post__status_Input] + not_in: [Post__status_Input] + all: [Post__status_Input] + exists: Boolean +} + +enum Post__status_Input { + draft + published +} + +input Post_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input Post_where_and { + text: Post_text_operator + richText: Post_richText_operator + richText2: Post_richText2_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + _status: Post__status_operator + id: Post_id_operator + AND: [Post_where_and] + OR: [Post_where_or] +} + +input Post_where_or { + text: Post_text_operator + richText: Post_richText_operator + richText2: Post_richText2_operator + updatedAt: Post_updatedAt_operator + createdAt: Post_createdAt_operator + _status: Post__status_operator + id: Post_id_operator + AND: [Post_where_and] + OR: [Post_where_or] +} + +type countPosts { + totalDocs: Int +} + +type postsDocAccess { + fields: PostsDocAccessFields + create: PostsCreateDocAccess + read: PostsReadDocAccess + update: PostsUpdateDocAccess + delete: PostsDeleteDocAccess + readVersions: PostsReadVersionsDocAccess +} + +type PostsDocAccessFields { + text: PostsDocAccessFields_text + richText: PostsDocAccessFields_richText + richText2: PostsDocAccessFields_richText2 + updatedAt: PostsDocAccessFields_updatedAt + createdAt: PostsDocAccessFields_createdAt + _status: PostsDocAccessFields__status +} + +type PostsDocAccessFields_text { + create: PostsDocAccessFields_text_Create + read: PostsDocAccessFields_text_Read + update: PostsDocAccessFields_text_Update + delete: PostsDocAccessFields_text_Delete +} + +type PostsDocAccessFields_text_Create { + permission: Boolean! +} + +type PostsDocAccessFields_text_Read { + permission: Boolean! +} + +type PostsDocAccessFields_text_Update { + permission: Boolean! +} + +type PostsDocAccessFields_text_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_richText { + create: PostsDocAccessFields_richText_Create + read: PostsDocAccessFields_richText_Read + update: PostsDocAccessFields_richText_Update + delete: PostsDocAccessFields_richText_Delete +} + +type PostsDocAccessFields_richText_Create { + permission: Boolean! +} + +type PostsDocAccessFields_richText_Read { + permission: Boolean! +} + +type PostsDocAccessFields_richText_Update { + permission: Boolean! +} + +type PostsDocAccessFields_richText_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_richText2 { + create: PostsDocAccessFields_richText2_Create + read: PostsDocAccessFields_richText2_Read + update: PostsDocAccessFields_richText2_Update + delete: PostsDocAccessFields_richText2_Delete +} + +type PostsDocAccessFields_richText2_Create { + permission: Boolean! +} + +type PostsDocAccessFields_richText2_Read { + permission: Boolean! +} + +type PostsDocAccessFields_richText2_Update { + permission: Boolean! +} + +type PostsDocAccessFields_richText2_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt { + create: PostsDocAccessFields_updatedAt_Create + read: PostsDocAccessFields_updatedAt_Read + update: PostsDocAccessFields_updatedAt_Update + delete: PostsDocAccessFields_updatedAt_Delete +} + +type PostsDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type PostsDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt { + create: PostsDocAccessFields_createdAt_Create + read: PostsDocAccessFields_createdAt_Read + update: PostsDocAccessFields_createdAt_Update + delete: PostsDocAccessFields_createdAt_Delete +} + +type PostsDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type PostsDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type PostsDocAccessFields__status { + create: PostsDocAccessFields__status_Create + read: PostsDocAccessFields__status_Read + update: PostsDocAccessFields__status_Update + delete: PostsDocAccessFields__status_Delete +} + +type PostsDocAccessFields__status_Create { + permission: Boolean! +} + +type PostsDocAccessFields__status_Read { + permission: Boolean! +} + +type PostsDocAccessFields__status_Update { + permission: Boolean! +} + +type PostsDocAccessFields__status_Delete { + permission: Boolean! +} + +type PostsCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +""" +The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSONObject + @specifiedBy(url: "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf") + +type PostsReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostsReadVersionsDocAccess { + permission: Boolean! + where: JSONObject +} + +type PostVersion { + parent(draft: Boolean): Post + version: PostVersion_Version + createdAt: DateTime + updatedAt: DateTime + latest: Boolean + id: String +} + +type PostVersion_Version { + text: String + richText(depth: Int): JSON + richText2(depth: Int): JSON + updatedAt: DateTime + createdAt: DateTime + _status: PostVersion_Version__status +} + +enum PostVersion_Version__status { + draft + published +} + +type versionsPosts { + docs: [PostVersion] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input versionsPost_where { + parent: versionsPost_parent_operator + version__text: versionsPost_version__text_operator + version__richText: versionsPost_version__richText_operator + version__richText2: versionsPost_version__richText2_operator + version__updatedAt: versionsPost_version__updatedAt_operator + version__createdAt: versionsPost_version__createdAt_operator + version___status: versionsPost_version___status_operator + createdAt: versionsPost_createdAt_operator + updatedAt: versionsPost_updatedAt_operator + latest: versionsPost_latest_operator + id: versionsPost_id_operator + AND: [versionsPost_where_and] + OR: [versionsPost_where_or] +} + +input versionsPost_parent_operator { + equals: JSON + not_equals: JSON + in: [JSON] + not_in: [JSON] + all: [JSON] + exists: Boolean +} + +input versionsPost_version__text_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input versionsPost_version__richText_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + exists: Boolean +} + +input versionsPost_version__richText2_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + exists: Boolean +} + +input versionsPost_version__updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input versionsPost_version__createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input versionsPost_version___status_operator { + equals: versionsPost_version___status_Input + not_equals: versionsPost_version___status_Input + in: [versionsPost_version___status_Input] + not_in: [versionsPost_version___status_Input] + all: [versionsPost_version___status_Input] + exists: Boolean +} + +enum versionsPost_version___status_Input { + draft + published +} + +input versionsPost_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input versionsPost_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input versionsPost_latest_operator { + equals: Boolean + not_equals: Boolean + exists: Boolean +} + +input versionsPost_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input versionsPost_where_and { + parent: versionsPost_parent_operator + version__text: versionsPost_version__text_operator + version__richText: versionsPost_version__richText_operator + version__richText2: versionsPost_version__richText2_operator + version__updatedAt: versionsPost_version__updatedAt_operator + version__createdAt: versionsPost_version__createdAt_operator + version___status: versionsPost_version___status_operator + createdAt: versionsPost_createdAt_operator + updatedAt: versionsPost_updatedAt_operator + latest: versionsPost_latest_operator + id: versionsPost_id_operator + AND: [versionsPost_where_and] + OR: [versionsPost_where_or] +} + +input versionsPost_where_or { + parent: versionsPost_parent_operator + version__text: versionsPost_version__text_operator + version__richText: versionsPost_version__richText_operator + version__richText2: versionsPost_version__richText2_operator + version__updatedAt: versionsPost_version__updatedAt_operator + version__createdAt: versionsPost_version__createdAt_operator + version___status: versionsPost_version___status_operator + createdAt: versionsPost_createdAt_operator + updatedAt: versionsPost_updatedAt_operator + latest: versionsPost_latest_operator + id: versionsPost_id_operator + AND: [versionsPost_where_and] + OR: [versionsPost_where_or] +} + +type User { + id: String + updatedAt: DateTime + createdAt: DateTime + email: EmailAddress! + resetPasswordToken: String + resetPasswordExpiration: DateTime + salt: String + hash: String + loginAttempts: Float + lockUntil: DateTime + password: String! +} + +""" +A field whose value conforms to the standard internet email address format as specified in HTML Spec: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address. +""" +scalar EmailAddress + @specifiedBy(url: "https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address") + +type Users { + docs: [User] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input User_where { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + AND: [User_where_and] + OR: [User_where_or] +} + +input User_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input User_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input User_email_operator { + equals: EmailAddress + not_equals: EmailAddress + like: EmailAddress + contains: EmailAddress + in: [EmailAddress] + not_in: [EmailAddress] + all: [EmailAddress] +} + +input User_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input User_where_and { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + AND: [User_where_and] + OR: [User_where_or] +} + +input User_where_or { + updatedAt: User_updatedAt_operator + createdAt: User_createdAt_operator + email: User_email_operator + id: User_id_operator + AND: [User_where_and] + OR: [User_where_or] +} + +type countUsers { + totalDocs: Int +} + +type usersDocAccess { + fields: UsersDocAccessFields + create: UsersCreateDocAccess + read: UsersReadDocAccess + update: UsersUpdateDocAccess + delete: UsersDeleteDocAccess + unlock: UsersUnlockDocAccess +} + +type UsersDocAccessFields { + updatedAt: UsersDocAccessFields_updatedAt + createdAt: UsersDocAccessFields_createdAt + email: UsersDocAccessFields_email + password: UsersDocAccessFields_password +} + +type UsersDocAccessFields_updatedAt { + create: UsersDocAccessFields_updatedAt_Create + read: UsersDocAccessFields_updatedAt_Read + update: UsersDocAccessFields_updatedAt_Update + delete: UsersDocAccessFields_updatedAt_Delete +} + +type UsersDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type UsersDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt { + create: UsersDocAccessFields_createdAt_Create + read: UsersDocAccessFields_createdAt_Read + update: UsersDocAccessFields_createdAt_Update + delete: UsersDocAccessFields_createdAt_Delete +} + +type UsersDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type UsersDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_email { + create: UsersDocAccessFields_email_Create + read: UsersDocAccessFields_email_Read + update: UsersDocAccessFields_email_Update + delete: UsersDocAccessFields_email_Delete +} + +type UsersDocAccessFields_email_Create { + permission: Boolean! +} + +type UsersDocAccessFields_email_Read { + permission: Boolean! +} + +type UsersDocAccessFields_email_Update { + permission: Boolean! +} + +type UsersDocAccessFields_email_Delete { + permission: Boolean! +} + +type UsersDocAccessFields_password { + create: UsersDocAccessFields_password_Create + read: UsersDocAccessFields_password_Read + update: UsersDocAccessFields_password_Update + delete: UsersDocAccessFields_password_Delete +} + +type UsersDocAccessFields_password_Create { + permission: Boolean! +} + +type UsersDocAccessFields_password_Read { + permission: Boolean! +} + +type UsersDocAccessFields_password_Update { + permission: Boolean! +} + +type UsersDocAccessFields_password_Delete { + permission: Boolean! +} + +type UsersCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUnlockDocAccess { + permission: Boolean! + where: JSONObject +} + +type usersMe { + collection: String + exp: Int + token: String + user: User +} + +type PayloadPreference { + id: String + user: PayloadPreference_User_Relationship! + key: String + value: JSON + updatedAt: DateTime + createdAt: DateTime +} + +type PayloadPreference_User_Relationship { + relationTo: PayloadPreference_User_RelationTo + value: PayloadPreference_User +} + +enum PayloadPreference_User_RelationTo { + users +} + +union PayloadPreference_User = User + +type PayloadPreferences { + docs: [PayloadPreference] + hasNextPage: Boolean + hasPrevPage: Boolean + limit: Int + nextPage: Int + offset: Int + page: Int + pagingCounter: Int + prevPage: Int + totalDocs: Int + totalPages: Int +} + +input PayloadPreference_where { + user: PayloadPreference_user_Relation + key: PayloadPreference_key_operator + value: PayloadPreference_value_operator + updatedAt: PayloadPreference_updatedAt_operator + createdAt: PayloadPreference_createdAt_operator + id: PayloadPreference_id_operator + AND: [PayloadPreference_where_and] + OR: [PayloadPreference_where_or] +} + +input PayloadPreference_user_Relation { + relationTo: PayloadPreference_user_Relation_RelationTo + value: JSON +} + +enum PayloadPreference_user_Relation_RelationTo { + users +} + +input PayloadPreference_key_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input PayloadPreference_value_operator { + equals: JSON + not_equals: JSON + like: JSON + contains: JSON + within: JSON + intersects: JSON + exists: Boolean +} + +input PayloadPreference_updatedAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input PayloadPreference_createdAt_operator { + equals: DateTime + not_equals: DateTime + greater_than_equal: DateTime + greater_than: DateTime + less_than_equal: DateTime + less_than: DateTime + like: DateTime + exists: Boolean +} + +input PayloadPreference_id_operator { + equals: String + not_equals: String + like: String + contains: String + in: [String] + not_in: [String] + all: [String] + exists: Boolean +} + +input PayloadPreference_where_and { + user: PayloadPreference_user_Relation + key: PayloadPreference_key_operator + value: PayloadPreference_value_operator + updatedAt: PayloadPreference_updatedAt_operator + createdAt: PayloadPreference_createdAt_operator + id: PayloadPreference_id_operator + AND: [PayloadPreference_where_and] + OR: [PayloadPreference_where_or] +} + +input PayloadPreference_where_or { + user: PayloadPreference_user_Relation + key: PayloadPreference_key_operator + value: PayloadPreference_value_operator + updatedAt: PayloadPreference_updatedAt_operator + createdAt: PayloadPreference_createdAt_operator + id: PayloadPreference_id_operator + AND: [PayloadPreference_where_and] + OR: [PayloadPreference_where_or] +} + +type countPayloadPreferences { + totalDocs: Int +} + +type payload_preferencesDocAccess { + fields: PayloadPreferencesDocAccessFields + create: PayloadPreferencesCreateDocAccess + read: PayloadPreferencesReadDocAccess + update: PayloadPreferencesUpdateDocAccess + delete: PayloadPreferencesDeleteDocAccess +} + +type PayloadPreferencesDocAccessFields { + user: PayloadPreferencesDocAccessFields_user + key: PayloadPreferencesDocAccessFields_key + value: PayloadPreferencesDocAccessFields_value + updatedAt: PayloadPreferencesDocAccessFields_updatedAt + createdAt: PayloadPreferencesDocAccessFields_createdAt +} + +type PayloadPreferencesDocAccessFields_user { + create: PayloadPreferencesDocAccessFields_user_Create + read: PayloadPreferencesDocAccessFields_user_Read + update: PayloadPreferencesDocAccessFields_user_Update + delete: PayloadPreferencesDocAccessFields_user_Delete +} + +type PayloadPreferencesDocAccessFields_user_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_user_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_user_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_user_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key { + create: PayloadPreferencesDocAccessFields_key_Create + read: PayloadPreferencesDocAccessFields_key_Read + update: PayloadPreferencesDocAccessFields_key_Update + delete: PayloadPreferencesDocAccessFields_key_Delete +} + +type PayloadPreferencesDocAccessFields_key_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_key_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value { + create: PayloadPreferencesDocAccessFields_value_Create + read: PayloadPreferencesDocAccessFields_value_Read + update: PayloadPreferencesDocAccessFields_value_Update + delete: PayloadPreferencesDocAccessFields_value_Delete +} + +type PayloadPreferencesDocAccessFields_value_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_value_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt { + create: PayloadPreferencesDocAccessFields_updatedAt_Create + read: PayloadPreferencesDocAccessFields_updatedAt_Read + update: PayloadPreferencesDocAccessFields_updatedAt_Update + delete: PayloadPreferencesDocAccessFields_updatedAt_Delete +} + +type PayloadPreferencesDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt { + create: PayloadPreferencesDocAccessFields_createdAt_Create + read: PayloadPreferencesDocAccessFields_createdAt_Read + update: PayloadPreferencesDocAccessFields_createdAt_Update + delete: PayloadPreferencesDocAccessFields_createdAt_Delete +} + +type PayloadPreferencesDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type PayloadPreferencesDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesCreateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesDeleteDocAccess { + permission: Boolean! + where: JSONObject +} + +type Menu { + globalText: String + updatedAt: DateTime + createdAt: DateTime +} + +type menuDocAccess { + fields: MenuDocAccessFields + read: MenuReadDocAccess + update: MenuUpdateDocAccess +} + +type MenuDocAccessFields { + globalText: MenuDocAccessFields_globalText + updatedAt: MenuDocAccessFields_updatedAt + createdAt: MenuDocAccessFields_createdAt +} + +type MenuDocAccessFields_globalText { + create: MenuDocAccessFields_globalText_Create + read: MenuDocAccessFields_globalText_Read + update: MenuDocAccessFields_globalText_Update + delete: MenuDocAccessFields_globalText_Delete +} + +type MenuDocAccessFields_globalText_Create { + permission: Boolean! +} + +type MenuDocAccessFields_globalText_Read { + permission: Boolean! +} + +type MenuDocAccessFields_globalText_Update { + permission: Boolean! +} + +type MenuDocAccessFields_globalText_Delete { + permission: Boolean! +} + +type MenuDocAccessFields_updatedAt { + create: MenuDocAccessFields_updatedAt_Create + read: MenuDocAccessFields_updatedAt_Read + update: MenuDocAccessFields_updatedAt_Update + delete: MenuDocAccessFields_updatedAt_Delete +} + +type MenuDocAccessFields_updatedAt_Create { + permission: Boolean! +} + +type MenuDocAccessFields_updatedAt_Read { + permission: Boolean! +} + +type MenuDocAccessFields_updatedAt_Update { + permission: Boolean! +} + +type MenuDocAccessFields_updatedAt_Delete { + permission: Boolean! +} + +type MenuDocAccessFields_createdAt { + create: MenuDocAccessFields_createdAt_Create + read: MenuDocAccessFields_createdAt_Read + update: MenuDocAccessFields_createdAt_Update + delete: MenuDocAccessFields_createdAt_Delete +} + +type MenuDocAccessFields_createdAt_Create { + permission: Boolean! +} + +type MenuDocAccessFields_createdAt_Read { + permission: Boolean! +} + +type MenuDocAccessFields_createdAt_Update { + permission: Boolean! +} + +type MenuDocAccessFields_createdAt_Delete { + permission: Boolean! +} + +type MenuReadDocAccess { + permission: Boolean! + where: JSONObject +} + +type MenuUpdateDocAccess { + permission: Boolean! + where: JSONObject +} + +type Access { + canAccessAdmin: Boolean! + posts: postsAccess + users: usersAccess + payload_preferences: payload_preferencesAccess + menu: menuAccess +} + +type postsAccess { + fields: PostsFields + create: PostsCreateAccess + read: PostsReadAccess + update: PostsUpdateAccess + delete: PostsDeleteAccess + readVersions: PostsReadVersionsAccess +} + +type PostsFields { + text: PostsFields_text + richText: PostsFields_richText + richText2: PostsFields_richText2 + updatedAt: PostsFields_updatedAt + createdAt: PostsFields_createdAt + _status: PostsFields__status +} + +type PostsFields_text { + create: PostsFields_text_Create + read: PostsFields_text_Read + update: PostsFields_text_Update + delete: PostsFields_text_Delete +} + +type PostsFields_text_Create { + permission: Boolean! +} + +type PostsFields_text_Read { + permission: Boolean! +} + +type PostsFields_text_Update { + permission: Boolean! +} + +type PostsFields_text_Delete { + permission: Boolean! +} + +type PostsFields_richText { + create: PostsFields_richText_Create + read: PostsFields_richText_Read + update: PostsFields_richText_Update + delete: PostsFields_richText_Delete +} + +type PostsFields_richText_Create { + permission: Boolean! +} + +type PostsFields_richText_Read { + permission: Boolean! +} + +type PostsFields_richText_Update { + permission: Boolean! +} + +type PostsFields_richText_Delete { + permission: Boolean! +} + +type PostsFields_richText2 { + create: PostsFields_richText2_Create + read: PostsFields_richText2_Read + update: PostsFields_richText2_Update + delete: PostsFields_richText2_Delete +} + +type PostsFields_richText2_Create { + permission: Boolean! +} + +type PostsFields_richText2_Read { + permission: Boolean! +} + +type PostsFields_richText2_Update { + permission: Boolean! +} + +type PostsFields_richText2_Delete { + permission: Boolean! +} + +type PostsFields_updatedAt { + create: PostsFields_updatedAt_Create + read: PostsFields_updatedAt_Read + update: PostsFields_updatedAt_Update + delete: PostsFields_updatedAt_Delete +} + +type PostsFields_updatedAt_Create { + permission: Boolean! +} + +type PostsFields_updatedAt_Read { + permission: Boolean! +} + +type PostsFields_updatedAt_Update { + permission: Boolean! +} + +type PostsFields_updatedAt_Delete { + permission: Boolean! +} + +type PostsFields_createdAt { + create: PostsFields_createdAt_Create + read: PostsFields_createdAt_Read + update: PostsFields_createdAt_Update + delete: PostsFields_createdAt_Delete +} + +type PostsFields_createdAt_Create { + permission: Boolean! +} + +type PostsFields_createdAt_Read { + permission: Boolean! +} + +type PostsFields_createdAt_Update { + permission: Boolean! +} + +type PostsFields_createdAt_Delete { + permission: Boolean! +} + +type PostsFields__status { + create: PostsFields__status_Create + read: PostsFields__status_Read + update: PostsFields__status_Update + delete: PostsFields__status_Delete +} + +type PostsFields__status_Create { + permission: Boolean! +} + +type PostsFields__status_Read { + permission: Boolean! +} + +type PostsFields__status_Update { + permission: Boolean! +} + +type PostsFields__status_Delete { + permission: Boolean! +} + +type PostsCreateAccess { + permission: Boolean! + where: JSONObject +} + +type PostsReadAccess { + permission: Boolean! + where: JSONObject +} + +type PostsUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type PostsDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type PostsReadVersionsAccess { + permission: Boolean! + where: JSONObject +} + +type usersAccess { + fields: UsersFields + create: UsersCreateAccess + read: UsersReadAccess + update: UsersUpdateAccess + delete: UsersDeleteAccess + unlock: UsersUnlockAccess +} + +type UsersFields { + updatedAt: UsersFields_updatedAt + createdAt: UsersFields_createdAt + email: UsersFields_email + password: UsersFields_password +} + +type UsersFields_updatedAt { + create: UsersFields_updatedAt_Create + read: UsersFields_updatedAt_Read + update: UsersFields_updatedAt_Update + delete: UsersFields_updatedAt_Delete +} + +type UsersFields_updatedAt_Create { + permission: Boolean! +} + +type UsersFields_updatedAt_Read { + permission: Boolean! +} + +type UsersFields_updatedAt_Update { + permission: Boolean! +} + +type UsersFields_updatedAt_Delete { + permission: Boolean! +} + +type UsersFields_createdAt { + create: UsersFields_createdAt_Create + read: UsersFields_createdAt_Read + update: UsersFields_createdAt_Update + delete: UsersFields_createdAt_Delete +} + +type UsersFields_createdAt_Create { + permission: Boolean! +} + +type UsersFields_createdAt_Read { + permission: Boolean! +} + +type UsersFields_createdAt_Update { + permission: Boolean! +} + +type UsersFields_createdAt_Delete { + permission: Boolean! +} + +type UsersFields_email { + create: UsersFields_email_Create + read: UsersFields_email_Read + update: UsersFields_email_Update + delete: UsersFields_email_Delete +} + +type UsersFields_email_Create { + permission: Boolean! +} + +type UsersFields_email_Read { + permission: Boolean! +} + +type UsersFields_email_Update { + permission: Boolean! +} + +type UsersFields_email_Delete { + permission: Boolean! +} + +type UsersFields_password { + create: UsersFields_password_Create + read: UsersFields_password_Read + update: UsersFields_password_Update + delete: UsersFields_password_Delete +} + +type UsersFields_password_Create { + permission: Boolean! +} + +type UsersFields_password_Read { + permission: Boolean! +} + +type UsersFields_password_Update { + permission: Boolean! +} + +type UsersFields_password_Delete { + permission: Boolean! +} + +type UsersCreateAccess { + permission: Boolean! + where: JSONObject +} + +type UsersReadAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type UsersDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type UsersUnlockAccess { + permission: Boolean! + where: JSONObject +} + +type payload_preferencesAccess { + fields: PayloadPreferencesFields + create: PayloadPreferencesCreateAccess + read: PayloadPreferencesReadAccess + update: PayloadPreferencesUpdateAccess + delete: PayloadPreferencesDeleteAccess +} + +type PayloadPreferencesFields { + user: PayloadPreferencesFields_user + key: PayloadPreferencesFields_key + value: PayloadPreferencesFields_value + updatedAt: PayloadPreferencesFields_updatedAt + createdAt: PayloadPreferencesFields_createdAt +} + +type PayloadPreferencesFields_user { + create: PayloadPreferencesFields_user_Create + read: PayloadPreferencesFields_user_Read + update: PayloadPreferencesFields_user_Update + delete: PayloadPreferencesFields_user_Delete +} + +type PayloadPreferencesFields_user_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_user_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_user_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_user_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_key { + create: PayloadPreferencesFields_key_Create + read: PayloadPreferencesFields_key_Read + update: PayloadPreferencesFields_key_Update + delete: PayloadPreferencesFields_key_Delete +} + +type PayloadPreferencesFields_key_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_key_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_key_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_key_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_value { + create: PayloadPreferencesFields_value_Create + read: PayloadPreferencesFields_value_Read + update: PayloadPreferencesFields_value_Update + delete: PayloadPreferencesFields_value_Delete +} + +type PayloadPreferencesFields_value_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_value_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_value_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_value_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt { + create: PayloadPreferencesFields_updatedAt_Create + read: PayloadPreferencesFields_updatedAt_Read + update: PayloadPreferencesFields_updatedAt_Update + delete: PayloadPreferencesFields_updatedAt_Delete +} + +type PayloadPreferencesFields_updatedAt_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_updatedAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt { + create: PayloadPreferencesFields_createdAt_Create + read: PayloadPreferencesFields_createdAt_Read + update: PayloadPreferencesFields_createdAt_Update + delete: PayloadPreferencesFields_createdAt_Delete +} + +type PayloadPreferencesFields_createdAt_Create { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt_Read { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt_Update { + permission: Boolean! +} + +type PayloadPreferencesFields_createdAt_Delete { + permission: Boolean! +} + +type PayloadPreferencesCreateAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesReadAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type PayloadPreferencesDeleteAccess { + permission: Boolean! + where: JSONObject +} + +type menuAccess { + fields: MenuFields + read: MenuReadAccess + update: MenuUpdateAccess +} + +type MenuFields { + globalText: MenuFields_globalText + updatedAt: MenuFields_updatedAt + createdAt: MenuFields_createdAt +} + +type MenuFields_globalText { + create: MenuFields_globalText_Create + read: MenuFields_globalText_Read + update: MenuFields_globalText_Update + delete: MenuFields_globalText_Delete +} + +type MenuFields_globalText_Create { + permission: Boolean! +} + +type MenuFields_globalText_Read { + permission: Boolean! +} + +type MenuFields_globalText_Update { + permission: Boolean! +} + +type MenuFields_globalText_Delete { + permission: Boolean! +} + +type MenuFields_updatedAt { + create: MenuFields_updatedAt_Create + read: MenuFields_updatedAt_Read + update: MenuFields_updatedAt_Update + delete: MenuFields_updatedAt_Delete +} + +type MenuFields_updatedAt_Create { + permission: Boolean! +} + +type MenuFields_updatedAt_Read { + permission: Boolean! +} + +type MenuFields_updatedAt_Update { + permission: Boolean! +} + +type MenuFields_updatedAt_Delete { + permission: Boolean! +} + +type MenuFields_createdAt { + create: MenuFields_createdAt_Create + read: MenuFields_createdAt_Read + update: MenuFields_createdAt_Update + delete: MenuFields_createdAt_Delete +} + +type MenuFields_createdAt_Create { + permission: Boolean! +} + +type MenuFields_createdAt_Read { + permission: Boolean! +} + +type MenuFields_createdAt_Update { + permission: Boolean! +} + +type MenuFields_createdAt_Delete { + permission: Boolean! +} + +type MenuReadAccess { + permission: Boolean! + where: JSONObject +} + +type MenuUpdateAccess { + permission: Boolean! + where: JSONObject +} + +type Mutation { + createPost(data: mutationPostInput!, draft: Boolean): Post + updatePost(id: String!, autosave: Boolean, data: mutationPostUpdateInput!, draft: Boolean): Post + deletePost(id: String!): Post + duplicatePost(id: String!): Post + restoreVersionPost(id: String): Post + createUser(data: mutationUserInput!, draft: Boolean): User + updateUser(id: String!, autosave: Boolean, data: mutationUserUpdateInput!, draft: Boolean): User + deleteUser(id: String!): User + refreshTokenUser(token: String): usersRefreshedUser + logoutUser: String + unlockUser(email: String!): Boolean! + loginUser(email: String, password: String): usersLoginResult + forgotPasswordUser(disableEmail: Boolean, email: String!, expiration: Int): Boolean! + resetPasswordUser(password: String, token: String): usersResetPassword + verifyEmailUser(token: String): Boolean + createPayloadPreference(data: mutationPayloadPreferenceInput!, draft: Boolean): PayloadPreference + updatePayloadPreference( + id: String! + autosave: Boolean + data: mutationPayloadPreferenceUpdateInput! + draft: Boolean + ): PayloadPreference + deletePayloadPreference(id: String!): PayloadPreference + duplicatePayloadPreference(id: String!): PayloadPreference + updateMenu(data: mutationMenuInput!, draft: Boolean): Menu +} + +input mutationPostInput { + text: String + richText: JSON + richText2: JSON + updatedAt: String + createdAt: String + _status: Post__status_MutationInput +} + +enum Post__status_MutationInput { + draft + published +} + +input mutationPostUpdateInput { + text: String + richText: JSON + richText2: JSON + updatedAt: String + createdAt: String + _status: PostUpdate__status_MutationInput +} + +enum PostUpdate__status_MutationInput { + draft + published +} + +input mutationUserInput { + updatedAt: String + createdAt: String + email: String! + resetPasswordToken: String + resetPasswordExpiration: String + salt: String + hash: String + loginAttempts: Float + lockUntil: String + password: String! +} + +input mutationUserUpdateInput { + updatedAt: String + createdAt: String + email: String + resetPasswordToken: String + resetPasswordExpiration: String + salt: String + hash: String + loginAttempts: Float + lockUntil: String + password: String +} + +type usersRefreshedUser { + exp: Int + refreshedToken: String + user: usersJWT +} + +type usersJWT { + email: EmailAddress! + collection: String! +} + +type usersLoginResult { + exp: Int + token: String + user: User +} + +type usersResetPassword { + token: String + user: User +} + +input mutationPayloadPreferenceInput { + user: PayloadPreference_UserRelationshipInput + key: String + value: JSON + updatedAt: String + createdAt: String +} + +input PayloadPreference_UserRelationshipInput { + relationTo: PayloadPreference_UserRelationshipInputRelationTo + value: JSON +} + +enum PayloadPreference_UserRelationshipInputRelationTo { + users +} + +input mutationPayloadPreferenceUpdateInput { + user: PayloadPreferenceUpdate_UserRelationshipInput + key: String + value: JSON + updatedAt: String + createdAt: String +} + +input PayloadPreferenceUpdate_UserRelationshipInput { + relationTo: PayloadPreferenceUpdate_UserRelationshipInputRelationTo + value: JSON +} + +enum PayloadPreferenceUpdate_UserRelationshipInputRelationTo { + users +} + +input mutationMenuInput { + globalText: String + updatedAt: String + createdAt: String +} diff --git a/test/locked-documents/tsconfig.eslint.json b/test/locked-documents/tsconfig.eslint.json new file mode 100644 index 00000000000..b34cc7afbb8 --- /dev/null +++ b/test/locked-documents/tsconfig.eslint.json @@ -0,0 +1,13 @@ +{ + // extend your base config to share compilerOptions, etc + //"extends": "./tsconfig.json", + "compilerOptions": { + // ensure that nobody can accidentally use this config for a build + "noEmit": true + }, + "include": [ + // whatever paths you intend to lint + "./**/*.ts", + "./**/*.tsx" + ] +} diff --git a/test/locked-documents/tsconfig.json b/test/locked-documents/tsconfig.json new file mode 100644 index 00000000000..3c43903cfdd --- /dev/null +++ b/test/locked-documents/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../tsconfig.json" +} From 0db687f773f618b8aea270623600797940afd34f Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Fri, 30 Aug 2024 13:50:14 -0400 Subject: [PATCH 118/173] chore: adds optional chaining to lockWhenEditing prop --- packages/next/src/views/Edit/Default/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index eac07576567..ff63e8ad45d 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -102,7 +102,7 @@ export const DefaultEditView: React.FC = () => { const collectionConfig = getEntityConfig({ collectionSlug }) as ClientCollectionConfig const lockWhenEditingProp = - collectionConfig.lockWhenEditing !== undefined ? collectionConfig.lockWhenEditing : true + collectionConfig?.lockWhenEditing !== undefined ? collectionConfig?.lockWhenEditing : true const isLockingEnabled = lockWhenEditingProp === true || typeof lockWhenEditingProp === 'object' From 2a7aab0c61c95e60712b49718c77d96e34965b94 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Fri, 30 Aug 2024 16:59:47 -0400 Subject: [PATCH 119/173] chore: join postgres simple pagination --- packages/drizzle/src/count.ts | 4 +- packages/drizzle/src/deleteOne.ts | 5 +- packages/drizzle/src/find/findMany.ts | 3 +- packages/drizzle/src/find/traverseFields.ts | 85 ++++++----- packages/drizzle/src/findOne.ts | 3 +- .../src/postgres/schema/traverseFields.ts | 132 +++++++++++++----- .../src/queries/buildAndOrConditions.ts | 6 +- packages/drizzle/src/queries/buildOrderBy.ts | 4 + packages/drizzle/src/queries/buildQuery.ts | 6 +- packages/drizzle/src/queries/parseParams.ts | 6 +- packages/drizzle/src/transform/read/index.ts | 5 +- .../src/transform/read/traverseFields.ts | 130 +++++++++-------- packages/drizzle/src/update.ts | 5 +- packages/drizzle/src/updateGlobalVersion.ts | 2 +- packages/drizzle/src/updateVersion.ts | 2 +- packages/drizzle/src/upsertRow/index.ts | 17 ++- packages/drizzle/src/upsertRow/types.ts | 5 +- packages/payload/src/database/types.ts | 3 + test/joins/int.spec.ts | 2 +- 19 files changed, 275 insertions(+), 150 deletions(-) diff --git a/packages/drizzle/src/count.ts b/packages/drizzle/src/count.ts index c2048d261c8..3d015768b21 100644 --- a/packages/drizzle/src/count.ts +++ b/packages/drizzle/src/count.ts @@ -1,4 +1,4 @@ -import type { Count , SanitizedCollectionConfig } from 'payload' +import type { Count, SanitizedCollectionConfig } from 'payload' import toSnakeCase from 'to-snake-case' @@ -16,7 +16,7 @@ export const count: Count = async function count( const db = this.sessions[await req?.transactionID]?.db || this.drizzle - const { joins, where } = await buildQuery({ + const { joins, where } = buildQuery({ adapter: this, fields: collectionConfig.fields, locale, diff --git a/packages/drizzle/src/deleteOne.ts b/packages/drizzle/src/deleteOne.ts index 8a73eabf12b..c43de183585 100644 --- a/packages/drizzle/src/deleteOne.ts +++ b/packages/drizzle/src/deleteOne.ts @@ -12,7 +12,7 @@ import { transform } from './transform/read/index.js' export const deleteOne: DeleteOne = async function deleteOne( this: DrizzleAdapter, - { collection: collectionSlug, req = {} as PayloadRequest, where: whereArg }, + { collection: collectionSlug, joins: joinQuery, req = {} as PayloadRequest, where: whereArg }, ) { const db = this.sessions[await req?.transactionID]?.db || this.drizzle const collection = this.payload.collections[collectionSlug].config @@ -21,7 +21,7 @@ export const deleteOne: DeleteOne = async function deleteOne( let docToDelete: Record - const { joins, selectFields, where } = await buildQuery({ + const { joins, selectFields, where } = buildQuery({ adapter: this, fields: collection.fields, locale: req.locale, @@ -61,6 +61,7 @@ export const deleteOne: DeleteOne = async function deleteOne( config: this.payload.config, data: docToDelete, fields: collection.fields, + joinQuery, }) await this.deleteWhere({ diff --git a/packages/drizzle/src/find/findMany.ts b/packages/drizzle/src/find/findMany.ts index 4ff102718dd..20222f30dd1 100644 --- a/packages/drizzle/src/find/findMany.ts +++ b/packages/drizzle/src/find/findMany.ts @@ -43,7 +43,7 @@ export const findMany = async function find({ limit = undefined } - const { joins, orderBy, selectFields, where } = await buildQuery({ + const { joins, orderBy, selectFields, where } = buildQuery({ adapter, fields, locale, @@ -153,6 +153,7 @@ export const findMany = async function find({ config: adapter.payload.config, data, fields, + joinQuery, }) }) diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index a744be548f3..5b6cec54d1c 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -1,7 +1,6 @@ +import type { DBQueryConfig } from 'drizzle-orm' import type { Field, JoinQuery } from 'payload' -import { type DBQueryConfig, sql } from 'drizzle-orm' -import { APIError } from 'payload' import { fieldAffectsData, tabHasName } from 'payload/shared' import toSnakeCase from 'to-snake-case' @@ -210,40 +209,60 @@ export const traverseFields = ({ case 'join': { // when `joinsQuery` is false, do not join - if (joinQuery !== false) { - const { limit = 10, sort } = joinQuery[`${path}${field.name}`] || {} - const fields = adapter.payload.collections[field.collection].config.fields - const joinTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${ - field.localized && adapter.payload.config.localization ? adapter.localesSuffix : '' - }` - const selectFields = {} - const orderBy = buildOrderBy({ - adapter, - fields, - joins: [], - locale, - selectFields, - sort, - tableName: joinTableName, - }) - const withJoin: DBQueryConfig<'many', true, any, any> = { - columns: { - ...selectFields, - }, - limit, - orderBy: () => [orderBy.order(orderBy.column)], - } + if (joinQuery === false) { + break + } + const { + limit: limitArg = 10, + sort, + where, + } = joinQuery[`${path.replaceAll('_', '.')}${field.name}`] || {} + let limit = limitArg + if (limit !== 0) { + // get an additional document and slice it later to determine if there is a next page + limit += 1 + } + const fields = adapter.payload.collections[field.collection].config.fields + const joinTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${ + field.localized && adapter.payload.config.localization ? adapter.localesSuffix : '' + }` + const selectFields = {} - if (field.localized) { - withJoin.columns._locale = true - // Masquerade the parent_id as id, for population to work appropriately - withJoin.extras = { id: sql`_parent_id`.as('id') } - } else { - withJoin.columns.id = true - } + const orderBy = buildOrderBy({ + adapter, + fields, + joins: [], + locale, + selectFields, + sort, + tableName: joinTableName, + }) + const withJoin: DBQueryConfig<'many', true, any, any> = { + columns: selectFields, + limit, + orderBy: () => [orderBy.order(orderBy.column)], + } - currentArgs.with[toSnakeCase(`${path}${field.name}`)] = withJoin + if (field.localized) { + withJoin.columns._locale = true + withJoin.columns._parentID = true + } else { + withJoin.columns.id = true + } + if (where) { + // TODO: implement the where query + // const { where } = buildQuery({ + // adapter, + // fields, + // locale, + // sort, + // tableName: joinTableName, + // where, + // }) + // withJoin.where = () => (eq) + console.log('`join[][where]` not supported') } + currentArgs.with[`${path.replaceAll('.', '_')}${field.name}`] = withJoin break } diff --git a/packages/drizzle/src/findOne.ts b/packages/drizzle/src/findOne.ts index 4a6c165dcd7..78da901a5c9 100644 --- a/packages/drizzle/src/findOne.ts +++ b/packages/drizzle/src/findOne.ts @@ -8,7 +8,7 @@ import { findMany } from './find/findMany.js' export async function findOne( this: DrizzleAdapter, - { collection, locale, req = {} as PayloadRequest, where }: FindOneArgs, + { collection, joins, locale, req = {} as PayloadRequest, where }: FindOneArgs, ): Promise { const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config @@ -17,6 +17,7 @@ export async function findOne( const { docs } = await findMany({ adapter: this, fields: collectionConfig.fields, + joins, limit: 1, locale, page: 1, diff --git a/packages/drizzle/src/postgres/schema/traverseFields.ts b/packages/drizzle/src/postgres/schema/traverseFields.ts index ddccb32f0eb..60503bb5f7b 100644 --- a/packages/drizzle/src/postgres/schema/traverseFields.ts +++ b/packages/drizzle/src/postgres/schema/traverseFields.ts @@ -105,12 +105,20 @@ export const traverseFields = ({ let hasLocalizedManyNumberField = false let parentIDColType: IDType = 'integer' - if (columns.id instanceof PgUUIDBuilder) parentIDColType = 'uuid' - if (columns.id instanceof PgNumericBuilder) parentIDColType = 'numeric' - if (columns.id instanceof PgVarcharBuilder) parentIDColType = 'varchar' + if (columns.id instanceof PgUUIDBuilder) { + parentIDColType = 'uuid' + } + if (columns.id instanceof PgNumericBuilder) { + parentIDColType = 'numeric' + } + if (columns.id instanceof PgVarcharBuilder) { + parentIDColType = 'varchar' + } fields.forEach((field) => { - if ('name' in field && field.name === 'id') return + if ('name' in field && field.name === 'id') { + return + } let columnName: string let fieldName: string @@ -418,12 +426,14 @@ export const traverseFields = ({ } if (subHasManyTextField) { - if (!hasManyTextField || subHasManyTextField === 'index') + if (!hasManyTextField || subHasManyTextField === 'index') { hasManyTextField = subHasManyTextField + } } if (subHasManyNumberField) { - if (!hasManyNumberField || subHasManyNumberField === 'index') + if (!hasManyNumberField || subHasManyNumberField === 'index') { hasManyNumberField = subHasManyNumberField + } } relationsToBuild.set(fieldName, { @@ -550,13 +560,15 @@ export const traverseFields = ({ } if (subHasManyTextField) { - if (!hasManyTextField || subHasManyTextField === 'index') + if (!hasManyTextField || subHasManyTextField === 'index') { hasManyTextField = subHasManyTextField + } } if (subHasManyNumberField) { - if (!hasManyNumberField || subHasManyNumberField === 'index') + if (!hasManyNumberField || subHasManyNumberField === 'index') { hasManyNumberField = subHasManyNumberField + } } adapter.relations[`relations_${blockTableName}`] = relations( @@ -650,12 +662,24 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (groupHasLocalizedField) hasLocalizedField = true - if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (groupHasManyTextField) hasManyTextField = true - if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (groupHasManyNumberField) hasManyNumberField = true - if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (groupHasLocalizedField) { + hasLocalizedField = true + } + if (groupHasLocalizedRelationshipField) { + hasLocalizedRelationshipField = true + } + if (groupHasManyTextField) { + hasManyTextField = true + } + if (groupHasLocalizedManyTextField) { + hasLocalizedManyTextField = true + } + if (groupHasManyNumberField) { + hasManyNumberField = true + } + if (groupHasLocalizedManyNumberField) { + hasLocalizedManyNumberField = true + } break } @@ -691,12 +715,24 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (groupHasLocalizedField) hasLocalizedField = true - if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (groupHasManyTextField) hasManyTextField = true - if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (groupHasManyNumberField) hasManyNumberField = true - if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (groupHasLocalizedField) { + hasLocalizedField = true + } + if (groupHasLocalizedRelationshipField) { + hasLocalizedRelationshipField = true + } + if (groupHasManyTextField) { + hasManyTextField = true + } + if (groupHasLocalizedManyTextField) { + hasLocalizedManyTextField = true + } + if (groupHasManyNumberField) { + hasManyNumberField = true + } + if (groupHasLocalizedManyNumberField) { + hasLocalizedManyNumberField = true + } break } @@ -733,12 +769,24 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (tabHasLocalizedField) hasLocalizedField = true - if (tabHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (tabHasManyTextField) hasManyTextField = true - if (tabHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (tabHasManyNumberField) hasManyNumberField = true - if (tabHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (tabHasLocalizedField) { + hasLocalizedField = true + } + if (tabHasLocalizedRelationshipField) { + hasLocalizedRelationshipField = true + } + if (tabHasManyTextField) { + hasManyTextField = true + } + if (tabHasLocalizedManyTextField) { + hasLocalizedManyTextField = true + } + if (tabHasManyNumberField) { + hasManyNumberField = true + } + if (tabHasLocalizedManyNumberField) { + hasLocalizedManyNumberField = true + } break } @@ -775,12 +823,24 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (rowHasLocalizedField) hasLocalizedField = true - if (rowHasLocalizedRelationshipField) hasLocalizedRelationshipField = true - if (rowHasManyTextField) hasManyTextField = true - if (rowHasLocalizedManyTextField) hasLocalizedManyTextField = true - if (rowHasManyNumberField) hasManyNumberField = true - if (rowHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + if (rowHasLocalizedField) { + hasLocalizedField = true + } + if (rowHasLocalizedRelationshipField) { + hasLocalizedRelationshipField = true + } + if (rowHasManyTextField) { + hasManyTextField = true + } + if (rowHasLocalizedManyTextField) { + hasLocalizedManyTextField = true + } + if (rowHasManyNumberField) { + hasManyNumberField = true + } + if (rowHasLocalizedManyNumberField) { + hasLocalizedManyNumberField = true + } break } @@ -801,8 +861,12 @@ export const traverseFields = ({ const relatedCollectionCustomID = relationshipConfig.fields.find( (field) => fieldAffectsData(field) && field.name === 'id', ) - if (relatedCollectionCustomID?.type === 'number') colType = 'numeric' - if (relatedCollectionCustomID?.type === 'text') colType = 'varchar' + 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( diff --git a/packages/drizzle/src/queries/buildAndOrConditions.ts b/packages/drizzle/src/queries/buildAndOrConditions.ts index d156e55a5f2..38ac89e29b7 100644 --- a/packages/drizzle/src/queries/buildAndOrConditions.ts +++ b/packages/drizzle/src/queries/buildAndOrConditions.ts @@ -6,7 +6,7 @@ import type { BuildQueryJoinAliases } from './buildQuery.js' import { parseParams } from './parseParams.js' -export async function buildAndOrConditions({ +export function buildAndOrConditions({ adapter, fields, joins, @@ -24,7 +24,7 @@ export async function buildAndOrConditions({ selectFields: Record tableName: string where: Where[] -}): Promise { +}): SQL[] { const completedConditions = [] // Loop over all AND / OR operations and add them to the AND / OR query param // Operations should come through as an array @@ -32,7 +32,7 @@ export async function buildAndOrConditions({ for (const condition of where) { // If the operation is properly formatted as an object if (typeof condition === 'object') { - const result = await parseParams({ + const result = parseParams({ adapter, fields, joins, diff --git a/packages/drizzle/src/queries/buildOrderBy.ts b/packages/drizzle/src/queries/buildOrderBy.ts index c9913fb85fe..e90c229a0df 100644 --- a/packages/drizzle/src/queries/buildOrderBy.ts +++ b/packages/drizzle/src/queries/buildOrderBy.ts @@ -16,6 +16,10 @@ type Args = { sort?: string tableName: string } + +/** + * Gets the order by column and direction constructed from the sort argument adds the column to the select fields and joins if necessary + */ export const buildOrderBy = ({ adapter, fields, diff --git a/packages/drizzle/src/queries/buildQuery.ts b/packages/drizzle/src/queries/buildQuery.ts index 22cc58162be..ab734f2b410 100644 --- a/packages/drizzle/src/queries/buildQuery.ts +++ b/packages/drizzle/src/queries/buildQuery.ts @@ -30,14 +30,14 @@ export type BuildQueryResult = { selectFields: Record where: SQL } -const buildQuery = async function buildQuery({ +const buildQuery = function buildQuery({ adapter, fields, locale, sort, tableName, where: incomingWhere, -}: BuildQueryArgs): Promise { +}: BuildQueryArgs): BuildQueryResult { const selectFields: Record = { id: adapter.tables[tableName].id, } @@ -56,7 +56,7 @@ const buildQuery = async function buildQuery({ let where: SQL if (incomingWhere && Object.keys(incomingWhere).length > 0) { - where = await parseParams({ + where = parseParams({ adapter, fields, joins, diff --git a/packages/drizzle/src/queries/parseParams.ts b/packages/drizzle/src/queries/parseParams.ts index 8a0084d595e..c1ae66ab4f5 100644 --- a/packages/drizzle/src/queries/parseParams.ts +++ b/packages/drizzle/src/queries/parseParams.ts @@ -22,7 +22,7 @@ type Args = { where: Where } -export async function parseParams({ +export function parseParams({ adapter, fields, joins, @@ -30,7 +30,7 @@ export async function parseParams({ selectFields, tableName, where, -}: Args): Promise { +}: Args): SQL { let result: SQL const constraints: SQL[] = [] @@ -46,7 +46,7 @@ export async function parseParams({ conditionOperator = or } if (Array.isArray(condition)) { - const builtConditions = await buildAndOrConditions({ + const builtConditions = buildAndOrConditions({ adapter, fields, joins, diff --git a/packages/drizzle/src/transform/read/index.ts b/packages/drizzle/src/transform/read/index.ts index 8e5ad3a144b..b418c3fb7aa 100644 --- a/packages/drizzle/src/transform/read/index.ts +++ b/packages/drizzle/src/transform/read/index.ts @@ -1,4 +1,4 @@ -import type { Field, SanitizedConfig, TypeWithID } from 'payload' +import type { Field, JoinQuery, SanitizedConfig, TypeWithID } from 'payload' import type { DrizzleAdapter } from '../../types.js' @@ -12,6 +12,7 @@ type TransformArgs = { data: Record fallbackLocale?: false | string fields: Field[] + joinQuery?: JoinQuery locale?: string } @@ -22,6 +23,7 @@ export const transform = | TypeWithID>({ config, data, fields, + joinQuery, }: TransformArgs): T => { let relationships: Record[]> = {} let texts: Record[]> = {} @@ -55,6 +57,7 @@ export const transform = | TypeWithID>({ deletions, fieldPrefix: '', fields, + joinQuery, numbers, path: '', relationships, diff --git a/packages/drizzle/src/transform/read/traverseFields.ts b/packages/drizzle/src/transform/read/traverseFields.ts index 0bfa5b9e602..e782439ada3 100644 --- a/packages/drizzle/src/transform/read/traverseFields.ts +++ b/packages/drizzle/src/transform/read/traverseFields.ts @@ -1,4 +1,4 @@ -import type { Field, PaginatedDocs, SanitizedConfig, TabAsField } from 'payload' +import type { Field, JoinQuery, SanitizedConfig, TabAsField } from 'payload' import { fieldAffectsData } from 'payload/shared' @@ -38,6 +38,10 @@ type TraverseFieldsArgs = { * An array of Payload fields to traverse */ fields: (Field | TabAsField)[] + /** + * + */ + joinQuery?: JoinQuery /** * All hasMany number fields, as returned by Drizzle, keyed on an object by field path */ @@ -74,6 +78,7 @@ export const traverseFields = >({ deletions, fieldPrefix, fields, + joinQuery, numbers, path, relationships, @@ -93,6 +98,7 @@ export const traverseFields = >({ deletions, fieldPrefix, fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), + joinQuery, numbers, path, relationships, @@ -115,6 +121,7 @@ export const traverseFields = >({ deletions, fieldPrefix, fields: field.fields, + joinQuery, numbers, path, relationships, @@ -142,7 +149,9 @@ export const traverseFields = >({ if (field.localized) { result[field.name] = fieldData.reduce((arrayResult, row) => { if (typeof row._locale === 'string') { - if (!arrayResult[row._locale]) arrayResult[row._locale] = [] + if (!arrayResult[row._locale]) { + arrayResult[row._locale] = [] + } const locale = row._locale const data = {} delete row._locale @@ -235,7 +244,9 @@ export const traverseFields = >({ delete row._uuid } if (typeof row._locale === 'string') { - if (!result[field.name][row._locale]) result[field.name][row._locale] = [] + if (!result[field.name][row._locale]) { + result[field.name][row._locale] = [] + } result[field.name][row._locale].push(row) delete row._locale } @@ -355,7 +366,9 @@ export const traverseFields = >({ relationPathMatch.forEach((row) => { if (typeof row.locale === 'string') { - if (!relationsByLocale[row.locale]) relationsByLocale[row.locale] = [] + if (!relationsByLocale[row.locale]) { + relationsByLocale[row.locale] = [] + } relationsByLocale[row.locale].push(row) } }) @@ -380,9 +393,49 @@ export const traverseFields = >({ } } + if (field.type === 'join') { + const { limit = 10 } = joinQuery?.[`${fieldPrefix.replaceAll('_', '.')}${field.name}`] || {} + + let fieldResult: + | { docs: unknown[]; hasNextPage: boolean } + | Record + if (Array.isArray(fieldData)) { + if (field.localized) { + fieldResult = fieldData.reduce((joinResult, row) => { + if (typeof row._locale === 'string') { + if (!joinResult[row._locale]) { + joinResult[row._locale] = { + docs: [], + hasNextPage: false, + } + } + joinResult[row._locale].docs.push(row._parentID) + } + + return joinResult + }, {}) + Object.keys(fieldResult).forEach((locale) => { + fieldResult[locale].hasNextPage = fieldResult[locale].docs.length > limit + fieldResult[locale].docs = fieldResult[locale].docs.slice(0, limit) + }) + } else { + const hasNextPage = limit !== 0 && fieldData.length > limit + fieldResult = { + docs: hasNextPage ? fieldData.slice(0, limit) : fieldData, + hasNextPage, + } + } + } + + result[field.name] = fieldResult + return result + } + if (field.type === 'text' && field?.hasMany) { const textPathMatch = texts[`${sanitizedPath}${field.name}`] - if (!textPathMatch) return result + if (!textPathMatch) { + return result + } if (field.localized) { result[field.name] = {} @@ -390,7 +443,9 @@ export const traverseFields = >({ textPathMatch.forEach((row) => { if (typeof row.locale === 'string') { - if (!textsByLocale[row.locale]) textsByLocale[row.locale] = [] + if (!textsByLocale[row.locale]) { + textsByLocale[row.locale] = [] + } textsByLocale[row.locale].push(row) } }) @@ -415,56 +470,11 @@ export const traverseFields = >({ return result } - if (field.type === 'join') { - let fieldResult: PaginatedDocs | Record - if (Array.isArray(fieldData)) { - if (field.localized) { - fieldResult = fieldData.reduce((joinResult, row) => { - if (typeof row._locale === 'string') { - if (!joinResult[row._locale]) { - // TODO: handle pagination - joinResult[row._locale] = { - docs: [], - hasNextPage: false, - hasPrevPage: false, - limit: 0, - nextPage: 0, - page: 1, - pagingCounter: 0, - prevPage: 0, - totalDocs: 0, - totalPages: 0, - } - } - joinResult[row._locale].docs.push(row.id) - } - - return joinResult - }, {}) - } else { - // TODO: handle pagination - fieldResult = { - docs: fieldData, - hasNextPage: false, - hasPrevPage: false, - limit: 0, - nextPage: 0, - page: 1, - pagingCounter: 0, - prevPage: 0, - totalDocs: 0, - totalPages: 0, - } - } - } - - result[field.name] = fieldResult - return result - } - if (field.type === 'number' && field.hasMany) { const numberPathMatch = numbers[`${sanitizedPath}${field.name}`] - if (!numberPathMatch) return result + if (!numberPathMatch) { + return result + } if (field.localized) { result[field.name] = {} @@ -472,7 +482,9 @@ export const traverseFields = >({ numberPathMatch.forEach((row) => { if (typeof row.locale === 'string') { - if (!numbersByLocale[row.locale]) numbersByLocale[row.locale] = [] + if (!numbersByLocale[row.locale]) { + numbersByLocale[row.locale] = [] + } numbersByLocale[row.locale].push(row) } }) @@ -502,7 +514,9 @@ export const traverseFields = >({ if (field.localized) { result[field.name] = fieldData.reduce((selectResult, row) => { if (typeof row.locale === 'string') { - if (!selectResult[row.locale]) selectResult[row.locale] = [] + if (!selectResult[row.locale]) { + selectResult[row.locale] = [] + } selectResult[row.locale].push(row.value) } @@ -541,7 +555,9 @@ export const traverseFields = >({ const locale = table._locale as string const refKey = field.localized && locale ? locale : field.name - if (field.localized && locale) delete table._locale + if (field.localized && locale) { + delete table._locale + } ref[refKey] = traverseFields>({ adapter, blocks, diff --git a/packages/drizzle/src/update.ts b/packages/drizzle/src/update.ts index 1e9e506c85a..0526b78b57a 100644 --- a/packages/drizzle/src/update.ts +++ b/packages/drizzle/src/update.ts @@ -10,7 +10,7 @@ import { upsertRow } from './upsertRow/index.js' export const updateOne: UpdateOne = async function updateOne( this: DrizzleAdapter, - { id, collection: collectionSlug, data, draft, locale, req, where: whereArg }, + { id, collection: collectionSlug, data, draft, joins: joinQuery, locale, req, where: whereArg }, ) { const db = this.sessions[await req?.transactionID]?.db || this.drizzle const collection = this.payload.collections[collectionSlug].config @@ -18,7 +18,7 @@ export const updateOne: UpdateOne = async function updateOne( const whereToUse = whereArg || { id: { equals: id } } let idToUpdate = id - const { joins, selectFields, where } = await buildQuery({ + const { joins, selectFields, where } = buildQuery({ adapter: this, fields: collection.fields, locale, @@ -46,6 +46,7 @@ export const updateOne: UpdateOne = async function updateOne( data, db, fields: collection.fields, + joinQuery, operation: 'update', req, tableName, diff --git a/packages/drizzle/src/updateGlobalVersion.ts b/packages/drizzle/src/updateGlobalVersion.ts index ff6352f211b..19aacd9cd70 100644 --- a/packages/drizzle/src/updateGlobalVersion.ts +++ b/packages/drizzle/src/updateGlobalVersion.ts @@ -37,7 +37,7 @@ export async function updateGlobalVersion( const fields = buildVersionGlobalFields(globalConfig) - const { where } = await buildQuery({ + const { where } = buildQuery({ adapter: this, fields, locale, diff --git a/packages/drizzle/src/updateVersion.ts b/packages/drizzle/src/updateVersion.ts index 5f922ec0a4a..d40476bf01d 100644 --- a/packages/drizzle/src/updateVersion.ts +++ b/packages/drizzle/src/updateVersion.ts @@ -34,7 +34,7 @@ export async function updateVersion( const fields = buildVersionCollectionFields(collectionConfig) - const { where } = await buildQuery({ + const { where } = buildQuery({ adapter: this, fields, locale, diff --git a/packages/drizzle/src/upsertRow/index.ts b/packages/drizzle/src/upsertRow/index.ts index acc8f233106..c06147ad4a2 100644 --- a/packages/drizzle/src/upsertRow/index.ts +++ b/packages/drizzle/src/upsertRow/index.ts @@ -20,6 +20,7 @@ export const upsertRow = async | TypeWithID>( db, fields, ignoreResult, + joinQuery, operation, path = '', req, @@ -116,7 +117,9 @@ export const upsertRow = async | TypeWithID>( if (typeof row.parent === 'undefined') { row.parent = insertedRow.id } - if (!selectsToInsert[selectTableName]) selectsToInsert[selectTableName] = [] + if (!selectsToInsert[selectTableName]) { + selectsToInsert[selectTableName] = [] + } selectsToInsert[selectTableName].push(row) }) }) @@ -127,7 +130,9 @@ export const upsertRow = async | TypeWithID>( Object.keys(rowToInsert.blocks).forEach((blockName) => { rowToInsert.blocks[blockName].forEach((blockRow) => { blockRow.row._parentID = insertedRow.id - if (!blocksToInsert[blockName]) blocksToInsert[blockName] = [] + if (!blocksToInsert[blockName]) { + blocksToInsert[blockName] = [] + } if (blockRow.row.uuid) { delete blockRow.row.uuid } @@ -360,8 +365,9 @@ export const upsertRow = async | TypeWithID>( if (error.constraint.includes(replacement)) { const replacedConstraint = error.constraint.replace(replacement, '') - if (replacedConstraint && adapter.fieldConstraints[tableName]?.[replacedConstraint]) + if (replacedConstraint && adapter.fieldConstraints[tableName]?.[replacedConstraint]) { fieldName = adapter.fieldConstraints[tableName][replacedConstraint] + } } } } @@ -396,7 +402,9 @@ export const upsertRow = async | TypeWithID>( } } - if (ignoreResult) return data as T + if (ignoreResult) { + return data as T + } // ////////////////////////////////// // RETRIEVE NEWLY UPDATED ROW @@ -422,6 +430,7 @@ export const upsertRow = async | TypeWithID>( config: adapter.payload.config, data: doc, fields, + joinQuery, }) return result diff --git a/packages/drizzle/src/upsertRow/types.ts b/packages/drizzle/src/upsertRow/types.ts index 972182d0ecf..de29ff04238 100644 --- a/packages/drizzle/src/upsertRow/types.ts +++ b/packages/drizzle/src/upsertRow/types.ts @@ -1,5 +1,5 @@ import type { SQL } from 'drizzle-orm' -import type { Field, PayloadRequest } from 'payload' +import type { Field, JoinQuery, PayloadRequest } from 'payload' import type { DrizzleAdapter, DrizzleTransaction, GenericColumn } from '../types.js' @@ -13,6 +13,7 @@ type BaseArgs = { * @default false */ ignoreResult?: boolean + joinQuery?: JoinQuery path?: string req: PayloadRequest tableName: string @@ -20,6 +21,7 @@ type BaseArgs = { type CreateArgs = { id?: never + joinQuery?: never operation: 'create' upsertTarget?: never where?: never @@ -27,6 +29,7 @@ type CreateArgs = { type UpdateArgs = { id?: number | string + joinQuery?: JoinQuery operation: 'update' upsertTarget?: GenericColumn where?: SQL diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 9ab324b3954..3a40d5237f7 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -374,6 +374,7 @@ export type UpdateOneArgs = { collection: string data: Record draft?: boolean + joins?: JoinQuery locale?: string req: PayloadRequest } & ( @@ -391,6 +392,7 @@ export type UpdateOne = (args: UpdateOneArgs) => Promise export type DeleteOneArgs = { collection: string + joins?: JoinQuery req: PayloadRequest where: Where } @@ -399,6 +401,7 @@ export type DeleteOne = (args: DeleteOneArgs) => Promise export type DeleteManyArgs = { collection: string + joins?: JoinQuery req: PayloadRequest where: Where } diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index c59e93a1aac..d1860551e9d 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -18,7 +18,7 @@ let restClient: NextRESTClient const { email, password } = devUser -describe('Joins Field Tests', () => { +describe('Joins Field', () => { let category: Category // --__--__--__--__--__--__--__--__--__ // Boilerplate test setup/teardown From e1158601434faa3ae8d97f324c5651cd4c9fcb63 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Mon, 2 Sep 2024 00:22:58 -0400 Subject: [PATCH 120/173] feat: simplifies document locking & unlocking handling --- .../src/elements/DocumentLocked/index.tsx | 15 +- .../src/elements/DocumentTakeOver/index.tsx | 7 +- .../next/src/views/Edit/Default/index.tsx | 263 +++++------------- .../lockedDocumentsCollection.ts | 13 - .../ui/src/providers/DocumentInfo/index.tsx | 92 +----- .../ui/src/providers/DocumentInfo/types.ts | 5 +- packages/ui/src/utilities/buildFormState.ts | 37 ++- 7 files changed, 135 insertions(+), 297 deletions(-) diff --git a/packages/next/src/elements/DocumentLocked/index.tsx b/packages/next/src/elements/DocumentLocked/index.tsx index ba0f85d4299..48fbc102ac3 100644 --- a/packages/next/src/elements/DocumentLocked/index.tsx +++ b/packages/next/src/elements/DocumentLocked/index.tsx @@ -11,7 +11,9 @@ const modalSlug = 'document-locked' const baseClass = 'document-locked' const formatDate = (date) => { - if (!date) {return ''} + if (!date) { + return '' + } return new Intl.DateTimeFormat('en-US', { day: 'numeric', hour: 'numeric', @@ -23,7 +25,7 @@ const formatDate = (date) => { } export const DocumentLocked: React.FC<{ - editedAt: Date | null + editedAt?: Date | null handleGoBack: () => void isActive: boolean onReadOnly: () => void @@ -34,8 +36,11 @@ export const DocumentLocked: React.FC<{ const { t } = useTranslation() useEffect(() => { - if (isActive) {openModal(modalSlug)} - else {closeModal(modalSlug)} + if (isActive) { + openModal(modalSlug) + } else { + closeModal(modalSlug) + } }, [isActive, openModal, closeModal]) return ( @@ -47,7 +52,7 @@ export const DocumentLocked: React.FC<{ {user?.email ?? user?.id} {t('general:currentlyEditing')}

- {t('general:editedSince')} {formatDate(editedAt)} + {t('general:editedSince')} {editedAt && formatDate(editedAt)}

diff --git a/packages/next/src/elements/DocumentTakeOver/index.tsx b/packages/next/src/elements/DocumentTakeOver/index.tsx index 3905c52d187..6edcac8c474 100644 --- a/packages/next/src/elements/DocumentTakeOver/index.tsx +++ b/packages/next/src/elements/DocumentTakeOver/index.tsx @@ -17,8 +17,11 @@ export const DocumentTakeOver: React.FC<{ const { t } = useTranslation() useEffect(() => { - if (isActive) {openModal(modalSlug)} - else {closeModal(modalSlug)} + if (isActive) { + openModal(modalSlug) + } else { + closeModal(modalSlug) + } }, [isActive, openModal, closeModal]) return ( diff --git a/packages/next/src/views/Edit/Default/index.tsx b/packages/next/src/views/Edit/Default/index.tsx index ff63e8ad45d..26e7021ae87 100644 --- a/packages/next/src/views/Edit/Default/index.tsx +++ b/packages/next/src/views/Edit/Default/index.tsx @@ -48,6 +48,7 @@ export const DefaultEditView: React.FC = () => { disableActions, disableLeaveWithoutSaving, docPermissions, + documentIsLocked, getDocPreferences, getVersions, globalSlug, @@ -55,32 +56,16 @@ export const DefaultEditView: React.FC = () => { hasSavePermission, initialData: data, initialState, - isDocumentLocked, isEditing, isInitializing, - lastEditedAt, - lockDocument, onSave: onSaveFromContext, setCurrentEditor, + setDocumentIsLocked, unlockDocument, updateDocumentEditor, } = useDocumentInfo() const { refreshCookieAsync, user } = useAuth() - const [showLockedModal, setShowLockedModal] = useState(false) - const [isReadOnlyForIncomingUser, setIsReadOnlyForIncomingUser] = useState(false) - const [showTakeOverModal, setShowTakeOverModal] = useState(false) - - const [shouldLockDocument, setShouldLockDocument] = useState(false) - - const documentLockStateRef = useRef<{ - isLocked: boolean - user: ClientUser - } | null>(null) - - const isDocumentLockedRef = useRef(false) - const [isLockedByAnotherUser, setIsLockedByAnotherUser] = useState(false) - const { config, config: { @@ -106,10 +91,10 @@ export const DefaultEditView: React.FC = () => { const isLockingEnabled = lockWhenEditingProp === true || typeof lockWhenEditingProp === 'object' - const lockDuration = - typeof lockWhenEditingProp === 'object' && 'lockDuration' in lockWhenEditingProp - ? lockWhenEditingProp.lockDuration - : 300 // default to 300 seconds if no lockDuration is provided + // const lockDuration = + // typeof lockWhenEditingProp === 'object' && 'lockDuration' in lockWhenEditingProp + // ? lockWhenEditingProp.lockDuration + // : 300 // default to 300 seconds if no lockDuration is provided const globalConfig = getEntityConfig({ globalSlug }) as ClientGlobalConfig @@ -125,6 +110,19 @@ export const DefaultEditView: React.FC = () => { !(globalConfig?.versions?.drafts && globalConfig?.versions?.drafts?.autosave)) && !disableLeaveWithoutSaving + const [isReadOnlyForIncomingUser, setIsReadOnlyForIncomingUser] = useState(false) + const [showTakeOverModal, setShowTakeOverModal] = useState(false) + + const documentLockStateRef = useRef<{ + hasShownLockedModal: boolean + isLocked: boolean + user: ClientUser + } | null>({ + hasShownLockedModal: false, + isLocked: false, + user: null, + }) + const classes = [baseClass, (id || globalSlug) && `${baseClass}--is-editing`] if (globalSlug) { @@ -149,77 +147,24 @@ export const DefaultEditView: React.FC = () => { return false }) - const lockTimer = useRef(null) - const isManualUnlockRef = useRef(false) - - const resetLockTimer = useCallback(() => { - if (!isLockingEnabled) { - return - } - - if (lockTimer.current) { - clearTimeout(lockTimer.current) - } - - lockTimer.current = setTimeout(() => { - if (id || globalSlug) { - // Check if this user is still the current editor - if (documentLockStateRef.current?.user.id !== user.id) { - return // Stop execution if the user is no longer the owner - } - - try { - void unlockDocument(id, collectionSlug ?? globalSlug) - - // Reset the locked state - isDocumentLockedRef.current = false - documentLockStateRef.current = null - setCurrentEditor(null) - - // Set manual unlock flag to prevent immediate relock - isManualUnlockRef.current = true - } catch (error) { - // eslint-disable-next-line no-console - console.error('Failed to unlock the document', error) - } - } - }, lockDuration * 1000) - }, [ - id, - globalSlug, - collectionSlug, - unlockDocument, - setCurrentEditor, - user.id, - lockDuration, - isLockingEnabled, - ]) - const handleTakeOver = useCallback(() => { if (!isLockingEnabled) { return } - // Invalidate the previous user's timer - if (lockTimer.current) { - clearTimeout(lockTimer.current) - } - try { // Call updateDocumentEditor to update the document's owner to the current user void updateDocumentEditor(id, collectionSlug ?? globalSlug, user) + documentLockStateRef.current.hasShownLockedModal = true + // Update the locked state to reflect the current user as the owner - documentLockStateRef.current = { isLocked: true, user } + documentLockStateRef.current = { + hasShownLockedModal: documentLockStateRef.current?.hasShownLockedModal, + isLocked: true, + user, + } setCurrentEditor(user) - setIsLockedByAnotherUser(false) - - // Reset the lock timer after takeover - resetLockTimer() - - // Close modals if any were open - setShowLockedModal(false) - setShowTakeOverModal(false) } catch (error) { // eslint-disable-next-line no-console console.error('Error during document takeover:', error) @@ -231,8 +176,6 @@ export const DefaultEditView: React.FC = () => { globalSlug, user, setCurrentEditor, - setIsLockedByAnotherUser, - resetLockTimer, isLockingEnabled, ]) @@ -241,29 +184,20 @@ export const DefaultEditView: React.FC = () => { return } - // Invalidate the previous user's timer - if (lockTimer.current) { - clearTimeout(lockTimer.current) - } - try { // Call updateDocumentEditor to update the document's owner to the current user void updateDocumentEditor(id, collectionSlug ?? globalSlug, user) // Update the locked state to reflect the current user as the owner - documentLockStateRef.current = { isLocked: true, user } + documentLockStateRef.current = { + hasShownLockedModal: documentLockStateRef.current?.hasShownLockedModal, + isLocked: true, + user, + } setCurrentEditor(user) - setIsLockedByAnotherUser(false) - - // Reset the lock timer after takeover - resetLockTimer() // Ensure the document is editable for the incoming user setIsReadOnlyForIncomingUser(false) - - // Close modals if any were open - setShowLockedModal(false) - setShowTakeOverModal(false) } catch (error) { // eslint-disable-next-line no-console console.error('Error during document takeover:', error) @@ -275,36 +209,9 @@ export const DefaultEditView: React.FC = () => { globalSlug, user, setCurrentEditor, - setIsLockedByAnotherUser, - resetLockTimer, isLockingEnabled, ]) - useEffect(() => { - if (!isLockingEnabled) { - return - } - - if (documentLockStateRef.current && documentLockStateRef.current.user.id !== user.id) { - setIsLockedByAnotherUser(true) - } else { - setIsLockedByAnotherUser(false) - } - }, [user.id, isLockingEnabled]) - - useEffect(() => { - if (!isLockingEnabled) { - return - } - - if (isDocumentLocked && currentEditor && currentEditor.id !== user.id && !showTakeOverModal) { - // Show the DocumentLocked modal for the incoming user - setShowLockedModal(true) - } else { - setShowLockedModal(false) - } - }, [currentEditor, isDocumentLocked, showTakeOverModal, user.id, isLockingEnabled]) - const handleGoBack = useCallback(() => { const redirectRoute = formatAdminURL({ adminRoute, @@ -314,17 +221,12 @@ export const DefaultEditView: React.FC = () => { }, [adminRoute, collectionSlug, router]) const handleBackToDashboard = useCallback(() => { + setShowTakeOverModal(false) const redirectRoute = formatAdminURL({ adminRoute, path: '/', }) - // Clear the lock timer if they are still running - if (lockTimer.current) { - clearTimeout(lockTimer.current) - lockTimer.current = null - } - router.push(redirectRoute) }, [adminRoute, router]) @@ -354,6 +256,7 @@ export const DefaultEditView: React.FC = () => { // Unlock the document after save if ((id || globalSlug) && isLockingEnabled) { void unlockDocument(id, collectionSlug ?? globalSlug) + setDocumentIsLocked(false) } if (!isEditing && depth < 2) { @@ -386,17 +289,12 @@ export const DefaultEditView: React.FC = () => { unlockDocument, globalSlug, isLockingEnabled, + setDocumentIsLocked, ], ) const onChange: FormProps['onChange'][0] = useCallback( async ({ formState: prevFormState }) => { - // If the document was manually unlocked, skip further processing - if (isManualUnlockRef.current) { - isManualUnlockRef.current = false - return prevFormState // Return the previous form state unchanged - } - const docPreferences = await getDocPreferences() const { lockedState, state } = await getFormState({ @@ -414,6 +312,8 @@ export const DefaultEditView: React.FC = () => { serverURL, }) + setDocumentIsLocked(true) + if (isLockingEnabled) { const previousOwnerId = documentLockStateRef.current?.user?.id @@ -421,27 +321,17 @@ export const DefaultEditView: React.FC = () => { if (!documentLockStateRef.current || lockedState.user.id !== previousOwnerId) { if (previousOwnerId === user.id && lockedState.user.id !== user.id) { setShowTakeOverModal(true) + documentLockStateRef.current.hasShownLockedModal = true } - documentLockStateRef.current = lockedState - setCurrentEditor(lockedState.user) - - if (lockedState.user.id !== user.id) { - setIsLockedByAnotherUser(true) - } else { - setIsLockedByAnotherUser(false) + documentLockStateRef.current = documentLockStateRef.current = { + hasShownLockedModal: documentLockStateRef.current?.hasShownLockedModal || false, + isLocked: true, + user: lockedState.user, } + setCurrentEditor(lockedState.user) } } - - if ((id || globalSlug) && !isLockedByAnotherUser) { - resetLockTimer() // Reset the timer on every change - } - - // Lock the document if it's not locked and this user is the current editor - if ((id || globalSlug) && !isLockedByAnotherUser && !isDocumentLockedRef.current) { - setShouldLockDocument(true) - } } return state @@ -455,37 +345,14 @@ export const DefaultEditView: React.FC = () => { id, operation, serverURL, - isLockedByAnotherUser, user, - resetLockTimer, documentLockStateRef, setCurrentEditor, isLockingEnabled, + setDocumentIsLocked, ], ) - useEffect(() => { - if (!isLockingEnabled) { - return - } - - if ((id || globalSlug) && shouldLockDocument && !isDocumentLockedRef.current) { - const lockDoc = async () => { - try { - await lockDocument(id, collectionSlug ?? globalSlug, user) - isDocumentLockedRef.current = true - } catch (error) { - // eslint-disable-next-line no-console - console.error('Failed to lock the document', error) - } finally { - setShouldLockDocument(false) - } - } - - void lockDoc() - } - }, [shouldLockDocument, lockDocument, id, user, globalSlug, collectionSlug, isLockingEnabled]) - // Clean up when the component unmounts or when the document is unlocked useEffect(() => { return () => { @@ -493,27 +360,36 @@ export const DefaultEditView: React.FC = () => { return } - if ((id || globalSlug) && isDocumentLockedRef.current) { + if ((id || globalSlug) && documentIsLocked) { // Check if this user is still the current editor if (documentLockStateRef.current?.user?.id === user.id) { void unlockDocument(id, collectionSlug ?? globalSlug) - - // Reset the locked state - isDocumentLockedRef.current = false - documentLockStateRef.current = null + setDocumentIsLocked(false) setCurrentEditor(null) - - // Clear the lock timer - if (lockTimer.current) { - clearTimeout(lockTimer.current) - lockTimer.current = null - } } } setShowTakeOverModal(false) } - }, [collectionSlug, globalSlug, id, unlockDocument, user.id, setCurrentEditor, isLockingEnabled]) + }, [ + collectionSlug, + globalSlug, + id, + unlockDocument, + user.id, + setCurrentEditor, + isLockingEnabled, + documentIsLocked, + setDocumentIsLocked, + ]) + + const shouldShowDocumentLockedModal = + documentIsLocked && + currentEditor && + currentEditor.id !== user.id && + !isReadOnlyForIncomingUser && + !showTakeOverModal && + !documentLockStateRef.current?.hasShownLockedModal return (
@@ -530,11 +406,11 @@ export const DefaultEditView: React.FC = () => { onSuccess={onSave} > {BeforeDocument} - {isLockingEnabled && showLockedModal && ( + {isLockingEnabled && shouldShowDocumentLockedModal && !isReadOnlyForIncomingUser && ( { setIsReadOnlyForIncomingUser(true) setShowTakeOverModal(false) @@ -547,7 +423,10 @@ export const DefaultEditView: React.FC = () => { setIsReadOnlyForIncomingUser(true)} + onReadOnly={() => { + setIsReadOnlyForIncomingUser(true) + setShowTakeOverModal(false) + }} /> )} {!isReadOnlyForIncomingUser && preventLeaveWithoutSaving && } diff --git a/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts b/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts index 2509baf64f0..d25d580c98a 100644 --- a/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts +++ b/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts @@ -25,19 +25,6 @@ export const getLockedDocumentsCollection = (config: Config): CollectionConfig = { name: 'user', type: 'relationship', - hooks: { - beforeValidate: [ - ({ req }) => { - if (!req?.user) { - return null - } - return { - relationTo: req?.user.collection, - value: req?.user.id, - } - }, - ], - }, relationTo: config.collections .filter((collectionConfig) => collectionConfig.auth) .map((collectionConfig) => collectionConfig.slug), diff --git a/packages/ui/src/providers/DocumentInfo/index.tsx b/packages/ui/src/providers/DocumentInfo/index.tsx index 71c3bf97fb3..4487e460348 100644 --- a/packages/ui/src/providers/DocumentInfo/index.tsx +++ b/packages/ui/src/providers/DocumentInfo/index.tsx @@ -100,10 +100,8 @@ const DocumentInfo: React.FC< hasPublishPermissionFromProps, ) - const [isDocumentLocked, setIsDocumentLocked] = useState(false) + const [documentIsLocked, setDocumentIsLocked] = useState(false) const [currentEditor, setCurrentEditor] = useState(null) - const [lastEditedAt, setLastEditedAt] = useState(null) - const lockInProgress = useRef(false) const isInitializing = initialState === undefined || data === undefined const [unpublishedVersions, setUnpublishedVersions] = @@ -141,65 +139,8 @@ const DocumentInfo: React.FC< const operation = isEditing ? 'update' : 'create' const shouldFetchVersions = Boolean(versionsConfig && docPermissions?.readVersions?.permission) - const lockDocument = useCallback( - async (docId: number | string, slug: string, user: ClientUser) => { - if (lockInProgress.current) {return} - lockInProgress.current = true - - try { - // Check if it's a collection or global document - const isGlobal = slug === globalSlug - - const query = isGlobal - ? `where[globalSlug][equals]=${slug}` - : `where[document.value][equals]=${docId}&where[document.relationTo][equals]=${slug}` - - const request = await requests.get(`${serverURL}${api}/payload-locked-documents?${query}`) - - const { docs } = await request.json() - - if (docs.length > 0) { - // Document is already locked, update the state to reflect this - setIsDocumentLocked(true) - return - } - - await requests.post(`${serverURL}${api}/payload-locked-documents`, { - body: JSON.stringify({ - _lastEdited: { - editedAt: new Date(), - user: { relationTo: user?.collection, value: user }, - }, - document: !isGlobal ? { relationTo: slug, value: docId } : undefined, - globalSlug: isGlobal ? slug : undefined, - isLocked: true, - }), - headers: { - 'Content-Type': 'application/json', - }, - }) - - setIsDocumentLocked(true) - } catch (error) { - if (error.response?.status === 409) { - setIsDocumentLocked(true) - } else { - // eslint-disable-next-line no-console - console.error('Failed to lock the document', error) - } - } finally { - lockInProgress.current = false - } - }, - [serverURL, api, globalSlug], - ) - const unlockDocument = useCallback( async (docId: number | string, slug: string) => { - if (!isDocumentLocked) { - return - } - try { const isGlobal = slug === globalSlug @@ -218,22 +159,18 @@ const DocumentInfo: React.FC< 'Content-Type': 'application/json', }, }) - setIsDocumentLocked(false) + setDocumentIsLocked(false) } } catch (error) { // eslint-disable-next-line no-console console.error('Failed to unlock the document', error) } }, - [serverURL, api, isDocumentLocked, globalSlug], + [serverURL, api, globalSlug], ) const updateDocumentEditor = useCallback( async (docId: number | string, slug: string, user: ClientUser) => { - if (!isDocumentLocked) { - return - } - try { const isGlobal = slug === globalSlug @@ -261,20 +198,17 @@ const DocumentInfo: React.FC< 'Content-Type': 'application/json', }, }) - - setLastEditedAt(new Date()) - setIsDocumentLocked(true) } } catch (error) { // eslint-disable-next-line no-console console.error('Failed to update the document editor', error) } }, - [serverURL, api, isDocumentLocked, globalSlug], + [serverURL, api, globalSlug], ) useEffect(() => { - const fetchLockState = async () => { + const fetchDocumentLockState = async () => { if (id || globalSlug) { try { const slug = collectionSlug ?? globalSlug @@ -288,14 +222,13 @@ const DocumentInfo: React.FC< const { docs } = await request.json() if (docs.length > 0) { - const newEditor = docs[0]._lastEdited.user.value - if (newEditor.id !== currentEditor?.id) { + const newEditor = docs[0]._lastEdited?.user?.value + if (newEditor && newEditor.id !== currentEditor?.id) { setCurrentEditor(newEditor) - setLastEditedAt(new Date(docs[0]._lastEdited.editedAt)) - setIsDocumentLocked(true) + setDocumentIsLocked(true) } } else { - setIsDocumentLocked(false) + setDocumentIsLocked(false) } } catch (error) { // eslint-disable-next-line no-console @@ -303,7 +236,7 @@ const DocumentInfo: React.FC< } } } - void fetchLockState() + void fetchDocumentLockState() }, [id, serverURL, api, collectionSlug, globalSlug, currentEditor]) const getVersions = useCallback(async () => { @@ -729,6 +662,7 @@ const DocumentInfo: React.FC< currentEditor, docConfig, docPermissions, + documentIsLocked, getDocPermissions, getDocPreferences, getVersions, @@ -736,16 +670,14 @@ const DocumentInfo: React.FC< hasSavePermission, initialData: data, initialState, - isDocumentLocked, isInitializing, isLoading, - lastEditedAt, - lockDocument, onSave, preferencesKey, publishedDoc, setCurrentEditor, setDocFieldPreferences, + setDocumentIsLocked, setDocumentTitle, title: documentTitle, unlockDocument, diff --git a/packages/ui/src/providers/DocumentInfo/types.ts b/packages/ui/src/providers/DocumentInfo/types.ts index 5ccca7f2648..192b46bfac1 100644 --- a/packages/ui/src/providers/DocumentInfo/types.ts +++ b/packages/ui/src/providers/DocumentInfo/types.ts @@ -41,16 +41,14 @@ export type DocumentInfoProps = { export type DocumentInfoContext = { currentEditor?: ClientUser docConfig?: ClientCollectionConfig | ClientGlobalConfig + documentIsLocked?: boolean getDocPermissions: (data?: Data) => Promise getDocPreferences: () => Promise getVersions: () => Promise initialData: Data initialState?: FormState - isDocumentLocked: boolean isInitializing: boolean isLoading: boolean - lastEditedAt: Date - lockDocument: (docId: number | string, slug: string, user: ClientUser) => Promise preferencesKey?: string publishedDoc?: { _status?: string } & TypeWithID & TypeWithTimestamps setCurrentEditor?: React.Dispatch> @@ -58,6 +56,7 @@ export type DocumentInfoContext = { field: string, fieldPreferences: { [key: string]: unknown } & Partial, ) => void + setDocumentIsLocked?: React.Dispatch> setDocumentTitle: (title: string) => void slug?: string title: string diff --git a/packages/ui/src/utilities/buildFormState.ts b/packages/ui/src/utilities/buildFormState.ts index 85a4306ae21..f28003273b1 100644 --- a/packages/ui/src/utilities/buildFormState.ts +++ b/packages/ui/src/utilities/buildFormState.ts @@ -38,7 +38,10 @@ export const buildFormState = async ({ req, }: { req: PayloadRequest -}): Promise<{ lockedState?: { isLocked: boolean; user: ClientUser }; state: FormState }> => { +}): Promise<{ + lockedState?: { isLocked: boolean; user: ClientUser | number | string } + state: FormState +}> => { const reqData: BuildFormStateArgs = (req.data || {}) as BuildFormStateArgs const { collectionSlug, formState, globalSlug, locale, operation, returnLockStatus, schemaPath } = reqData @@ -219,7 +222,7 @@ export const buildFormState = async ({ } } - if (returnLockStatus) { + if (returnLockStatus && req.user) { let lockStatusQuery // Query based on whether it's a collection or global @@ -238,6 +241,7 @@ export const buildFormState = async ({ const lockStatus = await req.payload.find({ collection: 'payload-locked-documents', depth: 1, + limit: 1, pagination: false, where: lockStatusQuery, }) @@ -248,6 +252,35 @@ export const buildFormState = async ({ user: lockStatus.docs[0]?._lastEdited?.user?.value, } + return { lockedState, state: result } + } else { + // If no lock document exists, create it + await req.payload.create({ + collection: 'payload-locked-documents', + data: { + _lastEdited: { + editedAt: new Date().toISOString(), + user: { + relationTo: [req.user.collection], + value: req.user.id, + }, + }, + document: collectionSlug + ? { + relationTo: collectionSlug, + value: id, + } + : undefined, + globalSlug: globalSlug ? globalSlug : undefined, + isLocked: true, + }, + }) + + const lockedState = { + isLocked: true, + user: req.user, + } + return { lockedState, state: result } } } From 3404dc92f871b96be5dabda1128f8c8186573de2 Mon Sep 17 00:00:00 2001 From: PatrikKozak Date: Tue, 3 Sep 2024 10:24:16 -0400 Subject: [PATCH 121/173] chore: undo lint fixes in db packages --- .../db-sqlite/src/schema/traverseFields.ts | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/db-sqlite/src/schema/traverseFields.ts b/packages/db-sqlite/src/schema/traverseFields.ts index 9dc9195fc72..66ee9d5a83a 100644 --- a/packages/db-sqlite/src/schema/traverseFields.ts +++ b/packages/db-sqlite/src/schema/traverseFields.ts @@ -766,12 +766,24 @@ export const traverseFields = ({ withinLocalizedArrayOrBlock, }) - if (rowHasLocalizedField) {hasLocalizedField = true} - if (rowHasLocalizedRelationshipField) {hasLocalizedRelationshipField = true} - if (rowHasManyTextField) {hasManyTextField = true} - if (rowHasLocalizedManyTextField) {hasLocalizedManyTextField = true} - if (rowHasManyNumberField) {hasManyNumberField = true} - if (rowHasLocalizedManyNumberField) {hasLocalizedManyNumberField = true} + if (rowHasLocalizedField) { + hasLocalizedField = true + } + if (rowHasLocalizedRelationshipField) { + hasLocalizedRelationshipField = true + } + if (rowHasManyTextField) { + hasManyTextField = true + } + if (rowHasLocalizedManyTextField) { + hasLocalizedManyTextField = true + } + if (rowHasManyNumberField) { + hasManyNumberField = true + } + if (rowHasLocalizedManyNumberField) { + hasLocalizedManyNumberField = true + } break } From 99412fe08cd00cb364fa09581b7c20389bd9d4d3 Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury Date: Tue, 3 Sep 2024 11:34:30 -0400 Subject: [PATCH 122/173] feat: build publish single locale functionality --- .git-blame-ignore-revs | 3 + .github/CODEOWNERS | 21 +- .github/actions/setup/action.yml | 4 +- .github/workflows/main.yml | 79 +- .github/workflows/pr-title.yml | 1 + .github/workflows/release-canary.yml | 4 +- .gitignore | 10 + .idea/payload.iml | 1 + .idea/runConfigurations/Run_Dev_Fields.xml | 13 +- .../runConfigurations/Run_Dev__community.xml | 13 +- .idea/runConfigurations/Run_Dev_admin.xml | 13 + ..._template__of_JavaScriptTestRunnerJest.xml | 2 +- .node-version | 2 +- .npmrc | 3 +- .nvmrc | 2 +- .tool-versions | 2 + .vscode/settings.json | 4 +- CHANGELOG.md | 834 +- README.md | 1 + app/(app)/layout.tsx | 14 + app/(app)/test/page.tsx | 11 + .../admin/[[...segments]]/not-found.tsx | 5 +- app/(payload)/admin/[[...segments]]/page.tsx | 5 +- app/(payload)/layout.tsx | 9 +- docs/admin/collections.mdx | 8 +- docs/admin/components.mdx | 238 +- docs/admin/fields.mdx | 235 +- docs/admin/globals.mdx | 3 +- docs/admin/hooks.mdx | 16 +- docs/admin/metadata.mdx | 216 + docs/admin/overview.mdx | 34 +- docs/admin/views.mdx | 103 +- docs/configuration/collections.mdx | 2 +- docs/configuration/globals.mdx | 2 +- docs/configuration/overview.mdx | 21 +- docs/database/migrations.mdx | 29 + docs/database/overview.mdx | 4 +- docs/database/postgres.mdx | 32 +- docs/fields/ui.mdx | 4 +- docs/getting-started/concepts.mdx | 2 +- docs/getting-started/installation.mdx | 2 +- docs/lexical/migration.mdx | 12 +- docs/local-api/outside-nextjs.mdx | 67 +- docs/local-api/overview.mdx | 9 +- docs/migration-guide/overview.mdx | 29 +- docs/plugins/form-builder.mdx | 19 +- docs/plugins/redirects.mdx | 6 + docs/plugins/seo.mdx | 8 +- docs/upload/overview.mdx | 18 + eslint.config.js | 28 +- .../app/_components/Header/index.module.scss | 2 +- .../app/_components/RenderParams/index.tsx | 4 +- examples/auth/next-app/app/_css/app.scss | 8 +- .../next-app/app/_providers/Auth/index.tsx | 8 +- .../app/account/AccountForm/index.module.scss | 2 +- .../app/account/AccountForm/index.tsx | 2 +- .../CreateAccountForm/index.module.scss | 2 +- .../CreateAccountForm/index.tsx | 2 +- .../app/create-account/index.module.scss | 2 +- .../app/login/LoginForm/index.module.scss | 2 +- .../auth/next-app/app/login/index.module.scss | 2 +- .../next-app/app/logout/LogoutPage/index.tsx | 2 +- .../RecoverPasswordForm/index.module.scss | 3 +- .../app/recover-password/index.module.scss | 2 +- .../ResetPasswordForm/index.module.scss | 2 +- examples/auth/next-app/pnpm-lock.yaml | 2097 +- examples/auth/next-pages/pnpm-lock.yaml | 1799 +- .../src/components/Header/index.module.scss | 2 +- .../src/components/RenderParams/index.tsx | 4 +- examples/auth/next-pages/src/css/app.scss | 8 +- .../src/pages/account/index.module.scss | 2 +- .../next-pages/src/pages/account/index.tsx | 2 +- .../pages/create-account/index.module.scss | 2 +- .../src/pages/create-account/index.tsx | 2 +- .../src/pages/login/index.module.scss | 2 +- .../pages/recover-password/index.module.scss | 3 +- .../pages/reset-password/index.module.scss | 2 +- .../next-pages/src/providers/Auth/index.tsx | 8 +- examples/auth/payload/pnpm-lock.yaml | 4636 +++- .../app/(app)/_components/Button/index.tsx | 2 +- .../app/(app)/_components/Gutter/index.tsx | 2 +- .../_components/Header/index.module.scss | 2 +- .../(app)/_components/RenderParams/index.tsx | 4 +- .../account/AccountForm/index.module.scss | 2 +- .../app/(app)/account/AccountForm/index.tsx | 2 +- .../CreateAccountForm/index.module.scss | 2 +- .../CreateAccountForm/index.tsx | 2 +- .../(app)/create-account/index.module.scss | 2 +- .../(app)/login/LoginForm/index.module.scss | 2 +- .../src/app/(app)/login/index.module.scss | 2 +- .../RecoverPasswordForm/index.module.scss | 3 +- .../(app)/recover-password/index.module.scss | 2 +- .../ResetPasswordForm/index.module.scss | 2 +- .../src/collections/access/checkRole.ts | 4 +- examples/custom-server/README.md | 6 +- examples/custom-server/eject.ts | 6 +- examples/custom-server/src/app/app.scss | 13 +- examples/custom-server/src/server.default.ts | 2 +- examples/custom-server/src/server.ts | 2 +- examples/custom-server/tsconfig.server.json | 7 +- .../next-app/app/_api/fetchPage.ts | 2 +- .../next-app/app/_api/fetchPages.ts | 4 +- .../app/_components/AdminBar/index.client.tsx | 2 +- .../next-app/app/_components/Header/index.tsx | 2 +- examples/draft-preview/next-app/app/app.scss | 13 +- .../src/components/AdminBar/index.tsx | 2 +- .../src/components/Header/index.tsx | 2 +- .../next-pages/src/pages/[slug].tsx | 4 +- .../next-pages/src/pages/app.scss | 26 +- .../next-pages/src/pages/index.tsx | 2 +- .../draft-preview/payload/.vscode/launch.json | 4 +- .../payload/src/collections/Pages/index.ts | 2 +- .../draft-preview/payload/src/fields/link.ts | 2 +- .../payload/src/utilities/deepMerge.ts | 2 +- examples/email/src/collections/Newsletter.ts | 2 +- .../src/email/generateForgotPasswordEmail.ts | 3 +- examples/email/src/email/template.html | 584 +- examples/email/src/email/transport.ts | 1 - examples/email/src/emptyModule.js | 2 +- examples/email/src/payload.config.ts | 8 +- .../Blocks/Form/Checkbox/index.module.scss | 2 +- .../Blocks/Form/Country/index.module.scss | 2 +- .../Blocks/Form/Email/index.module.scss | 2 +- .../Blocks/Form/Number/index.module.scss | 2 +- .../Blocks/Form/Select/index.module.scss | 2 +- .../Blocks/Form/State/index.module.scss | 2 +- .../Blocks/Form/Text/index.module.scss | 2 +- .../Blocks/Form/Textarea/index.module.scss | 2 +- .../components/Blocks/Form/index.module.scss | 2 +- .../components/Blocks/Form/shared.scss | 2 +- .../components/Button/index.module.scss | 6 +- .../components/Header/index.module.scss | 4 +- .../Header/mobileMenuModal.module.scss | 2 +- examples/form-builder/next-app/css/app.scss | 14 +- .../form-builder/next-app/css/colors.scss | 10 +- .../form-builder/next-app/css/common.scss | 2 +- .../form-builder/next-app/css/queries.scss | 2 +- examples/form-builder/next-app/css/type.scss | 3 +- examples/form-builder/next-app/pnpm-lock.yaml | 4055 ++- .../Blocks/Form/Checkbox/index.module.scss | 2 +- .../Blocks/Form/Country/index.module.scss | 2 +- .../components/Blocks/Form/Country/index.tsx | 4 +- .../Blocks/Form/Email/index.module.scss | 2 +- .../Blocks/Form/Number/index.module.scss | 2 +- .../Blocks/Form/Select/index.module.scss | 2 +- .../components/Blocks/Form/Select/index.tsx | 4 +- .../Blocks/Form/State/index.module.scss | 2 +- .../components/Blocks/Form/State/index.tsx | 4 +- .../Blocks/Form/Text/index.module.scss | 2 +- .../Blocks/Form/Textarea/index.module.scss | 2 +- .../components/Blocks/Form/index.module.scss | 2 +- .../components/Blocks/Form/shared.scss | 2 +- .../components/Button/index.module.scss | 6 +- .../components/Header/index.module.scss | 4 +- .../Header/mobileMenuModal.module.scss | 2 +- examples/form-builder/next-pages/css/app.scss | 14 +- .../form-builder/next-pages/css/colors.scss | 10 +- .../form-builder/next-pages/css/common.scss | 2 +- .../form-builder/next-pages/css/queries.scss | 2 +- .../form-builder/next-pages/css/type.scss | 3 +- .../form-builder/next-pages/pages/[slug].tsx | 8 +- .../form-builder/next-pages/pages/_app.tsx | 2 +- .../form-builder/next-pages/pages/index.tsx | 2 +- .../form-builder/next-pages/pnpm-lock.yaml | 4055 ++- .../next-pages/providers/Globals/index.tsx | 2 +- .../next-pages/utilities/formatSlug.js | 2 +- .../next-pages/utilities/toKebabCase.ts | 2 +- examples/form-builder/payload/pnpm-lock.yaml | 4776 +++- .../Blocks/Form/Checkbox/index.module.scss | 2 +- .../Blocks/Form/Country/index.module.scss | 2 +- .../Blocks/Form/Email/index.module.scss | 2 +- .../Blocks/Form/Number/index.module.scss | 2 +- .../Blocks/Form/Select/index.module.scss | 2 +- .../Blocks/Form/State/index.module.scss | 2 +- .../Blocks/Form/Text/index.module.scss | 2 +- .../Blocks/Form/Textarea/index.module.scss | 2 +- .../components/Blocks/Form/index.module.scss | 2 +- .../src/components/Blocks/Form/shared.scss | 2 +- .../src/components/Button/index.module.scss | 6 +- .../src/components/Header/index.module.scss | 4 +- .../Header/mobileMenuModal.module.scss | 2 +- .../form-builder/payload/src/css/app.scss | 14 +- .../form-builder/payload/src/css/colors.scss | 10 +- .../form-builder/payload/src/css/common.scss | 2 +- .../form-builder/payload/src/css/queries.scss | 2 +- .../form-builder/payload/src/css/type.scss | 3 +- examples/hierarchy/pnpm-lock.yaml | 4330 +++- .../next-app/app/_api/fetchPage.ts | 2 +- .../next-app/app/_api/fetchPages.ts | 4 +- .../next-app/app/_components/Header/index.tsx | 2 +- examples/live-preview/next-app/app/app.scss | 13 +- examples/live-preview/next-app/pnpm-lock.yaml | 2093 +- .../live-preview/next-pages/pnpm-lock.yaml | 1839 +- .../src/components/Header/index.tsx | 2 +- .../next-pages/src/pages/[slug].tsx | 4 +- .../next-pages/src/pages/app.scss | 26 +- .../next-pages/src/pages/index.tsx | 2 +- .../live-preview/payload/.vscode/launch.json | 4 +- examples/live-preview/payload/pnpm-lock.yaml | 4639 +++- .../payload/src/app/(app)/app.scss | 13 +- .../payload/src/utilities/deepMerge.ts | 2 +- .../src/app/(app)/index.scss | 4 +- .../admin/[[...segments]]/not-found.tsx | 5 +- .../(payload)/admin/[[...segments]]/page.tsx | 5 +- .../src/app/(payload)/admin/importMap.js | 7 + .../src/app/(payload)/layout.tsx | 23 +- .../src/app/components/Login/index.scss | 4 +- .../src/collections/Users/access/create.ts | 2 +- .../src/collections/Users/index.ts | 28 +- .../TenantSelector/index.client.tsx | 58 +- .../src/components/TenantSelector/index.scss | 2 +- .../TenantField/components/Field.client.tsx | 34 + .../fields/TenantField/components/Field.tsx | 44 +- .../src/fields/TenantField/index.ts | 3 +- .../src/payload-types.ts | 10 +- .../src/payload.config.ts | 3 +- .../src/utilities/getTenantAccessIDs.ts | 2 +- examples/multi-tenant-single-domain/yarn.lock | 1191 +- .../collections/Users/access/tenantAdmins.ts | 2 +- .../Users/hooks/recordLastLoggedInTenant.ts | 2 +- .../Users/utilities/checkTenantRoles.ts | 2 +- .../Users/utilities/isSuperOrTenantAdmin.ts | 2 +- examples/multi-tenant/src/fields/link.ts | 2 +- examples/multi-tenant/src/payload.config.ts | 2 +- .../src/utilities/checkUserRoles.ts | 4 +- .../multi-tenant/src/utilities/deepMerge.ts | 2 +- .../next-app/app/[...slug]/page.tsx | 8 +- .../app/_components/AdminBar/index.client.tsx | 2 +- .../next-app/app/_components/Header/index.tsx | 2 +- examples/nested-docs/next-app/app/app.scss | 13 +- .../src/components/AdminBar/index.tsx | 2 +- .../src/components/Header/index.tsx | 2 +- .../next-pages/src/pages/[...slug].tsx | 12 +- .../nested-docs/next-pages/src/pages/app.scss | 26 +- .../next-pages/src/pages/index.tsx | 2 +- .../nested-docs/payload/.vscode/launch.json | 4 +- .../nested-docs/payload/src/fields/link.ts | 2 +- .../nested-docs/payload/src/payload.config.ts | 2 +- .../nested-docs/payload/src/seed/index.ts | 2 +- .../payload/src/utilities/deepMerge.ts | 2 +- examples/redirects/next-pages/css/app.scss | 14 +- examples/redirects/next-pages/css/colors.scss | 10 +- examples/redirects/next-pages/css/common.scss | 2 +- .../redirects/next-pages/css/queries.scss | 2 +- examples/redirects/next-pages/css/type.scss | 3 +- .../redirects/next-pages/pages/[slug].tsx | 2 +- examples/redirects/next-pages/pages/index.tsx | 2 +- .../next-pages/providers/Globals/index.tsx | 2 +- examples/redirects/next-pages/redirects.js | 2 +- .../next-pages/utilities/toKebabCase.ts | 2 +- .../redirects/payload/.vscode/launch.json | 4 +- examples/redirects/payload/src/fields/link.ts | 2 +- .../payload/src/utilities/deepMerge.ts | 2 +- examples/tailwind-shadcn-ui/components.json | 2 +- examples/tailwind-shadcn-ui/pnpm-lock.yaml | 4163 +++- .../src/components/ui/alert.tsx | 54 +- examples/tailwind-shadcn-ui/src/lib/utils.ts | 4 +- examples/testing/README.md | 2 +- examples/testing/package.json | 2 +- examples/virtual-fields/pnpm-lock.yaml | 3685 ++- examples/whitelabel/pnpm-lock.yaml | 3685 ++- jest.config.js | 22 +- next.config.mjs | 10 + package.json | 138 +- packages/create-payload-app/eslint.config.js | 4 +- packages/create-payload-app/jest.config.js | 2 +- packages/create-payload-app/package.json | 11 +- .../src/lib/create-project.spec.ts | 13 +- .../src/lib/create-project.ts | 9 +- .../src/lib/download-template.ts | 38 + .../src/lib/get-package-manager.ts | 2 +- .../create-payload-app/src/lib/init-next.ts | 12 +- .../src/lib/parse-project-name.ts | 12 +- .../src/lib/parse-template.ts | 4 +- .../src/lib/replacements.ts | 13 + .../create-payload-app/src/lib/select-db.ts | 13 +- .../create-payload-app/src/lib/templates.ts | 2 +- .../src/lib/update-payload-in-project.ts | 6 +- .../src/lib/wrap-next-config.ts | 10 +- .../src/lib/write-env-file.ts | 11 +- packages/create-payload-app/src/main.ts | 2 +- .../src/scripts/pack-template-files.ts | 6 +- packages/create-payload-app/src/types.ts | 2 +- .../src/utils/copy-recursive-sync.ts | 2 +- packages/db-mongodb/eslint.config.js | 3 +- packages/db-mongodb/package.json | 4 +- packages/db-mongodb/src/connect.ts | 6 +- packages/db-mongodb/src/createGlobal.ts | 2 +- .../db-mongodb/src/createGlobalVersion.ts | 14 +- packages/db-mongodb/src/createVersion.ts | 4 + packages/db-mongodb/src/deleteOne.ts | 2 +- packages/db-mongodb/src/find.ts | 2 +- packages/db-mongodb/src/findGlobal.ts | 2 +- packages/db-mongodb/src/findGlobalVersions.ts | 3 +- packages/db-mongodb/src/findOne.ts | 2 +- packages/db-mongodb/src/findVersions.ts | 2 +- packages/db-mongodb/src/index.ts | 1 + packages/db-mongodb/src/init.ts | 10 +- .../src/models/buildCollectionSchema.ts | 20 +- .../db-mongodb/src/models/buildGlobalModel.ts | 4 +- packages/db-mongodb/src/models/buildSchema.ts | 77 +- packages/db-mongodb/src/queries/buildQuery.ts | 7 +- .../queries/getLocalizedSortProperty.spec.ts | 2 +- packages/db-mongodb/src/queryDrafts.ts | 2 +- .../src/transactions/beginTransaction.ts | 2 + packages/db-mongodb/src/types.ts | 25 - packages/db-mongodb/src/updateGlobal.ts | 2 +- packages/db-mongodb/src/updateOne.ts | 2 +- .../src/utilities/sanitizeInternalFields.ts | 4 +- packages/db-postgres/eslint.config.js | 3 +- packages/db-postgres/package.json | 8 +- packages/db-postgres/src/index.ts | 34 +- .../src/predefinedMigrations/v2-v3/index.ts | 4 +- packages/db-postgres/src/types.ts | 156 +- packages/db-sqlite/.eslintrc.cjs | 7 - packages/db-sqlite/README.md | 2 +- packages/db-sqlite/eslint.config.js | 19 + packages/db-sqlite/package.json | 4 +- .../db-sqlite/src/getMigrationTemplate.ts | 10 +- packages/db-sqlite/src/index.ts | 1 + packages/db-sqlite/src/init.ts | 16 +- packages/db-sqlite/src/schema/build.ts | 23 +- .../db-sqlite/src/schema/traverseFields.ts | 79 +- packages/db-vercel-postgres/.gitignore | 1 + .../.prettierignore} | 0 packages/db-vercel-postgres/.swcrc | 15 + packages/db-vercel-postgres/README.md | 43 + packages/db-vercel-postgres/eslint.config.js | 19 + packages/db-vercel-postgres/package.json | 91 + .../relationships-v2-v3.mjs | 13 + .../scripts/renamePredefinedMigrations.ts | 19 + packages/db-vercel-postgres/src/connect.ts | 61 + .../src/exports/migration-utils.ts | 1 + packages/db-vercel-postgres/src/index.ts | 163 + .../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 | 103 + .../v2-v3/traverseFields.ts | 117 + .../src/predefinedMigrations/v2-v3/types.ts | 9 + packages/db-vercel-postgres/src/types.ts | 78 + packages/db-vercel-postgres/tsconfig.json | 38 + packages/drizzle/.eslintignore | 10 - packages/drizzle/package.json | 20 +- packages/drizzle/src/createGlobalVersion.ts | 13 +- packages/drizzle/src/createVersion.ts | 6 +- packages/drizzle/src/deleteVersions.ts | 2 +- packages/drizzle/src/exports/postgres.ts | 13 + .../drizzle/src/find/buildFindManyArgs.ts | 8 +- packages/drizzle/src/find/traverseFields.ts | 6 +- packages/drizzle/src/findGlobalVersions.ts | 2 +- packages/drizzle/src/findVersions.ts | 2 +- packages/drizzle/src/migrate.ts | 6 +- packages/drizzle/src/migrateDown.ts | 1 - packages/drizzle/src/migrateFresh.ts | 1 + packages/drizzle/src/migrateRefresh.ts | 2 +- packages/drizzle/src/migrateReset.ts | 1 - packages/drizzle/src/migrateStatus.ts | 2 +- .../src/postgres}/countDistinct.ts | 10 +- .../convertPathToJSONTraversal.ts | 0 .../createJSONQuery/formatJSONPathSegment.ts | 0 .../src/postgres}/createJSONQuery/index.ts | 0 .../src/postgres}/createMigration.ts | 6 +- .../src/postgres}/defaultSnapshot.ts | 0 .../src/postgres}/deleteWhere.ts | 3 +- .../src/postgres}/dropDatabase.ts | 0 .../src => drizzle/src/postgres}/execute.ts | 0 .../src/postgres}/getMigrationTemplate.ts | 13 +- .../src => drizzle/src/postgres}/init.ts | 25 +- .../src => drizzle/src/postgres}/insert.ts | 3 +- .../src/postgres}/requireDrizzleKit.ts | 5 +- .../src/postgres}/schema/build.ts | 46 +- .../src/postgres}/schema/createIndex.ts | 0 .../src/postgres}/schema/idToUUID.ts | 0 .../src/postgres}/schema/parentIDColumnMap.ts | 0 .../src/postgres}/schema/setColumnID.ts | 8 +- .../src/postgres}/schema/traverseFields.ts | 101 +- .../src/postgres}/schema/withDefault.ts | 0 packages/drizzle/src/postgres/types.ts | 152 + .../src/queries/buildAndOrConditions.ts | 3 +- .../src/queries/getTableColumnFromPath.ts | 2 +- packages/drizzle/src/queries/parseParams.ts | 1 - .../drizzle/src/queries/selectDistinct.ts | 4 +- packages/drizzle/src/queryDrafts.ts | 3 +- .../src/transform/read/hasManyNumber.ts | 24 +- .../drizzle/src/transform/read/hasManyText.ts | 24 +- packages/drizzle/src/transform/read/index.ts | 1 - .../src/transform/read/relationship.ts | 35 +- .../src/transform/read/traverseFields.ts | 109 +- packages/drizzle/src/transform/write/array.ts | 12 +- .../drizzle/src/transform/write/blocks.ts | 9 +- packages/drizzle/src/transform/write/index.ts | 1 - .../drizzle/src/transform/write/selects.ts | 1 - .../src/transform/write/traverseFields.ts | 20 + packages/drizzle/src/updateGlobalVersion.ts | 2 +- packages/drizzle/src/updateVersion.ts | 2 +- packages/drizzle/src/upsertRow/index.ts | 59 +- .../drizzle/src/upsertRow/insertArrays.ts | 1 - packages/drizzle/src/upsertRow/types.ts | 8 +- .../drizzle/src/utilities/createBlocksMap.ts | 1 - packages/email-nodemailer/eslint.config.js | 3 +- packages/email-nodemailer/package.json | 4 +- packages/email-nodemailer/src/index.ts | 4 +- packages/email-nodemailer/src/plugin.spec.ts | 20 +- packages/email-resend/eslint.config.js | 3 +- packages/email-resend/package.json | 4 +- packages/eslint-config/index.mjs | 33 +- packages/eslint-config/package.json | 24 +- .../customRules/no-imports-from-self.js | 66 + .../no-relative-monorepo-imports.js | 2 +- packages/eslint-plugin/index.mjs | 2 + packages/eslint-plugin/package.json | 24 +- packages/graphql/bin.js | 53 +- packages/graphql/eslint.config.js | 3 +- packages/graphql/package.json | 7 +- packages/graphql/src/bin/index.ts | 4 +- packages/graphql/src/index.ts | 16 +- .../QueryComplexity.ts | 10 +- .../createComplexityRule.ts | 2 +- packages/graphql/src/resolvers/auth/access.ts | 6 +- .../src/resolvers/auth/forgotPassword.ts | 4 +- packages/graphql/src/resolvers/auth/init.ts | 4 +- packages/graphql/src/resolvers/auth/login.ts | 4 +- packages/graphql/src/resolvers/auth/logout.ts | 4 +- packages/graphql/src/resolvers/auth/me.ts | 4 +- .../graphql/src/resolvers/auth/refresh.ts | 4 +- .../src/resolvers/auth/resetPassword.ts | 12 +- packages/graphql/src/resolvers/auth/unlock.ts | 4 +- .../graphql/src/resolvers/auth/verifyEmail.ts | 12 +- .../src/resolvers/collections/create.ts | 2 +- .../src/resolvers/collections/delete.ts | 10 +- .../src/resolvers/collections/duplicate.ts | 2 +- .../graphql/src/resolvers/collections/find.ts | 10 +- .../src/resolvers/collections/findByID.ts | 10 +- .../src/resolvers/collections/findVersions.ts | 10 +- .../resolvers/collections/restoreVersion.ts | 2 +- .../src/resolvers/collections/update.ts | 10 +- .../graphql/src/resolvers/globals/findOne.ts | 10 +- .../src/resolvers/globals/findVersionByID.ts | 10 +- .../src/resolvers/globals/findVersions.ts | 2 +- .../graphql/src/resolvers/globals/index.ts | 10 +- .../src/resolvers/globals/restoreVersion.ts | 2 +- .../graphql/src/resolvers/globals/update.ts | 10 +- .../schema/buildFallbackLocaleInputType.ts | 6 +- .../src/schema/buildLocaleInputType.ts | 6 +- .../src/schema/buildMutationInputType.ts | 89 +- .../graphql/src/schema/buildObjectType.ts | 218 +- .../graphql/src/schema/buildPoliciesType.ts | 8 +- .../graphql/src/schema/buildWhereInputType.ts | 8 +- .../src/schema/fieldToWhereInputSchemaMap.ts | 45 +- .../graphql/src/schema/initCollections.ts | 38 +- packages/graphql/src/schema/initGlobals.ts | 34 +- .../graphql/src/schema/isFieldNullable.ts | 4 +- packages/graphql/src/schema/operators.ts | 4 +- .../src/schema/recursivelyBuildNestedPaths.ts | 6 +- .../graphql/src/schema/withNullableType.ts | 4 +- packages/graphql/src/schema/withOperators.ts | 14 +- .../src/utilities/combineParentName.ts | 6 +- .../graphql/src/utilities/formatName.spec.ts | 2 +- packages/graphql/src/utilities/formatName.ts | 4 +- .../graphql/src/utilities/formatOptions.ts | 6 +- .../src/utilities/getCheckIfLocaleObject.ts | 4 - packages/graphql/src/utilities/uppercase.ts | 11 - packages/live-preview-react/eslint.config.js | 3 +- packages/live-preview-react/package.json | 4 +- packages/live-preview-vue/eslint.config.js | 3 +- packages/live-preview-vue/package.json | 4 +- packages/live-preview/eslint.config.js | 3 +- packages/live-preview/package.json | 4 +- packages/live-preview/src/mergeData.ts | 4 +- packages/next/babel.config.cjs | 39 + packages/next/eslint.config.js | 15 +- packages/next/package.json | 28 +- .../DocumentHeader/Tabs/Tab/index.tsx | 29 +- .../DocumentHeader/Tabs/getCustomViews.ts | 12 +- .../DocumentHeader/Tabs/getViewConfig.ts | 12 +- .../elements/DocumentHeader/Tabs/index.scss | 1 - .../elements/DocumentHeader/Tabs/index.tsx | 68 +- .../Tabs/tabs/VersionsPill/index.tsx | 10 +- .../DocumentHeader/Tabs/tabs/index.tsx | 32 +- .../src/elements/DocumentHeader/index.scss | 9 +- .../src/elements/DocumentHeader/index.tsx | 10 +- .../src/elements/EmailAndUsername/index.tsx | 53 +- .../elements/LeaveWithoutSaving/index.scss | 1 + .../src/elements/LeaveWithoutSaving/index.tsx | 14 +- .../LeaveWithoutSaving/usePreventLeave.tsx | 12 +- packages/next/src/elements/Logo/index.tsx | 33 +- .../src/elements/Nav/NavWrapper/index.scss | 5 +- .../src/elements/Nav/NavWrapper/index.tsx | 13 +- .../next/src/elements/Nav/index.client.tsx | 18 +- packages/next/src/elements/Nav/index.scss | 29 +- packages/next/src/elements/Nav/index.tsx | 67 +- packages/next/src/exports/layouts.ts | 2 +- packages/next/src/exports/views.ts | 2 +- .../src/fetchAPI-multipart/fileFactory.ts | 4 +- .../next/src/fetchAPI-multipart/handlers.ts | 8 +- packages/next/src/fetchAPI-multipart/index.ts | 100 +- .../fetchAPI-multipart/processMultipart.ts | 5 +- .../src/fetchAPI-multipart/processNested.ts | 12 +- .../src/fetchAPI-multipart/uploadTimer.ts | 4 +- .../next/src/fetchAPI-multipart/utilities.ts | 43 +- packages/next/src/layouts/Root/index.tsx | 66 +- .../next/src/routes/rest/buildFormState.ts | 4 +- .../src/routes/rest/collections/updateByID.ts | 8 +- .../src/routes/rest/files/checkFileAccess.ts | 6 +- .../next/src/routes/rest/files/getFile.ts | 8 +- .../next/src/routes/rest/globals/update.ts | 10 +- packages/next/src/routes/rest/index.ts | 56 +- packages/next/src/routes/rest/og/image.tsx | 22 +- packages/next/src/routes/rest/og/index.tsx | 17 +- .../rest/utilities/sanitizeCollectionID.ts | 8 +- packages/next/src/scss/app.scss | 18 +- packages/next/src/scss/toasts.scss | 29 +- packages/next/src/scss/type.scss | 9 +- .../src/templates/Default/Wrapper/index.scss | 41 +- .../src/templates/Default/Wrapper/index.tsx | 10 +- .../next/src/templates/Default/index.scss | 2 +- packages/next/src/templates/Default/index.tsx | 80 +- .../src/utilities/addDataAndFileToRequest.ts | 4 +- .../next/src/utilities/addLocalesToRequest.ts | 8 +- .../src/utilities/createPayloadRequest.ts | 12 +- .../next/src/utilities/getNextRequestI18n.ts | 9 +- packages/next/src/utilities/getPayloadHMR.ts | 35 +- .../next/src/utilities/getRequestTheme.ts | 2 +- .../next/src/utilities/headersWithCors.ts | 2 +- .../utilities/initPage/handleAuthRedirect.ts | 4 +- packages/next/src/utilities/initPage/index.ts | 7 +- packages/next/src/utilities/initPage/types.ts | 3 +- packages/next/src/utilities/meta.ts | 2 +- packages/next/src/utilities/timestamp.ts | 4 +- .../src/views/API/LocaleSelector/index.tsx | 15 +- .../next/src/views/API/RenderJSON/index.tsx | 2 +- packages/next/src/views/API/index.client.tsx | 84 +- packages/next/src/views/API/index.scss | 3 +- packages/next/src/views/API/index.tsx | 4 +- packages/next/src/views/API/meta.ts | 21 +- .../next/src/views/Account/Settings/index.tsx | 10 +- .../src/views/Account/ToggleTheme/index.tsx | 34 +- .../next/src/views/Account/index.client.tsx | 21 + packages/next/src/views/Account/index.tsx | 75 +- .../views/CreateFirstUser/index.client.tsx | 29 +- .../next/src/views/CreateFirstUser/index.tsx | 2 - .../src/views/Dashboard/Default/index.tsx | 78 +- packages/next/src/views/Dashboard/index.tsx | 60 +- .../src/views/Document/getCustomViewByKey.tsx | 18 +- .../views/Document/getCustomViewByRoute.tsx | 31 +- .../src/views/Document/getMetaBySegment.tsx | 114 +- .../src/views/Document/getViewsFromConfig.tsx | 459 +- packages/next/src/views/Document/index.tsx | 147 +- .../src/views/Edit/Default/Auth/APIKey.tsx | 53 +- .../src/views/Edit/Default/Auth/index.tsx | 39 +- .../next/src/views/Edit/Default/Auth/types.ts | 2 +- .../Edit/Default/SetDocumentStepNav/index.tsx | 8 +- .../next/src/views/Edit/Default/index.tsx | 82 +- packages/next/src/views/Edit/index.client.tsx | 23 +- packages/next/src/views/Edit/index.tsx | 4 +- packages/next/src/views/Edit/meta.ts | 63 +- .../ForgotPasswordForm/index.tsx | 20 +- .../next/src/views/ForgotPassword/index.tsx | 2 +- .../next/src/views/List/Default/index.scss | 31 +- .../next/src/views/List/Default/index.tsx | 168 +- packages/next/src/views/List/index.tsx | 104 +- packages/next/src/views/List/meta.ts | 2 +- .../src/views/LivePreview/Context/context.ts | 4 +- .../src/views/LivePreview/Context/index.tsx | 10 +- .../src/views/LivePreview/Device/index.tsx | 9 +- .../LivePreview/Toolbar/Controls/index.tsx | 2 +- .../LivePreview/Toolbar/SizeInput/index.tsx | 11 +- .../src/views/LivePreview/index.client.tsx | 207 +- packages/next/src/views/LivePreview/index.tsx | 9 +- packages/next/src/views/LivePreview/meta.ts | 1 + .../src/views/LivePreview/usePopupWindow.ts | 10 +- .../next/src/views/Login/LoginField/index.tsx | 35 +- .../next/src/views/Login/LoginForm/index.tsx | 18 +- packages/next/src/views/Login/index.tsx | 59 +- .../next/src/views/Logout/LogoutClient.tsx | 2 +- packages/next/src/views/Logout/index.tsx | 2 +- .../next/src/views/NotFound/index.client.tsx | 6 +- packages/next/src/views/NotFound/index.tsx | 15 +- .../src/views/ResetPassword/index.client.tsx | 31 +- .../next/src/views/ResetPassword/index.tsx | 2 +- .../views/Root/generateCustomViewMetadata.ts | 42 + .../src/views/Root/getCustomViewByRoute.ts | 65 + .../src/views/Root/getCustomViewByRoute.tsx | 37 - ...iewFromConfig.tsx => getViewFromConfig.ts} | 77 +- packages/next/src/views/Root/index.tsx | 45 +- .../src/views/Root/isPathMatchingRoute.ts | 8 +- packages/next/src/views/Root/meta.ts | 20 +- .../next/src/views/Unauthorized/index.tsx | 8 +- packages/next/src/views/Verify/index.tsx | 6 +- .../src/views/Version/Default/SetStepNav.tsx | 35 +- .../next/src/views/Version/Default/index.tsx | 31 +- .../next/src/views/Version/Default/types.ts | 14 +- .../fields/Iterable/index.tsx | 72 +- .../fields/Nested/index.tsx | 25 +- .../fields/Relationship/index.tsx | 27 +- .../fields/Select/index.tsx | 24 +- .../RenderFieldsToDiff/fields/Tabs/index.tsx | 24 +- .../RenderFieldsToDiff/fields/Text/index.tsx | 25 +- .../RenderFieldsToDiff/fields/index.tsx | 2 +- .../RenderFieldsToDiff/fields/types.ts | 30 +- .../Version/RenderFieldsToDiff/index.tsx | 36 +- .../views/Version/RenderFieldsToDiff/types.ts | 18 +- .../next/src/views/Version/Restore/index.tsx | 6 +- .../views/Version/SelectComparison/index.tsx | 34 +- .../src/views/Version/SelectLocales/index.tsx | 4 +- packages/next/src/views/Version/index.tsx | 20 +- packages/next/src/views/Version/meta.ts | 34 +- .../next/src/views/Versions/buildColumns.tsx | 75 +- .../Versions/cells/AutosaveCell/index.tsx | 28 +- .../views/Versions/cells/CreatedAt/index.tsx | 12 +- .../next/src/views/Versions/index.client.tsx | 37 +- packages/next/src/views/Versions/index.tsx | 24 +- packages/next/src/views/Versions/meta.ts | 39 +- packages/payload/bin.js | 53 +- packages/payload/eslint.config.js | 3 +- packages/payload/package.json | 24 +- packages/payload/src/admin/RichText.ts | 54 +- packages/payload/src/admin/elements/Cell.ts | 45 +- packages/payload/src/admin/elements/Tab.ts | 32 +- packages/payload/src/admin/fields/Array.ts | 51 +- packages/payload/src/admin/fields/Blocks.ts | 63 +- packages/payload/src/admin/fields/Checkbox.ts | 53 +- packages/payload/src/admin/fields/Code.ts | 39 +- .../payload/src/admin/fields/Collapsible.ts | 38 +- packages/payload/src/admin/fields/Date.ts | 38 +- packages/payload/src/admin/fields/Email.ts | 39 +- packages/payload/src/admin/fields/Group.ts | 37 +- packages/payload/src/admin/fields/Hidden.ts | 21 +- packages/payload/src/admin/fields/JSON.ts | 38 +- packages/payload/src/admin/fields/Number.ts | 52 +- packages/payload/src/admin/fields/Point.ts | 37 +- packages/payload/src/admin/fields/Radio.ts | 42 +- .../payload/src/admin/fields/Relationship.ts | 43 +- packages/payload/src/admin/fields/RichText.ts | 44 +- packages/payload/src/admin/fields/Row.ts | 38 +- packages/payload/src/admin/fields/Select.ts | 52 +- packages/payload/src/admin/fields/Tabs.ts | 62 +- packages/payload/src/admin/fields/Text.ts | 53 +- packages/payload/src/admin/fields/Textarea.ts | 45 +- packages/payload/src/admin/fields/Upload.ts | 41 +- packages/payload/src/admin/fields/index.ts | 86 - .../payload/src/admin/forms/Description.ts | 38 + packages/payload/src/admin/forms/Error.ts | 41 +- packages/payload/src/admin/forms/Field.ts | 54 +- .../src/admin/forms/FieldDescription.ts | 23 - packages/payload/src/admin/forms/FieldMap.ts | 24 - .../payload/src/admin/forms/FieldTypes.ts | 26 - packages/payload/src/admin/forms/Form.ts | 2 +- packages/payload/src/admin/forms/Label.ts | 51 +- packages/payload/src/admin/types.ts | 293 +- packages/payload/src/admin/views/types.ts | 37 +- .../payload/src/auth/baseFields/apiKey.ts | 4 +- packages/payload/src/auth/baseFields/email.ts | 2 +- .../payload/src/auth/baseFields/username.ts | 2 +- .../src/auth/baseFields/verification.ts | 2 +- .../payload/src/auth/ensureUsernameOrEmail.ts | 4 +- packages/payload/src/auth/executeAccess.ts | 8 +- packages/payload/src/auth/getAuthFields.ts | 4 +- packages/payload/src/auth/isLocked.ts | 4 +- packages/payload/src/auth/operations/auth.ts | 6 +- .../src/auth/operations/forgotPassword.ts | 8 +- packages/payload/src/auth/operations/login.ts | 8 +- .../payload/src/auth/operations/logout.ts | 7 +- packages/payload/src/auth/operations/me.ts | 8 +- .../payload/src/auth/operations/refresh.ts | 8 +- .../src/auth/operations/registerFirstUser.ts | 8 +- .../src/auth/operations/resetPassword.ts | 8 +- .../payload/src/auth/operations/unlock.ts | 4 +- .../src/auth/operations/verifyEmail.ts | 11 +- packages/payload/src/auth/strategies/jwt.ts | 106 +- .../src/auth/strategies/local/authenticate.ts | 4 +- .../src/auth/strategies/local/register.ts | 48 +- .../strategies/local/resetLoginAttempts.ts | 4 +- packages/payload/src/auth/types.ts | 10 +- .../src/bin/generateImportMap/index.ts | 221 + .../generateImportMap/iterateCollections.ts | 64 + .../bin/generateImportMap/iterateConfig.ts | 100 + .../bin/generateImportMap/iterateFields.ts | 93 + .../bin/generateImportMap/iterateGlobals.ts | 55 + .../parsePayloadComponent.ts | 27 + packages/payload/src/bin/generateTypes.ts | 10 +- packages/payload/src/bin/index.ts | 55 +- packages/payload/src/bin/info.ts | 63 + .../src/bin/loader/clientExtensions.ts | 11 - packages/payload/src/bin/loader/compile.ts | 40 - packages/payload/src/bin/loader/ignores.ts | 1 - packages/payload/src/bin/loader/index.ts | 176 - .../src/bin/loader/read-default-tsconfig.ts | 134 - .../src/bin/loader/resolveOriginalPath.ts | 36 - .../payload/src/checkPayloadDependencies.ts | 59 + .../payload/src/collections/config/client.ts | 139 +- .../config/reservedFieldNames.spec.ts | 6 +- .../src/collections/config/sanitize.ts | 22 +- .../payload/src/collections/config/types.ts | 47 +- .../payload/src/collections/dataloader.ts | 10 +- .../src/collections/operations/create.ts | 4 +- .../src/collections/operations/delete.ts | 4 +- .../src/collections/operations/deleteByID.ts | 12 +- .../src/collections/operations/duplicate.ts | 12 +- .../src/collections/operations/find.ts | 2 +- .../src/collections/operations/findByID.ts | 8 +- .../collections/operations/findVersionByID.ts | 12 +- .../collections/operations/findVersions.ts | 2 +- .../collections/operations/local/update.ts | 3 + .../collections/operations/restoreVersion.ts | 8 +- .../src/collections/operations/update.ts | 6 +- .../src/collections/operations/updateByID.ts | 75 +- .../src/collections/operations/utils.ts | 2 +- packages/payload/src/config/client.ts | 76 +- packages/payload/src/config/defaults.ts | 4 + packages/payload/src/config/find.ts | 17 +- packages/payload/src/config/sanitize.ts | 39 +- packages/payload/src/config/types.ts | 463 +- .../payload/src/database/combineQueries.ts | 14 +- .../payload/src/database/getLocalizedPaths.ts | 7 +- .../database/migrations/readMigrationFiles.ts | 12 +- .../queryValidation/validateSearchParams.ts | 5 +- packages/payload/src/database/types.ts | 18 +- .../payload/src/errors/ValidationError.ts | 7 +- packages/payload/src/exports/node.ts | 1 - packages/payload/src/exports/shared.ts | 11 +- packages/payload/src/fields/config/client.ts | 103 +- .../payload/src/fields/config/sanitize.ts | 115 +- packages/payload/src/fields/config/types.ts | 917 +- .../src/fields/hooks/afterChange/index.ts | 4 +- .../src/fields/hooks/afterChange/promise.ts | 4 +- .../hooks/afterChange/traverseFields.ts | 4 +- .../src/fields/hooks/afterRead/index.ts | 8 +- .../src/fields/hooks/afterRead/promise.ts | 16 +- .../fields/hooks/afterRead/traverseFields.ts | 4 +- .../hooks/beforeChange/getExistingRowDoc.ts | 8 +- .../src/fields/hooks/beforeChange/index.ts | 13 +- .../src/fields/hooks/beforeChange/promise.ts | 26 +- .../hooks/beforeChange/traverseFields.ts | 4 +- .../src/fields/hooks/beforeValidate/index.ts | 4 +- .../fields/hooks/beforeValidate/promise.ts | 106 +- .../hooks/beforeValidate/traverseFields.ts | 4 +- packages/payload/src/fields/validations.ts | 150 +- packages/payload/src/globals/config/client.ts | 95 +- .../payload/src/globals/config/sanitize.ts | 57 +- packages/payload/src/globals/config/types.ts | 17 +- .../src/globals/operations/docAccess.ts | 4 +- .../src/globals/operations/findVersionByID.ts | 16 +- .../src/globals/operations/findVersions.ts | 2 +- .../src/globals/operations/local/update.ts | 12 +- .../src/globals/operations/restoreVersion.ts | 4 +- .../payload/src/globals/operations/update.ts | 59 +- packages/payload/src/index.ts | 186 +- .../src/preferences/operations/findOne.ts | 4 +- packages/payload/src/preferences/types.ts | 1 - packages/payload/src/types/index.ts | 8 +- packages/payload/src/uploads/cropImage.ts | 4 +- .../src/uploads/deleteAssociatedFiles.ts | 4 +- .../src/uploads/docWithFilenameExists.ts | 4 +- .../payload/src/uploads/formatFilesize.ts | 4 +- .../payload/src/uploads/generateFileData.ts | 16 +- packages/payload/src/uploads/getBaseFields.ts | 17 +- .../payload/src/uploads/getExternalFile.ts | 4 +- packages/payload/src/uploads/imageResizer.ts | 73 +- .../src/uploads/optionallyAppendMetadata.ts | 4 +- packages/payload/src/uploads/types.ts | 23 +- .../src/utilities/configToJSONSchema.spec.ts | 131 + .../src/utilities/configToJSONSchema.ts | 97 +- .../createArrayFromCommaDelineated.ts | 4 +- .../payload/src/utilities/createLocalReq.ts | 40 +- .../payload/src/utilities/deepCopyObject.ts | 20 +- .../dependencies/dependencyChecker.ts | 114 + .../utilities/dependencies/versionUtils.ts | 91 + .../src/utilities/fieldSchemaToJSON.ts | 18 +- .../src/utilities/flattenTopLevelFields.ts | 46 +- .../payload/src/utilities/getDataByPath.ts | 2 +- .../src/utilities/getEntityPolicies.ts | 44 +- .../src/utilities/getObjectDotNotation.ts | 4 +- .../payload/src/utilities/getSiblingData.ts | 6 +- .../src/utilities/importWithoutClientFiles.ts | 61 - .../payload/src/utilities/isReactComponent.ts | 6 +- packages/payload/src/utilities/isValidID.ts | 6 +- packages/payload/src/utilities/logger.ts | 59 +- .../src/utilities/reduceFieldsToValues.ts | 6 +- .../src/utilities/telemetry/conf/index.ts | 14 +- packages/payload/src/utilities/timestamp.ts | 4 +- packages/payload/src/versions/baseFields.ts | 17 +- .../src/versions/buildCollectionFields.ts | 43 +- .../payload/src/versions/buildGlobalFields.ts | 44 +- .../drafts/appendVersionToQueryKey.ts | 2 +- .../src/versions/drafts/getQueryDraftsSort.ts | 4 +- .../versions/getLatestCollectionVersion.ts | 19 +- .../src/versions/payloadPackageList.ts | 31 + packages/payload/src/versions/saveVersion.ts | 82 +- packages/payload/src/versions/types.ts | 9 +- .../plugin-cloud-storage/eslint.config.js | 3 +- packages/plugin-cloud-storage/package.json | 12 +- .../src/adapters/azure/index.ts | 4 +- .../src/adapters/gcs/index.ts | 6 +- .../src/adapters/s3/index.ts | 4 +- .../src/adapters/vercelBlob/generateURL.ts | 4 +- .../src/adapters/vercelBlob/handleDelete.ts | 4 +- .../src/adapters/vercelBlob/handleUpload.ts | 3 +- .../src/adapters/vercelBlob/index.ts | 2 +- .../src/adapters/vercelBlob/staticHandler.ts | 3 +- .../src/admin/fields/getFields.ts | 2 +- .../src/fields/getFields.ts | 4 +- .../src/hooks/afterDelete.ts | 4 +- .../src/hooks/afterRead.ts | 2 +- packages/plugin-cloud-storage/src/plugin.ts | 8 +- packages/plugin-cloud/eslint.config.js | 3 +- packages/plugin-cloud/package.json | 14 +- packages/plugin-cloud/src/email.spec.ts | 18 +- packages/plugin-cloud/src/email.ts | 7 +- .../plugin-cloud/src/hooks/uploadCache.ts | 8 +- packages/plugin-cloud/src/plugin.spec.ts | 23 +- packages/plugin-form-builder/eslint.config.js | 3 +- packages/plugin-form-builder/package.json | 14 +- .../FormSubmissions/hooks/sendEmail.ts | 20 +- .../src/collections/FormSubmissions/index.ts | 4 +- .../Forms/DynamicFieldSelector.tsx | 16 +- .../Forms/DynamicPriceSelector.tsx | 10 +- .../src/collections/Forms/fields.ts | 10 +- .../src/collections/Forms/index.ts | 4 +- .../plugin-form-builder/src/exports/client.ts | 2 + .../plugin-form-builder/src/exports/types.ts | 6 +- packages/plugin-form-builder/src/index.ts | 2 +- packages/plugin-form-builder/src/types.ts | 40 +- .../src/utilities/replaceDoubleCurlys.ts | 4 +- packages/plugin-nested-docs/eslint.config.js | 3 +- packages/plugin-nested-docs/package.json | 4 +- .../src/hooks/resaveChildren.ts | 18 +- .../src/utilities/populateBreadcrumbs.ts | 2 +- packages/plugin-redirects/eslint.config.js | 3 +- packages/plugin-redirects/package.json | 4 +- packages/plugin-redirects/src/index.ts | 17 +- .../plugin-redirects/src/redirectTypes.ts | 24 + packages/plugin-redirects/src/types.ts | 5 +- .../eslint.config.js | 3 +- .../package.json | 4 +- .../src/hooks/beforeChange.ts | 4 +- packages/plugin-search/eslint.config.js | 3 +- packages/plugin-search/package.json | 30 +- .../src/Search/hooks/deleteFromSearch.ts | 3 +- .../src/Search/hooks/syncWithSearch.ts | 19 +- packages/plugin-search/src/Search/index.ts | 13 +- .../src/Search/ui/index.client.tsx | 24 +- packages/plugin-search/src/exports/client.ts | 1 + packages/plugin-search/src/types.ts | 2 +- packages/plugin-sentry/eslint.config.js | 3 +- packages/plugin-sentry/package.json | 2 + packages/plugin-sentry/src/plugin.ts | 4 +- packages/plugin-sentry/src/startSentry.ts | 4 +- packages/plugin-seo/eslint.config.js | 3 +- packages/plugin-seo/package.json | 24 +- packages/plugin-seo/src/exports/client.ts | 5 + .../MetaDescriptionComponent.tsx | 45 +- .../src/fields/MetaDescription/index.ts | 13 +- .../fields/MetaImage/MetaImageComponent.tsx | 56 +- .../plugin-seo/src/fields/MetaImage/index.ts | 13 +- .../fields/MetaTitle/MetaTitleComponent.tsx | 44 +- .../plugin-seo/src/fields/MetaTitle/index.ts | 13 +- .../src/fields/Overview/OverviewComponent.tsx | 7 +- .../plugin-seo/src/fields/Overview/index.tsx | 13 +- .../src/fields/Preview/PreviewComponent.tsx | 31 +- .../plugin-seo/src/fields/Preview/index.tsx | 13 +- packages/plugin-seo/src/index.tsx | 172 +- packages/plugin-seo/src/translations/index.ts | 22 + packages/plugin-seo/src/translations/it.json | 22 + packages/plugin-seo/src/types.ts | 26 +- packages/plugin-stripe/eslint.config.js | 3 +- packages/plugin-stripe/package.json | 21 +- packages/plugin-stripe/src/exports/client.ts | 3 + .../plugin-stripe/src/fields/getFields.ts | 4 +- .../src/hooks/createNewInStripe.ts | 23 +- .../src/hooks/deleteFromStripe.ts | 13 +- .../src/hooks/syncExistingWithStripe.ts | 13 +- packages/plugin-stripe/src/index.ts | 1 - packages/plugin-stripe/src/routes/rest.ts | 2 - packages/plugin-stripe/src/ui/LinkToDoc.tsx | 4 +- .../src/webhooks/handleCreatedOrUpdated.ts | 43 +- .../src/webhooks/handleDeleted.ts | 24 +- packages/plugin-stripe/src/webhooks/index.ts | 3 +- packages/richtext-lexical/babel.config.cjs | 39 + packages/richtext-lexical/bundle.js | 13 +- packages/richtext-lexical/eslint.config.js | 15 +- packages/richtext-lexical/package.json | 52 +- packages/richtext-lexical/src/cell/index.tsx | 27 +- .../src/exports/client/index.ts | 47 +- .../src/exports/server/migrate.ts | 19 + .../{feature.client.tsx => client/index.tsx} | 12 +- .../align/{ => client}/toolbarAlignGroup.ts | 5 +- .../src/features/align/feature.server.ts | 12 - .../src/features/align/{ => server}/i18n.ts | 0 .../src/features/align/server/index.ts | 10 + .../{feature.client.tsx => client/index.tsx} | 12 +- .../features/blockquote/{ => server}/i18n.ts | 0 .../{feature.server.ts => server/index.ts} | 16 +- .../{ => client}/component/BlockContent.tsx | 100 +- .../{ => client}/component/FormSavePlugin.tsx | 1 + .../blocks/{ => client}/component/index.scss | 22 +- .../blocks/{ => client}/component/index.tsx | 118 +- .../component/removeEmptyArrayValues.ts | 1 + .../{ => client}/componentInline/index.scss | 42 +- .../{ => client}/componentInline/index.tsx | 42 +- .../src/features/blocks/client/index.tsx | 193 + .../blocks/client/nodes/BlocksNode.tsx | 62 + .../blocks/client/nodes/InlineBlocksNode.tsx | 76 + .../blocks/{ => client}/plugin/commands.ts | 1 + .../blocks/{ => client}/plugin/index.tsx | 69 +- .../src/features/blocks/feature.client.tsx | 163 - .../{ => server}/graphQLPopulationPromise.ts | 6 +- .../src/features/blocks/{ => server}/i18n.ts | 0 .../{feature.server.ts => server/index.ts} | 184 +- .../blocks/{ => server}/nodes/BlocksNode.tsx | 31 +- .../{ => server}/nodes/InlineBlocksNode.tsx | 41 +- .../features/blocks/{ => server}/validate.ts | 4 +- .../html/converter/converters/paragraph.ts | 14 +- .../html/converter/converters/text.ts | 4 +- .../converters/html/converter/index.ts | 32 +- .../converters/html/converter/types.ts | 4 +- .../features/converters/html/field/index.ts | 9 +- .../html/{feature.server.ts => index.ts} | 0 .../src/features/createClientComponent.tsx | 7 +- .../features/createFeaturePropComponent.tsx | 2 +- .../{feature.client.tsx => client/index.tsx} | 2 +- .../{ => client}/plugin/index.scss | 2 +- .../{ => client}/plugin/index.tsx | 4 +- .../debug/testRecorder/feature.server.ts | 10 - .../debug/testRecorder/server/index.ts | 8 + .../{feature.client.tsx => client/index.tsx} | 2 +- .../treeView/{ => client}/plugin/index.scss | 0 .../treeView/{ => client}/plugin/index.tsx | 2 +- .../features/debug/treeView/feature.server.ts | 10 - .../features/debug/treeView/server/index.ts | 8 + .../{feature.client.ts => client/index.ts} | 8 +- .../plugins/TableActionMenuPlugin/index.scss | 2 +- .../plugins/TableActionMenuPlugin/index.tsx | 15 +- .../plugins/TableCellResizerPlugin/index.tsx | 6 +- .../plugins/TableHoverActionsPlugin/index.tsx | 16 +- .../plugins/TablePlugin/index.scss | 18 +- .../plugins/TablePlugin/index.tsx | 20 +- .../{ => client}/utils/debounce.ts | 9 +- .../{ => client}/utils/useDebounce.ts | 3 +- .../{feature.server.ts => server/index.ts} | 25 +- .../features/format/bold/feature.server.ts | 4 +- .../format/inlineCode/feature.server.ts | 4 +- .../features/format/italic/feature.server.ts | 4 +- .../format/shared/toolbarFormatGroup.ts | 1 + .../format/strikethrough/feature.server.ts | 4 +- .../format/subscript/feature.server.ts | 4 +- .../format/superscript/feature.server.ts | 4 +- .../format/underline/feature.server.ts | 4 +- .../{feature.client.tsx => client/index.tsx} | 24 +- .../src/features/heading/{ => server}/i18n.ts | 0 .../{feature.server.ts => server/index.ts} | 16 +- .../{ => client}/component/index.tsx | 0 .../{feature.client.tsx => client/index.tsx} | 15 +- .../{ => client}/markdownTransformer.ts | 0 .../client/nodes/HorizontalRuleNode.tsx | 57 + .../{ => client}/plugin/index.scss | 2 +- .../{ => client}/plugin/index.tsx | 8 +- .../features/horizontalRule/feature.server.ts | 29 - .../horizontalRule/{ => server}/i18n.ts | 0 .../features/horizontalRule/server/index.ts | 27 + .../server/markdownTransformer.ts | 26 + .../{ => server}/nodes/HorizontalRuleNode.tsx | 39 +- .../{feature.client.tsx => client/index.tsx} | 8 +- .../indent/{ => client}/toolbarIndentGroup.ts | 3 +- .../src/features/indent/feature.server.ts | 12 - .../src/features/indent/{ => server}/i18n.ts | 0 .../src/features/indent/server/index.ts | 10 + .../{feature.client.tsx => client/index.tsx} | 22 +- .../{ => client}/plugins/autoLink/index.tsx | 17 +- .../plugins/clickableLink/index.tsx | 4 +- .../floatingLinkEditor/LinkEditor/commands.ts | 1 + .../floatingLinkEditor/LinkEditor/index.tsx | 36 +- .../plugins/floatingLinkEditor/index.scss | 52 +- .../plugins/floatingLinkEditor/index.tsx | 6 +- .../plugins/floatingLinkEditor/types.ts | 2 +- .../link/client/plugins/link/index.tsx | 76 + .../src/features/link/nodes/LinkNode.ts | 6 +- .../src/features/link/plugins/link/index.tsx | 80 - .../link/{drawer => server}/baseFields.ts | 14 +- .../{ => server}/graphQLPopulationPromise.ts | 8 +- .../src/features/link/{ => server}/i18n.ts | 0 .../{feature.server.ts => server/index.ts} | 34 +- .../transformExtraFields.ts} | 2 +- .../features/link/{ => server}/validate.ts | 6 +- .../{feature.client.tsx => client/index.tsx} | 16 +- .../checklist/{ => client}/plugin/index.tsx | 2 +- .../lists/checklist/{ => server}/i18n.ts | 0 .../{feature.server.ts => server/index.ts} | 12 +- .../src/features/lists/htmlConverter.ts | 28 +- .../{feature.client.tsx => client/index.tsx} | 14 +- .../lists/orderedList/{ => server}/i18n.ts | 0 .../{feature.server.ts => server/index.ts} | 12 +- .../{feature.client.tsx => client/index.tsx} | 14 +- .../lists/unorderedList/{ => server}/i18n.ts | 0 .../{feature.server.ts => server/index.ts} | 12 +- .../converter/converters/heading/client.ts | 6 - .../converter/converters/heading/converter.ts | 7 +- .../converter/converters/heading/index.ts | 9 - .../converter/converters/link/client.ts | 5 - .../converter/converters/link/converter.ts | 5 +- .../converter/converters/link/index.ts | 9 - .../converter/converters/list/client.ts | 6 - .../converter/converters/list/converter.ts | 5 +- .../converter/converters/list/index.ts | 9 - .../converter/converters/listItem/client.ts | 5 - .../converters/listItem/converter.ts | 5 +- .../converter/converters/listItem/index.ts | 9 - .../converter/converters/quote/client.ts | 6 - .../converter/converters/quote/converter.ts | 7 +- .../converter/converters/quote/index.ts | 9 - .../converter/converters/unknown/client.ts | 5 - .../converter/converters/unknown/converter.ts | 5 +- .../converter/converters/unknown/index.ts | 9 - .../converter/converters/upload/client.ts | 6 - .../converter/converters/upload/converter.ts | 4 +- .../converter/converters/upload/index.ts | 9 - .../converter/defaultConverters.ts | 18 +- .../lexicalPluginToLexical/converter/index.ts | 29 +- .../lexicalPluginToLexical/converter/types.ts | 12 +- .../lexicalPluginToLexical/feature.client.tsx | 21 +- .../lexicalPluginToLexical/feature.server.ts | 50 +- .../nodes/unknownConvertedNode/Component.tsx | 1 + .../converter/converters/blockquote/client.ts | 6 - .../converters/blockquote/converter.ts | 4 +- .../converter/converters/blockquote/index.ts | 9 - .../converter/converters/heading/client.ts | 5 - .../converter/converters/heading/converter.ts | 4 +- .../converter/converters/heading/index.ts | 9 - .../converter/converters/indent/client.ts | 6 - .../converter/converters/indent/converter.ts | 2 +- .../converter/converters/indent/index.ts | 9 - .../converter/converters/link/client.ts | 6 - .../converter/converters/link/converter.ts | 4 +- .../converter/converters/link/index.ts | 9 - .../converter/converters/listItem/client.ts | 6 - .../converters/listItem/converter.ts | 2 +- .../converter/converters/listItem/index.ts | 9 - .../converters/orderedList/client.ts | 6 - .../converters/orderedList/converter.ts | 2 +- .../converter/converters/orderedList/index.ts | 9 - .../converters/relationship/client.ts | 6 - .../converters/relationship/converter.ts | 4 +- .../converters/relationship/index.ts | 9 - .../converter/converters/unknown/client.ts | 6 - .../converter/converters/unknown/converter.ts | 2 +- .../converter/converters/unknown/index.ts | 9 - .../converters/unorderedList/client.ts | 6 - .../converters/unorderedList/converter.ts | 2 +- .../converters/unorderedList/index.ts | 9 - .../converter/converters/upload/client.ts | 6 - .../converter/converters/upload/converter.ts | 4 +- .../converter/converters/upload/index.ts | 9 - .../converter/defaultConverters.ts | 24 +- .../slateToLexical/converter/index.ts | 2 +- .../slateToLexical/converter/types.ts | 11 - .../slateToLexical/feature.client.tsx | 23 - .../slateToLexical/feature.server.ts | 52 +- .../nodes/unknownConvertedNode/Component.tsx | 1 + .../{feature.client.tsx => client/index.tsx} | 10 +- .../src/features/paragraph/feature.server.ts | 13 - .../features/paragraph/{ => server}/i18n.ts | 0 .../src/features/paragraph/server/index.ts | 11 + .../components/RelationshipComponent.tsx | 34 +- .../{nodes => client}/components/index.scss | 2 +- .../{ => client}/drawer/commands.ts | 0 .../{ => client}/drawer/index.tsx | 0 .../{feature.client.tsx => client/index.tsx} | 10 +- .../client/nodes/RelationshipNode.tsx | 106 + .../{ => client}/plugins/index.tsx | 12 +- .../utils/EnabledRelationshipsCondition.tsx | 5 +- .../features/relationship/feature.server.ts | 104 - .../{ => server}/graphQLPopulationPromise.ts | 6 +- .../relationship/{ => server}/i18n.ts | 0 .../src/features/relationship/server/index.ts | 107 + .../{ => server}/nodes/RelationshipNode.tsx | 55 +- .../fixed/{ => client}/Toolbar/index.scss | 25 +- .../fixed/{ => client}/Toolbar/index.tsx | 27 +- .../{feature.client.tsx => client/index.tsx} | 4 +- .../{feature.server.ts => server/index.ts} | 6 +- .../inline/{ => client}/Toolbar/index.scss | 34 +- .../inline/{ => client}/Toolbar/index.tsx | 24 +- .../{feature.client.tsx => client/index.tsx} | 2 +- .../toolbars/inline/feature.server.ts | 10 - .../features/toolbars/inline/server/index.ts | 8 + .../toolbars/shared/ToolbarButton/index.scss | 15 +- .../shared/ToolbarDropdown/DropDown.tsx | 16 +- .../shared/ToolbarDropdown/index.scss | 43 +- .../toolbars/shared/ToolbarDropdown/index.tsx | 12 +- .../src/features/toolbars/types.ts | 7 +- .../src/features/typesClient.ts | 12 +- .../src/features/typesServer.ts | 52 +- .../upload/{ => client}/component/index.scss | 4 +- .../upload/{ => client}/component/index.tsx | 48 +- .../upload/{ => client}/drawer/commands.ts | 0 .../upload/{ => client}/drawer/index.tsx | 2 +- .../upload/{ => client}/feature.client.tsx | 8 +- .../upload/client/nodes/UploadNode.tsx | 113 + .../upload/{ => client}/plugin/index.tsx | 8 +- .../upload/{ => server}/feature.server.ts | 48 +- .../{ => server}/graphQLPopulationPromise.ts | 6 +- .../src/features/upload/{ => server}/i18n.ts | 0 .../upload/{ => server}/nodes/UploadNode.tsx | 52 +- .../features/upload/{ => server}/validate.ts | 2 +- packages/richtext-lexical/src/field/Field.tsx | 71 +- packages/richtext-lexical/src/field/index.tsx | 23 +- packages/richtext-lexical/src/index.ts | 353 +- .../src/lexical/EditorPlugin.tsx | 1 + .../src/lexical/LexicalEditor.scss | 18 +- .../src/lexical/LexicalEditor.tsx | 12 +- .../src/lexical/LexicalProvider.tsx | 14 +- .../config/client/EditorConfigProvider.tsx | 24 +- .../src/lexical/config/client/sanitize.ts | 2 +- .../src/lexical/config/server/default.ts | 26 +- .../src/lexical/config/server/loader.ts | 3 + .../src/lexical/config/server/sanitize.ts | 35 +- .../LexicalMenu.tsx | 16 +- .../LexicalTypeaheadMenuPlugin/index.tsx | 2 +- .../LexicalTypeaheadMenuPlugin/types.ts | 16 +- .../src/lexical/plugins/SlashMenu/index.scss | 30 +- .../src/lexical/plugins/SlashMenu/index.tsx | 31 +- .../plugins/SlashMenu/useMenuTriggerMatch.ts | 1 + .../handles/AddBlockHandlePlugin/index.tsx | 2 +- .../handles/DraggableBlockPlugin/debounce.ts | 1 + .../getBoundingRectWithoutTransform.ts | 1 + .../highlightElemOriginalPosition.ts | 1 + .../handles/DraggableBlockPlugin/index.scss | 9 +- .../handles/DraggableBlockPlugin/index.tsx | 16 +- .../DraggableBlockPlugin/setTargetLine.ts | 34 +- .../calculateDistanceFromScrollerElem.ts | 1 + .../utils/doesLineHeightAffectElement.ts | 5 +- .../handles/utils/getCollapsedMargins.ts | 1 + .../handles/utils/getNodeCloseToPoint.ts | 5 +- .../handles/utils/getTopLevelNodeKeys.ts | 1 + .../handles/utils/isOnHandleElement.ts | 1 + .../handles/utils/setHandlePosition.ts | 17 +- .../src/lexical/theme/EditorTheme.scss | 157 +- .../src/lexical/theme/EditorTheme.tsx | 3 +- .../src/lexical/ui/ContentEditable.tsx | 1 + .../src/lexical/ui/icons/AI/index.tsx | 1 + .../src/lexical/ui/icons/Add/index.tsx | 1 + .../lexical/ui/icons/AlignCenter/index.tsx | 1 + .../lexical/ui/icons/AlignJustify/index.tsx | 1 + .../src/lexical/ui/icons/AlignLeft/index.tsx | 1 + .../src/lexical/ui/icons/AlignRight/index.tsx | 1 + .../src/lexical/ui/icons/Block/index.tsx | 1 + .../src/lexical/ui/icons/Blockquote/index.tsx | 1 + .../src/lexical/ui/icons/Bold/index.tsx | 1 + .../src/lexical/ui/icons/Caret/index.svg | 4 +- .../src/lexical/ui/icons/Checklist/index.tsx | 1 + .../src/lexical/ui/icons/Code/index.tsx | 1 + .../src/lexical/ui/icons/CodeBlock/index.tsx | 1 + .../src/lexical/ui/icons/H1/index.tsx | 1 + .../src/lexical/ui/icons/H2/index.tsx | 1 + .../src/lexical/ui/icons/H3/index.tsx | 1 + .../src/lexical/ui/icons/H4/index.tsx | 1 + .../src/lexical/ui/icons/H5/index.tsx | 1 + .../src/lexical/ui/icons/H6/index.tsx | 1 + .../lexical/ui/icons/HorizontalRule/index.tsx | 1 + .../lexical/ui/icons/IndentDecrease/index.tsx | 1 + .../lexical/ui/icons/IndentIncrease/index.tsx | 1 + .../lexical/ui/icons/InlineBlocks/index.tsx | 1 + .../src/lexical/ui/icons/Italic/index.tsx | 1 + .../src/lexical/ui/icons/Link/index.tsx | 1 + .../src/lexical/ui/icons/Meatballs/index.tsx | 1 + .../lexical/ui/icons/OrderedList/index.tsx | 1 + .../lexical/ui/icons/Relationship/index.tsx | 1 + .../lexical/ui/icons/Strikethrough/index.tsx | 1 + .../src/lexical/ui/icons/Subscript/index.tsx | 1 + .../lexical/ui/icons/Superscript/index.tsx | 1 + .../src/lexical/ui/icons/Table/index.tsx | 1 + .../src/lexical/ui/icons/Text/index.tsx | 1 + .../src/lexical/ui/icons/Underline/index.tsx | 1 + .../lexical/ui/icons/UnorderedList/index.tsx | 1 + .../src/lexical/ui/icons/Upload/index.tsx | 1 + .../src/lexical/utils/canUseDOM.ts | 1 + .../src/lexical/utils/environment.ts | 1 + .../src/lexical/utils/getDOMRangeRect.ts | 1 + .../src/lexical/utils/getSelectedNode.ts | 1 + .../src/lexical/utils/guard.ts | 1 + .../src/lexical/utils/invariant.ts | 16 - .../src/lexical/utils/joinClasses.ts | 1 + .../src/lexical/utils/nodeFormat.ts | 4 +- .../src/lexical/utils/point.ts | 1 + .../src/lexical/utils/rect.ts | 5 +- .../lexical/utils/setFloatingElemPosition.ts | 3 +- .../setFloatingElemPositionForLinkEditor.ts | 1 + .../src/lexical/utils/swipe.ts | 1 + .../richtext-lexical/src/lexical/utils/url.ts | 32 +- packages/richtext-lexical/src/nodeTypes.ts | 16 +- packages/richtext-lexical/src/scss/app.scss | 18 +- .../richtext-lexical/src/scss/toasts.scss | 29 +- packages/richtext-lexical/src/scss/type.scss | 9 +- packages/richtext-lexical/src/types.ts | 22 +- .../src/utilities/createClientFeature.ts | 12 +- .../src/utilities/createServerFeature.ts | 10 +- .../src/utilities/fieldsDrawer/Drawer.tsx | 22 +- .../utilities/fieldsDrawer/DrawerContent.tsx | 19 +- .../src/utilities/generateComponentMap.tsx | 98 +- .../src/utilities/generateImportMap.tsx | 59 + .../src/utilities/generateSchemaMap.ts | 3 +- .../utilities/migrateSlateToLexical/index.ts | 62 +- .../migrateDocumentFieldsRecursively.ts | 17 +- .../src/utilities/useLexicalFeature.tsx | 2 +- .../richtext-lexical/src/validate/index.ts | 27 +- .../src/validate/validateNodes.ts | 6 +- packages/richtext-lexical/tsconfig.json | 2 +- packages/richtext-slate/eslint.config.js | 3 +- packages/richtext-slate/package.json | 25 +- .../src/data/richTextRelationshipPromise.ts | 2 +- .../richtext-slate/src/data/validation.ts | 4 +- .../src/exports/client/index.ts | 66 + .../richtext-slate/src/field/RichText.tsx | 79 +- .../src/field/createFeatureMap.ts | 20 +- .../EnabledRelationshipsCondition.tsx | 4 +- .../src/field/elements/blockquote/Button.tsx | 11 + .../{Blockquote.tsx => Element.tsx} | 2 +- .../src/field/elements/blockquote/index.tsx | 19 +- .../src/field/elements/h1/Button.tsx | 11 + .../src/field/elements/h1/Heading1.tsx | 2 +- .../src/field/elements/h1/index.tsx | 19 +- .../src/field/elements/h2/Button.tsx | 11 + .../src/field/elements/h2/Heading2.tsx | 2 +- .../src/field/elements/h2/index.tsx | 19 +- .../src/field/elements/h3/Button.tsx | 11 + .../src/field/elements/h3/Heading3.tsx | 2 +- .../src/field/elements/h3/index.tsx | 19 +- .../src/field/elements/h4/Button.tsx | 11 + .../src/field/elements/h4/Heading4.tsx | 2 +- .../src/field/elements/h4/index.tsx | 19 +- .../src/field/elements/h5/Button.tsx | 11 + .../src/field/elements/h5/Heading5.tsx | 2 +- .../src/field/elements/h5/index.tsx | 19 +- .../src/field/elements/h6/Button.tsx | 11 + .../src/field/elements/h6/Heading6.tsx | 2 +- .../src/field/elements/h6/index.tsx | 19 +- .../src/field/elements/indent/index.ts | 6 +- .../src/field/elements/isActive.tsx | 4 +- .../elements/isLastSelectedElementEmpty.ts | 4 +- .../src/field/elements/isListActive.ts | 8 +- .../src/field/elements/li/index.tsx | 4 +- .../src/field/elements/link/Button/index.tsx | 13 +- .../field/elements/link/Element/index.scss | 10 +- .../src/field/elements/link/Element/index.tsx | 18 +- .../field/elements/link/LinkDrawer/index.scss | 8 +- .../field/elements/link/LinkDrawer/index.tsx | 6 +- .../field/elements/link/LinkDrawer/types.ts | 12 +- .../src/field/elements/link/index.ts | 10 +- .../src/field/elements/ol/Button.tsx | 11 + .../src/field/elements/ol/OrderedList.tsx | 2 +- .../src/field/elements/ol/index.tsx | 19 +- .../elements/relationship/Button/index.tsx | 6 +- .../elements/relationship/Element/index.tsx | 24 +- .../src/field/elements/relationship/index.ts | 9 +- .../src/field/elements/textAlign/Button.tsx | 21 + .../src/field/elements/textAlign/index.tsx | 25 +- .../src/field/elements/toggleList.tsx | 8 +- .../src/field/elements/ul/Button.tsx | 11 + .../src/field/elements/ul/UnorderedList.tsx | 2 +- .../src/field/elements/ul/index.tsx | 19 +- .../field/elements/upload/Button/index.tsx | 2 +- .../upload/Element/UploadDrawer/index.tsx | 26 +- .../field/elements/upload/Element/index.tsx | 29 +- .../src/field/elements/upload/index.ts | 9 +- packages/richtext-slate/src/field/index.scss | 45 +- packages/richtext-slate/src/field/index.tsx | 27 +- .../src/field/leaves/bold/Bold/index.tsx | 2 +- .../src/field/leaves/bold/LeafButton.tsx | 11 + .../src/field/leaves/bold/index.tsx | 14 +- .../src/field/leaves/code/Code/index.tsx | 2 +- .../src/field/leaves/code/LeafButton.tsx | 11 + .../src/field/leaves/code/index.tsx | 14 +- .../src/field/leaves/italic/Italic/index.tsx | 2 +- .../src/field/leaves/italic/LeafButton.tsx | 11 + .../src/field/leaves/italic/index.tsx | 14 +- .../field/leaves/strikethrough/LeafButton.tsx | 11 + .../strikethrough/Strikethrough/index.tsx | 2 +- .../src/field/leaves/strikethrough/index.tsx | 14 +- .../src/field/leaves/underline/LeafButton.tsx | 11 + .../leaves/underline/Underline/index.tsx | 2 +- .../src/field/leaves/underline/index.tsx | 14 +- .../field/providers/ElementButtonProvider.tsx | 9 +- .../src/field/providers/ElementProvider.tsx | 10 +- .../field/providers/LeafButtonProvider.tsx | 8 +- .../src/field/providers/LeafProvider.tsx | 10 +- packages/richtext-slate/src/field/types.ts | 20 +- .../src/generateComponentMap.tsx | 77 +- packages/richtext-slate/src/index.tsx | 81 +- packages/richtext-slate/src/scss/app.scss | 18 +- packages/richtext-slate/src/scss/toasts.scss | 29 +- packages/richtext-slate/src/scss/type.scss | 9 +- packages/richtext-slate/src/types.ts | 14 +- packages/storage-azure/eslint.config.js | 3 +- packages/storage-azure/package.json | 4 +- packages/storage-azure/src/staticHandler.ts | 2 +- .../src/utils/getStorageClient.ts | 4 +- packages/storage-gcs/eslint.config.js | 3 +- packages/storage-gcs/package.json | 4 +- packages/storage-gcs/src/index.ts | 6 +- packages/storage-s3/eslint.config.js | 3 +- packages/storage-s3/package.json | 8 +- packages/storage-s3/src/index.ts | 4 +- packages/storage-uploadthing/eslint.config.js | 3 +- packages/storage-uploadthing/package.json | 4 +- packages/storage-uploadthing/src/index.ts | 4 +- .../storage-uploadthing/src/staticHandler.ts | 4 +- packages/storage-vercel-blob/eslint.config.js | 3 +- packages/storage-vercel-blob/package.json | 4 +- packages/translations/eslint.config.js | 3 +- packages/translations/package.json | 10 +- .../scripts/translateNewKeys/sortKeys.ts | 4 +- packages/translations/src/clientKeys.ts | 13 +- .../translations/src/importDateFNSLocale.ts | 4 +- packages/translations/src/languages/ar.ts | 44 +- packages/translations/src/languages/az.ts | 44 +- packages/translations/src/languages/bg.ts | 44 +- packages/translations/src/languages/cs.ts | 44 +- packages/translations/src/languages/de.ts | 44 +- packages/translations/src/languages/en.ts | 44 +- packages/translations/src/languages/es.ts | 44 +- packages/translations/src/languages/fa.ts | 44 +- packages/translations/src/languages/fr.ts | 46 +- packages/translations/src/languages/he.ts | 44 +- packages/translations/src/languages/hr.ts | 44 +- packages/translations/src/languages/hu.ts | 44 +- packages/translations/src/languages/it.ts | 46 +- packages/translations/src/languages/ja.ts | 44 +- packages/translations/src/languages/ko.ts | 44 +- packages/translations/src/languages/my.ts | 44 +- packages/translations/src/languages/nb.ts | 44 +- packages/translations/src/languages/nl.ts | 44 +- packages/translations/src/languages/pl.ts | 44 +- packages/translations/src/languages/pt.ts | 44 +- packages/translations/src/languages/ro.ts | 44 +- packages/translations/src/languages/rs.ts | 44 +- .../translations/src/languages/rsLatin.ts | 44 +- packages/translations/src/languages/ru.ts | 44 +- packages/translations/src/languages/sk.ts | 44 +- packages/translations/src/languages/sv.ts | 44 +- packages/translations/src/languages/th.ts | 44 +- packages/translations/src/languages/tr.ts | 44 +- packages/translations/src/languages/uk.ts | 44 +- packages/translations/src/languages/vi.ts | 44 +- packages/translations/src/languages/zh.ts | 44 +- packages/translations/src/languages/zhTw.ts | 44 +- packages/translations/src/utilities/init.ts | 4 +- packages/ui/babel.config.cjs | 45 +- packages/ui/bundle.js | 18 +- packages/ui/eslint.config.js | 16 +- packages/ui/package.json | 40 +- .../ui/src/elements/AddNewRelation/index.scss | 42 + .../AddNewRelation}/index.tsx | 68 +- .../ui/src/elements/AddNewRelation/types.ts | 11 + .../AddNewRelation}/useRelatedCollections.ts | 5 +- packages/ui/src/elements/AppHeader/index.scss | 8 +- packages/ui/src/elements/AppHeader/index.tsx | 19 +- packages/ui/src/elements/Autosave/index.tsx | 17 +- packages/ui/src/elements/Banner/index.tsx | 12 +- .../elements/BulkUpload/ActionsBar/index.scss | 59 + .../elements/BulkUpload/ActionsBar/index.tsx | 97 + .../BulkUpload/AddFilesView/index.scss | 28 + .../BulkUpload/AddFilesView/index.tsx | 60 + .../BulkUpload/AddingFilesView/index.scss | 23 + .../BulkUpload/AddingFilesView/index.tsx | 67 + .../BulkUpload/DiscardWithoutSaving/index.tsx | 46 + .../BulkUpload/DrawerCloseButton/index.scss | 27 + .../BulkUpload/DrawerCloseButton/index.tsx | 21 + .../elements/BulkUpload/EditForm/index.scss | 9 + .../elements/BulkUpload/EditForm/index.tsx | 214 + .../src/elements/BulkUpload/EditForm/types.ts | 3 + .../BulkUpload/FileSidebar/index.scss | 277 + .../elements/BulkUpload/FileSidebar/index.tsx | 183 + .../BulkUpload/FormsManager/createFormData.ts | 25 + .../BulkUpload/FormsManager/index.tsx | 391 + .../BulkUpload/FormsManager/reducer.ts | 106 + .../src/elements/BulkUpload/Header/index.scss | 12 + .../src/elements/BulkUpload/Header/index.tsx | 19 + .../ui/src/elements/BulkUpload/index.scss | 0 packages/ui/src/elements/BulkUpload/index.tsx | 139 + packages/ui/src/elements/Button/index.scss | 185 +- packages/ui/src/elements/Button/index.tsx | 121 +- packages/ui/src/elements/Button/types.ts | 5 +- packages/ui/src/elements/Card/index.scss | 6 +- packages/ui/src/elements/Card/index.tsx | 6 +- packages/ui/src/elements/CodeEditor/index.tsx | 2 +- .../ui/src/elements/Collapsible/index.scss | 46 +- .../ui/src/elements/Collapsible/index.tsx | 30 +- .../ui/src/elements/ColumnSelector/index.tsx | 16 +- .../ui/src/elements/DatePicker/DatePicker.tsx | 20 +- .../elements/DatePicker/getFormattedLocale.ts | 1 + packages/ui/src/elements/DatePicker/index.tsx | 2 +- .../ui/src/elements/DeleteDocument/index.scss | 1 + .../ui/src/elements/DeleteDocument/index.tsx | 6 +- .../ui/src/elements/DeleteMany/index.scss | 1 + packages/ui/src/elements/DeleteMany/index.tsx | 8 +- .../src/elements/DocumentControls/index.scss | 25 +- .../src/elements/DocumentControls/index.tsx | 69 +- .../elements/DocumentDrawer/DrawerContent.tsx | 17 +- .../ui/src/elements/DocumentDrawer/index.tsx | 4 +- .../ui/src/elements/DocumentDrawer/types.ts | 21 +- .../ui/src/elements/DocumentFields/index.tsx | 29 +- .../src/elements/DraggableSortable/index.tsx | 8 +- .../useDraggableSortable/types.ts | 12 +- packages/ui/src/elements/Drawer/index.tsx | 6 +- packages/ui/src/elements/Drawer/types.ts | 14 +- packages/ui/src/elements/Dropzone/index.scss | 31 +- packages/ui/src/elements/Dropzone/index.tsx | 89 +- .../src/elements/DuplicateDocument/index.scss | 1 + .../src/elements/DuplicateDocument/index.tsx | 14 +- packages/ui/src/elements/EditMany/index.scss | 14 +- packages/ui/src/elements/EditMany/index.tsx | 23 +- packages/ui/src/elements/EditUpload/index.tsx | 23 +- packages/ui/src/elements/ErrorPill/index.tsx | 4 +- .../ui/src/elements/FieldSelect/index.tsx | 97 +- .../DraggableFileDetails/index.scss | 33 + .../DraggableFileDetails/index.tsx | 102 + .../{ => StaticFileDetails}/index.scss | 3 +- .../FileDetails/StaticFileDetails/index.tsx | 86 + .../ui/src/elements/FileDetails/index.tsx | 98 +- .../ui/src/elements/FullscreenModal/index.tsx | 21 + .../elements/GenerateConfirmation/index.scss | 1 + packages/ui/src/elements/Gutter/index.tsx | 1 + packages/ui/src/elements/Hamburger/index.tsx | 7 +- packages/ui/src/elements/IDLabel/index.scss | 5 +- .../ListControls/getTextFieldsToBeSearched.ts | 13 +- .../ui/src/elements/ListControls/index.scss | 19 +- .../ui/src/elements/ListControls/index.tsx | 61 +- .../src/elements/ListDrawer/DrawerContent.tsx | 72 +- .../ui/src/elements/ListDrawer/index.scss | 15 +- packages/ui/src/elements/ListDrawer/index.tsx | 7 +- packages/ui/src/elements/ListDrawer/types.ts | 21 +- .../ui/src/elements/ListHeader/index.scss | 10 + packages/ui/src/elements/ListHeader/index.tsx | 19 + .../ui/src/elements/LoadingOverlay/reducer.ts | 1 + .../Localizer/LocalizerLabel/index.scss | 6 + .../Localizer/LocalizerLabel/index.tsx | 4 +- packages/ui/src/elements/Localizer/index.tsx | 4 +- packages/ui/src/elements/Logout/index.tsx | 16 +- packages/ui/src/elements/Modal/index.tsx | 1 + packages/ui/src/elements/Nav/context.tsx | 25 +- packages/ui/src/elements/Pagination/index.tsx | 22 +- packages/ui/src/elements/PerPage/index.tsx | 4 +- packages/ui/src/elements/Pill/index.tsx | 12 +- .../elements/Popup/PopupButtonList/index.tsx | 10 +- .../elements/Popup/PopupTrigger/index.scss | 5 +- .../src/elements/Popup/PopupTrigger/index.tsx | 20 +- packages/ui/src/elements/Popup/index.tsx | 30 +- .../ui/src/elements/PreviewButton/index.tsx | 9 +- .../elements/PreviewButton/usePreviewURL.tsx | 30 +- .../ui/src/elements/PreviewSizes/index.tsx | 20 +- .../ui/src/elements/PublishButton/index.tsx | 128 +- .../ui/src/elements/PublishMany/index.scss | 1 + .../ui/src/elements/PublishMany/index.tsx | 6 +- .../elements/ReactSelect/Control/index.tsx | 1 - .../ReactSelect/DropdownIndicator/index.tsx | 6 +- .../elements/ReactSelect/MultiValue/index.tsx | 1 - .../ReactSelect/MultiValueLabel/index.tsx | 1 - .../ReactSelect/SingleValue/index.tsx | 1 - .../ReactSelect/ValueContainer/index.tsx | 1 - .../ui/src/elements/ReactSelect/index.tsx | 8 +- .../RenderCustomClientComponent/index.tsx | 22 - .../elements/RenderCustomComponent/index.tsx | 46 - .../ui/src/elements/RenderTitle/index.scss | 2 +- packages/ui/src/elements/SaveButton/index.tsx | 9 +- .../ui/src/elements/SaveDraftButton/index.tsx | 23 +- .../ui/src/elements/SearchFilter/index.tsx | 4 +- packages/ui/src/elements/SelectMany/index.tsx | 32 + .../ui/src/elements/ShimmerEffect/index.tsx | 10 +- packages/ui/src/elements/SortColumn/index.tsx | 36 +- .../ui/src/elements/SortComplex/index.tsx | 4 +- packages/ui/src/elements/Status/index.scss | 1 + packages/ui/src/elements/Status/index.tsx | 6 +- .../ui/src/elements/StayLoggedIn/index.scss | 1 + .../ui/src/elements/StayLoggedIn/index.tsx | 2 +- packages/ui/src/elements/StepNav/context.tsx | 1 + packages/ui/src/elements/StepNav/index.scss | 2 +- packages/ui/src/elements/StepNav/index.tsx | 37 +- packages/ui/src/elements/StepNav/types.ts | 4 +- .../Table/DefaultCell/fields/Array/index.tsx | 17 +- .../Table/DefaultCell/fields/Blocks/index.tsx | 9 +- .../DefaultCell/fields/Checkbox/index.tsx | 7 +- .../Table/DefaultCell/fields/Code/index.tsx | 8 +- .../Table/DefaultCell/fields/Date/index.tsx | 17 +- .../Table/DefaultCell/fields/File/index.scss | 10 +- .../Table/DefaultCell/fields/File/index.tsx | 4 +- .../Table/DefaultCell/fields/JSON/index.tsx | 6 +- .../DefaultCell/fields/Relationship/index.tsx | 27 +- .../Table/DefaultCell/fields/Select/index.tsx | 8 +- .../DefaultCell/fields/Textarea/index.tsx | 6 +- .../Table/DefaultCell/fields/index.tsx | 2 +- .../src/elements/Table/DefaultCell/index.tsx | 53 +- .../Table/RelationshipProvider/index.tsx | 21 +- .../Table/TableCellProvider/index.tsx | 12 +- packages/ui/src/elements/Table/index.tsx | 44 +- .../TableColumns/buildColumnState.tsx | 105 +- .../elements/TableColumns/filterFields.tsx | 27 +- .../TableColumns/getInitialColumns.ts | 27 +- .../ui/src/elements/TableColumns/index.tsx | 70 +- packages/ui/src/elements/Thumbnail/index.tsx | 50 +- .../ui/src/elements/ThumbnailCard/index.tsx | 6 +- packages/ui/src/elements/Tooltip/index.tsx | 8 +- .../ui/src/elements/Translation/index.tsx | 1 + .../ui/src/elements/UnpublishMany/index.scss | 1 + .../ui/src/elements/UnpublishMany/index.tsx | 7 +- packages/ui/src/elements/Upload/index.scss | 35 + packages/ui/src/elements/Upload/index.tsx | 151 +- .../ui/src/elements/ViewDescription/index.tsx | 27 +- .../Condition/Relationship/index.tsx | 16 +- .../Condition/Relationship/optionsReducer.ts | 1 + .../Condition/Relationship/types.ts | 6 +- .../WhereBuilder/Condition/Text/index.tsx | 4 +- .../elements/WhereBuilder/Condition/index.tsx | 81 +- .../src/elements/WhereBuilder/field-types.tsx | 1 + .../ui/src/elements/WhereBuilder/index.tsx | 19 +- ...uceFieldMap.tsx => reduceClientFields.tsx} | 76 +- .../WhereBuilder/transformWhereQuery.ts | 1 + .../ui/src/elements/WhereBuilder/types.ts | 17 +- .../WhereBuilder/validateWhereQuery.ts | 1 + packages/ui/src/elements/WindowInfo/index.tsx | 5 +- .../elements/WithServerSideProps/index.tsx | 2 +- packages/ui/src/exports/client/index.ts | 41 +- packages/ui/src/exports/shared/index.ts | 7 +- packages/ui/src/fields/Array/ArrayRow.tsx | 50 +- packages/ui/src/fields/Array/index.tsx | 76 +- packages/ui/src/fields/Blocks/BlockRow.tsx | 22 +- .../src/fields/Blocks/BlocksDrawer/index.tsx | 22 +- packages/ui/src/fields/Blocks/RowActions.tsx | 28 +- .../src/fields/Blocks/SectionTitle/index.scss | 14 +- packages/ui/src/fields/Blocks/index.scss | 1 + packages/ui/src/fields/Blocks/index.tsx | 62 +- packages/ui/src/fields/Checkbox/Input.tsx | 52 +- packages/ui/src/fields/Checkbox/index.tsx | 60 +- packages/ui/src/fields/Code/index.tsx | 57 +- packages/ui/src/fields/Collapsible/index.tsx | 44 +- .../ui/src/fields/ConfirmPassword/index.tsx | 9 +- packages/ui/src/fields/DateTime/index.tsx | 63 +- packages/ui/src/fields/Email/index.tsx | 62 +- .../ui/src/fields/FieldDescription/index.tsx | 13 +- packages/ui/src/fields/FieldError/index.tsx | 13 +- packages/ui/src/fields/FieldLabel/index.tsx | 13 +- packages/ui/src/fields/Group/index.tsx | 130 +- packages/ui/src/fields/Hidden/index.tsx | 3 +- packages/ui/src/fields/JSON/index.tsx | 74 +- packages/ui/src/fields/Number/index.tsx | 67 +- packages/ui/src/fields/Password/index.tsx | 78 +- packages/ui/src/fields/Password/input.tsx | 31 +- packages/ui/src/fields/Password/types.ts | 71 +- packages/ui/src/fields/Point/index.tsx | 79 +- packages/ui/src/fields/RadioGroup/index.tsx | 58 +- .../src/fields/Relationship/AddNew/index.scss | 28 - .../src/fields/Relationship/AddNew/types.ts | 13 - .../fields/Relationship/createRelationMap.ts | 3 +- .../fields/Relationship/findOptionsByValue.ts | 1 + packages/ui/src/fields/Relationship/index.tsx | 89 +- .../src/fields/Relationship/optionsReducer.ts | 1 + .../MultiValueLabel/index.tsx | 5 +- .../select-components/SingleValue/index.tsx | 1 - packages/ui/src/fields/Relationship/types.ts | 2 +- packages/ui/src/fields/RichText/index.tsx | 5 +- packages/ui/src/fields/Row/index.tsx | 11 +- packages/ui/src/fields/Select/Input.tsx | 87 +- packages/ui/src/fields/Select/index.tsx | 58 +- packages/ui/src/fields/Tabs/Tab/index.tsx | 21 +- packages/ui/src/fields/Tabs/index.scss | 3 +- packages/ui/src/fields/Tabs/index.tsx | 35 +- packages/ui/src/fields/Text/Input.tsx | 33 +- packages/ui/src/fields/Text/index.tsx | 72 +- packages/ui/src/fields/Text/types.ts | 48 +- packages/ui/src/fields/Textarea/Input.tsx | 33 +- packages/ui/src/fields/Textarea/index.tsx | 64 +- packages/ui/src/fields/Textarea/types.ts | 44 +- packages/ui/src/fields/UI/index.tsx | 1 + .../ui/src/fields/Upload/HasMany/index.scss | 27 + .../ui/src/fields/Upload/HasMany/index.tsx | 117 + .../ui/src/fields/Upload/HasOne/index.scss | 6 + .../ui/src/fields/Upload/HasOne/index.tsx | 47 + packages/ui/src/fields/Upload/Input.tsx | 629 +- .../Upload/RelationshipContent/index.scss | 54 + .../Upload/RelationshipContent/index.tsx | 116 + .../src/fields/Upload/UploadCard/index.scss | 26 + .../ui/src/fields/Upload/UploadCard/index.tsx | 18 + packages/ui/src/fields/Upload/index.scss | 90 +- packages/ui/src/fields/Upload/index.tsx | 154 +- packages/ui/src/fields/index.tsx | 8 +- packages/ui/src/fields/shared/index.tsx | 1 + .../ui/src/forms/FieldPropsProvider/index.tsx | 24 +- .../forms/Form/createNestedClientFieldPath.ts | 19 + .../src/forms/Form/createNestedFieldPath.ts | 33 - packages/ui/src/forms/Form/errorMessages.ts | 1 + packages/ui/src/forms/Form/fieldReducer.ts | 9 +- packages/ui/src/forms/Form/index.tsx | 32 +- .../ui/src/forms/Form/initContextState.ts | 1 + packages/ui/src/forms/Form/mergeErrorPaths.ts | 1 + .../ui/src/forms/Form/mergeServerFormState.ts | 5 +- packages/ui/src/forms/Form/rowHelpers.ts | 13 +- packages/ui/src/forms/Form/rows.ts | 5 +- packages/ui/src/forms/Form/types.ts | 8 +- packages/ui/src/forms/NullifyField/index.tsx | 40 +- .../ui/src/forms/RenderFields/RenderField.tsx | 89 +- packages/ui/src/forms/RenderFields/index.tsx | 30 +- packages/ui/src/forms/RenderFields/types.ts | 22 +- .../ui/src/forms/RowLabel/Context/index.tsx | 9 +- packages/ui/src/forms/RowLabel/index.tsx | 6 +- packages/ui/src/forms/RowLabel/types.ts | 15 +- .../WatchChildErrors/buildPathSegments.ts | 26 +- .../getFieldStateFromPaths.ts | 1 + .../WatchChildErrors/getNestedFieldState.ts | 1 + .../ui/src/forms/WatchChildErrors/index.tsx | 10 +- .../addFieldStatePromise.ts | 38 +- .../calculateDefaultValues/promise.ts | 8 +- packages/ui/src/forms/useField/index.tsx | 6 +- .../forms/withCondition/WatchCondition.tsx | 2 +- packages/ui/src/graphics/Account/index.tsx | 33 +- packages/ui/src/hooks/useDebouncedCallback.ts | 1 + packages/ui/src/hooks/useDebouncedEffect.ts | 1 + packages/ui/src/hooks/useDelay.ts | 1 + packages/ui/src/hooks/useDelayedRender.ts | 4 +- packages/ui/src/hooks/useHotkey.ts | 8 +- packages/ui/src/hooks/useIntersect.ts | 6 +- packages/ui/src/hooks/usePayloadAPI.ts | 2 + packages/ui/src/hooks/useResize.ts | 1 - packages/ui/src/hooks/useThrottledEffect.ts | 3 + packages/ui/src/hooks/useUseAsTitle.ts | 11 +- packages/ui/src/icons/Chevron/index.tsx | 2 +- packages/ui/src/icons/LogOut/index.tsx | 3 +- .../Actions/SetViewActions/index.tsx | 5 +- packages/ui/src/providers/Actions/index.tsx | 22 +- packages/ui/src/providers/Auth/index.tsx | 17 +- .../buildComponentMap/actions.tsx | 54 - .../buildComponentMap/collections.tsx | 206 - .../ComponentMap/buildComponentMap/fields.tsx | 868 - .../buildComponentMap/globals.tsx | 138 - .../ComponentMap/buildComponentMap/index.tsx | 111 - .../ComponentMap/buildComponentMap/types.ts | 43 - .../ui/src/providers/ComponentMap/index.tsx | 85 - .../src/providers/Config/RenderComponent.tsx | 88 + .../Config/createClientConfig/collections.tsx | 409 + .../Config/createClientConfig/fields.tsx | 549 + .../Config/createClientConfig/getComponent.ts | 63 + .../getCreateMappedComponent.tsx | 160 + .../Config/createClientConfig/globals.tsx | 230 + .../Config/createClientConfig/index.tsx | 210 + packages/ui/src/providers/Config/index.tsx | 39 +- .../ui/src/providers/DocumentEvents/index.tsx | 2 +- .../ui/src/providers/DocumentInfo/index.tsx | 57 +- .../ui/src/providers/DocumentInfo/types.ts | 4 +- .../src/providers/FieldComponents/index.tsx | 12 +- packages/ui/src/providers/ListInfo/index.tsx | 30 +- packages/ui/src/providers/ListQuery/index.tsx | 35 +- packages/ui/src/providers/Locale/index.tsx | 8 +- .../ui/src/providers/Preferences/index.tsx | 6 +- packages/ui/src/providers/Root/index.tsx | 129 +- .../ui/src/providers/ScrollInfo/index.tsx | 1 + packages/ui/src/providers/Selection/index.tsx | 9 +- .../providers/ToastContainer/icons/Error.tsx | 1 + .../providers/ToastContainer/icons/Info.tsx | 1 + .../ToastContainer/icons/Success.tsx | 1 + .../ToastContainer/icons/Warning.tsx | 1 + .../ui/src/providers/UploadEdits/index.tsx | 1 + .../ui/src/providers/WindowInfo/index.tsx | 3 +- packages/ui/src/scss/app.scss | 18 +- packages/ui/src/scss/toasts.scss | 29 +- packages/ui/src/scss/type.scss | 9 +- packages/ui/src/scss/vars.scss | 2 +- .../ui/src/utilities/buildComponentMap.ts | 3 - .../buildFieldSchemaMap/traverseFields.ts | 1 + packages/ui/src/utilities/buildFormState.ts | 14 +- packages/ui/src/utilities/flattenFieldMap.ts | 24 +- packages/ui/src/utilities/groupNavItems.ts | 12 +- .../reduceFieldsToValuesWithValidation.ts | 10 +- patches/playwright@1.43.0.patch | 71 - pnpm-lock.yaml | 20364 +++++++++------- public/custom-favicon-dark.png | Bin 0 -> 477 bytes public/custom-favicon-light.png | Bin 0 -> 496 bytes scripts/generate-template-variations.ts | 88 +- scripts/lib/getPackageDetails.ts | 4 +- scripts/lib/publishList.ts | 1 + scripts/pack-all-to-dest.ts | 54 +- scripts/set_npm_script.sh | 19 + scripts/utils/updateChangelog.ts | 12 +- templates/_template/README.md | 8 +- templates/_template/package.json | 11 +- .../admin/[[...segments]]/not-found.tsx | 4 +- .../(payload)/admin/[[...segments]]/page.tsx | 4 +- .../src/app/(payload)/admin/importMap.js | 1 + .../_template/src/app/(payload)/layout.tsx | 7 +- templates/_template/src/payload-types.ts | 127 + templates/_template/src/payload.config.ts | 3 + templates/blank-3.0/README.md | 42 - templates/blank/package.json | 13 +- .../admin/[[...segments]]/not-found.tsx | 4 +- .../(payload)/admin/[[...segments]]/page.tsx | 4 +- .../src/app/(payload)/admin/importMap.js | 1 + templates/blank/src/app/(payload)/layout.tsx | 7 +- templates/blank/src/payload-types.ts | 127 + templates/blank/src/payload.config.ts | 12 +- templates/vercel-postgres/.tool-versions | 1 - templates/website/package.json | 38 +- templates/website/pnpm-lock.yaml | 12009 ++++----- .../Footer/index.tsx => Footer/Component.tsx} | 6 +- .../Footer/Footer.ts => Footer/config.ts} | 2 +- .../Footer/hooks/revalidateFooter.ts | 0 .../Component.client.tsx} | 8 +- .../Header/index.tsx => Header/Component.tsx} | 4 +- .../{app/components => }/Header/Nav/index.tsx | 4 +- .../Header/Header.ts => Header/config.ts} | 2 +- .../Header/hooks/revalidateHeader.ts | 0 .../src/{payload => }/access/anyone.ts | 0 .../src/{payload => }/access/authenticated.ts | 6 +- .../access/authenticatedOrPublished.ts | 0 .../src/app/(frontend)/[slug]/page.tsx | 16 +- .../website/src/app/(frontend)/layout.tsx | 25 +- .../{ => (frontend)}/next/exit-preview/GET.ts | 0 .../next/exit-preview/route.ts | 0 .../{ => (frontend)}/next/preview/route.ts | 12 +- .../website/src/app/(frontend)/not-found.tsx | 2 +- .../src/app/(frontend)/posts/[slug]/page.tsx | 30 +- .../website/src/app/(frontend)/posts/page.tsx | 4 +- .../posts/page/[pageNumber]/page.tsx | 6 +- .../admin/[[...segments]]/not-found.tsx | 4 +- .../(payload)/admin/[[...segments]]/page.tsx | 4 +- .../src/app/(payload)/admin/importMap.js | 43 + .../website/src/app/(payload)/layout.tsx | 7 +- .../src/app/blocks/ArchiveBlock/types.ts | 3 - .../ArchiveBlock/Component.tsx} | 24 +- .../ArchiveBlock/config.ts} | 1 + .../index.tsx => blocks/Banner/Component.tsx} | 4 +- .../index.ts => blocks/Banner/config.ts} | 0 .../CallToAction/Component.tsx} | 8 +- .../CallToAction/config.ts} | 1 + .../Code/Component.client.tsx} | 4 +- .../index.tsx => blocks/Code/Component.tsx} | 2 +- .../Code/index.ts => blocks/Code/config.ts} | 1 + .../Content/Component.tsx} | 11 +- .../index.ts => blocks/Content/config.ts} | 3 +- .../{app => }/blocks/Form/Checkbox/index.tsx | 10 +- .../index.tsx => blocks/Form/Component.tsx} | 88 +- .../{app => }/blocks/Form/Country/index.tsx | 0 .../{app => }/blocks/Form/Country/options.ts | 0 .../src/{app => }/blocks/Form/Email/index.tsx | 0 .../src/{app => }/blocks/Form/Error/index.tsx | 0 .../{app => }/blocks/Form/Message/index.tsx | 6 +- .../{app => }/blocks/Form/Number/index.tsx | 0 .../{app => }/blocks/Form/Select/index.tsx | 0 .../src/{app => }/blocks/Form/State/index.tsx | 0 .../{app => }/blocks/Form/State/options.ts | 0 .../src/{app => }/blocks/Form/Text/index.tsx | 0 .../{app => }/blocks/Form/Textarea/index.tsx | 0 .../src/{app => }/blocks/Form/Width/index.tsx | 0 .../blocks/Form/buildInitialFormState.tsx | 2 +- .../Form/index.ts => blocks/Form/config.ts} | 1 + .../src/{app => }/blocks/Form/fields.tsx | 0 .../MediaBlock/Component.tsx} | 10 +- .../index.ts => blocks/MediaBlock/config.ts} | 1 + .../RelatedPosts/Component.tsx} | 4 +- .../index.tsx => blocks/RenderBlocks.tsx} | 21 +- .../{payload => }/collections/Categories.ts | 0 .../src/{payload => }/collections/Media.ts | 0 .../collections/Pages/hooks/revalidatePage.ts | 2 +- .../{payload => }/collections/Pages/index.ts | 16 +- .../Posts/hooks/populateAuthors.ts | 3 +- .../collections/Posts/hooks/revalidatePost.ts | 2 +- .../{payload => }/collections/Posts/index.ts | 10 +- .../{payload => }/collections/Users/index.ts | 0 .../{app => }/components/AdminBar/index.tsx | 8 + .../BeforeDashboard/SeedButton/index.tsx | 0 .../components/BeforeDashboard/index.scss | 0 .../components/BeforeDashboard/index.tsx | 0 .../components/BeforeLogin/index.tsx | 0 .../src/{app => }/components/Card/index.tsx | 4 +- .../components/CollectionArchive/index.tsx | 6 +- .../src/{app => }/components/Link/index.tsx | 20 +- .../components/LivePreviewListener/index.tsx | 2 +- .../src/{app => }/components/Logo/Logo.tsx | 0 .../components/Media/ImageMedia/index.tsx | 8 +- .../components/Media/VideoMedia/index.tsx | 2 +- .../src/{app => }/components/Media/index.tsx | 0 .../src/{app => }/components/Media/types.ts | 2 +- .../{app => }/components/PageRange/index.tsx | 0 .../{app => }/components/Pagination/index.tsx | 0 .../components/PayloadRedirects/index.tsx | 2 +- .../{app => }/components/RichText/index.tsx | 0 .../components/RichText/nodeFormat.tsx | 0 .../components/RichText/serialize.tsx | 16 +- .../src/{app => }/components/ui/button.tsx | 2 +- .../src/{app => }/components/ui/card.tsx | 2 +- .../src/{app => }/components/ui/checkbox.tsx | 2 +- .../src/{app => }/components/ui/input.tsx | 2 +- .../src/{app => }/components/ui/label.tsx | 2 +- .../{app => }/components/ui/pagination.tsx | 2 +- .../src/{app => }/components/ui/select.tsx | 2 +- .../src/{app => }/components/ui/textarea.tsx | 2 +- .../website/src/{app => }/cssVariables.js | 0 .../seed/contact-form.ts | 2 +- .../seed/contact-page.ts | 2 +- .../seed/home-static.ts | 2 +- .../src/{payload => endpoints}/seed/home.ts | 0 .../{payload => endpoints}/seed/image-1.ts | 2 +- .../{payload => endpoints}/seed/image-2.ts | 2 +- .../seed/image-hero1.webp | Bin .../seed/image-post1.webp | Bin .../seed/image-post2.webp | Bin .../seed/image-post3.webp | Bin .../src/{payload => endpoints}/seed/index.ts | 0 .../src/{payload => endpoints}/seed/post-1.ts | 2 +- .../src/{payload => endpoints}/seed/post-2.ts | 2 +- .../src/{payload => endpoints}/seed/post-3.ts | 2 +- .../seed.ts => endpoints/seedHandler.ts} | 4 +- .../website/src/{payload => }/fields/link.ts | 2 +- .../src/{payload => }/fields/linkGroup.ts | 2 +- .../website/src/fields/slug/SlugComponent.tsx | 81 + .../utilities => fields/slug}/formatSlug.ts | 14 +- templates/website/src/fields/slug/index.scss | 12 + templates/website/src/fields/slug/index.ts | 54 + .../src/{app => }/heros/HighImpact/index.tsx | 12 +- .../src/{app => }/heros/LowImpact/index.tsx | 6 +- .../{app => }/heros/MediumImpact/index.tsx | 13 +- .../src/{app => }/heros/PostHero/index.tsx | 6 +- .../Hero/index.tsx => heros/RenderHero.tsx} | 10 +- .../fields/hero.ts => heros/config.ts} | 2 +- .../src/{payload => }/hooks/formatSlug.ts | 0 .../hooks/populatePublishedAt.ts | 0 .../hooks/revalidateRedirects.ts | 0 templates/website/src/payload-types.ts | 318 +- templates/website/src/payload.config.ts | 37 +- templates/website/src/payload/fields/slug.ts | 23 - .../{app => }/providers/HeaderTheme/index.tsx | 6 +- .../providers/Theme/InitTheme/index.tsx | 0 .../providers/Theme/ThemeSelector/index.tsx | 0 .../providers/Theme/ThemeSelector/types.ts | 0 .../src/{app => }/providers/Theme/index.tsx | 2 +- .../src/{app => }/providers/Theme/shared.ts | 0 .../src/{app => }/providers/Theme/types.ts | 0 .../website/src/{app => }/providers/index.tsx | 0 .../src/{app => }/utilities/canUseDOM.ts | 0 .../website/src/{app => }/utilities/cn.ts | 0 .../src/{payload => }/utilities/deepMerge.ts | 0 .../src/{app => }/utilities/formatDateTime.ts | 0 .../src/{app => }/utilities/generateMeta.ts | 4 +- .../utilities/generatePreviewPath.ts | 0 .../src/{app => }/utilities/getDocument.ts | 0 .../src/{app => }/utilities/getGlobals.ts | 0 .../src/{app => }/utilities/getMeUser.ts | 5 +- .../src/{app => }/utilities/getRedirects.ts | 0 .../src/{app => }/utilities/mergeOpenGraph.ts | 0 .../src/{app => }/utilities/toKebabCase.ts | 0 .../{app => }/utilities/useClickableCard.ts | 4 +- templates/website/tsconfig.json | 5 +- templates/with-payload-cloud/.env.example | 2 +- templates/with-payload-cloud/package.json | 11 +- .../admin/[[...segments]]/not-found.tsx | 4 +- .../(payload)/admin/[[...segments]]/page.tsx | 4 +- .../src/app/(payload)/admin/importMap.js | 1 + .../src/app/(payload)/layout.tsx | 7 +- .../with-payload-cloud/src/payload-types.ts | 127 + .../with-payload-cloud/src/payload.config.ts | 3 + .../{blank-3.0 => with-postgres}/.env.example | 2 +- .../.eslintrc.cjs | 0 .../{blank-3.0 => with-postgres}/.gitignore | 0 .../.prettierrc.json | 0 .../{blank-3.0 => with-postgres}/.yarnrc | 0 .../{blank-3.0 => with-postgres}/Dockerfile | 0 templates/with-postgres/README.md | 8 + .../docker-compose.yml | 0 .../next.config.mjs | 0 .../{blank-3.0 => with-postgres}/package.json | 17 +- .../admin/[[...segments]]/not-found.tsx | 4 +- .../(payload)/admin/[[...segments]]/page.tsx | 4 +- .../src/app/(payload)/admin/importMap.js | 1 + .../src/app/(payload)/api/[...slug]/route.ts | 0 .../(payload)/api/graphql-playground/route.ts | 0 .../src/app/(payload)/api/graphql/route.ts | 0 .../src/app/(payload)/custom.scss | 0 .../src/app/(payload)/layout.tsx | 7 +- .../src/app/my-route/route.ts | 0 .../src/collections/Media.ts | 0 .../src/collections/Users.ts | 0 .../with-postgres/src/migrations/initial.json | 375 + .../with-postgres/src/migrations/initial.ts | 93 + templates/with-postgres/src/payload-types.ts | 127 + .../src/payload.config.ts | 18 +- .../tsconfig.json | 0 templates/with-vercel-mongodb/.env.example | 4 +- templates/with-vercel-mongodb/package.json | 11 +- .../admin/[[...segments]]/not-found.tsx | 4 +- .../(payload)/admin/[[...segments]]/page.tsx | 4 +- .../src/app/(payload)/admin/importMap.js | 1 + .../src/app/(payload)/layout.tsx | 7 +- .../with-vercel-mongodb/src/payload-types.ts | 127 + .../with-vercel-mongodb/src/payload.config.ts | 3 + templates/with-vercel-postgres/.env.example | 4 +- templates/with-vercel-postgres/README.md | 2 +- templates/with-vercel-postgres/package.json | 13 +- .../admin/[[...segments]]/not-found.tsx | 4 +- .../(payload)/admin/[[...segments]]/page.tsx | 4 +- .../src/app/(payload)/admin/importMap.js | 1 + .../src/app/(payload)/layout.tsx | 7 +- .../with-vercel-postgres/src/payload-types.ts | 127 + .../src/payload.config.ts | 7 +- .../_community/collections/Posts/MyAvatar.tsx | 6 + .../collections/Posts/MyComponent.tsx | 14 +- .../collections/Posts/MyComponent2.tsx | 6 + test/_community/collections/Posts/index.ts | 50 +- test/_community/config.ts | 79 +- test/_community/eslint.config.js | 3 +- test/_community/int.spec.ts | 8 +- test/_community/payload-types.ts | 89 +- test/_community/tsconfig.json | 2 +- .../collections/Disabled/index.ts | 2 +- test/access-control/config.ts | 6 +- test/access-control/eslint.config.js | 3 +- test/access-control/int.spec.ts | 9 +- test/access-control/payload-types.ts | 4 + test/admin-root/.gitignore | 2 + .../(payload)/[[...segments]]/not-found.tsx | 5 +- .../app/(payload)/[[...segments]]/page.tsx | 5 +- test/admin-root/app/(payload)/admin/ignore | 1 + test/admin-root/app/(payload)/layout.tsx | 7 +- test/admin-root/config.ts | 3 + test/admin-root/eslint.config.js | 3 +- test/admin-root/int.spec.ts | 9 +- test/admin-root/next.config.mjs | 9 + test/admin-root/payload-types.ts | 2 + test/admin-root/schema.graphql | 26 +- .../collections/CustomFields/AfterInput.tsx | 2 +- .../collections/CustomFields/BeforeInput.tsx | 2 +- .../CustomFields/FieldDescription/index.tsx | 4 +- .../CustomFields/fields/Select/index.tsx | 9 +- .../CustomFields/fields/Text/Description.tsx | 9 - .../fields/Text/DescriptionClient.tsx | 10 + .../fields/Text/DescriptionServer.tsx | 9 + .../CustomFields/fields/Text/Label.tsx | 7 - .../CustomFields/fields/Text/LabelClient.tsx | 10 + .../CustomFields/fields/Text/LabelServer.tsx | 9 + test/admin/collections/CustomFields/index.ts | 43 +- test/admin/collections/CustomViews1.ts | 10 +- test/admin/collections/CustomViews2.ts | 61 +- test/admin/collections/Geo.ts | 17 +- test/admin/collections/Posts.ts | 11 +- test/admin/components/AdminButton/index.tsx | 6 +- .../admin/components/AfterDashboard/index.tsx | 6 +- .../components/AfterDashboardClient/index.tsx | 17 + test/admin/components/AfterNavLinks/index.tsx | 10 +- test/admin/components/BeforeLogin/index.tsx | 6 +- .../components/CollectionAPIButton/index.tsx | 4 +- .../components/CollectionEditButton/index.tsx | 4 +- .../components/CollectionListButton/index.tsx | 4 +- .../components/CustomTabComponent/client.tsx | 9 +- test/admin/components/Logout/index.tsx | 11 +- test/admin/components/TestComponent.tsx | 6 + .../components/ViewDescription/index.tsx | 7 + .../components/views/CustomAccount/index.tsx | 4 +- .../views/CustomDashboard/index.tsx | 4 +- .../components/views/CustomDefault/index.tsx | 4 +- .../components/views/CustomEdit/index.tsx | 8 +- .../views/CustomEditDefault/index.tsx | 10 +- .../components/views/CustomMinimal/index.tsx | 4 +- .../components/views/CustomTabLabel/index.tsx | 6 +- .../views/CustomTabNested/index.tsx | 6 +- .../components/views/CustomVersions/index.tsx | 10 +- .../views/CustomView/index.client.tsx | 8 +- .../components/views/CustomView/index.tsx | 4 +- .../views/CustomViewNested/index.tsx | 4 +- .../views/CustomViewWithParam/index.tsx | 4 +- test/admin/config.ts | 64 +- test/admin/e2e/1/e2e.spec.ts | 305 +- test/admin/e2e/2/e2e.spec.ts | 79 +- test/admin/eslint.config.js | 3 +- test/admin/globals/CustomViews1.ts | 7 +- test/admin/globals/CustomViews2.ts | 29 +- test/admin/globals/Global.ts | 12 +- test/admin/payload-types.ts | 5 +- test/admin/seed.ts | 4 +- test/admin/shared.ts | 11 + test/app/(app)/layout.tsx | 14 + test/app/(app)/test/page.tsx | 11 + .../admin/[[...segments]]/not-found.tsx | 25 + .../(payload)/admin/[[...segments]]/page.tsx | 25 + test/app/(payload)/api/[...slug]/route.ts | 10 + .../(payload)/api/graphql-playground/route.ts | 6 + test/app/(payload)/api/graphql/route.ts | 6 + test/app/(payload)/custom.scss | 8 + test/app/(payload)/layout.tsx | 24 + test/app/my-route/route.ts | 5 + test/array-update/config.ts | 5 + test/array-update/eslint.config.js | 3 +- test/array-update/int.spec.ts | 9 +- test/array-update/payload-types.ts | 10 +- test/auth/config.ts | 6 +- test/auth/custom-strategy/config.ts | 3 + test/auth/custom-strategy/int.spec.ts | 9 +- test/auth/e2e.spec.ts | 25 +- test/auth/eslint.config.js | 3 +- test/auth/int.spec.ts | 8 +- test/auth/payload-types.ts | 6 + test/auth/removed-token/config.ts | 9 + test/auth/removed-token/int.spec.ts | 10 +- test/buildConfigWithDefaults.ts | 47 +- test/collections-graphql/config.ts | 5 + test/collections-graphql/eslint.config.js | 3 +- test/collections-graphql/int.spec.ts | 4 +- test/collections-graphql/payload-types.ts | 12 +- test/collections-rest/config.ts | 5 + test/collections-rest/eslint.config.js | 3 +- test/collections-rest/int.spec.ts | 9 +- test/collections-rest/payload-types.ts | 10 +- test/config/config.ts | 5 + test/config/eslint.config.js | 3 +- test/config/int.spec.ts | 9 +- test/config/payload-types.ts | 10 +- test/create-payload-app/eslint.config.js | 3 +- test/custom-graphql/config.ts | 5 + test/custom-graphql/eslint.config.js | 3 +- test/custom-graphql/int.spec.ts | 9 +- test/custom-graphql/payload-types.ts | 10 +- test/database/config.ts | 5 + test/database/eslint.config.js | 3 +- test/database/int.spec.ts | 12 +- test/database/payload-types.ts | 33 +- test/databaseAdapter.ts | 13 + test/dataloader/config.ts | 5 + test/dataloader/eslint.config.js | 3 +- test/dataloader/int.spec.ts | 10 +- test/dataloader/payload-types.ts | 10 +- test/{dev.js => dev.ts} | 26 +- test/email-nodemailer/config.ts | 6 +- test/email-nodemailer/eslint.config.js | 3 +- test/email-nodemailer/payload-types.ts | 10 +- test/email-resend/config.ts | 6 +- test/email-resend/eslint.config.js | 3 +- test/email-resend/payload-types.ts | 10 +- test/email/config.ts | 6 +- test/email/eslint.config.js | 3 +- test/email/payload-types.ts | 12 +- test/endpoints/config.ts | 5 + test/endpoints/eslint.config.js | 3 +- test/endpoints/int.spec.ts | 8 +- test/endpoints/payload-types.ts | 10 +- test/eslint.config.js | 3 +- test/field-error-states/config.ts | 5 + test/field-error-states/eslint.config.js | 3 +- test/field-error-states/payload-types.ts | 4 +- test/field-perf/config.ts | 5 + test/field-perf/eslint.config.js | 3 +- test/field-perf/payload-types.ts | 10 +- .../VersionedRelationshipField/index.ts | 4 +- test/fields-relationship/config.ts | 32 +- test/fields-relationship/e2e.spec.ts | 69 + test/fields-relationship/eslint.config.js | 3 +- test/fields-relationship/int.spec.ts | 9 +- test/fields-relationship/payload-types.ts | 1 + .../collections/Array/LabelComponent.tsx | 4 +- test/fields/collections/Array/index.ts | 3 +- test/fields/collections/Blocks/index.ts | 3 +- .../CustomLabel/getCustomLabel.tsx | 16 +- test/fields/collections/Collapsible/index.ts | 23 +- test/fields/collections/Email/CustomError.tsx | 4 +- test/fields/collections/Email/CustomLabel.tsx | 4 +- test/fields/collections/Email/index.ts | 12 +- test/fields/collections/Group/index.ts | 1 - .../collections/Lexical/LabelComponent.tsx | 6 +- .../Lexical/e2e/blocks/e2e.spec.ts | 20 +- .../collections/Lexical/e2e/main/e2e.spec.ts | 40 +- test/fields/collections/Lexical/index.ts | 14 +- .../collections/LexicalMigrate/index.ts | 12 +- .../collections/LexicalRelationships/index.ts | 37 + test/fields/collections/Number/e2e.spec.ts | 4 +- test/fields/collections/RichText/e2e.spec.ts | 3 +- test/fields/collections/RichText/index.ts | 4 +- test/fields/collections/Tabs/index.ts | 15 +- test/fields/collections/UI/index.ts | 3 +- test/fields/collections/Upload/e2e.spec.ts | 42 +- .../fields/collections/UploadMulti/.gitignore | 1 + test/fields/collections/UploadMulti/index.ts | 21 + test/fields/collections/UploadMulti/shared.ts | 5 + .../collections/UploadMultiPoly/.gitignore | 1 + .../collections/UploadMultiPoly/index.ts | 21 + .../collections/UploadMultiPoly/shared.ts | 5 + test/fields/collections/UploadPoly/.gitignore | 1 + test/fields/collections/UploadPoly/index.ts | 20 + test/fields/collections/UploadPoly/shared.ts | 5 + test/fields/config.ts | 11 + test/fields/e2e.spec.ts | 34 +- test/fields/eslint.config.js | 3 +- test/fields/int.spec.ts | 10 +- test/fields/lexical.int.spec.ts | 16 +- test/fields/payload-types.ts | 101 +- test/fields/seed.ts | 62 +- test/fields/slugs.ts | 5 + test/generateGraphQLSchema.ts | 14 +- test/generateImportMap.ts | 33 + test/generateTypes.ts | 11 +- test/getDatabaseAdapter.js | 61 + test/globals/config.ts | 5 + test/globals/eslint.config.js | 3 +- test/globals/int.spec.ts | 10 +- test/globals/payload-types.ts | 10 +- test/graphql-schema-gen/config.ts | 5 + test/graphql-schema-gen/eslint.config.js | 3 +- test/graphql-schema-gen/payload-types.ts | 10 +- test/helpers/build.js | 2 +- test/helpers/e2e/reorderColumns.ts | 55 + test/helpers/getNextJSRootDir.js | 41 - test/helpers/getNextRootDir.ts | 57 + test/helpers/initPayloadE2E.ts | 13 +- test/helpers/initPayloadE2ENoConfig.ts | 11 +- test/helpers/initPayloadInt.ts | 16 +- test/helpers/setTestEnvPaths.ts | 2 +- test/helpers/startMemoryDB.ts | 2 +- test/hooks/config.ts | 5 + test/hooks/eslint.config.js | 3 +- test/hooks/int.spec.ts | 9 +- test/hooks/payload-types.ts | 10 +- test/i18n/config.ts | 18 +- test/i18n/e2e.spec.ts | 2 +- test/i18n/eslint.config.js | 3 +- test/i18n/payload-types.ts | 10 +- test/initDevAndTest.ts | 76 + test/jest.config.js | 2 +- test/jest.setup.env.js | 1 - test/jest.setup.js | 28 +- test/live-preview/.gitignore | 2 + .../admin/[[...segments]]/not-found.tsx | 5 +- .../(payload)/admin/[[...segments]]/page.tsx | 5 +- test/live-preview/app/(payload)/layout.tsx | 7 +- test/live-preview/collections/Pages.ts | 9 +- .../CollectionLivePreviewButton/index.tsx | 8 +- .../GlobalLivePreviewButton/index.tsx | 8 +- test/live-preview/config.ts | 3 + test/live-preview/eslint.config.js | 3 +- test/live-preview/globals/Footer.ts | 7 +- test/live-preview/int.spec.ts | 94 +- test/live-preview/next.config.mjs | 14 +- test/live-preview/payload-types.ts | 22 +- test/loader/dependency-test.js | 2 +- test/loader/fileWithCJSImport.ts | 4 +- test/loader/init.js | 6 +- test/loader/int.spec.ts | 5 - test/loader/load.js | 26 - test/loader/server-only-test.ts | 3 - test/loader/startChildProcess.ts | 25 +- test/localization-rtl/config.ts | 5 + test/localization-rtl/eslint.config.js | 3 +- test/localization-rtl/payload-types.ts | 10 +- test/localization/collections/Blocks/index.ts | 53 + .../LocalizedWithinLocalized/index.ts | 65 + .../collections/NestedArray/index.ts | 65 + .../collections/NestedFields/index.ts | 47 + test/localization/config.ts | 13 + test/localization/eslint.config.js | 3 +- test/localization/int.spec.ts | 398 +- test/localization/payload-types.ts | 187 +- test/login-with-username/int.spec.ts | 79 +- test/migrations-cli/config.ts | 5 + test/migrations-cli/eslint.config.js | 3 +- test/migrations-cli/payload-types.ts | 10 +- test/nested-fields/config.ts | 5 + test/nested-fields/eslint.config.js | 3 +- test/nested-fields/payload-types.ts | 10 +- test/next.config.mjs | 49 + test/package.json | 9 +- test/playwright.config.ts | 6 +- test/plugin-cloud-storage/config.ts | 5 + test/plugin-cloud-storage/eslint.config.js | 3 +- test/plugin-cloud-storage/int.spec.ts | 8 +- test/plugin-cloud-storage/payload-types.ts | 10 +- test/plugin-cloud/config.ts | 5 + test/plugin-cloud/eslint.config.js | 3 +- test/plugin-cloud/int.spec.ts | 9 +- test/plugin-cloud/payload-types.ts | 10 +- test/plugin-form-builder/config.ts | 14 +- test/plugin-form-builder/eslint.config.js | 3 +- test/plugin-form-builder/int.spec.ts | 8 +- test/plugin-form-builder/payload-types.ts | 2 + test/plugin-nested-docs/collections/Pages.ts | 2 +- test/plugin-nested-docs/config.ts | 5 + test/plugin-nested-docs/eslint.config.js | 3 +- test/plugin-nested-docs/int.spec.ts | 9 +- test/plugin-nested-docs/payload-types.ts | 10 +- test/plugin-redirects/config.ts | 9 + test/plugin-redirects/eslint.config.js | 3 +- test/plugin-redirects/int.spec.ts | 11 +- test/plugin-redirects/payload-types.ts | 11 +- test/plugin-relationship-object-ids/config.ts | 5 + .../eslint.config.js | 3 +- .../int.spec.ts | 9 +- .../payload-types.ts | 12 +- test/plugin-search/config.ts | 5 + test/plugin-search/eslint.config.js | 3 +- test/plugin-search/int.spec.ts | 8 +- test/plugin-search/payload-types.ts | 2 + test/plugin-sentry/components.tsx | 1 + test/plugin-sentry/config.ts | 6 +- test/plugin-sentry/eslint.config.js | 3 +- test/plugin-sentry/int.spec.ts | 9 +- test/plugin-sentry/payload-types.ts | 10 +- test/plugin-seo/config.ts | 5 + test/plugin-seo/eslint.config.js | 3 +- test/plugin-seo/int.spec.ts | 3 +- test/plugin-seo/payload-types.ts | 8 +- test/plugin-stripe/collections/Customers.ts | 4 +- test/plugin-stripe/config.ts | 5 + test/plugin-stripe/eslint.config.js | 3 +- test/plugin-stripe/int.spec.ts | 9 +- test/plugin-stripe/payload-types.ts | 17 +- test/plugins/config.ts | 5 + test/plugins/eslint.config.js | 3 +- test/plugins/int.spec.ts | 10 +- test/plugins/payload-types.ts | 10 +- test/relationships/config.ts | 5 + test/relationships/eslint.config.js | 3 +- test/relationships/int.spec.ts | 8 +- test/relationships/payload-types.ts | 10 +- test/runE2E.ts | 7 + test/runInit.ts | 9 + test/runInitSeparateProcess.ts | 62 + test/setupProd.ts | 92 + test/storage-azure/config.ts | 5 + test/storage-azure/eslint.config.js | 3 +- test/storage-azure/payload-types.ts | 10 +- test/storage-gcs/config.ts | 5 + test/storage-gcs/eslint.config.js | 3 +- test/storage-gcs/payload-types.ts | 10 +- test/storage-s3/config.ts | 5 + test/storage-s3/eslint.config.js | 3 +- test/storage-s3/int.spec.ts | 6 +- test/storage-s3/payload-types.ts | 10 +- test/storage-uploadthing/config.ts | 5 + test/storage-uploadthing/eslint.config.js | 3 +- test/storage-vercel-blob/config.ts | 5 + test/storage-vercel-blob/eslint.config.js | 3 +- test/{testHooks.js => testHooks.ts} | 17 +- test/tsconfig.json | 7 +- .../components/CustomUpload/index.tsx | 6 +- .../collections/CustomUploadField/index.ts | 3 +- test/uploads/collections/Upload1/index.ts | 13 +- test/uploads/config.ts | 61 + test/uploads/e2e.spec.ts | 32 +- test/uploads/eslint.config.js | 3 +- test/uploads/int.spec.ts | 3 +- test/uploads/payload-types.ts | 90 +- test/uploads/shared.ts | 1 + test/versions/collections/Drafts.ts | 15 +- test/versions/collections/DraftsWithMax.ts | 15 +- test/versions/collections/Localized.ts | 24 + test/versions/config.ts | 33 +- test/versions/e2e.spec.ts | 95 +- test/versions/eslint.config.js | 3 +- test/versions/globals/Draft.ts | 12 +- test/versions/globals/DraftWithMax.ts | 12 +- test/versions/globals/LocalizedGlobal.ts | 24 + test/versions/int.spec.ts | 8 +- test/versions/localized.int.spec.ts | 578 + test/versions/payload-types.ts | 38 +- test/versions/slugs.ts | 4 + tsconfig.json | 24 + turbo.json | 8 +- 2259 files changed, 87141 insertions(+), 43436 deletions(-) create mode 100644 .idea/runConfigurations/Run_Dev_admin.xml create mode 100644 .tool-versions create mode 100644 app/(app)/layout.tsx create mode 100644 app/(app)/test/page.tsx create mode 100644 docs/admin/metadata.mdx create mode 100644 examples/multi-tenant-single-domain/src/app/(payload)/admin/importMap.js create mode 100644 examples/multi-tenant-single-domain/src/fields/TenantField/components/Field.client.tsx create mode 100644 packages/create-payload-app/src/lib/download-template.ts delete mode 100644 packages/db-sqlite/.eslintrc.cjs create mode 100644 packages/db-sqlite/eslint.config.js create mode 100644 packages/db-vercel-postgres/.gitignore rename packages/{db-sqlite/.eslintignore => db-vercel-postgres/.prettierignore} (100%) create mode 100644 packages/db-vercel-postgres/.swcrc create mode 100644 packages/db-vercel-postgres/README.md create mode 100644 packages/db-vercel-postgres/eslint.config.js create mode 100644 packages/db-vercel-postgres/package.json create mode 100644 packages/db-vercel-postgres/relationships-v2-v3.mjs create mode 100644 packages/db-vercel-postgres/scripts/renamePredefinedMigrations.ts create mode 100644 packages/db-vercel-postgres/src/connect.ts create mode 100644 packages/db-vercel-postgres/src/exports/migration-utils.ts create mode 100644 packages/db-vercel-postgres/src/index.ts create mode 100644 packages/db-vercel-postgres/src/predefinedMigrations/relationships-v2-v3.ts create mode 100644 packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/index.ts create mode 100644 packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.ts create mode 100644 packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/groupUpSQLStatements.ts create mode 100644 packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/index.ts create mode 100644 packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts create mode 100644 packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts create mode 100644 packages/db-vercel-postgres/src/predefinedMigrations/v2-v3/types.ts create mode 100644 packages/db-vercel-postgres/src/types.ts create mode 100644 packages/db-vercel-postgres/tsconfig.json delete mode 100644 packages/drizzle/.eslintignore create mode 100644 packages/drizzle/src/exports/postgres.ts rename packages/{db-postgres/src => drizzle/src/postgres}/countDistinct.ts (75%) rename packages/{db-postgres/src => drizzle/src/postgres}/createJSONQuery/convertPathToJSONTraversal.ts (100%) rename packages/{db-postgres/src => drizzle/src/postgres}/createJSONQuery/formatJSONPathSegment.ts (100%) rename packages/{db-postgres/src => drizzle/src/postgres}/createJSONQuery/index.ts (100%) rename packages/{db-postgres/src => drizzle/src/postgres}/createMigration.ts (96%) rename packages/{db-postgres/src => drizzle/src/postgres}/defaultSnapshot.ts (100%) rename packages/{db-postgres/src => drizzle/src/postgres}/deleteWhere.ts (78%) rename packages/{db-postgres/src => drizzle/src/postgres}/dropDatabase.ts (100%) rename packages/{db-postgres/src => drizzle/src/postgres}/execute.ts (100%) rename packages/{db-postgres/src => drizzle/src/postgres}/getMigrationTemplate.ts (64%) rename packages/{db-postgres/src => drizzle/src/postgres}/init.ts (73%) rename packages/{db-postgres/src => drizzle/src/postgres}/insert.ts (89%) rename packages/{db-postgres/src => drizzle/src/postgres}/requireDrizzleKit.ts (71%) rename packages/{db-postgres/src => drizzle/src/postgres}/schema/build.ts (94%) rename packages/{db-postgres/src => drizzle/src/postgres}/schema/createIndex.ts (100%) rename packages/{db-postgres/src => drizzle/src/postgres}/schema/idToUUID.ts (100%) rename packages/{db-postgres/src => drizzle/src/postgres}/schema/parentIDColumnMap.ts (100%) rename packages/{db-postgres/src => drizzle/src/postgres}/schema/setColumnID.ts (83%) rename packages/{db-postgres/src => drizzle/src/postgres}/schema/traverseFields.ts (89%) rename packages/{db-postgres/src => drizzle/src/postgres}/schema/withDefault.ts (100%) create mode 100644 packages/drizzle/src/postgres/types.ts create mode 100644 packages/eslint-plugin/customRules/no-imports-from-self.js delete mode 100644 packages/graphql/src/utilities/getCheckIfLocaleObject.ts delete mode 100644 packages/graphql/src/utilities/uppercase.ts create mode 100644 packages/next/babel.config.cjs create mode 100644 packages/next/src/views/Account/index.client.tsx create mode 100644 packages/next/src/views/Root/generateCustomViewMetadata.ts create mode 100644 packages/next/src/views/Root/getCustomViewByRoute.ts delete mode 100644 packages/next/src/views/Root/getCustomViewByRoute.tsx rename packages/next/src/views/Root/{getViewFromConfig.tsx => getViewFromConfig.ts} (78%) delete mode 100644 packages/payload/src/admin/fields/index.ts create mode 100644 packages/payload/src/admin/forms/Description.ts delete mode 100644 packages/payload/src/admin/forms/FieldDescription.ts delete mode 100644 packages/payload/src/admin/forms/FieldMap.ts delete mode 100644 packages/payload/src/admin/forms/FieldTypes.ts create mode 100644 packages/payload/src/bin/generateImportMap/index.ts create mode 100644 packages/payload/src/bin/generateImportMap/iterateCollections.ts create mode 100644 packages/payload/src/bin/generateImportMap/iterateConfig.ts create mode 100644 packages/payload/src/bin/generateImportMap/iterateFields.ts create mode 100644 packages/payload/src/bin/generateImportMap/iterateGlobals.ts create mode 100644 packages/payload/src/bin/generateImportMap/parsePayloadComponent.ts create mode 100644 packages/payload/src/bin/info.ts delete mode 100644 packages/payload/src/bin/loader/clientExtensions.ts delete mode 100644 packages/payload/src/bin/loader/compile.ts delete mode 100644 packages/payload/src/bin/loader/ignores.ts delete mode 100644 packages/payload/src/bin/loader/index.ts delete mode 100644 packages/payload/src/bin/loader/read-default-tsconfig.ts delete mode 100644 packages/payload/src/bin/loader/resolveOriginalPath.ts create mode 100644 packages/payload/src/checkPayloadDependencies.ts create mode 100644 packages/payload/src/utilities/dependencies/dependencyChecker.ts create mode 100644 packages/payload/src/utilities/dependencies/versionUtils.ts delete mode 100644 packages/payload/src/utilities/importWithoutClientFiles.ts create mode 100644 packages/payload/src/versions/payloadPackageList.ts create mode 100644 packages/plugin-form-builder/src/exports/client.ts create mode 100644 packages/plugin-redirects/src/redirectTypes.ts create mode 100644 packages/plugin-search/src/exports/client.ts create mode 100644 packages/plugin-seo/src/exports/client.ts create mode 100644 packages/plugin-seo/src/translations/it.json create mode 100644 packages/plugin-stripe/src/exports/client.ts create mode 100644 packages/richtext-lexical/babel.config.cjs create mode 100644 packages/richtext-lexical/src/exports/server/migrate.ts rename packages/richtext-lexical/src/features/align/{feature.client.tsx => client/index.tsx} (89%) rename packages/richtext-lexical/src/features/align/{ => client}/toolbarAlignGroup.ts (55%) delete mode 100644 packages/richtext-lexical/src/features/align/feature.server.ts rename packages/richtext-lexical/src/features/align/{ => server}/i18n.ts (100%) create mode 100644 packages/richtext-lexical/src/features/align/server/index.ts rename packages/richtext-lexical/src/features/blockquote/{feature.client.tsx => client/index.tsx} (79%) rename packages/richtext-lexical/src/features/blockquote/{ => server}/i18n.ts (100%) rename packages/richtext-lexical/src/features/blockquote/{feature.server.ts => server/index.ts} (74%) rename packages/richtext-lexical/src/features/blocks/{ => client}/component/BlockContent.tsx (74%) rename packages/richtext-lexical/src/features/blocks/{ => client}/component/FormSavePlugin.tsx (98%) rename packages/richtext-lexical/src/features/blocks/{ => client}/component/index.scss (89%) rename packages/richtext-lexical/src/features/blocks/{ => client}/component/index.tsx (61%) rename packages/richtext-lexical/src/features/blocks/{ => client}/component/removeEmptyArrayValues.ts (97%) rename packages/richtext-lexical/src/features/blocks/{ => client}/componentInline/index.scss (51%) rename packages/richtext-lexical/src/features/blocks/{ => client}/componentInline/index.tsx (77%) create mode 100644 packages/richtext-lexical/src/features/blocks/client/index.tsx create mode 100644 packages/richtext-lexical/src/features/blocks/client/nodes/BlocksNode.tsx create mode 100644 packages/richtext-lexical/src/features/blocks/client/nodes/InlineBlocksNode.tsx rename packages/richtext-lexical/src/features/blocks/{ => client}/plugin/commands.ts (97%) rename packages/richtext-lexical/src/features/blocks/{ => client}/plugin/index.tsx (73%) delete mode 100644 packages/richtext-lexical/src/features/blocks/feature.client.tsx rename packages/richtext-lexical/src/features/blocks/{ => server}/graphQLPopulationPromise.ts (81%) rename packages/richtext-lexical/src/features/blocks/{ => server}/i18n.ts (100%) rename packages/richtext-lexical/src/features/blocks/{feature.server.ts => server/index.ts} (54%) rename packages/richtext-lexical/src/features/blocks/{ => server}/nodes/BlocksNode.tsx (77%) rename packages/richtext-lexical/src/features/blocks/{ => server}/nodes/InlineBlocksNode.tsx (68%) rename packages/richtext-lexical/src/features/blocks/{ => server}/validate.ts (90%) rename packages/richtext-lexical/src/features/converters/html/{feature.server.ts => index.ts} (100%) rename packages/richtext-lexical/src/features/debug/testRecorder/{feature.client.tsx => client/index.tsx} (73%) rename packages/richtext-lexical/src/features/debug/testRecorder/{ => client}/plugin/index.scss (95%) rename packages/richtext-lexical/src/features/debug/testRecorder/{ => client}/plugin/index.tsx (98%) delete mode 100644 packages/richtext-lexical/src/features/debug/testRecorder/feature.server.ts create mode 100644 packages/richtext-lexical/src/features/debug/testRecorder/server/index.ts rename packages/richtext-lexical/src/features/debug/treeView/{feature.client.tsx => client/index.tsx} (72%) rename packages/richtext-lexical/src/features/debug/treeView/{ => client}/plugin/index.scss (100%) rename packages/richtext-lexical/src/features/debug/treeView/{ => client}/plugin/index.tsx (91%) delete mode 100644 packages/richtext-lexical/src/features/debug/treeView/feature.server.ts create mode 100644 packages/richtext-lexical/src/features/debug/treeView/server/index.ts rename packages/richtext-lexical/src/features/experimental_table/{feature.client.ts => client/index.ts} (83%) rename packages/richtext-lexical/src/features/experimental_table/{ => client}/plugins/TableActionMenuPlugin/index.scss (96%) rename packages/richtext-lexical/src/features/experimental_table/{ => client}/plugins/TableActionMenuPlugin/index.tsx (97%) rename packages/richtext-lexical/src/features/experimental_table/{ => client}/plugins/TableCellResizerPlugin/index.tsx (98%) rename packages/richtext-lexical/src/features/experimental_table/{ => client}/plugins/TableHoverActionsPlugin/index.tsx (94%) rename packages/richtext-lexical/src/features/experimental_table/{ => client}/plugins/TablePlugin/index.scss (87%) rename packages/richtext-lexical/src/features/experimental_table/{ => client}/plugins/TablePlugin/index.tsx (84%) rename packages/richtext-lexical/src/features/experimental_table/{ => client}/utils/debounce.ts (99%) rename packages/richtext-lexical/src/features/experimental_table/{ => client}/utils/useDebounce.ts (89%) rename packages/richtext-lexical/src/features/experimental_table/{feature.server.ts => server/index.ts} (87%) rename packages/richtext-lexical/src/features/heading/{feature.client.tsx => client/index.tsx} (78%) rename packages/richtext-lexical/src/features/heading/{ => server}/i18n.ts (100%) rename packages/richtext-lexical/src/features/heading/{feature.server.ts => server/index.ts} (79%) rename packages/richtext-lexical/src/features/horizontalRule/{ => client}/component/index.tsx (100%) rename packages/richtext-lexical/src/features/horizontalRule/{feature.client.tsx => client/index.tsx} (75%) rename packages/richtext-lexical/src/features/horizontalRule/{ => client}/markdownTransformer.ts (100%) create mode 100644 packages/richtext-lexical/src/features/horizontalRule/client/nodes/HorizontalRuleNode.tsx rename packages/richtext-lexical/src/features/horizontalRule/{ => client}/plugin/index.scss (90%) rename packages/richtext-lexical/src/features/horizontalRule/{ => client}/plugin/index.tsx (82%) delete mode 100644 packages/richtext-lexical/src/features/horizontalRule/feature.server.ts rename packages/richtext-lexical/src/features/horizontalRule/{ => server}/i18n.ts (100%) create mode 100644 packages/richtext-lexical/src/features/horizontalRule/server/index.ts create mode 100644 packages/richtext-lexical/src/features/horizontalRule/server/markdownTransformer.ts rename packages/richtext-lexical/src/features/horizontalRule/{ => server}/nodes/HorizontalRuleNode.tsx (74%) rename packages/richtext-lexical/src/features/indent/{feature.client.tsx => client/index.tsx} (83%) rename packages/richtext-lexical/src/features/indent/{ => client}/toolbarIndentGroup.ts (65%) delete mode 100644 packages/richtext-lexical/src/features/indent/feature.server.ts rename packages/richtext-lexical/src/features/indent/{ => server}/i18n.ts (100%) create mode 100644 packages/richtext-lexical/src/features/indent/server/index.ts rename packages/richtext-lexical/src/features/link/{feature.client.tsx => client/index.tsx} (80%) rename packages/richtext-lexical/src/features/link/{ => client}/plugins/autoLink/index.tsx (96%) rename packages/richtext-lexical/src/features/link/{ => client}/plugins/clickableLink/index.tsx (68%) rename packages/richtext-lexical/src/features/link/{ => client}/plugins/floatingLinkEditor/LinkEditor/commands.ts (95%) rename packages/richtext-lexical/src/features/link/{ => client}/plugins/floatingLinkEditor/LinkEditor/index.tsx (92%) rename packages/richtext-lexical/src/features/link/{ => client}/plugins/floatingLinkEditor/index.scss (57%) rename packages/richtext-lexical/src/features/link/{ => client}/plugins/floatingLinkEditor/index.tsx (74%) rename packages/richtext-lexical/src/features/link/{ => client}/plugins/floatingLinkEditor/types.ts (86%) create mode 100644 packages/richtext-lexical/src/features/link/client/plugins/link/index.tsx delete mode 100644 packages/richtext-lexical/src/features/link/plugins/link/index.tsx rename packages/richtext-lexical/src/features/link/{drawer => server}/baseFields.ts (90%) rename packages/richtext-lexical/src/features/link/{ => server}/graphQLPopulationPromise.ts (77%) rename packages/richtext-lexical/src/features/link/{ => server}/i18n.ts (100%) rename packages/richtext-lexical/src/features/link/{feature.server.ts => server/index.ts} (87%) rename packages/richtext-lexical/src/features/link/{plugins/floatingLinkEditor/utilities.ts => server/transformExtraFields.ts} (94%) rename packages/richtext-lexical/src/features/link/{ => server}/validate.ts (89%) rename packages/richtext-lexical/src/features/lists/checklist/{feature.client.tsx => client/index.tsx} (81%) rename packages/richtext-lexical/src/features/lists/checklist/{ => client}/plugin/index.tsx (77%) rename packages/richtext-lexical/src/features/lists/checklist/{ => server}/i18n.ts (100%) rename packages/richtext-lexical/src/features/lists/checklist/{feature.server.ts => server/index.ts} (63%) rename packages/richtext-lexical/src/features/lists/orderedList/{feature.client.tsx => client/index.tsx} (81%) rename packages/richtext-lexical/src/features/lists/orderedList/{ => server}/i18n.ts (100%) rename packages/richtext-lexical/src/features/lists/orderedList/{feature.server.ts => server/index.ts} (61%) rename packages/richtext-lexical/src/features/lists/unorderedList/{feature.client.tsx => client/index.tsx} (79%) rename packages/richtext-lexical/src/features/lists/unorderedList/{ => server}/i18n.ts (100%) rename packages/richtext-lexical/src/features/lists/unorderedList/{feature.server.ts => server/index.ts} (53%) delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/heading/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/heading/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/link/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/link/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/list/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/list/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/listItem/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/listItem/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/quote/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/quote/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/unknown/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/unknown/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/upload/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/lexicalPluginToLexical/converter/converters/upload/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/blockquote/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/blockquote/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/heading/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/heading/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/indent/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/indent/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/link/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/link/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/listItem/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/listItem/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/orderedList/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/orderedList/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/relationship/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/relationship/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/unknown/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/unknown/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/unorderedList/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/unorderedList/index.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/upload/client.ts delete mode 100644 packages/richtext-lexical/src/features/migrations/slateToLexical/converter/converters/upload/index.ts rename packages/richtext-lexical/src/features/paragraph/{feature.client.tsx => client/index.tsx} (81%) delete mode 100644 packages/richtext-lexical/src/features/paragraph/feature.server.ts rename packages/richtext-lexical/src/features/paragraph/{ => server}/i18n.ts (100%) create mode 100644 packages/richtext-lexical/src/features/paragraph/server/index.ts rename packages/richtext-lexical/src/features/relationship/{nodes => client}/components/RelationshipComponent.tsx (87%) rename packages/richtext-lexical/src/features/relationship/{nodes => client}/components/index.scss (98%) rename packages/richtext-lexical/src/features/relationship/{ => client}/drawer/commands.ts (100%) rename packages/richtext-lexical/src/features/relationship/{ => client}/drawer/index.tsx (100%) rename packages/richtext-lexical/src/features/relationship/{feature.client.tsx => client/index.tsx} (82%) create mode 100644 packages/richtext-lexical/src/features/relationship/client/nodes/RelationshipNode.tsx rename packages/richtext-lexical/src/features/relationship/{ => client}/plugins/index.tsx (89%) rename packages/richtext-lexical/src/features/relationship/{ => client}/utils/EnabledRelationshipsCondition.tsx (95%) delete mode 100644 packages/richtext-lexical/src/features/relationship/feature.server.ts rename packages/richtext-lexical/src/features/relationship/{ => server}/graphQLPopulationPromise.ts (86%) rename packages/richtext-lexical/src/features/relationship/{ => server}/i18n.ts (100%) create mode 100644 packages/richtext-lexical/src/features/relationship/server/index.ts rename packages/richtext-lexical/src/features/relationship/{ => server}/nodes/RelationshipNode.tsx (71%) rename packages/richtext-lexical/src/features/toolbars/fixed/{ => client}/Toolbar/index.scss (84%) rename packages/richtext-lexical/src/features/toolbars/fixed/{ => client}/Toolbar/index.tsx (89%) rename packages/richtext-lexical/src/features/toolbars/fixed/{feature.client.tsx => client/index.tsx} (63%) rename packages/richtext-lexical/src/features/toolbars/fixed/{feature.server.ts => server/index.ts} (82%) rename packages/richtext-lexical/src/features/toolbars/inline/{ => client}/Toolbar/index.scss (53%) rename packages/richtext-lexical/src/features/toolbars/inline/{ => client}/Toolbar/index.tsx (93%) rename packages/richtext-lexical/src/features/toolbars/inline/{feature.client.tsx => client/index.tsx} (74%) delete mode 100644 packages/richtext-lexical/src/features/toolbars/inline/feature.server.ts create mode 100644 packages/richtext-lexical/src/features/toolbars/inline/server/index.ts rename packages/richtext-lexical/src/features/upload/{ => client}/component/index.scss (97%) rename packages/richtext-lexical/src/features/upload/{ => client}/component/index.tsx (84%) rename packages/richtext-lexical/src/features/upload/{ => client}/drawer/commands.ts (100%) rename packages/richtext-lexical/src/features/upload/{ => client}/drawer/index.tsx (95%) rename packages/richtext-lexical/src/features/upload/{ => client}/feature.client.tsx (84%) create mode 100644 packages/richtext-lexical/src/features/upload/client/nodes/UploadNode.tsx rename packages/richtext-lexical/src/features/upload/{ => client}/plugin/index.tsx (93%) rename packages/richtext-lexical/src/features/upload/{ => server}/feature.server.ts (85%) rename packages/richtext-lexical/src/features/upload/{ => server}/graphQLPopulationPromise.ts (88%) rename packages/richtext-lexical/src/features/upload/{ => server}/i18n.ts (100%) rename packages/richtext-lexical/src/features/upload/{ => server}/nodes/UploadNode.tsx (72%) rename packages/richtext-lexical/src/features/upload/{ => server}/validate.ts (96%) delete mode 100644 packages/richtext-lexical/src/lexical/utils/invariant.ts create mode 100644 packages/richtext-lexical/src/utilities/generateImportMap.tsx create mode 100644 packages/richtext-slate/src/exports/client/index.ts create mode 100644 packages/richtext-slate/src/field/elements/blockquote/Button.tsx rename packages/richtext-slate/src/field/elements/blockquote/{Blockquote.tsx => Element.tsx} (87%) create mode 100644 packages/richtext-slate/src/field/elements/h1/Button.tsx create mode 100644 packages/richtext-slate/src/field/elements/h2/Button.tsx create mode 100644 packages/richtext-slate/src/field/elements/h3/Button.tsx create mode 100644 packages/richtext-slate/src/field/elements/h4/Button.tsx create mode 100644 packages/richtext-slate/src/field/elements/h5/Button.tsx create mode 100644 packages/richtext-slate/src/field/elements/h6/Button.tsx create mode 100644 packages/richtext-slate/src/field/elements/ol/Button.tsx create mode 100644 packages/richtext-slate/src/field/elements/textAlign/Button.tsx create mode 100644 packages/richtext-slate/src/field/elements/ul/Button.tsx create mode 100644 packages/richtext-slate/src/field/leaves/bold/LeafButton.tsx create mode 100644 packages/richtext-slate/src/field/leaves/code/LeafButton.tsx create mode 100644 packages/richtext-slate/src/field/leaves/italic/LeafButton.tsx create mode 100644 packages/richtext-slate/src/field/leaves/strikethrough/LeafButton.tsx create mode 100644 packages/richtext-slate/src/field/leaves/underline/LeafButton.tsx create mode 100644 packages/ui/src/elements/AddNewRelation/index.scss rename packages/ui/src/{fields/Relationship/AddNew => elements/AddNewRelation}/index.tsx (77%) create mode 100644 packages/ui/src/elements/AddNewRelation/types.ts rename packages/ui/src/{fields/Relationship/AddNew => elements/AddNewRelation}/useRelatedCollections.ts (83%) create mode 100644 packages/ui/src/elements/BulkUpload/ActionsBar/index.scss create mode 100644 packages/ui/src/elements/BulkUpload/ActionsBar/index.tsx create mode 100644 packages/ui/src/elements/BulkUpload/AddFilesView/index.scss create mode 100644 packages/ui/src/elements/BulkUpload/AddFilesView/index.tsx create mode 100644 packages/ui/src/elements/BulkUpload/AddingFilesView/index.scss create mode 100644 packages/ui/src/elements/BulkUpload/AddingFilesView/index.tsx create mode 100644 packages/ui/src/elements/BulkUpload/DiscardWithoutSaving/index.tsx create mode 100644 packages/ui/src/elements/BulkUpload/DrawerCloseButton/index.scss create mode 100644 packages/ui/src/elements/BulkUpload/DrawerCloseButton/index.tsx create mode 100644 packages/ui/src/elements/BulkUpload/EditForm/index.scss create mode 100644 packages/ui/src/elements/BulkUpload/EditForm/index.tsx create mode 100644 packages/ui/src/elements/BulkUpload/EditForm/types.ts create mode 100644 packages/ui/src/elements/BulkUpload/FileSidebar/index.scss create mode 100644 packages/ui/src/elements/BulkUpload/FileSidebar/index.tsx create mode 100644 packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts create mode 100644 packages/ui/src/elements/BulkUpload/FormsManager/index.tsx create mode 100644 packages/ui/src/elements/BulkUpload/FormsManager/reducer.ts create mode 100644 packages/ui/src/elements/BulkUpload/Header/index.scss create mode 100644 packages/ui/src/elements/BulkUpload/Header/index.tsx rename templates/blank-3.0/src/app/(payload)/custom.scss => packages/ui/src/elements/BulkUpload/index.scss (100%) create mode 100644 packages/ui/src/elements/BulkUpload/index.tsx create mode 100644 packages/ui/src/elements/FileDetails/DraggableFileDetails/index.scss create mode 100644 packages/ui/src/elements/FileDetails/DraggableFileDetails/index.tsx rename packages/ui/src/elements/FileDetails/{ => StaticFileDetails}/index.scss (97%) create mode 100644 packages/ui/src/elements/FileDetails/StaticFileDetails/index.tsx create mode 100644 packages/ui/src/elements/FullscreenModal/index.tsx create mode 100644 packages/ui/src/elements/ListHeader/index.scss create mode 100644 packages/ui/src/elements/ListHeader/index.tsx delete mode 100644 packages/ui/src/elements/RenderCustomClientComponent/index.tsx delete mode 100644 packages/ui/src/elements/RenderCustomComponent/index.tsx create mode 100644 packages/ui/src/elements/SelectMany/index.tsx rename packages/ui/src/elements/WhereBuilder/{reduceFieldMap.tsx => reduceClientFields.tsx} (66%) delete mode 100644 packages/ui/src/fields/Relationship/AddNew/index.scss delete mode 100644 packages/ui/src/fields/Relationship/AddNew/types.ts create mode 100644 packages/ui/src/fields/Upload/HasMany/index.scss create mode 100644 packages/ui/src/fields/Upload/HasMany/index.tsx create mode 100644 packages/ui/src/fields/Upload/HasOne/index.scss create mode 100644 packages/ui/src/fields/Upload/HasOne/index.tsx create mode 100644 packages/ui/src/fields/Upload/RelationshipContent/index.scss create mode 100644 packages/ui/src/fields/Upload/RelationshipContent/index.tsx create mode 100644 packages/ui/src/fields/Upload/UploadCard/index.scss create mode 100644 packages/ui/src/fields/Upload/UploadCard/index.tsx create mode 100644 packages/ui/src/forms/Form/createNestedClientFieldPath.ts delete mode 100644 packages/ui/src/forms/Form/createNestedFieldPath.ts delete mode 100644 packages/ui/src/providers/ComponentMap/buildComponentMap/actions.tsx delete mode 100644 packages/ui/src/providers/ComponentMap/buildComponentMap/collections.tsx delete mode 100644 packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx delete mode 100644 packages/ui/src/providers/ComponentMap/buildComponentMap/globals.tsx delete mode 100644 packages/ui/src/providers/ComponentMap/buildComponentMap/index.tsx delete mode 100644 packages/ui/src/providers/ComponentMap/buildComponentMap/types.ts delete mode 100644 packages/ui/src/providers/ComponentMap/index.tsx create mode 100644 packages/ui/src/providers/Config/RenderComponent.tsx create mode 100644 packages/ui/src/providers/Config/createClientConfig/collections.tsx create mode 100644 packages/ui/src/providers/Config/createClientConfig/fields.tsx create mode 100644 packages/ui/src/providers/Config/createClientConfig/getComponent.ts create mode 100644 packages/ui/src/providers/Config/createClientConfig/getCreateMappedComponent.tsx create mode 100644 packages/ui/src/providers/Config/createClientConfig/globals.tsx create mode 100644 packages/ui/src/providers/Config/createClientConfig/index.tsx delete mode 100644 packages/ui/src/utilities/buildComponentMap.ts delete mode 100644 patches/playwright@1.43.0.patch create mode 100644 public/custom-favicon-dark.png create mode 100644 public/custom-favicon-light.png create mode 100755 scripts/set_npm_script.sh create mode 100644 templates/_template/src/app/(payload)/admin/importMap.js create mode 100644 templates/_template/src/payload-types.ts delete mode 100644 templates/blank-3.0/README.md create mode 100644 templates/blank/src/app/(payload)/admin/importMap.js create mode 100644 templates/blank/src/payload-types.ts delete mode 100644 templates/vercel-postgres/.tool-versions rename templates/website/src/{app/components/Footer/index.tsx => Footer/Component.tsx} (88%) rename templates/website/src/{payload/globals/Footer/Footer.ts => Footer/config.ts} (91%) rename templates/website/src/{payload/globals => }/Footer/hooks/revalidateFooter.ts (100%) rename templates/website/src/{app/components/Header/index.client.tsx => Header/Component.client.tsx} (82%) rename templates/website/src/{app/components/Header/index.tsx => Header/Component.tsx} (65%) rename templates/website/src/{app/components => }/Header/Nav/index.tsx (76%) rename templates/website/src/{payload/globals/Header/Header.ts => Header/config.ts} (91%) rename templates/website/src/{payload/globals => }/Header/hooks/revalidateHeader.ts (100%) rename templates/website/src/{payload => }/access/anyone.ts (100%) rename templates/website/src/{payload => }/access/authenticated.ts (68%) rename templates/website/src/{payload => }/access/authenticatedOrPublished.ts (100%) rename templates/website/src/app/{ => (frontend)}/next/exit-preview/GET.ts (100%) rename templates/website/src/app/{ => (frontend)}/next/exit-preview/route.ts (100%) rename templates/website/src/app/{ => (frontend)}/next/preview/route.ts (65%) create mode 100644 templates/website/src/app/(payload)/admin/importMap.js delete mode 100644 templates/website/src/app/blocks/ArchiveBlock/types.ts rename templates/website/src/{app/blocks/ArchiveBlock/index.tsx => blocks/ArchiveBlock/Component.tsx} (65%) rename templates/website/src/{payload/blocks/ArchiveBlock/index.ts => blocks/ArchiveBlock/config.ts} (98%) rename templates/website/src/{app/blocks/Banner/index.tsx => blocks/Banner/Component.tsx} (89%) rename templates/website/src/{payload/blocks/Banner/index.ts => blocks/Banner/config.ts} (100%) rename templates/website/src/{app/blocks/CallToAction/index.tsx => blocks/CallToAction/Component.tsx} (74%) rename templates/website/src/{payload/blocks/CallToAction/index.ts => blocks/CallToAction/config.ts} (95%) rename templates/website/src/{app/blocks/Code/Code.client.tsx => blocks/Code/Component.client.tsx} (90%) rename templates/website/src/{app/blocks/Code/index.tsx => blocks/Code/Component.tsx} (90%) rename templates/website/src/{payload/blocks/Code/index.ts => blocks/Code/config.ts} (94%) rename templates/website/src/{app/blocks/Content/index.tsx => blocks/Content/Component.tsx} (81%) rename templates/website/src/{payload/blocks/Content/index.ts => blocks/Content/config.ts} (94%) rename templates/website/src/{app => }/blocks/Form/Checkbox/index.tsx (78%) rename templates/website/src/{app/blocks/Form/index.tsx => blocks/Form/Component.tsx} (62%) rename templates/website/src/{app => }/blocks/Form/Country/index.tsx (100%) rename templates/website/src/{app => }/blocks/Form/Country/options.ts (100%) rename templates/website/src/{app => }/blocks/Form/Email/index.tsx (100%) rename templates/website/src/{app => }/blocks/Form/Error/index.tsx (100%) rename templates/website/src/{app => }/blocks/Form/Message/index.tsx (50%) rename templates/website/src/{app => }/blocks/Form/Number/index.tsx (100%) rename templates/website/src/{app => }/blocks/Form/Select/index.tsx (100%) rename templates/website/src/{app => }/blocks/Form/State/index.tsx (100%) rename templates/website/src/{app => }/blocks/Form/State/options.ts (100%) rename templates/website/src/{app => }/blocks/Form/Text/index.tsx (100%) rename templates/website/src/{app => }/blocks/Form/Textarea/index.tsx (100%) rename templates/website/src/{app => }/blocks/Form/Width/index.tsx (100%) rename templates/website/src/{app => }/blocks/Form/buildInitialFormState.tsx (95%) rename templates/website/src/{payload/blocks/Form/index.ts => blocks/Form/config.ts} (97%) rename templates/website/src/{app => }/blocks/Form/fields.tsx (100%) rename templates/website/src/{app/blocks/MediaBlock/index.tsx => blocks/MediaBlock/Component.tsx} (83%) rename templates/website/src/{payload/blocks/MediaBlock/index.ts => blocks/MediaBlock/config.ts} (94%) rename templates/website/src/{app/blocks/RelatedPosts/index.tsx => blocks/RelatedPosts/Component.tsx} (88%) rename templates/website/src/{app/components/Blocks/index.tsx => blocks/RenderBlocks.tsx} (59%) rename templates/website/src/{payload => }/collections/Categories.ts (100%) rename templates/website/src/{payload => }/collections/Media.ts (100%) rename templates/website/src/{payload => }/collections/Pages/hooks/revalidatePage.ts (93%) rename templates/website/src/{payload => }/collections/Pages/index.ts (87%) rename templates/website/src/{payload => }/collections/Posts/hooks/populateAuthors.ts (92%) rename templates/website/src/{payload => }/collections/Posts/hooks/revalidatePost.ts (92%) rename templates/website/src/{payload => }/collections/Posts/index.ts (95%) rename templates/website/src/{payload => }/collections/Users/index.ts (100%) rename templates/website/src/{app => }/components/AdminBar/index.tsx (88%) rename templates/website/src/{payload => }/components/BeforeDashboard/SeedButton/index.tsx (100%) rename templates/website/src/{payload => }/components/BeforeDashboard/index.scss (100%) rename templates/website/src/{payload => }/components/BeforeDashboard/index.tsx (100%) rename templates/website/src/{payload => }/components/BeforeLogin/index.tsx (100%) rename templates/website/src/{app => }/components/Card/index.tsx (96%) rename templates/website/src/{app => }/components/CollectionArchive/index.tsx (86%) rename templates/website/src/{app => }/components/Link/index.tsx (76%) rename templates/website/src/{app => }/components/LivePreviewListener/index.tsx (90%) rename templates/website/src/{app => }/components/Logo/Logo.tsx (100%) rename templates/website/src/{app => }/components/Media/ImageMedia/index.tsx (92%) rename templates/website/src/{app => }/components/Media/VideoMedia/index.tsx (96%) rename templates/website/src/{app => }/components/Media/index.tsx (100%) rename templates/website/src/{app => }/components/Media/types.ts (89%) rename templates/website/src/{app => }/components/PageRange/index.tsx (100%) rename templates/website/src/{app => }/components/Pagination/index.tsx (100%) rename templates/website/src/{app => }/components/PayloadRedirects/index.tsx (96%) rename templates/website/src/{app => }/components/RichText/index.tsx (100%) rename templates/website/src/{app => }/components/RichText/nodeFormat.tsx (100%) rename templates/website/src/{app => }/components/RichText/serialize.tsx (92%) rename templates/website/src/{app => }/components/ui/button.tsx (97%) rename templates/website/src/{app => }/components/ui/card.tsx (97%) rename templates/website/src/{app => }/components/ui/checkbox.tsx (96%) rename templates/website/src/{app => }/components/ui/input.tsx (95%) rename templates/website/src/{app => }/components/ui/label.tsx (94%) rename templates/website/src/{app => }/components/ui/pagination.tsx (98%) rename templates/website/src/{app => }/components/ui/select.tsx (99%) rename templates/website/src/{app => }/components/ui/textarea.tsx (95%) rename templates/website/src/{app => }/cssVariables.js (100%) rename templates/website/src/{payload => endpoints}/seed/contact-form.ts (98%) rename templates/website/src/{payload => endpoints}/seed/contact-page.ts (95%) rename templates/website/src/{payload => endpoints}/seed/home-static.ts (97%) rename templates/website/src/{payload => endpoints}/seed/home.ts (100%) rename templates/website/src/{payload => endpoints}/seed/image-1.ts (96%) rename templates/website/src/{payload => endpoints}/seed/image-2.ts (96%) rename templates/website/src/{payload => endpoints}/seed/image-hero1.webp (100%) rename templates/website/src/{payload => endpoints}/seed/image-post1.webp (100%) rename templates/website/src/{payload => endpoints}/seed/image-post2.webp (100%) rename templates/website/src/{payload => endpoints}/seed/image-post3.webp (100%) rename templates/website/src/{payload => endpoints}/seed/index.ts (100%) rename templates/website/src/{payload => endpoints}/seed/post-1.ts (99%) rename templates/website/src/{payload => endpoints}/seed/post-2.ts (99%) rename templates/website/src/{payload => endpoints}/seed/post-3.ts (99%) rename templates/website/src/{payload/endpoints/seed.ts => endpoints/seedHandler.ts} (83%) rename templates/website/src/{payload => }/fields/link.ts (98%) rename templates/website/src/{payload => }/fields/linkGroup.ts (91%) create mode 100644 templates/website/src/fields/slug/SlugComponent.tsx rename templates/website/src/{payload/utilities => fields/slug}/formatSlug.ts (56%) create mode 100644 templates/website/src/fields/slug/index.scss create mode 100644 templates/website/src/fields/slug/index.ts rename templates/website/src/{app => }/heros/HighImpact/index.tsx (79%) rename templates/website/src/{app => }/heros/LowImpact/index.tsx (71%) rename templates/website/src/{app => }/heros/MediumImpact/index.tsx (75%) rename templates/website/src/{app => }/heros/PostHero/index.tsx (95%) rename templates/website/src/{app/components/Hero/index.tsx => heros/RenderHero.tsx} (54%) rename templates/website/src/{payload/fields/hero.ts => heros/config.ts} (96%) rename templates/website/src/{payload => }/hooks/formatSlug.ts (100%) rename templates/website/src/{payload => }/hooks/populatePublishedAt.ts (100%) rename templates/website/src/{payload => }/hooks/revalidateRedirects.ts (100%) delete mode 100644 templates/website/src/payload/fields/slug.ts rename templates/website/src/{app => }/providers/HeaderTheme/index.tsx (90%) rename templates/website/src/{app => }/providers/Theme/InitTheme/index.tsx (100%) rename templates/website/src/{app => }/providers/Theme/ThemeSelector/index.tsx (100%) rename templates/website/src/{app => }/providers/Theme/ThemeSelector/types.ts (100%) rename templates/website/src/{app => }/providers/Theme/index.tsx (97%) rename templates/website/src/{app => }/providers/Theme/shared.ts (100%) rename templates/website/src/{app => }/providers/Theme/types.ts (100%) rename templates/website/src/{app => }/providers/index.tsx (100%) rename templates/website/src/{app => }/utilities/canUseDOM.ts (100%) rename templates/website/src/{app => }/utilities/cn.ts (100%) rename templates/website/src/{payload => }/utilities/deepMerge.ts (100%) rename templates/website/src/{app => }/utilities/formatDateTime.ts (100%) rename templates/website/src/{app => }/utilities/generateMeta.ts (89%) rename templates/website/src/{payload => }/utilities/generatePreviewPath.ts (100%) rename templates/website/src/{app => }/utilities/getDocument.ts (100%) rename templates/website/src/{app => }/utilities/getGlobals.ts (100%) rename templates/website/src/{app => }/utilities/getMeUser.ts (85%) rename templates/website/src/{app => }/utilities/getRedirects.ts (100%) rename templates/website/src/{app => }/utilities/mergeOpenGraph.ts (100%) rename templates/website/src/{app => }/utilities/toKebabCase.ts (100%) rename templates/website/src/{app => }/utilities/useClickableCard.ts (97%) create mode 100644 templates/with-payload-cloud/src/app/(payload)/admin/importMap.js create mode 100644 templates/with-payload-cloud/src/payload-types.ts rename templates/{blank-3.0 => with-postgres}/.env.example (65%) rename templates/{blank-3.0 => with-postgres}/.eslintrc.cjs (100%) rename templates/{blank-3.0 => with-postgres}/.gitignore (100%) rename templates/{blank-3.0 => with-postgres}/.prettierrc.json (100%) rename templates/{blank-3.0 => with-postgres}/.yarnrc (100%) rename templates/{blank-3.0 => with-postgres}/Dockerfile (100%) create mode 100644 templates/with-postgres/README.md rename templates/{blank-3.0 => with-postgres}/docker-compose.yml (100%) rename templates/{blank-3.0 => with-postgres}/next.config.mjs (100%) rename templates/{blank-3.0 => with-postgres}/package.json (74%) rename templates/{blank-3.0 => with-postgres}/src/app/(payload)/admin/[[...segments]]/not-found.tsx (78%) rename templates/{blank-3.0 => with-postgres}/src/app/(payload)/admin/[[...segments]]/page.tsx (79%) create mode 100644 templates/with-postgres/src/app/(payload)/admin/importMap.js rename templates/{blank-3.0 => with-postgres}/src/app/(payload)/api/[...slug]/route.ts (100%) rename templates/{blank-3.0 => with-postgres}/src/app/(payload)/api/graphql-playground/route.ts (100%) rename templates/{blank-3.0 => with-postgres}/src/app/(payload)/api/graphql/route.ts (100%) create mode 100644 templates/with-postgres/src/app/(payload)/custom.scss rename templates/{blank-3.0 => with-postgres}/src/app/(payload)/layout.tsx (67%) rename templates/{blank-3.0 => with-postgres}/src/app/my-route/route.ts (100%) rename templates/{blank-3.0 => with-postgres}/src/collections/Media.ts (100%) rename templates/{blank-3.0 => with-postgres}/src/collections/Users.ts (100%) create mode 100644 templates/with-postgres/src/migrations/initial.json create mode 100644 templates/with-postgres/src/migrations/initial.ts create mode 100644 templates/with-postgres/src/payload-types.ts rename templates/{blank-3.0 => with-postgres}/src/payload.config.ts (67%) rename templates/{blank-3.0 => with-postgres}/tsconfig.json (100%) create mode 100644 templates/with-vercel-mongodb/src/app/(payload)/admin/importMap.js create mode 100644 templates/with-vercel-mongodb/src/payload-types.ts create mode 100644 templates/with-vercel-postgres/src/app/(payload)/admin/importMap.js create mode 100644 templates/with-vercel-postgres/src/payload-types.ts create mode 100644 test/_community/collections/Posts/MyAvatar.tsx create mode 100644 test/_community/collections/Posts/MyComponent2.tsx create mode 100644 test/admin-root/app/(payload)/admin/ignore delete mode 100644 test/admin/collections/CustomFields/fields/Text/Description.tsx create mode 100644 test/admin/collections/CustomFields/fields/Text/DescriptionClient.tsx create mode 100644 test/admin/collections/CustomFields/fields/Text/DescriptionServer.tsx delete mode 100644 test/admin/collections/CustomFields/fields/Text/Label.tsx create mode 100644 test/admin/collections/CustomFields/fields/Text/LabelClient.tsx create mode 100644 test/admin/collections/CustomFields/fields/Text/LabelServer.tsx create mode 100644 test/admin/components/AfterDashboardClient/index.tsx create mode 100644 test/admin/components/TestComponent.tsx create mode 100644 test/admin/components/ViewDescription/index.tsx create mode 100644 test/app/(app)/layout.tsx create mode 100644 test/app/(app)/test/page.tsx create mode 100644 test/app/(payload)/admin/[[...segments]]/not-found.tsx create mode 100644 test/app/(payload)/admin/[[...segments]]/page.tsx create mode 100644 test/app/(payload)/api/[...slug]/route.ts create mode 100644 test/app/(payload)/api/graphql-playground/route.ts create mode 100644 test/app/(payload)/api/graphql/route.ts create mode 100644 test/app/(payload)/custom.scss create mode 100644 test/app/(payload)/layout.tsx create mode 100644 test/app/my-route/route.ts create mode 100644 test/databaseAdapter.ts rename test/{dev.js => dev.ts} (69%) create mode 100644 test/fields/collections/LexicalRelationships/index.ts create mode 100644 test/fields/collections/UploadMulti/.gitignore create mode 100644 test/fields/collections/UploadMulti/index.ts create mode 100644 test/fields/collections/UploadMulti/shared.ts create mode 100644 test/fields/collections/UploadMultiPoly/.gitignore create mode 100644 test/fields/collections/UploadMultiPoly/index.ts create mode 100644 test/fields/collections/UploadMultiPoly/shared.ts create mode 100644 test/fields/collections/UploadPoly/.gitignore create mode 100644 test/fields/collections/UploadPoly/index.ts create mode 100644 test/fields/collections/UploadPoly/shared.ts create mode 100644 test/generateImportMap.ts create mode 100644 test/getDatabaseAdapter.js create mode 100644 test/helpers/e2e/reorderColumns.ts delete mode 100644 test/helpers/getNextJSRootDir.js create mode 100644 test/helpers/getNextRootDir.ts create mode 100644 test/initDevAndTest.ts delete mode 100644 test/jest.setup.env.js delete mode 100644 test/loader/load.js delete mode 100644 test/loader/server-only-test.ts create mode 100644 test/localization/collections/Blocks/index.ts create mode 100644 test/localization/collections/LocalizedWithinLocalized/index.ts create mode 100644 test/localization/collections/NestedArray/index.ts create mode 100644 test/localization/collections/NestedFields/index.ts create mode 100644 test/next.config.mjs create mode 100644 test/runInit.ts create mode 100644 test/runInitSeparateProcess.ts create mode 100644 test/setupProd.ts rename test/{testHooks.js => testHooks.ts} (69%) create mode 100644 test/versions/collections/Localized.ts create mode 100644 test/versions/globals/LocalizedGlobal.ts create mode 100644 test/versions/localized.int.spec.ts diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 7207a3f6097..fa580bbd66f 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -22,3 +22,6 @@ fb7d1be2f3325d076b7c967b1730afcef37922c2 # 3.0 prettier & lint everywhere again 83fd4c66222d7846eeb5cc332dfa99bf1e830831 + +# Upgrade to typescript-eslint v8, then prettier & lint everywhere +86fdad0bb8ab27810599c8a32f3d8cba1341e1df diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f5372ed88e1..7a1460b0f50 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,24 +1,23 @@ # Order matters. The last matching pattern takes precedence. +# Approvals are not required currently but may be enabled in the future. ### Package Exports ### -/**/exports/ @denolfe @jmikrut +/**/exports/ @denolfe @jmikrut @DanRibbens ### Packages ### -/packages/richtext-*/ @AlessioGr -/packages/plugin-cloud*/ @denolfe -/packages/email-*/ @denolfe -/packages/storage-*/ @denolfe -/packages/create-payload-app/ @denolfe -/packages/eslint-*/ @denolfe +/packages/plugin-cloud*/src/ @denolfe +/packages/email-*/src/ @denolfe +/packages/storage-*/src/ @denolfe +/packages/create-payload-app/src/ @denolfe +/packages/eslint-*/ @denolfe @AlessioGr ### Templates ### -/templates/ @jacobsfletch @denolfe +/templates/_data/ @denolfe +/templates/_template/ @denolfe ### Build Files ### -/**/package.json @denolfe /tsconfig.json @denolfe /**/tsconfig*.json @denolfe - /jest.config.js @denolfe /**/jest.config.js @denolfe @@ -26,5 +25,5 @@ /package.json @denolfe /scripts/ @denolfe /.husky/ @denolfe -/.vscode/ @denolfe +/.vscode/ @denolfe @AlessioGr /.github/ @denolfe diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 877c802403f..06725b09dea 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -9,7 +9,7 @@ inputs: pnpm-version: description: 'The pnpm version to use' required: true - default: 8.15.7 + default: 9.7.0 runs: using: composite @@ -25,7 +25,7 @@ runs: node-version: ${{ inputs.node-version }} - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v4 with: version: ${{ inputs.pnpm-version }} run_install: false diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 32b7553b092..4228e9fceb5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,8 +17,8 @@ concurrency: cancel-in-progress: true env: - NODE_VERSION: 18.20.2 - PNPM_VERSION: 8.15.7 + NODE_VERSION: 22.6.0 + PNPM_VERSION: 9.7.1 DO_NOT_TRACK: 1 # Disable Turbopack telemetry NEXT_TELEMETRY_DISABLED: 1 # Disable Next telemetry @@ -74,7 +74,7 @@ jobs: node-version: ${{ env.NODE_VERSION }} - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v4 with: version: ${{ env.PNPM_VERSION }} run_install: false @@ -120,7 +120,7 @@ jobs: node-version: ${{ env.NODE_VERSION }} - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v4 with: version: ${{ env.PNPM_VERSION }} run_install: false @@ -167,7 +167,7 @@ jobs: node-version: ${{ env.NODE_VERSION }} - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v4 with: version: ${{ env.PNPM_VERSION }} run_install: false @@ -207,6 +207,9 @@ jobs: AWS_REGION: us-east-1 steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 25 # https://github.com/actions/virtual-environments/issues/1187 - name: tune linux network run: sudo ethtool -K eth0 tx off rx off @@ -217,17 +220,12 @@ jobs: node-version: ${{ env.NODE_VERSION }} - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v4 with: version: ${{ env.PNPM_VERSION }} run_install: false - - name: Restore build - uses: actions/cache@v4 - timeout-minutes: 10 - with: - path: ./* - key: ${{ github.sha }}-${{ github.run_number }} + - run: pnpm install - name: Start LocalStack run: pnpm docker:start @@ -332,7 +330,7 @@ jobs: node-version: ${{ env.NODE_VERSION }} - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v4 with: version: ${{ env.PNPM_VERSION }} run_install: false @@ -371,7 +369,7 @@ jobs: run: pnpm exec playwright install-deps chromium - name: E2E Tests - run: PLAYWRIGHT_JSON_OUTPUT_NAME=results_${{ matrix.suite }}.json pnpm test:e2e ${{ matrix.suite }} + run: PLAYWRIGHT_JSON_OUTPUT_NAME=results_${{ matrix.suite }}.json pnpm test:e2e:prod:ci ${{ matrix.suite }} env: PLAYWRIGHT_JSON_OUTPUT_NAME: results_${{ matrix.suite }}.json NEXT_TELEMETRY_DISABLED: 1 @@ -407,7 +405,7 @@ jobs: node-version: ${{ env.NODE_VERSION }} - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v4 with: version: ${{ env.PNPM_VERSION }} run_install: false @@ -420,15 +418,15 @@ jobs: key: ${{ github.sha }}-${{ github.run_number }} - name: Start MongoDB - uses: supercharge/mongodb-github-action@1.10.0 + uses: supercharge/mongodb-github-action@1.11.0 with: mongodb-version: 6.0 - name: Pack and build app run: | set -ex - pnpm run script:pack --dest templates/blank-3.0 - cd templates/blank-3.0 + pnpm run script:pack --dest templates/blank + cd templates/blank cp .env.example .env ls -la pnpm add ./*.tgz --ignore-workspace @@ -451,7 +449,7 @@ jobs: node-version: ${{ env.NODE_VERSION }} - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v4 with: version: ${{ env.PNPM_VERSION }} run_install: false @@ -492,7 +490,7 @@ jobs: node-version: ${{ env.NODE_VERSION }} - name: Start MongoDB - uses: supercharge/mongodb-github-action@1.10.0 + uses: supercharge/mongodb-github-action@1.11.0 with: mongodb-version: 6.0 @@ -520,7 +518,7 @@ jobs: node-version: ${{ env.NODE_VERSION }} - name: Install pnpm - uses: pnpm/action-setup@v3 + uses: pnpm/action-setup@v4 with: version: ${{ env.PNPM_VERSION }} run_install: false @@ -552,42 +550,13 @@ jobs: publish-canary: name: Publish Canary - if: github.ref == 'refs/heads/beta' runs-on: ubuntu-latest needs: - all-green steps: - # https://github.com/actions/virtual-environments/issues/1187 - - name: tune linux network - run: sudo ethtool -K eth0 tx off rx off - - - name: Setup Node@${{ env.NODE_VERSION }} - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install pnpm - uses: pnpm/action-setup@v3 - with: - version: ${{ env.PNPM_VERSION }} - run_install: false - - - name: Restore build - uses: actions/cache@v4 - timeout-minutes: 10 - with: - path: ./* - key: ${{ github.sha }}-${{ github.run_number }} - - - name: Load npm token - run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - - name: Canary release script - # dry run hard-coded to true for testing and no npm token provided - run: pnpm tsx ./scripts/publish-canary.ts - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - NPM_CONFIG_PROVENANCE: true + # debug github.ref output + - run: | + echo github.ref: ${{ github.ref }} + echo isBeta: ${{ github.ref == 'refs/heads/beta' }} + echo isMain: ${{ github.ref == 'refs/heads/main' }} diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 8aac6f53569..9a4cfc53b82 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -39,6 +39,7 @@ jobs: db-mongodb db-postgres db-sqlite + drizzle email-nodemailer eslint graphql diff --git a/.github/workflows/release-canary.yml b/.github/workflows/release-canary.yml index 2a7481eb25f..89a2a7aadb9 100644 --- a/.github/workflows/release-canary.yml +++ b/.github/workflows/release-canary.yml @@ -6,8 +6,8 @@ on: - beta env: - NODE_VERSION: 18.20.2 - PNPM_VERSION: 8.15.7 + NODE_VERSION: 22.6.0 + PNPM_VERSION: 9.7.1 DO_NOT_TRACK: 1 # Disable Turbopack telemetry NEXT_TELEMETRY_DISABLED: 1 # Disable Next telemetry diff --git a/.gitignore b/.gitignore index 3098feb9d61..26d73b48810 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ dist !/.idea/runConfigurations !/.idea/payload.iml +test/packed test-results .devcontainer .localstack @@ -153,6 +154,7 @@ out # Nuxt.js build / generate output .nuxt dist +dist_optimized # Gatsby files .cache/ @@ -300,3 +302,11 @@ $RECYCLE.BIN/ /build .swc +app/(payload)/admin/importMap.js +test/live-preview/app/(payload)/admin/importMap.js +/test/live-preview/app/(payload)/admin/importMap.js +test/admin-root/app/(payload)/admin/importMap.js +/test/admin-root/app/(payload)/admin/importMap.js +test/app/(payload)/admin/importMap.js +/test/app/(payload)/admin/importMap.js +test/pnpm-lock.yaml diff --git a/.idea/payload.iml b/.idea/payload.iml index 8590770759c..89c279912ac 100644 --- a/.idea/payload.iml +++ b/.idea/payload.iml @@ -26,6 +26,7 @@ + diff --git a/.idea/runConfigurations/Run_Dev_Fields.xml b/.idea/runConfigurations/Run_Dev_Fields.xml index 9d065377a0c..bc795fa6d1f 100644 --- a/.idea/runConfigurations/Run_Dev_Fields.xml +++ b/.idea/runConfigurations/Run_Dev_Fields.xml @@ -1,8 +1,13 @@ - - - - + + + + +
@@ -46,7 +33,7 @@ export const RenderCell: React.FC<{ >