diff --git a/.github/ISSUE_TEMPLATE/1.bug_report_v3.yml b/.github/ISSUE_TEMPLATE/1.bug_report_v3.yml index 0c1139294f..7d8f364ff8 100644 --- a/.github/ISSUE_TEMPLATE/1.bug_report_v3.yml +++ b/.github/ISSUE_TEMPLATE/1.bug_report_v3.yml @@ -57,7 +57,7 @@ body: - type: textarea attributes: label: Environment Info - description: Paste output from `pnpm payload info` _or_ Payload, Node.js, and Next.js versions. + description: Paste output from `pnpm payload info` _or_ Payload, Node.js, and Next.js versions. Please avoid using "latest"—specific version numbers help us accurately diagnose and resolve issues. render: text placeholder: | Payload: diff --git a/.github/ISSUE_TEMPLATE/2.design_issue.yml b/.github/ISSUE_TEMPLATE/2.design_issue.yml index 4b3fb17bb5..cf336ed8e4 100644 --- a/.github/ISSUE_TEMPLATE/2.design_issue.yml +++ b/.github/ISSUE_TEMPLATE/2.design_issue.yml @@ -20,7 +20,7 @@ body: - type: textarea attributes: label: Environment Info - description: Paste output from `pnpm payload info` _or_ Payload, Node.js, and Next.js versions. + description: Paste output from `pnpm payload info` _or_ Payload, Node.js, and Next.js versions. Please avoid using "latest"—specific version numbers help us accurately diagnose and resolve issues. render: text placeholder: | Payload: diff --git a/.github/actions/release-commenter/LICENSE b/.github/actions/release-commenter/LICENSE new file mode 100644 index 0000000000..2d90cf7807 --- /dev/null +++ b/.github/actions/release-commenter/LICENSE @@ -0,0 +1,27 @@ +MIT License + +Copyright (c) 2020-2025 Cameron Little + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +Modifications made by Payload CMS, Inc. , 2025 +Details in README.md diff --git a/.github/actions/release-commenter/package.json b/.github/actions/release-commenter/package.json index 3a59dab579..300865d00f 100644 --- a/.github/actions/release-commenter/package.json +++ b/.github/actions/release-commenter/package.json @@ -4,6 +4,7 @@ "private": true, "description": "GitHub Action to automatically comment on PRs and Issues when a fix is released.", "license": "MIT", + "author": "Payload (https://payloadcms.com)", "main": "dist/index.js", "scripts": { "build": "pnpm build:typecheck && pnpm build:ncc", diff --git a/.github/actions/release-commenter/tsconfig.json b/.github/actions/release-commenter/tsconfig.json index a99f5e1ce8..4cf9fec443 100644 --- a/.github/actions/release-commenter/tsconfig.json +++ b/.github/actions/release-commenter/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2022", + "target": "es5", "lib": ["es2020.string"], "noEmit": true, "strict": true, diff --git a/.github/actions/triage/tsconfig.json b/.github/actions/triage/tsconfig.json index 766e72770e..5577737a90 100644 --- a/.github/actions/triage/tsconfig.json +++ b/.github/actions/triage/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2022", + "target": "es5", "lib": ["es2020.string"], "noEmit": true, "strict": true, diff --git a/.github/comments/invalid-reproduction.md b/.github/comments/invalid-reproduction.md index 7c11c7106a..3612fde604 100644 --- a/.github/comments/invalid-reproduction.md +++ b/.github/comments/invalid-reproduction.md @@ -4,7 +4,7 @@ Depending on the quality of reproduction steps, this issue may be closed if no r ### Why was this issue marked with the `invalid-reproduction` label? -To be able to investigate, we need access to a reproduction to identify what triggered the issue. We prefer a link to a public GitHub repository created with `create-payload-app@beta -t blank` or a forked/branched version of this repository with tests added (more info in the [reproduction-guide](https://github.com/payloadcms/payload/blob/main/.github/reproduction-guide.md)). +To be able to investigate, we need access to a reproduction to identify what triggered the issue. We prefer a link to a public GitHub repository created with `create-payload-app@latest -t blank` or a forked/branched version of this repository with tests added (more info in the [reproduction-guide](https://github.com/payloadcms/payload/blob/main/.github/reproduction-guide.md)). To make sure the issue is resolved as quickly as possible, please make sure that the reproduction is as **minimal** as possible. This means that you should **remove unnecessary code, files, and dependencies** that do not contribute to the issue. Ensure your reproduction does not depend on secrets, 3rd party registries, private dependencies, or any other data that cannot be made public. Avoid a reproduction including a whole monorepo (unless relevant to the issue). The easier it is to reproduce the issue, the quicker we can help. diff --git a/.github/workflows/lock-issues.yml b/.github/workflows/lock-issues.yml index f010e78dc1..5546a3b252 100644 --- a/.github/workflows/lock-issues.yml +++ b/.github/workflows/lock-issues.yml @@ -2,8 +2,8 @@ name: lock-issues on: schedule: - # Run nightly at 12am EST - - cron: '0 4 * * *' + # Run nightly at 12am EST, staggered with stale workflow + - cron: '0 5 * * *' workflow_dispatch: permissions: diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b587046bfd..e3da5ddd0d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -41,14 +41,14 @@ jobs: with: filters: | needs_build: - - '.github/workflows/**' + - '.github/workflows/main.yml' - 'packages/**' - 'test/**' - 'pnpm-lock.yaml' - 'package.json' - 'templates/**' needs_tests: - - '.github/workflows/**' + - '.github/workflows/main.yml' - 'packages/**' - 'test/**' - 'pnpm-lock.yaml' @@ -275,6 +275,7 @@ jobs: - admin__e2e__general - admin__e2e__list-view - admin__e2e__document-view + - admin-bar - admin-root - auth - auth-basic @@ -313,6 +314,7 @@ jobs: - i18n - plugin-cloud-storage - plugin-form-builder + - plugin-import-export - plugin-nested-docs - plugin-seo - versions @@ -417,6 +419,7 @@ jobs: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: payloadtests + MONGODB_VERSION: 6.0 steps: - uses: actions/checkout@v4 @@ -456,8 +459,14 @@ jobs: echo "POSTGRES_URL=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" >> $GITHUB_ENV if: matrix.database == 'postgres' + # Avoid dockerhub rate-limiting + - name: Cache Docker images + uses: ScribeMD/docker-cache@0.5.0 + with: + key: docker-${{ runner.os }}-mongo-${{ env.MONGODB_VERSION }} + - name: Start MongoDB - uses: supercharge/mongodb-github-action@1.11.0 + uses: supercharge/mongodb-github-action@1.12.0 with: mongodb-version: 6.0 if: matrix.database == 'mongodb' diff --git a/.github/workflows/release-canary.yml b/.github/workflows/publish-prerelease.yml similarity index 54% rename from .github/workflows/release-canary.yml rename to .github/workflows/publish-prerelease.yml index 0f4d9ca276..b8575800fb 100644 --- a/.github/workflows/release-canary.yml +++ b/.github/workflows/publish-prerelease.yml @@ -1,6 +1,9 @@ -name: release-canary +name: publish-prerelease on: + schedule: + # Run nightly at 10pm EST + - cron: '0 3 * * *' workflow_dispatch: env: @@ -11,7 +14,7 @@ env: jobs: release: - name: release-canary-${{ github.ref_name }}-${{ github.sha }} + name: publish-prerelease-${{ github.ref_name }}-${{ github.sha }} permissions: id-token: write runs-on: ubuntu-24.04 @@ -27,8 +30,19 @@ jobs: run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Canary release script - run: pnpm release:canary + + - name: Determine release type + id: determine_release_type + # Use 'canary' for main branch, 'internal' for others + run: | + if [[ ${{ github.ref_name }} == "main" ]]; then + echo "release_type=canary" >> $GITHUB_OUTPUT + else + echo "release_type=internal" >> $GITHUB_OUTPUT + fi + + - name: Release + run: pnpm publish-prerelease --tag ${{ steps.determine_release_type.outputs.release_type }} env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 7ebdce2b59..d23d6b8869 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -2,8 +2,8 @@ name: stale on: schedule: - # Run nightly at 1am EST - - cron: '0 5 * * *' + # Run nightly at 1am EST, staggered with lock-issues workflow + - cron: '0 6 * * *' workflow_dispatch: inputs: diff --git a/.gitignore b/.gitignore index 77ef9ccae8..fce7617d11 100644 --- a/.gitignore +++ b/.gitignore @@ -306,6 +306,8 @@ $RECYCLE.BIN/ /build .swc app/(payload)/admin/importMap.js +test/admin-bar/app/(payload)/admin/importMap.js +/test/admin-bar/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 @@ -318,3 +320,6 @@ test/databaseAdapter.js /media-with-relation-preview /media-without-relation-preview /media-without-cache-tags +test/.localstack +test/google-cloud-storage +test/azurestoragedata/ diff --git a/.idea/payload.iml b/.idea/payload.iml index 89c279912a..ea3e14c847 100644 --- a/.idea/payload.iml +++ b/.idea/payload.iml @@ -80,8 +80,9 @@ + - + \ No newline at end of file diff --git a/docs/admin/react-hooks.mdx b/docs/admin/react-hooks.mdx index 391a584470..6a37767a9a 100644 --- a/docs/admin/react-hooks.mdx +++ b/docs/admin/react-hooks.mdx @@ -135,7 +135,7 @@ const ExampleComponent: React.FC = () => { #### Updating other fields' values -If you are building a Custom Component, then you should use `setValue` which is returned from the `useField` hook to programmatically set your field's value. But if you're looking to update _another_ field's value, you can use `dispatchFields` returned from `useFormFields`. +If you are building a Custom Component, then you should use `setValue` which is returned from the `useField` hook to programmatically set your field's value. But if you're looking to update _another_ field's value, you can use `dispatchFields` returned from `useAllFormFields`. You can send the following actions to the `dispatchFields` function. diff --git a/docs/authentication/custom-strategies.mdx b/docs/authentication/custom-strategies.mdx index c8fdb2dbd6..f42973b358 100644 --- a/docs/authentication/custom-strategies.mdx +++ b/docs/authentication/custom-strategies.mdx @@ -62,9 +62,12 @@ export const Users: CollectionConfig = { }) return { - // Send the user back to authenticate, + // Send the user with the collection slug back to authenticate, // or send null if no user should be authenticated - user: usersQuery.docs[0] || null, + user: usersQuery.docs[0] ? { + collection: 'users' + ...usersQuery.docs[0], + } : null, // Optionally, you can return headers // that you'd like Payload to set here when diff --git a/docs/configuration/collections.mdx b/docs/configuration/collections.mdx index dd7930dcdf..7f6034f567 100644 --- a/docs/configuration/collections.mdx +++ b/docs/configuration/collections.mdx @@ -57,9 +57,9 @@ export const Posts: CollectionConfig = { The following options are available: -| Option | Description | -| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `admin` | The configuration options for the Admin Panel. [More details](#admin-options). | +| Option | Description | +| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `admin` | The configuration options for the Admin Panel. [More details](#admin-options). | | `access` | Provide Access Control functions to define exactly who should be able to do what with Documents in this Collection. [More details](../access-control/collections). | | `auth` | Specify options if you would like this Collection to feature authentication. [More details](../authentication/overview). | | `custom` | Extension point for adding custom data (e.g. for plugins) | @@ -67,18 +67,19 @@ The following options are available: | `defaultSort` | Pass a top-level field to sort by default in the Collection List View. Prefix the name of the field with a minus symbol ("-") to sort in descending order. Multiple fields can be specified by using a string array. | | `dbName` | Custom table or Collection name depending on the Database Adapter. Auto-generated from slug if not defined. | | `endpoints` | Add custom routes to the REST API. Set to `false` to disable routes. [More details](../rest-api/overview#custom-endpoints). | -| `fields` * | Array of field types that will determine the structure and functionality of the data stored within this Collection. [More details](../fields/overview). | +| `fields` * | Array of field types that will determine the structure and functionality of the data stored within this Collection. [More details](../fields/overview). | | `graphQL` | Manage GraphQL-related properties for this collection. [More](#graphql) | | `hooks` | Entry point for Hooks. [More details](../hooks/overview#collection-hooks). | | `isSortable` | If true, enables custom ordering for the collection, and documents can be reordered via drag and drop. Uses [fractional indexing](https://observablehq.com/@dgreensp/implementing-fractional-indexing) for efficient reordering. | | `labels` | Singular and plural labels for use in identifying this Collection throughout Payload. Auto-generated from slug if not defined. | | `lockDocuments` | Enables or disables document locking. By default, document locking is enabled. Set to an object to configure, or set to `false` to disable locking. [More details](../admin/locked-documents). | -| `slug` * | Unique, URL-friendly string that will act as an identifier for this Collection. | +| `slug` * | Unique, URL-friendly string that will act as an identifier for this Collection. | | `timestamps` | Set to false to disable documents' automatically generated `createdAt` and `updatedAt` timestamps. | | `typescript` | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. | | `upload` | Specify options if you would like this Collection to support file uploads. For more, consult the [Uploads](../upload/overview) documentation. | | `versions` | Set to true to enable default options, or configure with object properties. [More details](../versions/overview#collection-config). | | `defaultPopulate` | Specify which fields to select when this Collection is populated from another document. [More Details](../queries/select#defaultpopulate-collection-config-property). | +| `indexes` | Define compound indexes for this collection. This can be used to either speed up querying/sorting by 2 or more fields at the same time or to ensure uniqueness between several fields. | _* An asterisk denotes that a property is required._ @@ -121,6 +122,7 @@ The following options are available: | `useAsTitle` | Specify a top-level field to use for a document title throughout the Admin Panel. If no field is defined, the ID of the document is used as the title. A field with `virtual: true` cannot be used as the title. | | `description` | Text to display below the Collection label in the List View to give editors more information. Alternatively, you can use the `admin.components.Description` to render a React component. [More details](#custom-components). | | `defaultColumns` | Array of field names that correspond to which columns to show by default in this Collection's List View. | +| `disableCopyToLocale` | Disables the "Copy to Locale" button while editing documents within this Collection. Only applicable when localization is enabled. | | `hideAPIURL` | Hides the "API URL" meta field while editing documents within this Collection. | | `enableRichTextLink` | The [Rich Text](../fields/rich-text) field features a `Link` element which allows for users to automatically reference related documents within their rich text. Set to `true` by default. | | `enableRichTextRelationship` | The [Rich Text](../fields/rich-text) field features a `Relationship` element which allows for users to automatically reference related documents within their rich text. Set to `true` by default. | diff --git a/docs/custom-components/overview.mdx b/docs/custom-components/overview.mdx index bf0c376d26..9ab42d1d56 100644 --- a/docs/custom-components/overview.mdx +++ b/docs/custom-components/overview.mdx @@ -119,10 +119,32 @@ For details on how to build Custom Components, see [Building Custom Components]( ### Import Map -In order for Payload to make use of [Component Paths](#component-paths), an "Import Map" is automatically generated at `app/(payload)/admin/importMap.js`. This file contains every Custom Component in your config, keyed to their respective paths. When Payload needs to lookup a component, it uses this file to find the correct import. +In order for Payload to make use of [Component Paths](#component-paths), an "Import Map" is automatically generated at either `src/app/(payload)/admin/importMap.js` or `app/(payload)/admin/importMap.js`. This file contains every Custom Component in your config, keyed to their respective paths. When Payload needs to lookup a component, it uses this file to find the correct import. The Import Map is automatically regenerated at startup and whenever Hot Module Replacement (HMR) runs, or you can run `payload generate:importmap` to manually regenerate it. +#### Overriding Import Map Location + +Using the `config.admin.importMap.importMapFile` property, you can override the location of the import map. This is useful if you want to place the import map in a different location, or if you want to use a custom file name. + +```ts +import { buildConfig } from 'payload' +import { fileURLToPath } from 'node:url' +import path from 'path' +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +const config = buildConfig({ + // ... + admin: { + importMap: { + baseDir: path.resolve(dirname, 'src'), + importMapFile: path.resolve(dirname, 'app', '(payload)', 'custom-import-map.js'), // highlight-line + }, + }, +}) +``` + #### Custom Imports If needed, custom items can be appended onto the Import Map. This is mostly only relevant for plugin authors who need to add a custom import that is not referenced in a known location. @@ -146,7 +168,7 @@ export default buildConfig({ }, }, } -} +}) ``` ## Building Custom Components diff --git a/docs/database/mongodb.mdx b/docs/database/mongodb.mdx index 4febdf4149..18172e1aad 100644 --- a/docs/database/mongodb.mdx +++ b/docs/database/mongodb.mdx @@ -34,11 +34,12 @@ export default buildConfig({ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `autoPluralization` | Tell Mongoose to auto-pluralize any collection names if it encounters any singular words used as collection `slug`s. | | `connectOptions` | Customize MongoDB connection options. Payload will connect to your MongoDB database using default options which you can override and extend to include all the [options](https://mongoosejs.com/docs/connections.html#options) available to mongoose. | -| `collectionsSchemaOptions` | Customize Mongoose schema options for collections. | +| `collectionsSchemaOptions` | Customize Mongoose schema options for collections. | | `disableIndexHints` | Set to true to disable hinting to MongoDB to use 'id' as index. This is currently done when counting documents for pagination, as it increases the speed of the count function used in that query. Disabling this optimization might fix some problems with AWS DocumentDB. Defaults to false | | `migrationDir` | Customize the directory that migrations are stored. | | `transactionOptions` | An object with configuration properties used in [transactions](https://www.mongodb.com/docs/manual/core/transactions/) or `false` which will disable the use of transactions. | | `collation` | Enable language-specific string comparison with customizable options. Available on MongoDB 3.4+. Defaults locale to "en". Example: `{ strength: 3 }`. For a full list of collation options and their definitions, see the [MongoDB documentation](https://www.mongodb.com/docs/manual/reference/collation/). | +| `allowAdditionalKeys` | By default, Payload strips all additional keys from MongoDB data that don't exist in the Payload schema. If you have some data that you want to include to the result but it doesn't exist in Payload, you can set this to `true`. Be careful as Payload access control _won't_ work for this data. | ## Access to Mongoose models @@ -50,3 +51,11 @@ You can access Mongoose models as follows: - Collection models - `payload.db.collections[myCollectionSlug]` - Globals model - `payload.db.globals` - Versions model (both collections and globals) - `payload.db.versions[myEntitySlug]` + +## Using other MongoDB implementations +Limitations with [DocumentDB](https://aws.amazon.com/documentdb/) and [Azure Cosmos DB](https://azure.microsoft.com/en-us/products/cosmos-db): + +* For Azure Cosmos DB you must pass `transactionOptions: false` to the adapter options. Azure Cosmos DB does not support transactions that update two and more documents in different collections, which is a common case when using Payload (via hooks). +* For Azure Cosmos DB the root config property `indexSortableFields` must be set to `true`. +* The [Join Field](../fields/join) is not supported in DocumentDB and Azure Cosmos DB, as we internally use MongoDB aggregations to query data for that field, which are limited there. This can be changed in the future. +* For DocumentDB pass `disableIndexHints: true` to disable hinting to the DB to use `id` as index which can cause problems with DocumentDB. \ No newline at end of file diff --git a/docs/fields/blocks.mdx b/docs/fields/blocks.mdx index f0299cf0e2..305f604345 100644 --- a/docs/fields/blocks.mdx +++ b/docs/fields/blocks.mdx @@ -84,6 +84,7 @@ The Blocks Field inherits all of the default options from the base [Field Admin | **`group`** | Text or localization object used to group this Block in the Blocks Drawer. | | **`initCollapsed`** | Set the initial collapsed state | | **`isSortable`** | Disable order sorting by setting this value to `false` | +| **`disableBlockName`** | Hide the blockName field by setting this value to `true` | #### Customizing the way your block is rendered in Lexical @@ -165,7 +166,7 @@ The `blockType` is saved as the slug of the block that has been selected. **`blockName`** -The Admin Panel provides each block with a `blockName` field which optionally allows editors to label their blocks for better editability and readability. +The Admin Panel provides each block with a `blockName` field which optionally allows editors to label their blocks for better editability and readability. This can be visually hidden via `admin.disableBlockName`. ## Example diff --git a/docs/fields/join.mdx b/docs/fields/join.mdx index e7a0e7f056..6c006a03e0 100644 --- a/docs/fields/join.mdx +++ b/docs/fields/join.mdx @@ -62,6 +62,10 @@ of relationship types in an easy manner. The Join field is extremely performant and does not add additional query overhead to your API responses until you add depth of 1 or above. It works in all database adapters. In MongoDB, we use **aggregations** to automatically join in related documents, and in relational databases, we use joins. + + The Join Field is not supported in [DocumentDB](https://aws.amazon.com/documentdb/) and [Azure Cosmos DB](https://azure.microsoft.com/en-us/products/cosmos-db), as we internally use MongoDB aggregations to query data for that field, which are limited there. This can be changed in the future. + + ### Schema advice When modeling your database, you might come across many places where you'd like to feature bi-directional relationships. @@ -158,6 +162,7 @@ object with: - `docs` an array of related documents or only IDs if the depth is reached - `hasNextPage` a boolean indicating if there are additional documents +- `totalDocs` a total number of documents, exists only if `count: true` is passed to the join query ```json { @@ -171,7 +176,8 @@ object with: } // { ... } ], - "hasNextPage": false + "hasNextPage": false, + "totalDocs": 10, // if count: true is passed } // other fields... } @@ -184,6 +190,7 @@ object with: - `docs` an array of `relationTo` - the collection slug of the document and `value` - the document itself or the ID if the depth is reached - `hasNextPage` a boolean indicating if there are additional documents +- `totalDocs` a total number of documents, exists only if `count: true` is passed to the join query ```json { @@ -200,7 +207,8 @@ object with: } // { ... } ], - "hasNextPage": false + "hasNextPage": false, + "totalDocs": 10, // if count: true is passed } // other fields... } @@ -215,10 +223,11 @@ returning. This is useful for performance reasons when you don't need the relate The following query options are supported: | Property | Description | -|-------------|-----------------------------------------------------------------------------------------------------| +| ----------- | --------------------------------------------------------------------------------------------------- | | **`limit`** | The maximum related documents to be returned, default is 10. | | **`where`** | An optional `Where` query to filter joined documents. Will be merged with the field `where` object. | | **`sort`** | A string used to order related results | +| **`count`** | Whether include the count of related documents or not. Not included by default | These can be applied to the local API, GraphQL, and REST API. diff --git a/docs/fields/overview.mdx b/docs/fields/overview.mdx index 77f9f94872..867b0be73a 100644 --- a/docs/fields/overview.mdx +++ b/docs/fields/overview.mdx @@ -502,7 +502,7 @@ export const MyCollectionConfig: CollectionConfig = { All Description Functions receive the following arguments: -| Argument | Description | +| Argument | Description | | --- | --- | | **`t`** | The `t` function used to internationalize the Admin Panel. [More details](../configuration/i18n) | @@ -512,11 +512,21 @@ All Description Functions receive the following arguments: ### Conditional Logic -You can show and hide fields based on what other fields are doing by utilizing conditional logic on a field by field basis. The `condition` property on a field's admin config accepts a function which takes three arguments: +You can show and hide fields based on what other fields are doing by utilizing conditional logic on a field by field basis. The `condition` property on a field's admin config accepts a function which takes the following arguments: -- `data` - the entire document's data that is currently being edited -- `siblingData` - only the fields that are direct siblings to the field with the condition -- `{ user }` - the final argument is an object containing the currently authenticated user +| Argument | Description | +| --- | --- | +| **`data`** | The entire document's data that is currently being edited. | +| **`siblingData`** | Only the fields that are direct siblings to the field with the condition. | +| **`ctx`** | An object containing additional information about the field’s location and user. | + +The `ctx` object: + +| Property | Description | +| --- | --- | +| **`blockData`** | The nearest parent block's data. If the field is not inside a block, this will be `undefined`. | +| **`path`** | The full path to the field in the schema, including array indexes. Useful for dynamic lookups. | +| **`user`** | The currently authenticated user object. | The `condition` function should return a boolean that will control if the field should be displayed or not. @@ -535,7 +545,7 @@ The `condition` function should return a boolean that will control if the field type: 'text', admin: { // highlight-start - condition: (data, siblingData, { user }) => { + condition: (data, siblingData, { blockData, path, user }) => { if (data.enableGreeting) { return true } else { diff --git a/docs/jobs-queue/jobs.mdx b/docs/jobs-queue/jobs.mdx index 3824504976..2ecc1125a7 100644 --- a/docs/jobs-queue/jobs.mdx +++ b/docs/jobs-queue/jobs.mdx @@ -44,3 +44,31 @@ const createdJob = await payload.jobs.queue({ }, }) ``` + +#### Cancelling Jobs + +Payload allows you to cancel jobs that are either queued or currently running. When cancelling a running job, the current task will finish executing, but no subsequent tasks will run. This happens because the job checks its cancellation status between tasks. + +##### Cancel a Single Job + +To cancel a specific job, use the `payload.jobs.cancelByID` method with the job's ID: + +```ts +await payload.jobs.cancelByID({ + id: createdJob.id, +}) +``` + +##### Cancel Multiple Jobs + +To cancel multiple jobs at once, use the `payload.jobs.cancel` method with a `Where` query: + +```ts +await payload.jobs.cancel({ + where: { + workflowSlug: { + equals: 'createPost', + }, + }, +}) +``` diff --git a/docs/live-preview/client.mdx b/docs/live-preview/client.mdx index 3ada88367b..5c107c20e7 100644 --- a/docs/live-preview/client.mdx +++ b/docs/live-preview/client.mdx @@ -239,16 +239,13 @@ export const useLivePreview = (props: { ## Example -For a working demonstration of this, check out the official [Live Preview Example](https://github.com/payloadcms/payload/tree/main/examples/live-preview). There you will find examples of various front-end frameworks and how to integrate each one of them, including: - -- [Next.js App Router](https://github.com/payloadcms/payload/tree/main/examples/live-preview/next-app) -- [Next.js Pages Router](https://github.com/payloadcms/payload/tree/main/examples/live-preview/next-pages) +For a working demonstration of this, check out the official [Live Preview Example](https://github.com/payloadcms/payload/tree/main/examples/live-preview). There you will find an example of a fully integrated Next.js App Router front-end that runs on the same server as Payload. ## Troubleshooting #### Relationships and/or uploads are not populating -If you are using relationships or uploads in your front-end application, and your front-end application runs on a different domain than your Payload server, you may need to configure [CORS](../configuration/overview) to allow requests to be made between the two domains. This includes sites that are running on a different port or subdomain. Similarly, if you are protecting resources behind user authentication, you may also need to configure [CSRF](../authentication/overview#csrf-protection) to allow cookies to be sent between the two domains. For example: +If you are using relationships or uploads in your front-end application, and your front-end application runs on a different domain than your Payload server, you may need to configure [CORS](../configuration/overview#cors) to allow requests to be made between the two domains. This includes sites that are running on a different port or subdomain. Similarly, if you are protecting resources behind user authentication, you may also need to configure [CSRF](../authentication/cookies#csrf-prevention) to allow cookies to be sent between the two domains. For example: ```ts // payload.config.ts diff --git a/docs/migration-guide/overview.mdx b/docs/migration-guide/overview.mdx index 386cee9a5c..fa3687d011 100644 --- a/docs/migration-guide/overview.mdx +++ b/docs/migration-guide/overview.mdx @@ -1113,6 +1113,57 @@ plugins: [ If you have custom features for `@payloadcms/richtext-lexical` you will need to migrate your code to the new API. Read more about the new API in the [documentation](https://payloadcms.com/docs/rich-text/building-custom-features). +## Reserved Field names + +Payload reserves certain field names for internal use. Using any of the following names in your collections or globals will result in those fields being sanitized from the config, which can cause deployment errors. Ensure that any conflicting fields are renamed before migrating. + +### General Reserved Names + +- `file` +- `_id` (MongoDB only) +- `__v` (MongoDB only) + +**Important Note**: It is recommended to avoid using field names with an underscore (`_`) prefix unless explicitly required by a plugin. Payload uses this prefix for internal columns, which can lead to conflicts in certain SQL conditions. The following are examples of reserved internal columns (this list is not exhaustive and other internal fields may also apply): + +- `_order` +- `_path` +- `_uuid` +- `_parent_id` +- `_locale` + +### Auth-Related Reserved Names + +These are restricted if your collection uses `auth: true` and does not have `disableAuthStrategy: true`: +- `salt` +- `hash` +- `apiKey` (when `auth.useAPIKey: true` is enabled) +- `useAPIKey` (when `auth.useAPIKey: true` is enabled) +- `resetPasswordToken` +- `resetPasswordExpiration` +- `password` +- `email` +- `username` + +### Upload-Related Reserved Names + +These apply if your collection has `upload: true` configured: + +- `filename` +- `mimetype` +- `filesize` +- `width` +- `height` +- `focalX` +- `focalY` +- `url` +- `thumbnailURL` + +If `imageSizes` is configured, the following are also reserved: + +- `sizes` + +If any of these names are found in your collection / global fields, update them before migrating to avoid unexpected issues. + ## Upgrade from previous beta Reference this [community-made site](https://payload-releases-filter.vercel.app/?version=3&from=152429656&to=188243150&sort=asc&breaking=on). Set your version, sort by oldest first, enable breaking changes only. diff --git a/docs/plugins/build-your-own.mdx b/docs/plugins/build-your-own.mdx index f4a92d1489..9c99082d4c 100644 --- a/docs/plugins/build-your-own.mdx +++ b/docs/plugins/build-your-own.mdx @@ -6,7 +6,7 @@ desc: Starting to build your own plugin? Find everything you need and learn best keywords: plugins, template, config, configuration, extensions, custom, documentation, Content Management System, cms, headless, javascript, node, react, nextjs --- -Building your own [Payload Plugin](./overview) is easy, and if you're already familiar with Payload then you'll have everything you need to get started. You can either start from scratch or use the [Plugin Template](#plugin-template) to get up and running quickly. +Building your own [Payload Plugin](./overview) is easy, and if you're already familiar with Payload then you'll have everything you need to get started. You can either start from scratch or use the [Plugin Template](#plugin-template) to get up and running quickly. To use the template, run `npx create-payload-app@latest --template plugin` directly in @@ -19,7 +19,7 @@ Our plugin template includes everything you need to build a full life-cycle plug - A local dev environment to develop the plugin - Test suite with integrated GitHub workflow -By abstracting your code into a plugin, you'll be able to reuse your feature across multiple projects and make it available for other developers to use. +By abstracting your code into a plugin, you'll be able to reuse your feature across multiple projects and make it available for other developers to use. ## Plugins Recap @@ -75,7 +75,7 @@ The purpose of the **dev** folder is to provide a sanitized local Payload projec Do **not** store any of the plugin functionality in this folder - it is purely an environment to _assist_ you with developing the plugin. -If you're starting from scratch, you can easily setup a dev environment like this: +If you're starting from scratch, you can easily setup a dev environment like this: ``` mkdir dev @@ -83,7 +83,7 @@ cd dev npx create-payload-app@latest ``` -If you're using the plugin template, the dev folder is built out for you and the `samplePlugin` has already been installed in `dev/payload.config.ts`. +If you're using the plugin template, the dev folder is built out for you and the `samplePlugin` has already been installed in `dev/payload.config.ts`. ``` plugins: [ @@ -96,7 +96,7 @@ If you're using the plugin template, the dev folder is built out for you an You can add to the `dev/payload.config.ts` and build out the dev project as needed to test your plugin. -When you're ready to start development, navigate into this folder with `cd dev` +When you're ready to start development, navigate into this folder with `cd dev` And then start the project with `pnpm dev` and pull up `http://localhost:3000` in your browser. @@ -108,7 +108,7 @@ A good test suite is essential to ensure quality and stability in your plugin. P Jest organizes tests into test suites and cases. We recommend creating tests based on the expected behavior of your plugin from start to finish. Read more about tests in the [Jest documentation.](https://jestjs.io/) -The plugin template provides a stubbed out test suite at `dev/plugin.spec.ts` which is ready to go - just add in your own test conditions and you're all set! +The plugin template provides a stubbed out test suite at `dev/plugin.spec.ts` which is ready to go - just add in your own test conditions and you're all set! ``` let payload: Payload @@ -160,7 +160,7 @@ export const seed = async (payload: Payload): Promise => { ## Building a Plugin -Now that we have our environment setup and dev project ready to go - it's time to build the plugin! +Now that we have our environment setup and dev project ready to go - it's time to build the plugin! ``` @@ -217,7 +217,7 @@ To reiterate, the essence of a [Payload Plugin](./overview) is simply to extend We are going to use spread syntax to allow us to add data to existing arrays without losing the existing data. It is crucial to spread the existing data correctly, else this can cause adverse behavior and conflicts with Payload Config and other plugins. -Let's say you want to build a plugin that adds a new collection: +Let's say you want to build a plugin that adds a new collection: ``` config.collections = [ @@ -227,7 +227,7 @@ config.collections = [ ] ``` -First, you need to spread the `config.collections` to ensure that we don't lose the existing collections. Then you can add any additional collections, just as you would in a regular Payload Config. +First, you need to spread the `config.collections` to ensure that we don't lose the existing collections. Then you can add any additional collections, just as you would in a regular Payload Config. This same logic is applied to other array and object like properties such as admin, globals and hooks: @@ -284,7 +284,7 @@ For a better user experience, provide a way to disable the plugin without uninst ### Include tests in your GitHub CI workflow -If you've configured tests for your package, integrate them into your workflow to run the tests each time you commit to the plugin repository. Learn more about [how to configure tests into your GitHub CI workflow.](https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-nodejs) +If you've configured tests for your package, integrate them into your workflow to run the tests each time you commit to the plugin repository. Learn more about [how to configure tests into your GitHub CI workflow.](https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-nodejs) ### Publish your finished plugin to npm diff --git a/docs/plugins/multi-tenant.mdx b/docs/plugins/multi-tenant.mdx index 743b8281ad..85ee3de109 100644 --- a/docs/plugins/multi-tenant.mdx +++ b/docs/plugins/multi-tenant.mdx @@ -52,7 +52,7 @@ The plugin accepts an object with the following properties: ```ts type MultiTenantPluginConfig = { -/** + /** * After a tenant is deleted, the plugin will attempt to clean up related documents * - removing documents with the tenant ID * - removing the tenant from users @@ -158,6 +158,16 @@ type MultiTenantPluginConfig = { rowFields?: never tenantFieldAccess?: never } + /** + * Customize tenant selector label + * + * Either a string or an object where the keys are locales and the values are the string labels + */ + tenantSelectorLabel?: + | Partial<{ + [key in AcceptedLanguages]?: string + }> + | string /** * The slug for the tenant collection * @@ -176,6 +186,14 @@ type MultiTenantPluginConfig = { * Opt out of adding access constraints to the tenants collection */ useTenantsCollectionAccess?: boolean + /** + * Opt out including the baseListFilter to filter tenants by selected tenant + */ + useTenantsListFilter?: boolean + /** + * Opt out including the baseListFilter to filter users by selected tenant + */ + useUsersTenantFilter?: boolean } ``` diff --git a/docs/rest-api/overview.mdx b/docs/rest-api/overview.mdx index 64c038b992..11b7b2f747 100644 --- a/docs/rest-api/overview.mdx +++ b/docs/rest-api/overview.mdx @@ -703,6 +703,31 @@ import { addLocalesToRequestFromData } from 'payload' } ``` +`headersWithCors` + +By default, custom endpoints don't handle CORS headers in responses. The `headersWithCors` function checks the Payload config and sets the appropriate CORS headers in the response accordingly. + +```ts +import { headersWithCors } from 'payload' + +// custom endpoint example +{ + path: '/:id/tracking', + method: 'post', + handler: async (req) => { + return Response.json( + { message: 'success' }, + { + headers: headersWithCors({ + headers: new Headers(), + req, + }) + }, + ) + } +} +``` + ## Method Override for GET Requests Payload supports a method override feature that allows you to send GET requests using the HTTP POST method. This can be particularly useful in scenarios when the query string in a regular GET request is too long. diff --git a/docs/rich-text/converters.mdx b/docs/rich-text/converters.mdx index a663a49586..6614b426ef 100644 --- a/docs/rich-text/converters.mdx +++ b/docs/rich-text/converters.mdx @@ -2,15 +2,15 @@ title: Lexical Converters label: Converters order: 20 -desc: Conversion between lexical, markdown and html -keywords: lexical, rich text, editor, headless cms, convert, html, mdx, markdown, md, conversion, export +desc: Conversion between lexical, markdown, jsx and html +keywords: lexical, rich text, editor, headless cms, convert, html, mdx, markdown, md, conversion, export, jsx --- Lexical saves data in JSON - this is great for storage and flexibility and allows you to easily to convert it to other formats like JSX, HTML or Markdown. ## Lexical => JSX -If your frontend uses React, converting Lexical to JSX is the recommended way to render rich text content. Import the `RichText` component from `@payloadcms/richtext-lexical/react` and pass the Lexical content to it: +For React-based frontends, converting Lexical content to JSX is the recommended rendering approach. Import the RichText component from @payloadcms/richtext-lexical/react and pass the Lexical content to it: ```tsx import React from 'react' @@ -24,46 +24,138 @@ export const MyComponent = ({ data }: { data: SerializedEditorState }) => { } ``` -The `RichText` component includes built-in serializers for common Lexical nodes but allows customization through the `converters` prop. - -In our website template [you have an example](https://github.com/payloadcms/payload/blob/main/templates/website/src/components/RichText/index.tsx) of how to use `converters` to render custom blocks. - +The `RichText` component includes built-in serializers for common Lexical nodes but allows customization through the `converters` prop. In our [website template](https://github.com/payloadcms/payload/blob/main/templates/website/src/components/RichText/index.tsx) you have an example of how to use `converters` to render custom blocks, custom nodes and override existing converters. - The JSX converter expects the input data to be fully populated. When fetching data, ensure the `depth` setting is high enough, to ensure that lexical nodes such as uploads are populated. + When fetching data, ensure your `depth` setting is high enough to fully populate Lexical nodes such as uploads. The JSX converter requires fully populated data to work correctly. -### Converting Lexical Blocks to JSX +### Converting Internal Links -In order to convert lexical blocks or inline blocks to JSX, you will have to pass the converter for your block to the RichText component. This converter is not included by default, as Payload doesn't know how to render your custom blocks. +By default, Payload doesn't know how to convert **internal** links to JSX, as it doesn't know what the corresponding URL of the internal link is. You'll notice that you get a "found internal link, but internalDocToHref is not provided" error in the console when you try to render content with internal links. + +To fix this, you need to pass the `internalDocToHref` prop to `LinkJSXConverter`. This prop is a function that receives the link node and returns the URL of the document. ```tsx -import React from 'react' -import { - type JSXConvertersFunction, - RichText, -} from '@payloadcms/richtext-lexical/react' +import type { DefaultNodeTypes, SerializedLinkNode } from '@payloadcms/richtext-lexical' import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' -const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ +import { + type JSXConvertersFunction, + LinkJSXConverter, + RichText, +} from '@payloadcms/richtext-lexical/react' +import React from 'react' + +const internalDocToHref = ({ linkNode }: { linkNode: SerializedLinkNode }) => { + const { relationTo, value } = linkNode.fields.doc! + if (typeof value !== 'object') { + throw new Error('Expected value to be an object') + } + const slug = value.slug + return relationTo === 'posts' ? `/posts/${slug}` : `/${slug}` +} + +const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ + ...defaultConverters, + ...LinkJSXConverter({ internalDocToHref }), +}) + +export const MyComponent: React.FC<{ + lexicalData: SerializedEditorState +}> = ({ lexicalData }) => { + return +} +``` + +### Converting Lexical Blocks + +To convert Lexical Blocks or Inline Blocks to JSX, pass the converter for your block to the `RichText` component. This converter is not included by default, as Payload doesn't know how to render your custom blocks. + +```tsx +'use client' +import type { MyInlineBlock, MyNumberBlock, MyTextBlock } from '@/payload-types' +import type { + DefaultNodeTypes, + SerializedBlockNode, + SerializedInlineBlockNode, +} from '@payloadcms/richtext-lexical' +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { type JSXConvertersFunction, RichText } from '@payloadcms/richtext-lexical/react' +import React from 'react' + +// Extend the default node types with your custom blocks for full type safety +type NodeTypes = + | DefaultNodeTypes + | SerializedBlockNode + | SerializedInlineBlockNode + +const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ ...defaultConverters, blocks: { - // myTextBlock is the slug of the block + // Each key should match your block's slug + myNumberBlock: ({ node }) =>
{node.fields.number}
, myTextBlock: ({ node }) =>
{node.fields.text}
, }, inlineBlocks: { - // myInlineBlock is the slug of the block + // Each key should match your inline block's slug myInlineBlock: ({ node }) => {node.fields.text}, }, }) -export const MyComponent = ({ lexicalData }) => { - return ( - - ) +export const MyComponent: React.FC<{ + lexicalData: SerializedEditorState +}> = ({ lexicalData }) => { + return +} +``` + +### Overriding Default JSX Converters + +You can override any of the default JSX converters by passing passing your custom converter, keyed to the node type, to the `converters` prop / the converters function. + +Example - overriding the upload node converter to use next/image: + +```tsx +'use client' +import type { DefaultNodeTypes, SerializedUploadNode } from '@payloadcms/richtext-lexical' +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { type JSXConvertersFunction, RichText } from '@payloadcms/richtext-lexical/react' +import Image from 'next/image' +import React from 'react' + +type NodeTypes = DefaultNodeTypes + +// Custom upload converter component that uses next/image +const CustomUploadComponent: React.FC<{ + node: SerializedUploadNode +}> = ({ node }) => { + if (node.relationTo === 'uploads') { + const uploadDoc = node.value + if (typeof uploadDoc !== 'object') { + return null + } + const { alt, height, url, width } = uploadDoc + return {alt} + } + + return null +} + +const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ + ...defaultConverters, + // Override the default upload converter + upload: ({ node }) => { + return + }, +}) + +export const MyComponent: React.FC<{ + lexicalData: SerializedEditorState +}> = ({ lexicalData }) => { + return } ``` @@ -71,19 +163,156 @@ export const MyComponent = ({ lexicalData }) => { If you don't have a React-based frontend, or if you need to send the content to a third-party service, you can convert lexical to HTML. There are two ways to do this: -1. **Outputting HTML from the Collection:** Create a new field in your collection to convert saved JSON content to HTML. Payload generates and outputs the HTML for use in your frontend. -2. **Generating HTML on any server** Convert JSON to HTML on-demand on the server. -In both cases, the conversion needs to happen on a server, as the HTML converter will automatically fetch data for nodes that require it (e.g. uploads and internal links). The editor comes with built-in HTML serializers, simplifying the process of converting JSON to HTML. +1. **Generating HTML in your frontend** Convert JSON to HTML on-demand wherever you need it (Recommended). +2. **Outputting HTML from the Collection:** Create a new field in your collection to convert saved JSON content to HTML. Payload generates and outputs the HTML for use in your frontend. This is not recommended, as this approach adds additional overhead to the Payload API and may not work with live preview. + +### Generating HTML in your frontend + +If you wish to convert JSON to HTML ad-hoc, use the `convertLexicalToHTML` function exported from `@payloadcms/richtext-lexical/html`: + +```tsx +'use client' + +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' +import { convertLexicalToHTML } from '@payloadcms/richtext-lexical/html' + +import React from 'react' + +export const MyComponent = ({ data }: { data: SerializedEditorState }) => { + const html = convertLexicalToHTML({ data }) + + return
+} +``` + +### Generating HTML in your frontend with dynamic population + +The default `convertLexicalToHTML` function does not populate data for nodes like uploads or links - it expects you to pass in the fully populated data. If you want the converter to dynamically populate those nodes as they are encountered, you have to use the async version of the converter, imported from `@payloadcms/richtext-lexical/html-async`, and pass in the `populate` function: + +```tsx +'use client' + +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { getRestPopulateFn } from '@payloadcms/richtext-lexical/client' +import { convertLexicalToHTMLAsync } from '@payloadcms/richtext-lexical/html-async' +import React, { useEffect, useState } from 'react' + +export const MyComponent = ({ data }: { data: SerializedEditorState }) => { + const [html, setHTML] = useState(null) + useEffect(() => { + async function convert() { + const html = await convertLexicalToHTMLAsync({ + data, + populate: getRestPopulateFn({ + apiURL: `http://localhost:3000/api`, + }), + }) + setHTML(html) + } + + void convert() + }, [data]) + + return html &&
+} +``` + +Do note that using the REST populate function will result in each node sending a separate request to the REST API, which may be slow for a large amount of nodes. On the server, you can use the payload populate function, which will be more efficient: + +```tsx +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { getPayloadPopulateFn } from '@payloadcms/richtext-lexical' +import { convertLexicalToHTMLAsync } from '@payloadcms/richtext-lexical/html-async' +import { getPayload } from 'payload' +import React from 'react' + +import config from '../../config.js' + +export const MyRSCComponent = async ({ data }: { data: SerializedEditorState }) => { + const payload = await getPayload({ + config, + }) + + const html = await convertLexicalToHTMLAsync({ + data, + populate: await getPayloadPopulateFn({ + currentDepth: 0, + depth: 1, + payload, + }), + }) + + return html &&
+} +``` + +### Converting Lexical Blocks + +```tsx +'use client' + +import type { MyInlineBlock, MyTextBlock } from '@/payload-types' +import type { + DefaultNodeTypes, + SerializedBlockNode, + SerializedInlineBlockNode, +} from '@payloadcms/richtext-lexical' +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { + convertLexicalToHTML, + type HTMLConvertersFunction, +} from '@payloadcms/richtext-lexical/html' +import React from 'react' + +type NodeTypes = + | DefaultNodeTypes + | SerializedBlockNode + | SerializedInlineBlockNode + +const htmlConverters: HTMLConvertersFunction = ({ defaultConverters }) => ({ + ...defaultConverters, + blocks: { + // Each key should match your block's slug + myTextBlock: ({ node, providedCSSString }) => + `
${node.fields.text}
`, + }, + inlineBlocks: { + // Each key should match your inline block's slug + myInlineBlock: ({ node, providedStyleTag }) => + `${node.fields.text}`, + }, +}) + +export const MyComponent = ({ data }: { data: SerializedEditorState }) => { + const html = convertLexicalToHTML({ + converters: htmlConverters, + data, + }) + + return
+} +``` ### Outputting HTML from the Collection To add HTML generation directly within the collection, follow the example below: ```ts +import type { HTMLConvertersFunction } from '@payloadcms/richtext-lexical/html' +import type { MyTextBlock } from '@/payload-types.js' import type { CollectionConfig } from 'payload' -import { HTMLConverterFeature, lexicalEditor, lexicalHTML } from '@payloadcms/richtext-lexical' +import { + BlocksFeature, + type DefaultNodeTypes, + lexicalEditor, + lexicalHTMLField, + type SerializedBlockNode, +} from '@payloadcms/richtext-lexical' const Pages: CollectionConfig = { slug: 'pages', @@ -91,71 +320,53 @@ const Pages: CollectionConfig = { { name: 'nameOfYourRichTextField', type: 'richText', + editor: lexicalEditor(), + }, + lexicalHTMLField({ + htmlFieldName: 'nameOfYourRichTextField_html', + lexicalFieldName: 'nameOfYourRichTextField', + }), + { + name: 'customRichText', + type: 'richText', editor: lexicalEditor({ features: ({ defaultFeatures }) => [ ...defaultFeatures, - // The HTMLConverter Feature is the feature which manages the HTML serializers. - // If you do not pass any arguments to it, it will use the default serializers. - HTMLConverterFeature({}), + BlocksFeature({ + blocks: [ + { + interfaceName: 'MyTextBlock', + slug: 'myTextBlock', + fields: [ + { + name: 'text', + type: 'text', + }, + ], + }, + ], + }), ], }), }, - lexicalHTML('nameOfYourRichTextField', { name: 'nameOfYourRichTextField_html' }), + lexicalHTMLField({ + htmlFieldName: 'customRichText_html', + lexicalFieldName: 'customRichText', + // can pass in additional converters or override default ones + converters: (({ defaultConverters }) => ({ + ...defaultConverters, + blocks: { + myTextBlock: ({ node, providedCSSString }) => + `
${node.fields.text}
`, + }, + })) as HTMLConvertersFunction>, + }), ], } ``` The `lexicalHTML()` function creates a new field that automatically converts the referenced lexical richText field into HTML through an afterRead hook. -### Generating HTML anywhere on the server - -If you wish to convert JSON to HTML ad-hoc, use the `convertLexicalToHTML` function: - -```ts -import { consolidateHTMLConverters, convertLexicalToHTML } from '@payloadcms/richtext-lexical' - - -await convertLexicalToHTML({ - converters: consolidateHTMLConverters({ editorConfig }), - data: editorData, - payload, // if you have Payload but no req available, pass it in here to enable server-only functionality (e.g. proper conversion of upload nodes) - req, // if you have req available, pass it in here to enable server-only functionality (e.g. proper conversion of upload nodes). No need to pass in Payload if req is passed in. -}) -``` -This method employs `convertLexicalToHTML` from `@payloadcms/richtext-lexical`, which converts the serialized editor state into HTML. - -Because every `Feature` is able to provide html converters, and because the `htmlFeature` can modify those or provide their own, we need to consolidate them with the default html Converters using the `consolidateHTMLConverters` function. - -#### Example: Generating HTML within an afterRead hook - -```ts -import type { FieldHook } from 'payload' - -import { - HTMLConverterFeature, - consolidateHTMLConverters, - convertLexicalToHTML, - defaultEditorConfig, - defaultEditorFeatures, - sanitizeServerEditorConfig, -} from '@payloadcms/richtext-lexical' - -const hook: FieldHook = async ({ req, siblingData }) => { - const editorConfig = defaultEditorConfig - - editorConfig.features = [...defaultEditorFeatures, HTMLConverterFeature({})] - - const sanitizedEditorConfig = await sanitizeServerEditorConfig(editorConfig, req.payload.config) - - const html = await convertLexicalToHTML({ - converters: consolidateHTMLConverters({ editorConfig: sanitizedEditorConfig }), - data: siblingData.lexicalSimple, - req, - }) - return html -} -``` - ### CSS Payload's lexical HTML converter does not generate CSS for you, but it does add classes to the generated HTML. You can use these classes to style the HTML in your frontend. @@ -169,141 +380,85 @@ Here is some "base" CSS you can use to ensure that nested lists render correctly } ``` -### Creating your own HTML Converter - -HTML Converters are typed as `HTMLConverter`, which contains the node type it should handle, and a function that accepts the serialized node from the lexical editor, and outputs the HTML string. Here's the HTML Converter of the Upload node as an example: - -```ts -import type { HTMLConverter } from '@payloadcms/richtext-lexical' - -const UploadHTMLConverter: HTMLConverter = { - converter: async ({ node, req }) => { - const uploadDocument: { - value?: any - } = {} - if(req) { - await populate({ - id, - collectionSlug: node.relationTo, - currentDepth: 0, - data: uploadDocument, - depth: 1, - draft: false, - key: 'value', - overrideAccess: false, - req, - showHiddenFields: false, - }) - } - - const url = (req?.payload?.config?.serverURL || '') + uploadDocument?.value?.url - - if (!(uploadDocument?.value?.mimeType as string)?.startsWith('image')) { - // Only images can be serialized as HTML - return `` - } - - return `${uploadDocument?.value?.filename}` - }, - nodeTypes: [UploadNode.getType()], // This is the type of the lexical node that this converter can handle. Instead of hardcoding 'upload' we can get the node type directly from the UploadNode, since it's static. -} -``` - -As you can see, we have access to all the information saved in the node (for the Upload node, this is `value`and `relationTo`) and we can use that to generate the HTML. - -The `convertLexicalToHTML` is part of `@payloadcms/richtext-lexical` automatically handles traversing the editor state and calling the correct converter for each node. - -### Embedding the HTML Converter in your Feature - -You can embed your HTML Converter directly within your custom `ServerFeature`, allowing it to be handled automatically by the `consolidateHTMLConverters` function. Here is an example: - -```ts -import { createNode } from '@payloadcms/richtext-lexical' -import type { FeatureProviderProviderServer } from '@payloadcms/richtext-lexical' - -export const UploadFeature: FeatureProviderProviderServer< - UploadFeatureProps, - UploadFeaturePropsClient -> = (props) => { - /*...*/ - return { - feature: () => { - return { - nodes: [ - createNode({ - converters: { - html: yourHTMLConverter, // <= This is where you define your HTML Converter - }, - node: UploadNode, - //... - }), - ], - ClientComponent: UploadFeatureClientComponent, - clientFeatureProps: clientProps, - serverFeatureProps: props, - /*...*/ - } - }, - key: 'upload', - serverFeatureProps: props, - } -} -``` - ## Headless Editor Lexical provides a seamless way to perform conversions between various other formats: -- HTML to Lexical (or, importing HTML into the lexical editor) -- Markdown to Lexical (or, importing Markdown into the lexical editor) +- HTML to Lexical +- Markdown to Lexical - Lexical to Markdown A headless editor can perform such conversions outside of the main editor instance. Follow this method to initiate a headless editor: ```ts import { createHeadlessEditor } from '@payloadcms/richtext-lexical/lexical/headless' -import { getEnabledNodes, sanitizeServerEditorConfig } from '@payloadcms/richtext-lexical' +import { getEnabledNodes, editorConfigFactory } from '@payloadcms/richtext-lexical' -const yourEditorConfig // <= your editor config here const payloadConfig // <= your Payload Config here const headlessEditor = createHeadlessEditor({ nodes: getEnabledNodes({ - editorConfig: sanitizeServerEditorConfig(yourEditorConfig, payloadConfig), + editorConfig: await editorConfigFactory.default({config: payloadConfig}) }), }) ``` ### Getting the editor config -As you can see, you need to provide an editor config in order to create a headless editor. This is because the editor config is used to determine which nodes & features are enabled, and which converters are used. +You need to provide an editor config in order to create a headless editor. This is because the editor config is used to determine which nodes & features are enabled, and which converters are used. -To get the editor config, simply import the default editor config and adjust it - just like you did inside of the `editor: lexicalEditor({})` property: +To get the editor config, import the `editorConfigFactory` factory - this factory provides a variety of ways to get the editor config, depending on your use case. ```ts -import { defaultEditorConfig, defaultEditorFeatures } from '@payloadcms/richtext-lexical' // <= make sure this package is installed +import type { SanitizedConfig } from 'payload' -const yourEditorConfig = defaultEditorConfig +import { + editorConfigFactory, + FixedToolbarFeature, + lexicalEditor, +} from '@payloadcms/richtext-lexical' -// If you made changes to the features of the field's editor config, you should also make those changes here: -yourEditorConfig.features = [ - ...defaultEditorFeatures, - // Add your custom features here -] +// Your config needs to be available in order to retrieve the default editor config +const config: SanitizedConfig = {} as SanitizedConfig + +// Version 1 - use the default editor config +const yourEditorConfig = await editorConfigFactory.default({ config }) + +// Version 2 - if you have access to a lexical fields, you can extract the editor config from it +const yourEditorConfig2 = editorConfigFactory.fromField({ + field: collectionConfig.fields[1], +}) + +// Version 3 - create a new editor config - behaves just like instantiating a new `lexicalEditor` +const yourEditorConfig3 = await editorConfigFactory.fromFeatures({ + config, + features: ({ defaultFeatures }) => [...defaultFeatures, FixedToolbarFeature()], +}) + +// Version 4 - if you have instantiated a lexical editor and are accessing it outside a field (=> this is the unsanitized editor), +// you can extract the editor config from it. +// This is common if you define the editor in a re-usable module scope variable and pass it to the richText field. +// This is the least efficient way to get the editor config, and not recommended. It is recommended to extract the `features` arg +// into a separate variable and use `fromFeatures` instead. +const editor = lexicalEditor({ + features: ({ defaultFeatures }) => [...defaultFeatures, FixedToolbarFeature()], +}) + +const yourEditorConfig4 = await editorConfigFactory.fromEditor({ + config, + editor, +}) ``` -### Getting the editor config from an existing field +### Example - Getting the editor config from an existing field If you have access to the sanitized collection config, you can get access to the lexical sanitized editor config & features, as every lexical richText field returns it. Here is an example how you can get it from another field's afterRead hook: ```ts import type { CollectionConfig, RichTextField } from 'payload' + +import { editorConfigFactory, getEnabledNodes, lexicalEditor } from '@payloadcms/richtext-lexical' import { createHeadlessEditor } from '@payloadcms/richtext-lexical/lexical/headless' -import type { LexicalRichTextAdapter, SanitizedServerEditorConfig } from '@payloadcms/richtext-lexical' -import { - getEnabledNodes, - lexicalEditor -} from '@payloadcms/richtext-lexical' export const MyCollection: CollectionConfig = { slug: 'slug', @@ -313,20 +468,18 @@ export const MyCollection: CollectionConfig = { type: 'text', hooks: { afterRead: [ - ({ value, collection }) => { - const otherRichTextField: RichTextField = collection.fields.find( + ({ siblingFields, value }) => { + const field: RichTextField = siblingFields.find( (field) => 'name' in field && field.name === 'richText', ) as RichTextField - const lexicalAdapter: LexicalRichTextAdapter = - otherRichTextField.editor as LexicalRichTextAdapter - - const sanitizedServerEditorConfig: SanitizedServerEditorConfig = - lexicalAdapter.editorConfig + const editorConfig = editorConfigFactory.fromField({ + field, + }) const headlessEditor = createHeadlessEditor({ nodes: getEnabledNodes({ - editorConfig: sanitizedServerEditorConfig, + editorConfig, }), }) @@ -340,37 +493,43 @@ export const MyCollection: CollectionConfig = { { name: 'richText', type: 'richText', - editor: lexicalEditor({ - features, - }), - } - ] + editor: lexicalEditor(), + }, + ], } ``` ## HTML => Lexical -Once you have your headless editor instance, you can use it to convert HTML to Lexical: +If you have access to the Payload Config and the lexical editor config, you can convert HTML to the lexical editor state with the following: ```ts -import { $generateNodesFromDOM } from '@payloadcms/richtext-lexical/lexical/html' -import { $getRoot, $getSelection } from '@payloadcms/richtext-lexical/lexical' +import { convertHTMLToLexical, editorConfigFactory } from '@payloadcms/richtext-lexical' +// Make sure you have jsdom and @types/jsdom installed import { JSDOM } from 'jsdom' +const html = convertHTMLToLexical({ + editorConfig: await editorConfigFactory.default({ + config, // <= make sure you have access to your Payload Config + }), + html: '

text

', + JSDOM, // pass the JSDOM import. As it's a relatively large package, richtext-lexical does not include it by default. +}) +``` + +## Markdown => Lexical + +Convert markdown content to the Lexical editor format with the following: + +```ts +import { $convertFromMarkdownString, editorConfigFactory } from '@payloadcms/richtext-lexical' + +const yourEditorConfig = await editorConfigFactory.default({ config }) +const markdown = `# Hello World` + headlessEditor.update( () => { - // In a headless environment you can use a package such as JSDom to parse the HTML string. - const dom = new JSDOM(htmlString) - - // Once you have the DOM instance it's easy to generate LexicalNodes. - const nodes = $generateNodesFromDOM(headlessEditor, dom.window.document) - - // Select the root - $getRoot().select() - - // Insert them at a selection. - const selection = $getSelection() - selection.insertNodes(nodes) + $convertFromMarkdownString(markdown, yourEditorConfig.features.markdownTransformers) }, { discrete: true }, ) @@ -390,27 +549,6 @@ This has been taken from the [lexical serialization & deserialization docs](http immediate reading of the updated state isn't necessary, you can omit the flag. -## Markdown => Lexical - -Convert markdown content to the Lexical editor format with the following: - -```ts -import { sanitizeServerEditorConfig, $convertFromMarkdownString } from '@payloadcms/richtext-lexical' - -const yourSanitizedEditorConfig = sanitizeServerEditorConfig(yourEditorConfig, payloadConfig) // <= your editor config & Payload Config here -const markdown = `# Hello World` - -headlessEditor.update( - () => { - $convertFromMarkdownString(markdown, yourSanitizedEditorConfig.features.markdownTransformers) - }, - { discrete: true }, -) - -// Do this if you then want to get the editor JSON -const editorJSON = headlessEditor.getEditorState().toJSON() -``` - ## Lexical => Markdown Export content from the Lexical editor into Markdown format using these steps: @@ -421,11 +559,12 @@ Export content from the Lexical editor into Markdown format using these steps: Here's the code for it: ```ts -import { $convertToMarkdownString } from '@payloadcms/richtext-lexical/lexical/markdown' -import { sanitizeServerEditorConfig } from '@payloadcms/richtext-lexical' import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' -const yourSanitizedEditorConfig = sanitizeServerEditorConfig(yourEditorConfig, payloadConfig) // <= your editor config & Payload Config here +import { editorConfigFactory } from '@payloadcms/richtext-lexical' +import { $convertToMarkdownString } from '@payloadcms/richtext-lexical/lexical/markdown' + +const yourEditorConfig = await editorConfigFactory.default({ config }) const yourEditorState: SerializedEditorState // <= your current editor state here // Import editor state into your headless editor @@ -434,7 +573,7 @@ try { () => { headlessEditor.setEditorState(headlessEditor.parseEditorState(yourEditorState)) }, - { discrete: true }, // This should commit the editor state immediately + { discrete: true }, // This should commit the editor state immediately ) } catch (e) { logger.error({ err: e }, 'ERROR parsing editor state') @@ -443,7 +582,7 @@ try { // Export to markdown let markdown: string headlessEditor.getEditorState().read(() => { - markdown = $convertToMarkdownString(yourSanitizedEditorConfig?.features?.markdownTransformers) + markdown = $convertToMarkdownString(yourEditorConfig?.features?.markdownTransformers) }) ``` @@ -464,13 +603,13 @@ const yourEditorState: SerializedEditorState // <= your current editor state her // Import editor state into your headless editor try { - headlessEditor.update( + headlessEditor.update( () => { headlessEditor.setEditorState(headlessEditor.parseEditorState(yourEditorState)) }, - { discrete: true }, // This should commit the editor state immediately + { discrete: true }, // This should commit the editor state immediately ) - } catch (e) { +} catch (e) { logger.error({ err: e }, 'ERROR parsing editor state') } diff --git a/docs/rich-text/custom-features.mdx b/docs/rich-text/custom-features.mdx index f9701deceb..ec6bdf8162 100644 --- a/docs/rich-text/custom-features.mdx +++ b/docs/rich-text/custom-features.mdx @@ -29,9 +29,9 @@ Using the BlocksFeature, you can add both inline blocks (= can be inserted into ### Example: Code Field Block with language picker -This example demonstrates how to create a custom code field block with a language picker using the `BlocksFeature`. Make sure to manually install `@payloadcms/ui`first. +This example demonstrates how to create a custom code field block with a language picker using the `BlocksFeature`. First, make sure to explicitly install `@payloadcms/ui` in your project. -Field config: +Field Config: ```ts import { @@ -91,7 +91,6 @@ CodeComponent.tsx: ```tsx 'use client' - import type { CodeFieldClient, CodeFieldClientProps } from 'payload' import { CodeField, useFormFields } from '@payloadcms/ui' @@ -105,6 +104,8 @@ const languageKeyToMonacoLanguageMap = { tsx: 'typescript', } +type Language = keyof typeof languageKeyToMonacoLanguageMap + export const Code: React.FC = ({ autoComplete, field, @@ -118,10 +119,10 @@ export const Code: React.FC = ({ }) => { const languageField = useFormFields(([fields]) => fields['language']) - const language: string = - (languageField?.value as string) || (languageField.initialValue as string) || 'typescript' + const language: Language = + (languageField?.value as Language) || (languageField?.initialValue as Language) || 'ts' - const label = languages[language as keyof typeof languages] + const label = languages[language] const props: CodeFieldClient = useMemo( () => ({ @@ -129,9 +130,10 @@ export const Code: React.FC = ({ type: 'code', admin: { ...field.admin, - label, + editorOptions: undefined, language: languageKeyToMonacoLanguageMap[language] || language, }, + label, }), [field, language, label], ) diff --git a/docs/rich-text/overview.mdx b/docs/rich-text/overview.mdx index 5374950e46..878579fba5 100644 --- a/docs/rich-text/overview.mdx +++ b/docs/rich-text/overview.mdx @@ -158,7 +158,7 @@ Here's an overview of all the included features: | **`IndentFeature`** | Yes | Allows you to indent text with the tab key | | **`UnorderedListFeature`** | Yes | Adds unordered lists (ul) | | **`OrderedListFeature`** | Yes | Adds ordered lists (ol) | -| **`CheckListFeature`** | Yes | Adds checklists | +| **`ChecklistFeature`** | Yes | Adds checklists | | **`LinkFeature`** | Yes | Allows you to create internal and external links | | **`RelationshipFeature`** | Yes | Allows you to create block-level (not inline) relationships to other documents | | **`BlockquoteFeature`** | Yes | Allows you to create block-level quotes | diff --git a/docs/upload/overview.mdx b/docs/upload/overview.mdx index c37b669c98..f12a06160e 100644 --- a/docs/upload/overview.mdx +++ b/docs/upload/overview.mdx @@ -185,6 +185,8 @@ The [Admin Panel](../admin/overview) will also automatically display all availab Behind the scenes, Payload relies on [`sharp`](https://sharp.pixelplumbing.com/api-resize#resize) to perform its image resizing. You can specify additional options for `sharp` to use while resizing your images. +Note that for image resizing to work, `sharp` must be specified in your [Payload Config](../configuration/overview). This is configured by default if you created your Payload project with `create-payload-app`. See `sharp` in [Config Options](../configuration/overview#config-options). + #### Accessing the resized images in hooks All auto-resized images are exposed to be re-used in hooks and similar via an object that is bound to `req.payloadUploadSizes`. @@ -347,6 +349,32 @@ fetch('api/:upload-slug', { }) ``` +## Uploading Files stored locally + +If you want to upload a file stored on your machine directly using the `payload.create` method, for example, during a seed script, +you can use the `filePath` property to specify the local path of the file. + +```ts +const localFilePath = path.resolve(__dirname, filename) + +await payload.create({ + collection: 'media', + data: { + alt, + }, + filePath: localFilePath, +}) +``` + +The `data` property should still include all the required fields of your `media` collection. + + + **Important:** + + Remember that all custom hooks attached to the `media` collection will still trigger. + Ensure that files match the specified mimeTypes or sizes defined in the collection's `formatOptions` or custom `hooks`. + + ## Uploading Files from Remote URLs The `pasteURL` option allows users to fetch files from remote URLs by pasting them into an Upload field. This option is **enabled by default** and can be configured to either **allow unrestricted client-side fetching** or **restrict server-side fetching** to specific trusted domains. diff --git a/docs/upload/storage-adapters.mdx b/docs/upload/storage-adapters.mdx index 1c7bff85f7..af93715e66 100644 --- a/docs/upload/storage-adapters.mdx +++ b/docs/upload/storage-adapters.mdx @@ -30,6 +30,7 @@ pnpm add @payloadcms/storage-vercel-blob - Configure the `collections` object to specify which collections should use the Vercel Blob adapter. The slug _must_ match one of your existing collection slugs. - Ensure you have `BLOB_READ_WRITE_TOKEN` set in your Vercel environment variables. This is usually set by Vercel automatically after adding blob storage to your project. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. ```ts import { vercelBlobStorage } from '@payloadcms/storage-vercel-blob' @@ -64,6 +65,7 @@ export default buildConfig({ | `addRandomSuffix` | Add a random suffix to the uploaded file name in Vercel Blob storage | `false` | | `cacheControlMaxAge` | Cache-Control max-age in seconds | `365 * 24 * 60 * 60` (1 Year) | | `token` | Vercel Blob storage read/write token | `''` | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel. | | ## S3 Storage [`@payloadcms/storage-s3`](https://www.npmjs.com/package/@payloadcms/storage-s3) @@ -79,6 +81,7 @@ pnpm add @payloadcms/storage-s3 - Configure the `collections` object to specify which collections should use the S3 Storage adapter. The slug _must_ match one of your existing collection slugs. - The `config` object can be any [`S3ClientConfig`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3) object (from [`@aws-sdk/client-s3`](https://github.com/aws/aws-sdk-js-v3)). _This is highly dependent on your AWS setup_. Check the AWS documentation for more information. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method for the bucket to your website. ```ts import { s3Storage } from '@payloadcms/storage-s3' @@ -126,6 +129,7 @@ pnpm add @payloadcms/storage-azure - Configure the `collections` object to specify which collections should use the Azure Blob adapter. The slug _must_ match one of your existing collection slugs. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method to your website. ```ts import { azureStorage } from '@payloadcms/storage-azure' @@ -161,6 +165,7 @@ export default buildConfig({ | `baseURL` | Base URL for the Azure Blob storage account | | | `connectionString` | Azure Blob storage connection string | | | `containerName` | Azure Blob storage container name | | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel. | | ## Google Cloud Storage [`@payloadcms/storage-gcs`](https://www.npmjs.com/package/@payloadcms/storage-gcs) @@ -175,6 +180,7 @@ pnpm add @payloadcms/storage-gcs - Configure the `collections` object to specify which collections should use the Google Cloud Storage adapter. The slug _must_ match one of your existing collection slugs. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method for the bucket to your website. ```ts import { gcsStorage } from '@payloadcms/storage-gcs' @@ -203,13 +209,14 @@ export default buildConfig({ ### Configuration Options#gcs-configuration -| Option | Description | Default | -| ------------- | --------------------------------------------------------------------------------------------------- | --------- | -| `enabled` | Whether or not to enable the plugin | `true` | -| `collections` | Collections to apply the storage to | | -| `bucket` | The name of the bucket to use | | -| `options` | Google Cloud Storage client configuration. See [Docs](https://github.com/googleapis/nodejs-storage) | | -| `acl` | Access control list for files that are uploaded | `Private` | +| Option | Description | Default | +| --------------- | --------------------------------------------------------------------------------------------------- | --------- | +| `enabled` | Whether or not to enable the plugin | `true` | +| `collections` | Collections to apply the storage to | | +| `bucket` | The name of the bucket to use | | +| `options` | Google Cloud Storage client configuration. See [Docs](https://github.com/googleapis/nodejs-storage) | | +| `acl` | Access control list for files that are uploaded | `Private` | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel. | | ## Uploadthing Storage @@ -226,6 +233,7 @@ pnpm add @payloadcms/storage-uploadthing - Configure the `collections` object to specify which collections should use uploadthing. The slug _must_ match one of your existing collection slugs and be an `upload` type. - Get a token from Uploadthing and set it as `token` in the `options` object. - `acl` is optional and defaults to `public-read`. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. ```ts export default buildConfig({ @@ -246,13 +254,14 @@ export default buildConfig({ ### Configuration Options#uploadthing-configuration -| Option | Description | Default | -| ---------------- | ----------------------------------------------- | ------------- | -| `token` | Token from Uploadthing. Required. | | -| `acl` | Access control list for files that are uploaded | `public-read` | -| `logLevel` | Log level for Uploadthing | `info` | -| `fetch` | Custom fetch function | `fetch` | -| `defaultKeyType` | Default key type for file operations | `fileKey` | +| Option | Description | Default | +| ---------------- | ------------------------------------------------------------- | ------------- | +| `token` | Token from Uploadthing. Required. | | +| `acl` | Access control list for files that are uploaded | `public-read` | +| `logLevel` | Log level for Uploadthing | `info` | +| `fetch` | Custom fetch function | `fetch` | +| `defaultKeyType` | Default key type for file operations | `fileKey` | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel. | | ## Custom Storage Adapters diff --git a/examples/draft-preview/README.md b/examples/draft-preview/README.md index c92d656775..764950db6e 100644 --- a/examples/draft-preview/README.md +++ b/examples/draft-preview/README.md @@ -68,7 +68,7 @@ If your front-end is statically generated then you may also want to regenerate t ### Admin Bar -You might also want to render an admin bar on your front-end so that logged-in users can quickly navigate between the front-end and Payload as they're editing. For React apps, check out the official [Payload Admin Bar](https://github.com/payloadcms/payload-admin-bar). For other frameworks, simply hit the `/me` route with `credentials: 'include'` and render your own admin bar if the user is logged in. +You might also want to render an admin bar on your front-end so that logged-in users can quickly navigate between the front-end and Payload as they're editing. For React apps, check out the official [Payload Admin Bar](https://github.com/payloadcms/payload/tree/main/packages/admin-bar). For other frameworks, simply hit the `/me` route with `credentials: 'include'` and render your own admin bar if the user is logged in. ### CORS diff --git a/examples/draft-preview/package.json b/examples/draft-preview/package.json index 933ae688cc..8416f01130 100644 --- a/examples/draft-preview/package.json +++ b/examples/draft-preview/package.json @@ -16,6 +16,7 @@ "start": "cross-env NODE_OPTIONS=--no-deprecation next start" }, "dependencies": { + "@payloadcms/admin-bar": "latest", "@payloadcms/db-mongodb": "latest", "@payloadcms/next": "latest", "@payloadcms/richtext-slate": "latest", @@ -25,7 +26,6 @@ "graphql": "^16.9.0", "next": "^15.0.0", "payload": "latest", - "payload-admin-bar": "^1.0.6", "react": "19.0.0", "react-dom": "19.0.0" }, diff --git a/examples/draft-preview/pnpm-lock.yaml b/examples/draft-preview/pnpm-lock.yaml index e400d9ecf5..0d568e2b3d 100644 --- a/examples/draft-preview/pnpm-lock.yaml +++ b/examples/draft-preview/pnpm-lock.yaml @@ -8,18 +8,21 @@ importers: .: dependencies: + '@payloadcms/admin-bar': + specifier: latest + version: 3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@payloadcms/db-mongodb': specifier: latest - version: 3.20.0(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2)) '@payloadcms/next': specifier: latest - version: 3.20.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + version: 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) '@payloadcms/richtext-slate': specifier: latest - version: 3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) '@payloadcms/ui': specifier: latest - version: 3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) dotenv: specifier: ^8.2.0 version: 8.6.0 @@ -31,13 +34,10 @@ importers: version: 16.10.0 next: specifier: ^15.0.0 - version: 15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + version: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) payload: specifier: latest - version: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - payload-admin-bar: - specifier: ^1.0.6 - version: 1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 3.25.0(graphql@16.10.0)(typescript@5.5.2) react: specifier: 19.0.0 version: 19.0.0 @@ -47,10 +47,10 @@ importers: devDependencies: '@payloadcms/graphql': specifier: latest - version: 3.20.0(graphql@16.10.0)(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2) + version: 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2) '@swc/core': specifier: ^1.6.13 - version: 1.10.12(@swc/helpers@0.5.15) + version: 1.11.5(@swc/helpers@0.5.15) '@types/escape-html': specifier: ^1.0.2 version: 1.0.4 @@ -65,29 +65,29 @@ importers: version: 8.57.1 eslint-config-next: specifier: ^15.0.0 - version: 15.1.6(eslint@8.57.1)(typescript@5.5.2) + version: 15.2.0(eslint@8.57.1)(typescript@5.5.2) slate: specifier: ^0.82.0 version: 0.82.1 tsx: specifier: ^4.16.2 - version: 4.19.2 + version: 4.19.3 typescript: specifier: 5.5.2 version: 5.5.2 packages: - '@apidevtools/json-schema-ref-parser@11.9.0': - resolution: {integrity: sha512-8Q/r5mXLa8Rfyh6r4SgEEFJgISVN5cDNFlcfSWLgFn3odzQhTfHAqzI3hMGdcROViL+8NrDNVVFQtEUrYOksDg==} + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.5': - resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': @@ -102,27 +102,30 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.7': - resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.7': - resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.7': - resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} + '@date-fns/tz@1.2.0': + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: @@ -198,144 +201,294 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + 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-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + 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/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + 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/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + 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/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + 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-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + 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-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + 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-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + 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-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + 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-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + 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-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + 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-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + 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/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + 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/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + 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/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + 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-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + 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] + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -360,17 +513,17 @@ packages: 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==} + '@faceless-ui/scroll-info@2.0.0': + resolution: {integrity: sha512-BkyJ9OQ4bzpKjE3UhI8BhcG36ZgfB4run8TmlaR4oMFUbl59dfyarNfjveyimrxIso9RhFEja/AJ5nQmbcR9hw==} peerDependencies: - react: ^19.0.0-rc-f994737d14-20240522 - react-dom: ^19.0.0-rc-f994737d14-20240522 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@faceless-ui/window-info@3.0.0-beta.0': - resolution: {integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==} + '@faceless-ui/window-info@3.0.1': + resolution: {integrity: sha512-uPjdJYE/j7hqVNelE9CRUNOeXuXDdPxR4DMe+oz3xwyZi2Y4CxsfpfdPTqqwmNAZa1P33O+ZiCyIkBEeNed0kw==} 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 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@floating-ui/core@1.6.9': resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} @@ -384,8 +537,8 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.27.3': - resolution: {integrity: sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg==} + '@floating-ui/react@0.27.5': + resolution: {integrity: sha512-BX3jKxo39Ba05pflcQmqPPwc0qdNsdNi/eweAFtoIdrJWNen2sVEWMEac3i6jU55Qfx+lOcdMNKYn2CtWmlnOQ==} peerDependencies: react: '>=17.0.0' react-dom: '>=17.0.0' @@ -535,71 +688,69 @@ packages: '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - '@monaco-editor/loader@1.4.0': - resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} - peerDependencies: - monaco-editor: '>= 0.21.0 < 1' + '@monaco-editor/loader@1.5.0': + resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} - '@monaco-editor/react@4.6.0': - resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} + '@monaco-editor/react@4.7.0': + resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} 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 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@mongodb-js/saslprep@1.1.9': - resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} + '@mongodb-js/saslprep@1.2.0': + resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} - '@next/env@15.1.6': - resolution: {integrity: sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==} + '@next/env@15.2.0': + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} - '@next/eslint-plugin-next@15.1.6': - resolution: {integrity: sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==} + '@next/eslint-plugin-next@15.2.0': + resolution: {integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==} - '@next/swc-darwin-arm64@15.1.6': - resolution: {integrity: sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==} + '@next/swc-darwin-arm64@15.2.0': + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.6': - resolution: {integrity: sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==} + '@next/swc-darwin-x64@15.2.0': + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.6': - resolution: {integrity: sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==} + '@next/swc-linux-arm64-gnu@15.2.0': + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.6': - resolution: {integrity: sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==} + '@next/swc-linux-arm64-musl@15.2.0': + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.6': - resolution: {integrity: sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==} + '@next/swc-linux-x64-gnu@15.2.0': + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.6': - resolution: {integrity: sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==} + '@next/swc-linux-x64-musl@15.2.0': + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.6': - resolution: {integrity: sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==} + '@next/swc-win32-arm64-msvc@15.2.0': + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.6': - resolution: {integrity: sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==} + '@next/swc-win32-x64-msvc@15.2.0': + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -620,42 +771,48 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@payloadcms/db-mongodb@3.20.0': - resolution: {integrity: sha512-Zg+A2KRKyPCDEhalskLVqA1IV48XtE6lWkImzvvRse9PZHQUXSnZ/VdAgY0SdruyRJ5GJHD/Crn34fFw5nXkwQ==} + '@payloadcms/admin-bar@3.27.0': + resolution: {integrity: sha512-cfEKkE2ovr65up6ZZTToYB0KRmdTFHkcQjw/lQhXJaJdo35mesZYC5h8jq1+/3knaBR7A0OHtuWjO+lAFJfGrw==} peerDependencies: - payload: 3.20.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@payloadcms/graphql@3.20.0': - resolution: {integrity: sha512-tX02oa9V5Uoe2ra1aK4zX9CGQV7iNxoDZorbBbj2GZD7H6ADQHnlevpy1edMmR1Jv2Hf4TB92awXfE6PkdNQew==} + '@payloadcms/db-mongodb@3.25.0': + resolution: {integrity: sha512-M5aD+s698wlmagTJPqgKySrwtuIjtwEJHQ8Ft5qLZWM/ngizrePbW/N/jGicSkuKJjwlP0fwJSrDQ4bkAN515g==} + peerDependencies: + payload: 3.25.0 + + '@payloadcms/graphql@3.25.0': + resolution: {integrity: sha512-JbffYYHcsqOPK7GH6WgQd+xbtNQxG+is3el+qxIVIqTGwrZtGy7EFg2OK3XMk3Hb/bJUH/Ino3X3XsgdD6ffyg==} hasBin: true peerDependencies: graphql: ^16.8.1 - payload: 3.20.0 + payload: 3.25.0 - '@payloadcms/next@3.20.0': - resolution: {integrity: sha512-xAOUxKuZVu49YOhysCxSss9Ku2tv5WW1rT/cwtaQaqVZ0DPL7jLS706wm71enJs36hGe0uDMGlSE8yB+dAludQ==} + '@payloadcms/next@3.25.0': + resolution: {integrity: sha512-Xx703RpURJ34yRMTgjcbyg555p0yXCH5C6ZxLCinEs1Lv3nE6FymVjlMGs2y+5IqPZfjaH4qnkgcwtxBE+fHQw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: graphql: ^16.8.1 next: ^15.0.0 - payload: 3.20.0 + payload: 3.25.0 - '@payloadcms/richtext-slate@3.20.0': - resolution: {integrity: sha512-5Bqj5HBuEpCaYmxAYTThaKU7gfeDPOIj/8QULxO97kmO2i4QaPOu/GTzEjcOk2j8NmbV6zDdtheALe4PcfeX8g==} + '@payloadcms/richtext-slate@3.25.0': + resolution: {integrity: sha512-jnVsHlMsvqDp6Mi/74PQoYoLPK+Uo9oOAiz7oItNBuE9uIVk+L/1ca2jH/yvOqZADYTYrj5DSCnsAb8Y0AQytw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: - payload: 3.20.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/translations@3.20.0': - resolution: {integrity: sha512-pZVcqysyZGH02gjtaRwNVusHgAwO1sRBKCHQAft7w9KFl7ZoCZAm+r3+SUhAE8Kp+fj9gHArtGsIfr/Yqn/zfA==} + '@payloadcms/translations@3.25.0': + resolution: {integrity: sha512-af+fDh+fzfExx9oeM8AJqwdEfc6X291smMUUe3mOCRlwIylcxXKzgj8ITdwPonGzaV/GJjAsc4U0mZIkaA6MMg==} - '@payloadcms/ui@3.20.0': - resolution: {integrity: sha512-ZCXPVOlVmNzPrVI7qFjUe7QMrmVoO1QSP4940Z30wJQpIpJW6t0W+HgjUfuDHEZ9xWRPCOniO101r50wLzIdNQ==} + '@payloadcms/ui@3.25.0': + resolution: {integrity: sha512-9zOv8zeenZlNua+WlFtldVAUn6NatMY5BPXzWRMWSfIVnrRqimY87HQyS6uvncSPdsPwqf9UH6mBkbIqbeusgw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: next: ^15.0.0 - payload: 3.20.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 @@ -665,68 +822,68 @@ packages: '@rushstack/eslint-patch@1.10.5': resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} - '@swc/core-darwin-arm64@1.10.12': - resolution: {integrity: sha512-pOANQegUTAriW7jq3SSMZGM5l89yLVMs48R0F2UG6UZsH04SiViCnDctOGlA/Sa++25C+rL9MGMYM1jDLylBbg==} + '@swc/core-darwin-arm64@1.11.5': + resolution: {integrity: sha512-GEd1hzEx0mSGkJYMFMGLnrGgjL2rOsOsuYWyjyiA3WLmhD7o+n/EWBDo6mzD/9aeF8dzSPC0TnW216gJbvrNzA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.10.12': - resolution: {integrity: sha512-m4kbpIDDsN1FrwfNQMU+FTrss356xsXvatLbearwR+V0lqOkjLBP0VmRvQfHEg+uy13VPyrT9gj4HLoztlci7w==} + '@swc/core-darwin-x64@1.11.5': + resolution: {integrity: sha512-toz04z9wAClVvQSEY3xzrgyyeWBAfMWcKG4K0ugNvO56h/wczi2ZHRlnAXZW1tghKBk3z6MXqa/srfXgNhffKw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.10.12': - resolution: {integrity: sha512-OY9LcupgqEu8zVK+rJPes6LDJJwPDmwaShU96beTaxX2K6VrXbpwm5WbPS/8FfQTsmpnuA7dCcMPUKhNgmzTrQ==} + '@swc/core-linux-arm-gnueabihf@1.11.5': + resolution: {integrity: sha512-5SjmKxXdwbBpsYGTpgeXOXMIjS563/ntRGn8Zc12H/c4VfPrRLGhgbJ/48z2XVFyBLcw7BCHZyFuVX1+ZI3W0Q==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.10.12': - resolution: {integrity: sha512-nJD587rO0N4y4VZszz3xzVr7JIiCzSMhEMWnPjuh+xmPxDBz0Qccpr8xCr1cSxpl1uY7ERkqAGlKr6CwoV5kVg==} + '@swc/core-linux-arm64-gnu@1.11.5': + resolution: {integrity: sha512-pydIlInHRzRIwB0NHblz3Dx58H/bsi0I5F2deLf9iOmwPNuOGcEEZF1Qatc7YIjP5DFbXK+Dcz+pMUZb2cc2MQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.10.12': - resolution: {integrity: sha512-oqhSmV+XauSf0C//MoQnVErNUB/5OzmSiUzuazyLsD5pwqKNN+leC3JtRQ/QVzaCpr65jv9bKexT9+I2Tt3xDw==} + '@swc/core-linux-arm64-musl@1.11.5': + resolution: {integrity: sha512-LhBHKjkZq5tJF1Lh0NJFpx7ROnCWLckrlIAIdSt9XfOV+zuEXJQOj+NFcM1eNk17GFfFyUMOZyGZxzYq5dveEQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.10.12': - resolution: {integrity: sha512-XldSIHyjD7m1Gh+/8rxV3Ok711ENLI420CU2EGEqSe3VSGZ7pHJvJn9ZFbYpWhsLxPqBYMFjp3Qw+J6OXCPXCA==} + '@swc/core-linux-x64-gnu@1.11.5': + resolution: {integrity: sha512-dCi4xkxXlsk5sQYb3i413Cfh7+wMJeBYTvBZTD5xh+/DgRtIcIJLYJ2tNjWC4/C2i5fj+Ze9bKNSdd8weRWZ3A==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.10.12': - resolution: {integrity: sha512-wvPXzJxzPgTqhyp1UskOx1hRTtdWxlyFD1cGWOxgLsMik0V9xKRgqKnMPv16Nk7L9xl6quQ6DuUHj9ID7L3oVw==} + '@swc/core-linux-x64-musl@1.11.5': + resolution: {integrity: sha512-K0AC4TreM5Oo/tXNXnE/Gf5+5y/HwUdd7xvUjOpZddcX/RlsbYOKWLgOtA3fdFIuta7XC+vrGKmIhm5l70DSVQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.10.12': - resolution: {integrity: sha512-TUYzWuu1O7uyIcRfxdm6Wh1u+gNnrW5M1DUgDOGZLsyQzgc2Zjwfh2llLhuAIilvCVg5QiGbJlpibRYJ/8QGsg==} + '@swc/core-win32-arm64-msvc@1.11.5': + resolution: {integrity: sha512-wzum8sYUsvPY7kgUfuqVYTgIPYmBC8KPksoNM1fz5UfhudU0ciQuYvUBD47GIGOevaoxhLkjPH4CB95vh1mJ9w==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.10.12': - resolution: {integrity: sha512-4Qrw+0Xt+Fe2rz4OJ/dEPMeUf/rtuFWWAj/e0vL7J5laUHirzxawLRE5DCJLQTarOiYR6mWnmadt9o3EKzV6Xg==} + '@swc/core-win32-ia32-msvc@1.11.5': + resolution: {integrity: sha512-lco7mw0TPRTpVPR6NwggJpjdUkAboGRkLrDHjIsUaR+Y5+0m5FMMkHOMxWXAbrBS5c4ph7QErp4Lma4r9Mn5og==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.10.12': - resolution: {integrity: sha512-YiloZXLW7rUxJpALwHXaGjVaAEn+ChoblG7/3esque+Y7QCyheoBUJp2DVM1EeVA43jBfZ8tvYF0liWd9Tpz1A==} + '@swc/core-win32-x64-msvc@1.11.5': + resolution: {integrity: sha512-E+DApLSC6JRK8VkDa4bNsBdD7Qoomx1HvKVZpOXl9v94hUZI5GMExl4vU5isvb+hPWL7rZ0NeI7ITnVLgLJRbA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.10.12': - resolution: {integrity: sha512-+iUL0PYpPm6N9AdV1wvafakvCqFegQus1aoEDxgFsv3/uNVNIyRaupf/v/Zkp5hbep2EzhtoJR0aiJIzDbXWHg==} + '@swc/core@1.11.5': + resolution: {integrity: sha512-EVY7zfpehxhTZXOfy508gb3D78ihoGGmvyiTWtlBPjgIaidP1Xw0naHMD78CWiFlZmeDjKXJufGtsEGOnZdmNA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -740,8 +897,8 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/types@0.1.17': - resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + '@swc/types@0.1.19': + resolution: {integrity: sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==} '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -761,11 +918,11 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.15': - resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} - '@types/node@22.12.0': - resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==} + '@types/node@22.13.8': + resolution: {integrity: sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -787,51 +944,51 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@typescript-eslint/eslint-plugin@8.22.0': - resolution: {integrity: sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==} + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} 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: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.22.0': - resolution: {integrity: sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==} + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.22.0': - resolution: {integrity: sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==} + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.22.0': - resolution: {integrity: sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==} + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.22.0': - resolution: {integrity: sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==} + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.22.0': - resolution: {integrity: sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==} + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.22.0': - resolution: {integrity: sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==} + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.22.0': - resolution: {integrity: sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==} + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -954,16 +1111,16 @@ packages: bson-objectid@2.0.4: resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} - bson@6.10.1: - resolution: {integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==} + bson@6.10.3: + resolution: {integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==} engines: {node: '>=16.20.1'} busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} call-bind@1.0.8: @@ -978,8 +1135,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001696: - resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==} + caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1159,8 +1316,8 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} error-ex@1.3.2: @@ -1190,8 +1347,9 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} @@ -1202,6 +1360,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1209,8 +1372,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.1.6: - resolution: {integrity: sha512-Wd1uy6y7nBbXUSg9QAuQ+xYEKli5CgUhLjz1QHW11jLDis5vK5XB3PemL6jEmy7HrdhaRFDz+GTZ/3FoH+EUjg==} + eslint-config-next@15.2.0: + resolution: {integrity: sha512-LkG0KKpinAoNPk2HXSx0fImFb/hQ6RnhSxTkpJFTkQ0SmnzsbRsjjN95WC/mDY34nKOenpptYEVvfkCR/h+VjA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -1221,8 +1384,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.7.0: - resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1271,8 +1434,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} 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 @@ -1351,8 +1514,8 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} @@ -1385,14 +1548,14 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - for-each@0.3.4: - resolution: {integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} fs.realpath@1.0.0: @@ -1413,8 +1576,8 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-proto@1.0.1: @@ -1539,8 +1702,8 @@ packages: immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1580,8 +1743,8 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-buffer@1.1.6: @@ -1676,8 +1839,8 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} is-weakset@2.0.4: @@ -1875,8 +2038,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@15.1.6: - resolution: {integrity: sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==} + next@15.2.0: + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -1904,8 +2067,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -1988,14 +2151,8 @@ packages: 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.20.0: - resolution: {integrity: sha512-JtMLLncmXSvhsfpnECZeY1QGjwTcOm7limpct+gmM8tWBdQKi2fVXOsBTkyQtpn4VdA5h4fgnetHR/txCDu9OQ==} + payload@3.25.0: + resolution: {integrity: sha512-azT1qtirV8QqIPpyWaxbF5TJPoWT5fpYoxin83wZxF5gmg0O06bL5YKCGFfCpzgCcw4FrFtLSzD68zGMc5m5Eg==} engines: {node: ^18.20.2 || >=20.9.0} hasBin: true peerDependencies: @@ -2034,8 +2191,8 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} postcss@8.4.31: @@ -2046,8 +2203,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true @@ -2084,15 +2241,15 @@ packages: react-datepicker@7.6.0: resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==} peerDependencies: - react: 19.0.0 - react-dom: 19.0.0 + react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc react-diff-viewer-continued@4.0.4: resolution: {integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==} engines: {node: '>= 16'} peerDependencies: - react: 19.0.0 - react-dom: 19.0.0 + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom@19.0.0: resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} @@ -2110,8 +2267,8 @@ packages: react-select@5.9.0: resolution: {integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==} peerDependencies: - react: 19.0.0 - react-dom: 19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} @@ -2162,8 +2319,8 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@3.0.2: @@ -2214,8 +2371,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.0: - resolution: {integrity: sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -2297,8 +2454,8 @@ packages: sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - sonner@1.7.3: - resolution: {integrity: sha512-KXLWQfyR6AHpYZuQk8eO8fCbZSJY3JOpgsu/tbGc++jgPjj8JsR1ZpO8vFhqR/OxvWMQCSAmnSShY0gr4FPqHg==} + sonner@1.7.4: + resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -2410,8 +2567,8 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: @@ -2429,8 +2586,8 @@ packages: truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@2.0.0: - resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -2454,6 +2611,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.19.3: + resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + engines: {node: '>=18.0.0'} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2523,8 +2685,8 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - whatwg-url@14.1.0: - resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} + whatwg-url@14.1.1: + resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} engines: {node: '>=18'} which-boxed-primitive@1.1.1: @@ -2555,8 +2717,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2582,7 +2744,7 @@ packages: snapshots: - '@apidevtools/json-schema-ref-parser@11.9.0': + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 @@ -2594,18 +2756,18 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.26.5': + '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.7 - '@babel/types': 7.26.7 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -2613,37 +2775,39 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.7': + '@babel/parser@7.26.9': dependencies: - '@babel/types': 7.26.7 + '@babel/types': 7.26.9 - '@babel/runtime@7.26.7': + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.9': + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 - '@babel/traverse@7.26.7': + '@babel/traverse@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.7 - '@babel/template': 7.25.9 - '@babel/types': 7.26.7 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.7': + '@babel/types@7.26.9': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@date-fns/tz@1.2.0': {} + '@dnd-kit/accessibility@3.1.1(react@19.0.0)': dependencies: react: 19.0.0 @@ -2677,7 +2841,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.26.9 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -2714,7 +2878,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@19.0.1)(react@19.0.0)': dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.26.9 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -2751,75 +2915,150 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/aix-ppc64@0.25.0': + optional: true + '@esbuild/android-arm64@0.23.1': optional: true + '@esbuild/android-arm64@0.25.0': + optional: true + '@esbuild/android-arm@0.23.1': optional: true + '@esbuild/android-arm@0.25.0': + optional: true + '@esbuild/android-x64@0.23.1': optional: true + '@esbuild/android-x64@0.25.0': + optional: true + '@esbuild/darwin-arm64@0.23.1': optional: true + '@esbuild/darwin-arm64@0.25.0': + optional: true + '@esbuild/darwin-x64@0.23.1': optional: true + '@esbuild/darwin-x64@0.25.0': + optional: true + '@esbuild/freebsd-arm64@0.23.1': optional: true + '@esbuild/freebsd-arm64@0.25.0': + optional: true + '@esbuild/freebsd-x64@0.23.1': optional: true + '@esbuild/freebsd-x64@0.25.0': + optional: true + '@esbuild/linux-arm64@0.23.1': optional: true + '@esbuild/linux-arm64@0.25.0': + optional: true + '@esbuild/linux-arm@0.23.1': optional: true + '@esbuild/linux-arm@0.25.0': + optional: true + '@esbuild/linux-ia32@0.23.1': optional: true + '@esbuild/linux-ia32@0.25.0': + optional: true + '@esbuild/linux-loong64@0.23.1': optional: true + '@esbuild/linux-loong64@0.25.0': + optional: true + '@esbuild/linux-mips64el@0.23.1': optional: true + '@esbuild/linux-mips64el@0.25.0': + optional: true + '@esbuild/linux-ppc64@0.23.1': optional: true + '@esbuild/linux-ppc64@0.25.0': + optional: true + '@esbuild/linux-riscv64@0.23.1': optional: true + '@esbuild/linux-riscv64@0.25.0': + optional: true + '@esbuild/linux-s390x@0.23.1': optional: true + '@esbuild/linux-s390x@0.25.0': + optional: true + '@esbuild/linux-x64@0.23.1': optional: true + '@esbuild/linux-x64@0.25.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.0': + optional: true + '@esbuild/netbsd-x64@0.23.1': optional: true + '@esbuild/netbsd-x64@0.25.0': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-arm64@0.25.0': + optional: true + '@esbuild/openbsd-x64@0.23.1': optional: true + '@esbuild/openbsd-x64@0.25.0': + optional: true + '@esbuild/sunos-x64@0.23.1': optional: true + '@esbuild/sunos-x64@0.25.0': + optional: true + '@esbuild/win32-arm64@0.23.1': optional: true + '@esbuild/win32-arm64@0.25.0': + optional: true + '@esbuild/win32-ia32@0.23.1': optional: true + '@esbuild/win32-ia32@0.25.0': + optional: true + '@esbuild/win32-x64@0.23.1': optional: true + '@esbuild/win32-x64@0.25.0': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -2834,7 +3073,7 @@ snapshots: espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 @@ -2851,12 +3090,12 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/window-info@3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -2876,7 +3115,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react@0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@floating-ui/utils': 0.2.9 @@ -2994,50 +3233,49 @@ snapshots: '@juggle/resize-observer@3.4.0': {} - '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)': + '@monaco-editor/loader@1.5.0': dependencies: - monaco-editor: 0.52.2 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) + '@monaco-editor/loader': 1.5.0 monaco-editor: 0.52.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mongodb-js/saslprep@1.1.9': + '@mongodb-js/saslprep@1.2.0': dependencies: sparse-bitfield: 3.0.3 - '@next/env@15.1.6': {} + '@next/env@15.2.0': {} - '@next/eslint-plugin-next@15.1.6': + '@next/eslint-plugin-next@15.2.0': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.6': + '@next/swc-darwin-arm64@15.2.0': optional: true - '@next/swc-darwin-x64@15.1.6': + '@next/swc-darwin-x64@15.2.0': optional: true - '@next/swc-linux-arm64-gnu@15.1.6': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true - '@next/swc-linux-arm64-musl@15.1.6': + '@next/swc-linux-arm64-musl@15.2.0': optional: true - '@next/swc-linux-x64-gnu@15.1.6': + '@next/swc-linux-x64-gnu@15.2.0': optional: true - '@next/swc-linux-x64-musl@15.1.6': + '@next/swc-linux-x64-musl@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@15.1.6': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true - '@next/swc-win32-x64-msvc@15.1.6': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@nodelib/fs.scandir@2.1.5': @@ -3050,16 +3288,21 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.1 '@nolyfill/is-core-module@1.0.39': {} - '@payloadcms/db-mongodb@3.20.0(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))': + '@payloadcms/admin-bar@3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@payloadcms/db-mongodb@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))': dependencies: mongoose: 8.9.5 mongoose-aggregate-paginate-v2: 1.1.2 mongoose-paginate-v2: 1.8.5 - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) prompts: 2.4.2 uuid: 10.0.0 transitivePeerDependencies: @@ -3072,23 +3315,23 @@ snapshots: - socks - supports-color - '@payloadcms/graphql@3.20.0(graphql@16.10.0)(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2)': + '@payloadcms/graphql@3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2)': dependencies: graphql: 16.10.0 graphql-scalars: 1.22.2(graphql@16.10.0) - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) pluralize: 8.0.0 ts-essentials: 10.0.3(typescript@5.5.2) tsx: 4.19.2 transitivePeerDependencies: - typescript - '@payloadcms/next@3.20.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': + '@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/graphql': 3.20.0(graphql@16.10.0)(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2) - '@payloadcms/translations': 3.20.0 - '@payloadcms/ui': 3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@payloadcms/graphql': 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) busboy: 1.6.0 dequal: 2.0.3 file-type: 19.3.0 @@ -3096,13 +3339,12 @@ snapshots: graphql-http: 1.22.4(graphql@16.10.0) graphql-playground-html: 1.6.30 http-status: 2.1.0 - next: 15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) path-to-regexp: 6.3.0 - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) qs-esm: 7.0.2 react-diff-viewer-continued: 4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: 1.77.4 - sonner: 1.7.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -3112,12 +3354,12 @@ snapshots: - supports-color - typescript - '@payloadcms/richtext-slate@3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': + '@payloadcms/richtext-slate@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': dependencies: - '@payloadcms/translations': 3.20.0 - '@payloadcms/ui': 3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) is-hotkey: 0.2.0 - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) react: 19.0.0 slate: 0.91.4 slate-history: 0.86.0(slate@0.91.4) @@ -3131,27 +3373,27 @@ snapshots: - supports-color - typescript - '@payloadcms/translations@3.20.0': + '@payloadcms/translations@3.25.0': dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': + '@payloadcms/ui@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': dependencies: + '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/translations': 3.20.0 - body-scroll-lock: 4.0.0-beta.0 + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/window-info': 3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@monaco-editor/react': 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@payloadcms/translations': 3.25.0 bson-objectid: 2.0.4 date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 - next: 15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) object-to-formdata: 4.5.1 - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) qs-esm: 7.0.2 react: 19.0.0 react-datepicker: 7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -3159,7 +3401,7 @@ snapshots: react-image-crop: 10.1.8(react@19.0.0) react-select: 5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) scheduler: 0.25.0 - sonner: 1.7.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + sonner: 1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) ts-essentials: 10.0.3(typescript@5.5.2) use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.25.0) uuid: 10.0.0 @@ -3173,51 +3415,51 @@ snapshots: '@rushstack/eslint-patch@1.10.5': {} - '@swc/core-darwin-arm64@1.10.12': + '@swc/core-darwin-arm64@1.11.5': optional: true - '@swc/core-darwin-x64@1.10.12': + '@swc/core-darwin-x64@1.11.5': optional: true - '@swc/core-linux-arm-gnueabihf@1.10.12': + '@swc/core-linux-arm-gnueabihf@1.11.5': optional: true - '@swc/core-linux-arm64-gnu@1.10.12': + '@swc/core-linux-arm64-gnu@1.11.5': optional: true - '@swc/core-linux-arm64-musl@1.10.12': + '@swc/core-linux-arm64-musl@1.11.5': optional: true - '@swc/core-linux-x64-gnu@1.10.12': + '@swc/core-linux-x64-gnu@1.11.5': optional: true - '@swc/core-linux-x64-musl@1.10.12': + '@swc/core-linux-x64-musl@1.11.5': optional: true - '@swc/core-win32-arm64-msvc@1.10.12': + '@swc/core-win32-arm64-msvc@1.11.5': optional: true - '@swc/core-win32-ia32-msvc@1.10.12': + '@swc/core-win32-ia32-msvc@1.11.5': optional: true - '@swc/core-win32-x64-msvc@1.10.12': + '@swc/core-win32-x64-msvc@1.11.5': optional: true - '@swc/core@1.10.12(@swc/helpers@0.5.15)': + '@swc/core@1.11.5(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.17 + '@swc/types': 0.1.19 optionalDependencies: - '@swc/core-darwin-arm64': 1.10.12 - '@swc/core-darwin-x64': 1.10.12 - '@swc/core-linux-arm-gnueabihf': 1.10.12 - '@swc/core-linux-arm64-gnu': 1.10.12 - '@swc/core-linux-arm64-musl': 1.10.12 - '@swc/core-linux-x64-gnu': 1.10.12 - '@swc/core-linux-x64-musl': 1.10.12 - '@swc/core-win32-arm64-msvc': 1.10.12 - '@swc/core-win32-ia32-msvc': 1.10.12 - '@swc/core-win32-x64-msvc': 1.10.12 + '@swc/core-darwin-arm64': 1.11.5 + '@swc/core-darwin-x64': 1.11.5 + '@swc/core-linux-arm-gnueabihf': 1.11.5 + '@swc/core-linux-arm64-gnu': 1.11.5 + '@swc/core-linux-arm64-musl': 1.11.5 + '@swc/core-linux-x64-gnu': 1.11.5 + '@swc/core-linux-x64-musl': 1.11.5 + '@swc/core-win32-arm64-msvc': 1.11.5 + '@swc/core-win32-ia32-msvc': 1.11.5 + '@swc/core-win32-x64-msvc': 1.11.5 '@swc/helpers': 0.5.15 '@swc/counter@0.1.3': {} @@ -3226,7 +3468,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/types@0.1.17': + '@swc/types@0.1.19': dependencies: '@swc/counter': 0.1.3 @@ -3234,7 +3476,7 @@ snapshots: '@types/busboy@1.5.4': dependencies: - '@types/node': 22.12.0 + '@types/node': 22.13.8 '@types/escape-html@1.0.4': {} @@ -3244,9 +3486,9 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.15': {} + '@types/lodash@4.17.16': {} - '@types/node@22.12.0': + '@types/node@22.13.8': dependencies: undici-types: 6.20.0 @@ -3270,81 +3512,81 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/type-utils': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/utils': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/utils': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 8.25.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.5.2) + ts-api-utils: 2.0.1(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2)': dependencies: - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 eslint: 8.57.1 typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.22.0': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.22.0(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/type-utils@8.25.0(eslint@8.57.1)(typescript@5.5.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.5.2) - '@typescript-eslint/utils': 8.22.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.5.2) + '@typescript-eslint/utils': 8.25.0(eslint@8.57.1)(typescript@5.5.2) debug: 4.4.0 eslint: 8.57.1 - ts-api-utils: 2.0.0(typescript@5.5.2) + ts-api-utils: 2.0.1(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.22.0': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.22.0(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.5.2)': dependencies: - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.0 - ts-api-utils: 2.0.0(typescript@5.5.2) + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.22.0(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/utils@8.25.0(eslint@8.57.1)(typescript@5.5.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.5.2) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.5.2) eslint: 8.57.1 typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.22.0': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.3.0': {} @@ -3395,7 +3637,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 array.prototype.findlast@1.2.5: @@ -3405,7 +3647,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: @@ -3414,21 +3656,21 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: @@ -3436,7 +3678,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: @@ -3445,7 +3687,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} @@ -3456,7 +3698,7 @@ snapshots: available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axe-core@4.10.2: {} @@ -3464,7 +3706,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.26.9 cosmiconfig: 7.1.0 resolve: 1.22.10 @@ -3489,32 +3731,32 @@ snapshots: bson-objectid@2.0.4: {} - bson@6.10.1: {} + bson@6.10.3: {} busboy@1.6.0: dependencies: streamsearch: 1.1.0 - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.7 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} - caniuse-lite@1.0.30001696: {} + caniuse-lite@1.0.30001701: {} chalk@4.1.2: dependencies: @@ -3578,7 +3820,7 @@ snapshots: cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -3668,14 +3910,14 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.26.9 csstype: 3.1.3 dotenv@8.6.0: {} dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -3685,7 +3927,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -3710,7 +3952,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -3727,9 +3969,9 @@ snapshots: is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 - is-weakref: 1.1.0 + is-weakref: 1.1.1 math-intrinsics: 1.1.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 @@ -3761,7 +4003,7 @@ snapshots: es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -3778,11 +4020,11 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -3819,23 +4061,51 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} - eslint-config-next@15.1.6(eslint@8.57.1)(typescript@5.5.2): + eslint-config-next@15.2.0(eslint@8.57.1)(typescript@5.5.2): dependencies: - '@next/eslint-plugin-next': 15.1.6 + '@next/eslint-plugin-next': 15.2.0 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.22.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.4(eslint@8.57.1) - eslint-plugin-react-hooks: 5.1.0(eslint@8.57.1) + eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: @@ -3851,34 +4121,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - enhanced-resolve: 5.18.0 + enhanced-resolve: 5.18.1 eslint: 8.57.1 - fast-glob: 3.3.3 get-tsconfig: 4.10.0 is-bun-module: 1.3.0 - is-glob: 4.0.3 stable-hash: 0.0.4 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3889,7 +4158,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3901,7 +4170,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -3926,7 +4195,7 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.1.0(eslint@8.57.1): + eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -4052,9 +4321,9 @@ snapshots: fast-uri@3.0.6: {} - fastq@1.18.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fdir@6.4.3(picomatch@4.0.2): optionalDependencies: @@ -4083,17 +4352,17 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.3.2: {} + flatted@3.3.3: {} focus-trap@7.5.4: dependencies: tabbable: 6.2.0 - for-each@0.3.4: + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -4115,9 +4384,9 @@ snapshots: functions-have-names@1.2.3: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -4137,7 +4406,7 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-tsconfig@4.10.0: dependencies: @@ -4238,7 +4507,7 @@ snapshots: immutable@4.3.7: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -4262,7 +4531,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} @@ -4285,7 +4554,7 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 @@ -4294,7 +4563,7 @@ snapshots: is-bun-module@1.3.0: dependencies: - semver: 7.7.0 + semver: 7.7.1 is-callable@1.2.7: {} @@ -4305,7 +4574,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -4377,14 +4646,14 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.1.0: + is-weakref@1.1.1: dependencies: call-bound: 1.0.3 is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 isarray@2.0.5: {} @@ -4394,7 +4663,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -4417,15 +4686,15 @@ snapshots: json-schema-to-typescript@15.0.3: dependencies: - '@apidevtools/json-schema-ref-parser': 11.9.0 + '@apidevtools/json-schema-ref-parser': 11.9.3 '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.15 + '@types/lodash': 4.17.16 is-glob: 4.0.3 js-yaml: 4.1.0 lodash: 4.17.21 minimist: 1.2.8 - prettier: 3.4.2 - tinyglobby: 0.2.10 + prettier: 3.5.3 + tinyglobby: 0.2.12 json-schema-traverse@0.4.1: {} @@ -4511,12 +4780,12 @@ snapshots: mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 - whatwg-url: 14.1.0 + whatwg-url: 14.1.1 mongodb@6.12.0: dependencies: - '@mongodb-js/saslprep': 1.1.9 - bson: 6.10.1 + '@mongodb-js/saslprep': 1.2.0 + bson: 6.10.3 mongodb-connection-string-url: 3.0.2 mongoose-aggregate-paginate-v2@1.1.2: {} @@ -4525,7 +4794,7 @@ snapshots: mongoose@8.9.5: dependencies: - bson: 6.10.1 + bson: 6.10.3 kareem: 2.6.3 mongodb: 6.12.0 mpath: 0.9.0 @@ -4556,26 +4825,26 @@ snapshots: natural-compare@1.4.0: {} - next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: - '@next/env': 15.1.6 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001696 + caniuse-lite: 1.0.30001701 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.6 - '@next/swc-darwin-x64': 15.1.6 - '@next/swc-linux-arm64-gnu': 15.1.6 - '@next/swc-linux-arm64-musl': 15.1.6 - '@next/swc-linux-x64-gnu': 15.1.6 - '@next/swc-linux-x64-musl': 15.1.6 - '@next/swc-win32-arm64-msvc': 15.1.6 - '@next/swc-win32-x64-msvc': 15.1.6 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 sass: 1.77.4 sharp: 0.33.5 transitivePeerDependencies: @@ -4586,7 +4855,7 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -4644,7 +4913,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -4679,16 +4948,10 @@ snapshots: path-type@4.0.0: {} - payload-admin-bar@1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + payload@3.25.0(graphql@16.10.0)(typescript@5.5.2): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2): - dependencies: - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@next/env': 15.1.6 - '@payloadcms/translations': 3.20.0 + '@next/env': 15.2.0 + '@payloadcms/translations': 3.25.0 '@types/busboy': 1.5.4 ajv: 8.17.1 bson-objectid: 2.0.4 @@ -4716,12 +4979,9 @@ snapshots: ts-essentials: 10.0.3(typescript@5.5.2) tsx: 4.19.2 uuid: 10.0.0 - ws: 8.18.0 + ws: 8.18.1 transitivePeerDependencies: - bufferutil - - monaco-editor - - react - - react-dom - typescript - utf-8-validate @@ -4771,7 +5031,7 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} postcss@8.4.31: dependencies: @@ -4781,7 +5041,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.4.2: {} + prettier@3.5.3: {} process-warning@4.0.1: {} @@ -4815,7 +5075,7 @@ snapshots: react-datepicker@7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@floating-ui/react': 0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/react': 0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 date-fns: 3.6.0 react: 19.0.0 @@ -4847,7 +5107,7 @@ snapshots: react-select@5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.26.9 '@emotion/cache': 11.14.0 '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) '@floating-ui/dom': 1.6.13 @@ -4864,7 +5124,7 @@ snapshots: react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.26.9 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -4886,7 +5146,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -4919,7 +5179,7 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} rimraf@3.0.2: dependencies: @@ -4933,7 +5193,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -4972,14 +5232,14 @@ snapshots: semver@6.3.1: {} - semver@7.7.0: {} + semver@7.7.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.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -5000,7 +5260,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.7.0 + semver: 7.7.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -5032,27 +5292,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -5082,7 +5342,7 @@ snapshots: dependencies: '@juggle/resize-observer': 3.4.0 '@types/is-hotkey': 0.1.10 - '@types/lodash': 4.17.15 + '@types/lodash': 4.17.16 direction: 1.0.4 is-hotkey: 0.1.8 is-plain-object: 5.0.0 @@ -5109,7 +5369,7 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@1.7.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -5144,7 +5404,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -5220,7 +5480,7 @@ snapshots: tiny-warning@1.0.3: {} - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -5242,7 +5502,7 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.0.0(typescript@5.5.2): + ts-api-utils@2.0.1(typescript@5.5.2): dependencies: typescript: 5.5.2 @@ -5266,6 +5526,13 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsx@4.19.3: + dependencies: + esbuild: 0.25.0 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -5281,7 +5548,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.4 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -5290,7 +5557,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.4 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -5299,10 +5566,10 @@ snapshots: typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.4 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 typescript@5.5.2: {} @@ -5339,7 +5606,7 @@ snapshots: webidl-conversions@7.0.0: {} - whatwg-url@14.1.0: + whatwg-url@14.1.1: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0 @@ -5347,7 +5614,7 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -5362,7 +5629,7 @@ snapshots: is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 @@ -5380,7 +5647,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - for-each: 0.3.4 + for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -5392,7 +5659,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.0: {} + ws@8.18.1: {} xss@1.0.15: dependencies: diff --git a/examples/draft-preview/src/components/AdminBar/index.tsx b/examples/draft-preview/src/components/AdminBar/index.tsx index dcacf56e6f..a0e2af73b4 100644 --- a/examples/draft-preview/src/components/AdminBar/index.tsx +++ b/examples/draft-preview/src/components/AdminBar/index.tsx @@ -1,9 +1,9 @@ 'use client' -import type { PayloadAdminBarProps } from 'payload-admin-bar' +import type { PayloadAdminBarProps } from '@payloadcms/admin-bar' import { useRouter } from 'next/navigation' -import { PayloadAdminBar } from 'payload-admin-bar' +import { PayloadAdminBar } from '@payloadcms/admin-bar' import React, { useState } from 'react' import { Gutter } from '../Gutter' @@ -42,7 +42,7 @@ export const AdminBar: React.FC<{ user: classes.user, }} cmsURL={process.env.NEXT_PUBLIC_SERVER_URL} - collection={collection} + collectionSlug={collection} collectionLabels={{ plural: collectionLabels[collection]?.plural || 'Pages', singular: collectionLabels[collection]?.singular || 'Page', diff --git a/examples/draft-preview/src/seed/home.ts b/examples/draft-preview/src/seed/home.ts index 13bfb45b23..ef7ce20863 100644 --- a/examples/draft-preview/src/seed/home.ts +++ b/examples/draft-preview/src/seed/home.ts @@ -52,7 +52,7 @@ export const home: Page = { children: [{ text: 'Payload Admin Bar' }], linkType: 'custom', newTab: true, - url: 'https://github.com/payloadcms/payload-admin-bar', + url: 'https://github.com/payloadcms/payload/tree/main/packages/admin-bar', }, { text: ' appear at the top of this site. This will allow you to seamlessly navigate between the two apps. Then, navigate to the ', diff --git a/examples/localization/package.json b/examples/localization/package.json index 17e657fdad..cc72989363 100644 --- a/examples/localization/package.json +++ b/examples/localization/package.json @@ -42,7 +42,6 @@ "next": "^15.1.0", "next-intl": "^3.23.2", "payload": "latest", - "payload-admin-bar": "^1.0.6", "prism-react-renderer": "^2.3.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/localization/pnpm-lock.yaml b/examples/localization/pnpm-lock.yaml index 814eb30850..e0582ecb37 100644 --- a/examples/localization/pnpm-lock.yaml +++ b/examples/localization/pnpm-lock.yaml @@ -10,49 +10,49 @@ importers: dependencies: '@payloadcms/db-mongodb': specifier: latest - version: 3.11.0(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + version: 3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/live-preview-react': specifier: latest - version: 3.11.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 3.25.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@payloadcms/next': specifier: latest - version: 3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/payload-cloud': specifier: latest - version: 3.11.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/plugin-form-builder': specifier: latest - version: 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/plugin-nested-docs': specifier: latest - version: 3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/plugin-redirects': specifier: latest - version: 3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/plugin-search': specifier: latest - version: 3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/plugin-seo': specifier: latest - version: 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/richtext-lexical': specifier: latest - version: 3.11.0(7ul3c6beuv3aho36y23w6b4pou) + version: 3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23) '@payloadcms/ui': specifier: latest - version: 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.1.6(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.1.1(@types/react@19.0.1)(react@19.0.0) + version: 1.1.2(@types/react@19.0.1)(react@19.0.0) class-variance-authority: specifier: ^0.7.0 version: 0.7.1 @@ -64,7 +64,7 @@ importers: version: 7.0.3 geist: specifier: ^1.3.0 - version: 1.3.1(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) + version: 1.3.1(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) graphql: specifier: ^16.8.2 version: 16.10.0 @@ -76,16 +76,13 @@ importers: version: 0.378.0(react@19.0.0) next: specifier: ^15.1.0 - version: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + version: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) next-intl: specifier: ^3.23.2 - version: 3.26.1(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0) + version: 3.26.5(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0) payload: specifier: latest - version: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - payload-admin-bar: - specifier: ^1.0.6 - version: 1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 3.25.0(graphql@16.10.0)(typescript@5.7.3) prism-react-renderer: specifier: ^2.3.1 version: 2.4.1(react@19.0.0) @@ -103,23 +100,23 @@ importers: version: 0.32.6 tailwind-merge: specifier: ^2.3.0 - version: 2.5.5 + version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.16) + version: 1.0.7(tailwindcss@3.4.17) devDependencies: '@eslint/eslintrc': specifier: ^3.2.0 - version: 3.2.0 + version: 3.3.0 '@tailwindcss/typography': specifier: ^0.5.13 - version: 0.5.15(tailwindcss@3.4.16) + version: 0.5.16(tailwindcss@3.4.17) '@types/escape-html': specifier: ^1.0.2 version: 1.0.4 '@types/jsonwebtoken': specifier: ^9.0.6 - version: 9.0.7 + version: 9.0.9 '@types/node': specifier: 22.5.4 version: 22.5.4 @@ -131,28 +128,28 @@ importers: version: 19.0.1 autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.4.49) + version: 10.4.20(postcss@8.5.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: specifier: ^9.16.0 - version: 9.17.0(jiti@1.21.6) + version: 9.21.0(jiti@1.21.7) eslint-config-next: specifier: 15.1.0 - version: 15.1.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + version: 15.1.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) postcss: specifier: ^8.4.38 - version: 8.4.49 + version: 8.5.3 prettier: specifier: ^3.4.2 - version: 3.4.2 + version: 3.5.3 tailwindcss: specifier: ^3.4.3 - version: 3.4.16 + version: 3.4.17 typescript: - specifier: 5.7.2 - version: 5.7.2 + specifier: 5.7.3 + version: 5.7.3 packages: @@ -160,8 +157,8 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@apidevtools/json-schema-ref-parser@11.7.3': - resolution: {integrity: sha512-WApSdLdXEBb/1FUPca2lteASewEfpjEYJ8oXZP+0gExK5qSfsEKBKcA+WjY6Q4wvXwyv0+W6Kvc372pSceib9w==} + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} '@aws-crypto/crc32@5.2.0': @@ -193,250 +190,142 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-cognito-identity@3.713.0': - resolution: {integrity: sha512-MKOEuD/QFdbz65kHUKHn0aEJQ6oe2w9Ho62QTR9JDrBf78jPV5gWI7w8w5A0jX0KEcdqM3o59bawTV5E4nMAFA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-cognito-identity@3.758.0': + resolution: {integrity: sha512-8bOXVYtf/0OUN0jXTIHLv3V0TAS6kvvCRAy7nmiL/fDde0O+ChW1WZU7CVPAOtFEpFCdKskDcxFspM7m1k6qyg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.717.0': - resolution: {integrity: sha512-jzaH8IskAXVnqlZ3/H/ROwrB2HCnq/atlN7Hi7FIfjWvMPf5nfcJKfzJ1MXFX0EQR5qO6X4TbK7rgi7Bjw9NjQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-s3@3.758.0': + resolution: {integrity: sha512-f8SlhU9/93OC/WEI6xVJf/x/GoQFj9a/xXK6QCtr5fvCjfSLgMVFmKTiIl/tgtDRzxUDc8YS6EGtbHjJ3Y/atg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso-oidc@3.713.0': - resolution: {integrity: sha512-B7N1Nte4Kqn8oaqLR2qnegLZjAgylYDAYNmXDY2+f1QNLF2D3emmWu8kLvBPIxT3wj23Mt177CPcBvMMGF2+aQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-sso@3.758.0': + resolution: {integrity: sha512-BoGO6IIWrLyLxQG6txJw6RT2urmbtlwfggapNCrNPyYjlXpzTSJhBYjndg7TpDATFd0SXL0zm8y/tXsUXNkdYQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.758.0': + resolution: {integrity: sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.758.0': + resolution: {integrity: sha512-y/rHZqyChlEkNRr59gn4hv0gjhJwGmdCdW0JI1K9p3P9p7EurWGjr2M6+goTn3ilOlcAwrl5oFKR5jLt27TkOA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.758.0': + resolution: {integrity: sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.758.0': + resolution: {integrity: sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.758.0': + resolution: {integrity: sha512-cymSKMcP5d+OsgetoIZ5QCe1wnp2Q/tq+uIxVdh9MbfdBBEnl9Ecq6dH6VlYS89sp4QKuxHxkWXVnbXU3Q19Aw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.758.0': + resolution: {integrity: sha512-+DaMv63wiq7pJrhIQzZYMn4hSarKiizDoJRvyR7WGhnn0oQ/getX9Z0VNCV3i7lIFoLNTb7WMmQ9k7+z/uD5EQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.758.0': + resolution: {integrity: sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.758.0': + resolution: {integrity: sha512-x0FYJqcOLUCv8GLLFDYMXRAQKGjoM+L0BG4BiHYZRDf24yQWFCAZsCQAYKo6XZYh2qznbsW6f//qpyJ5b0QVKQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.758.0': + resolution: {integrity: sha512-XGguXhBqiCXMXRxcfCAVPlMbm3VyJTou79r/3mxWddHWF0XbhaQiBIbUz6vobVTD25YQRbWSmSch7VA8kI5Lrw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-providers@3.758.0': + resolution: {integrity: sha512-BaGVBdm9ynsErIc/mLuUwJ1OQcL/pkhCuAm24jpsif3evZ5wgyZnEAZB2yRin+mQnQaQT3L+KvTbdKGfjL8+fQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/lib-storage@3.758.0': + resolution: {integrity: sha512-g07y7rA505zaTJNPTmvW4zYJA3gThFDE1be7kBUKhTKAdwv8jVSbOiAy2AhClXs2evSUoQiFFtD1xWxLRXPPRQ==} + engines: {node: '>=18.0.0'} peerDependencies: - '@aws-sdk/client-sts': ^3.713.0 + '@aws-sdk/client-s3': ^3.758.0 - '@aws-sdk/client-sso-oidc@3.716.0': - resolution: {integrity: sha512-lA4IB9FzR2KjH7EVCo+mHGFKqdViVyeBQEIX9oVratL/l7P0bMS1fMwgfHOc3ACazqNxBxDES7x08ZCp32y6Lw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.716.0 + '@aws-sdk/middleware-bucket-endpoint@3.734.0': + resolution: {integrity: sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.713.0': - resolution: {integrity: sha512-qrgL/BILiRdv3npkJ88XxTeVPE/HPZ2gW9peyhYWP4fXCdPjpWYnAebbWBN6TqofiSlpP7xuoX8Xc1czwr90sg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-expect-continue@3.734.0': + resolution: {integrity: sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.716.0': - resolution: {integrity: sha512-5Nb0jJXce2TclbjG7WVPufwhgV1TRydz1QnsuBtKU0AdViEpr787YrZhPpGnNIM1Dx+R1H/tmAHZnOoohS6D8g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-flexible-checksums@3.758.0': + resolution: {integrity: sha512-o8Rk71S08YTKLoSobucjnbj97OCGaXgpEDNKXpXaavUM5xLNoHCLSUPRCiEN86Ivqxg1n17Y2nSRhfbsveOXXA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.713.0': - resolution: {integrity: sha512-sjXy6z5bS1uspOdA0B4xQVri0XxdM24MkK0XhLoFoWAWoMlrORAMy+zW3YyU/vlsLckNYs7B4+j0P0MK35d+AQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-host-header@3.734.0': + resolution: {integrity: sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.716.0': - resolution: {integrity: sha512-i4SVNsrdXudp8T4bkm7Fi3YWlRnvXCSwvNDqf6nLqSJxqr4CN3VlBELueDyjBK7TAt453/qSif+eNx+bHmwo4Q==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-location-constraint@3.734.0': + resolution: {integrity: sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.713.0': - resolution: {integrity: sha512-7Xq7LY6Q3eITvlqR1bP3cJu3RvTt4eb+WilK85eezPemi9589o6MNL0lu4nL0i+OdgPWw4x9z9WArRwXhHTreg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-logger@3.734.0': + resolution: {integrity: sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.716.0': - resolution: {integrity: sha512-5DkUiTrbyzO8/W4g7UFEqRFpuhgizayHI/Zbh0wtFMcot8801nJV+MP/YMhdjimlvAr/OqYB08FbGsPyWppMTw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-recursion-detection@3.734.0': + resolution: {integrity: sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.713.0': - resolution: {integrity: sha512-9+b6wT89FV1sOSPoGKhIf2+g1hyc1/+yVDfVc1yBwU5foQPugy0x4Fi2YLL5bPFr1H2FhdmRLD4wi/HdXmaJ6g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-sdk-s3@3.758.0': + resolution: {integrity: sha512-6mJ2zyyHPYSV6bAcaFpsdoXZJeQlR1QgBnZZ6juY/+dcYiuyWCdyLUbGzSZSE7GTfx6i+9+QWFeoIMlWKgU63A==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.713.0': - resolution: {integrity: sha512-B5+AbvN8qr5jmaiFdErtHlhdZtfMCP7JB1nwdi9LTsZLVP8BhFXnOYlIE7z6jq8GRkDBHybTxovKWzSfI0gg+w==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-ssec@3.734.0': + resolution: {integrity: sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.716.0': - resolution: {integrity: sha512-JI2KQUnn2arICwP9F3CnqP1W3nAbm4+meQg/yOhp9X0DMzQiHrHRd4HIrK2vyVgi2/6hGhONY5uLF26yRTA7nQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-user-agent@3.758.0': + resolution: {integrity: sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.713.0': - resolution: {integrity: sha512-VarD43CV9Bn+yNCZZb17xMiSjX/FRdU3wN2Aw/jP6ZE3/d87J9L7fxRRFmt4FAgLg35MJbooDGT9heycwg/WWw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/nested-clients@3.758.0': + resolution: {integrity: sha512-YZ5s7PSvyF3Mt2h1EQulCG93uybprNGbBkPmVuy/HMMfbFTt4iL3SbKjxqvOZelm86epFfj7pvK7FliI2WOEcg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.716.0': - resolution: {integrity: sha512-CZ04pl2z7igQPysQyH2xKZHM3fLwkemxQbKOlje3TmiS1NwXvcKvERhp9PE/H23kOL7beTM19NMRog/Fka/rlw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/region-config-resolver@3.734.0': + resolution: {integrity: sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.713.0': - resolution: {integrity: sha512-6oQuPjYONMCWTWhq5yV61OziX2KeU+nhTsdk+Zh4RiuaTkRRNTLnMAVA/VoG1FG8cnQbZJDFezh58nzlBTWHdw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.713.0 + '@aws-sdk/signature-v4-multi-region@3.758.0': + resolution: {integrity: sha512-0RPCo8fYJcrenJ6bRtiUbFOSgQ1CX/GpvwtLU2Fam1tS9h2klKK8d74caeV6A1mIUvBU7bhyQ0wMGlwMtn3EYw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.716.0': - resolution: {integrity: sha512-P37We2GtZvdROxiwP0zrpEL81/HuYK1qlYxp5VCj3uV+G4mG8UQN2gMIU/baYrpOQqa0h81RfyQGRFUjVaDVqw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.716.0 + '@aws-sdk/token-providers@3.758.0': + resolution: {integrity: sha512-ckptN1tNrIfQUaGWm/ayW1ddG+imbKN7HHhjFdS4VfItsP0QQOB0+Ov+tpgb4MoNR4JaUghMIVStjIeHN2ks1w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.713.0': - resolution: {integrity: sha512-uIRHrhqcjcc+fUcid7Dey7mXRYfntPcA2xzebOnIK5hGBNwfQHpRG3RAlEB8K864psqW+j+XxvjoRHx9trL5Zg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/types@3.734.0': + resolution: {integrity: sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.716.0': - resolution: {integrity: sha512-FGQPK2uKfS53dVvoskN/s/t6m0Po24BGd1PzJdzHBFCOjxbZLM6+8mDMXeyi2hCLVVQOUcuW41kOgmJ0+zMbww==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-arn-parser@3.723.0': + resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.713.0': - resolution: {integrity: sha512-adVC8iz8uHmhVmZaYGj4Ab8rLz+hmnR6rOeMQ6wVbCAnWDb2qoahb+vLZ9sW9yMCVRqiDWeVK7lsa0MDRCM1sw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-endpoints@3.743.0': + resolution: {integrity: sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.716.0': - resolution: {integrity: sha512-0spcu2MWVVHSTHH3WE2E//ttUJPwXRM3BCp+WyI41xLzpNu1Fd8zjOrDpEo0SnGUzsSiRTIJWgkuu/tqv9NJ2A==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-locate-window@3.723.0': + resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.713.0': - resolution: {integrity: sha512-67QzqZJ6i04ZJVRB4WTUfU3QWJgr9fmv9JdqiLl63GTfz2KGOMwmojbi4INJ9isq4rDVUycdHsgl1Mhe6eDXJg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-user-agent-browser@3.734.0': + resolution: {integrity: sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==} - '@aws-sdk/credential-provider-sso@3.716.0': - resolution: {integrity: sha512-J2IA3WuCpRGGoZm6VHZVFCnrxXP+41iUWb9Ct/1spljegTa1XjiaZ5Jf3+Ubj7WKiyvP9/dgz1L0bu2bYEjliw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-web-identity@3.713.0': - resolution: {integrity: sha512-hz2Ru+xKYQupxyYb8KCCmH6qhzn4MSkocFbnBxevlQMYbugi80oaQtpmkj2ovrKCY2ktD4ufhC/8UZJMFGjAqw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.713.0 - - '@aws-sdk/credential-provider-web-identity@3.716.0': - resolution: {integrity: sha512-vzgpWKs2gGXZGdbMKRFrMW4PqEFWkGvwWH2T7ZwQv9m+8lQ7P4Dk2uimqu0f37HZAbpn8HFMqRh4CaySjU354A==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.716.0 - - '@aws-sdk/credential-providers@3.713.0': - resolution: {integrity: sha512-eHNSkc/JQioGCrh1u2NwlXD1mwBiSp7p+nTK+6IKR4A6oWR5Le3t6xslZurmwqEKC1DuF7eiTIyDKRura4/aRw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/lib-storage@3.717.0': - resolution: {integrity: sha512-3Wpsi5soTH2XCEEu9qctj6zVH4ViZ3Qe3crFL7fJQrE9Uw3X60/+IfYfJMgZdQY3pIqmUsjydR93PZG0x6cXLw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-s3': ^3.717.0 - - '@aws-sdk/middleware-bucket-endpoint@3.714.0': - resolution: {integrity: sha512-I/xSOskiseJJ8i183Z522BgqbgYzLKP7jGcg2Qeib/IWoG2IP+9DH8pwqagKaPAycyswtnoKBJiiFXY43n0CkA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-expect-continue@3.714.0': - resolution: {integrity: sha512-rlzsXdG8Lzo4Qpl35ZnpOBAWlzvDHpP9++0AXoUwAJA0QmMm7auIRmgxJuNj91VwT9h15ZU6xjU4S7fJl4W0+w==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-flexible-checksums@3.717.0': - resolution: {integrity: sha512-a5kY5r7/7bDZZlOQQGWOR1ulQewdtNexdW1Ex5DD0FLKlFY7RD0va24hxQ6BP7mWHol+Dx4pj6UQ8ahk0ap1tw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-host-header@3.713.0': - resolution: {integrity: sha512-T1cRV9hs9WKwb2porR4QmW76ScCHqbdsrAAH+/2fR8IVRpFRU0BMnwrpSrRr7ujj6gqWQRQ97JLL+GpqpY3/ag==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-host-header@3.714.0': - resolution: {integrity: sha512-6l68kjNrh5QC8FGX3I3geBDavWN5Tg1RLHJ2HLA8ByGBtJyCwnz3hEkKfaxn0bBx0hF9DzbfjEOUF6cDqy2Kjg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-location-constraint@3.714.0': - resolution: {integrity: sha512-MX7M+V+FblujKck3fyuzePVIAy9530gY719IiSxV6uN1qLHl7VDJxNblpF/KpXakD6rOg8OpvtmqsXj9aBMftw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-logger@3.713.0': - resolution: {integrity: sha512-mpTK7ost3lQt08YhTsf+C4uEAwg3Xu1LKxexlIZGXucCB6AqBKpP7e86XzpFFAtuRgEfTJVbW+Gqna8LM+yXoA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-logger@3.714.0': - resolution: {integrity: sha512-RkqHlMvQWUaRklU1bMfUuBvdWwxgUtEqpADaHXlGVj3vtEY2UgBjy+57CveC4MByqKIunNvVHBBbjrGVtwY7Lg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.713.0': - resolution: {integrity: sha512-6vgQw92yvKR8MNsSXJE4seZhMSPVuyuBLuX81DWPr1pak/RpuUzn96CSYCTAYoCtf5vJgNseIcPfKQLkRYmBzg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.714.0': - resolution: {integrity: sha512-AVU5ixnh93nqtsfgNc284oXsXaadyHGPHpql/jwgaaqQfEXjS/1/j3j9E/vpacfTTz2Vzo7hAOjnvrOXSEVDaA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.716.0': - resolution: {integrity: sha512-Qzz5OfRA/5brqfvq+JHTInwS1EuJ1+tC6qMtwKWJN3czMnVJVdnnsPTf+G5IM/1yYaGEIjY8rC1ExQLcc8ApFQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-ssec@3.714.0': - resolution: {integrity: sha512-RkK8REAVwNUQmYbIDRw8eYbMJ8F1Rw4C9mlME4BBMhFlelGcD3ErU2ce24moQbDxBjNwHNESmIqgmdQk93CDCQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-user-agent@3.713.0': - resolution: {integrity: sha512-MYg2N9EUXQ4Kf0+rk7qCHPLbxRPAeWrxJXp8xDxSBiDPf0hcbCtT+cXXB6qWVrnp+OuacoUDrur3h604sp47Aw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-user-agent@3.716.0': - resolution: {integrity: sha512-FpAtT6nNKrYdkDZndutEraiRMf+TgDzAGvniqRtZ/YTPA+gIsWrsn+TwMKINR81lFC3nQfb9deS5CFtxd021Ew==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/region-config-resolver@3.713.0': - resolution: {integrity: sha512-SsIxxUFgYSHXchkyal+Vg+tZUFyBR0NPy/3GEYZ8geJqVfgb/4SHCIfkLMcU0qPUKlRfkJF7FPdgO24sfLiopA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/region-config-resolver@3.714.0': - resolution: {integrity: sha512-HJzsQxgMOAzZrbf/YIqEx30or4tZK1oNAk6Wm6xecUQx+23JXIaePRu1YFUOLBBERQ4QBPpISFurZWBMZ5ibAw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.716.0': - resolution: {integrity: sha512-k0goWotZKKz+kV6Ln0qeAMSeSVi4NipuIIz5R8A0uCF2zBK4CXWdZR7KeaIoLBhJwQnHj1UU7E+2MK74KIUBzA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/token-providers@3.713.0': - resolution: {integrity: sha512-KNL+XaU0yR6qFDtceHe/ycEz0kHyDWNd2pbL3clFWzeVQXYs8+dYDEXA17MJPVyg7oh4wRdu0ymwQsBMl2wYAA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.713.0 - - '@aws-sdk/token-providers@3.714.0': - resolution: {integrity: sha512-vKN064aLE3kl+Zl16Ony3jltHnMddMBT7JRkP1L+lLywhA0PcAKxpdvComul/sTBWnbnwLnaS5NsDUhcWySH8A==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.714.0 - - '@aws-sdk/types@3.713.0': - resolution: {integrity: sha512-AMSYVKi1MxrJqGGbjcFC7/4g8E+ZHGfg/eW0+GXQJmsVjMjccHtU+s1dYloX4KEDgrY42QPep+dpSVRR4W7U1Q==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/types@3.714.0': - resolution: {integrity: sha512-ZjpP2gYbSFlxxaUDa1Il5AVvfggvUPbjzzB/l3q0gIE5Thd6xKW+yzEpt2mLZ5s5UaYSABZbF94g8NUOF4CVGA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-arn-parser@3.693.0': - resolution: {integrity: sha512-WC8x6ca+NRrtpAH64rWu+ryDZI3HuLwlEr8EU6/dbC/pt+r/zC0PBoC15VEygUaBA+isppCikQpGyEDu0Yj7gQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-endpoints@3.713.0': - resolution: {integrity: sha512-fbHDhiPTqfmkWzxZgWy+GFpdfiWJa1kNLWJCF4+yaF7iOZz0eyHoBX3iaTf20V2SUU8D2td/qkwTF+cpSZTZVw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-endpoints@3.714.0': - resolution: {integrity: sha512-Xv+Z2lhe7w7ZZRsgBwBMZgGTVmS+dkkj2S13uNHAx9lhB5ovM8PhK5G/j28xYf6vIibeuHkRAbb7/ozdZIGR+A==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-locate-window@3.693.0': - resolution: {integrity: sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-user-agent-browser@3.713.0': - resolution: {integrity: sha512-ioLAF8aIlcVhdizFVNuogMK5u3Js04rpGFvsbZANa1SJ9pK2UsKznnzinJT4e4ongy55g6LSZkWlF79VjG/Yfw==} - - '@aws-sdk/util-user-agent-browser@3.714.0': - resolution: {integrity: sha512-OdJJ03cP9/MgIVToPJPCPUImbpZzTcwdIgbXC0tUQPJhbD7b7cB4LdnkhNHko+MptpOrCq4CPY/33EpOjRdofw==} - - '@aws-sdk/util-user-agent-node@3.713.0': - resolution: {integrity: sha512-dIunWBB7zRLvLVzNoBjap8YWrOhkwdFEjDWx9NleD+8ufpCFq5gEm8PJ0JP6stUgG5acTmafdzH7NgMyaeEexA==} - engines: {node: '>=16.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/util-user-agent-node@3.716.0': - resolution: {integrity: sha512-3PqaXmQbxrtHKAsPCdp7kn5FrQktj8j3YyuNsqFZ8rWZeEQ88GWlsvE61PTsr2peYCKzpFqYVddef2x1axHU0w==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-user-agent-node@3.758.0': + resolution: {integrity: sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw==} + engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: @@ -446,16 +335,16 @@ packages: '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.709.0': - resolution: {integrity: sha512-2GPCwlNxeHspoK/Mc8nbk9cBOkSpp3j2SJUQmFnyQK6V/pR6II2oPRyZkMomug1Rc10hqlBHByMecq4zhV2uUw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/xml-builder@3.734.0': + resolution: {integrity: sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==} + engines: {node: '>=18.0.0'} '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.3': - resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': @@ -470,27 +359,30 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': - resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} + '@date-fns/tz@1.2.0': + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: @@ -714,28 +606,28 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.1': - resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.17.0': - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + '@eslint/js@9.21.0': + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.4': - resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@faceless-ui/modal@3.0.0-beta.2': @@ -744,23 +636,23 @@ packages: 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==} + '@faceless-ui/scroll-info@2.0.0': + resolution: {integrity: sha512-BkyJ9OQ4bzpKjE3UhI8BhcG36ZgfB4run8TmlaR4oMFUbl59dfyarNfjveyimrxIso9RhFEja/AJ5nQmbcR9hw==} 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 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@faceless-ui/window-info@3.0.0-beta.0': - resolution: {integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==} + '@faceless-ui/window-info@3.0.1': + resolution: {integrity: sha512-uPjdJYE/j7hqVNelE9CRUNOeXuXDdPxR4DMe+oz3xwyZi2Y4CxsfpfdPTqqwmNAZa1P33O+ZiCyIkBEeNed0kw==} 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 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@floating-ui/core@1.6.8': - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} - '@floating-ui/dom@1.6.12': - resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} '@floating-ui/react-dom@2.1.2': resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} @@ -768,29 +660,32 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + '@floating-ui/react@0.27.5': + resolution: {integrity: sha512-BX3jKxo39Ba05pflcQmqPPwc0qdNsdNi/eweAFtoIdrJWNen2sVEWMEac3i6jU55Qfx+lOcdMNKYn2CtWmlnOQ==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@formatjs/ecma402-abstract@2.3.1': - resolution: {integrity: sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==} + '@formatjs/ecma402-abstract@2.3.3': + resolution: {integrity: sha512-pJT1OkhplSmvvr6i3CWTPvC/FGC06MbN5TNBfRO6Ox62AEz90eMq+dVvtX9Bl3jxCEkS0tATzDarRZuOLw7oFg==} - '@formatjs/fast-memoize@2.2.5': - resolution: {integrity: sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==} + '@formatjs/fast-memoize@2.2.6': + resolution: {integrity: sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==} - '@formatjs/icu-messageformat-parser@2.9.7': - resolution: {integrity: sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==} + '@formatjs/icu-messageformat-parser@2.11.1': + resolution: {integrity: sha512-o0AhSNaOfKoic0Sn1GkFCK4MxdRsw7mPJ5/rBpIqdvcC7MIuyUSW8WChUEvrK78HhNpYOgqCQbINxCTumJLzZA==} - '@formatjs/icu-skeleton-parser@1.8.11': - resolution: {integrity: sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==} + '@formatjs/icu-skeleton-parser@1.8.13': + resolution: {integrity: sha512-N/LIdTvVc1TpJmMt2jVg0Fr1F7Q1qJPdZSCs19unMskCmVQ/sa0H9L8PWt13vq+gLdLg1+pPsvBLydL1Apahjg==} - '@formatjs/intl-localematcher@0.5.9': - resolution: {integrity: sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==} + '@formatjs/intl-localematcher@0.5.10': + resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + + '@formatjs/intl-localematcher@0.6.0': + resolution: {integrity: sha512-4rB4g+3hESy1bHSBG3tDFaMY2CH67iT7yne1e+0CLTsGLDcmoEWWpJjjpWVaYgYfYuohIRuo0E+N536gd2ZHZA==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -808,8 +703,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} '@img/sharp-darwin-arm64@0.33.5': @@ -942,148 +837,143 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - '@lexical/clipboard@0.20.0': - resolution: {integrity: sha512-oHmb9kSVHjeFCd2q8VrEXW22doUHMJ6cGXqo7Ican7Ljl4/9OgRWr+cq55yntoSaJfCrRYkTiZCLDejF2ciSiA==} + '@lexical/clipboard@0.21.0': + resolution: {integrity: sha512-3lNMlMeUob9fcnRXGVieV/lmPbmet/SVWckNTOwzfKrZ/YW5HiiyJrWviLRVf50dGXTbmBGt7K/2pfPYvWCHFA==} - '@lexical/code@0.20.0': - resolution: {integrity: sha512-zFsVGuzIn4CQxEnlW4AG/Hq6cyATVZ4fZTxozE/f5oK4vDPvnY/goRxrzSuAMX73A/HRX3kTEzMDcm4taRM3Mg==} + '@lexical/code@0.21.0': + resolution: {integrity: sha512-E0DNSFu4I+LMn3ft+UT0Dbntc8ZKjIA0BJj6BDewm0qh3bir40YUf5DkI2lpiFNRF2OpcmmcIxakREeU6avqTA==} - '@lexical/devtools-core@0.20.0': - resolution: {integrity: sha512-/CnL+Dfpzw4koy2BTdUICkvrCkMIYG8Y73KB/S1Bt5UzJpD+PV300puWJ0NvUvAj24H78r73jxvK2QUG67Tdaw==} + '@lexical/devtools-core@0.21.0': + resolution: {integrity: sha512-csK41CmRLZbKNV5pT4fUn5RzdPjU5PoWR8EqaS9kiyayhDg2zEnuPtvUYWanLfCLH9A2oOfbEsGxjMctAySlJw==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' - '@lexical/dragon@0.20.0': - resolution: {integrity: sha512-3DAHF8mSKiPZtXCqu2P8ynSwS3fGXzg4G/V0lXNjBxhmozjzUzWZRWIWtmTlWdEu9GXsoyeM3agcaxyDPJJwkA==} + '@lexical/dragon@0.21.0': + resolution: {integrity: sha512-ahTCaOtRFNauEzplN1qVuPjyGAlDd+XcVM5FQCdxVh/1DvqmBxEJRVuCBqatzUUVb89jRBekYUcEdnY9iNjvEQ==} - '@lexical/hashtag@0.20.0': - resolution: {integrity: sha512-ldOP/d9tA6V9qvLyr3mRYkcYY5ySOHJ2BFOW/jZPxQcj6lWafS8Lk7XdMUpHHDjRpY2Hizsi5MHJkIqFglYXbw==} + '@lexical/hashtag@0.21.0': + resolution: {integrity: sha512-O4dxcZNq1Xm45HLoRifbGAYvQkg3qLoBc6ibmHnDqZL5mQDsufnH6QEKWfgDtrvp9++3iqsSC+TE7VzWIvA7ww==} - '@lexical/headless@0.20.0': - resolution: {integrity: sha512-PZ9Yxud7UOpVoq3oJ1wb3wb7NHyFt8XLc1IhdNAzTzbZ+L6c9lyomgBFvDs11u/3t9vjtLxGbzkzYKryQE80Ig==} + '@lexical/headless@0.21.0': + resolution: {integrity: sha512-7/eEz6ed39MAg34c+rU7xUn46UV4Wdt5dEZwsdBzuflWhpNeUscQmkw8wIoFhEhJdCc+ZbB17CnjJlUZ1RxHvg==} - '@lexical/history@0.20.0': - resolution: {integrity: sha512-dXtIS31BU6RmLX2KwLAi1EgGl+USeyi+rshh19azACXHPFqONZgPd2t21LOLSFn7C1/W+cSp/kqVDlQVbZUZRA==} + '@lexical/history@0.21.0': + resolution: {integrity: sha512-Sv2sici2NnAfHYHYRSjjS139MDT8fHP6PlYM2hVr+17dOg7/fJl22VBLRgQ7/+jLtAPxQjID69jvaMlOvt4Oog==} - '@lexical/html@0.20.0': - resolution: {integrity: sha512-ob7QHkEv+mhaZjlurDj90UmEyN9G4rzBPR5QV42PLnu1qMSviMEdI5V3a5/A5aFf/FDDQ+0GAgWBFnA/MEDczQ==} + '@lexical/html@0.21.0': + resolution: {integrity: sha512-UGahVsGz8OD7Ya39qwquE+JPStTxCw/uaQrnUNorCM7owtPidO2H+tsilAB3A1GK3ksFGdHeEjBjG0Gf7gOg+Q==} - '@lexical/link@0.20.0': - resolution: {integrity: sha512-zicDcfgRZPRFZ8WOZv5er0Aqkde+i7QoFVkLQD4dNLLORjoMSJOISJH6VEdjBl3k7QJTxbfrt+xT5d/ZsAN5GA==} + '@lexical/link@0.21.0': + resolution: {integrity: sha512-/coktIyRXg8rXz/7uxXsSEfSQYxPIx8CmignAXWYhcyYtCWA0fD2mhEhWwVvHH9ofNzvidclRPYKUnrmUm3z3Q==} - '@lexical/list@0.20.0': - resolution: {integrity: sha512-ufSse8ui3ooUe0HA/yF/9STrG8wYhIDLMRhELOw80GFCkPJaxs6yRvjfmJooH5IC88rpUJ5XXFFiZKfGxEZLEw==} + '@lexical/list@0.21.0': + resolution: {integrity: sha512-WItGlwwNJCS8b6SO1QPKzArShmD+OXQkLbhBcAh+EfpnkvmCW5T5LqY+OfIRmEN1dhDOnwqCY7mXkivWO8o5tw==} - '@lexical/mark@0.20.0': - resolution: {integrity: sha512-1P2izmkgZ4VDp+49rWO1KfWivL5aA30y5kkYbFZ/CS05fgbO7ogMjLSajpz+RN/zzW79v3q4YfikrMgaD23InA==} + '@lexical/mark@0.21.0': + resolution: {integrity: sha512-2x/LoHDYPOkZbKHz4qLFWsPywjRv9KggTOtmRazmaNRUG0FpkImJwUbbaKjWQXeESVGpzfL3qNFSAmCWthsc4g==} - '@lexical/markdown@0.20.0': - resolution: {integrity: sha512-ZoGsECejp9z6MEvc8l81b1h1aWbB3sTq6xOFeUTbDL5vKpA67z5CmQQLi0uZWrygrbO9dSE3Q/JGcodUrczxbw==} + '@lexical/markdown@0.21.0': + resolution: {integrity: sha512-XCQCyW5ujK0xR6evV8sF0hv/MRUA//kIrB2JiyF12tLQyjLRNEXO+0IKastWnMKSaDdJMKjzgd+4PiummYs7uA==} - '@lexical/offset@0.20.0': - resolution: {integrity: sha512-VMhxsxxDGnpVw0jgC8UlDf0Q2RHIHbS49uZgs3l9nP+O+G8s3b76Ta4Tb+iJOK2FY6874/TcQMbSuXGhfpQk8A==} + '@lexical/offset@0.21.0': + resolution: {integrity: sha512-UR0wHg+XXbq++6aeUPdU0K41xhUDBYzX+AeiqU9bZ7yoOq4grvKD8KBr5tARCSYTy0yvQnL1ddSO12TrP/98Lg==} - '@lexical/overflow@0.20.0': - resolution: {integrity: sha512-z4lElzLm1FVifc7bzBZN4VNKeTuwygpyHQvCJVWXzF2Kbvex43PEYMi8u4A83idVqbmzbyBLASwUJS0voLoPLw==} + '@lexical/overflow@0.21.0': + resolution: {integrity: sha512-93P+d1mbvaJvZF8KK2pG22GuS2pHLtyC7N3GBfkbyAIb7TL/rYs47iR+eADJ4iNY680lylJ4Sl/AEnWvlY7hAg==} - '@lexical/plain-text@0.20.0': - resolution: {integrity: sha512-LvoC+9mm2Im1iO8GgtgaqSfW0T3mIE5GQl1xGxbVNdANmtHmBgRAJn2KfQm1XHZP6zydLRMhZkzC+jfInh2yfQ==} + '@lexical/plain-text@0.21.0': + resolution: {integrity: sha512-r4CsAknBD7qGYSE5fPdjpJ6EjfvzHbDtuCeKciL9muiswQhw4HeJrT1qb/QUIY+072uvXTgCgmjUmkbYnxKyPA==} - '@lexical/react@0.20.0': - resolution: {integrity: sha512-5QbN5AFtZ9efXxU/M01ADhUZgthR0e8WKi5K/w5EPpWtYFDPQnUte3rKUjYJ7uwG1iwcvaCpuMbxJjHQ+i6pDQ==} + '@lexical/react@0.21.0': + resolution: {integrity: sha512-tKwx8EoNkBBKOZf8c10QfyDImH87+XUI1QDL8KXt+Lb8E4ho7g1jAjoEirNEn9gMBj33K4l2qVdbe3XmPAdpMQ==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' - '@lexical/rich-text@0.20.0': - resolution: {integrity: sha512-BR1pACdMA+Ymef0f5EN1y+9yP8w7S+9MgmBP1yjr3w4KdqRnfSaGWyxwcHU8eA+zu16QfivpB6501VJ90YeuXw==} + '@lexical/rich-text@0.21.0': + resolution: {integrity: sha512-+pvEKUneEkGfWOSTl9jU58N9knePilMLxxOtppCAcgnaCdilOh3n5YyRppXhvmprUe0JaTseCMoik2LP51G/JA==} - '@lexical/selection@0.20.0': - resolution: {integrity: sha512-YnkH5UCMNN/em95or/6uwAV31vcENh1Roj+JOg5KD+gJuA7VGdDCy0vZl/o0+1badXozeZ2VRxXNC6JSK7T4+A==} + '@lexical/selection@0.21.0': + resolution: {integrity: sha512-4u53bc8zlPPF0rnHjsGQExQ1St8NafsDd70/t1FMw7yvoMtUsKdH7+ap00esLkJOMv45unJD7UOzKRqU1X0sEA==} - '@lexical/table@0.20.0': - resolution: {integrity: sha512-qHuK2rvQUoQDx62YpvJE3Ev4yK9kjRFo79IDBapxrhoXg/wCGQOjMBzVD3G5PWkhyl/GDnww80GwYjLloQLQzg==} + '@lexical/table@0.21.0': + resolution: {integrity: sha512-JhylAWcf4qKD4FmxMUt3YzH5zg2+baBr4+/haLZL7178hMvUzJwGIiWk+3hD3phzmW3WrP49uFXzM7DMSCkE8w==} - '@lexical/text@0.20.0': - resolution: {integrity: sha512-Fu64i5CIlEOlgucSdp9XFqB2XqoRsw4at76n93+6RF4+LgGDnu4nLXQVCVxNmLcGyh2WgczuTpnk5P2mHNAIUA==} + '@lexical/text@0.21.0': + resolution: {integrity: sha512-ceB4fhYejCoR8ID4uIs0sO/VyQoayRjrRWTIEMvOcQtwUkcyciKRhY0A7f2wVeq/MFStd+ajLLjy4WKYK5zUnA==} - '@lexical/utils@0.20.0': - resolution: {integrity: sha512-sXIa2nowrNxY8VcjjuxZbJ/HovIql8bmInNaxBR03JAYfqMiL5I5/dYgjOQJV49NJnuR1uTY2GwVxVTXCTFUCw==} + '@lexical/utils@0.21.0': + resolution: {integrity: sha512-YzsNOAiLkCy6R3DuP18gtseDrzgx+30lFyqRvp5M7mckeYgQElwdfG5biNFDLv7BM9GjSzgU5Cunjycsx6Sjqg==} - '@lexical/yjs@0.20.0': - resolution: {integrity: sha512-TiHNhu2VkhXN69V+fXVS3xjOQ6aLnheQUGwOAhuFkDPL3VLCb0yl2Mgydpayn+3Grwii4ZBHcF7oCC84GiU5bw==} + '@lexical/yjs@0.21.0': + resolution: {integrity: sha512-AtPhC3pJ92CHz3dWoniSky7+MSK2WSd0xijc76I2qbTeXyeuFfYyhR6gWMg4knuY9Wz3vo9/+dXGdbQIPD8efw==} 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/loader@1.5.0': + resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} - '@monaco-editor/react@4.6.0': - resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} + '@monaco-editor/react@4.7.0': + resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} 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 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@mongodb-js/saslprep@1.1.9': - resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} + '@mongodb-js/saslprep@1.2.0': + resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} - '@next/env@15.1.0': - resolution: {integrity: sha512-UcCO481cROsqJuszPPXJnb7GGuLq617ve4xuAyyNG4VSSocJNtMU5Fsx+Lp6mlN8c7W58aZLc5y6D/2xNmaK+w==} - - '@next/env@15.1.2': - resolution: {integrity: sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==} + '@next/env@15.2.0': + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} '@next/eslint-plugin-next@15.1.0': resolution: {integrity: sha512-+jPT0h+nelBT6HC9ZCHGc7DgGVy04cv4shYdAe6tKlEbjQUtwU3LzQhzbDHQyY2m6g39m6B0kOFVuLGBrxxbGg==} - '@next/swc-darwin-arm64@15.1.0': - resolution: {integrity: sha512-ZU8d7xxpX14uIaFC3nsr4L++5ZS/AkWDm1PzPO6gD9xWhFkOj2hzSbSIxoncsnlJXB1CbLOfGVN4Zk9tg83PUw==} + '@next/swc-darwin-arm64@15.2.0': + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.0': - resolution: {integrity: sha512-DQ3RiUoW2XC9FcSM4ffpfndq1EsLV0fj0/UY33i7eklW5akPUCo6OX2qkcLXZ3jyPdo4sf2flwAED3AAq3Om2Q==} + '@next/swc-darwin-x64@15.2.0': + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.0': - resolution: {integrity: sha512-M+vhTovRS2F//LMx9KtxbkWk627l5Q7AqXWWWrfIzNIaUFiz2/NkOFkxCFyNyGACi5YbA8aekzCLtbDyfF/v5Q==} + '@next/swc-linux-arm64-gnu@15.2.0': + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.0': - resolution: {integrity: sha512-Qn6vOuwaTCx3pNwygpSGtdIu0TfS1KiaYLYXLH5zq1scoTXdwYfdZtwvJTpB1WrLgiQE2Ne2kt8MZok3HlFqmg==} + '@next/swc-linux-arm64-musl@15.2.0': + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.0': - resolution: {integrity: sha512-yeNh9ofMqzOZ5yTOk+2rwncBzucc6a1lyqtg8xZv0rH5znyjxHOWsoUtSq4cUTeeBIiXXX51QOOe+VoCjdXJRw==} + '@next/swc-linux-x64-gnu@15.2.0': + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.0': - resolution: {integrity: sha512-t9IfNkHQs/uKgPoyEtU912MG6a1j7Had37cSUyLTKx9MnUpjj+ZDKw9OyqTI9OwIIv0wmkr1pkZy+3T5pxhJPg==} + '@next/swc-linux-x64-musl@15.2.0': + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.0': - resolution: {integrity: sha512-WEAoHyG14t5sTavZa1c6BnOIEukll9iqFRTavqRVPfYmfegOAd5MaZfXgOGG6kGo1RduyGdTHD4+YZQSdsNZXg==} + '@next/swc-win32-arm64-msvc@15.2.0': + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.0': - resolution: {integrity: sha512-J1YdKuJv9xcixzXR24Dv+4SaDKc2jj31IVUEMdO5xJivMTXuE6MAdIi4qPjSymHuFG8O5wbfWKnhJUcHHpj5CA==} + '@next/swc-win32-x64-msvc@15.2.0': + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1104,111 +994,97 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@one-ini/wasm@0.1.1': - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - - '@payloadcms/db-mongodb@3.11.0': - resolution: {integrity: sha512-mPtbgo/e1HJe2kHtIe+xKUne0jswg5t/OxlLZ1h22S4FII7m/dK3ezpC+EHI4Z4lHSbKt0yIPGrKANxmmkkOsQ==} + '@payloadcms/db-mongodb@3.25.0': + resolution: {integrity: sha512-M5aD+s698wlmagTJPqgKySrwtuIjtwEJHQ8Ft5qLZWM/ngizrePbW/N/jGicSkuKJjwlP0fwJSrDQ4bkAN515g==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/email-nodemailer@3.11.0': - resolution: {integrity: sha512-g62Dcu/zlcKjH3Y9SrOsV0e7OTCUt7OJt2wq8iukSmAmEqVmkbZFHvzmh9BntGcTAjaBKguJosW8ep7lQW7zcA==} + '@payloadcms/email-nodemailer@3.25.0': + resolution: {integrity: sha512-7sPx3Uyt+piUdqz0/lRUaU7sjU7XGGuu//9qbf9FVwoceGQ/k8OBuK9dxKko2aMlfpff8Mo9ujKYFxfT4R970g==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/graphql@3.11.0': - resolution: {integrity: sha512-IYiivNdm++wiUvHa40S9rM/rjwrh7D/7rofZjR7aDEvWiYj2lF/ZfmG7PY22S7ZCYcmq4+bgOqSk4JYz5lXynw==} + '@payloadcms/graphql@3.25.0': + resolution: {integrity: sha512-JbffYYHcsqOPK7GH6WgQd+xbtNQxG+is3el+qxIVIqTGwrZtGy7EFg2OK3XMk3Hb/bJUH/Ino3X3XsgdD6ffyg==} hasBin: true peerDependencies: graphql: ^16.8.1 - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/live-preview-react@3.11.0': - resolution: {integrity: sha512-Ng+OonmNEB5njTfAntE8WF7OBKDhbvlciPAe3cBRTL5eS2QwfX4PK/T/fxIwV9GhKwmmcDSFWtccdIQ0TRfocg==} + '@payloadcms/live-preview-react@3.25.0': + resolution: {integrity: sha512-toqtcPKKYTr5qKN1o89+lLpt9XWthzMy8IrzyJTCoSWWgrZBAvuWE1iskQxRDZsjEGyzi91B8yyJy7lgts04aQ==} peerDependencies: - react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/live-preview@3.11.0': - resolution: {integrity: sha512-CBsvUSV2fI8NrSML9Afnd/yy2D89cxtVz9LnMquoiZLqDbpR0U31BJ2Pxq7HFAsPaNxnRpzZD5NZsYRsak9hnA==} + '@payloadcms/live-preview@3.25.0': + resolution: {integrity: sha512-EzhHqyWCsqyt6MEB+4P0jVvALcNgsS9551QIfWgVHi31qWACxxDWFS6TRms2PF9ObiLTD4aWLukSrC5RAMF3KQ==} - '@payloadcms/next@3.11.0': - resolution: {integrity: sha512-Ut1Mrfv5pXKza1kipv5C80KZ/fyziaNsAV73gCOykritPsownRyeXugaEobcL8GcifvAoduk75mAXAw+rwizgw==} + '@payloadcms/next@3.25.0': + resolution: {integrity: sha512-Xx703RpURJ34yRMTgjcbyg555p0yXCH5C6ZxLCinEs1Lv3nE6FymVjlMGs2y+5IqPZfjaH4qnkgcwtxBE+fHQw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: graphql: ^16.8.1 next: ^15.0.0 - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/payload-cloud@3.11.0': - resolution: {integrity: sha512-FvUlesO/4hpWtry8I0Veifs4KJxrMEubPoonCMEYS1cgQnlzxP6uGzDOe5i8eMLOg3fgEnWQFyZkug1xr/7gCQ==} + '@payloadcms/payload-cloud@3.25.0': + resolution: {integrity: sha512-VVNIvxAxxfxCArKcKKgBs81q7WhndiaPhAVU5VPr5giRzMpvATIwwpirjnfeoJxndL5X79lGhRcKiznwSIEEkw==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/plugin-form-builder@3.11.0': - resolution: {integrity: sha512-pawZ86gvqqwAky9krxgSXgCR1Jr/Ui851omWEuXtkkhF2qlpw3HUy0Dc9N37PHBHFJ04Vm1/M4/GyhQalMWAHA==} + '@payloadcms/plugin-form-builder@3.25.0': + resolution: {integrity: sha512-2/rEJjH8F99LF5BDAjEnY8T697dbc2ZFHk+FlCVXWf5FpwneNXz7teWj20tGmLwmN4bdz3KYgby0tHNuH/reyQ==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/plugin-nested-docs@3.11.0': - resolution: {integrity: sha512-pOmwkTbrZBfr8PQQNvBEbJz9P2jtU2mO9UuLqjp8x2/NFFyLsJ0NE0BbGAdLHBguzY+jIzybl6RblP2PalXjww==} + '@payloadcms/plugin-nested-docs@3.25.0': + resolution: {integrity: sha512-hIYKsaaTBy0l+hYTJgwVJeSfc+bGA7kzm+o6f8fR6kdWOlgE8M1/m1DB+54MedzY8vHZ31YKBWNny3ompWDQJQ==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/plugin-redirects@3.11.0': - resolution: {integrity: sha512-BTVqsz/amR7DH5aU6BF8anuCznZIaCnsVZjHi6oB/P1KktrPVFzHcxdADVYpbCEykKqNujS8CXbDNCzvLjxoNQ==} + '@payloadcms/plugin-redirects@3.25.0': + resolution: {integrity: sha512-B19VBVXGbloXmSrkOmpCGiI5d+iQdA/Y5ciyvIiXELp52SWk88D7U4GuDKgWeS5FFyduNhB64mltJ6vJq+3bxg==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/plugin-search@3.11.0': - resolution: {integrity: sha512-Y6uMMaT1NCo77xP0GYTdnbY+0pYpwkgdYz5VpR54PUifKkPJcTWYGvwTVPUzTrBq7fV0vP8V8EqgOrNuwWWf4Q==} + '@payloadcms/plugin-search@3.25.0': + resolution: {integrity: sha512-VLTIv6emUmdoPip/A1TaCpU4As+ng1OhYynesVMCPa8A7jUvr4KQX1yE3XF0z7os2CzuITb0EsfKC5Wb+OAHUQ==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/plugin-seo@3.11.0': - resolution: {integrity: sha512-NBJW0/vQl4UnzEZhJki4jssEaGJspJXM98uJ6FD+JOj2UDwuqN5HWG0fw3bSqvqlrJlSFThiyLVLbkfGUMf3nA==} + '@payloadcms/plugin-seo@3.25.0': + resolution: {integrity: sha512-zdHemmXb5O3c9XF5zP7B1oLibqMILkOvgh5MnpZA16QSM84dWefj/UizjcJ+NeYx1ODJTPT1eIRVB3gW/JLgtg==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/richtext-lexical@3.11.0': - resolution: {integrity: sha512-ONR+sSRayllhTEk1N9b1jXzmKUzUKU73/KmtQNu90+mmvs6rdqNbDcjerlE/uVprkvDO/gRpI+jVFNlFD/cuBw==} + '@payloadcms/richtext-lexical@3.25.0': + resolution: {integrity: sha512-VHRqbhRu137bRYopYnPJef+5G2XyQO2a7LFUKPcnscwKDJKxkNQ5+jbUMKUjpm5zdxfbirnDVjWgJcsixau0Og==} 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.20.0 - '@lexical/html': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/react': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - '@payloadcms/next': 3.11.0 - lexical: 0.20.0 - payload: 3.11.0 + '@faceless-ui/scroll-info': 2.0.0 + '@payloadcms/next': 3.25.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/translations@3.11.0': - resolution: {integrity: sha512-6iGYqe3lE5ARBcMDbXOcPB0mMK2oxyn46fI2c06u2VEGS6z4b8B4cDoNfHv6ZhInzTS94ZtZUnbK1heR8KcEcg==} + '@payloadcms/translations@3.25.0': + resolution: {integrity: sha512-af+fDh+fzfExx9oeM8AJqwdEfc6X291smMUUe3mOCRlwIylcxXKzgj8ITdwPonGzaV/GJjAsc4U0mZIkaA6MMg==} - '@payloadcms/ui@3.11.0': - resolution: {integrity: sha512-iB8BThtP+gFnt/DA1NHTdTTv5TZx3aYWQca/VGhrYU5SCR1SUVGcBpO7qW2eQiHWjnaMKA8tvqeY8T5mkEdfRA==} + '@payloadcms/ui@3.25.0': + resolution: {integrity: sha512-9zOv8zeenZlNua+WlFtldVAUn6NatMY5BPXzWRMWSfIVnrRqimY87HQyS6uvncSPdsPwqf9UH6mBkbIqbeusgw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: next: ^15.0.0 - payload: 3.11.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 @@ -1222,8 +1098,8 @@ packages: '@radix-ui/primitive@1.1.1': resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} - '@radix-ui/react-arrow@1.1.1': - resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} + '@radix-ui/react-arrow@1.1.2': + resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1235,8 +1111,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.1.3': - resolution: {integrity: sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==} + '@radix-ui/react-checkbox@1.1.4': + resolution: {integrity: sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1248,8 +1124,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.1': - resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==} + '@radix-ui/react-collection@1.1.2': + resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1288,8 +1164,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.3': - resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==} + '@radix-ui/react-dismissable-layer@1.1.5': + resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1310,8 +1186,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.1': - resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==} + '@radix-ui/react-focus-scope@1.1.2': + resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1332,8 +1208,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.1.1': - resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==} + '@radix-ui/react-label@2.1.2': + resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1345,8 +1221,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.1': - resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} + '@radix-ui/react-popper@1.2.2': + resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1358,8 +1234,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.3': - resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==} + '@radix-ui/react-portal@1.1.4': + resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1384,8 +1260,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.0.1': - resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} + '@radix-ui/react-primitive@2.0.2': + resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1397,8 +1273,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.1.4': - resolution: {integrity: sha512-pOkb2u8KgO47j/h7AylCj7dJsm69BXcjkrvTqMptFqsE2i0p8lHkfgneXKjAgPzBMivnoMyt8o4KiV4wYzDdyQ==} + '@radix-ui/react-select@2.1.6': + resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1410,8 +1286,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.1.1': - resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==} + '@radix-ui/react-slot@1.1.2': + resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1482,8 +1358,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.1.1': - resolution: {integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==} + '@radix-ui/react-visually-hidden@1.1.2': + resolution: {integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1498,221 +1374,223 @@ packages: '@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'} - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.10.4': - resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + '@rushstack/eslint-patch@1.10.5': + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} - '@selderee/plugin-htmlparser2@0.10.0': - resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} + '@smithy/abort-controller@4.0.1': + resolution: {integrity: sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==} + engines: {node: '>=18.0.0'} - '@smithy/abort-controller@3.1.9': - resolution: {integrity: sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==} - engines: {node: '>=16.0.0'} + '@smithy/chunked-blob-reader-native@4.0.0': + resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@3.0.1': - resolution: {integrity: sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==} + '@smithy/chunked-blob-reader@5.0.0': + resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@4.0.0': - resolution: {integrity: sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==} + '@smithy/config-resolver@4.0.1': + resolution: {integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==} + engines: {node: '>=18.0.0'} - '@smithy/config-resolver@3.0.13': - resolution: {integrity: sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==} - engines: {node: '>=16.0.0'} + '@smithy/core@3.1.5': + resolution: {integrity: sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==} + engines: {node: '>=18.0.0'} - '@smithy/core@2.5.5': - resolution: {integrity: sha512-G8G/sDDhXA7o0bOvkc7bgai6POuSld/+XhNnWAbpQTpLv2OZPvyqQ58tLPPlz0bSNsXktldDDREIv1LczFeNEw==} - engines: {node: '>=16.0.0'} + '@smithy/credential-provider-imds@4.0.1': + resolution: {integrity: sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==} + engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@3.2.8': - resolution: {integrity: sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-codec@4.0.1': + resolution: {integrity: sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@3.1.10': - resolution: {integrity: sha512-323B8YckSbUH0nMIpXn7HZsAVKHYHFUODa8gG9cHo0ySvA1fr5iWaNT+iIL0UCqUzG6QPHA3BSsBtRQou4mMqQ==} + '@smithy/eventstream-serde-browser@4.0.1': + resolution: {integrity: sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@3.0.14': - resolution: {integrity: sha512-kbrt0vjOIihW3V7Cqj1SXQvAI5BR8SnyQYsandva0AOR307cXAc+IhPngxIPslxTLfxwDpNu0HzCAq6g42kCPg==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-config-resolver@4.0.1': + resolution: {integrity: sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@3.0.11': - resolution: {integrity: sha512-P2pnEp4n75O+QHjyO7cbw/vsw5l93K/8EWyjNCAAybYwUmj3M+hjSQZ9P5TVdUgEG08ueMAP5R4FkuSkElZ5tQ==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-node@4.0.1': + resolution: {integrity: sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@3.0.13': - resolution: {integrity: sha512-zqy/9iwbj8Wysmvi7Lq7XFLeDgjRpTbCfwBhJa8WbrylTAHiAu6oQTwdY7iu2lxigbc9YYr9vPv5SzYny5tCXQ==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-universal@4.0.1': + resolution: {integrity: sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@3.0.13': - resolution: {integrity: sha512-L1Ib66+gg9uTnqp/18Gz4MDpJPKRE44geOjOQ2SVc0eiaO5l255ADziATZgjQjqumC7yPtp1XnjHlF1srcwjKw==} - engines: {node: '>=16.0.0'} + '@smithy/fetch-http-handler@5.0.1': + resolution: {integrity: sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==} + engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@4.1.2': - resolution: {integrity: sha512-R7rU7Ae3ItU4rC0c5mB2sP5mJNbCfoDc8I5XlYjIZnquyUwec7fEo78F6DA3SmgJgkU1qTMcZJuGblxZsl10ZA==} + '@smithy/hash-blob-browser@4.0.1': + resolution: {integrity: sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==} + engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@3.1.10': - resolution: {integrity: sha512-elwslXOoNunmfS0fh55jHggyhccobFkexLYC1ZeZ1xP2BTSrcIBaHV2b4xUQOdctrSNOpMqOZH1r2XzWTEhyfA==} + '@smithy/hash-node@4.0.1': + resolution: {integrity: sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==} + engines: {node: '>=18.0.0'} - '@smithy/hash-node@3.0.11': - resolution: {integrity: sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==} - engines: {node: '>=16.0.0'} + '@smithy/hash-stream-node@4.0.1': + resolution: {integrity: sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==} + engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@3.1.10': - resolution: {integrity: sha512-olomK/jZQ93OMayW1zfTHwcbwBdhcZOHsyWyiZ9h9IXvc1mCD/VuvzbLb3Gy/qNJwI4MANPLctTp2BucV2oU/Q==} - engines: {node: '>=16.0.0'} - - '@smithy/invalid-dependency@3.0.11': - resolution: {integrity: sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==} + '@smithy/invalid-dependency@4.0.1': + resolution: {integrity: sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==} + engines: {node: '>=18.0.0'} '@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/is-array-buffer@4.0.0': + resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + engines: {node: '>=18.0.0'} - '@smithy/md5-js@3.0.11': - resolution: {integrity: sha512-3NM0L3i2Zm4bbgG6Ymi9NBcxXhryi3uE8fIfHJZIOfZVxOkGdjdgjR9A06SFIZCfnEIWKXZdm6Yq5/aPXFFhsQ==} + '@smithy/md5-js@4.0.1': + resolution: {integrity: sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@3.0.13': - resolution: {integrity: sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-content-length@4.0.1': + resolution: {integrity: sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@3.2.6': - resolution: {integrity: sha512-WAqzyulvvSKrT5c6VrQelgNVNNO7BlTQW9Z+s9tcG6G5CaBS1YBpPtT3VuhXLQbewSiGi7oXQROwpw26EG9PLQ==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-endpoint@4.0.6': + resolution: {integrity: sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@3.0.31': - resolution: {integrity: sha512-yq9wawrJLYHAYFpChLujxRN4My+SiKXvZk9Ml/CvTdRSA8ew+hvuR5LT+mjSlSBv3c4XJrkN8CWegkBaeD0Vrg==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-retry@4.0.7': + resolution: {integrity: sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@3.0.11': - resolution: {integrity: sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-serde@4.0.2': + resolution: {integrity: sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@3.0.11': - resolution: {integrity: sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-stack@4.0.1': + resolution: {integrity: sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==} + engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@3.1.12': - resolution: {integrity: sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==} - engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@4.0.1': + resolution: {integrity: sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==} + engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@3.3.2': - resolution: {integrity: sha512-t4ng1DAd527vlxvOfKFYEe6/QFBcsj7WpNlWTyjorwXXcKw3XlltBGbyHfSJ24QT84nF+agDha9tNYpzmSRZPA==} - engines: {node: '>=16.0.0'} + '@smithy/node-http-handler@4.0.3': + resolution: {integrity: sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==} + engines: {node: '>=18.0.0'} - '@smithy/property-provider@3.1.11': - resolution: {integrity: sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==} - engines: {node: '>=16.0.0'} + '@smithy/property-provider@4.0.1': + resolution: {integrity: sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==} + engines: {node: '>=18.0.0'} - '@smithy/protocol-http@4.1.8': - resolution: {integrity: sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==} - engines: {node: '>=16.0.0'} + '@smithy/protocol-http@5.0.1': + resolution: {integrity: sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==} + engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@3.0.11': - resolution: {integrity: sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@4.0.1': + resolution: {integrity: sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==} + engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@3.0.11': - resolution: {integrity: sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@4.0.1': + resolution: {integrity: sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==} + engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@3.0.11': - resolution: {integrity: sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==} - engines: {node: '>=16.0.0'} + '@smithy/service-error-classification@4.0.1': + resolution: {integrity: sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==} + engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@3.1.12': - resolution: {integrity: sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==} - engines: {node: '>=16.0.0'} + '@smithy/shared-ini-file-loader@4.0.1': + resolution: {integrity: sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==} + engines: {node: '>=18.0.0'} - '@smithy/signature-v4@4.2.4': - resolution: {integrity: sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==} - engines: {node: '>=16.0.0'} + '@smithy/signature-v4@5.0.1': + resolution: {integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==} + engines: {node: '>=18.0.0'} - '@smithy/smithy-client@3.5.1': - resolution: {integrity: sha512-PmjskH4Os1Eh3rd5vSsa5uVelZ4DRu+N5CBEgb9AT96hQSJGWSEb6pGxKV/PtKQSIp9ft3+KvnT8ViMKaguzgA==} - engines: {node: '>=16.0.0'} + '@smithy/smithy-client@4.1.6': + resolution: {integrity: sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==} + engines: {node: '>=18.0.0'} - '@smithy/types@3.7.2': - resolution: {integrity: sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==} - engines: {node: '>=16.0.0'} + '@smithy/types@4.1.0': + resolution: {integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==} + engines: {node: '>=18.0.0'} - '@smithy/url-parser@3.0.11': - resolution: {integrity: sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==} + '@smithy/url-parser@4.0.1': + resolution: {integrity: sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==} + engines: {node: '>=18.0.0'} - '@smithy/util-base64@3.0.0': - resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-base64@4.0.0': + resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@3.0.0': - resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + '@smithy/util-body-length-browser@4.0.0': + resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@3.0.0': - resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} - engines: {node: '>=16.0.0'} + '@smithy/util-body-length-node@4.0.0': + resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + engines: {node: '>=18.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-buffer-from@4.0.0': + resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@3.0.0': - resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-config-provider@4.0.0': + resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@3.0.31': - resolution: {integrity: sha512-eO+zkbqrPnmsagqzrmF7IJrCoU2wTQXWVYxMPqA9Oue55kw9WEvhyuw2XQzTVTCRcYsg6KgmV3YYhLlWQJfK1A==} - engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-browser@4.0.7': + resolution: {integrity: sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@3.0.31': - resolution: {integrity: sha512-0/nJfpSpbGZOs6qs42wCe2TdjobbnnD4a3YUUlvTXSQqLy4qa63luDaV04hGvqSHP7wQ7/WGehbvHkDhMZd1MQ==} - engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-node@4.0.7': + resolution: {integrity: sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==} + engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@2.1.7': - resolution: {integrity: sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==} - engines: {node: '>=16.0.0'} + '@smithy/util-endpoints@3.0.1': + resolution: {integrity: sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==} + engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@3.0.0': - resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-hex-encoding@4.0.0': + resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + engines: {node: '>=18.0.0'} - '@smithy/util-middleware@3.0.11': - resolution: {integrity: sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==} - engines: {node: '>=16.0.0'} + '@smithy/util-middleware@4.0.1': + resolution: {integrity: sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==} + engines: {node: '>=18.0.0'} - '@smithy/util-retry@3.0.11': - resolution: {integrity: sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-retry@4.0.1': + resolution: {integrity: sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==} + engines: {node: '>=18.0.0'} - '@smithy/util-stream@3.3.2': - resolution: {integrity: sha512-sInAqdiVeisUGYAv/FrXpmJ0b4WTFmciTRqzhb7wVuem9BHvhIG7tpiYHLDWrl2stOokNZpTTGqz3mzB2qFwXg==} - engines: {node: '>=16.0.0'} + '@smithy/util-stream@4.1.2': + resolution: {integrity: sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==} + engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@3.0.0': - resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} - engines: {node: '>=16.0.0'} + '@smithy/util-uri-escape@4.0.0': + resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + engines: {node: '>=18.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-utf8@4.0.0': + resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + engines: {node: '>=18.0.0'} - '@smithy/util-waiter@3.2.0': - resolution: {integrity: sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==} - engines: {node: '>=16.0.0'} + '@smithy/util-waiter@4.0.2': + resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==} + engines: {node: '>=18.0.0'} '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -1720,10 +1598,10 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tailwindcss/typography@0.5.15': - resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} + '@tailwindcss/typography@0.5.16': + resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} peerDependencies: - tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1755,17 +1633,17 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonwebtoken@9.0.7': - resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} + '@types/jsonwebtoken@9.0.9': + resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} - '@types/lodash@4.17.13': - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/node@22.5.4': resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} @@ -1802,57 +1680,53 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@typescript-eslint/eslint-plugin@8.18.1': - resolution: {integrity: sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==} + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} 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: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.18.1': - resolution: {integrity: sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==} + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.18.1': - resolution: {integrity: sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==} + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.18.1': - resolution: {integrity: sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==} + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.18.1': - resolution: {integrity: sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==} + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.18.1': - resolution: {integrity: sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==} + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.18.1': - resolution: {integrity: sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==} + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.18.1': - resolution: {integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==} + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1914,8 +1788,8 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-includes@3.1.8: @@ -1949,8 +1823,9 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} @@ -1971,9 +1846,6 @@ packages: resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} - axios@1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} - axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -1988,20 +1860,30 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.5.0: - resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} - bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + bare-fs@4.0.1: + resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} + engines: {bare: '>=1.7.0'} - bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + bare-os@3.5.1: + resolution: {integrity: sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg==} + engines: {bare: '>=1.14.0'} - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.6.1: - resolution: {integrity: sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==} + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2029,16 +1911,16 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.3: - resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 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@6.10.1: - resolution: {integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==} + bson@6.10.3: + resolution: {integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==} engines: {node: '>=16.20.1'} buffer-equal-constant-time@1.0.1: @@ -2057,8 +1939,8 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} call-bind@1.0.8: @@ -2077,8 +1959,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - caniuse-lite@1.0.30001689: - resolution: {integrity: sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==} + caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2146,14 +2028,6 @@ packages: 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==} @@ -2164,13 +2038,6 @@ packages: 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.12.1: resolution: {integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==} @@ -2218,16 +2085,16 @@ packages: 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==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} dataloader@2.2.3: @@ -2259,8 +2126,8 @@ packages: supports-color: optional: true - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -2288,10 +2155,6 @@ packages: 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'} @@ -2323,19 +2186,6 @@ packages: 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==} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2346,13 +2196,8 @@ packages: 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.74: - resolution: {integrity: sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==} + electron-to-chromium@1.5.109: + resolution: {integrity: sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2363,19 +2208,15 @@ packages: 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==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} 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.6: - resolution: {integrity: sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -2386,20 +2227,21 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} @@ -2433,8 +2275,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.7.0: - resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -2483,14 +2325,14 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} 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@7.37.2: - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -2507,8 +2349,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2551,10 +2393,6 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - 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==} @@ -2571,8 +2409,8 @@ packages: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -2588,18 +2426,18 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.3: - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2629,32 +2467,20 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} - engines: {node: '>= 6'} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -2672,8 +2498,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.7: - resolution: {integrity: sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -2688,18 +2514,25 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -2744,8 +2577,8 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql-http@1.22.3: - resolution: {integrity: sha512-sgUz/2DZt+QvY6WrpAsAXUvhnIkp2eX9jN78V8DAtFcpZi/nfDrzDt2byYjyoJzRcWuqhE0K63g1QMewt73U6A==} + graphql-http@1.22.4: + resolution: {integrity: sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==} engines: {node: '>=12'} peerDependencies: graphql: '>=0.11 <=16' @@ -2763,8 +2596,9 @@ packages: resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} 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-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -2795,15 +2629,8 @@ packages: 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==} + http-status@2.1.0: + resolution: {integrity: sha512-O5kPr7AW7wYd/BBiOezTwnVAnmSNFY+J7hlZD2X5IOxVBetjcHAiTXhzj0gMrnojQlwy+UT1/Y3H3vJ3UlmvLA==} engines: {node: '>= 0.4.0'} ieee754@1.2.1: @@ -2813,16 +2640,16 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + image-size@1.2.0: + resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} 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==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -2843,8 +2670,8 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - intl-messageformat@10.7.10: - resolution: {integrity: sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==} + intl-messageformat@10.7.15: + resolution: {integrity: sha512-LRyExsEsefQSBjU2p47oAheoKz+EOJxSLDdjOaEjdriajfHsMXOmV/EhMvYSg9bAgCUHasuAC+mcUBe/95PfIg==} is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -2862,8 +2689,8 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} is-bigint@1.1.0: @@ -2874,8 +2701,8 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-buffer@1.1.6: @@ -2888,8 +2715,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.0: - resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -2903,24 +2730,20 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - 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.1.0: - resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} 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==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -2934,10 +2757,6 @@ packages: 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.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -2954,8 +2773,8 @@ packages: 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==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} is-string@1.1.1: @@ -2966,26 +2785,22 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 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==} @@ -3004,15 +2819,15 @@ packages: isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - iterator.prototype@1.1.4: - resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true jose@5.9.6: @@ -3022,18 +2837,9 @@ packages: 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==} @@ -3074,6 +2880,10 @@ packages: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} + jsox@1.2.121: + resolution: {integrity: sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==} + hasBin: true + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -3091,10 +2901,6 @@ packages: 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'} @@ -3106,15 +2912,12 @@ packages: 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.20.0: - resolution: {integrity: sha512-lJEHLFACXqRf3u/VlIOu9T7MJ51O4la92uOBwiS9Sx+juDK3Nrru5Vgl1aUirV1qK8XEM3h6Org2HcrsrzZ3ZA==} + lexical@0.21.0: + resolution: {integrity: sha512-Dxc5SCG4kB+wF+Rh55ism3SuecOKeOtCtGHFGKd6pj2QKVojtjkxGTQPMt7//2z5rMSue4R+hmRM0pCEZflupA==} lib0@0.2.99: resolution: {integrity: sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==} @@ -3177,8 +2980,8 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 - math-intrinsics@1.0.0: - resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} md5@2.3.0: @@ -3209,8 +3012,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-core-commonmark@2.0.2: - resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-mdx-jsx@3.0.1: resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} @@ -3269,30 +3072,22 @@ packages: micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.3: - resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.1: - resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 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'} @@ -3300,10 +3095,6 @@ packages: 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.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3326,15 +3117,15 @@ packages: monaco-editor@0.52.2: resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} - mongodb-connection-string-url@3.0.1: - resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} - mongodb@6.10.0: - resolution: {integrity: sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==} + mongodb@6.12.0: + resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.1.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 gcp-metadata: ^5.2.0 kerberos: ^2.0.1 mongodb-client-encryption: '>=6.0.0 <7' @@ -3364,8 +3155,8 @@ packages: resolution: {integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==} engines: {node: '>=4.0.0'} - mongoose@8.8.3: - resolution: {integrity: sha512-/I4n/DcXqXyIiLRfAmUIiTjj3vXfeISke8dt4U4Y8Wfm074Wa6sXnQrXN49NFOFf2mM1kUdOXryoBvkuCnr+Qw==} + mongoose@8.9.5: + resolution: {integrity: sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==} engines: {node: '>=16.20.1'} mpath@0.9.0: @@ -3387,8 +3178,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -3397,14 +3188,14 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - next-intl@3.26.1: - resolution: {integrity: sha512-TE4cQgXNw4jzEtVPdiYQOCmhAu+Z2qoUppCMxPkJoz8XXe8TdqiNEPhD/GtXEsI80nV6NnVAq3hyTHH5+ex6Hw==} + next-intl@3.26.5: + resolution: {integrity: sha512-EQlCIfY0jOhRldiFxwSXG+ImwkQtDEfQeSOEQp6ieAGSLWGlgjdb/Ck/O7wMfC430ZHGeUKVKax8KGusTPKCgg==} peerDependencies: next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 - next@15.1.0: - resolution: {integrity: sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==} + next@15.2.0: + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3424,8 +3215,8 @@ packages: sass: optional: true - node-abi@3.71.0: - resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} + node-abi@3.74.0: + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} engines: {node: '>=10'} node-addon-api@6.1.0: @@ -3443,18 +3234,13 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - nodemailer@6.9.10: - resolution: {integrity: sha512-qtoKfGFhvIFW5kLfrkw2R6Nm6Ur4LNUMykyqu6n9BRKJuyQrqEGwdXXUAbwWEKt33dlWUGXb7rzmJP/p4+O+CA==} + nodemailer@6.9.16: + resolution: {integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==} 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'} @@ -3471,8 +3257,8 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -3482,8 +3268,8 @@ packages: object-to-formdata@4.5.1: resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} object.entries@1.1.8: @@ -3498,8 +3284,8 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} on-exit-leak-free@2.1.2: @@ -3513,6 +3299,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3535,9 +3325,6 @@ packages: 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'} @@ -3564,24 +3351,15 @@ packages: 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.11.0: - resolution: {integrity: sha512-OdPS95bn5JxurxBZK5HzQiED4T1nR6MZbX8zQSppTHBPL7chsujLl7U9BGMgY1njA26rOoy/mjZc2v4phhWAtw==} + payload@3.25.0: + resolution: {integrity: sha512-azT1qtirV8QqIPpyWaxbF5TJPoWT5fpYoxin83wZxF5gmg0O06bL5YKCGFfCpzgCcw4FrFtLSzD68zGMc5m5Eg==} 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.3.1: - resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} picocolors@1.1.1: @@ -3621,8 +3399,8 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} postcss-import@15.1.0: @@ -3670,12 +3448,12 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} hasBin: true @@ -3683,15 +3461,11 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 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.4.1: resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} peerDependencies: @@ -3704,8 +3478,8 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@4.0.0: - resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -3714,12 +3488,6 @@ packages: 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.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} @@ -3734,9 +3502,6 @@ packages: 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==} @@ -3747,23 +3512,18 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-datepicker@7.5.0: - resolution: {integrity: sha512-6MzeamV8cWSOcduwePHfGqY40acuGlS1cG//ePHT6bVbLxWyqngaStenfH03n1wbzOibFggF66kWaBTb1SbTtQ==} + react-datepicker@7.6.0: + resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==} peerDependencies: - react: ^16.9.0 || ^17 || ^18 - react-dom: ^16.9.0 || ^17 || ^18 + react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-diff-viewer-continued@3.2.6: - resolution: {integrity: sha512-GrzyqQnjIMoej+jMjWvtVSsQqhXgzEGqpXlJ2dAGfOk7Q26qcm8Gu6xtI430PBUyZsERe8BJSQf+7VZZo8IBNQ==} - engines: {node: '>= 8'} + react-diff-viewer-continued@4.0.4: + resolution: {integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==} + engines: {node: '>= 16'} 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: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom@19.0.0: resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} @@ -3805,8 +3565,8 @@ packages: '@types/react': optional: true - react-remove-scroll@2.6.1: - resolution: {integrity: sha512-jWEvWQidZ/C/FnFlUIB1mDLpY3r7uEb22WZ3uVeKj520caKDiaBsNDEB9J1gHJgpiLo+eTdPl2MVi0JitFTiFg==} + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} engines: {node: '>=10'} peerDependencies: '@types/react': '*' @@ -3837,10 +3597,6 @@ packages: 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: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} @@ -3866,15 +3622,15 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - reflect.getprototypeof@1.0.8: - resolution: {integrity: sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} require-directory@2.1.1: @@ -3885,9 +3641,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - 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'} @@ -3895,16 +3648,17 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.9: - resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} 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==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} run-parallel@1.2.0: @@ -3920,6 +3674,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -3936,9 +3694,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} @@ -3948,15 +3703,12 @@ packages: 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==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -3968,6 +3720,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -4025,8 +3781,8 @@ packages: sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - sonner@1.7.1: - resolution: {integrity: sha512-b6LHBfH32SoVasRFECrdY8p8s7hXPDn3OHUFbZZbiB1ctLS9Gdh6rpX2dVrpQA0kiL5jcRzDDldwwLkSKk3+QQ==} + sonner@1.7.4: + resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -4059,8 +3815,8 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.21.1: - resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -4074,8 +3830,8 @@ packages: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: @@ -4125,8 +3881,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} strtok3@8.1.0: resolution: {integrity: sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw==} @@ -4164,16 +3920,16 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwind-merge@2.5.5: - resolution: {integrity: sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==} + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.16: - resolution: {integrity: sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==} + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} hasBin: true @@ -4181,11 +3937,11 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -4210,8 +3966,8 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: @@ -4225,18 +3981,18 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-essentials@10.0.3: resolution: {integrity: sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==} @@ -4270,28 +4026,24 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@3.13.0: - resolution: {integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==} - engines: {node: '>=14.16'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.3: - resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true @@ -4328,8 +4080,8 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4337,12 +4089,12 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-callback-ref@1.3.2: - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -4353,8 +4105,8 @@ packages: react: '>=18.0.0' scheduler: '>=0.19.0' - use-intl@3.26.1: - resolution: {integrity: sha512-MZhtSBcMrDna3xs1T6O7CAXx4wRfm1eGyUYrDCCnW9qTOGZurCH5k/X6ChDl6EI4f+qYEtXQCRMkQUVOIhJWTQ==} + use-intl@3.26.5: + resolution: {integrity: sha512-OdsJnC/znPvHCHLQH/duvQNXnP1w0hPfS+tkSi3mAbfjYBGh4JnyfdwkQBfIVf7t8gs9eSX/CntxUMvtKdG2MQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -4401,9 +4153,9 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - whatwg-url@13.0.0: - resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} - engines: {node: '>=16'} + whatwg-url@14.1.1: + resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} + engines: {node: '>=18'} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -4420,8 +4172,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.16: - resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@2.0.2: @@ -4444,8 +4196,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4473,8 +4225,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} hasBin: true @@ -4486,8 +4238,8 @@ packages: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} - yjs@13.6.20: - resolution: {integrity: sha512-Z2YZI+SYqK7XdWlloI3lhMiKnCdFCVC4PchpdO+mCYwtiTwncjUbnRK9R1JmkNfdmHyDXuWN3ibJAt0wsqTbLQ==} + yjs@13.6.23: + resolution: {integrity: sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} yocto-queue@0.1.0: @@ -4501,7 +4253,7 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@apidevtools/json-schema-ref-parser@11.7.3': + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 @@ -4510,21 +4262,21 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@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.714.0 - '@aws-sdk/util-locate-window': 3.693.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -4533,21 +4285,21 @@ snapshots: '@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.714.0 - '@aws-sdk/util-locate-window': 3.693.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@1.2.2': dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 tslib: 1.14.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -4556,942 +4308,516 @@ snapshots: '@aws-crypto/util@1.2.2': dependencies: - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cognito-identity@3.713.0': + '@aws-sdk/client-cognito-identity@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-node': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/middleware-host-header': 3.713.0 - '@aws-sdk/middleware-logger': 3.713.0 - '@aws-sdk/middleware-recursion-detection': 3.713.0 - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/region-config-resolver': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@aws-sdk/util-user-agent-browser': 3.713.0 - '@aws-sdk/util-user-agent-node': 3.713.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@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.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.717.0': + '@aws-sdk/client-s3@3.758.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.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/client-sts': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/credential-provider-node': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/middleware-bucket-endpoint': 3.714.0 - '@aws-sdk/middleware-expect-continue': 3.714.0 - '@aws-sdk/middleware-flexible-checksums': 3.717.0 - '@aws-sdk/middleware-host-header': 3.714.0 - '@aws-sdk/middleware-location-constraint': 3.714.0 - '@aws-sdk/middleware-logger': 3.714.0 - '@aws-sdk/middleware-recursion-detection': 3.714.0 - '@aws-sdk/middleware-sdk-s3': 3.716.0 - '@aws-sdk/middleware-ssec': 3.714.0 - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/region-config-resolver': 3.714.0 - '@aws-sdk/signature-v4-multi-region': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@aws-sdk/util-user-agent-browser': 3.714.0 - '@aws-sdk/util-user-agent-node': 3.716.0 - '@aws-sdk/xml-builder': 3.709.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/eventstream-serde-browser': 3.0.14 - '@smithy/eventstream-serde-config-resolver': 3.0.11 - '@smithy/eventstream-serde-node': 3.0.13 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-blob-browser': 3.1.10 - '@smithy/hash-node': 3.0.11 - '@smithy/hash-stream-node': 3.1.10 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/md5-js': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@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.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-stream': 3.3.2 - '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.2.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/middleware-bucket-endpoint': 3.734.0 + '@aws-sdk/middleware-expect-continue': 3.734.0 + '@aws-sdk/middleware-flexible-checksums': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-location-constraint': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-sdk-s3': 3.758.0 + '@aws-sdk/middleware-ssec': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/signature-v4-multi-region': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@aws-sdk/xml-builder': 3.734.0 + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/eventstream-serde-browser': 4.0.1 + '@smithy/eventstream-serde-config-resolver': 4.0.1 + '@smithy/eventstream-serde-node': 4.0.1 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-blob-browser': 4.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/hash-stream-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/md5-js': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-stream': 4.1.2 + '@smithy/util-utf8': 4.0.0 + '@smithy/util-waiter': 4.0.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0)': + '@aws-sdk/client-sso@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-node': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/middleware-host-header': 3.713.0 - '@aws-sdk/middleware-logger': 3.713.0 - '@aws-sdk/middleware-recursion-detection': 3.713.0 - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/region-config-resolver': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@aws-sdk/util-user-agent-browser': 3.713.0 - '@aws-sdk/util-user-agent-node': 3.713.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@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.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)': + '@aws-sdk/core@3.758.0': dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/credential-provider-node': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/middleware-host-header': 3.714.0 - '@aws-sdk/middleware-logger': 3.714.0 - '@aws-sdk/middleware-recursion-detection': 3.714.0 - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/region-config-resolver': 3.714.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@aws-sdk/util-user-agent-browser': 3.714.0 - '@aws-sdk/util-user-agent-node': 3.716.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@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.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.713.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/middleware-host-header': 3.713.0 - '@aws-sdk/middleware-logger': 3.713.0 - '@aws-sdk/middleware-recursion-detection': 3.713.0 - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/region-config-resolver': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@aws-sdk/util-user-agent-browser': 3.713.0 - '@aws-sdk/util-user-agent-node': 3.713.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@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.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.716.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/middleware-host-header': 3.714.0 - '@aws-sdk/middleware-logger': 3.714.0 - '@aws-sdk/middleware-recursion-detection': 3.714.0 - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/region-config-resolver': 3.714.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@aws-sdk/util-user-agent-browser': 3.714.0 - '@aws-sdk/util-user-agent-node': 3.716.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@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.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.713.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-node': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/middleware-host-header': 3.713.0 - '@aws-sdk/middleware-logger': 3.713.0 - '@aws-sdk/middleware-recursion-detection': 3.713.0 - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/region-config-resolver': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@aws-sdk/util-user-agent-browser': 3.713.0 - '@aws-sdk/util-user-agent-node': 3.713.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@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.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.716.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/core': 3.716.0 - '@aws-sdk/credential-provider-node': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/middleware-host-header': 3.714.0 - '@aws-sdk/middleware-logger': 3.714.0 - '@aws-sdk/middleware-recursion-detection': 3.714.0 - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/region-config-resolver': 3.714.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@aws-sdk/util-user-agent-browser': 3.714.0 - '@aws-sdk/util-user-agent-node': 3.716.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@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.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/core@3.713.0': - dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/core': 2.5.5 - '@smithy/node-config-provider': 3.1.12 - '@smithy/property-provider': 3.1.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/signature-v4': 4.2.4 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-middleware': 3.0.11 + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.5 + '@smithy/node-config-provider': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/signature-v4': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/util-middleware': 4.0.1 fast-xml-parser: 4.4.1 tslib: 2.8.1 - '@aws-sdk/core@3.716.0': + '@aws-sdk/credential-provider-cognito-identity@3.758.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/core': 2.5.5 - '@smithy/node-config-provider': 3.1.12 - '@smithy/property-provider': 3.1.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/signature-v4': 4.2.4 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-middleware': 3.0.11 - fast-xml-parser: 4.4.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-cognito-identity@3.713.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-env@3.713.0': + '@aws-sdk/credential-provider-env@3.758.0': dependencies: - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.716.0': + '@aws-sdk/credential-provider-http@3.758.0': dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/property-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/util-stream': 4.1.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.713.0': + '@aws-sdk/credential-provider-ini@3.758.0': dependencies: - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/node-http-handler': 3.3.2 - '@smithy/property-provider': 3.1.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-stream': 3.3.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.716.0': - dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/node-http-handler': 3.3.2 - '@smithy/property-provider': 3.1.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-stream': 3.3.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0)': - dependencies: - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/credential-provider-imds': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0)': + '@aws-sdk/credential-provider-node@3.758.0': dependencies: - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-ini': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/credential-provider-imds': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0)': + '@aws-sdk/credential-provider-process@3.758.0': dependencies: - '@aws-sdk/client-sts': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/credential-provider-env': 3.716.0 - '@aws-sdk/credential-provider-http': 3.716.0 - '@aws-sdk/credential-provider-process': 3.716.0 - '@aws-sdk/credential-provider-sso': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/types': 3.714.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.758.0': + dependencies: + '@aws-sdk/client-sso': 3.758.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/token-providers': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0)': + '@aws-sdk/credential-provider-web-identity@3.758.0': dependencies: - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-ini': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0)': + '@aws-sdk/credential-providers@3.758.0': dependencies: - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-ini': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-cognito-identity': 3.758.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-ini': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.5 + '@smithy/credential-provider-imds': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0)': + '@aws-sdk/lib-storage@3.758.0(@aws-sdk/client-s3@3.758.0)': dependencies: - '@aws-sdk/credential-provider-env': 3.716.0 - '@aws-sdk/credential-provider-http': 3.716.0 - '@aws-sdk/credential-provider-ini': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/credential-provider-process': 3.716.0 - '@aws-sdk/credential-provider-sso': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/types': 3.714.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-process@3.713.0': - dependencies: - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-process@3.716.0': - dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-sso@3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))': - dependencies: - '@aws-sdk/client-sso': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/token-providers': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0)) - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-sso@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-sso': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/token-providers': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-sso@3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-sso': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/token-providers': 3.714.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-web-identity@3.713.0(@aws-sdk/client-sts@3.713.0)': - dependencies: - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-web-identity@3.716.0(@aws-sdk/client-sts@3.716.0)': - dependencies: - '@aws-sdk/client-sts': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-cognito-identity': 3.713.0 - '@aws-sdk/client-sso': 3.713.0 - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-cognito-identity': 3.713.0 - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-ini': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/credential-provider-node': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/lib-storage@3.717.0(@aws-sdk/client-s3@3.717.0)': - dependencies: - '@aws-sdk/client-s3': 3.717.0 - '@smithy/abort-controller': 3.1.9 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/smithy-client': 3.5.1 + '@aws-sdk/client-s3': 3.758.0 + '@smithy/abort-controller': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/smithy-client': 4.1.6 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.714.0': + '@aws-sdk/middleware-bucket-endpoint@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-arn-parser': 3.693.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-arn-parser': 3.723.0 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-config-provider': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.714.0': + '@aws-sdk/middleware-expect-continue@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.717.0': + '@aws-sdk/middleware-flexible-checksums@3.758.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/is-array-buffer': 3.0.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-stream': 3.3.2 - '@smithy/util-utf8': 3.0.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-stream': 4.1.2 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.713.0': + '@aws-sdk/middleware-host-header@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.714.0': + '@aws-sdk/middleware-location-constraint@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.714.0': + '@aws-sdk/middleware-logger@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.713.0': + '@aws-sdk/middleware-recursion-detection@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.714.0': + '@aws-sdk/middleware-sdk-s3@3.758.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-arn-parser': 3.723.0 + '@smithy/core': 3.1.5 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/signature-v4': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-stream': 4.1.2 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.713.0': + '@aws-sdk/middleware-ssec@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.714.0': + '@aws-sdk/middleware-user-agent@3.758.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@smithy/core': 3.1.5 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.716.0': + '@aws-sdk/nested-clients@3.758.0': dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-arn-parser': 3.693.0 - '@smithy/core': 2.5.5 - '@smithy/node-config-provider': 3.1.12 - '@smithy/protocol-http': 4.1.8 - '@smithy/signature-v4': 4.2.4 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-stream': 3.3.2 - '@smithy/util-utf8': 3.0.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@aws-sdk/middleware-ssec@3.714.0': + '@aws-sdk/region-config-resolver@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/node-config-provider': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.713.0': + '@aws-sdk/signature-v4-multi-region@3.758.0': dependencies: - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@smithy/core': 2.5.5 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/middleware-sdk-s3': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/signature-v4': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.716.0': + '@aws-sdk/token-providers@3.758.0': dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@smithy/core': 2.5.5 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@aws-sdk/region-config-resolver@3.713.0': + '@aws-sdk/types@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.11 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.714.0': - dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.11 - tslib: 2.8.1 - - '@aws-sdk/signature-v4-multi-region@3.716.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/signature-v4': 4.2.4 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.714.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/types@3.713.0': - dependencies: - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/types@3.714.0': - dependencies: - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/util-arn-parser@3.693.0': + '@aws-sdk/util-arn-parser@3.723.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.713.0': + '@aws-sdk/util-endpoints@3.743.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/types': 3.7.2 - '@smithy/util-endpoints': 2.1.7 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 + '@smithy/util-endpoints': 3.0.1 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.714.0': - dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 - '@smithy/util-endpoints': 2.1.7 - tslib: 2.8.1 - - '@aws-sdk/util-locate-window@3.693.0': + '@aws-sdk/util-locate-window@3.723.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.713.0': + '@aws-sdk/util-user-agent-browser@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.714.0': + '@aws-sdk/util-user-agent-node@3.758.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 - bowser: 2.11.0 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.713.0': - dependencies: - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.716.0': - dependencies: - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/node-config-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.709.0': + '@aws-sdk/xml-builder@3.734.0': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 '@babel/code-frame@7.26.2': @@ -5500,18 +4826,18 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.26.3': + '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -5519,37 +4845,39 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.3': + '@babel/parser@7.26.9': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.9 - '@babel/runtime@7.26.0': + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.9': + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 - '@babel/traverse@7.26.4': + '@babel/traverse@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.3': + '@babel/types@7.26.9': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@date-fns/tz@1.2.0': {} + '@dnd-kit/accessibility@3.1.1(react@19.0.0)': dependencies: react: 19.0.0 @@ -5583,7 +4911,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -5620,7 +4948,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@19.0.1)(react@19.0.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -5726,45 +5054,46 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.6))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@1.21.7))': dependencies: - eslint: 9.17.0(jiti@1.21.6) + eslint: 9.21.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.19.2': dependencies: - '@eslint/object-schema': 2.1.5 + '@eslint/object-schema': 2.1.6 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.9.1': + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.17.0': {} + '@eslint/js@9.21.0': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.4': + '@eslint/plugin-kit@0.2.7': dependencies: + '@eslint/core': 0.12.0 levn: 0.4.1 '@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': @@ -5775,64 +5104,68 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/window-info@3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/core@1.6.8': + '@floating-ui/core@1.6.9': dependencies: - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.6.12': + '@floating-ui/dom@1.6.13': dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@floating-ui/dom': 1.6.12 + '@floating-ui/dom': 1.6.13 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react@0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.9 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) tabbable: 6.2.0 - '@floating-ui/utils@0.2.8': {} + '@floating-ui/utils@0.2.9': {} - '@formatjs/ecma402-abstract@2.3.1': + '@formatjs/ecma402-abstract@2.3.3': dependencies: - '@formatjs/fast-memoize': 2.2.5 - '@formatjs/intl-localematcher': 0.5.9 - decimal.js: 10.4.3 + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/intl-localematcher': 0.6.0 + decimal.js: 10.5.0 tslib: 2.8.1 - '@formatjs/fast-memoize@2.2.5': + '@formatjs/fast-memoize@2.2.6': dependencies: tslib: 2.8.1 - '@formatjs/icu-messageformat-parser@2.9.7': + '@formatjs/icu-messageformat-parser@2.11.1': dependencies: - '@formatjs/ecma402-abstract': 2.3.1 - '@formatjs/icu-skeleton-parser': 1.8.11 + '@formatjs/ecma402-abstract': 2.3.3 + '@formatjs/icu-skeleton-parser': 1.8.13 tslib: 2.8.1 - '@formatjs/icu-skeleton-parser@1.8.11': + '@formatjs/icu-skeleton-parser@1.8.13': dependencies: - '@formatjs/ecma402-abstract': 2.3.1 + '@formatjs/ecma402-abstract': 2.3.3 tslib: 2.8.1 - '@formatjs/intl-localematcher@0.5.9': + '@formatjs/intl-localematcher@0.5.10': + dependencies: + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.6.0': dependencies: tslib: 2.8.1 @@ -5847,7 +5180,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -5952,203 +5285,200 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@lexical/clipboard@0.20.0': + '@lexical/clipboard@0.21.0': dependencies: - '@lexical/html': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/html': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/code@0.20.0': + '@lexical/code@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 prismjs: 1.29.0 - '@lexical/devtools-core@0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@lexical/devtools-core@0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@lexical/html': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/html': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@lexical/dragon@0.20.0': + '@lexical/dragon@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/hashtag@0.20.0': + '@lexical/hashtag@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/headless@0.20.0': + '@lexical/headless@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/history@0.20.0': + '@lexical/history@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/html@0.20.0': + '@lexical/html@0.21.0': dependencies: - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/link@0.20.0': + '@lexical/link@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/list@0.20.0': + '@lexical/list@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/mark@0.20.0': + '@lexical/mark@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/markdown@0.20.0': + '@lexical/markdown@0.21.0': dependencies: - '@lexical/code': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/text': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/code': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/rich-text': 0.21.0 + '@lexical/text': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/offset@0.20.0': + '@lexical/offset@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/overflow@0.20.0': + '@lexical/overflow@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/plain-text@0.20.0': + '@lexical/plain-text@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/react@0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.20)': + '@lexical/react@0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.23)': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/code': 0.20.0 - '@lexical/devtools-core': 0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/dragon': 0.20.0 - '@lexical/hashtag': 0.20.0 - '@lexical/history': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/markdown': 0.20.0 - '@lexical/overflow': 0.20.0 - '@lexical/plain-text': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/text': 0.20.0 - '@lexical/utils': 0.20.0 - '@lexical/yjs': 0.20.0(yjs@13.6.20) - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/code': 0.21.0 + '@lexical/devtools-core': 0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@lexical/dragon': 0.21.0 + '@lexical/hashtag': 0.21.0 + '@lexical/history': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/markdown': 0.21.0 + '@lexical/overflow': 0.21.0 + '@lexical/plain-text': 0.21.0 + '@lexical/rich-text': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/text': 0.21.0 + '@lexical/utils': 0.21.0 + '@lexical/yjs': 0.21.0(yjs@13.6.23) + lexical: 0.21.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 3.1.4(react@19.0.0) transitivePeerDependencies: - yjs - '@lexical/rich-text@0.20.0': + '@lexical/rich-text@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/selection@0.20.0': + '@lexical/selection@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/table@0.20.0': + '@lexical/table@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/text@0.20.0': + '@lexical/text@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/utils@0.20.0': + '@lexical/utils@0.21.0': dependencies: - '@lexical/list': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - lexical: 0.20.0 + '@lexical/list': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + lexical: 0.21.0 - '@lexical/yjs@0.20.0(yjs@13.6.20)': + '@lexical/yjs@0.21.0(yjs@13.6.23)': dependencies: - '@lexical/offset': 0.20.0 - '@lexical/selection': 0.20.0 - lexical: 0.20.0 - yjs: 13.6.20 + '@lexical/offset': 0.21.0 + '@lexical/selection': 0.21.0 + lexical: 0.21.0 + yjs: 13.6.23 - '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)': + '@monaco-editor/loader@1.5.0': dependencies: - monaco-editor: 0.52.2 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) + '@monaco-editor/loader': 1.5.0 monaco-editor: 0.52.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mongodb-js/saslprep@1.1.9': + '@mongodb-js/saslprep@1.2.0': dependencies: sparse-bitfield: 3.0.3 - '@next/env@15.1.0': {} - - '@next/env@15.1.2': {} + '@next/env@15.2.0': {} '@next/eslint-plugin-next@15.1.0': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.0': + '@next/swc-darwin-arm64@15.2.0': optional: true - '@next/swc-darwin-x64@15.1.0': + '@next/swc-darwin-x64@15.2.0': optional: true - '@next/swc-linux-arm64-gnu@15.1.0': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true - '@next/swc-linux-arm64-musl@15.1.0': + '@next/swc-linux-arm64-musl@15.2.0': optional: true - '@next/swc-linux-x64-gnu@15.1.0': + '@next/swc-linux-x64-gnu@15.2.0': optional: true - '@next/swc-linux-x64-musl@15.1.0': + '@next/swc-linux-x64-musl@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@15.1.0': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true - '@next/swc-win32-x64-msvc@15.1.0': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@nodelib/fs.scandir@2.1.5': @@ -6161,19 +5491,16 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@nolyfill/is-core-module@1.0.39': {} - '@one-ini/wasm@0.1.1': {} - - '@payloadcms/db-mongodb@3.11.0(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/db-mongodb@3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - http-status: 1.6.2 - mongoose: 8.8.3(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))) + mongoose: 8.9.5(@aws-sdk/credential-providers@3.758.0) mongoose-aggregate-paginate-v2: 1.1.2 mongoose-paginate-v2: 1.8.5 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) prompts: 2.4.2 uuid: 10.0.0 transitivePeerDependencies: @@ -6186,49 +5513,49 @@ snapshots: - socks - supports-color - '@payloadcms/email-nodemailer@3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/email-nodemailer@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - nodemailer: 6.9.10 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + nodemailer: 6.9.16 + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/graphql@3.11.0(graphql@16.10.0)(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(typescript@5.7.2)': + '@payloadcms/graphql@3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3)': dependencies: graphql: 16.10.0 graphql-scalars: 1.22.2(graphql@16.10.0) - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) pluralize: 8.0.0 - ts-essentials: 10.0.3(typescript@5.7.2) + ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 transitivePeerDependencies: - typescript - '@payloadcms/live-preview-react@3.11.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@payloadcms/live-preview-react@3.25.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@payloadcms/live-preview': 3.11.0 + '@payloadcms/live-preview': 3.25.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@payloadcms/live-preview@3.11.0': {} + '@payloadcms/live-preview@3.25.0': {} - '@payloadcms/next@3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/graphql': 3.11.0(graphql@16.10.0)(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(typescript@5.7.2) - '@payloadcms/translations': 3.11.0 - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@payloadcms/graphql': 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) busboy: 1.6.0 + dequal: 2.0.3 file-type: 19.3.0 graphql: 16.10.0 - graphql-http: 1.22.3(graphql@16.10.0) + graphql-http: 1.22.4(graphql@16.10.0) graphql-playground-html: 1.6.30 - http-status: 1.6.2 - next: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + http-status: 2.1.0 + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) path-to-regexp: 6.3.0 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) qs-esm: 7.0.2 - react-diff-viewer-continued: 3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-diff-viewer-continued: 4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: 1.77.4 - sonner: 1.7.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -6238,28 +5565,25 @@ snapshots: - supports-color - typescript - '@payloadcms/payload-cloud@3.11.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/payload-cloud@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - '@aws-sdk/client-cognito-identity': 3.713.0 - '@aws-sdk/client-s3': 3.717.0 - '@aws-sdk/credential-providers': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/lib-storage': 3.717.0(@aws-sdk/client-s3@3.717.0) - '@payloadcms/email-nodemailer': 3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/client-s3': 3.758.0 + '@aws-sdk/credential-providers': 3.758.0 + '@aws-sdk/lib-storage': 3.758.0(@aws-sdk/client-s3@3.758.0) + '@payloadcms/email-nodemailer': 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) amazon-cognito-identity-js: 6.3.12 - nodemailer: 6.9.10 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - resend: 0.17.2 + nodemailer: 6.9.16 + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - - debug - encoding - '@payloadcms/plugin-form-builder@3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/plugin-form-builder@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) escape-html: 1.0.3 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -6269,19 +5593,19 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-nested-docs@3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/plugin-nested-docs@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/plugin-redirects@3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/plugin-redirects@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/plugin-search@3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/plugin-search@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/next': 3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@payloadcms/next': 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -6292,11 +5616,11 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-seo@3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/plugin-seo@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/translations': 3.11.0 - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -6306,37 +5630,38 @@ snapshots: - supports-color - typescript - '@payloadcms/richtext-lexical@3.11.0(7ul3c6beuv3aho36y23w6b4pou)': + '@payloadcms/richtext-lexical@3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23)': dependencies: '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/headless': 0.20.0 - '@lexical/html': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/react': 0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.20) - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - '@payloadcms/next': 3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - '@payloadcms/translations': 3.11.0 - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@lexical/headless': 0.21.0 + '@lexical/html': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/react': 0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.23) + '@lexical/rich-text': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/utils': 0.21.0 + '@payloadcms/next': 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@types/uuid': 10.0.0 acorn: 8.12.1 bson-objectid: 2.0.4 dequal: 2.0.3 escape-html: 1.0.3 - lexical: 0.20.0 + jsox: 1.2.121 + lexical: 0.21.0 mdast-util-from-markdown: 2.0.2 mdast-util-mdx-jsx: 3.1.3 micromark-extension-mdx-jsx: 3.0.1 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 4.1.2(react@19.0.0) - ts-essentials: 10.0.3(typescript@5.7.2) + ts-essentials: 10.0.3(typescript@5.7.3) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -6344,37 +5669,38 @@ snapshots: - next - supports-color - typescript + - yjs - '@payloadcms/translations@3.11.0': + '@payloadcms/translations@3.25.0': dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/ui@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: + '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/translations': 3.11.0 - body-scroll-lock: 4.0.0-beta.0 + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/window-info': 3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@monaco-editor/react': 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@payloadcms/translations': 3.25.0 bson-objectid: 2.0.4 date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 - next: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) object-to-formdata: 4.5.1 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) qs-esm: 7.0.2 react: 19.0.0 - react-datepicker: 7.5.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-datepicker: 7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-dom: 19.0.0(react@19.0.0) react-image-crop: 10.1.8(react@19.0.0) react-select: 5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) scheduler: 0.25.0 - sonner: 1.7.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - ts-essentials: 10.0.3(typescript@5.7.2) + sonner: 1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + ts-essentials: 10.0.3(typescript@5.7.3) use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.25.0) uuid: 10.0.0 transitivePeerDependencies: @@ -6390,22 +5716,22 @@ snapshots: '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-checkbox@1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-checkbox@1.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.1)(react@19.0.0) @@ -6415,12 +5741,12 @@ snapshots: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-collection@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: @@ -6445,11 +5771,11 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 @@ -6464,10 +5790,10 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -6482,22 +5808,22 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-label@2.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-label@2.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-popper@1.2.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-arrow': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.1)(react@19.0.0) @@ -6509,9 +5835,9 @@ snapshots: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-portal@1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -6529,45 +5855,45 @@ snapshots: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-select@2.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-select@2.1.6(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-direction': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-id': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) aria-hidden: 1.2.4 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.1(@types/react@19.0.1)(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.1)(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-slot@1.1.1(@types/react@19.0.1)(react@19.0.0)': + '@radix-ui/react-slot@1.1.2(@types/react@19.0.1)(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 @@ -6620,9 +5946,9 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: @@ -6631,266 +5957,254 @@ snapshots: '@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) - '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.10.4': {} + '@rushstack/eslint-patch@1.10.5': {} - '@selderee/plugin-htmlparser2@0.10.0': + '@smithy/abort-controller@4.0.1': dependencies: - domhandler: 5.0.3 - selderee: 0.10.0 - - '@smithy/abort-controller@3.1.9': - dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@3.0.1': + '@smithy/chunked-blob-reader-native@4.0.0': dependencies: - '@smithy/util-base64': 3.0.0 + '@smithy/util-base64': 4.0.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader@4.0.0': + '@smithy/chunked-blob-reader@5.0.0': dependencies: tslib: 2.8.1 - '@smithy/config-resolver@3.0.13': + '@smithy/config-resolver@4.0.1': dependencies: - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.11 + '@smithy/node-config-provider': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/core@2.5.5': + '@smithy/core@3.1.5': dependencies: - '@smithy/middleware-serde': 3.0.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-stream': 3.3.2 - '@smithy/util-utf8': 3.0.0 + '@smithy/middleware-serde': 4.0.2 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-stream': 4.1.2 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@3.2.8': + '@smithy/credential-provider-imds@4.0.1': dependencies: - '@smithy/node-config-provider': 3.1.12 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 + '@smithy/node-config-provider': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 tslib: 2.8.1 - '@smithy/eventstream-codec@3.1.10': + '@smithy/eventstream-codec@4.0.1': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 3.7.2 - '@smithy/util-hex-encoding': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-hex-encoding': 4.0.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@3.0.14': + '@smithy/eventstream-serde-browser@4.0.1': dependencies: - '@smithy/eventstream-serde-universal': 3.0.13 - '@smithy/types': 3.7.2 + '@smithy/eventstream-serde-universal': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@3.0.11': + '@smithy/eventstream-serde-config-resolver@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@3.0.13': + '@smithy/eventstream-serde-node@4.0.1': dependencies: - '@smithy/eventstream-serde-universal': 3.0.13 - '@smithy/types': 3.7.2 + '@smithy/eventstream-serde-universal': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@3.0.13': + '@smithy/eventstream-serde-universal@4.0.1': dependencies: - '@smithy/eventstream-codec': 3.1.10 - '@smithy/types': 3.7.2 + '@smithy/eventstream-codec': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@4.1.2': + '@smithy/fetch-http-handler@5.0.1': dependencies: - '@smithy/protocol-http': 4.1.8 - '@smithy/querystring-builder': 3.0.11 - '@smithy/types': 3.7.2 - '@smithy/util-base64': 3.0.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/querystring-builder': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-base64': 4.0.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@3.1.10': + '@smithy/hash-blob-browser@4.0.1': dependencies: - '@smithy/chunked-blob-reader': 4.0.0 - '@smithy/chunked-blob-reader-native': 3.0.1 - '@smithy/types': 3.7.2 + '@smithy/chunked-blob-reader': 5.0.0 + '@smithy/chunked-blob-reader-native': 4.0.0 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/hash-node@3.0.11': + '@smithy/hash-node@4.0.1': dependencies: - '@smithy/types': 3.7.2 - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/hash-stream-node@3.1.10': + '@smithy/hash-stream-node@4.0.1': dependencies: - '@smithy/types': 3.7.2 - '@smithy/util-utf8': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/invalid-dependency@3.0.11': + '@smithy/invalid-dependency@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@3.0.0': + '@smithy/is-array-buffer@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/md5-js@3.0.11': + '@smithy/md5-js@4.0.1': dependencies: - '@smithy/types': 3.7.2 - '@smithy/util-utf8': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/middleware-content-length@3.0.13': + '@smithy/middleware-content-length@4.0.1': dependencies: - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@3.2.6': + '@smithy/middleware-endpoint@4.0.6': dependencies: - '@smithy/core': 2.5.5 - '@smithy/middleware-serde': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-middleware': 3.0.11 + '@smithy/core': 3.1.5 + '@smithy/middleware-serde': 4.0.2 + '@smithy/node-config-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/middleware-retry@3.0.31': + '@smithy/middleware-retry@4.0.7': dependencies: - '@smithy/node-config-provider': 3.1.12 - '@smithy/protocol-http': 4.1.8 - '@smithy/service-error-classification': 3.0.11 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/service-error-classification': 4.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@3.0.11': + '@smithy/middleware-serde@4.0.2': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-stack@3.0.11': + '@smithy/middleware-stack@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/node-config-provider@3.1.12': + '@smithy/node-config-provider@4.0.1': dependencies: - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/node-http-handler@3.3.2': + '@smithy/node-http-handler@4.0.3': dependencies: - '@smithy/abort-controller': 3.1.9 - '@smithy/protocol-http': 4.1.8 - '@smithy/querystring-builder': 3.0.11 - '@smithy/types': 3.7.2 + '@smithy/abort-controller': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/querystring-builder': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/property-provider@3.1.11': + '@smithy/property-provider@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/protocol-http@4.1.8': + '@smithy/protocol-http@5.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/querystring-builder@3.0.11': + '@smithy/querystring-builder@4.0.1': dependencies: - '@smithy/types': 3.7.2 - '@smithy/util-uri-escape': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-uri-escape': 4.0.0 tslib: 2.8.1 - '@smithy/querystring-parser@3.0.11': + '@smithy/querystring-parser@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/service-error-classification@3.0.11': + '@smithy/service-error-classification@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 - '@smithy/shared-ini-file-loader@3.1.12': + '@smithy/shared-ini-file-loader@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/signature-v4@4.2.4': + '@smithy/signature-v4@5.0.1': dependencies: - '@smithy/is-array-buffer': 3.0.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-uri-escape': 3.0.0 - '@smithy/util-utf8': 3.0.0 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-uri-escape': 4.0.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@3.5.1': + '@smithy/smithy-client@4.1.6': dependencies: - '@smithy/core': 2.5.5 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-stack': 3.0.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-stream': 3.3.2 + '@smithy/core': 3.1.5 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-stack': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-stream': 4.1.2 tslib: 2.8.1 - '@smithy/types@3.7.2': + '@smithy/types@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@3.0.11': + '@smithy/url-parser@4.0.1': dependencies: - '@smithy/querystring-parser': 3.0.11 - '@smithy/types': 3.7.2 + '@smithy/querystring-parser': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-base64@3.0.0': + '@smithy/util-base64@4.0.0': dependencies: - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@3.0.0': + '@smithy/util-body-length-browser@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@3.0.0': + '@smithy/util-body-length-node@4.0.0': dependencies: tslib: 2.8.1 @@ -6899,66 +6213,66 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@3.0.0': + '@smithy/util-buffer-from@4.0.0': dependencies: - '@smithy/is-array-buffer': 3.0.0 + '@smithy/is-array-buffer': 4.0.0 tslib: 2.8.1 - '@smithy/util-config-provider@3.0.0': + '@smithy/util-config-provider@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@3.0.31': + '@smithy/util-defaults-mode-browser@4.0.7': dependencies: - '@smithy/property-provider': 3.1.11 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 + '@smithy/property-provider': 4.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@3.0.31': + '@smithy/util-defaults-mode-node@4.0.7': dependencies: - '@smithy/config-resolver': 3.0.13 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/node-config-provider': 3.1.12 - '@smithy/property-provider': 3.1.11 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 + '@smithy/config-resolver': 4.0.1 + '@smithy/credential-provider-imds': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-endpoints@2.1.7': + '@smithy/util-endpoints@3.0.1': dependencies: - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 + '@smithy/node-config-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@3.0.0': + '@smithy/util-hex-encoding@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@3.0.11': + '@smithy/util-middleware@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-retry@3.0.11': + '@smithy/util-retry@4.0.1': dependencies: - '@smithy/service-error-classification': 3.0.11 - '@smithy/types': 3.7.2 + '@smithy/service-error-classification': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-stream@3.3.2': + '@smithy/util-stream@4.1.2': dependencies: - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/node-http-handler': 3.3.2 - '@smithy/types': 3.7.2 - '@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 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/types': 4.1.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/util-uri-escape@3.0.0': + '@smithy/util-uri-escape@4.0.0': dependencies: tslib: 2.8.1 @@ -6967,15 +6281,15 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@3.0.0': + '@smithy/util-utf8@4.0.0': dependencies: - '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-buffer-from': 4.0.0 tslib: 2.8.1 - '@smithy/util-waiter@3.2.0': + '@smithy/util-waiter@4.0.2': dependencies: - '@smithy/abort-controller': 3.1.9 - '@smithy/types': 3.7.2 + '@smithy/abort-controller': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 '@swc/counter@0.1.3': {} @@ -6984,13 +6298,13 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/typography@0.5.15(tailwindcss@3.4.16)': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)': 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.16 + tailwindcss: 3.4.17 '@tokenizer/token@0.3.0': {} @@ -7004,7 +6318,7 @@ snapshots: '@types/debug@4.1.12': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 2.1.0 '@types/escape-html@1.0.4': {} @@ -7022,17 +6336,18 @@ snapshots: '@types/json5@0.0.29': {} - '@types/jsonwebtoken@9.0.7': + '@types/jsonwebtoken@9.0.9': dependencies: + '@types/ms': 2.1.0 '@types/node': 22.5.4 - '@types/lodash@4.17.13': {} + '@types/lodash@4.17.16': {} '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/ms@0.7.34': {} + '@types/ms@2.1.0': {} '@types/node@22.5.4': dependencies: @@ -7066,85 +6381,83 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/type-utils': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.1 - eslint: 9.17.0(jiti@1.21.6) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - eslint: 9.17.0(jiti@1.21.6) - typescript: 5.7.2 + eslint: 9.21.0(jiti@1.21.7) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.18.1': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.17.0(jiti@1.21.6) - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + eslint: 9.21.0(jiti@1.21.7) + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.18.1': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.18.1(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.6)) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - eslint: 9.17.0(jiti@1.21.6) - typescript: 5.7.2 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.18.1': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 - abbrev@2.0.0: {} - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -7163,7 +6476,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -7204,133 +6517,129 @@ snapshots: aria-query@5.3.2: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-array-buffer: 3.0.5 array-includes@3.1.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.6 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 is-string: 1.1.1 array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} - asynckit@0.4.0: {} + async-function@1.0.0: {} atomic-sleep@1.0.0: {} - autoprefixer@10.4.20(postcss@8.4.49): + autoprefixer@10.4.20(postcss@8.5.3): dependencies: - browserslist: 4.24.3 - caniuse-lite: 1.0.30001689 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001701 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.4.49 + postcss: 8.5.3 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axe-core@4.10.2: {} - axios@1.4.0: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axobject-query@4.1.0: {} b4a@1.6.7: {} babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 cosmiconfig: 7.1.0 - resolve: 1.22.9 + resolve: 1.22.10 balanced-match@1.0.2: {} - bare-events@2.5.0: + bare-events@2.5.4: optional: true - bare-fs@2.3.5: + bare-fs@4.0.1: dependencies: - bare-events: 2.5.0 - bare-path: 2.1.3 - bare-stream: 2.6.1 + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + transitivePeerDependencies: + - bare-buffer optional: true - bare-os@2.4.4: + bare-os@3.5.1: optional: true - bare-path@2.1.3: + bare-path@3.0.0: dependencies: - bare-os: 2.4.4 + bare-os: 3.5.1 optional: true - bare-stream@2.6.1: + bare-stream@2.6.5(bare-events@2.5.4): dependencies: - streamx: 2.21.1 + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 optional: true base64-js@1.5.1: {} @@ -7360,16 +6669,16 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.3: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001689 - electron-to-chromium: 1.5.74 + caniuse-lite: 1.0.30001701 + electron-to-chromium: 1.5.109 node-releases: 2.0.19 - update-browserslist-db: 1.1.1(browserslist@4.24.3) + update-browserslist-db: 1.1.3(browserslist@4.24.4) bson-objectid@2.0.4: {} - bson@6.10.1: {} + bson@6.10.3: {} buffer-equal-constant-time@1.0.1: {} @@ -7393,28 +6702,28 @@ snapshots: dependencies: streamsearch: 1.1.0 - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.6 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001689: {} + caniuse-lite@1.0.30001701: {} ccount@2.0.1: {} @@ -7483,29 +6792,12 @@ snapshots: 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: {} 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.12.1: dependencies: simple-wcswidth: 1.0.1 @@ -7527,7 +6819,7 @@ snapshots: cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -7554,21 +6846,21 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -7588,7 +6880,7 @@ snapshots: dependencies: ms: 2.1.3 - decimal.js@10.4.3: {} + decimal.js@10.5.0: {} decode-named-character-reference@1.0.2: dependencies: @@ -7616,8 +6908,6 @@ snapshots: 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: {} @@ -7640,30 +6930,12 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 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 - dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -7673,14 +6945,7 @@ snapshots: 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.74: {} + electron-to-chromium@1.5.109: {} emoji-regex@8.0.0: {} @@ -7690,35 +6955,34 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.17.1: + enhanced-resolve@5.18.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.6: + es-abstract@1.23.9: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 - function.prototype.name: 1.1.7 - get-intrinsic: 1.2.6 - get-symbol-description: 1.0.2 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -7729,62 +6993,66 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 - is-negative-zero: 2.0.3 is-regex: 1.2.1 - is-shared-array-buffer: 1.0.3 + is-shared-array-buffer: 1.0.4 is-string: 1.1.1 - is-typed-array: 1.1.13 - is-weakref: 1.1.0 - math-intrinsics: 1.0.0 - object-inspect: 1.13.3 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 + set-proto: 1.0.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 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.3 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.0: + es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 - iterator.prototype: 1.1.4 + iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.6 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -7827,21 +7095,21 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.1.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2): + eslint-config-next@15.1.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3): dependencies: '@next/eslint-plugin-next': 15.1.0 - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - eslint: 9.17.0(jiti@1.21.6) + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@1.21.6)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.17.0(jiti@1.21.6)) - eslint-plugin-react: 7.37.2(eslint@9.17.0(jiti@1.21.6)) - eslint-plugin-react-hooks: 5.1.0(eslint@9.17.0(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-react: 7.37.4(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.21.0(jiti@1.21.7)) optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - eslint-import-resolver-webpack - eslint-plugin-import-x @@ -7850,39 +7118,38 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.16.0 - resolve: 1.22.9 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@1.21.6)): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - enhanced-resolve: 5.17.1 - eslint: 9.17.0(jiti@1.21.6) - fast-glob: 3.3.2 - get-tsconfig: 4.8.1 + enhanced-resolve: 5.18.1 + eslint: 9.21.0(jiti@1.21.7) + get-tsconfig: 4.10.0 is-bun-module: 1.3.0 - is-glob: 4.0.3 stable-hash: 0.0.4 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - eslint: 9.17.0(jiti@1.21.6) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -7891,27 +7158,27 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.17.0(jiti@1.21.6) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) hasown: 2.0.2 - is-core-module: 2.16.0 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.17.0(jiti@1.21.6)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -7921,7 +7188,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.17.0(jiti@1.21.6) + eslint: 9.21.0(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -7930,30 +7197,30 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.1.0(eslint@9.17.0(jiti@1.21.6)): + eslint-plugin-react-hooks@5.2.0(eslint@9.21.0(jiti@1.21.7)): dependencies: - eslint: 9.17.0(jiti@1.21.6) + eslint: 9.21.0(jiti@1.21.7) - eslint-plugin-react@7.37.2(eslint@9.17.0(jiti@1.21.6)): + eslint-plugin-react@7.37.4(eslint@9.21.0(jiti@1.21.7)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.0 - eslint: 9.17.0(jiti@1.21.6) + es-iterator-helpers: 1.2.1 + eslint: 9.21.0(jiti@1.21.7) 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 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.11 + string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 eslint-scope@8.2.0: @@ -7965,18 +7232,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.17.0(jiti@1.21.6): + eslint@9.21.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.9.1 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.17.0 - '@eslint/plugin-kit': 0.2.4 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -8002,7 +7269,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.6 + jiti: 1.21.7 transitivePeerDependencies: - supports-color @@ -8035,10 +7302,6 @@ snapshots: expand-template@2.0.3: {} - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - fast-base64-decode@1.0.0: {} fast-copy@3.0.2: {} @@ -8055,7 +7318,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -8071,17 +7334,17 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.3: {} + fast-uri@3.0.6: {} fast-xml-parser@4.4.1: dependencies: - strnum: 1.0.5 + strnum: 1.1.2 - fastq@1.17.1: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 - fdir@6.4.2(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -8108,32 +7371,24 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} focus-trap@7.5.4: dependencies: tabbable: 6.2.0 - follow-redirects@1.15.9: {} - - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.1: - 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: {} @@ -8145,9 +7400,10 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.7: + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -8155,32 +7411,41 @@ snapshots: functions-have-names@1.2.3: {} - geist@1.3.1(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): + geist@1.3.1(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): dependencies: - next: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) get-caller-file@2.0.5: {} - get-intrinsic@1.2.6: + get-intrinsic@1.3.0: dependencies: - call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 + get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 - math-intrinsics: 1.0.0 + math-intrinsics: 1.1.0 get-nonce@1.0.1: {} - get-symbol-description@1.0.2: + get-proto@1.0.1: dependencies: - call-bind: 1.0.8 + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 get-tsconfig@4.8.1: dependencies: @@ -8198,7 +7463,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -8229,7 +7494,7 @@ snapshots: graphemer@1.4.0: {} - graphql-http@1.22.3(graphql@16.10.0): + graphql-http@1.22.4(graphql@16.10.0): dependencies: graphql: 16.10.0 @@ -8244,7 +7509,7 @@ snapshots: graphql@16.10.0: {} - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -8272,34 +7537,19 @@ snapshots: 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: {} + http-status@2.1.0: {} ieee754@1.2.1: {} ignore@5.3.2: {} - image-size@1.1.1: + image-size@1.2.0: dependencies: queue: 6.0.2 immutable@4.3.7: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -8321,11 +7571,11 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - intl-messageformat@10.7.10: + intl-messageformat@10.7.15: dependencies: - '@formatjs/ecma402-abstract': 2.3.1 - '@formatjs/fast-memoize': 2.2.5 - '@formatjs/icu-messageformat-parser': 2.9.7 + '@formatjs/ecma402-abstract': 2.3.3 + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/icu-messageformat-parser': 2.11.1 tslib: 2.8.1 is-alphabetical@2.0.1: {} @@ -8339,25 +7589,29 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-async-function@2.0.0: + is-async-function@2.1.1: dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 @@ -8366,19 +7620,19 @@ snapshots: is-bun-module@1.3.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 is-callable@1.2.7: {} - is-core-module@2.16.0: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.6 - is-typed-array: 1.1.13 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 is-date-object@1.1.0: dependencies: @@ -8387,19 +7641,20 @@ snapshots: is-decimal@2.0.1: {} - is-extendable@0.1.1: {} - is-extglob@2.1.1: {} - is-finalizationregistry@1.1.0: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: @@ -8409,8 +7664,6 @@ snapshots: is-map@2.0.3: {} - is-negative-zero@2.0.3: {} - is-number-object@1.1.1: dependencies: call-bound: 1.0.3 @@ -8427,9 +7680,9 @@ snapshots: is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-string@1.1.1: dependencies: @@ -8442,22 +7695,20 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 is-weakmap@2.0.2: {} - is-weakref@1.1.0: + is-weakref@1.1.1: dependencies: call-bound: 1.0.3 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.2.6 - - is-whitespace@0.3.0: {} + call-bound: 1.0.3 + get-intrinsic: 1.3.0 isarray@0.0.1: {} @@ -8476,13 +7727,13 @@ snapshots: isomorphic.js@0.2.5: {} - iterator.prototype@1.1.4: + iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.6 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 has-symbols: 1.1.0 - reflect.getprototypeof: 1.0.8 set-function-name: 2.0.2 jackspeak@3.4.3: @@ -8491,24 +7742,14 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@1.21.6: {} + jiti@1.21.7: {} jose@5.9.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: @@ -8523,15 +7764,15 @@ snapshots: json-schema-to-typescript@15.0.3: dependencies: - '@apidevtools/json-schema-ref-parser': 11.7.3 + '@apidevtools/json-schema-ref-parser': 11.9.3 '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.16 is-glob: 4.0.3 js-yaml: 4.1.0 lodash: 4.17.21 minimist: 1.2.8 - prettier: 3.4.2 - tinyglobby: 0.2.10 + prettier: 3.5.3 + tinyglobby: 0.2.12 json-schema-traverse@0.4.1: {} @@ -8554,14 +7795,16 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.3 + semver: 7.7.1 + + jsox@1.2.121: {} jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.3 - object.assign: 4.1.5 - object.values: 1.2.0 + object.assign: 4.1.7 + object.values: 1.2.1 jwa@1.4.1: dependencies: @@ -8580,10 +7823,6 @@ snapshots: 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: {} @@ -8592,14 +7831,12 @@ snapshots: 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.20.0: {} + lexical@0.21.0: {} lib0@0.2.99: dependencies: @@ -8645,7 +7882,7 @@ snapshots: dependencies: react: 19.0.0 - math-intrinsics@1.0.0: {} + math-intrinsics@1.1.0: {} md5@2.3.0: dependencies: @@ -8660,12 +7897,12 @@ snapshots: decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -8714,7 +7951,7 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -8729,9 +7966,9 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdx-jsx@3.0.1: dependencies: @@ -8744,21 +7981,21 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-mdx-expression@2.0.2: dependencies: @@ -8768,33 +8005,33 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -8804,12 +8041,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -8832,7 +8069,7 @@ snapshots: devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-util-html-tag-name@2.0.1: {} @@ -8843,7 +8080,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -8851,24 +8088,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.3: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 debug: 4.4.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -8878,9 +8115,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -8889,22 +8126,12 @@ snapshots: 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.5: dependencies: brace-expansion: 2.0.1 @@ -8919,28 +8146,28 @@ snapshots: monaco-editor@0.52.2: {} - mongodb-connection-string-url@3.0.1: + mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 - whatwg-url: 13.0.0 + whatwg-url: 14.1.1 - mongodb@6.10.0(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))): + mongodb@6.12.0(@aws-sdk/credential-providers@3.758.0): dependencies: - '@mongodb-js/saslprep': 1.1.9 - bson: 6.10.1 - mongodb-connection-string-url: 3.0.1 + '@mongodb-js/saslprep': 1.2.0 + bson: 6.10.3 + mongodb-connection-string-url: 3.0.2 optionalDependencies: - '@aws-sdk/credential-providers': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) + '@aws-sdk/credential-providers': 3.758.0 mongoose-aggregate-paginate-v2@1.1.2: {} mongoose-paginate-v2@1.8.5: {} - mongoose@8.8.3(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))): + mongoose@8.9.5(@aws-sdk/credential-providers@3.758.0): dependencies: - bson: 6.10.1 + bson: 6.10.3 kareem: 2.6.3 - mongodb: 6.10.0(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))) + mongodb: 6.12.0(@aws-sdk/credential-providers@3.758.0) mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -8973,49 +8200,49 @@ snapshots: nanoid@3.3.8: {} - napi-build-utils@1.0.2: {} + napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} negotiator@1.0.0: {} - next-intl@3.26.1(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0): + next-intl@3.26.5(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0): dependencies: - '@formatjs/intl-localematcher': 0.5.9 + '@formatjs/intl-localematcher': 0.5.10 negotiator: 1.0.0 - next: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) react: 19.0.0 - use-intl: 3.26.1(react@19.0.0) + use-intl: 3.26.5(react@19.0.0) - next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: - '@next/env': 15.1.0 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001689 + caniuse-lite: 1.0.30001701 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.0 - '@next/swc-darwin-x64': 15.1.0 - '@next/swc-linux-arm64-gnu': 15.1.0 - '@next/swc-linux-arm64-musl': 15.1.0 - '@next/swc-linux-x64-gnu': 15.1.0 - '@next/swc-linux-x64-musl': 15.1.0 - '@next/swc-win32-arm64-msvc': 15.1.0 - '@next/swc-win32-x64-msvc': 15.1.0 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 sass: 1.77.4 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - node-abi@3.71.0: + node-abi@3.74.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 node-addon-api@6.1.0: {} @@ -9025,17 +8252,13 @@ snapshots: node-releases@2.0.19: {} - nodemailer@6.9.10: {} + nodemailer@6.9.16: {} 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: {} @@ -9044,16 +8267,18 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} object-to-formdata@4.5.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 + es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -9061,26 +8286,27 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 - object.values@1.2.0: + object.values@1.2.1: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 on-exit-leak-free@2.1.2: {} @@ -9097,6 +8323,12 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -9128,11 +8360,6 @@ snapshots: 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-is-absolute@1.0.1: {} @@ -9150,19 +8377,14 @@ snapshots: path-type@4.0.0: {} - payload-admin-bar@1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + payload@3.25.0(graphql@16.10.0)(typescript@5.7.3): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2): - dependencies: - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@next/env': 15.1.2 - '@payloadcms/translations': 3.11.0 + '@next/env': 15.2.0 + '@payloadcms/translations': 3.25.0 '@types/busboy': 1.5.4 ajv: 8.17.1 bson-objectid: 2.0.4 + busboy: 1.6.0 ci-info: 4.1.0 console-table-printer: 2.12.1 croner: 9.0.0 @@ -9171,31 +8393,28 @@ snapshots: file-type: 19.3.0 get-tsconfig: 4.8.1 graphql: 16.10.0 - http-status: 1.6.2 - image-size: 1.1.1 + http-status: 2.1.0 + image-size: 1.2.0 jose: 5.9.6 json-schema-to-typescript: 15.0.3 minimist: 1.2.8 + path-to-regexp: 6.3.0 pino: 9.5.0 pino-pretty: 13.0.0 pluralize: 8.0.0 + qs-esm: 7.0.2 sanitize-filename: 1.6.3 scmp: 2.1.0 - ts-essentials: 10.0.3(typescript@5.7.2) + ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 uuid: 10.0.0 - ws: 8.18.0 + ws: 8.18.1 transitivePeerDependencies: - bufferutil - - monaco-editor - - react - - react-dom - typescript - utf-8-validate - peberminta@0.8.0: {} - - peek-readable@5.3.1: {} + peek-readable@5.4.2: {} picocolors@1.1.1: {} @@ -9234,7 +8453,7 @@ snapshots: on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.0 + process-warning: 4.0.1 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 @@ -9245,30 +8464,30 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.4.49): + postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.4.49 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.9 + resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.4.49): + postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.49 + postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.4.49): + postcss-load-config@4.0.2(postcss@8.5.3): dependencies: lilconfig: 3.1.3 - yaml: 2.6.1 + yaml: 2.7.0 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.3 - postcss-nested@6.2.0(postcss@8.4.49): + postcss-nested@6.2.0(postcss@8.5.3): dependencies: - postcss: 8.4.49 + postcss: 8.5.3 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -9289,36 +8508,30 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.4.49: + postcss@8.5.3: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.2: + prebuild-install@7.1.3: 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.71.0 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.1 + tar-fs: 2.1.2 tunnel-agent: 0.6.0 prelude-ls@1.2.1: {} - prettier@3.4.2: {} - - pretty@2.0.0: - dependencies: - condense-newlines: 0.2.1 - extend-shallow: 2.0.1 - js-beautify: 1.15.1 + prettier@3.5.3: {} prism-react-renderer@2.4.1(react@19.0.0): dependencies: @@ -9330,7 +8543,7 @@ snapshots: process-nextick-args@2.0.1: {} - process-warning@4.0.0: {} + process-warning@4.0.1: {} prompts@2.4.2: dependencies: @@ -9343,10 +8556,6 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - proto-list@1.2.4: {} - - proxy-from-env@1.1.0: {} - pump@3.0.2: dependencies: end-of-stream: 1.4.4 @@ -9358,8 +8567,6 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - queue@6.0.2: dependencies: inherits: 2.0.4 @@ -9373,33 +8580,27 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-datepicker@7.5.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-datepicker@7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/react': 0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 date-fns: 3.6.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-diff-viewer-continued@3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-diff-viewer-continued@4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@emotion/css': 11.13.5 + '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) classnames: 2.5.1 diff: 5.2.0 memoize-one: 6.0.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: + - '@types/react' - 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(react@19.0.0): dependencies: react: 19.0.0 @@ -9407,12 +8608,12 @@ snapshots: react-error-boundary@3.1.4(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-error-boundary@4.1.2(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-hook-form@7.45.4(react@19.0.0): @@ -9433,23 +8634,23 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - react-remove-scroll@2.6.1(@types/react@19.0.1)(react@19.0.0): + react-remove-scroll@2.6.3(@types/react@19.0.1)(react@19.0.0): dependencies: react: 19.0.0 react-remove-scroll-bar: 2.3.8(@types/react@19.0.1)(react@19.0.0) react-style-singleton: 2.2.3(@types/react@19.0.1)(react@19.0.0) tslib: 2.8.1 - use-callback-ref: 1.3.2(@types/react@19.0.1)(react@19.0.0) + use-callback-ref: 1.3.3(@types/react@19.0.1)(react@19.0.0) use-sidecar: 1.1.3(@types/react@19.0.1)(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 react-select@5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/cache': 11.14.0 '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) - '@floating-ui/dom': 1.6.12 + '@floating-ui/dom': 1.6.13 '@types/react-transition-group': 4.4.12(@types/react@19.0.1) memoize-one: 6.0.0 prop-types: 15.8.1 @@ -9471,17 +8672,13 @@ snapshots: react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react@18.2.0: - dependencies: - loose-envify: 1.4.0 - react@19.0.0: {} read-cache@1.0.0: @@ -9517,55 +8714,49 @@ snapshots: real-require@0.2.0: {} - reflect.getprototypeof@1.0.8: + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - dunder-proto: 1.0.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - gopd: 1.2.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 which-builtin-type: 1.2.1 regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.3: + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 set-function-name: 2.0.2 require-directory@2.1.1: {} require-from-string@2.0.2: {} - 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.9: + resolve@1.22.10: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} run-parallel@1.2.0: dependencies: @@ -9575,7 +8766,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -9583,6 +8774,11 @@ snapshots: safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + safe-regex-test@1.1.0: dependencies: call-bound: 1.0.3 @@ -9601,30 +8797,22 @@ snapshots: immutable: 4.3.7 source-map-js: 1.2.1 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.25.0: {} scmp@2.1.0: {} secure-json-parse@2.7.0: {} - selderee@0.10.0: - dependencies: - parseley: 0.11.0 - semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.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.6 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -9635,22 +8823,30 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + 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 + prebuild-install: 7.1.3 + semver: 7.7.1 simple-get: 4.0.1 - tar-fs: 3.0.6 + tar-fs: 3.0.8 tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-buffer sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.3 + semver: 7.7.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -9682,27 +8878,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -9731,7 +8927,7 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@1.7.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -9757,13 +8953,12 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.21.1: + streamx@2.22.0: dependencies: fast-fifo: 1.3.2 - queue-tick: 1.0.1 text-decoder: 1.2.3 optionalDependencies: - bare-events: 2.5.0 + bare-events: 2.5.4 string-width@4.2.3: dependencies: @@ -9781,27 +8976,28 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 - string.prototype.matchall@4.0.11: + string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.6 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.3 + regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 string.prototype.trim@1.2.10: dependencies: @@ -9809,8 +9005,8 @@ snapshots: call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: @@ -9818,13 +9014,13 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string_decoder@0.10.31: {} @@ -9855,12 +9051,12 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.0.5: {} + strnum@1.1.2: {} strtok3@8.1.0: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.3.1 + peek-readable: 5.4.2 styled-jsx@5.1.6(react@19.0.0): dependencies: @@ -9887,55 +9083,57 @@ snapshots: tabbable@6.2.0: {} - tailwind-merge@2.5.5: {} + tailwind-merge@2.6.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.16): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17): dependencies: - tailwindcss: 3.4.16 + tailwindcss: 3.4.17 - tailwindcss@3.4.16: + tailwindcss@3.4.17: 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 + fast-glob: 3.3.3 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.6 + jiti: 1.21.7 lilconfig: 3.1.3 micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.49 - postcss-import: 15.1.0(postcss@8.4.49) - postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49) - postcss-nested: 6.2.0(postcss@8.4.49) + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 - resolve: 1.22.9 + resolve: 1.22.10 sucrase: 3.35.0 transitivePeerDependencies: - ts-node tapable@2.2.1: {} - tar-fs@2.1.1: + tar-fs@2.1.2: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.2 tar-stream: 2.2.0 - tar-fs@3.0.6: + tar-fs@3.0.8: dependencies: pump: 3.0.2 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 + bare-fs: 4.0.1 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer tar-stream@2.2.0: dependencies: @@ -9949,7 +9147,7 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.21.1 + streamx: 2.22.0 text-decoder@1.2.3: dependencies: @@ -9972,9 +9170,9 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 to-regex-range@5.0.1: @@ -9988,7 +9186,7 @@ snapshots: tr46@0.0.3: {} - tr46@4.1.1: + tr46@5.0.0: dependencies: punycode: 2.3.1 @@ -9996,13 +9194,13 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@1.4.3(typescript@5.7.2): + ts-api-utils@2.0.1(typescript@5.7.3): dependencies: - typescript: 5.7.2 + typescript: 5.7.3 - ts-essentials@10.0.3(typescript@5.7.2): + ts-essentials@10.0.3(typescript@5.7.3): optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 ts-interface-checker@0.1.13: {} @@ -10032,49 +9230,47 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@3.13.0: {} - - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.3: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 - reflect.getprototypeof: 1.0.8 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.8 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 - typescript@5.7.2: {} + typescript@5.7.3: {} uint8array-extras@1.4.0: {} unbox-primitive@1.1.0: dependencies: call-bound: 1.0.3 - has-bigints: 1.0.2 + has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -10107,9 +9303,9 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.1(browserslist@4.24.3): + update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -10117,7 +9313,7 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.2(@types/react@19.0.1)(react@19.0.0): + use-callback-ref@1.3.3(@types/react@19.0.1)(react@19.0.0): dependencies: react: 19.0.0 tslib: 2.8.1 @@ -10129,10 +9325,10 @@ snapshots: react: 19.0.0 scheduler: 0.25.0 - use-intl@3.26.1(react@19.0.0): + use-intl@3.26.5(react@19.0.0): dependencies: - '@formatjs/fast-memoize': 2.2.5 - intl-messageformat: 10.7.10 + '@formatjs/fast-memoize': 2.2.6 + intl-messageformat: 10.7.15 react: 19.0.0 use-isomorphic-layout-effect@1.2.0(@types/react@19.0.1)(react@19.0.0): @@ -10166,9 +9362,9 @@ snapshots: webidl-conversions@7.0.0: {} - whatwg-url@13.0.0: + whatwg-url@14.1.1: dependencies: - tr46: 4.1.1 + tr46: 5.0.0 webidl-conversions: 7.0.0 whatwg-url@5.0.0: @@ -10179,7 +9375,7 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -10187,31 +9383,32 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.3 - function.prototype.name: 1.1.7 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.0.0 + is-async-function: 2.1.1 is-date-object: 1.1.0 - is-finalizationregistry: 1.1.0 - is-generator-function: 1.0.10 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 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 + is-weakset: 2.0.4 - which-typed-array@1.1.16: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + call-bound: 1.0.3 + for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -10235,7 +9432,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.0: {} + ws@8.18.1: {} xss@1.0.15: dependencies: @@ -10248,7 +9445,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.6.1: {} + yaml@2.7.0: {} yargs-parser@20.2.9: {} @@ -10262,7 +9459,7 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 - yjs@13.6.20: + yjs@13.6.23: dependencies: lib0: 0.2.99 diff --git a/examples/localization/src/app/(frontend)/[locale]/layout.tsx b/examples/localization/src/app/(frontend)/[locale]/layout.tsx index 38187722e1..ab89472fc0 100644 --- a/examples/localization/src/app/(frontend)/[locale]/layout.tsx +++ b/examples/localization/src/app/(frontend)/[locale]/layout.tsx @@ -5,7 +5,6 @@ import { GeistMono } from 'geist/font/mono' import { GeistSans } from 'geist/font/sans' import React from 'react' -import { AdminBar } from '@/components/AdminBar' import { Footer } from '@/globals/Footer/Component' import { Header } from '@/globals/Header/Component' import { LivePreviewListener } from '@/components/LivePreviewListener' @@ -57,13 +56,7 @@ export default async function RootLayout({ children, params }: Args) { - -
{children}
diff --git a/examples/localization/src/components/AdminBar/index.scss b/examples/localization/src/components/AdminBar/index.scss deleted file mode 100644 index 54060c5ba4..0000000000 --- a/examples/localization/src/components/AdminBar/index.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import '~@payloadcms/ui/scss'; - -.admin-bar { - @include small-break { - display: none; - } -} diff --git a/examples/localization/src/components/AdminBar/index.tsx b/examples/localization/src/components/AdminBar/index.tsx deleted file mode 100644 index a629b67b9c..0000000000 --- a/examples/localization/src/components/AdminBar/index.tsx +++ /dev/null @@ -1,85 +0,0 @@ -'use client' - -import type { PayloadAdminBarProps } from 'payload-admin-bar' - -import { cn } from '@/utilities/ui' -import { useSelectedLayoutSegments } from 'next/navigation' -import { PayloadAdminBar } from 'payload-admin-bar' -import React, { useState } from 'react' -import { useRouter } from 'next/navigation' - -import './index.scss' -import { useTranslations } from 'next-intl' - -const baseClass = 'admin-bar' - -const collectionLabels = { - pages: { - plural: 'Pages', - singular: 'Page', - }, - posts: { - plural: 'Posts', - singular: 'Post', - }, - projects: { - plural: 'Projects', - singular: 'Project', - }, -} - -export const AdminBar: React.FC<{ - adminBarProps?: PayloadAdminBarProps -}> = (props) => { - const { adminBarProps } = props || {} - const segments = useSelectedLayoutSegments() - const [show, setShow] = useState(false) - const collection = collectionLabels?.[segments?.[1]] ? segments?.[1] : 'pages' - const router = useRouter() - const t = useTranslations() - - const onAuthChange = React.useCallback((user) => { - setShow(user?.id) - }, []) - - return ( -
-
- {t('dashboard')}} - onAuthChange={onAuthChange} - onPreviewExit={() => { - fetch('/next/exit-preview').then(() => { - router.push('/') - router.refresh() - }) - }} - style={{ - backgroundColor: 'transparent', - padding: 0, - position: 'relative', - zIndex: 'unset', - }} - /> -
-
- ) -} diff --git a/examples/multi-tenant/.env.example b/examples/multi-tenant/.env.example index 9344c5560c..56d50a07d3 100644 --- a/examples/multi-tenant/.env.example +++ b/examples/multi-tenant/.env.example @@ -1,3 +1,5 @@ DATABASE_URI=mongodb://127.0.0.1/payload-example-multi-tenant +POSTGRES_URL=postgres://127.0.0.1:5432/payload-example-multi-tenant PAYLOAD_SECRET=PAYLOAD_MULTI_TENANT_EXAMPLE_SECRET_KEY PAYLOAD_PUBLIC_SERVER_URL=http://localhost:3000 +SEED_DB=true \ No newline at end of file diff --git a/examples/multi-tenant/README.md b/examples/multi-tenant/README.md index 5626f3600e..9121c90308 100644 --- a/examples/multi-tenant/README.md +++ b/examples/multi-tenant/README.md @@ -46,12 +46,12 @@ See the [Collections](https://payloadcms.com/docs/configuration/collections) doc **Domain-based Tenant Setting**: - This example also supports domain-based tenant selection, where tenants can be associated with a specific domain. If a tenant is associated with a domain (e.g., `gold.test:3000`), when a user logs in from that domain, they will be automatically scoped to the matching tenant. This is accomplished through an optional `afterLogin` hook that sets a `payload-tenant` cookie based on the domain. + This example also supports domain-based tenant selection, where tenants can be associated with a specific domain. If a tenant is associated with a domain (e.g., `gold.localhost:3000`), when a user logs in from that domain, they will be automatically scoped to the matching tenant. This is accomplished through an optional `afterLogin` hook that sets a `payload-tenant` cookie based on the domain. For the domain portion of the example to function properly, you will need to add the following entries to your system's `/etc/hosts` file: ``` -127.0.0.1 gold.test silver.test bronze.test +127.0.0.1 gold.localhost silver.localhost bronze.localhost ``` - #### Pages diff --git a/examples/multi-tenant/next-env.d.ts b/examples/multi-tenant/next-env.d.ts index 40c3d68096..1b3be0840f 100644 --- a/examples/multi-tenant/next-env.d.ts +++ b/examples/multi-tenant/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/examples/multi-tenant/package.json b/examples/multi-tenant/package.json index 0f4a8a21d8..3f67662be9 100644 --- a/examples/multi-tenant/package.json +++ b/examples/multi-tenant/package.json @@ -17,6 +17,7 @@ }, "dependencies": { "@payloadcms/db-mongodb": "latest", + "@payloadcms/db-postgres": "^3.25.0", "@payloadcms/next": "latest", "@payloadcms/plugin-multi-tenant": "latest", "@payloadcms/richtext-lexical": "latest", diff --git a/examples/multi-tenant/pnpm-lock.yaml b/examples/multi-tenant/pnpm-lock.yaml index aacbbb99c1..139420c3d5 100644 --- a/examples/multi-tenant/pnpm-lock.yaml +++ b/examples/multi-tenant/pnpm-lock.yaml @@ -10,19 +10,22 @@ importers: dependencies: '@payloadcms/db-mongodb': specifier: latest - version: 3.0.2(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2)) + '@payloadcms/db-postgres': + specifier: ^3.25.0 + version: 3.25.0(@types/react@19.0.1)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react@19.0.0) '@payloadcms/next': specifier: latest - version: 3.0.2(@types/react@19.0.1)(graphql@16.9.0)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + version: 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) '@payloadcms/plugin-multi-tenant': - specifier: file:payloadcms-plugin-multi-tenant-3.15.1.tgz - version: file:payloadcms-plugin-multi-tenant-3.15.1.tgz(@payloadcms/ui@3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)) + specifier: latest + version: 3.25.0(@payloadcms/ui@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2)) '@payloadcms/richtext-lexical': specifier: latest - version: 3.0.2(6qerb26rs4bgoavayjhmleobf4) + version: 3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)(yjs@13.6.23) '@payloadcms/ui': specifier: latest - version: 3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -31,13 +34,13 @@ importers: version: 8.6.0 graphql: specifier: ^16.9.0 - version: 16.9.0 + version: 16.10.0 next: specifier: ^15.0.0 - version: 15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + version: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) payload: specifier: latest - version: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + version: 3.25.0(graphql@16.10.0)(typescript@5.5.2) qs-esm: specifier: 7.0.2 version: 7.0.2 @@ -53,10 +56,10 @@ importers: devDependencies: '@payloadcms/graphql': specifier: latest - version: 3.0.2(graphql@16.9.0)(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2) + version: 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2) '@swc/core': specifier: ^1.6.13 - version: 1.9.2(@swc/helpers@0.5.13) + version: 1.11.5(@swc/helpers@0.5.15) '@types/react': specifier: 19.0.1 version: 19.0.1 @@ -68,26 +71,26 @@ importers: version: 8.57.1 eslint-config-next: specifier: ^15.0.0 - version: 15.0.3(eslint@8.57.1)(typescript@5.5.2) + version: 15.2.0(eslint@8.57.1)(typescript@5.5.2) tsx: specifier: ^4.16.2 - version: 4.19.2 + version: 4.19.3 typescript: specifier: 5.5.2 version: 5.5.2 packages: - '@apidevtools/json-schema-ref-parser@11.7.2': - resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.2': - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': @@ -102,29 +105,32 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.2': - resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} - '@dnd-kit/accessibility@3.1.0': - resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + '@date-fns/tz@1.2.0': + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + + '@dnd-kit/accessibility@3.1.1': + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: react: '>=16.8.0' @@ -145,14 +151,17 @@ packages: peerDependencies: react: '>=16.8.0' + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - '@emotion/cache@11.13.5': - resolution: {integrity: sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==} + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} '@emotion/css@11.13.5': resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} @@ -163,8 +172,8 @@ packages: '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - '@emotion/react@11.13.5': - resolution: {integrity: sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==} + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -181,8 +190,8 @@ packages: '@emotion/unitless@0.10.0': resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - '@emotion/use-insertion-effect-with-fallbacks@1.1.0': - resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} peerDependencies: react: '>=16.8.0' @@ -192,150 +201,578 @@ packages: '@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==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@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/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + 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-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + 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/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + 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/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + 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/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + 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-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + 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-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + 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-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + 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-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + 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-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + 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-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + 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-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + 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/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@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/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + 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/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + 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/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + 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-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + 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-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + 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] + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -360,23 +797,23 @@ packages: 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==} + '@faceless-ui/scroll-info@2.0.0': + resolution: {integrity: sha512-BkyJ9OQ4bzpKjE3UhI8BhcG36ZgfB4run8TmlaR4oMFUbl59dfyarNfjveyimrxIso9RhFEja/AJ5nQmbcR9hw==} 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 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@faceless-ui/window-info@3.0.0-beta.0': - resolution: {integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==} + '@faceless-ui/window-info@3.0.1': + resolution: {integrity: sha512-uPjdJYE/j7hqVNelE9CRUNOeXuXDdPxR4DMe+oz3xwyZi2Y4CxsfpfdPTqqwmNAZa1P33O+ZiCyIkBEeNed0kw==} 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 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@floating-ui/core@1.6.8': - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} - '@floating-ui/dom@1.6.12': - resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} '@floating-ui/react-dom@2.1.2': resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} @@ -384,14 +821,14 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + '@floating-ui/react@0.27.5': + resolution: {integrity: sha512-BX3jKxo39Ba05pflcQmqPPwc0qdNsdNi/eweAFtoIdrJWNen2sVEWMEac3i6jU55Qfx+lOcdMNKYn2CtWmlnOQ==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} @@ -511,8 +948,8 @@ packages: cpu: [x64] os: [win32] - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -532,145 +969,143 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - '@lexical/clipboard@0.20.0': - resolution: {integrity: sha512-oHmb9kSVHjeFCd2q8VrEXW22doUHMJ6cGXqo7Ican7Ljl4/9OgRWr+cq55yntoSaJfCrRYkTiZCLDejF2ciSiA==} + '@lexical/clipboard@0.21.0': + resolution: {integrity: sha512-3lNMlMeUob9fcnRXGVieV/lmPbmet/SVWckNTOwzfKrZ/YW5HiiyJrWviLRVf50dGXTbmBGt7K/2pfPYvWCHFA==} - '@lexical/code@0.20.0': - resolution: {integrity: sha512-zFsVGuzIn4CQxEnlW4AG/Hq6cyATVZ4fZTxozE/f5oK4vDPvnY/goRxrzSuAMX73A/HRX3kTEzMDcm4taRM3Mg==} + '@lexical/code@0.21.0': + resolution: {integrity: sha512-E0DNSFu4I+LMn3ft+UT0Dbntc8ZKjIA0BJj6BDewm0qh3bir40YUf5DkI2lpiFNRF2OpcmmcIxakREeU6avqTA==} - '@lexical/devtools-core@0.20.0': - resolution: {integrity: sha512-/CnL+Dfpzw4koy2BTdUICkvrCkMIYG8Y73KB/S1Bt5UzJpD+PV300puWJ0NvUvAj24H78r73jxvK2QUG67Tdaw==} + '@lexical/devtools-core@0.21.0': + resolution: {integrity: sha512-csK41CmRLZbKNV5pT4fUn5RzdPjU5PoWR8EqaS9kiyayhDg2zEnuPtvUYWanLfCLH9A2oOfbEsGxjMctAySlJw==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' - '@lexical/dragon@0.20.0': - resolution: {integrity: sha512-3DAHF8mSKiPZtXCqu2P8ynSwS3fGXzg4G/V0lXNjBxhmozjzUzWZRWIWtmTlWdEu9GXsoyeM3agcaxyDPJJwkA==} + '@lexical/dragon@0.21.0': + resolution: {integrity: sha512-ahTCaOtRFNauEzplN1qVuPjyGAlDd+XcVM5FQCdxVh/1DvqmBxEJRVuCBqatzUUVb89jRBekYUcEdnY9iNjvEQ==} - '@lexical/hashtag@0.20.0': - resolution: {integrity: sha512-ldOP/d9tA6V9qvLyr3mRYkcYY5ySOHJ2BFOW/jZPxQcj6lWafS8Lk7XdMUpHHDjRpY2Hizsi5MHJkIqFglYXbw==} + '@lexical/hashtag@0.21.0': + resolution: {integrity: sha512-O4dxcZNq1Xm45HLoRifbGAYvQkg3qLoBc6ibmHnDqZL5mQDsufnH6QEKWfgDtrvp9++3iqsSC+TE7VzWIvA7ww==} - '@lexical/headless@0.20.0': - resolution: {integrity: sha512-PZ9Yxud7UOpVoq3oJ1wb3wb7NHyFt8XLc1IhdNAzTzbZ+L6c9lyomgBFvDs11u/3t9vjtLxGbzkzYKryQE80Ig==} + '@lexical/headless@0.21.0': + resolution: {integrity: sha512-7/eEz6ed39MAg34c+rU7xUn46UV4Wdt5dEZwsdBzuflWhpNeUscQmkw8wIoFhEhJdCc+ZbB17CnjJlUZ1RxHvg==} - '@lexical/history@0.20.0': - resolution: {integrity: sha512-dXtIS31BU6RmLX2KwLAi1EgGl+USeyi+rshh19azACXHPFqONZgPd2t21LOLSFn7C1/W+cSp/kqVDlQVbZUZRA==} + '@lexical/history@0.21.0': + resolution: {integrity: sha512-Sv2sici2NnAfHYHYRSjjS139MDT8fHP6PlYM2hVr+17dOg7/fJl22VBLRgQ7/+jLtAPxQjID69jvaMlOvt4Oog==} - '@lexical/html@0.20.0': - resolution: {integrity: sha512-ob7QHkEv+mhaZjlurDj90UmEyN9G4rzBPR5QV42PLnu1qMSviMEdI5V3a5/A5aFf/FDDQ+0GAgWBFnA/MEDczQ==} + '@lexical/html@0.21.0': + resolution: {integrity: sha512-UGahVsGz8OD7Ya39qwquE+JPStTxCw/uaQrnUNorCM7owtPidO2H+tsilAB3A1GK3ksFGdHeEjBjG0Gf7gOg+Q==} - '@lexical/link@0.20.0': - resolution: {integrity: sha512-zicDcfgRZPRFZ8WOZv5er0Aqkde+i7QoFVkLQD4dNLLORjoMSJOISJH6VEdjBl3k7QJTxbfrt+xT5d/ZsAN5GA==} + '@lexical/link@0.21.0': + resolution: {integrity: sha512-/coktIyRXg8rXz/7uxXsSEfSQYxPIx8CmignAXWYhcyYtCWA0fD2mhEhWwVvHH9ofNzvidclRPYKUnrmUm3z3Q==} - '@lexical/list@0.20.0': - resolution: {integrity: sha512-ufSse8ui3ooUe0HA/yF/9STrG8wYhIDLMRhELOw80GFCkPJaxs6yRvjfmJooH5IC88rpUJ5XXFFiZKfGxEZLEw==} + '@lexical/list@0.21.0': + resolution: {integrity: sha512-WItGlwwNJCS8b6SO1QPKzArShmD+OXQkLbhBcAh+EfpnkvmCW5T5LqY+OfIRmEN1dhDOnwqCY7mXkivWO8o5tw==} - '@lexical/mark@0.20.0': - resolution: {integrity: sha512-1P2izmkgZ4VDp+49rWO1KfWivL5aA30y5kkYbFZ/CS05fgbO7ogMjLSajpz+RN/zzW79v3q4YfikrMgaD23InA==} + '@lexical/mark@0.21.0': + resolution: {integrity: sha512-2x/LoHDYPOkZbKHz4qLFWsPywjRv9KggTOtmRazmaNRUG0FpkImJwUbbaKjWQXeESVGpzfL3qNFSAmCWthsc4g==} - '@lexical/markdown@0.20.0': - resolution: {integrity: sha512-ZoGsECejp9z6MEvc8l81b1h1aWbB3sTq6xOFeUTbDL5vKpA67z5CmQQLi0uZWrygrbO9dSE3Q/JGcodUrczxbw==} + '@lexical/markdown@0.21.0': + resolution: {integrity: sha512-XCQCyW5ujK0xR6evV8sF0hv/MRUA//kIrB2JiyF12tLQyjLRNEXO+0IKastWnMKSaDdJMKjzgd+4PiummYs7uA==} - '@lexical/offset@0.20.0': - resolution: {integrity: sha512-VMhxsxxDGnpVw0jgC8UlDf0Q2RHIHbS49uZgs3l9nP+O+G8s3b76Ta4Tb+iJOK2FY6874/TcQMbSuXGhfpQk8A==} + '@lexical/offset@0.21.0': + resolution: {integrity: sha512-UR0wHg+XXbq++6aeUPdU0K41xhUDBYzX+AeiqU9bZ7yoOq4grvKD8KBr5tARCSYTy0yvQnL1ddSO12TrP/98Lg==} - '@lexical/overflow@0.20.0': - resolution: {integrity: sha512-z4lElzLm1FVifc7bzBZN4VNKeTuwygpyHQvCJVWXzF2Kbvex43PEYMi8u4A83idVqbmzbyBLASwUJS0voLoPLw==} + '@lexical/overflow@0.21.0': + resolution: {integrity: sha512-93P+d1mbvaJvZF8KK2pG22GuS2pHLtyC7N3GBfkbyAIb7TL/rYs47iR+eADJ4iNY680lylJ4Sl/AEnWvlY7hAg==} - '@lexical/plain-text@0.20.0': - resolution: {integrity: sha512-LvoC+9mm2Im1iO8GgtgaqSfW0T3mIE5GQl1xGxbVNdANmtHmBgRAJn2KfQm1XHZP6zydLRMhZkzC+jfInh2yfQ==} + '@lexical/plain-text@0.21.0': + resolution: {integrity: sha512-r4CsAknBD7qGYSE5fPdjpJ6EjfvzHbDtuCeKciL9muiswQhw4HeJrT1qb/QUIY+072uvXTgCgmjUmkbYnxKyPA==} - '@lexical/react@0.20.0': - resolution: {integrity: sha512-5QbN5AFtZ9efXxU/M01ADhUZgthR0e8WKi5K/w5EPpWtYFDPQnUte3rKUjYJ7uwG1iwcvaCpuMbxJjHQ+i6pDQ==} + '@lexical/react@0.21.0': + resolution: {integrity: sha512-tKwx8EoNkBBKOZf8c10QfyDImH87+XUI1QDL8KXt+Lb8E4ho7g1jAjoEirNEn9gMBj33K4l2qVdbe3XmPAdpMQ==} peerDependencies: - react: 19.0.0-rc-65a56d0e-20241020 - react-dom: 19.0.0-rc-65a56d0e-20241020 + react: '>=17.x' + react-dom: '>=17.x' - '@lexical/rich-text@0.20.0': - resolution: {integrity: sha512-BR1pACdMA+Ymef0f5EN1y+9yP8w7S+9MgmBP1yjr3w4KdqRnfSaGWyxwcHU8eA+zu16QfivpB6501VJ90YeuXw==} + '@lexical/rich-text@0.21.0': + resolution: {integrity: sha512-+pvEKUneEkGfWOSTl9jU58N9knePilMLxxOtppCAcgnaCdilOh3n5YyRppXhvmprUe0JaTseCMoik2LP51G/JA==} - '@lexical/selection@0.20.0': - resolution: {integrity: sha512-YnkH5UCMNN/em95or/6uwAV31vcENh1Roj+JOg5KD+gJuA7VGdDCy0vZl/o0+1badXozeZ2VRxXNC6JSK7T4+A==} + '@lexical/selection@0.21.0': + resolution: {integrity: sha512-4u53bc8zlPPF0rnHjsGQExQ1St8NafsDd70/t1FMw7yvoMtUsKdH7+ap00esLkJOMv45unJD7UOzKRqU1X0sEA==} - '@lexical/table@0.20.0': - resolution: {integrity: sha512-qHuK2rvQUoQDx62YpvJE3Ev4yK9kjRFo79IDBapxrhoXg/wCGQOjMBzVD3G5PWkhyl/GDnww80GwYjLloQLQzg==} + '@lexical/table@0.21.0': + resolution: {integrity: sha512-JhylAWcf4qKD4FmxMUt3YzH5zg2+baBr4+/haLZL7178hMvUzJwGIiWk+3hD3phzmW3WrP49uFXzM7DMSCkE8w==} - '@lexical/text@0.20.0': - resolution: {integrity: sha512-Fu64i5CIlEOlgucSdp9XFqB2XqoRsw4at76n93+6RF4+LgGDnu4nLXQVCVxNmLcGyh2WgczuTpnk5P2mHNAIUA==} + '@lexical/text@0.21.0': + resolution: {integrity: sha512-ceB4fhYejCoR8ID4uIs0sO/VyQoayRjrRWTIEMvOcQtwUkcyciKRhY0A7f2wVeq/MFStd+ajLLjy4WKYK5zUnA==} - '@lexical/utils@0.20.0': - resolution: {integrity: sha512-sXIa2nowrNxY8VcjjuxZbJ/HovIql8bmInNaxBR03JAYfqMiL5I5/dYgjOQJV49NJnuR1uTY2GwVxVTXCTFUCw==} + '@lexical/utils@0.21.0': + resolution: {integrity: sha512-YzsNOAiLkCy6R3DuP18gtseDrzgx+30lFyqRvp5M7mckeYgQElwdfG5biNFDLv7BM9GjSzgU5Cunjycsx6Sjqg==} - '@lexical/yjs@0.20.0': - resolution: {integrity: sha512-TiHNhu2VkhXN69V+fXVS3xjOQ6aLnheQUGwOAhuFkDPL3VLCb0yl2Mgydpayn+3Grwii4ZBHcF7oCC84GiU5bw==} + '@lexical/yjs@0.21.0': + resolution: {integrity: sha512-AtPhC3pJ92CHz3dWoniSky7+MSK2WSd0xijc76I2qbTeXyeuFfYyhR6gWMg4knuY9Wz3vo9/+dXGdbQIPD8efw==} 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/loader@1.5.0': + resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} - '@monaco-editor/react@4.6.0': - resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} + '@monaco-editor/react@4.7.0': + resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} 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 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@mongodb-js/saslprep@1.1.9': - resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} + '@mongodb-js/saslprep@1.2.0': + resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} - '@next/env@15.0.3': - resolution: {integrity: sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==} + '@next/env@15.2.0': + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} - '@next/eslint-plugin-next@15.0.3': - resolution: {integrity: sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw==} + '@next/eslint-plugin-next@15.2.0': + resolution: {integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==} - '@next/swc-darwin-arm64@15.0.3': - resolution: {integrity: sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==} + '@next/swc-darwin-arm64@15.2.0': + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.0.3': - resolution: {integrity: sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==} + '@next/swc-darwin-x64@15.2.0': + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.0.3': - resolution: {integrity: sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==} + '@next/swc-linux-arm64-gnu@15.2.0': + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.0.3': - resolution: {integrity: sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==} + '@next/swc-linux-arm64-musl@15.2.0': + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.0.3': - resolution: {integrity: sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==} + '@next/swc-linux-x64-gnu@15.2.0': + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.0.3': - resolution: {integrity: sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==} + '@next/swc-linux-x64-musl@15.2.0': + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.0.3': - resolution: {integrity: sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==} + '@next/swc-win32-arm64-msvc@15.2.0': + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.0.3': - resolution: {integrity: sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==} + '@next/swc-win32-x64-msvc@15.2.0': + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -691,135 +1126,134 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@payloadcms/db-mongodb@3.0.2': - resolution: {integrity: sha512-BgwB0wSDUzsJeJyIOIVsr93JyHxoutRiPBYi4gRAQIFpQJ5fJOMoHR4u8ikpItnAsJ01laOPSnlhadLxvRiIXw==} + '@payloadcms/db-mongodb@3.25.0': + resolution: {integrity: sha512-M5aD+s698wlmagTJPqgKySrwtuIjtwEJHQ8Ft5qLZWM/ngizrePbW/N/jGicSkuKJjwlP0fwJSrDQ4bkAN515g==} peerDependencies: - payload: 3.0.2 + payload: 3.25.0 - '@payloadcms/graphql@3.0.2': - resolution: {integrity: sha512-7xNTt+8aDddgyU09fKUUtt1VoqxrrRzM40gU8X7oyQbJO1FMti141/7GEUeukFo1w8gXDaMu4xBgFwa+7dQcaw==} + '@payloadcms/db-postgres@3.25.0': + resolution: {integrity: sha512-wrYQErmJIbiHzw/BY8c52M2l6Q9HGoF41Km+2H3n3cmXtg9RbAgp7PmxucEDitk6JCRCn6G0WxtrAfGyqizosQ==} + peerDependencies: + payload: 3.25.0 + + '@payloadcms/drizzle@3.25.0': + resolution: {integrity: sha512-8ZRwQhTqS3PcvXae8k+RIoNaaFCTD4kdeoOCeIt6/Y/F6OzYzespU1Wci7jDlaJruUxzb+CdZWHWZbv27pbwzQ==} + peerDependencies: + payload: 3.25.0 + + '@payloadcms/graphql@3.25.0': + resolution: {integrity: sha512-JbffYYHcsqOPK7GH6WgQd+xbtNQxG+is3el+qxIVIqTGwrZtGy7EFg2OK3XMk3Hb/bJUH/Ino3X3XsgdD6ffyg==} hasBin: true peerDependencies: graphql: ^16.8.1 - payload: 3.0.2 + payload: 3.25.0 - '@payloadcms/next@3.0.2': - resolution: {integrity: sha512-ju/bLNmR2oEunhLa3qfkVy8No/p9bGt7T1ee0/QbuCQMw3HAJ3KrIOhJUIv6X1fZmG63aNQGbefdnDtgMok5JQ==} + '@payloadcms/next@3.25.0': + resolution: {integrity: sha512-Xx703RpURJ34yRMTgjcbyg555p0yXCH5C6ZxLCinEs1Lv3nE6FymVjlMGs2y+5IqPZfjaH4qnkgcwtxBE+fHQw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: graphql: ^16.8.1 next: ^15.0.0 - payload: 3.0.2 + payload: 3.25.0 - '@payloadcms/plugin-multi-tenant@file:payloadcms-plugin-multi-tenant-3.15.1.tgz': - resolution: {integrity: sha512-bRuvmbrCLQr9ZL1jL4KLz+Zuv6vC4WTGKXcFkhdZoFY5tP80t78WUsxJP71FM1d1U+udJGvEA5K2bMJc9tQWOA==, tarball: file:payloadcms-plugin-multi-tenant-3.15.1.tgz} - version: 3.15.1 + '@payloadcms/plugin-multi-tenant@3.25.0': + resolution: {integrity: sha512-Xh/twsM09a+VceoezgM0sQnXBmeUGaTN3MukkYFLrXPZ15WSDyjaS+smFD9GfuZikOALbh8ffgoNqkjUa+QEcA==} peerDependencies: - '@payloadcms/ui': 3.15.1 + '@payloadcms/ui': 3.25.0 next: ^15.0.3 - payload: 3.15.1 + payload: 3.25.0 - '@payloadcms/richtext-lexical@3.0.2': - resolution: {integrity: sha512-NHxnIi8qIa5ug3JQ/oX4je+94FLGhofmP02RL7BoyknNIw8Jv0zZY4NJCgrUBpmRw4CVxCc+dikMY+5243B9vA==} + '@payloadcms/richtext-lexical@3.25.0': + resolution: {integrity: sha512-VHRqbhRu137bRYopYnPJef+5G2XyQO2a7LFUKPcnscwKDJKxkNQ5+jbUMKUjpm5zdxfbirnDVjWgJcsixau0Og==} 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.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/react': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - '@payloadcms/next': 3.0.2 - lexical: 0.20.0 - payload: 3.0.2 + '@faceless-ui/scroll-info': 2.0.0 + '@payloadcms/next': 3.25.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/translations@3.0.2': - resolution: {integrity: sha512-qwixoVF5ECL4/O/I2y9qIymjrXSOF5eE0wo2bGm3g+XEg+vI/lqeQ2CEOduhETmy5r+aZtd6eE90ZsX5/N840w==} + '@payloadcms/translations@3.25.0': + resolution: {integrity: sha512-af+fDh+fzfExx9oeM8AJqwdEfc6X291smMUUe3mOCRlwIylcxXKzgj8ITdwPonGzaV/GJjAsc4U0mZIkaA6MMg==} - '@payloadcms/ui@3.0.2': - resolution: {integrity: sha512-oztpIVZnbGs0IWqinzogEHf+zTBa7rRv/HK5o7ixjSE43DZ7tLiCYYmEJjiKt7XA3U2S5aI3YdMgHyGlx7KQTA==} + '@payloadcms/ui@3.25.0': + resolution: {integrity: sha512-9zOv8zeenZlNua+WlFtldVAUn6NatMY5BPXzWRMWSfIVnrRqimY87HQyS6uvncSPdsPwqf9UH6mBkbIqbeusgw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: next: ^15.0.0 - payload: 3.0.2 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.10.4': - resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + '@rushstack/eslint-patch@1.10.5': + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} - '@swc/core-darwin-arm64@1.9.2': - resolution: {integrity: sha512-nETmsCoY29krTF2PtspEgicb3tqw7Ci5sInTI03EU5zpqYbPjoPH99BVTjj0OsF53jP5MxwnLI5Hm21lUn1d6A==} + '@swc/core-darwin-arm64@1.11.5': + resolution: {integrity: sha512-GEd1hzEx0mSGkJYMFMGLnrGgjL2rOsOsuYWyjyiA3WLmhD7o+n/EWBDo6mzD/9aeF8dzSPC0TnW216gJbvrNzA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.9.2': - resolution: {integrity: sha512-9gD+bwBz8ZByjP6nZTXe/hzd0tySIAjpDHgkFiUrc+5zGF+rdTwhcNrzxNHJmy6mw+PW38jqII4uspFHUqqxuQ==} + '@swc/core-darwin-x64@1.11.5': + resolution: {integrity: sha512-toz04z9wAClVvQSEY3xzrgyyeWBAfMWcKG4K0ugNvO56h/wczi2ZHRlnAXZW1tghKBk3z6MXqa/srfXgNhffKw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.9.2': - resolution: {integrity: sha512-kYq8ief1Qrn+WmsTWAYo4r+Coul4dXN6cLFjiPZ29Cv5pyU+GFvSPAB4bEdMzwy99rCR0u2P10UExaeCjurjvg==} + '@swc/core-linux-arm-gnueabihf@1.11.5': + resolution: {integrity: sha512-5SjmKxXdwbBpsYGTpgeXOXMIjS563/ntRGn8Zc12H/c4VfPrRLGhgbJ/48z2XVFyBLcw7BCHZyFuVX1+ZI3W0Q==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.9.2': - resolution: {integrity: sha512-n0W4XiXlmEIVqxt+rD3ZpkogsEWUk1jJ+i5bQNgB+1JuWh0fBE8c/blDgTQXa0GB5lTPVDZQussgdNOCnAZwiA==} + '@swc/core-linux-arm64-gnu@1.11.5': + resolution: {integrity: sha512-pydIlInHRzRIwB0NHblz3Dx58H/bsi0I5F2deLf9iOmwPNuOGcEEZF1Qatc7YIjP5DFbXK+Dcz+pMUZb2cc2MQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.9.2': - resolution: {integrity: sha512-8xzrOmsyCC1zrx2Wzx/h8dVsdewO1oMCwBTLc1gSJ/YllZYTb04pNm6NsVbzUX2tKddJVRgSJXV10j/NECLwpA==} + '@swc/core-linux-arm64-musl@1.11.5': + resolution: {integrity: sha512-LhBHKjkZq5tJF1Lh0NJFpx7ROnCWLckrlIAIdSt9XfOV+zuEXJQOj+NFcM1eNk17GFfFyUMOZyGZxzYq5dveEQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.9.2': - resolution: {integrity: sha512-kZrNz/PjRQKcchWF6W292jk3K44EoVu1ad5w+zbS4jekIAxsM8WwQ1kd+yjUlN9jFcF8XBat5NKIs9WphJCVXg==} + '@swc/core-linux-x64-gnu@1.11.5': + resolution: {integrity: sha512-dCi4xkxXlsk5sQYb3i413Cfh7+wMJeBYTvBZTD5xh+/DgRtIcIJLYJ2tNjWC4/C2i5fj+Ze9bKNSdd8weRWZ3A==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.9.2': - resolution: {integrity: sha512-TTIpR4rjMkhX1lnFR+PSXpaL83TrQzp9znRdp2TzYrODlUd/R20zOwSo9vFLCyH6ZoD47bccY7QeGZDYT3nlRg==} + '@swc/core-linux-x64-musl@1.11.5': + resolution: {integrity: sha512-K0AC4TreM5Oo/tXNXnE/Gf5+5y/HwUdd7xvUjOpZddcX/RlsbYOKWLgOtA3fdFIuta7XC+vrGKmIhm5l70DSVQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.9.2': - resolution: {integrity: sha512-+Eg2d4icItKC0PMjZxH7cSYFLWk0aIp94LNmOw6tPq0e69ax6oh10upeq0D1fjWsKLmOJAWEvnXlayZcijEXDw==} + '@swc/core-win32-arm64-msvc@1.11.5': + resolution: {integrity: sha512-wzum8sYUsvPY7kgUfuqVYTgIPYmBC8KPksoNM1fz5UfhudU0ciQuYvUBD47GIGOevaoxhLkjPH4CB95vh1mJ9w==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.9.2': - resolution: {integrity: sha512-nLWBi4vZDdM/LkiQmPCakof8Dh1/t5EM7eudue04V1lIcqx9YHVRS3KMwEaCoHLGg0c312Wm4YgrWQd9vwZ5zQ==} + '@swc/core-win32-ia32-msvc@1.11.5': + resolution: {integrity: sha512-lco7mw0TPRTpVPR6NwggJpjdUkAboGRkLrDHjIsUaR+Y5+0m5FMMkHOMxWXAbrBS5c4ph7QErp4Lma4r9Mn5og==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.9.2': - resolution: {integrity: sha512-ik/k+JjRJBFkXARukdU82tSVx0CbExFQoQ78qTO682esbYXzjdB5eLVkoUbwen299pnfr88Kn4kyIqFPTje8Xw==} + '@swc/core-win32-x64-msvc@1.11.5': + resolution: {integrity: sha512-E+DApLSC6JRK8VkDa4bNsBdD7Qoomx1HvKVZpOXl9v94hUZI5GMExl4vU5isvb+hPWL7rZ0NeI7ITnVLgLJRbA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.9.2': - resolution: {integrity: sha512-dYyEkO6mRYtZFpnOsnYzv9rY69fHAHoawYOjGOEcxk9WYtaJhowMdP/w6NcOKnz2G7GlZaenjkzkMa6ZeQeMsg==} + '@swc/core@1.11.5': + resolution: {integrity: sha512-EVY7zfpehxhTZXOfy508gb3D78ihoGGmvyiTWtlBPjgIaidP1Xw0naHMD78CWiFlZmeDjKXJufGtsEGOnZdmNA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -830,11 +1264,11 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.13': - resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/types@0.1.17': - resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + '@swc/types@0.1.19': + resolution: {integrity: sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==} '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -863,26 +1297,31 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.13': - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + '@types/lodash@4.17.15': + resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.9.1': - resolution: {integrity: sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==} + '@types/node@22.13.5': + resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} '@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/react-dom@19.0.1': resolution: {integrity: sha512-hljHij7MpWPKF6u5vojuyfV0YA4YURsQG7KT6SzV0Zs2BXAtgdTxG6A229Ub/xiWV4w/7JL8fi6aAyjshH4meA==} - '@types/react-transition-group@4.4.11': - resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' '@types/react@19.0.1': resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} @@ -902,70 +1341,55 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@typescript-eslint/eslint-plugin@8.15.0': - resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} 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: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.15.0': - resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} 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: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.15.0': - resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} 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: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} 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: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1007,8 +1431,8 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-includes@3.1.8: @@ -1023,25 +1447,29 @@ packages: 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==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} 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==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -1068,20 +1496,30 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.5.0: - resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} - bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + bare-fs@4.0.1: + resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} + engines: {bare: '>=1.7.0'} - bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + bare-os@3.5.1: + resolution: {integrity: sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg==} + engines: {bare: '>=1.14.0'} - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.4.0: - resolution: {integrity: sha512-sd96/aZ8LjF1uJbEHzIo1LrERPKRFPEy1nZ1eOILftBxrVsFDAQkimHIIq87xrHcubzjNeETsD9PwN0wp+vLiQ==} + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1109,10 +1547,17 @@ packages: bson-objectid@2.0.4: resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} - bson@6.10.0: - resolution: {integrity: sha512-ROchNosXMJD2cbQGm84KoP7vOGPO6/bOAW0veMMbzhXLqoZptcaYRVLitwvuhwhjjpU1qP4YZRWLhgETdgqUQw==} + bson@6.10.3: + resolution: {integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==} engines: {node: '>=16.20.1'} + 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@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1120,16 +1565,24 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001683: - resolution: {integrity: sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==} + caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1232,20 +1685,20 @@ packages: 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==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - dataloader@2.2.2: - resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + dataloader@2.2.3: + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} @@ -1264,8 +1717,8 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1329,55 +1782,176 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + drizzle-kit@0.28.0: + resolution: {integrity: sha512-KqI+CS2Ga9GYIrXpxpCDUJJrH/AT/k4UY0Pb4oRgQEGkgN1EdCnqp664cXgwPWjDr5RBtTsjZipw8+8C//K63A==} + hasBin: true + + drizzle-orm@0.36.1: + resolution: {integrity: sha512-F4hbimnMEhyWzDowQB4xEuVJJWXLHZYD7FYwvo8RImY+N7pStGqsbfmT95jDbec1s4qKmQbiuxEDZY90LRrfIw==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@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': '>=18' + '@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: '>=18' + 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 + '@libsql/client-wasm': + 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 + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + 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==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.5: - resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 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==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <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 + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1385,8 +1959,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.0.3: - resolution: {integrity: sha512-IGP2DdQQrgjcr4mwFPve4DrCqo7CVVez1WoYY47XwKSrYO4hC0Dlb+iJA60i0YfICOzgNADIb8r28BpQ5Zs0wg==} + eslint-config-next@15.2.0: + resolution: {integrity: sha512-LkG0KKpinAoNPk2HXSx0fImFb/hQ6RnhSxTkpJFTkQ0SmnzsbRsjjN95WC/mDY34nKOenpptYEVvfkCR/h+VjA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -1397,8 +1971,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.6.3: - resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1447,14 +2021,14 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.0.0: - resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} 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@7.37.2: - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -1520,8 +2094,8 @@ packages: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -1537,14 +2111,14 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.3: - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1574,14 +2148,15 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -1597,21 +2172,28 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -1642,8 +2224,9 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1651,8 +2234,8 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql-http@1.22.3: - resolution: {integrity: sha512-sgUz/2DZt+QvY6WrpAsAXUvhnIkp2eX9jN78V8DAtFcpZi/nfDrzDt2byYjyoJzRcWuqhE0K63g1QMewt73U6A==} + graphql-http@1.22.4: + resolution: {integrity: sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==} engines: {node: '>=12'} peerDependencies: graphql: '>=0.11 <=16' @@ -1666,12 +2249,13 @@ packages: 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==} + graphql@16.10.0: + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} 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-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -1680,12 +2264,12 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: @@ -1702,8 +2286,8 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - http-status@1.6.2: - resolution: {integrity: sha512-oUExvfNckrpTpDazph7kNG8sQi5au3BeTo0idaZFXEhTaJKu7GNJCLHI0rYY2wljm548MSTM+Ljj/c6anqu2zQ==} + http-status@2.1.0: + resolution: {integrity: sha512-O5kPr7AW7wYd/BBiOezTwnVAnmSNFY+J7hlZD2X5IOxVBetjcHAiTXhzj0gMrnojQlwy+UT1/Y3H3vJ3UlmvLA==} engines: {node: '>= 0.4.0'} ieee754@1.2.1: @@ -1713,16 +2297,16 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + image-size@1.2.0: + resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} 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==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1739,8 +2323,8 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} is-alphabetical@2.0.1: @@ -1749,8 +2333,8 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: @@ -1759,41 +2343,42 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} 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==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - is-bun-module@1.2.1: - resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==} + is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-decimal@2.0.1: @@ -1803,11 +2388,12 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -1821,12 +2407,8 @@ packages: 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==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -1837,39 +2419,40 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 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==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 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-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} isarray@2.0.5: @@ -1881,8 +2464,8 @@ packages: isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - iterator.prototype@1.1.3: - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} jose@5.9.6: @@ -1899,8 +2482,8 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true @@ -1928,6 +2511,10 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + jsox@1.2.121: + resolution: {integrity: sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==} + hasBin: true + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -1954,11 +2541,11 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lexical@0.20.0: - resolution: {integrity: sha512-lJEHLFACXqRf3u/VlIOu9T7MJ51O4la92uOBwiS9Sx+juDK3Nrru5Vgl1aUirV1qK8XEM3h6Org2HcrsrzZ3ZA==} + lexical@0.21.0: + resolution: {integrity: sha512-Dxc5SCG4kB+wF+Rh55ism3SuecOKeOtCtGHFGKd6pj2QKVojtjkxGTQPMt7//2z5rMSue4R+hmRM0pCEZflupA==} - lib0@0.2.98: - resolution: {integrity: sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==} + lib0@0.2.99: + resolution: {integrity: sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==} engines: {node: '>=16'} hasBin: true @@ -1982,6 +2569,10 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} @@ -2010,8 +2601,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-core-commonmark@2.0.2: - resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-mdx-jsx@3.0.1: resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} @@ -2070,17 +2661,17 @@ packages: micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.3: - resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.1: - resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} @@ -2103,18 +2694,18 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - monaco-editor@0.52.0: - resolution: {integrity: sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==} + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} - mongodb-connection-string-url@3.0.1: - resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} - mongodb@6.10.0: - resolution: {integrity: sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==} + mongodb@6.12.0: + resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.1.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 gcp-metadata: ^5.2.0 kerberos: ^2.0.1 mongodb-client-encryption: '>=6.0.0 <7' @@ -2144,8 +2735,8 @@ packages: resolution: {integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==} engines: {node: '>=4.0.0'} - mongoose@8.8.1: - resolution: {integrity: sha512-l7DgeY1szT98+EKU8GYnga5WnyatAu+kOQ2VlVX1Mxif6A0Umt0YkSiksCiyGxzx8SPhGe9a53ND1GD4yVDrPA==} + mongoose@8.9.5: + resolution: {integrity: sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==} engines: {node: '>=16.20.1'} mpath@0.9.0: @@ -2159,27 +2750,27 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@15.0.3: - resolution: {integrity: sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==} + next@15.2.0: + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 '@playwright/test': ^1.41.2 babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-66855b96-20241106 - react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106 + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': @@ -2191,8 +2782,8 @@ packages: sass: optional: true - node-abi@3.71.0: - resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} + node-abi@3.74.0: + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} engines: {node: '>=10'} node-addon-api@6.1.0: @@ -2206,8 +2797,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -2217,8 +2808,8 @@ packages: object-to-formdata@4.5.1: resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} object.entries@1.1.8: @@ -2233,10 +2824,13 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -2248,6 +2842,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2256,12 +2854,15 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + 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-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -2289,17 +2890,59 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - payload@3.0.2: - resolution: {integrity: sha512-w7E+WI+tRlmiQVxHxLmTXIGrQTiNbmsCBohhJjXY5nMuKMt2AnV1SllX1z63gccXzyVvs+L+hSjdi0vuvegKzw==} + payload@3.25.0: + resolution: {integrity: sha512-azT1qtirV8QqIPpyWaxbF5TJPoWT5fpYoxin83wZxF5gmg0O06bL5YKCGFfCpzgCcw4FrFtLSzD68zGMc5m5Eg==} engines: {node: ^18.20.2 || >=20.9.0} hasBin: true peerDependencies: graphql: ^16.8.1 - peek-readable@5.3.1: - resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.7.0: + resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} + + 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.7.1: + resolution: {integrity: sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.7.1: + resolution: {integrity: sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ==} + + 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.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2329,16 +2972,51 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + 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.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} hasBin: true @@ -2346,8 +3024,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.5.2: + resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} engines: {node: '>=14'} hasBin: true @@ -2355,8 +3033,8 @@ packages: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} - process-warning@4.0.0: - resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -2379,9 +3057,6 @@ packages: 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==} @@ -2392,25 +3067,18 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-animate-height@2.1.2: - resolution: {integrity: sha512-A9jfz/4CTdsIsE7WCQtO9UkOpMBcBRh8LxyHl2eoZz1ki02jpyUL5xt58gabd0CyeLQ8fRyQ+s2lyV2Ufu8Owg==} - engines: {node: '>= 6.0.0'} + react-datepicker@7.6.0: + resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==} peerDependencies: - react: '>=15.6.2' - react-dom: '>=15.6.2' + react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-datepicker@6.9.0: - resolution: {integrity: sha512-QTxuzeem7BUfVFWv+g5WuvzT0c5BPo+XTCNbMTZKSZQLU+cMMwSUHwspaxuIcDlwNcOH0tiJ+bh1fJ2yxOGYWA==} + react-diff-viewer-continued@4.0.4: + resolution: {integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==} + engines: {node: '>= 16'} 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: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom@19.0.0: resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} @@ -2423,8 +3091,8 @@ packages: peerDependencies: react: '>=16.13.1' - react-error-boundary@4.0.13: - resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + react-error-boundary@4.1.2: + resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} peerDependencies: react: '>=16.13.1' @@ -2436,17 +3104,11 @@ packages: 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==} + react-select@5.9.0: + resolution: {integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==} peerDependencies: - react: ^15.5.x || ^16.x || ^17.x || ^18.x - react-dom: ^15.5.x || ^16.x || ^17.x || ^18.x - - 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: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} @@ -2470,15 +3132,15 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} require-from-string@2.0.2: @@ -2492,16 +3154,17 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} 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==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@3.0.2: @@ -2512,15 +3175,19 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} safe-stable-stringify@2.5.0: @@ -2535,9 +3202,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - scheduler@0.0.0-experimental-3edc000d-20240926: - resolution: {integrity: sha512-360BMNajOhMyrirau0pzWVgeakvrfjbfdqHnX2K+tSGTmn6tBN+6K5NhhaebqeXXWyCU3rl5FApjgF2GN0W5JA==} - scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} @@ -2551,8 +3215,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -2564,6 +3228,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -2580,8 +3248,20 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} sift@17.1.3: @@ -2605,8 +3285,8 @@ packages: sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - sonner@1.7.0: - resolution: {integrity: sha512-W6dH7m5MujEPyug3lpI2l3TC3Pp1+LTgK0Efg+IHDrBbtEjyCmCHHo6yfNBOsf1tFZ6zf+jceWwB38baC8yO9g==} + sonner@1.7.4: + resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -2615,10 +3295,17 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + 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'} + sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} @@ -2626,6 +3313,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} @@ -2633,26 +3323,27 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.20.2: - resolution: {integrity: sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==} + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} string.prototype.includes@2.0.1: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} 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==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -2715,11 +3406,11 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -2728,8 +3419,8 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - text-decoder@1.2.1: - resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -2737,30 +3428,39 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + 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==} + token-types@6.0.0: resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} engines: {node: '>=14.16'} - tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@1.4.0: - resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} - engines: {node: '>=16'} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-essentials@10.0.3: resolution: {integrity: sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==} @@ -2781,6 +3481,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.19.3: + resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -2792,20 +3497,20 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typescript@5.5.2: @@ -2817,11 +3522,12 @@ packages: resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} engines: {node: '>=18'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -2847,11 +3553,11 @@ packages: react: '>=18.0.0' scheduler: '>=0.19.0' - use-isomorphic-layout-effect@1.1.2: - resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + use-isomorphic-layout-effect@1.2.0: + resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -2866,6 +3572,10 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -2873,23 +3583,24 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - whatwg-url@13.0.0: - resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} - engines: {node: '>=16'} + whatwg-url@14.1.1: + resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} + engines: {node: '>=18'} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} - which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 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==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@2.0.2: @@ -2904,8 +3615,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2921,12 +3632,16 @@ packages: engines: {node: '>= 0.10.0'} hasBin: true + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yjs@13.6.20: - resolution: {integrity: sha512-Z2YZI+SYqK7XdWlloI3lhMiKnCdFCVC4PchpdO+mCYwtiTwncjUbnRK9R1JmkNfdmHyDXuWN3ibJAt0wsqTbLQ==} + yjs@13.6.23: + resolution: {integrity: sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} yocto-queue@0.1.0: @@ -2938,7 +3653,7 @@ packages: snapshots: - '@apidevtools/json-schema-ref-parser@11.7.2': + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 @@ -2950,18 +3665,18 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.26.2': + '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 - '@jridgewell/gen-mapping': 0.3.5 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + jsesc: 3.1.0 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -2969,45 +3684,47 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.2': + '@babel/parser@7.26.9': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.9 - '@babel/runtime@7.26.0': + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.9': + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 - '@babel/traverse@7.25.9': + '@babel/traverse@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 - debug: 4.3.7 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.0': + '@babel/types@7.26.9': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@dnd-kit/accessibility@3.1.0(react@19.0.0)': + '@date-fns/tz@1.2.0': {} + + '@dnd-kit/accessibility@3.1.1(react@19.0.0)': dependencies: react: 19.0.0 tslib: 2.8.1 '@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@dnd-kit/accessibility': 3.1.0(react@19.0.0) + '@dnd-kit/accessibility': 3.1.1(react@19.0.0) '@dnd-kit/utilities': 3.2.2(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -3025,6 +3742,8 @@ snapshots: react: 19.0.0 tslib: 2.8.1 + '@drizzle-team/brocli@0.10.2': {} + '@emnapi/runtime@1.3.1': dependencies: tslib: 2.8.1 @@ -3033,7 +3752,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -3046,7 +3765,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/cache@11.13.5': + '@emotion/cache@11.14.0': dependencies: '@emotion/memoize': 0.9.0 '@emotion/sheet': 1.4.0 @@ -3057,7 +3776,7 @@ snapshots: '@emotion/css@11.13.5': dependencies: '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.13.5 + '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 '@emotion/sheet': 1.4.0 '@emotion/utils': 1.4.2 @@ -3068,13 +3787,13 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.5(@types/react@19.0.1)(react@19.0.0)': + '@emotion/react@11.14.0(@types/react@19.0.1)(react@19.0.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.13.5 + '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 @@ -3096,7 +3815,7 @@ snapshots: '@emotion/unitless@0.10.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0)': + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.0.0)': dependencies: react: 19.0.0 @@ -3104,78 +3823,298 @@ snapshots: '@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.10.0 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/aix-ppc64@0.25.0': + 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-arm64@0.25.0': + 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-arm@0.25.0': + 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/android-x64@0.25.0': + 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-arm64@0.25.0': + 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/darwin-x64@0.25.0': + 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-arm64@0.25.0': + 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/freebsd-x64@0.25.0': + 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-arm64@0.25.0': + 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-arm@0.25.0': + 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-ia32@0.25.0': + 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-loong64@0.25.0': + 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-mips64el@0.25.0': + 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-ppc64@0.25.0': + 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-riscv64@0.25.0': + 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-s390x@0.25.0': + 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/linux-x64@0.25.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.0': + 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/netbsd-x64@0.25.0': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-arm64@0.25.0': + 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/openbsd-x64@0.25.0': + 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/sunos-x64@0.25.0': + 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-arm64@0.25.0': + 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-ia32@0.25.0': + 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 + '@esbuild/win32-x64@0.25.0': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -3186,11 +4125,11 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7 + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 @@ -3207,45 +4146,45 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/window-info@3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/core@1.6.8': + '@floating-ui/core@1.6.9': dependencies: - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.6.12': + '@floating-ui/dom@1.6.13': dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@floating-ui/dom': 1.6.12 + '@floating-ui/dom': 1.6.13 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react@0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.9 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) tabbable: 6.2.0 - '@floating-ui/utils@0.2.8': {} + '@floating-ui/utils@0.2.9': {} '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -3329,7 +4268,7 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 @@ -3348,201 +4287,200 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@lexical/clipboard@0.20.0': + '@lexical/clipboard@0.21.0': dependencies: - '@lexical/html': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/html': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/code@0.20.0': + '@lexical/code@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 prismjs: 1.29.0 - '@lexical/devtools-core@0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@lexical/devtools-core@0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@lexical/html': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/html': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@lexical/dragon@0.20.0': + '@lexical/dragon@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/hashtag@0.20.0': + '@lexical/hashtag@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/headless@0.20.0': + '@lexical/headless@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/history@0.20.0': + '@lexical/history@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/html@0.20.0': + '@lexical/html@0.21.0': dependencies: - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/link@0.20.0': + '@lexical/link@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/list@0.20.0': + '@lexical/list@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/mark@0.20.0': + '@lexical/mark@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/markdown@0.20.0': + '@lexical/markdown@0.21.0': dependencies: - '@lexical/code': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/text': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/code': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/rich-text': 0.21.0 + '@lexical/text': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/offset@0.20.0': + '@lexical/offset@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/overflow@0.20.0': + '@lexical/overflow@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/plain-text@0.20.0': + '@lexical/plain-text@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/react@0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.20)': + '@lexical/react@0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.23)': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/code': 0.20.0 - '@lexical/devtools-core': 0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/dragon': 0.20.0 - '@lexical/hashtag': 0.20.0 - '@lexical/history': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/markdown': 0.20.0 - '@lexical/overflow': 0.20.0 - '@lexical/plain-text': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/text': 0.20.0 - '@lexical/utils': 0.20.0 - '@lexical/yjs': 0.20.0(yjs@13.6.20) - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/code': 0.21.0 + '@lexical/devtools-core': 0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@lexical/dragon': 0.21.0 + '@lexical/hashtag': 0.21.0 + '@lexical/history': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/markdown': 0.21.0 + '@lexical/overflow': 0.21.0 + '@lexical/plain-text': 0.21.0 + '@lexical/rich-text': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/text': 0.21.0 + '@lexical/utils': 0.21.0 + '@lexical/yjs': 0.21.0(yjs@13.6.23) + lexical: 0.21.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 3.1.4(react@19.0.0) transitivePeerDependencies: - yjs - '@lexical/rich-text@0.20.0': + '@lexical/rich-text@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/selection@0.20.0': + '@lexical/selection@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/table@0.20.0': + '@lexical/table@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/text@0.20.0': + '@lexical/text@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/utils@0.20.0': + '@lexical/utils@0.21.0': dependencies: - '@lexical/list': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - lexical: 0.20.0 + '@lexical/list': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + lexical: 0.21.0 - '@lexical/yjs@0.20.0(yjs@13.6.20)': + '@lexical/yjs@0.21.0(yjs@13.6.23)': dependencies: - '@lexical/offset': 0.20.0 - '@lexical/selection': 0.20.0 - lexical: 0.20.0 - yjs: 13.6.20 + '@lexical/offset': 0.21.0 + '@lexical/selection': 0.21.0 + lexical: 0.21.0 + yjs: 13.6.23 - '@monaco-editor/loader@1.4.0(monaco-editor@0.52.0)': + '@monaco-editor/loader@1.5.0': dependencies: - monaco-editor: 0.52.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.0) - monaco-editor: 0.52.0 + '@monaco-editor/loader': 1.5.0 + monaco-editor: 0.52.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mongodb-js/saslprep@1.1.9': + '@mongodb-js/saslprep@1.2.0': dependencies: sparse-bitfield: 3.0.3 - '@next/env@15.0.3': {} + '@next/env@15.2.0': {} - '@next/eslint-plugin-next@15.0.3': + '@next/eslint-plugin-next@15.2.0': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.0.3': + '@next/swc-darwin-arm64@15.2.0': optional: true - '@next/swc-darwin-x64@15.0.3': + '@next/swc-darwin-x64@15.2.0': optional: true - '@next/swc-linux-arm64-gnu@15.0.3': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true - '@next/swc-linux-arm64-musl@15.0.3': + '@next/swc-linux-arm64-musl@15.2.0': optional: true - '@next/swc-linux-x64-gnu@15.0.3': + '@next/swc-linux-x64-gnu@15.2.0': optional: true - '@next/swc-linux-x64-musl@15.0.3': + '@next/swc-linux-x64-musl@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@15.0.3': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true - '@next/swc-win32-x64-msvc@15.0.3': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@nodelib/fs.scandir@2.1.5': @@ -3555,17 +4493,16 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@nolyfill/is-core-module@1.0.39': {} - '@payloadcms/db-mongodb@3.0.2(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))': + '@payloadcms/db-mongodb@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))': dependencies: - http-status: 1.6.2 - mongoose: 8.8.1 + mongoose: 8.9.5 mongoose-aggregate-paginate-v2: 1.1.2 mongoose-paginate-v2: 1.8.5 - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) prompts: 2.4.2 uuid: 10.0.0 transitivePeerDependencies: @@ -3578,36 +4515,118 @@ snapshots: - socks - supports-color - '@payloadcms/graphql@3.0.2(graphql@16.9.0)(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2)': + '@payloadcms/db-postgres@3.25.0(@types/react@19.0.1)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react@19.0.0)': dependencies: - graphql: 16.9.0 - graphql-scalars: 1.22.2(graphql@16.9.0) - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@payloadcms/drizzle': 3.25.0(@types/pg@8.10.2)(@types/react@19.0.1)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(pg@8.11.3)(react@19.0.0) + '@types/pg': 8.10.2 + console-table-printer: 2.12.1 + drizzle-kit: 0.28.0 + drizzle-orm: 0.36.1(@types/pg@8.10.2)(@types/react@19.0.1)(pg@8.11.3)(react@19.0.0) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) + pg: 8.11.3 + prompts: 2.4.2 + to-snake-case: 1.0.0 + uuid: 10.0.0 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/react' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bun-types + - expo-sqlite + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - react + - sql.js + - sqlite3 + - supports-color + + '@payloadcms/drizzle@3.25.0(@types/pg@8.10.2)(@types/react@19.0.1)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(pg@8.11.3)(react@19.0.0)': + dependencies: + console-table-printer: 2.12.1 + drizzle-orm: 0.36.1(@types/pg@8.10.2)(@types/react@19.0.1)(pg@8.11.3)(react@19.0.0) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) + prompts: 2.4.2 + to-snake-case: 1.0.0 + uuid: 9.0.0 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/react' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bun-types + - expo-sqlite + - knex + - kysely + - mysql2 + - pg + - postgres + - prisma + - react + - sql.js + - sqlite3 + + '@payloadcms/graphql@3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2)': + dependencies: + graphql: 16.10.0 + graphql-scalars: 1.22.2(graphql@16.10.0) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) pluralize: 8.0.0 ts-essentials: 10.0.3(typescript@5.5.2) tsx: 4.19.2 transitivePeerDependencies: - typescript - '@payloadcms/next@3.0.2(@types/react@19.0.1)(graphql@16.9.0)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': + '@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/graphql': 3.0.2(graphql@16.9.0)(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2) - '@payloadcms/translations': 3.0.2 - '@payloadcms/ui': 3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@payloadcms/graphql': 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) busboy: 1.6.0 + dequal: 2.0.3 file-type: 19.3.0 - graphql: 16.9.0 - graphql-http: 1.22.3(graphql@16.9.0) + graphql: 16.10.0 + graphql-http: 1.22.4(graphql@16.10.0) graphql-playground-html: 1.6.30 - http-status: 1.6.2 - next: 15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + http-status: 2.1.0 + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) path-to-regexp: 6.3.0 - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) qs-esm: 7.0.2 - react-diff-viewer-continued: 3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-diff-viewer-continued: 4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: 1.77.4 - sonner: 1.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -3617,41 +4636,43 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-multi-tenant@file:payloadcms-plugin-multi-tenant-3.15.1.tgz(@payloadcms/ui@3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))': + '@payloadcms/plugin-multi-tenant@3.25.0(@payloadcms/ui@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))': dependencies: - '@payloadcms/ui': 3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - next: 15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) - '@payloadcms/richtext-lexical@3.0.2(6qerb26rs4bgoavayjhmleobf4)': + '@payloadcms/richtext-lexical@3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)(yjs@13.6.23)': dependencies: '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/headless': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/react': 0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.20) - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - '@payloadcms/next': 3.0.2(@types/react@19.0.1)(graphql@16.9.0)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - '@payloadcms/translations': 3.0.2 - '@payloadcms/ui': 3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@lexical/headless': 0.21.0 + '@lexical/html': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/react': 0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.23) + '@lexical/rich-text': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/utils': 0.21.0 + '@payloadcms/next': 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) '@types/uuid': 10.0.0 acorn: 8.12.1 bson-objectid: 2.0.4 dequal: 2.0.3 escape-html: 1.0.3 - lexical: 0.20.0 + jsox: 1.2.121 + lexical: 0.21.0 mdast-util-from-markdown: 2.0.2 mdast-util-mdx-jsx: 3.1.3 micromark-extension-mdx-jsx: 3.0.1 - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-error-boundary: 4.0.13(react@19.0.0) + react-error-boundary: 4.1.2(react@19.0.0) ts-essentials: 10.0.3(typescript@5.5.2) uuid: 10.0.0 transitivePeerDependencies: @@ -3660,39 +4681,39 @@ snapshots: - next - supports-color - typescript + - yjs - '@payloadcms/translations@3.0.2': + '@payloadcms/translations@3.25.0': dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': + '@payloadcms/ui@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': dependencies: + '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/translations': 3.0.2 - body-scroll-lock: 4.0.0-beta.0 + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/window-info': 3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@monaco-editor/react': 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@payloadcms/translations': 3.25.0 bson-objectid: 2.0.4 date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 - next: 15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) object-to-formdata: 4.5.1 - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) qs-esm: 7.0.2 react: 19.0.0 - react-animate-height: 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-datepicker: 6.9.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-datepicker: 7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-dom: 19.0.0(react@19.0.0) react-image-crop: 10.1.8(react@19.0.0) - react-select: 5.8.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - scheduler: 0.0.0-experimental-3edc000d-20240926 - sonner: 1.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-select: 5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + scheduler: 0.25.0 + sonner: 1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) ts-essentials: 10.0.3(typescript@5.5.2) - use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.0.0-experimental-3edc000d-20240926) + use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.25.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -3702,62 +4723,62 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.10.4': {} + '@rushstack/eslint-patch@1.10.5': {} - '@swc/core-darwin-arm64@1.9.2': + '@swc/core-darwin-arm64@1.11.5': optional: true - '@swc/core-darwin-x64@1.9.2': + '@swc/core-darwin-x64@1.11.5': optional: true - '@swc/core-linux-arm-gnueabihf@1.9.2': + '@swc/core-linux-arm-gnueabihf@1.11.5': optional: true - '@swc/core-linux-arm64-gnu@1.9.2': + '@swc/core-linux-arm64-gnu@1.11.5': optional: true - '@swc/core-linux-arm64-musl@1.9.2': + '@swc/core-linux-arm64-musl@1.11.5': optional: true - '@swc/core-linux-x64-gnu@1.9.2': + '@swc/core-linux-x64-gnu@1.11.5': optional: true - '@swc/core-linux-x64-musl@1.9.2': + '@swc/core-linux-x64-musl@1.11.5': optional: true - '@swc/core-win32-arm64-msvc@1.9.2': + '@swc/core-win32-arm64-msvc@1.11.5': optional: true - '@swc/core-win32-ia32-msvc@1.9.2': + '@swc/core-win32-ia32-msvc@1.11.5': optional: true - '@swc/core-win32-x64-msvc@1.9.2': + '@swc/core-win32-x64-msvc@1.11.5': optional: true - '@swc/core@1.9.2(@swc/helpers@0.5.13)': + '@swc/core@1.11.5(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.17 + '@swc/types': 0.1.19 optionalDependencies: - '@swc/core-darwin-arm64': 1.9.2 - '@swc/core-darwin-x64': 1.9.2 - '@swc/core-linux-arm-gnueabihf': 1.9.2 - '@swc/core-linux-arm64-gnu': 1.9.2 - '@swc/core-linux-arm64-musl': 1.9.2 - '@swc/core-linux-x64-gnu': 1.9.2 - '@swc/core-linux-x64-musl': 1.9.2 - '@swc/core-win32-arm64-msvc': 1.9.2 - '@swc/core-win32-ia32-msvc': 1.9.2 - '@swc/core-win32-x64-msvc': 1.9.2 - '@swc/helpers': 0.5.13 + '@swc/core-darwin-arm64': 1.11.5 + '@swc/core-darwin-x64': 1.11.5 + '@swc/core-linux-arm-gnueabihf': 1.11.5 + '@swc/core-linux-arm64-gnu': 1.11.5 + '@swc/core-linux-arm64-musl': 1.11.5 + '@swc/core-linux-x64-gnu': 1.11.5 + '@swc/core-linux-x64-musl': 1.11.5 + '@swc/core-win32-arm64-msvc': 1.11.5 + '@swc/core-win32-ia32-msvc': 1.11.5 + '@swc/core-win32-x64-msvc': 1.11.5 + '@swc/helpers': 0.5.15 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.13': + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 - '@swc/types@0.1.17': + '@swc/types@0.1.19': dependencies: '@swc/counter': 0.1.3 @@ -3769,11 +4790,11 @@ snapshots: '@types/busboy@1.5.4': dependencies: - '@types/node': 22.9.1 + '@types/node': 22.13.5 '@types/debug@4.1.12': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 2.1.0 '@types/estree-jsx@1.0.5': dependencies: @@ -3789,25 +4810,31 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.13': {} + '@types/lodash@4.17.15': {} '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/ms@0.7.34': {} + '@types/ms@2.1.0': {} - '@types/node@22.9.1': + '@types/node@22.13.5': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 '@types/parse-json@4.0.2': {} + '@types/pg@8.10.2': + dependencies: + '@types/node': 22.13.5 + pg-protocol: 1.7.1 + pg-types: 4.0.2 + '@types/react-dom@19.0.1': dependencies: '@types/react': 19.0.1 - '@types/react-transition-group@4.4.11': + '@types/react-transition-group@4.4.12(@types/react@19.0.1)': dependencies: '@types/react': 19.0.1 @@ -3827,89 +4854,84 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/utils': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 8.25.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.0(typescript@5.5.2) - optionalDependencies: + ts-api-utils: 2.0.1(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2)': dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.3.7 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 eslint: 8.57.1 - optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.15.0': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.15.0(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/type-utils@8.25.0(eslint@8.57.1)(typescript@5.5.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.5.2) - '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.5.2) - debug: 4.3.7 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.5.2) + '@typescript-eslint/utils': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + debug: 4.4.0 eslint: 8.57.1 - ts-api-utils: 1.4.0(typescript@5.5.2) - optionalDependencies: + ts-api-utils: 2.0.1(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.5.2)': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.3.7 - fast-glob: 3.3.2 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.5.2) - optionalDependencies: + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.15.0(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/utils@8.25.0(eslint@8.57.1)(typescript@5.5.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.5.2) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.5.2) eslint: 8.57.1 - optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.15.0': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 - '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.3.0': {} acorn-jsx@5.3.2(acorn@8.14.0): dependencies: @@ -3929,7 +4951,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3948,78 +4970,79 @@ snapshots: aria-query@5.3.2: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bound: 1.0.3 + is-array-buffer: 3.0.5 array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} + async-function@1.0.0: {} + atomic-sleep@1.0.0: {} available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axe-core@4.10.2: {} @@ -4029,33 +5052,37 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 cosmiconfig: 7.1.0 - resolve: 1.22.8 + resolve: 1.22.10 balanced-match@1.0.2: {} - bare-events@2.5.0: + bare-events@2.5.4: optional: true - bare-fs@2.3.5: + bare-fs@4.0.1: dependencies: - bare-events: 2.5.0 - bare-path: 2.1.3 - bare-stream: 2.4.0 + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + transitivePeerDependencies: + - bare-buffer optional: true - bare-os@2.4.4: + bare-os@3.5.1: optional: true - bare-path@2.1.3: + bare-path@3.0.0: dependencies: - bare-os: 2.4.4 + bare-os: 3.5.1 optional: true - bare-stream@2.4.0: + bare-stream@2.6.5(bare-events@2.5.4): dependencies: - streamx: 2.20.2 + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 optional: true base64-js@1.5.1: {} @@ -4085,7 +5112,11 @@ snapshots: bson-objectid@2.0.4: {} - bson@6.10.0: {} + bson@6.10.3: {} + + buffer-from@1.1.2: {} + + buffer-writer@2.0.0: {} buffer@5.7.1: dependencies: @@ -4096,17 +5127,26 @@ snapshots: dependencies: streamsearch: 1.1.0 - call-bind@1.0.7: + call-bind-apply-helpers@1.0.2: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} - caniuse-lite@1.0.30001683: {} + caniuse-lite@1.0.30001701: {} ccount@2.0.1: {} @@ -4178,7 +5218,7 @@ snapshots: cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -4203,25 +5243,25 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - dataloader@2.2.2: {} + dataloader@2.2.3: {} date-fns@3.6.0: {} @@ -4233,7 +5273,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -4253,9 +5293,9 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-properties@1.2.1: dependencies: @@ -4283,18 +5323,40 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 csstype: 3.1.3 dotenv@8.6.0: {} + drizzle-kit@0.28.0: + dependencies: + '@drizzle-team/brocli': 0.10.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.36.1(@types/pg@8.10.2)(@types/react@19.0.1)(pg@8.11.3)(react@19.0.0): + optionalDependencies: + '@types/pg': 8.10.2 + '@types/react': 19.0.1 + pg: 8.11.3 + react: 19.0.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + emoji-regex@9.2.2: {} end-of-stream@1.4.4: dependencies: once: 1.4.0 - enhanced-resolve@5.17.1: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -4303,98 +5365,161 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.5: + es-abstract@1.23.9: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 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 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 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 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 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.3 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 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 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.0: + es-iterator-helpers@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.3 - safe-array-concat: 1.1.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild-register@3.6.0(esbuild@0.19.12): + dependencies: + debug: 4.4.0 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + + 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: @@ -4423,23 +5548,51 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} - eslint-config-next@15.0.3(eslint@8.57.1)(typescript@5.5.2): + eslint-config-next@15.2.0(eslint@8.57.1)(typescript@5.5.2): dependencies: - '@next/eslint-plugin-next': 15.0.3 - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.5.2) + '@next/eslint-plugin-next': 15.2.0 + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.8.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.2(eslint@8.57.1) - eslint-plugin-react-hooks: 5.0.0(eslint@8.57.1) + eslint-plugin-react: 7.37.4(eslint@8.57.1) + eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: @@ -4450,65 +5603,61 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.7 - enhanced-resolve: 5.17.1 + debug: 4.4.0 + enhanced-resolve: 5.18.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) - fast-glob: 3.3.2 - get-tsconfig: 4.8.1 - is-bun-module: 1.2.1 - is-glob: 4.0.3 + get-tsconfig: 4.10.0 + is-bun-module: 1.3.0 + stable-hash: 0.0.4 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.8.3)(eslint@8.57.1) transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.8.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.8 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -4518,7 +5667,7 @@ snapshots: dependencies: aria-query: 5.3.2 array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.2 axobject-query: 4.1.0 @@ -4530,21 +5679,21 @@ snapshots: language-tags: 1.0.9 minimatch: 3.1.2 object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 + safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.0.0(eslint@8.57.1): + eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-react@7.37.2(eslint@8.57.1): + eslint-plugin-react@7.37.4(eslint@8.57.1): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.0 + es-iterator-helpers: 1.2.1 eslint: 8.57.1 estraverse: 5.3.0 hasown: 2.0.2 @@ -4552,11 +5701,11 @@ snapshots: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.values: 1.2.0 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.11 + string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 eslint-scope@7.2.2: @@ -4577,11 +5726,11 @@ snapshots: '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.7 + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -4652,7 +5801,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -4668,13 +5817,13 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.3: {} + fast-uri@3.0.6: {} - fastq@1.17.1: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 - fdir@6.4.2(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -4701,17 +5850,17 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.3.2: {} + flatted@3.3.3: {} focus-trap@7.5.4: dependencies: tabbable: 6.2.0 - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -4724,28 +5873,44 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} - get-intrinsic@1.2.4: + get-intrinsic@1.3.0: dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 - get-symbol-description@1.0.2: + get-proto@1.0.1: dependencies: - call-bind: 1.0.7 + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 get-tsconfig@4.8.1: dependencies: @@ -4779,46 +5944,46 @@ snapshots: globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} - graphql-http@1.22.3(graphql@16.9.0): + graphql-http@1.22.4(graphql@16.10.0): dependencies: - graphql: 16.9.0 + graphql: 16.10.0 graphql-playground-html@1.6.30: dependencies: xss: 1.0.15 - graphql-scalars@1.22.2(graphql@16.9.0): + graphql-scalars@1.22.2(graphql@16.10.0): dependencies: - graphql: 16.9.0 + graphql: 16.10.0 tslib: 2.8.1 - graphql@16.9.0: {} + graphql@16.10.0: {} - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 - has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 hasown@2.0.2: dependencies: @@ -4830,19 +5995,19 @@ snapshots: dependencies: react-is: 16.13.1 - http-status@1.6.2: {} + http-status@2.1.0: {} ieee754@1.2.1: {} ignore@5.3.2: {} - image-size@1.1.1: + image-size@1.2.0: dependencies: queue: 6.0.2 immutable@4.3.7: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -4858,11 +6023,11 @@ snapshots: ini@1.3.8: {} - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 is-alphabetical@2.0.1: {} @@ -4871,63 +6036,74 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-async-function@2.0.0: + is-async-function@2.1.1: dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 - is-bigint@1.0.4: + is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-buffer@1.1.6: {} - is-bun-module@1.2.1: + is-bun-module@1.3.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 is-callable@1.2.7: {} - is-core-module@2.15.1: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-decimal@2.0.1: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: @@ -4937,49 +6113,53 @@ snapshots: is-map@2.0.3: {} - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-number@7.0.0: {} is-path-inside@3.0.3: {} - is-regex@1.1.4: + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 - is-string@1.0.7: + is-string@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-symbol@1.0.4: + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 is-weakmap@2.0.2: {} - is-weakref@1.0.2: + is-weakref@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 isarray@2.0.5: {} @@ -4987,12 +6167,13 @@ snapshots: isomorphic.js@0.2.5: {} - iterator.prototype@1.1.3: + iterator.prototype@1.1.5: dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 set-function-name: 2.0.2 jose@5.9.6: {} @@ -5005,7 +6186,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@3.0.2: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -5013,15 +6194,15 @@ snapshots: json-schema-to-typescript@15.0.3: dependencies: - '@apidevtools/json-schema-ref-parser': 11.7.2 + '@apidevtools/json-schema-ref-parser': 11.9.3 '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.15 is-glob: 4.0.3 js-yaml: 4.1.0 lodash: 4.17.21 minimist: 1.2.8 - prettier: 3.3.3 - tinyglobby: 0.2.10 + prettier: 3.5.2 + tinyglobby: 0.2.12 json-schema-traverse@0.4.1: {} @@ -5033,12 +6214,14 @@ snapshots: dependencies: minimist: 1.2.8 + jsox@1.2.121: {} + 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 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 kareem@2.6.3: {} @@ -5059,9 +6242,9 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lexical@0.20.0: {} + lexical@0.21.0: {} - lib0@0.2.98: + lib0@0.2.99: dependencies: isomorphic.js: 0.2.5 @@ -5081,6 +6264,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + math-intrinsics@1.1.0: {} + md5@2.3.0: dependencies: charenc: 0.0.2 @@ -5094,12 +6279,12 @@ snapshots: decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -5114,7 +6299,7 @@ snapshots: devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.1 + parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 @@ -5148,7 +6333,7 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -5163,9 +6348,9 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdx-jsx@3.0.1: dependencies: @@ -5178,21 +6363,21 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-mdx-expression@2.0.2: dependencies: @@ -5202,33 +6387,33 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -5238,12 +6423,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -5266,7 +6451,7 @@ snapshots: devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-util-html-tag-name@2.0.1: {} @@ -5277,7 +6462,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -5285,24 +6470,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.3: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.3.7 + debug: 4.4.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -5312,9 +6497,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -5337,28 +6522,28 @@ snapshots: mkdirp-classic@0.5.3: {} - monaco-editor@0.52.0: {} + monaco-editor@0.52.2: {} - mongodb-connection-string-url@3.0.1: + mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 - whatwg-url: 13.0.0 + whatwg-url: 14.1.1 - mongodb@6.10.0: + mongodb@6.12.0: dependencies: - '@mongodb-js/saslprep': 1.1.9 - bson: 6.10.0 - mongodb-connection-string-url: 3.0.1 + '@mongodb-js/saslprep': 1.2.0 + bson: 6.10.3 + mongodb-connection-string-url: 3.0.2 mongoose-aggregate-paginate-v2@1.1.2: {} mongoose-paginate-v2@1.8.5: {} - mongoose@8.8.1: + mongoose@8.9.5: dependencies: - bson: 6.10.0 + bson: 6.10.3 kareem: 2.6.3 - mongodb: 6.10.0 + mongodb: 6.12.0 mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -5377,47 +6562,47 @@ snapshots: mquery@5.0.0: dependencies: - debug: 4.3.7 + debug: 4.4.0 transitivePeerDependencies: - supports-color ms@2.1.3: {} - nanoid@3.3.7: {} + nanoid@3.3.8: {} - napi-build-utils@1.0.2: {} + napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} - next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: - '@next/env': 15.0.3 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.13 + '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001683 + caniuse-lite: 1.0.30001701 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.0.3 - '@next/swc-darwin-x64': 15.0.3 - '@next/swc-linux-arm64-gnu': 15.0.3 - '@next/swc-linux-arm64-musl': 15.0.3 - '@next/swc-linux-x64-gnu': 15.0.3 - '@next/swc-linux-x64-musl': 15.0.3 - '@next/swc-win32-arm64-msvc': 15.0.3 - '@next/swc-win32-x64-msvc': 15.0.3 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 sass: 1.77.4 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - node-abi@3.71.0: + node-abi@3.74.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 node-addon-api@6.1.0: {} @@ -5425,43 +6610,48 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} object-to-formdata@4.5.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 object.entries@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 - object.values@1.2.0: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 + + obuf@1.1.2: {} on-exit-leak-free@2.1.2: {} @@ -5478,6 +6668,12 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -5486,14 +6682,15 @@ snapshots: dependencies: p-limit: 3.1.0 + packet-reader@1.0.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-entities@4.0.1: + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 - character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 decode-named-character-reference: 1.0.2 @@ -5520,45 +6717,93 @@ snapshots: path-type@4.0.0: {} - payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2): + payload@3.25.0(graphql@16.10.0)(typescript@5.5.2): dependencies: - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@next/env': 15.0.3 - '@payloadcms/translations': 3.0.2 + '@next/env': 15.2.0 + '@payloadcms/translations': 3.25.0 '@types/busboy': 1.5.4 ajv: 8.17.1 bson-objectid: 2.0.4 + busboy: 1.6.0 ci-info: 4.1.0 console-table-printer: 2.12.1 croner: 9.0.0 - dataloader: 2.2.2 + dataloader: 2.2.3 deepmerge: 4.3.1 file-type: 19.3.0 get-tsconfig: 4.8.1 - graphql: 16.9.0 - http-status: 1.6.2 - image-size: 1.1.1 + graphql: 16.10.0 + http-status: 2.1.0 + image-size: 1.2.0 jose: 5.9.6 json-schema-to-typescript: 15.0.3 minimist: 1.2.8 + path-to-regexp: 6.3.0 pino: 9.5.0 pino-pretty: 13.0.0 pluralize: 8.0.0 + qs-esm: 7.0.2 sanitize-filename: 1.6.3 scmp: 2.1.0 ts-essentials: 10.0.3(typescript@5.5.2) tsx: 4.19.2 uuid: 10.0.0 - ws: 8.18.0 + ws: 8.18.1 transitivePeerDependencies: - bufferutil - - monaco-editor - - react - - react-dom - typescript - utf-8-validate - peek-readable@5.3.1: {} + peek-readable@5.4.2: {} + + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.7.0: {} + + pg-int8@1.0.1: {} + + pg-numeric@1.0.2: {} + + pg-pool@3.7.1(pg@8.11.3): + dependencies: + pg: 8.11.3 + + pg-protocol@1.7.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.7.0 + pg-pool: 3.7.1(pg@8.11.3) + pg-protocol: 1.7.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.1.1: {} @@ -5595,7 +6840,7 @@ snapshots: on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.0 + process-warning: 4.0.1 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 @@ -5604,36 +6849,58 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} postcss@8.4.31: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.2: + 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.3: 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.71.0 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.1 + tar-fs: 2.1.2 tunnel-agent: 0.6.0 prelude-ls@1.2.1: {} - prettier@3.3.3: {} + prettier@3.5.2: {} prismjs@1.29.0: {} - process-warning@4.0.0: {} + process-warning@4.0.1: {} prompts@2.4.2: dependencies: @@ -5657,8 +6924,6 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - queue@6.0.2: dependencies: inherits: 2.0.4 @@ -5672,33 +6937,25 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-animate-height@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-datepicker@7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - classnames: 2.5.1 - prop-types: 15.8.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - react-datepicker@6.9.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/react': 0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 date-fns: 3.6.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-onclickoutside: 6.13.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-diff-viewer-continued@3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-diff-viewer-continued@4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@emotion/css': 11.13.5 + '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) classnames: 2.5.1 diff: 5.2.0 memoize-one: 6.0.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: + - '@types/react' - supports-color react-dom@19.0.0(react@19.0.0): @@ -5708,12 +6965,12 @@ snapshots: react-error-boundary@3.1.4(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 - react-error-boundary@4.0.13(react@19.0.0): + react-error-boundary@4.1.2(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-image-crop@10.1.8(react@19.0.0): @@ -5722,31 +6979,26 @@ snapshots: react-is@16.13.1: {} - react-onclickoutside@6.13.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-select@5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - react-select@5.8.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@babel/runtime': 7.26.0 - '@emotion/cache': 11.13.5 - '@emotion/react': 11.13.5(@types/react@19.0.1)(react@19.0.0) - '@floating-ui/dom': 1.6.12 - '@types/react-transition-group': 4.4.11 + '@babel/runtime': 7.26.9 + '@emotion/cache': 11.14.0 + '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) + '@floating-ui/dom': 1.6.13 + '@types/react-transition-group': 4.4.12(@types/react@19.0.1) memoize-one: 6.0.0 prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - use-isomorphic-layout-effect: 1.1.2(@types/react@19.0.1)(react@19.0.0) + use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.1)(react@19.0.0) transitivePeerDependencies: - '@types/react' - supports-color react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -5767,23 +7019,26 @@ snapshots: real-require@0.2.0: {} - reflect.getprototypeof@1.0.6: + reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.3: + regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 set-function-name: 2.0.2 require-from-string@2.0.2: {} @@ -5792,19 +7047,19 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} rimraf@3.0.2: dependencies: @@ -5814,20 +7069,26 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - is-regex: 1.1.4 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 safe-stable-stringify@2.5.0: {} @@ -5841,8 +7102,6 @@ snapshots: immutable: 4.3.7 source-map-js: 1.2.1 - scheduler@0.0.0-experimental-3edc000d-20240926: {} - scheduler@0.25.0: {} scmp@2.1.0: {} @@ -5851,15 +7110,15 @@ snapshots: semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.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 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -5869,22 +7128,30 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + 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 + prebuild-install: 7.1.3 + semver: 7.7.1 simple-get: 4.0.1 - tar-fs: 3.0.6 + tar-fs: 3.0.8 tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-buffer sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.3 + semver: 7.7.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -5913,12 +7180,33 @@ snapshots: shebang-regex@3.0.0: {} - side-channel@1.0.6: + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.3 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 sift@17.1.3: {} @@ -5942,77 +7230,90 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@1.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) source-map-js@1.2.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: {} + sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 split2@4.2.0: {} + stable-hash@0.0.4: {} + state-local@1.0.7: {} streamsearch@1.1.0: {} - streamx@2.20.2: + streamx@2.22.0: dependencies: fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.2.1 + text-decoder: 1.2.3 optionalDependencies: - bare-events: 2.5.0 + bare-events: 2.5.4 string.prototype.includes@2.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 - string.prototype.matchall@4.0.11: + string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 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.3 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string_decoder@1.3.0: dependencies: @@ -6036,7 +7337,7 @@ snapshots: strtok3@8.1.0: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.3.1 + peek-readable: 5.4.2 styled-jsx@5.1.6(react@19.0.0): dependencies: @@ -6055,20 +7356,22 @@ snapshots: tapable@2.2.1: {} - tar-fs@2.1.1: + tar-fs@2.1.2: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.2 tar-stream: 2.2.0 - tar-fs@3.0.6: + tar-fs@3.0.8: dependencies: pump: 3.0.2 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 + bare-fs: 4.0.1 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer tar-stream@2.2.0: dependencies: @@ -6082,9 +7385,11 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.20.2 + streamx: 2.22.0 - text-decoder@1.2.1: {} + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 text-table@0.2.0: {} @@ -6092,21 +7397,31 @@ snapshots: dependencies: real-require: 0.2.0 - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + 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 + token-types@6.0.0: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - tr46@4.1.1: + tr46@5.0.0: dependencies: punycode: 2.3.1 @@ -6114,7 +7429,7 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@1.4.0(typescript@5.5.2): + ts-api-utils@2.0.1(typescript@5.5.2): dependencies: typescript: 5.5.2 @@ -6134,7 +7449,14 @@ snapshots: tsx@4.19.2: dependencies: esbuild: 0.23.1 - get-tsconfig: 4.8.1 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + + tsx@4.19.3: + dependencies: + esbuild: 0.25.0 + get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 @@ -6148,50 +7470,51 @@ snapshots: type-fest@0.20.2: {} - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: 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 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.4: 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 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: + typed-array-length@1.0.7: 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 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 typescript@5.5.2: {} uint8array-extras@1.4.0: {} - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 - undici-types@6.19.8: {} + undici-types@6.20.0: {} unist-util-is@6.0.0: dependencies: @@ -6220,12 +7543,12 @@ snapshots: dependencies: punycode: 2.3.1 - use-context-selector@2.0.0(react@19.0.0)(scheduler@0.0.0-experimental-3edc000d-20240926): + use-context-selector@2.0.0(react@19.0.0)(scheduler@0.25.0): dependencies: react: 19.0.0 - scheduler: 0.0.0-experimental-3edc000d-20240926 + scheduler: 0.25.0 - use-isomorphic-layout-effect@1.1.2(@types/react@19.0.1)(react@19.0.0): + use-isomorphic-layout-effect@1.2.0(@types/react@19.0.1)(react@19.0.0): dependencies: react: 19.0.0 optionalDependencies: @@ -6237,6 +7560,8 @@ snapshots: uuid@10.0.0: {} + uuid@9.0.0: {} + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -6244,47 +7569,49 @@ snapshots: webidl-conversions@7.0.0: {} - whatwg-url@13.0.0: + whatwg-url@14.1.1: dependencies: - tr46: 4.1.1 + tr46: 5.0.0 webidl-conversions: 7.0.0 - which-boxed-primitive@1.0.2: + which-boxed-primitive@1.1.1: 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 + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-builtin-type@1.1.4: + which-builtin-type@1.2.1: dependencies: - function.prototype.name: 1.1.6 + call-bound: 1.0.3 + function.prototype.name: 1.1.8 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 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 isarray: 2.0.5 - which-boxed-primitive: 1.0.2 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 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 + is-weakset: 2.0.4 - which-typed-array@1.1.15: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.5 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@2.0.2: @@ -6295,18 +7622,20 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.0: {} + ws@8.18.1: {} xss@1.0.15: dependencies: commander: 2.20.3 cssfilter: 0.0.10 + xtend@4.0.2: {} + yaml@1.10.2: {} - yjs@13.6.20: + yjs@13.6.23: dependencies: - lib0: 0.2.98 + lib0: 0.2.99 yocto-queue@0.1.0: {} diff --git a/examples/multi-tenant/src/app/(app)/page.tsx b/examples/multi-tenant/src/app/(app)/page.tsx index 2011e90eea..2979bf4369 100644 --- a/examples/multi-tenant/src/app/(app)/page.tsx +++ b/examples/multi-tenant/src/app/(app)/page.tsx @@ -10,10 +10,10 @@ export default async ({ params: paramsPromise }: { params: Promise<{ slug: strin

When you visit a tenant by domain, the domain is used to determine the tenant.

For example, visiting{' '} - - http://gold.test:3000/tenant-domains/login + + http://gold.localhost:3000/tenant-domains/login {' '} - will show the tenant with the domain "gold.test". + will show the tenant with the domain "gold.localhost".

Slugs

diff --git a/examples/multi-tenant/src/app/(payload)/admin/importMap.js b/examples/multi-tenant/src/app/(payload)/admin/importMap.js index 694b5399ad..a17baac94a 100644 --- a/examples/multi-tenant/src/app/(payload)/admin/importMap.js +++ b/examples/multi-tenant/src/app/(payload)/admin/importMap.js @@ -1,12 +1,9 @@ import { TenantField as TenantField_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' -import { TenantSelector as TenantSelector_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc' -import { TenantSelectionProvider as TenantSelectionProvider_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' +import { TenantSelector as TenantSelector_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' +import { TenantSelectionProvider as TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc' export const importMap = { - '@payloadcms/plugin-multi-tenant/client#TenantField': - TenantField_1d0591e3cf4f332c83a86da13a0de59a, - '@payloadcms/plugin-multi-tenant/rsc#TenantSelector': - TenantSelector_d6d5f193a167989e2ee7d14202901e62, - '@payloadcms/plugin-multi-tenant/client#TenantSelectionProvider': - TenantSelectionProvider_1d0591e3cf4f332c83a86da13a0de59a, + "@payloadcms/plugin-multi-tenant/client#TenantField": TenantField_1d0591e3cf4f332c83a86da13a0de59a, + "@payloadcms/plugin-multi-tenant/client#TenantSelector": TenantSelector_1d0591e3cf4f332c83a86da13a0de59a, + "@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider": TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 } diff --git a/examples/multi-tenant/src/collections/Pages/hooks/ensureUniqueSlug.ts b/examples/multi-tenant/src/collections/Pages/hooks/ensureUniqueSlug.ts index 55826874f5..6f0ebbacdd 100644 --- a/examples/multi-tenant/src/collections/Pages/hooks/ensureUniqueSlug.ts +++ b/examples/multi-tenant/src/collections/Pages/hooks/ensureUniqueSlug.ts @@ -1,8 +1,9 @@ -import type { FieldHook } from 'payload' +import type { FieldHook, Where } from 'payload' import { ValidationError } from 'payload' import { getUserTenantIDs } from '../../../utilities/getUserTenantIDs' +import { extractID } from '@/utilities/extractID' export const ensureUniqueSlug: FieldHook = async ({ data, originalDoc, req, value }) => { // if value is unchanged, skip validation @@ -10,26 +11,30 @@ export const ensureUniqueSlug: FieldHook = async ({ data, originalDoc, req, valu return value } - const incomingTenantID = typeof data?.tenant === 'object' ? data.tenant.id : data?.tenant - const currentTenantID = - typeof originalDoc?.tenant === 'object' ? originalDoc.tenant.id : originalDoc?.tenant + const constraints: Where[] = [ + { + slug: { + equals: value, + }, + }, + ] + + const incomingTenantID = extractID(data?.tenant) + const currentTenantID = extractID(originalDoc?.tenant) const tenantIDToMatch = incomingTenantID || currentTenantID + if (tenantIDToMatch) { + constraints.push({ + tenant: { + equals: tenantIDToMatch, + }, + }) + } + const findDuplicatePages = await req.payload.find({ collection: 'pages', where: { - and: [ - { - tenant: { - equals: tenantIDToMatch, - }, - }, - { - slug: { - equals: value, - }, - }, - ], + and: constraints, }, }) diff --git a/examples/multi-tenant/src/collections/Users/access/read.ts b/examples/multi-tenant/src/collections/Users/access/read.ts index c81e836009..235379089b 100644 --- a/examples/multi-tenant/src/collections/Users/access/read.ts +++ b/examples/multi-tenant/src/collections/Users/access/read.ts @@ -1,11 +1,11 @@ import type { User } from '@/payload-types' import type { Access, Where } from 'payload' - -import { parseCookies } from 'payload' +import { getTenantFromCookie } from '@payloadcms/plugin-multi-tenant/utilities' import { isSuperAdmin } from '../../../access/isSuperAdmin' import { getUserTenantIDs } from '../../../utilities/getUserTenantIDs' import { isAccessingSelf } from './isAccessingSelf' +import { getCollectionIDType } from '@/utilities/getCollectionIDType' export const readAccess: Access = ({ req, id }) => { if (!req?.user) { @@ -16,9 +16,11 @@ export const readAccess: Access = ({ req, id }) => { return true } - const cookies = parseCookies(req.headers) const superAdmin = isSuperAdmin(req.user) - const selectedTenant = cookies.get('payload-tenant') + const selectedTenant = getTenantFromCookie( + req.headers, + getCollectionIDType({ payload: req.payload, collectionSlug: 'tenants' }), + ) const adminTenantAccessIDs = getUserTenantIDs(req.user, 'tenant-admin') if (selectedTenant) { diff --git a/examples/multi-tenant/src/collections/Users/hooks/ensureUniqueUsername.ts b/examples/multi-tenant/src/collections/Users/hooks/ensureUniqueUsername.ts index 7c5d8ae5eb..787e210715 100644 --- a/examples/multi-tenant/src/collections/Users/hooks/ensureUniqueUsername.ts +++ b/examples/multi-tenant/src/collections/Users/hooks/ensureUniqueUsername.ts @@ -1,8 +1,11 @@ -import type { FieldHook } from 'payload' +import type { FieldHook, Where } from 'payload' import { ValidationError } from 'payload' import { getUserTenantIDs } from '../../../utilities/getUserTenantIDs' +import { extractID } from '@/utilities/extractID' +import { getTenantFromCookie } from '@payloadcms/plugin-multi-tenant/utilities' +import { getCollectionIDType } from '@/utilities/getCollectionIDType' export const ensureUniqueUsername: FieldHook = async ({ data, originalDoc, req, value }) => { // if value is unchanged, skip validation @@ -10,26 +13,31 @@ export const ensureUniqueUsername: FieldHook = async ({ data, originalDoc, req, return value } - const incomingTenantID = typeof data?.tenant === 'object' ? data.tenant.id : data?.tenant - const currentTenantID = - typeof originalDoc?.tenant === 'object' ? originalDoc.tenant.id : originalDoc?.tenant - const tenantIDToMatch = incomingTenantID || currentTenantID + const constraints: Where[] = [ + { + username: { + equals: value, + }, + }, + ] + + const selectedTenant = getTenantFromCookie( + req.headers, + getCollectionIDType({ payload: req.payload, collectionSlug: 'tenants' }), + ) + + if (selectedTenant) { + constraints.push({ + 'tenants.tenant': { + equals: selectedTenant, + }, + }) + } const findDuplicateUsers = await req.payload.find({ collection: 'users', where: { - and: [ - { - 'tenants.tenant': { - equals: tenantIDToMatch, - }, - }, - { - username: { - equals: value, - }, - }, - ], + and: constraints, }, }) @@ -39,7 +47,8 @@ export const ensureUniqueUsername: FieldHook = async ({ data, originalDoc, req, // provide a more specific error message if (req.user.roles?.includes('super-admin') || tenantIDs.length > 1) { const attemptedTenantChange = await req.payload.findByID({ - id: tenantIDToMatch, + // @ts-ignore - selectedTenant will match DB ID type + id: selectedTenant, collection: 'tenants', }) diff --git a/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts b/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts index 229d0500ad..fe01891054 100644 --- a/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts +++ b/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts @@ -1,7 +1,6 @@ import type { CollectionAfterLoginHook } from 'payload' -import { mergeHeaders } from '@payloadcms/next/utilities' -import { generateCookie, getCookieExpiration } from 'payload' +import { mergeHeaders, generateCookie, getCookieExpiration } from 'payload' export const setCookieBasedOnDomain: CollectionAfterLoginHook = async ({ req, user }) => { const relatedOrg = await req.payload.find({ @@ -22,7 +21,7 @@ export const setCookieBasedOnDomain: CollectionAfterLoginHook = async ({ req, us expires: getCookieExpiration({ seconds: 7200 }), path: '/', returnCookieAsObject: false, - value: relatedOrg.docs[0].id, + value: String(relatedOrg.docs[0].id), }) // Merge existing responseHeaders with the new Set-Cookie header diff --git a/examples/multi-tenant/src/payload-types.ts b/examples/multi-tenant/src/payload-types.ts index c343c7998f..7b62e9a168 100644 --- a/examples/multi-tenant/src/payload-types.ts +++ b/examples/multi-tenant/src/payload-types.ts @@ -6,10 +6,65 @@ * and re-run `payload generate:types` to regenerate this file. */ +/** + * Supported timezones in IANA format. + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "supportedTimezones". + */ +export type SupportedTimezones = + | 'Pacific/Midway' + | 'Pacific/Niue' + | 'Pacific/Honolulu' + | 'Pacific/Rarotonga' + | 'America/Anchorage' + | 'Pacific/Gambier' + | 'America/Los_Angeles' + | 'America/Tijuana' + | 'America/Denver' + | 'America/Phoenix' + | 'America/Chicago' + | 'America/Guatemala' + | 'America/New_York' + | 'America/Bogota' + | 'America/Caracas' + | 'America/Santiago' + | 'America/Buenos_Aires' + | 'America/Sao_Paulo' + | 'Atlantic/South_Georgia' + | 'Atlantic/Azores' + | 'Atlantic/Cape_Verde' + | 'Europe/London' + | 'Europe/Berlin' + | 'Africa/Lagos' + | 'Europe/Athens' + | 'Africa/Cairo' + | 'Europe/Moscow' + | 'Asia/Riyadh' + | 'Asia/Dubai' + | 'Asia/Baku' + | 'Asia/Karachi' + | 'Asia/Tashkent' + | 'Asia/Calcutta' + | 'Asia/Dhaka' + | 'Asia/Almaty' + | 'Asia/Jakarta' + | 'Asia/Bangkok' + | 'Asia/Shanghai' + | 'Asia/Singapore' + | 'Asia/Tokyo' + | 'Asia/Seoul' + | 'Australia/Sydney' + | 'Pacific/Guam' + | 'Pacific/Noumea' + | 'Pacific/Auckland' + | 'Pacific/Fiji'; + export interface Config { auth: { users: UserAuthOperations; }; + blocks: {}; collections: { pages: Page; users: User; @@ -28,7 +83,7 @@ export interface Config { 'payload-migrations': PayloadMigrationsSelect | PayloadMigrationsSelect; }; db: { - defaultIDType: string; + defaultIDType: number; }; globals: {}; globalsSelect: {}; @@ -64,8 +119,8 @@ export interface UserAuthOperations { * via the `definition` "pages". */ export interface Page { - id: string; - tenant?: (string | null) | Tenant; + id: number; + tenant?: (number | null) | Tenant; title?: string | null; slug?: string | null; updatedAt: string; @@ -76,7 +131,7 @@ export interface Page { * via the `definition` "tenants". */ export interface Tenant { - id: string; + id: number; name: string; /** * Used for domain-based tenant handling @@ -98,12 +153,12 @@ export interface Tenant { * via the `definition` "users". */ export interface User { - id: string; + id: number; roles?: ('super-admin' | 'user')[] | null; username?: string | null; tenants?: | { - tenant: string | Tenant; + tenant: number | Tenant; roles: ('tenant-admin' | 'tenant-viewer')[]; id?: string | null; }[] @@ -124,24 +179,24 @@ export interface User { * via the `definition` "payload-locked-documents". */ export interface PayloadLockedDocument { - id: string; + id: number; document?: | ({ relationTo: 'pages'; - value: string | Page; + value: number | Page; } | null) | ({ relationTo: 'users'; - value: string | User; + value: number | User; } | null) | ({ relationTo: 'tenants'; - value: string | Tenant; + value: number | Tenant; } | null); globalSlug?: string | null; user: { relationTo: 'users'; - value: string | User; + value: number | User; }; updatedAt: string; createdAt: string; @@ -151,10 +206,10 @@ export interface PayloadLockedDocument { * via the `definition` "payload-preferences". */ export interface PayloadPreference { - id: string; + id: number; user: { relationTo: 'users'; - value: string | User; + value: number | User; }; key?: string | null; value?: @@ -174,7 +229,7 @@ export interface PayloadPreference { * via the `definition` "payload-migrations". */ export interface PayloadMigration { - id: string; + id: number; name?: string | null; batch?: number | null; updatedAt: string; diff --git a/examples/multi-tenant/src/payload.config.ts b/examples/multi-tenant/src/payload.config.ts index c7ce37f678..9d464800ce 100644 --- a/examples/multi-tenant/src/payload.config.ts +++ b/examples/multi-tenant/src/payload.config.ts @@ -1,4 +1,5 @@ import { mongooseAdapter } from '@payloadcms/db-mongodb' +import { postgresAdapter } from '@payloadcms/db-postgres' import { lexicalEditor } from '@payloadcms/richtext-lexical' import path from 'path' import { buildConfig } from 'payload' @@ -11,6 +12,7 @@ import { multiTenantPlugin } from '@payloadcms/plugin-multi-tenant' import { isSuperAdmin } from './access/isSuperAdmin' import type { Config } from './payload-types' import { getUserTenantIDs } from './utilities/getUserTenantIDs' +import { seed } from './seed' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -21,9 +23,19 @@ export default buildConfig({ user: 'users', }, collections: [Pages, Users, Tenants], - db: mongooseAdapter({ - url: process.env.DATABASE_URI as string, + // db: mongooseAdapter({ + // url: process.env.DATABASE_URI as string, + // }), + db: postgresAdapter({ + pool: { + connectionString: process.env.POSTGRES_URL, + }, }), + onInit: async (args) => { + if (process.env.SEED_DB) { + await seed(args) + } + }, editor: lexicalEditor({}), graphQL: { schemaOutputFile: path.resolve(dirname, 'generated-schema.graphql'), diff --git a/examples/multi-tenant/src/migrations/seed.ts b/examples/multi-tenant/src/seed.ts similarity index 91% rename from examples/multi-tenant/src/migrations/seed.ts rename to examples/multi-tenant/src/seed.ts index 21d4bb73c2..78cf44bef9 100644 --- a/examples/multi-tenant/src/migrations/seed.ts +++ b/examples/multi-tenant/src/seed.ts @@ -1,12 +1,12 @@ -import type { MigrateUpArgs } from '@payloadcms/db-mongodb' +import { Config } from 'payload' -export async function up({ payload }: MigrateUpArgs): Promise { +export const seed: NonNullable = async (payload): Promise => { const tenant1 = await payload.create({ collection: 'tenants', data: { name: 'Tenant 1', slug: 'gold', - domain: 'gold.test', + domain: 'gold.localhost', }, }) @@ -15,7 +15,7 @@ export async function up({ payload }: MigrateUpArgs): Promise { data: { name: 'Tenant 2', slug: 'silver', - domain: 'silver.test', + domain: 'silver.localhost', }, }) @@ -24,7 +24,7 @@ export async function up({ payload }: MigrateUpArgs): Promise { data: { name: 'Tenant 3', slug: 'bronze', - domain: 'bronze.test', + domain: 'bronze.localhost', }, }) diff --git a/examples/multi-tenant/src/utilities/getCollectionIDType.ts b/examples/multi-tenant/src/utilities/getCollectionIDType.ts new file mode 100644 index 0000000000..02ed72f73d --- /dev/null +++ b/examples/multi-tenant/src/utilities/getCollectionIDType.ts @@ -0,0 +1,9 @@ +import type { CollectionSlug, Payload } from 'payload' + +type Args = { + collectionSlug: CollectionSlug + payload: Payload +} +export const getCollectionIDType = ({ collectionSlug, payload }: Args): 'number' | 'text' => { + return payload.collections[collectionSlug]?.customIDType ?? payload.db.defaultIDType +} diff --git a/next.config.mjs b/next.config.mjs index c05dd022f1..07ee236932 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -20,6 +20,7 @@ const config = withBundleAnalyzer( ignoreBuildErrors: true, }, experimental: { + fullySpecified: true, serverActions: { bodySizeLimit: '5mb', }, diff --git a/package.json b/package.json index 9c4336508d..b797ad9ea8 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,12 @@ { "name": "payload-monorepo", - "version": "3.24.0", + "version": "3.27.0", "private": true, "type": "module", "scripts": { "bf": "pnpm run build:force", "build": "pnpm run build:core", + "build:admin-bar": "turbo build --filter \"@payloadcms/admin-bar\"", "build:all": "turbo build", "build:app": "next build", "build:app:analyze": "cross-env ANALYZE=true next build", @@ -33,6 +34,7 @@ "build:payload-cloud": "turbo build --filter \"@payloadcms/payload-cloud\"", "build:plugin-cloud-storage": "turbo build --filter \"@payloadcms/plugin-cloud-storage\"", "build:plugin-form-builder": "turbo build --filter \"@payloadcms/plugin-form-builder\"", + "build:plugin-import-export": "turbo build --filter \"@payloadcms/plugin-import-export\"", "build:plugin-multi-tenant": "turbo build --filter \"@payloadcms/plugin-multi-tenant\"", "build:plugin-nested-docs": "turbo build --filter \"@payloadcms/plugin-nested-docs\"", "build:plugin-redirects": "turbo build --filter \"@payloadcms/plugin-redirects\"", @@ -79,10 +81,9 @@ "prepare": "husky", "prepare-run-test-against-prod": "pnpm bf && rm -rf test/packed && rm -rf test/node_modules && rm -rf app && rm -f test/pnpm-lock.yaml && pnpm run script:pack --all --no-build --dest test/packed && pnpm runts test/setupProd.ts && cd test && pnpm i --ignore-workspace && cd ..", "prepare-run-test-against-prod:ci": "rm -rf test/node_modules && rm -rf app && rm -f test/pnpm-lock.yaml && pnpm run script:pack --all --no-build --dest test/packed && pnpm runts test/setupProd.ts && cd test && pnpm i --ignore-workspace && cd ..", + "publish-prerelease": "pnpm --filter releaser publish-prerelease", "reinstall": "pnpm clean:all && pnpm install", "release": "pnpm --filter releaser release --tag latest", - "release:beta": "pnpm runts ./scripts/release.ts --bump prerelease --tag beta", - "release:canary": "pnpm --filter releaser release:canary", "runts": "cross-env NODE_OPTIONS=--no-deprecation node --no-deprecation --import @swc-node/register/esm-register", "script:build-template-with-local-pkgs": "pnpm --filter scripts build-template-with-local-pkgs", "script:gen-templates": "pnpm --filter scripts gen-templates", @@ -117,7 +118,7 @@ "devDependencies": { "@jest/globals": "29.7.0", "@libsql/client": "0.14.0", - "@next/bundle-analyzer": "15.1.5", + "@next/bundle-analyzer": "15.2.1", "@payloadcms/db-postgres": "workspace:*", "@payloadcms/eslint-config": "workspace:*", "@payloadcms/eslint-plugin": "workspace:*", @@ -132,8 +133,8 @@ "@types/jest": "29.5.12", "@types/minimist": "1.2.5", "@types/node": "22.5.4", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "@types/shelljs": "0.8.15", "chalk": "^4.1.2", "comment-json": "^4.2.3", @@ -153,7 +154,7 @@ "lint-staged": "15.2.7", "minimist": "1.2.8", "mongodb-memory-server": "^10", - "next": "15.1.5", + "next": "15.2.1", "open": "^10.1.0", "p-limit": "^5.0.0", "playwright": "1.50.0", @@ -173,10 +174,6 @@ "turbo": "^2.3.3", "typescript": "5.7.3" }, - "peerDependencies": { - "react": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020", - "react-dom": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020" - }, "packageManager": "pnpm@9.7.1", "engines": { "node": "^18.20.2 || >=20.9.0", diff --git a/packages/admin-bar/.prettierignore b/packages/admin-bar/.prettierignore new file mode 100644 index 0000000000..247f3f12de --- /dev/null +++ b/packages/admin-bar/.prettierignore @@ -0,0 +1,10 @@ +.tmp +**/.git +**/.hg +**/.pnp.* +**/.svn +**/.yarn/** +**/build +**/dist/** +**/node_modules +**/temp diff --git a/packages/admin-bar/.swcrc b/packages/admin-bar/.swcrc new file mode 100644 index 0000000000..b4fb882caa --- /dev/null +++ b/packages/admin-bar/.swcrc @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "sourceMaps": true, + "jsc": { + "target": "esnext", + "parser": { + "syntax": "typescript", + "tsx": true, + "dts": true + }, + "transform": { + "react": { + "runtime": "automatic", + "pragmaFrag": "React.Fragment", + "throwIfNamespace": true, + "development": false, + "useBuiltins": true + } + } + }, + "module": { + "type": "es6" + } +} diff --git a/packages/admin-bar/LICENSE.md b/packages/admin-bar/LICENSE.md new file mode 100644 index 0000000000..b31f1fb3a1 --- /dev/null +++ b/packages/admin-bar/LICENSE.md @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2018-2025 Payload CMS, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/admin-bar/README.md b/packages/admin-bar/README.md new file mode 100644 index 0000000000..9b2e802bb9 --- /dev/null +++ b/packages/admin-bar/README.md @@ -0,0 +1,119 @@ +# Payload Admin Bar + +An admin bar for React apps using [Payload](https://github.com/payloadcms/payload). + +### Installation + +```bash +pnpm i @payloadcms/admin-bar +``` + +### Basic Usage + +```jsx +import { PayloadAdminBar } from '@payloadcms/admin-bar' + +export const App = () => { + return +} +``` + +Checks for authentication with Payload CMS by hitting the [`/me`](https://payloadcms.com/docs/authentication/operations#me) route. If authenticated, renders an admin bar with simple controls to do the following: + +- Navigate to the admin dashboard +- Navigate to the currently logged-in user's account +- Edit the current collection +- Create a new collection of the same type +- Logout +- Indicate and exit preview mode + +The admin bar ships with very little style and is fully customizable. + +### Dynamic props + +With client-side routing, we need to update the admin bar with a new collection type and document id on each route change. This will depend on your app's specific setup, but here are a some common examples: + +#### NextJS + +For NextJS apps using dynamic-routes, use `getStaticProps`: + +```ts +export const getStaticProps = async ({ params: { slug } }) => { + const props = {} + + const pageReq = await fetch( + `https://cms.website.com/api/pages?where[slug][equals]=${slug}&depth=1`, + ) + const pageData = await pageReq.json() + + if (pageReq.ok) { + const { docs } = pageData + const [doc] = docs + + props = { + ...doc, + collection: 'pages', + collectionLabels: { + singular: 'page', + plural: 'pages', + }, + } + } + + return props +} +``` + +Now your app can forward these props onto the admin bar. Something like this: + +```ts +import { PayloadAdminBar } from '@payloadcms/admin-bar'; + +export const App = (appProps) => { + const { + pageProps: { + collection, + collectionLabels, + id + } + } = appProps; + + return ( + + ) +} +``` + +### Props + +| Property | Type | Required | Default | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------ | -------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| cmsURL | `string` | true | `http://localhost:8000` | `serverURL` as defined in your [Payload config](https://payloadcms.com/docs/configuration/overview#options) | +| adminPath | `string` | false | /admin | `routes` as defined in your [Payload config](https://payloadcms.com/docs/configuration/overview#options) | +| apiPath | `string` | false | /api | `routes` as defined in your [Payload config](https://payloadcms.com/docs/configuration/overview#options) | +| authCollectionSlug | `string` | false | 'users' | Slug of your [auth collection](https://payloadcms.com/docs/configuration/collections) | +| collectionSlug | `string` | true | undefined | Slug of your [collection](https://payloadcms.com/docs/configuration/collections) | +| collectionLabels | `{ singular?: string, plural?: string }` | false | undefined | Labels of your [collection](https://payloadcms.com/docs/configuration/collections) | +| id | `string` | true | undefined | id of the document | +| logo | `ReactElement` | false | undefined | Custom logo | +| classNames | `{ logo?: string, user?: string, controls?: string, create?: string, logout?: string, edit?: string, preview?: string }` | false | undefined | Custom class names, one for each rendered element | +| logoProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| userProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| divProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| createProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| logoutProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| editProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| previewProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| style | `CSSProperties` | false | undefined | Custom inline style | +| unstyled | `boolean` | false | undefined | If true, renders no inline style | +| onAuthChange | `(user: PayloadMeUser) => void` | false | undefined | Fired on each auth change | +| devMode | `boolean` | false | undefined | If true, fakes authentication (useful when dealing with [SameSite cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite)) | +| preview | `boolean` | false | undefined | If true, renders an exit button with your `onPreviewExit` handler) | +| onPreviewExit | `function` | false | undefined | Callback for the preview button `onClick` event) | diff --git a/packages/admin-bar/eslint.config.js b/packages/admin-bar/eslint.config.js new file mode 100644 index 0000000000..f9d341be50 --- /dev/null +++ b/packages/admin-bar/eslint.config.js @@ -0,0 +1,18 @@ +import { rootEslintConfig, rootParserOptions } from '../../eslint.config.js' + +/** @typedef {import('eslint').Linter.Config} Config */ + +/** @type {Config[]} */ +export const index = [ + ...rootEslintConfig, + { + languageOptions: { + parserOptions: { + ...rootParserOptions, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +] + +export default index diff --git a/packages/admin-bar/package.json b/packages/admin-bar/package.json new file mode 100644 index 0000000000..e3ea141dff --- /dev/null +++ b/packages/admin-bar/package.json @@ -0,0 +1,65 @@ +{ + "name": "@payloadcms/admin-bar", + "version": "3.27.0", + "description": "An admin bar for React apps using Payload", + "homepage": "https://payloadcms.com", + "repository": { + "type": "git", + "url": "https://github.com/payloadcms/payload.git", + "directory": "packages/admin-bar" + }, + "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 -g {dist,*.tsbuildinfo}", + "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "prepublishOnly": "pnpm clean && pnpm turbo build" + }, + "devDependencies": { + "@payloadcms/eslint-config": "workspace:*", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", + "payload": "workspace:*" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "publishConfig": { + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "main": "./dist/index.js", + "registry": "https://registry.npmjs.org/", + "types": "./dist/index.d.ts" + } +} diff --git a/packages/admin-bar/src/AdminBar.tsx b/packages/admin-bar/src/AdminBar.tsx new file mode 100644 index 0000000000..371b8f13e7 --- /dev/null +++ b/packages/admin-bar/src/AdminBar.tsx @@ -0,0 +1,349 @@ +'use client' +import React, { useEffect, useState } from 'react' + +const dummyUser = { + id: '12345', + email: 'dev@email.com', +} + +import type { PayloadAdminBarProps, PayloadMeUser } from './types.js' + +export const PayloadAdminBar: React.FC = (props) => { + const { + id: docID, + adminPath = '/admin', + apiPath = '/api', + authCollectionSlug = 'users', + className, + classNames, + cmsURL = 'http://localhost:8000', + collectionLabels, + collectionSlug, + createProps, + devMode, + divProps, + editProps, + logo, + logoProps, + logoutProps, + onAuthChange, + onPreviewExit, + preview, + previewProps, + style, + unstyled, + userProps, + } = props + + const [user, setUser] = useState() + + useEffect(() => { + const fetchMe = async () => { + try { + const meRequest = await fetch(`${cmsURL}${apiPath}/${authCollectionSlug}/me`, { + credentials: 'include', + method: 'get', + }) + const meResponse = await meRequest.json() + const { user } = meResponse + + if (user) { + setUser(user) + } else { + if (devMode !== true) { + setUser(null) + } else { + setUser(dummyUser) + } + } + } catch (err) { + console.warn(err) + if (devMode === true) { + setUser(dummyUser) + } + } + } + + void fetchMe() + }, [cmsURL, adminPath, apiPath, devMode]) + + useEffect(() => { + if (typeof onAuthChange === 'function') { + onAuthChange(user) + } + }, [user, onAuthChange]) + + if (user) { + const { id: userID, email } = user + + return ( + + ) + } + + return null +} diff --git a/packages/admin-bar/src/index.ts b/packages/admin-bar/src/index.ts new file mode 100644 index 0000000000..f41e6be2b4 --- /dev/null +++ b/packages/admin-bar/src/index.ts @@ -0,0 +1,2 @@ +export { PayloadAdminBar } from './AdminBar.js' +export type { PayloadAdminBarProps, PayloadMeUser } from './types.js' diff --git a/packages/admin-bar/src/types.ts b/packages/admin-bar/src/types.ts new file mode 100644 index 0000000000..044aa6edb9 --- /dev/null +++ b/packages/admin-bar/src/types.ts @@ -0,0 +1,67 @@ +import type { CSSProperties, ReactElement } from 'react' + +export type PayloadMeUser = + | { + email: string + id: string + } + | null + | undefined + +export type PayloadAdminBarProps = { + adminPath?: string + apiPath?: string + authCollectionSlug?: string + className?: string + classNames?: { + controls?: string + create?: string + edit?: string + logo?: string + logout?: string + preview?: string + user?: string + } + cmsURL?: string + collectionLabels?: { + plural?: string + singular?: string + } + collectionSlug?: string + createProps?: { + [key: string]: unknown + style?: CSSProperties + } + devMode?: boolean + divProps?: { + [key: string]: unknown + style?: CSSProperties + } + editProps?: { + [key: string]: unknown + style?: CSSProperties + } + id?: string + logo?: ReactElement + logoProps?: { + [key: string]: unknown + style?: CSSProperties + } + logoutProps?: { + [key: string]: unknown + style?: CSSProperties + } + onAuthChange?: (user: PayloadMeUser) => void + onPreviewExit?: () => void + preview?: boolean + previewProps?: { + [key: string]: unknown + style?: CSSProperties + } + style?: CSSProperties + unstyled?: boolean + userProps?: { + [key: string]: unknown + style?: CSSProperties + } +} diff --git a/packages/admin-bar/tsconfig.json b/packages/admin-bar/tsconfig.json new file mode 100644 index 0000000000..14564e0715 --- /dev/null +++ b/packages/admin-bar/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + /* TODO: remove the following lines */ + "strict": false, + "noUncheckedIndexedAccess": false, + }, + "references": [{ "path": "../payload" }] +} diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 271dad68c0..d24a7f6a42 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.24.0", + "version": "3.27.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 4f4986a84f..b05f01b73c 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.24.0", + "version": "3.27.0", "description": "The officially supported MongoDB database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { @@ -47,7 +47,6 @@ }, "dependencies": { "mongoose": "8.9.5", - "mongoose-aggregate-paginate-v2": "1.1.2", "mongoose-paginate-v2": "1.8.5", "prompts": "2.4.2", "uuid": "10.0.0" @@ -55,6 +54,8 @@ "devDependencies": { "@payloadcms/eslint-config": "workspace:*", "@types/mongoose-aggregate-paginate-v2": "1.0.12", + "@types/prompts": "^2.4.5", + "@types/uuid": "10.0.0", "mongodb": "6.12.0", "mongodb-memory-server": "^10", "payload": "workspace:*" diff --git a/packages/db-mongodb/src/connect.ts b/packages/db-mongodb/src/connect.ts index 57eea475b8..040c0c1ab9 100644 --- a/packages/db-mongodb/src/connect.ts +++ b/packages/db-mongodb/src/connect.ts @@ -70,9 +70,15 @@ export const connect: Connect = async function connect( await this.migrate({ migrations: this.prodMigrations }) } } catch (err) { + let msg = `Error: cannot connect to MongoDB.` + + if (typeof err === 'object' && err && 'message' in err && typeof err.message === 'string') { + msg = `${msg} Details: ${err.message}` + } + this.payload.logger.error({ err, - msg: `Error: cannot connect to MongoDB. Details: ${err.message}`, + msg, }) process.exit(1) } diff --git a/packages/db-mongodb/src/count.ts b/packages/db-mongodb/src/count.ts index e79c5964c9..fd0aa284d2 100644 --- a/packages/db-mongodb/src/count.ts +++ b/packages/db-mongodb/src/count.ts @@ -6,13 +6,15 @@ import { flattenWhereToOperators } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const count: Count = async function count( this: MongooseAdapter, - { collection, locale, req, where }, + { collection: collectionSlug, locale, req, where = {} }, ) { - const Model = this.collections[collection] + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) + const options: CountOptions = { session: await getSession(this, req), } @@ -26,8 +28,8 @@ export const count: Count = async function count( const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, locale, where, }) diff --git a/packages/db-mongodb/src/countGlobalVersions.ts b/packages/db-mongodb/src/countGlobalVersions.ts index 0a5b26c522..c91f1c8fd8 100644 --- a/packages/db-mongodb/src/countGlobalVersions.ts +++ b/packages/db-mongodb/src/countGlobalVersions.ts @@ -6,13 +6,15 @@ import { buildVersionGlobalFields, flattenWhereToOperators } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const countGlobalVersions: CountGlobalVersions = async function countGlobalVersions( this: MongooseAdapter, - { global, locale, req, where }, + { global: globalSlug, locale, req, where = {} }, ) { - const Model = this.versions[global] + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug, versions: true }) + const options: CountOptions = { session: await getSession(this, req), } @@ -26,11 +28,7 @@ export const countGlobalVersions: CountGlobalVersions = async function countGlob const query = await buildQuery({ adapter: this, - fields: buildVersionGlobalFields( - this.payload.config, - this.payload.globals.config.find((each) => each.slug === global), - true, - ), + fields: buildVersionGlobalFields(this.payload.config, globalConfig, true), locale, where, }) diff --git a/packages/db-mongodb/src/countVersions.ts b/packages/db-mongodb/src/countVersions.ts index 87b7fcc55d..bb31931cb0 100644 --- a/packages/db-mongodb/src/countVersions.ts +++ b/packages/db-mongodb/src/countVersions.ts @@ -6,13 +6,19 @@ import { buildVersionCollectionFields, flattenWhereToOperators } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const countVersions: CountVersions = async function countVersions( this: MongooseAdapter, - { collection, locale, req, where }, + { collection: collectionSlug, locale, req, where = {} }, ) { - const Model = this.versions[collection] + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) + const options: CountOptions = { session: await getSession(this, req), } @@ -26,11 +32,7 @@ export const countVersions: CountVersions = async function countVersions( const query = await buildQuery({ adapter: this, - fields: buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collection].config, - true, - ), + fields: buildVersionCollectionFields(this.payload.config, collectionConfig, true), locale, where, }) diff --git a/packages/db-mongodb/src/create.ts b/packages/db-mongodb/src/create.ts index 3c99e79324..f1638ecf39 100644 --- a/packages/db-mongodb/src/create.ts +++ b/packages/db-mongodb/src/create.ts @@ -1,17 +1,19 @@ import type { CreateOptions } from 'mongoose' -import type { Create, Document } from 'payload' +import type { Create } from 'payload' import type { MongooseAdapter } from './index.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { handleError } from './utilities/handleError.js' import { transform } from './utilities/transform.js' export const create: Create = async function create( this: MongooseAdapter, - { collection, data, req }, + { collection: collectionSlug, data, req, returning }, ) { - const Model = this.collections[collection] + const { collectionConfig, customIDType, Model } = getCollection({ adapter: this, collectionSlug }) + const options: CreateOptions = { session: await getSession(this, req), } @@ -21,18 +23,21 @@ export const create: Create = async function create( transform({ adapter: this, data, - fields: this.payload.collections[collection].config.fields, + fields: collectionConfig.fields, operation: 'write', }) - if (this.payload.collections[collection].customIDType) { + if (customIDType) { data._id = data.id } try { ;[doc] = await Model.create([data], options) } catch (error) { - handleError({ collection, error, req }) + handleError({ collection: collectionSlug, error, req }) + } + if (returning === false) { + return null } doc = doc.toObject() @@ -40,7 +45,7 @@ export const create: Create = async function create( transform({ adapter: this, data: doc, - fields: this.payload.collections[collection].config.fields, + fields: collectionConfig.fields, operation: 'read', }) diff --git a/packages/db-mongodb/src/createGlobal.ts b/packages/db-mongodb/src/createGlobal.ts index 28c10b39ca..f91c4e5b35 100644 --- a/packages/db-mongodb/src/createGlobal.ts +++ b/packages/db-mongodb/src/createGlobal.ts @@ -1,22 +1,24 @@ import type { CreateOptions } from 'mongoose' -import type { CreateGlobal } from 'payload' + +import { type CreateGlobal } from 'payload' import type { MongooseAdapter } from './index.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const createGlobal: CreateGlobal = async function createGlobal( this: MongooseAdapter, - { slug, data, req }, + { slug: globalSlug, data, req, returning }, ) { - const Model = this.globals + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug }) transform({ adapter: this, data, - fields: this.payload.config.globals.find((globalConfig) => globalConfig.slug === slug).fields, - globalSlug: slug, + fields: globalConfig.fields, + globalSlug, operation: 'write', }) @@ -25,13 +27,16 @@ export const createGlobal: CreateGlobal = async function createGlobal( } let [result] = (await Model.create([data], options)) as any + if (returning === false) { + return null + } result = result.toObject() transform({ adapter: this, data: result, - fields: this.payload.config.globals.find((globalConfig) => globalConfig.slug === slug).fields, + fields: globalConfig.fields, operation: 'read', }) diff --git a/packages/db-mongodb/src/createGlobalVersion.ts b/packages/db-mongodb/src/createGlobalVersion.ts index 2137ca84aa..c5910231e6 100644 --- a/packages/db-mongodb/src/createGlobalVersion.ts +++ b/packages/db-mongodb/src/createGlobalVersion.ts @@ -1,9 +1,8 @@ -import type { CreateOptions } from 'mongoose' - import { buildVersionGlobalFields, type CreateGlobalVersion } from 'payload' import type { MongooseAdapter } from './index.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' @@ -16,13 +15,15 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo parent, publishedLocale, req, + returning, snapshot, updatedAt, versionData, }, ) { - const VersionModel = this.versions[globalSlug] - const options: CreateOptions = { + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug, versions: true }) + + const options = { session: await getSession(this, req), } @@ -37,10 +38,7 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo version: versionData, } - const fields = buildVersionGlobalFields( - this.payload.config, - this.payload.config.globals.find((global) => global.slug === globalSlug), - ) + const fields = buildVersionGlobalFields(this.payload.config, globalConfig) transform({ adapter: this, @@ -49,9 +47,9 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo operation: 'write', }) - let [doc] = await VersionModel.create([data], options, req) + let [doc] = await Model.create([data], options, req) - await VersionModel.updateMany( + await Model.updateMany( { $and: [ { @@ -75,6 +73,10 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo options, ) + if (returning === false) { + return null + } + doc = doc.toObject() transform({ diff --git a/packages/db-mongodb/src/createMigration.ts b/packages/db-mongodb/src/createMigration.ts index ae54ba1a68..61b0da7aa6 100644 --- a/packages/db-mongodb/src/createMigration.ts +++ b/packages/db-mongodb/src/createMigration.ts @@ -42,8 +42,9 @@ export const createMigration: CreateMigration = async function createMigration({ const migrationFileContent = migrationTemplate(predefinedMigration) const [yyymmdd, hhmmss] = new Date().toISOString().split('T') - const formattedDate = yyymmdd.replace(/\D/g, '') - const formattedTime = hhmmss.split('.')[0].replace(/\D/g, '') + + const formattedDate = yyymmdd!.replace(/\D/g, '') + const formattedTime = hhmmss!.split('.')[0]!.replace(/\D/g, '') const timestamp = `${formattedDate}_${formattedTime}` diff --git a/packages/db-mongodb/src/createVersion.ts b/packages/db-mongodb/src/createVersion.ts index a0894adc88..ec733baa83 100644 --- a/packages/db-mongodb/src/createVersion.ts +++ b/packages/db-mongodb/src/createVersion.ts @@ -1,9 +1,8 @@ -import type { CreateOptions } from 'mongoose' - import { buildVersionCollectionFields, type CreateVersion } from 'payload' import type { MongooseAdapter } from './index.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' @@ -16,13 +15,19 @@ export const createVersion: CreateVersion = async function createVersion( parent, publishedLocale, req, + returning, snapshot, updatedAt, versionData, }, ) { - const VersionModel = this.versions[collectionSlug] - const options: CreateOptions = { + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) + + const options = { session: await getSession(this, req), } @@ -37,10 +42,7 @@ export const createVersion: CreateVersion = async function createVersion( version: versionData, } - const fields = buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collectionSlug].config, - ) + const fields = buildVersionCollectionFields(this.payload.config, collectionConfig) transform({ adapter: this, @@ -49,7 +51,7 @@ export const createVersion: CreateVersion = async function createVersion( operation: 'write', }) - let [doc] = await VersionModel.create([data], options, req) + let [doc] = await Model.create([data], options, req) const parentQuery = { $or: [ @@ -61,7 +63,7 @@ export const createVersion: CreateVersion = async function createVersion( ], } - await VersionModel.updateMany( + await Model.updateMany( { $and: [ { @@ -86,6 +88,10 @@ export const createVersion: CreateVersion = async function createVersion( options, ) + if (returning === false) { + return null + } + doc = doc.toObject() transform({ diff --git a/packages/db-mongodb/src/deleteMany.ts b/packages/db-mongodb/src/deleteMany.ts index 8ba837a617..a40fc7fb61 100644 --- a/packages/db-mongodb/src/deleteMany.ts +++ b/packages/db-mongodb/src/deleteMany.ts @@ -1,24 +1,27 @@ import type { DeleteOptions } from 'mongodb' -import type { DeleteMany } from 'payload' + +import { type DeleteMany } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const deleteMany: DeleteMany = async function deleteMany( this: MongooseAdapter, - { collection, req, where }, + { collection: collectionSlug, req, where }, ) { - const Model = this.collections[collection] + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) + const options: DeleteOptions = { session: await getSession(this, req), } const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, where, }) diff --git a/packages/db-mongodb/src/deleteOne.ts b/packages/db-mongodb/src/deleteOne.ts index 0ae3231531..1731642780 100644 --- a/packages/db-mongodb/src/deleteOne.ts +++ b/packages/db-mongodb/src/deleteOne.ts @@ -1,22 +1,24 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import type { DeleteOne } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const deleteOne: DeleteOne = async function deleteOne( this: MongooseAdapter, - { collection, req, select, where }, + { collection: collectionSlug, req, returning, select, where }, ) { - const Model = this.collections[collection] - const options: QueryOptions = { + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) + + const options: MongooseUpdateQueryOptions = { projection: buildProjectionFromSelect({ adapter: this, - fields: this.payload.collections[collection].config.flattenedFields, + fields: collectionConfig.flattenedFields, select, }), session: await getSession(this, req), @@ -24,11 +26,16 @@ export const deleteOne: DeleteOne = async function deleteOne( const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, where, }) + if (returning === false) { + await Model.deleteOne(query, options)?.lean() + return null + } + const doc = await Model.findOneAndDelete(query, options)?.lean() if (!doc) { @@ -38,7 +45,7 @@ export const deleteOne: DeleteOne = async function deleteOne( transform({ adapter: this, data: doc, - fields: this.payload.collections[collection].config.fields, + fields: collectionConfig.fields, operation: 'read', }) diff --git a/packages/db-mongodb/src/deleteVersions.ts b/packages/db-mongodb/src/deleteVersions.ts index 9317836848..2c38682a8a 100644 --- a/packages/db-mongodb/src/deleteVersions.ts +++ b/packages/db-mongodb/src/deleteVersions.ts @@ -3,26 +3,27 @@ import { buildVersionCollectionFields, type DeleteVersions } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const deleteVersions: DeleteVersions = async function deleteVersions( this: MongooseAdapter, - { collection, locale, req, where }, + { collection: collectionSlug, locale, req, where }, ) { - const VersionsModel = this.versions[collection] + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) const session = await getSession(this, req) const query = await buildQuery({ adapter: this, - fields: buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collection].config, - true, - ), + fields: buildVersionCollectionFields(this.payload.config, collectionConfig, true), locale, where, }) - await VersionsModel.deleteMany(query, { session }) + await Model.deleteMany(query, { session }) } diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index 65f556ec33..8dc64c1993 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -7,15 +7,17 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildSortParam } from './queries/buildSortParam.js' +import { aggregatePaginate } from './utilities/aggregatePaginate.js' import { buildJoinAggregation } from './utilities/buildJoinAggregation.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const find: Find = async function find( this: MongooseAdapter, { - collection, + collection: collectionSlug, joins = {}, limit = 0, locale, @@ -25,11 +27,10 @@ export const find: Find = async function find( req, select, sort: sortArg, - where, + where = {}, }, ) { - const Model = this.collections[collection] - const collectionConfig = this.payload.collections[collection].config + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) const session = await getSession(this, req) @@ -53,8 +54,8 @@ export const find: Find = async function find( const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, locale, where, }) @@ -108,7 +109,8 @@ export const find: Find = async function find( if (limit >= 0) { paginationOptions.limit = limit // limit must also be set here, it's ignored when pagination is false - paginationOptions.options.limit = limit + + paginationOptions.options!.limit = limit // Disable pagination if limit is 0 if (limit === 0) { @@ -120,7 +122,7 @@ export const find: Find = async function find( const aggregate = await buildJoinAggregation({ adapter: this, - collection, + collection: collectionSlug, collectionConfig, joins, locale, @@ -128,7 +130,20 @@ export const find: Find = async function find( }) // build join aggregation if (aggregate) { - result = await Model.aggregatePaginate(Model.aggregate(aggregate), paginationOptions) + result = await aggregatePaginate({ + adapter: this, + collation: paginationOptions.collation, + joinAggregation: aggregate, + limit: paginationOptions.limit, + Model, + page: paginationOptions.page, + pagination: paginationOptions.pagination, + projection: paginationOptions.projection, + query, + session: paginationOptions.options?.session ?? undefined, + sort: paginationOptions.sort as object, + useEstimatedCount: paginationOptions.useEstimatedCount, + }) } else { result = await Model.paginate(query, paginationOptions) } @@ -136,7 +151,7 @@ export const find: Find = async function find( transform({ adapter: this, data: result.docs, - fields: this.payload.collections[collection].config.fields, + fields: collectionConfig.fields, operation: 'read', }) diff --git a/packages/db-mongodb/src/findGlobal.ts b/packages/db-mongodb/src/findGlobal.ts index dbefa258c8..18e3ad5eb6 100644 --- a/packages/db-mongodb/src/findGlobal.ts +++ b/packages/db-mongodb/src/findGlobal.ts @@ -7,15 +7,16 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const findGlobal: FindGlobal = async function findGlobal( this: MongooseAdapter, - { slug, locale, req, select, where }, + { slug: globalSlug, locale, req, select, where = {} }, ) { - const Model = this.globals - const globalConfig = this.payload.globals.config.find((each) => each.slug === slug) + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug }) + const fields = globalConfig.flattenedFields const options: QueryOptions = { lean: true, @@ -30,12 +31,12 @@ export const findGlobal: FindGlobal = async function findGlobal( const query = await buildQuery({ adapter: this, fields, - globalSlug: slug, + globalSlug, locale, - where: combineQueries({ globalType: { equals: slug } }, where), + where: combineQueries({ globalType: { equals: globalSlug } }, where), }) - const doc = (await Model.findOne(query, {}, options)) as any + const doc: any = await Model.findOne(query, {}, options) if (!doc) { return null diff --git a/packages/db-mongodb/src/findGlobalVersions.ts b/packages/db-mongodb/src/findGlobalVersions.ts index 2ecd21edde..1386302f53 100644 --- a/packages/db-mongodb/src/findGlobalVersions.ts +++ b/packages/db-mongodb/src/findGlobalVersions.ts @@ -1,22 +1,34 @@ import type { PaginateOptions, QueryOptions } from 'mongoose' import type { FindGlobalVersions } from 'payload' -import { buildVersionGlobalFields, flattenWhereToOperators } from 'payload' +import { APIError, buildVersionGlobalFields, flattenWhereToOperators } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildSortParam } from './queries/buildSortParam.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const findGlobalVersions: FindGlobalVersions = async function findGlobalVersions( this: MongooseAdapter, - { global, limit, locale, page, pagination, req, select, skip, sort: sortArg, where }, + { + global: globalSlug, + limit, + locale, + page, + pagination, + req, + select, + skip, + sort: sortArg, + where = {}, + }, ) { - const globalConfig = this.payload.globals.config.find(({ slug }) => slug === global) - const Model = this.versions[global] + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug, versions: true }) + const versionFields = buildVersionGlobalFields(this.payload.config, globalConfig, true) const session = await getSession(this, req) @@ -88,10 +100,11 @@ export const findGlobalVersions: FindGlobalVersions = async function findGlobalV } } - if (limit >= 0) { + if (limit && limit >= 0) { paginationOptions.limit = limit // limit must also be set here, it's ignored when pagination is false - paginationOptions.options.limit = limit + + paginationOptions.options!.limit = limit // Disable pagination if limit is 0 if (limit === 0) { diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index 7fec58d949..16f7c8f992 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -1,20 +1,23 @@ import type { AggregateOptions, QueryOptions } from 'mongoose' -import type { FindOne } from 'payload' + +import { type FindOne } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { aggregatePaginate } from './utilities/aggregatePaginate.js' import { buildJoinAggregation } from './utilities/buildJoinAggregation.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const findOne: FindOne = async function findOne( this: MongooseAdapter, - { collection, joins, locale, req, select, where }, + { collection: collectionSlug, joins, locale, req, select, where = {} }, ) { - const Model = this.collections[collection] - const collectionConfig = this.payload.collections[collection].config + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) + const session = await getSession(this, req) const options: AggregateOptions & QueryOptions = { lean: true, @@ -23,7 +26,7 @@ export const findOne: FindOne = async function findOne( const query = await buildQuery({ adapter: this, - collectionSlug: collection, + collectionSlug, fields: collectionConfig.flattenedFields, locale, where, @@ -37,10 +40,9 @@ export const findOne: FindOne = async function findOne( const aggregate = await buildJoinAggregation({ adapter: this, - collection, + collection: collectionSlug, collectionConfig, joins, - limit: 1, locale, projection, query, @@ -48,7 +50,17 @@ export const findOne: FindOne = async function findOne( let doc if (aggregate) { - ;[doc] = await Model.aggregate(aggregate, { session }) + const { docs } = await aggregatePaginate({ + adapter: this, + joinAggregation: aggregate, + limit: 1, + Model, + pagination: false, + projection, + query, + session, + }) + doc = docs[0] } else { ;(options as Record).projection = projection doc = await Model.findOne(query, {}, options) diff --git a/packages/db-mongodb/src/findVersions.ts b/packages/db-mongodb/src/findVersions.ts index 0b5eb37459..3872ce98f5 100644 --- a/packages/db-mongodb/src/findVersions.ts +++ b/packages/db-mongodb/src/findVersions.ts @@ -8,15 +8,31 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildSortParam } from './queries/buildSortParam.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const findVersions: FindVersions = async function findVersions( this: MongooseAdapter, - { collection, limit, locale, page, pagination, req = {}, select, skip, sort: sortArg, where }, + { + collection: collectionSlug, + limit, + locale, + page, + pagination, + req = {}, + select, + skip, + sort: sortArg, + where = {}, + }, ) { - const Model = this.versions[collection] - const collectionConfig = this.payload.collections[collection].config + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) + const session = await getSession(this, req) const options: QueryOptions = { limit, @@ -92,10 +108,11 @@ export const findVersions: FindVersions = async function findVersions( } } - if (limit >= 0) { + if (limit && limit >= 0) { paginationOptions.limit = limit // limit must also be set here, it's ignored when pagination is false - paginationOptions.options.limit = limit + + paginationOptions.options!.limit = limit // Disable pagination if limit is 0 if (limit === 0) { diff --git a/packages/db-mongodb/src/index.ts b/packages/db-mongodb/src/index.ts index 911677c143..6b0cfe4447 100644 --- a/packages/db-mongodb/src/index.ts +++ b/packages/db-mongodb/src/index.ts @@ -11,11 +11,13 @@ import type { BaseDatabaseAdapter, CollectionSlug, DatabaseAdapterObj, + Migration, Payload, TypeWithID, TypeWithVersion, UpdateGlobalArgs, UpdateGlobalVersionArgs, + UpdateManyArgs, UpdateOneArgs, UpdateVersionArgs, } from 'payload' @@ -53,6 +55,7 @@ import { commitTransaction } from './transactions/commitTransaction.js' import { rollbackTransaction } from './transactions/rollbackTransaction.js' import { updateGlobal } from './updateGlobal.js' import { updateGlobalVersion } from './updateGlobalVersion.js' +import { updateMany } from './updateMany.js' import { updateOne } from './updateOne.js' import { updateVersion } from './updateVersion.js' import { upsert } from './upsert.js' @@ -60,6 +63,13 @@ import { upsert } from './upsert.js' export type { MigrateDownArgs, MigrateUpArgs } from './types.js' export interface Args { + /** + * By default, Payload strips all additional keys from MongoDB data that don't exist + * in the Payload schema. If you have some data that you want to include to the result + * but it doesn't exist in Payload, you can enable this flag + * @default false + */ + allowAdditionalKeys?: boolean /** Set to false to disable auto-pluralization of collection names, Defaults to true */ autoPluralization?: boolean /** @@ -86,11 +96,15 @@ export interface Args { * Defaults to disabled. */ collation?: Omit + collectionsSchemaOptions?: Partial> /** Extra configuration options */ connectOptions?: { - /** Set false to disable $facet aggregation in non-supporting databases, Defaults to true */ + /** + * Set false to disable $facet aggregation in non-supporting databases, Defaults to true + * @deprecated Payload doesn't use `$facet` anymore anywhere. + */ useFacet?: boolean } & ConnectOptions /** Set to true to disable hinting to MongoDB to use 'id' as index. This is currently done when counting documents for pagination. Disabling this optimization might fix some problems with AWS DocumentDB. Defaults to false */ @@ -105,11 +119,7 @@ export interface Args { * typed as any to avoid dependency */ mongoMemoryServer?: MongoMemoryReplSet - prodMigrations?: { - down: (args: MigrateDownArgs) => Promise - name: string - up: (args: MigrateUpArgs) => Promise - }[] + prodMigrations?: Migration[] transactionOptions?: false | TransactionOptions /** The URL to connect to MongoDB or false to start payload and prevent connecting */ @@ -160,6 +170,7 @@ declare module 'payload' { updateGlobalVersion: ( args: { options?: QueryOptions } & UpdateGlobalVersionArgs, ) => Promise> + updateOne: (args: { options?: QueryOptions } & UpdateOneArgs) => Promise updateVersion: ( args: { options?: QueryOptions } & UpdateVersionArgs, @@ -171,11 +182,12 @@ declare module 'payload' { } export function mongooseAdapter({ + allowAdditionalKeys = false, autoPluralization = true, collectionsSchemaOptions = {}, connectOptions, disableIndexHints = false, - ensureIndexes, + ensureIndexes = false, migrationDir: migrationDirArg, mongoMemoryServer, prodMigrations, @@ -192,17 +204,22 @@ export function mongooseAdapter({ // Mongoose-specific autoPluralization, collections: {}, + // @ts-expect-error initialize without a connection connection: undefined, connectOptions: connectOptions || {}, disableIndexHints, ensureIndexes, + // @ts-expect-error don't have globals model yet globals: undefined, + // @ts-expect-error Should not be required mongoMemoryServer, sessions: {}, transactionOptions: transactionOptions === false ? undefined : transactionOptions, + updateMany, url, versions: {}, // DatabaseAdapter + allowAdditionalKeys, beginTransaction: transactionOptions === false ? defaultBeginTransaction() : beginTransaction, collectionsSchemaOptions, commitTransaction, diff --git a/packages/db-mongodb/src/init.ts b/packages/db-mongodb/src/init.ts index de82610f2b..01b306a8e9 100644 --- a/packages/db-mongodb/src/init.ts +++ b/packages/db-mongodb/src/init.ts @@ -2,12 +2,15 @@ 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' +import { + buildVersionCollectionFields, + buildVersionCompoundIndexes, + buildVersionGlobalFields, +} from 'payload' import type { MongooseAdapter } from './index.js' -import type { CollectionModel } from './types.js' +import type { CollectionModel, GlobalModel } from './types.js' import { buildCollectionSchema } from './models/buildCollectionSchema.js' import { buildGlobalModel } from './models/buildGlobalModel.js' @@ -17,7 +20,7 @@ import { getDBName } from './utilities/getDBName.js' export const init: Init = function init(this: MongooseAdapter) { this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => { - const schemaOptions = this.collectionsSchemaOptions[collection.slug] + const schemaOptions = this.collectionsSchemaOptions?.[collection.slug] const schema = buildCollectionSchema(collection, this.payload, schemaOptions) @@ -37,6 +40,7 @@ export const init: Init = function init(this: MongooseAdapter) { }, ...schemaOptions, }, + compoundIndexes: buildVersionCompoundIndexes({ indexes: collection.sanitizedIndexes }), configFields: versionCollectionFields, payload: this.payload, }) @@ -48,10 +52,6 @@ export const init: Init = function init(this: MongooseAdapter) { }), ) - if (Object.keys(collection.joins).length > 0) { - versionSchema.plugin(mongooseAggregatePaginate) - } - const versionCollectionName = this.autoPluralization === true && !collection.dbName ? undefined : versionModelName @@ -59,21 +59,21 @@ export const init: Init = function init(this: MongooseAdapter) { versionModelName, versionSchema, versionCollectionName, - ) as CollectionModel + ) as unknown as CollectionModel } const modelName = getDBName({ config: collection }) const collectionName = this.autoPluralization === true && !collection.dbName ? undefined : modelName - this.collections[collection.slug] = mongoose.model( + this.collections[collection.slug] = mongoose.model( modelName, schema, collectionName, ) as CollectionModel }) - this.globals = buildGlobalModel(this.payload) + this.globals = buildGlobalModel(this.payload) as GlobalModel this.payload.config.globals.forEach((global) => { if (global.versions) { @@ -101,7 +101,7 @@ export const init: Init = function init(this: MongooseAdapter) { }), ) - this.versions[global.slug] = mongoose.model( + this.versions[global.slug] = mongoose.model( versionModelName, versionSchema, versionModelName, diff --git a/packages/db-mongodb/src/migrateFresh.ts b/packages/db-mongodb/src/migrateFresh.ts index 4db2e76c42..cd9e538629 100644 --- a/packages/db-mongodb/src/migrateFresh.ts +++ b/packages/db-mongodb/src/migrateFresh.ts @@ -1,5 +1,3 @@ -import type { PayloadRequest } from 'payload' - import { commitTransaction, initTransaction, killTransaction, readMigrationFiles } from 'payload' import prompts from 'prompts' diff --git a/packages/db-mongodb/src/models/buildCollectionSchema.ts b/packages/db-mongodb/src/models/buildCollectionSchema.ts index da3c40df50..01eb24acd1 100644 --- a/packages/db-mongodb/src/models/buildCollectionSchema.ts +++ b/packages/db-mongodb/src/models/buildCollectionSchema.ts @@ -1,7 +1,6 @@ import type { PaginateOptions, Schema } from 'mongoose' import type { Payload, SanitizedCollectionConfig } from 'payload' -import mongooseAggregatePaginate from 'mongoose-aggregate-paginate-v2' import paginate from 'mongoose-paginate-v2' import { getBuildQueryPlugin } from '../queries/getBuildQueryPlugin.js' @@ -24,12 +23,13 @@ export const buildCollectionSchema = ( ...schemaOptions, }, }, + compoundIndexes: collection.sanitizedIndexes, configFields: collection.fields, payload, }) if (Array.isArray(collection.upload.filenameCompoundIndex)) { - const indexDefinition: Record = collection.upload.filenameCompoundIndex.reduce( + const indexDefinition = collection.upload.filenameCompoundIndex.reduce>( (acc, index) => { acc[index] = 1 return acc @@ -44,12 +44,5 @@ export const buildCollectionSchema = ( .plugin(paginate, { useEstimatedCount: true }) .plugin(getBuildQueryPlugin({ collectionSlug: collection.slug })) - if ( - Object.keys(collection.joins).length > 0 || - Object.keys(collection.polymorphicJoins).length > 0 - ) { - schema.plugin(mongooseAggregatePaginate) - } - return schema } diff --git a/packages/db-mongodb/src/models/buildSchema.ts b/packages/db-mongodb/src/models/buildSchema.ts index 2c6d5b69ed..4cd833ccec 100644 --- a/packages/db-mongodb/src/models/buildSchema.ts +++ b/packages/db-mongodb/src/models/buildSchema.ts @@ -21,6 +21,7 @@ import { type RelationshipField, type RichTextField, type RowField, + type SanitizedCompoundIndex, type SanitizedLocalizationConfig, type SelectField, type Tab, @@ -45,8 +46,8 @@ export type BuildSchemaOptions = { options?: SchemaOptions } -type FieldSchemaGenerator = ( - field: Field, +type FieldSchemaGenerator = ( + field: T, schema: Schema, config: Payload, buildSchemaOptions: BuildSchemaOptions, @@ -100,7 +101,7 @@ const formatBaseSchema = ({ const localizeSchema = ( entity: NonPresentationalField | Tab, - schema, + schema: SchemaTypeOptions, localization: false | SanitizedLocalizationConfig, parentIsLocalized: boolean, ) => { @@ -127,6 +128,7 @@ const localizeSchema = ( export const buildSchema = (args: { buildSchemaOptions: BuildSchemaOptions + compoundIndexes?: SanitizedCompoundIndex[] configFields: Field[] parentIsLocalized?: boolean payload: Payload @@ -149,7 +151,7 @@ export const buildSchema = (args: { } } - const schema = new mongoose.Schema(fields, options) + const schema = new mongoose.Schema(fields, options as any) schemaFields.forEach((field) => { if (fieldIsVirtual(field)) { @@ -157,192 +159,52 @@ export const buildSchema = (args: { } if (!fieldIsPresentationalOnly(field)) { - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[field.type] + const addFieldSchema = getSchemaGenerator(field.type) if (addFieldSchema) { - addFieldSchema(field, schema, payload, buildSchemaOptions, parentIsLocalized) + addFieldSchema(field, schema, payload, buildSchemaOptions, parentIsLocalized ?? false) } } }) + if (args.compoundIndexes) { + for (const index of args.compoundIndexes) { + const indexDefinition: Record = {} + + for (const field of index.fields) { + if (field.pathHasLocalized && payload.config.localization) { + for (const locale of payload.config.localization.locales) { + indexDefinition[field.localizedPath.replace('', locale.code)] = 1 + } + } else { + indexDefinition[field.path] = 1 + } + } + + schema.index(indexDefinition, { + unique: args.buildSchemaOptions.disableUnique ? false : index.unique, + }) + } + } + return schema } -const fieldToSchemaMap: Record = { - array: (field: ArrayField, schema, payload, buildSchemaOptions, parentIsLocalized) => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: [ - buildSchema({ - buildSchemaOptions: { - allowIDField: true, - disableUnique: buildSchemaOptions.disableUnique, - draftsEnabled: buildSchemaOptions.draftsEnabled, - options: { - _id: false, - id: false, - minimize: false, - }, - }, - configFields: field.fields, - parentIsLocalized: parentIsLocalized || field.localized, - payload, - }), - ], - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - blocks: (field: BlocksField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const fieldSchema = { - type: [new mongoose.Schema({}, { _id: false, discriminatorKey: 'blockType' })], - } - - schema.add({ - [field.name]: localizeSchema( - field, - fieldSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - ;(field.blockReferences ?? field.blocks).forEach((blockItem) => { - const blockSchema = new mongoose.Schema({}, { _id: false, id: false }) - - const block = typeof blockItem === 'string' ? payload.blocks[blockItem] : blockItem - - block.fields.forEach((blockField) => { - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[blockField.type] - if (addFieldSchema) { - addFieldSchema( - blockField, - blockSchema, - payload, - buildSchemaOptions, - parentIsLocalized || field.localized, - ) - } - }) - - if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { - payload.config.localization.localeCodes.forEach((localeCode) => { - // @ts-expect-error Possible incorrect typing in mongoose types, this works - schema.path(`${field.name}.${localeCode}`).discriminator(block.slug, blockSchema) - }) - } else { - // @ts-expect-error Possible incorrect typing in mongoose types, this works - schema.path(field.name).discriminator(block.slug, blockSchema) - } - }) - }, - checkbox: ( - field: CheckboxField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: Boolean, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - code: (field: CodeField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - collapsible: ( - field: CollapsibleField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ): void => { - field.fields.forEach((subField: Field) => { - if (fieldIsVirtual(subField)) { - return - } - - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[subField.type] - - if (addFieldSchema) { - addFieldSchema(subField, schema, payload, buildSchemaOptions, parentIsLocalized) - } - }) - }, - date: (field: DateField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: Date, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - email: (field: EmailField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - group: (field: GroupField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const formattedBaseSchema = formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }) - - // carry indexSortableFields through to versions if drafts enabled - const indexSortableFields = - buildSchemaOptions.indexSortableFields && - field.name === 'version' && - buildSchemaOptions.draftsEnabled - - const baseSchema = { - ...formattedBaseSchema, - type: buildSchema({ +const array: FieldSchemaGenerator = ( + field: ArrayField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +) => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: [ + buildSchema({ buildSchemaOptions: { + allowIDField: true, disableUnique: buildSchemaOptions.disableUnique, draftsEnabled: buildSchemaOptions.draftsEnabled, - indexSortableFields, options: { _id: false, id: false, @@ -353,426 +215,660 @@ const fieldToSchemaMap: Record = { parentIsLocalized: parentIsLocalized || field.localized, payload, }), + ], + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const blocks: FieldSchemaGenerator = ( + field: BlocksField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const fieldSchema: SchemaTypeOptions = { + type: [new mongoose.Schema({}, { _id: false, discriminatorKey: 'blockType' })], + } + + schema.add({ + [field.name]: localizeSchema( + field, + fieldSchema, + payload.config.localization, + parentIsLocalized, + ), + }) + ;(field.blockReferences ?? field.blocks).forEach((blockItem) => { + const blockSchema = new mongoose.Schema({}, { _id: false, id: false }) + + const block = typeof blockItem === 'string' ? payload.blocks[blockItem] : blockItem + + if (!block) { + return } - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - json: (field: JSONField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: mongoose.Schema.Types.Mixed, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - number: (field: NumberField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: field.hasMany ? [Number] : Number, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - point: (field: PointField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema: SchemaTypeOptions = { - type: { - type: String, - enum: ['Point'], - ...(typeof field.defaultValue !== 'undefined' && { - default: 'Point', - }), - }, - coordinates: { - type: [Number], - default: formatDefaultValue(field), - required: false, - }, - } - if ( - buildSchemaOptions.disableUnique && - field.unique && - fieldShouldBeLocalized({ field, parentIsLocalized }) - ) { - baseSchema.coordinates.sparse = true - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - - if (field.index === true || field.index === undefined) { - const indexOptions: IndexOptions = {} - if (!buildSchemaOptions.disableUnique && field.unique) { - indexOptions.sparse = true - indexOptions.unique = true - } - if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { - payload.config.localization.locales.forEach((locale) => { - schema.index({ [`${field.name}.${locale.code}`]: '2dsphere' }, indexOptions) - }) - } else { - schema.index({ [field.name]: '2dsphere' }, indexOptions) - } - } - }, - radio: (field: RadioField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - enum: field.options.map((option) => { - if (typeof option === 'object') { - return option.value - } - return option - }), - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - relationship: ( - field: RelationshipField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ) => { - const hasManyRelations = Array.isArray(field.relationTo) - let schemaToReturn: { [key: string]: any } = {} - - const valueType = getRelationshipValueType(field, payload) - - if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { - schemaToReturn = { - _id: false, - type: payload.config.localization.localeCodes.reduce((locales, locale) => { - let localeSchema: { [key: string]: any } = {} - - if (hasManyRelations) { - localeSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - _id: false, - type: mongoose.Schema.Types.Mixed, - relationTo: { type: String, enum: field.relationTo }, - value: { - type: valueType, - refPath: `${field.name}.${locale}.relationTo`, - }, - } - } else { - localeSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: valueType, - ref: field.relationTo, - } - } - - return { - ...locales, - [locale]: field.hasMany - ? { type: [localeSchema], default: formatDefaultValue(field) } - : localeSchema, - } - }, {}), - localized: true, - } - } else if (hasManyRelations) { - schemaToReturn = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - _id: false, - type: mongoose.Schema.Types.Mixed, - relationTo: { type: String, enum: field.relationTo }, - value: { - type: valueType, - refPath: `${field.name}.relationTo`, - }, - } - - if (field.hasMany) { - schemaToReturn = { - type: [schemaToReturn], - default: formatDefaultValue(field), - } - } - } else { - schemaToReturn = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: valueType, - ref: field.relationTo, - } - - if (field.hasMany) { - schemaToReturn = { - type: [schemaToReturn], - default: formatDefaultValue(field), - } - } - } - - schema.add({ - [field.name]: schemaToReturn, - }) - }, - richText: ( - field: RichTextField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: mongoose.Schema.Types.Mixed, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - row: (field: RowField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - field.fields.forEach((subField: Field) => { - if (fieldIsVirtual(subField)) { - return - } - - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[subField.type] + block.fields.forEach((blockField) => { + const addFieldSchema = getSchemaGenerator(blockField.type) if (addFieldSchema) { - addFieldSchema(subField, schema, payload, buildSchemaOptions, parentIsLocalized) + addFieldSchema( + blockField, + blockSchema, + payload, + buildSchemaOptions, + (parentIsLocalized || field.localized) ?? false, + ) } }) - }, - select: (field: SelectField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - enum: field.options.map((option) => { - if (typeof option === 'object') { - return option.value - } - return option - }), - } - - if (buildSchemaOptions.draftsEnabled || !field.required) { - baseSchema.enum.push(null) - } - - schema.add({ - [field.name]: localizeSchema( - field, - field.hasMany ? [baseSchema] : baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - tabs: (field: TabsField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - field.tabs.forEach((tab) => { - if (tabHasName(tab)) { - if (fieldIsVirtual(tab)) { - return - } - const baseSchema = { - type: buildSchema({ - buildSchemaOptions: { - disableUnique: buildSchemaOptions.disableUnique, - draftsEnabled: buildSchemaOptions.draftsEnabled, - options: { - _id: false, - id: false, - minimize: false, - }, - }, - configFields: tab.fields, - parentIsLocalized: parentIsLocalized || tab.localized, - payload, - }), - } - - schema.add({ - [tab.name]: localizeSchema( - tab, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - } else { - tab.fields.forEach((subField: Field) => { - if (fieldIsVirtual(subField)) { - return - } - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[subField.type] - - if (addFieldSchema) { - addFieldSchema( - subField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized || tab.localized, - ) - } - }) - } - }) - }, - text: (field: TextField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: field.hasMany ? [String] : String, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - textarea: ( - field: TextareaField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - upload: (field: UploadField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const hasManyRelations = Array.isArray(field.relationTo) - let schemaToReturn: { [key: string]: any } = {} - - const valueType = getRelationshipValueType(field, payload) if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { - schemaToReturn = { - _id: false, - type: payload.config.localization.localeCodes.reduce((locales, locale) => { - let localeSchema: { [key: string]: any } = {} - - if (hasManyRelations) { - localeSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - _id: false, - type: mongoose.Schema.Types.Mixed, - relationTo: { type: String, enum: field.relationTo }, - value: { - type: valueType, - refPath: `${field.name}.${locale}.relationTo`, - }, - } - } else { - localeSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: valueType, - ref: field.relationTo, - } - } - - return { - ...locales, - [locale]: field.hasMany - ? { type: [localeSchema], default: formatDefaultValue(field) } - : localeSchema, - } - }, {}), - localized: true, - } - } else if (hasManyRelations) { - schemaToReturn = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - _id: false, - type: mongoose.Schema.Types.Mixed, - relationTo: { type: String, enum: field.relationTo }, - value: { - type: valueType, - refPath: `${field.name}.relationTo`, - }, - } - - if (field.hasMany) { - schemaToReturn = { - type: [schemaToReturn], - default: formatDefaultValue(field), - } - } + payload.config.localization.localeCodes.forEach((localeCode) => { + // @ts-expect-error Possible incorrect typing in mongoose types, this works + schema.path(`${field.name}.${localeCode}`).discriminator(block.slug, blockSchema) + }) } else { - schemaToReturn = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: valueType, - ref: field.relationTo, - } + // @ts-expect-error Possible incorrect typing in mongoose types, this works + schema.path(field.name).discriminator(block.slug, blockSchema) + } + }) +} - if (field.hasMany) { - schemaToReturn = { - type: [schemaToReturn], - default: formatDefaultValue(field), - } - } +const checkbox: FieldSchemaGenerator = ( + field: CheckboxField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: Boolean, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const code: FieldSchemaGenerator = ( + field: CodeField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const collapsible: FieldSchemaGenerator = ( + field: CollapsibleField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + field.fields.forEach((subField: Field) => { + if (fieldIsVirtual(subField)) { + return } - schema.add({ - [field.name]: schemaToReturn, - }) - }, + const addFieldSchema = getSchemaGenerator(subField.type) + + if (addFieldSchema) { + addFieldSchema(subField, schema, payload, buildSchemaOptions, parentIsLocalized) + } + }) +} + +const date: FieldSchemaGenerator = ( + field: DateField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: Date, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const email: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const group: FieldSchemaGenerator = ( + field: GroupField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const formattedBaseSchema = formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }) + + // carry indexSortableFields through to versions if drafts enabled + const indexSortableFields = + buildSchemaOptions.indexSortableFields && + field.name === 'version' && + buildSchemaOptions.draftsEnabled + + const baseSchema: SchemaTypeOptions = { + ...formattedBaseSchema, + type: buildSchema({ + buildSchemaOptions: { + disableUnique: buildSchemaOptions.disableUnique, + draftsEnabled: buildSchemaOptions.draftsEnabled, + indexSortableFields, + options: { + _id: false, + id: false, + minimize: false, + }, + }, + configFields: field.fields, + parentIsLocalized: parentIsLocalized || field.localized, + payload, + }), + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const json: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: mongoose.Schema.Types.Mixed, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const number: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: field.hasMany ? [Number] : Number, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const point: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + type: { + type: String, + enum: ['Point'], + ...(typeof field.defaultValue !== 'undefined' && { + default: 'Point', + }), + }, + coordinates: { + type: [Number], + default: formatDefaultValue(field), + required: false, + }, + } + + if ( + buildSchemaOptions.disableUnique && + field.unique && + fieldShouldBeLocalized({ field, parentIsLocalized }) + ) { + baseSchema.coordinates.sparse = true + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) + + if (field.index === true || field.index === undefined) { + const indexOptions: IndexOptions = {} + if (!buildSchemaOptions.disableUnique && field.unique) { + indexOptions.sparse = true + indexOptions.unique = true + } + if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { + payload.config.localization.locales.forEach((locale) => { + schema.index({ [`${field.name}.${locale.code}`]: '2dsphere' }, indexOptions) + }) + } else { + schema.index({ [field.name]: '2dsphere' }, indexOptions) + } + } +} + +const radio: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + enum: field.options.map((option) => { + if (typeof option === 'object') { + return option.value + } + return option + }), + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const relationship: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +) => { + const hasManyRelations = Array.isArray(field.relationTo) + let schemaToReturn: { [key: string]: any } = {} + + const valueType = getRelationshipValueType(field, payload) + + if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { + schemaToReturn = { + _id: false, + type: payload.config.localization.localeCodes.reduce((locales, locale) => { + let localeSchema: { [key: string]: any } = {} + + if (hasManyRelations) { + localeSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + _id: false, + type: mongoose.Schema.Types.Mixed, + relationTo: { type: String, enum: field.relationTo }, + value: { + type: valueType, + refPath: `${field.name}.${locale}.relationTo`, + }, + } + } else { + localeSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: valueType, + ref: field.relationTo, + } + } + + return { + ...locales, + [locale]: field.hasMany + ? { type: [localeSchema], default: formatDefaultValue(field) } + : localeSchema, + } + }, {}), + localized: true, + } + } else if (hasManyRelations) { + schemaToReturn = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + _id: false, + type: mongoose.Schema.Types.Mixed, + relationTo: { type: String, enum: field.relationTo }, + value: { + type: valueType, + refPath: `${field.name}.relationTo`, + }, + } + + if (field.hasMany) { + schemaToReturn = { + type: [schemaToReturn], + default: formatDefaultValue(field), + } + } + } else { + schemaToReturn = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: valueType, + ref: field.relationTo, + } + + if (field.hasMany) { + schemaToReturn = { + type: [schemaToReturn], + default: formatDefaultValue(field), + } + } + } + + schema.add({ + [field.name]: schemaToReturn, + }) +} + +const richText: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: mongoose.Schema.Types.Mixed, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const row: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + field.fields.forEach((subField: Field) => { + if (fieldIsVirtual(subField)) { + return + } + + const addFieldSchema = getSchemaGenerator(subField.type) + + if (addFieldSchema) { + addFieldSchema(subField, schema, payload, buildSchemaOptions, parentIsLocalized) + } + }) +} + +const select: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + enum: field.options.map((option) => { + if (typeof option === 'object') { + return option.value + } + return option + }), + } + + if (buildSchemaOptions.draftsEnabled || !field.required) { + ;(baseSchema.enum as unknown[]).push(null) + } + + schema.add({ + [field.name]: localizeSchema( + field, + field.hasMany ? [baseSchema] : baseSchema, + payload.config.localization, + parentIsLocalized, + ), + }) +} + +const tabs: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + field.tabs.forEach((tab) => { + if (tabHasName(tab)) { + if (fieldIsVirtual(tab)) { + return + } + const baseSchema = { + type: buildSchema({ + buildSchemaOptions: { + disableUnique: buildSchemaOptions.disableUnique, + draftsEnabled: buildSchemaOptions.draftsEnabled, + options: { + _id: false, + id: false, + minimize: false, + }, + }, + configFields: tab.fields, + parentIsLocalized: parentIsLocalized || tab.localized, + payload, + }), + } + + schema.add({ + [tab.name]: localizeSchema(tab, baseSchema, payload.config.localization, parentIsLocalized), + }) + } else { + tab.fields.forEach((subField: Field) => { + if (fieldIsVirtual(subField)) { + return + } + const addFieldSchema = getSchemaGenerator(subField.type) + + if (addFieldSchema) { + addFieldSchema( + subField, + schema, + payload, + buildSchemaOptions, + (parentIsLocalized || tab.localized) ?? false, + ) + } + }) + } + }) +} + +const text: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: field.hasMany ? [String] : String, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const textarea: FieldSchemaGenerator = ( + field: TextareaField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const upload: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const hasManyRelations = Array.isArray(field.relationTo) + let schemaToReturn: { [key: string]: any } = {} + + const valueType = getRelationshipValueType(field, payload) + + if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { + schemaToReturn = { + _id: false, + type: payload.config.localization.localeCodes.reduce((locales, locale) => { + let localeSchema: { [key: string]: any } = {} + + if (hasManyRelations) { + localeSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + _id: false, + type: mongoose.Schema.Types.Mixed, + relationTo: { type: String, enum: field.relationTo }, + value: { + type: valueType, + refPath: `${field.name}.${locale}.relationTo`, + }, + } + } else { + localeSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: valueType, + ref: field.relationTo, + } + } + + return { + ...locales, + [locale]: field.hasMany + ? { type: [localeSchema], default: formatDefaultValue(field) } + : localeSchema, + } + }, {}), + localized: true, + } + } else if (hasManyRelations) { + schemaToReturn = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + _id: false, + type: mongoose.Schema.Types.Mixed, + relationTo: { type: String, enum: field.relationTo }, + value: { + type: valueType, + refPath: `${field.name}.relationTo`, + }, + } + + if (field.hasMany) { + schemaToReturn = { + type: [schemaToReturn], + default: formatDefaultValue(field), + } + } + } else { + schemaToReturn = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: valueType, + ref: field.relationTo, + } + + if (field.hasMany) { + schemaToReturn = { + type: [schemaToReturn], + default: formatDefaultValue(field), + } + } + } + + schema.add({ + [field.name]: schemaToReturn, + }) +} + +const getSchemaGenerator = (fieldType: string): FieldSchemaGenerator | null => { + if (fieldType in fieldToSchemaMap) { + return fieldToSchemaMap[fieldType as keyof typeof fieldToSchemaMap] as FieldSchemaGenerator + } + + return null +} + +const fieldToSchemaMap = { + array, + blocks, + checkbox, + code, + collapsible, + date, + email, + group, + json, + number, + point, + radio, + relationship, + richText, + row, + select, + tabs, + text, + textarea, + upload, } const getRelationshipValueType = (field: RelationshipField | UploadField, payload: Payload) => { if (typeof field.relationTo === 'string') { - const { customIDType } = payload.collections[field.relationTo] + const customIDType = payload.collections[field.relationTo]?.customIDType if (!customIDType) { return mongoose.Schema.Types.ObjectId @@ -788,7 +884,7 @@ const getRelationshipValueType = (field: RelationshipField | UploadField, payloa // has custom id relationTo if ( field.relationTo.some((relationTo) => { - return !!payload.collections[relationTo].customIDType + return !!payload.collections[relationTo]?.customIDType }) ) { return mongoose.Schema.Types.Mixed diff --git a/packages/db-mongodb/src/predefinedMigrations/migrateRelationshipsV2_V3.ts b/packages/db-mongodb/src/predefinedMigrations/migrateRelationshipsV2_V3.ts index 7eabd67769..06665d9d67 100644 --- a/packages/db-mongodb/src/predefinedMigrations/migrateRelationshipsV2_V3.ts +++ b/packages/db-mongodb/src/predefinedMigrations/migrateRelationshipsV2_V3.ts @@ -1,16 +1,16 @@ import type { ClientSession, Model } from 'mongoose' -import type { Field, PayloadRequest, SanitizedConfig } from 'payload' +import type { Field, PayloadRequest } from 'payload' import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' import type { MongooseAdapter } from '../index.js' +import { getCollection, getGlobal } from '../utilities/getEntity.js' import { getSession } from '../utilities/getSession.js' import { transform } from '../utilities/transform.js' const migrateModelWithBatching = async ({ batchSize, - config, db, fields, Model, @@ -18,12 +18,11 @@ const migrateModelWithBatching = async ({ session, }: { batchSize: number - config: SanitizedConfig db: MongooseAdapter fields: Field[] Model: Model parentIsLocalized: boolean - session: ClientSession + session?: ClientSession }): Promise => { let hasNext = true let skip = 0 @@ -55,6 +54,7 @@ const migrateModelWithBatching = async ({ } await Model.collection.bulkWrite( + // @ts-expect-error bulkWrite has a weird type, insertOne, updateMany etc are required here as well. docs.map((doc) => ({ updateOne: { filter: { _id: doc._id }, @@ -123,12 +123,13 @@ export async function migrateRelationshipsV2_V3({ if (hasRelationshipOrUploadField(collection)) { payload.logger.info(`Migrating collection "${collection.slug}"`) + const { Model } = getCollection({ adapter: db, collectionSlug: collection.slug }) + await migrateModelWithBatching({ batchSize, - config, db, fields: collection.fields, - Model: db.collections[collection.slug], + Model, parentIsLocalized: false, session, }) @@ -139,12 +140,17 @@ export async function migrateRelationshipsV2_V3({ if (collection.versions) { payload.logger.info(`Migrating collection versions "${collection.slug}"`) + const { Model } = getCollection({ + adapter: db, + collectionSlug: collection.slug, + versions: true, + }) + await migrateModelWithBatching({ batchSize, - config, db, fields: buildVersionCollectionFields(config, collection), - Model: db.versions[collection.slug], + Model, parentIsLocalized: false, session, }) @@ -193,12 +199,13 @@ export async function migrateRelationshipsV2_V3({ if (global.versions) { payload.logger.info(`Migrating global versions "${global.slug}"`) + const { Model } = getGlobal({ adapter: db, globalSlug: global.slug, versions: true }) + await migrateModelWithBatching({ batchSize, - config, db, fields: buildVersionGlobalFields(config, global), - Model: db.versions[global.slug], + Model, parentIsLocalized: false, session, }) diff --git a/packages/db-mongodb/src/predefinedMigrations/migrateVersionsV1_V2.ts b/packages/db-mongodb/src/predefinedMigrations/migrateVersionsV1_V2.ts index 17dd82b7fc..c6205cc518 100644 --- a/packages/db-mongodb/src/predefinedMigrations/migrateVersionsV1_V2.ts +++ b/packages/db-mongodb/src/predefinedMigrations/migrateVersionsV1_V2.ts @@ -3,18 +3,20 @@ import type { Payload, PayloadRequest } from 'payload' import type { MongooseAdapter } from '../index.js' +import { getCollection, getGlobal } from '../utilities/getEntity.js' import { getSession } from '../utilities/getSession.js' export async function migrateVersionsV1_V2({ req }: { req: PayloadRequest }) { const { payload } = req - const session = await getSession(payload.db as MongooseAdapter, req) + const adapter = payload.db as MongooseAdapter + const session = await getSession(adapter, req) // For each collection for (const { slug, versions } of payload.config.collections) { if (versions?.drafts) { - await migrateCollectionDocs({ slug, payload, session }) + await migrateCollectionDocs({ slug, adapter, payload, session }) payload.logger.info(`Migrated the "${slug}" collection.`) } @@ -23,9 +25,13 @@ export async function migrateVersionsV1_V2({ req }: { req: PayloadRequest }) { // For each global for (const { slug, versions } of payload.config.globals) { if (versions) { - const VersionsModel = payload.db.versions[slug] + const { Model } = getGlobal({ + adapter, + globalSlug: slug, + versions: true, + }) - await VersionsModel.findOneAndUpdate( + await Model.findOneAndUpdate( {}, { latest: true }, { @@ -41,17 +47,23 @@ export async function migrateVersionsV1_V2({ req }: { req: PayloadRequest }) { async function migrateCollectionDocs({ slug, + adapter, docsAtATime = 100, payload, session, }: { + adapter: MongooseAdapter docsAtATime?: number payload: Payload - session: ClientSession + session?: ClientSession slug: string }) { - const VersionsModel = payload.db.versions[slug] - const remainingDocs = await VersionsModel.aggregate( + const { Model } = getCollection({ + adapter, + collectionSlug: slug, + versions: true, + }) + const remainingDocs = await Model.aggregate( [ // Sort so that newest are first { @@ -87,7 +99,7 @@ async function migrateCollectionDocs({ ).exec() if (!remainingDocs || remainingDocs.length === 0) { - const newVersions = await VersionsModel.find( + const newVersions = await Model.find( { latest: { $eq: true, @@ -108,7 +120,7 @@ async function migrateCollectionDocs({ const remainingDocIDs = remainingDocs.map((doc) => doc._versionID) - await VersionsModel.updateMany( + await Model.updateMany( { _id: { $in: remainingDocIDs, @@ -122,5 +134,5 @@ async function migrateCollectionDocs({ }, ) - await migrateCollectionDocs({ slug, payload, session }) + await migrateCollectionDocs({ slug, adapter, payload, session }) } diff --git a/packages/db-mongodb/src/queries/buildSearchParams.ts b/packages/db-mongodb/src/queries/buildSearchParams.ts index fbeefa0911..0e79fd65d4 100644 --- a/packages/db-mongodb/src/queries/buildSearchParams.ts +++ b/packages/db-mongodb/src/queries/buildSearchParams.ts @@ -1,11 +1,14 @@ +import type { FilterQuery } from 'mongoose' import type { FlattenedField, Operator, PathToQuery, Payload } from 'payload' import { Types } from 'mongoose' -import { getLocalizedPaths } from 'payload' +import { APIError, getLocalizedPaths } from 'payload' import { validOperatorSet } from 'payload/shared' import type { MongooseAdapter } from '../index.js' +import type { OperatorMapKey } from './operatorMap.js' +import { getCollection } from '../utilities/getEntity.js' import { operatorMap } from './operatorMap.js' import { sanitizeQueryValue } from './sanitizeQueryValue.js' @@ -43,7 +46,7 @@ export async function buildSearchParam({ parentIsLocalized: boolean payload: Payload val: unknown -}): Promise { +}): Promise { // Replace GraphQL nested field double underscore formatting let sanitizedPath = incomingPath.replace(/__/g, '.') if (sanitizedPath === 'id') { @@ -55,7 +58,9 @@ export async function buildSearchParam({ let hasCustomID = false if (sanitizedPath === '_id') { - const customIDFieldType = payload.collections[collectionSlug]?.customIDType + const customIDFieldType = collectionSlug + ? payload.collections[collectionSlug]?.customIDType + : undefined let idFieldType: 'number' | 'text' = 'text' @@ -71,7 +76,7 @@ export async function buildSearchParam({ name: 'id', type: idFieldType, } as FlattenedField, - parentIsLocalized, + parentIsLocalized: parentIsLocalized ?? false, path: '_id', }) } else { @@ -86,6 +91,10 @@ export async function buildSearchParam({ }) } + if (!paths[0]) { + return undefined + } + const [{ field, path }] = paths if (path) { const sanitizedQueryValue = sanitizeQueryValue({ @@ -109,6 +118,10 @@ export async function buildSearchParam({ return { value: rawQuery } } + if (!formattedOperator) { + return undefined + } + // If there are multiple collections to search through, // Recursively build up a list of query constraints if (paths.length > 1) { @@ -116,84 +129,86 @@ export async function buildSearchParam({ // to work backwards from top const pathsToQuery = paths.slice(1).reverse() - const initialRelationshipQuery = { + let relationshipQuery: SearchParam = { value: {}, - } as SearchParam + } - const relationshipQuery = await pathsToQuery.reduce( - async (priorQuery, { collectionSlug: slug, path: subPath }, i) => { - const priorQueryResult = await priorQuery + for (const [i, { collectionSlug, path: subPath }] of pathsToQuery.entries()) { + if (!collectionSlug) { + throw new APIError(`Collection with the slug ${collectionSlug} was not found.`) + } - const SubModel = (payload.db as MongooseAdapter).collections[slug] + const { Model: SubModel } = getCollection({ + adapter: payload.db as MongooseAdapter, + collectionSlug, + }) - // On the "deepest" collection, - // Search on the value passed through the query - if (i === 0) { - const subQuery = await SubModel.buildQuery({ - locale, - payload, - where: { - [subPath]: { - [formattedOperator]: val, - }, + if (i === 0) { + const subQuery = await SubModel.buildQuery({ + locale, + payload, + where: { + [subPath]: { + [formattedOperator]: val, }, - }) + }, + }) - const result = await SubModel.find(subQuery, subQueryOptions) - - const $in: unknown[] = [] - - result.forEach((doc) => { - const stringID = doc._id.toString() - $in.push(stringID) - - if (Types.ObjectId.isValid(stringID)) { - $in.push(doc._id) - } - }) - - if (pathsToQuery.length === 1) { - return { - path, - value: { $in }, - } - } - - const nextSubPath = pathsToQuery[i + 1].path - - return { - value: { [nextSubPath]: { $in } }, - } - } - - const subQuery = priorQueryResult.value const result = await SubModel.find(subQuery, subQueryOptions) - const $in = result.map((doc) => doc._id) + const $in: unknown[] = [] - // If it is the last recursion - // then pass through the search param - if (i + 1 === pathsToQuery.length) { + result.forEach((doc) => { + const stringID = doc._id.toString() + $in.push(stringID) + + if (Types.ObjectId.isValid(stringID)) { + $in.push(doc._id) + } + }) + + if (pathsToQuery.length === 1) { return { path, value: { $in }, } } - return { + const nextSubPath = pathsToQuery[i + 1]?.path + + if (nextSubPath) { + relationshipQuery = { value: { [nextSubPath]: $in } } + } + + continue + } + + const subQuery = relationshipQuery.value as FilterQuery + const result = await SubModel.find(subQuery, subQueryOptions) + + const $in = result.map((doc) => doc._id) + + // If it is the last recursion + // then pass through the search param + if (i + 1 === pathsToQuery.length) { + relationshipQuery = { + path, + value: { $in }, + } + } else { + relationshipQuery = { value: { _id: { $in }, }, } - }, - Promise.resolve(initialRelationshipQuery), - ) + } + } return relationshipQuery } if (formattedOperator && validOperatorSet.has(formattedOperator as Operator)) { - const operatorKey = operatorMap[formattedOperator] + const operatorKey = operatorMap[formattedOperator as OperatorMapKey] if (field.type === 'relationship' || field.type === 'upload') { let hasNumberIDRelation @@ -210,7 +225,7 @@ export async function buildSearchParam({ if (typeof formattedValue === 'string') { if (Types.ObjectId.isValid(formattedValue)) { - result.value[multiIDCondition].push({ + result.value[multiIDCondition]?.push({ [path]: { [operatorKey]: new Types.ObjectId(formattedValue) }, }) } else { @@ -226,14 +241,16 @@ export async function buildSearchParam({ ) if (hasNumberIDRelation) { - result.value[multiIDCondition].push({ + result.value[multiIDCondition]?.push({ [path]: { [operatorKey]: parseFloat(formattedValue) }, }) } } } - if (result.value[multiIDCondition].length > 1) { + const length = result.value[multiIDCondition]?.length + + if (typeof length === 'number' && length > 1) { return result } } diff --git a/packages/db-mongodb/src/queries/buildSortParam.ts b/packages/db-mongodb/src/queries/buildSortParam.ts index d58dcc6e0a..6aa399eaaf 100644 --- a/packages/db-mongodb/src/queries/buildSortParam.ts +++ b/packages/db-mongodb/src/queries/buildSortParam.ts @@ -1,4 +1,3 @@ -import type { PaginateOptions } from 'mongoose' import type { FlattenedField, SanitizedConfig, Sort } from 'payload' import { getLocalizedSortProperty } from './getLocalizedSortProperty.js' @@ -6,7 +5,7 @@ import { getLocalizedSortProperty } from './getLocalizedSortProperty.js' type Args = { config: SanitizedConfig fields: FlattenedField[] - locale: string + locale?: string parentIsLocalized?: boolean sort: Sort timestamps: boolean @@ -23,10 +22,10 @@ export const buildSortParam = ({ config, fields, locale, - parentIsLocalized, + parentIsLocalized = false, sort, timestamps, -}: Args): PaginateOptions['sort'] => { +}: Args): Record => { if (!sort) { if (timestamps) { sort = '-createdAt' @@ -39,7 +38,7 @@ export const buildSortParam = ({ sort = [sort] } - const sorting = sort.reduce((acc, item) => { + const sorting = sort.reduce>((acc, item) => { let sortProperty: string let sortDirection: SortDirection if (item.indexOf('-') === 0) { diff --git a/packages/db-mongodb/src/queries/getBuildQueryPlugin.ts b/packages/db-mongodb/src/queries/getBuildQueryPlugin.ts index 4ee8a39e85..494d4a49be 100644 --- a/packages/db-mongodb/src/queries/getBuildQueryPlugin.ts +++ b/packages/db-mongodb/src/queries/getBuildQueryPlugin.ts @@ -1,6 +1,6 @@ import type { FlattenedField, Payload, Where } from 'payload' -import { QueryError } from 'payload' +import { APIError } from 'payload' import { parseParams } from './parseParams.js' @@ -23,7 +23,7 @@ export const getBuildQueryPlugin = ({ collectionSlug, versionsFields, }: GetBuildQueryPluginArgs = {}) => { - return function buildQueryPlugin(schema) { + return function buildQueryPlugin(schema: any) { const modifiedSchema = schema async function schemaBuildQuery({ globalSlug, @@ -31,19 +31,35 @@ export const getBuildQueryPlugin = ({ payload, where, }: BuildQueryArgs): Promise> { - let fields = versionsFields - if (!fields) { + let fields: FlattenedField[] | null = null + + if (versionsFields) { + fields = versionsFields + } else { if (globalSlug) { const globalConfig = payload.globals.config.find(({ slug }) => slug === globalSlug) + + if (!globalConfig) { + throw new APIError(`Global with the slug ${globalSlug} was not found`) + } + fields = globalConfig.flattenedFields } if (collectionSlug) { - const collectionConfig = payload.collections[collectionSlug].config + const collectionConfig = payload.collections[collectionSlug]?.config + + if (!collectionConfig) { + throw new APIError(`Collection with the slug ${globalSlug} was not found`) + } + fields = collectionConfig.flattenedFields } } - const errors = [] + if (fields === null) { + throw new APIError('Fields are not initialized.') + } + const result = await parseParams({ collectionSlug, fields, @@ -54,10 +70,6 @@ export const getBuildQueryPlugin = ({ where, }) - if (errors.length > 0) { - throw new QueryError(errors) - } - return result } modifiedSchema.statics.buildQuery = schemaBuildQuery diff --git a/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts b/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts index cee0b68084..618eb09f32 100644 --- a/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts +++ b/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts @@ -19,6 +19,7 @@ describe('get localized sort property', () => { it('passes through a non-localized sort property', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: [ { name: 'title', @@ -35,6 +36,7 @@ describe('get localized sort property', () => { it('properly localizes an un-localized sort property', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: [ { name: 'title', @@ -52,6 +54,7 @@ describe('get localized sort property', () => { it('keeps specifically asked-for localized sort properties', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: [ { name: 'title', @@ -69,6 +72,7 @@ describe('get localized sort property', () => { it('properly localizes nested sort properties', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { @@ -94,6 +98,7 @@ describe('get localized sort property', () => { it('keeps requested locale with nested sort properties', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { @@ -119,6 +124,7 @@ describe('get localized sort property', () => { it('properly localizes field within row', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { @@ -143,6 +149,7 @@ describe('get localized sort property', () => { it('properly localizes field within named tab', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { @@ -172,6 +179,7 @@ describe('get localized sort property', () => { it('properly localizes field within unnamed tab', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { diff --git a/packages/db-mongodb/src/queries/getLocalizedSortProperty.ts b/packages/db-mongodb/src/queries/getLocalizedSortProperty.ts index 48c23505cf..5e91205e3b 100644 --- a/packages/db-mongodb/src/queries/getLocalizedSortProperty.ts +++ b/packages/db-mongodb/src/queries/getLocalizedSortProperty.ts @@ -5,7 +5,7 @@ import { fieldAffectsData, fieldIsPresentationalOnly, fieldShouldBeLocalized } f type Args = { config: SanitizedConfig fields: FlattenedField[] - locale: string + locale?: string parentIsLocalized: boolean result?: string segments: string[] @@ -36,14 +36,16 @@ export const getLocalizedSortProperty = ({ ) if (matchedField && !fieldIsPresentationalOnly(matchedField)) { - let nextFields: FlattenedField[] + let nextFields: FlattenedField[] | null = null let nextParentIsLocalized = parentIsLocalized const remainingSegments = [...segments] let localizedSegment = matchedField.name - if (fieldShouldBeLocalized({ field: matchedField, parentIsLocalized })) { + if ( + fieldShouldBeLocalized({ field: matchedField, parentIsLocalized: parentIsLocalized ?? false }) + ) { // Check to see if next segment is a locale - if (segments.length > 0) { + if (segments.length > 0 && remainingSegments[0]) { const nextSegmentIsLocale = config.localization.localeCodes.includes(remainingSegments[0]) // If next segment is locale, remove it from remaining segments @@ -66,16 +68,21 @@ export const getLocalizedSortProperty = ({ ) { nextFields = matchedField.flattenedFields if (!nextParentIsLocalized) { - nextParentIsLocalized = matchedField.localized + nextParentIsLocalized = matchedField.localized ?? false } } if (matchedField.type === 'blocks') { - nextFields = (matchedField.blockReferences ?? matchedField.blocks).reduce( + nextFields = (matchedField.blockReferences ?? matchedField.blocks).reduce( (flattenedBlockFields, _block) => { // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks const block = - typeof _block === 'string' ? config.blocks.find((b) => b.slug === _block) : _block + typeof _block === 'string' ? config.blocks?.find((b) => b.slug === _block) : _block + + if (!block) { + return [...flattenedBlockFields] + } + return [ ...flattenedBlockFields, ...block.flattenedFields.filter( @@ -93,7 +100,7 @@ export const getLocalizedSortProperty = ({ const result = incomingResult ? `${incomingResult}.${localizedSegment}` : localizedSegment - if (nextFields) { + if (nextFields !== null) { return getLocalizedSortProperty({ config, fields: nextFields, diff --git a/packages/db-mongodb/src/queries/operatorMap.ts b/packages/db-mongodb/src/queries/operatorMap.ts index e4352149d4..4c3a272a72 100644 --- a/packages/db-mongodb/src/queries/operatorMap.ts +++ b/packages/db-mongodb/src/queries/operatorMap.ts @@ -1,3 +1,5 @@ +export type OperatorMapKey = keyof typeof operatorMap + export const operatorMap = { all: '$all', equals: '$eq', diff --git a/packages/db-mongodb/src/queries/parseParams.ts b/packages/db-mongodb/src/queries/parseParams.ts index 45b544ac1d..fc4e75ab38 100644 --- a/packages/db-mongodb/src/queries/parseParams.ts +++ b/packages/db-mongodb/src/queries/parseParams.ts @@ -19,7 +19,7 @@ export async function parseParams({ collectionSlug?: string fields: FlattenedField[] globalSlug?: string - locale: string + locale?: string parentIsLocalized: boolean payload: Payload where: Where @@ -30,7 +30,7 @@ export async function parseParams({ // We need to determine if the whereKey is an AND, OR, or a schema path for (const relationOrPath of Object.keys(where)) { const condition = where[relationOrPath] - let conditionOperator: '$and' | '$or' + let conditionOperator: '$and' | '$or' | null = null if (relationOrPath.toLowerCase() === 'and') { conditionOperator = '$and' } else if (relationOrPath.toLowerCase() === 'or') { @@ -46,7 +46,7 @@ export async function parseParams({ payload, where: condition, }) - if (builtConditions.length > 0) { + if (builtConditions.length > 0 && conditionOperator !== null) { result[conditionOperator] = builtConditions } } else { @@ -58,6 +58,7 @@ export async function parseParams({ const validOperators = Object.keys(pathOperators).filter((operator) => validOperatorSet.has(operator as Operator), ) + for (const operator of validOperators) { const searchParam = await buildSearchParam({ collectionSlug, @@ -68,7 +69,7 @@ export async function parseParams({ operator, parentIsLocalized, payload, - val: pathOperators[operator], + val: (pathOperators as Record)[operator], }) if (searchParam?.value && searchParam?.path) { @@ -83,7 +84,7 @@ export async function parseParams({ result[searchParam.path] = searchParam.value } } else if (typeof searchParam?.value === 'object') { - result = deepMergeWithCombinedArrays(result, searchParam.value, { + result = deepMergeWithCombinedArrays(result, searchParam.value ?? {}, { // dont clone Types.ObjectIDs clone: false, }) diff --git a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts index 75297996ea..c17c239b73 100644 --- a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts +++ b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts @@ -21,7 +21,7 @@ type SanitizeQueryValueArgs = { val: any } -const buildExistsQuery = (formattedValue, path, treatEmptyString = true) => { +const buildExistsQuery = (formattedValue: unknown, path: string, treatEmptyString = true) => { if (formattedValue) { return { rawQuery: { @@ -54,14 +54,17 @@ const getFieldFromSegments = ({ field: FlattenedBlock | FlattenedField payload: Payload segments: string[] -}) => { +}): FlattenedField | undefined => { if ('blocks' in field || 'blockReferences' in field) { const _field: FlattenedBlocksField = field as FlattenedBlocksField for (const _block of _field.blockReferences ?? _field.blocks) { - const block: FlattenedBlock = typeof _block === 'string' ? payload.blocks[_block] : _block - const field = getFieldFromSegments({ field: block, payload, segments }) - if (field) { - return field + const block: FlattenedBlock | undefined = + typeof _block === 'string' ? payload.blocks[_block] : _block + if (block) { + const field = getFieldFromSegments({ field: block, payload, segments }) + if (field) { + return field + } } } } @@ -93,11 +96,13 @@ export const sanitizeQueryValue = ({ path, payload, val, -}: SanitizeQueryValueArgs): { - operator?: string - rawQuery?: unknown - val?: unknown -} => { +}: SanitizeQueryValueArgs): + | { + operator?: string + rawQuery?: unknown + val?: unknown + } + | undefined => { let formattedValue = val let formattedOperator = operator if (['array', 'blocks', 'group', 'tab'].includes(field.type) && path.includes('.')) { @@ -141,24 +146,26 @@ export const sanitizeQueryValue = ({ formattedValue = createArrayFromCommaDelineated(val) } - formattedValue = formattedValue.reduce((formattedValues, inVal) => { - if (!hasCustomID) { - if (Types.ObjectId.isValid(inVal)) { - formattedValues.push(new Types.ObjectId(inVal)) + if (Array.isArray(formattedValue)) { + formattedValue = formattedValue.reduce((formattedValues, inVal) => { + if (!hasCustomID) { + if (Types.ObjectId.isValid(inVal)) { + formattedValues.push(new Types.ObjectId(inVal)) + } } - } - if (field.type === 'number') { - const parsedNumber = parseFloat(inVal) - if (!Number.isNaN(parsedNumber)) { - formattedValues.push(parsedNumber) + if (field.type === 'number') { + const parsedNumber = parseFloat(inVal) + if (!Number.isNaN(parsedNumber)) { + formattedValues.push(parsedNumber) + } + } else { + formattedValues.push(inVal) } - } else { - formattedValues.push(inVal) - } - return formattedValues - }, []) + return formattedValues + }, []) + } } } @@ -175,7 +182,7 @@ export const sanitizeQueryValue = ({ if (['all', 'in', 'not_in'].includes(operator) && typeof formattedValue === 'string') { formattedValue = createArrayFromCommaDelineated(formattedValue) - if (field.type === 'number') { + if (field.type === 'number' && Array.isArray(formattedValue)) { formattedValue = formattedValue.map((arrayVal) => parseFloat(arrayVal)) } } @@ -264,7 +271,7 @@ export const sanitizeQueryValue = ({ return formattedValues } - if (typeof relationTo === 'string' && payload.collections[relationTo].customIDType) { + if (typeof relationTo === 'string' && payload.collections[relationTo]?.customIDType) { if (payload.collections[relationTo].customIDType === 'number') { const parsedNumber = parseFloat(inVal) if (!Number.isNaN(parsedNumber)) { @@ -279,7 +286,7 @@ export const sanitizeQueryValue = ({ if ( Array.isArray(relationTo) && - relationTo.some((relationTo) => !!payload.collections[relationTo].customIDType) + relationTo.some((relationTo) => !!payload.collections[relationTo]?.customIDType) ) { if (Types.ObjectId.isValid(inVal.toString())) { formattedValues.push(new Types.ObjectId(inVal)) @@ -302,7 +309,7 @@ export const sanitizeQueryValue = ({ (!Array.isArray(relationTo) || !path.endsWith('.relationTo')) ) { if (typeof relationTo === 'string') { - const customIDType = payload.collections[relationTo].customIDType + const customIDType = payload.collections[relationTo]?.customIDType if (customIDType) { if (customIDType === 'number') { @@ -320,7 +327,7 @@ export const sanitizeQueryValue = ({ } } else { const hasCustomIDType = relationTo.some( - (relationTo) => !!payload.collections[relationTo].customIDType, + (relationTo) => !!payload.collections[relationTo]?.customIDType, ) if (hasCustomIDType) { diff --git a/packages/db-mongodb/src/queryDrafts.ts b/packages/db-mongodb/src/queryDrafts.ts index 1a8ba6269b..e04c96a48f 100644 --- a/packages/db-mongodb/src/queryDrafts.ts +++ b/packages/db-mongodb/src/queryDrafts.ts @@ -7,17 +7,34 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildSortParam } from './queries/buildSortParam.js' +import { aggregatePaginate } from './utilities/aggregatePaginate.js' import { buildJoinAggregation } from './utilities/buildJoinAggregation.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const queryDrafts: QueryDrafts = async function queryDrafts( this: MongooseAdapter, - { collection, joins, limit, locale, page, pagination, req, select, sort: sortArg, where }, + { + collection: collectionSlug, + joins, + limit, + locale, + page, + pagination, + req, + select, + sort: sortArg, + where = {}, + }, ) { - const VersionModel = this.versions[collection] - const collectionConfig = this.payload.collections[collection].config + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) + const options: QueryOptions = { session: await getSession(this, req), } @@ -88,24 +105,25 @@ export const queryDrafts: QueryDrafts = async function queryDrafts( // the correct indexed field paginationOptions.useCustomCountFn = () => { return Promise.resolve( - VersionModel.countDocuments(versionQuery, { + Model.countDocuments(versionQuery, { hint: { _id: 1 }, }), ) } } - if (limit > 0) { + if (limit && limit > 0) { paginationOptions.limit = limit // limit must also be set here, it's ignored when pagination is false - paginationOptions.options.limit = limit + + paginationOptions.options!.limit = limit } let result const aggregate = await buildJoinAggregation({ adapter: this, - collection, + collection: collectionSlug, collectionConfig, joins, locale, @@ -116,12 +134,22 @@ export const queryDrafts: QueryDrafts = async function queryDrafts( // build join aggregation if (aggregate) { - result = await VersionModel.aggregatePaginate( - VersionModel.aggregate(aggregate), - paginationOptions, - ) + result = await aggregatePaginate({ + adapter: this, + collation: paginationOptions.collation, + joinAggregation: aggregate, + limit: paginationOptions.limit, + Model, + page: paginationOptions.page, + pagination: paginationOptions.pagination, + projection: paginationOptions.projection, + query: versionQuery, + session: paginationOptions.options?.session ?? undefined, + sort: paginationOptions.sort as object, + useEstimatedCount: paginationOptions.useEstimatedCount, + }) } else { - result = await VersionModel.paginate(versionQuery, paginationOptions) + result = await Model.paginate(versionQuery, paginationOptions) } transform({ diff --git a/packages/db-mongodb/src/transactions/beginTransaction.ts b/packages/db-mongodb/src/transactions/beginTransaction.ts index 82e681d0b7..022e0a362a 100644 --- a/packages/db-mongodb/src/transactions/beginTransaction.ts +++ b/packages/db-mongodb/src/transactions/beginTransaction.ts @@ -7,6 +7,7 @@ import { v4 as uuid } from 'uuid' import type { MongooseAdapter } from '../index.js' // Needs await to fulfill the interface +// @ts-expect-error TransactionOptions isn't compatible with BeginTransaction of the DatabaseAdapter interface. // eslint-disable-next-line @typescript-eslint/require-await export const beginTransaction: BeginTransaction = async function beginTransaction( this: MongooseAdapter, @@ -20,12 +21,13 @@ export const beginTransaction: BeginTransaction = async function beginTransactio const id = uuid() if (!this.sessions[id]) { + // @ts-expect-error BaseDatabaseAdapter and MongoosAdapter (that extends Base) sessions aren't compatible. this.sessions[id] = client.startSession() } - if (this.sessions[id].inTransaction()) { + if (this.sessions[id]?.inTransaction()) { this.payload.logger.warn('beginTransaction called while transaction already exists') } else { - this.sessions[id].startTransaction(options || (this.transactionOptions as TransactionOptions)) + this.sessions[id]?.startTransaction(options || (this.transactionOptions as TransactionOptions)) } return id diff --git a/packages/db-mongodb/src/transactions/commitTransaction.ts b/packages/db-mongodb/src/transactions/commitTransaction.ts index 32a7517174..6fcbdb838c 100644 --- a/packages/db-mongodb/src/transactions/commitTransaction.ts +++ b/packages/db-mongodb/src/transactions/commitTransaction.ts @@ -1,6 +1,11 @@ import type { CommitTransaction } from 'payload' -export const commitTransaction: CommitTransaction = async function commitTransaction(id) { +import type { MongooseAdapter } from '../index.js' + +export const commitTransaction: CommitTransaction = async function commitTransaction( + this: MongooseAdapter, + id, +) { if (id instanceof Promise) { return } @@ -12,7 +17,7 @@ export const commitTransaction: CommitTransaction = async function commitTransac await this.sessions[id].commitTransaction() try { await this.sessions[id].endSession() - } catch (error) { + } catch (_) { // ending sessions is only best effort and won't impact anything if it fails since the transaction was committed } delete this.sessions[id] diff --git a/packages/db-mongodb/src/transactions/rollbackTransaction.ts b/packages/db-mongodb/src/transactions/rollbackTransaction.ts index c53410e400..78c6f35363 100644 --- a/packages/db-mongodb/src/transactions/rollbackTransaction.ts +++ b/packages/db-mongodb/src/transactions/rollbackTransaction.ts @@ -1,6 +1,9 @@ import type { RollbackTransaction } from 'payload' +import type { MongooseAdapter } from '../index.js' + export const rollbackTransaction: RollbackTransaction = async function rollbackTransaction( + this: MongooseAdapter, incomingID = '', ) { let transactionID: number | string @@ -18,7 +21,7 @@ export const rollbackTransaction: RollbackTransaction = async function rollbackT } // when session exists but is not inTransaction something unexpected is happening to the session - if (!this.sessions[transactionID].inTransaction()) { + if (!this.sessions[transactionID]?.inTransaction()) { this.payload.logger.warn('rollbackTransaction called when no transaction exists') delete this.sessions[transactionID] return @@ -26,8 +29,8 @@ export const rollbackTransaction: RollbackTransaction = async function rollbackT // the first call for rollback should be aborted and deleted causing any other operations with the same transaction to fail try { - await this.sessions[transactionID].abortTransaction() - await this.sessions[transactionID].endSession() + await this.sessions[transactionID]?.abortTransaction() + await this.sessions[transactionID]?.endSession() } catch (error) { // ignore the error as it is likely a race condition from multiple errors } diff --git a/packages/db-mongodb/src/types.ts b/packages/db-mongodb/src/types.ts index b521efd8a2..f1b130631e 100644 --- a/packages/db-mongodb/src/types.ts +++ b/packages/db-mongodb/src/types.ts @@ -1,12 +1,5 @@ import type { ClientSession } from 'mongodb' -import type { - AggregatePaginateModel, - IndexDefinition, - IndexOptions, - Model, - PaginateModel, - SchemaOptions, -} from 'mongoose' +import type { IndexDefinition, IndexOptions, Model, PaginateModel, SchemaOptions } from 'mongoose' import type { ArrayField, BlocksField, @@ -37,10 +30,7 @@ import type { import type { BuildQueryArgs } from './queries/getBuildQueryPlugin.js' -export interface CollectionModel - extends Model, - PaginateModel, - AggregatePaginateModel { +export interface CollectionModel extends Model, PaginateModel { /** 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/packages/db-mongodb/src/updateGlobal.ts b/packages/db-mongodb/src/updateGlobal.ts index 3ed8a04b3c..6e883de210 100644 --- a/packages/db-mongodb/src/updateGlobal.ts +++ b/packages/db-mongodb/src/updateGlobal.ts @@ -1,36 +1,43 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import type { UpdateGlobal } from 'payload' import type { MongooseAdapter } from './index.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const updateGlobal: UpdateGlobal = async function updateGlobal( this: MongooseAdapter, - { slug, data, options: optionsArgs = {}, req, select }, + { slug: globalSlug, data, options: optionsArgs = {}, req, returning, select }, ) { - const Model = this.globals - const fields = this.payload.config.globals.find((global) => global.slug === slug).fields + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug }) - const options: QueryOptions = { + const fields = globalConfig.fields + + const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, new: true, projection: buildProjectionFromSelect({ adapter: this, - fields: this.payload.config.globals.find((global) => global.slug === slug).flattenedFields, + fields: globalConfig.flattenedFields, select, }), session: await getSession(this, req), } - transform({ adapter: this, data, fields, globalSlug: slug, operation: 'write' }) + transform({ adapter: this, data, fields, globalSlug, operation: 'write' }) - const result: any = await Model.findOneAndUpdate({ globalType: slug }, data, options) + if (returning === false) { + await Model.updateOne({ globalType: globalSlug }, data, options) + return null + } - transform({ adapter: this, data: result, fields, globalSlug: slug, operation: 'read' }) + const result: any = await Model.findOneAndUpdate({ globalType: globalSlug }, data, options) + + transform({ adapter: this, data: result, fields, globalSlug, operation: 'read' }) return result } diff --git a/packages/db-mongodb/src/updateGlobalVersion.ts b/packages/db-mongodb/src/updateGlobalVersion.ts index 9bc4b592ea..6e26418ece 100644 --- a/packages/db-mongodb/src/updateGlobalVersion.ts +++ b/packages/db-mongodb/src/updateGlobalVersion.ts @@ -1,4 +1,4 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import { buildVersionGlobalFields, type TypeWithID, type UpdateGlobalVersionArgs } from 'payload' @@ -6,6 +6,7 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' @@ -17,18 +18,18 @@ export async function updateGlobalVersion( locale, options: optionsArgs = {}, req, + returning, select, versionData, where, }: UpdateGlobalVersionArgs, ) { - const VersionModel = this.versions[globalSlug] + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug, versions: true }) const whereToUse = where || { id: { equals: id } } - const currentGlobal = this.payload.config.globals.find((global) => global.slug === globalSlug) - const fields = buildVersionGlobalFields(this.payload.config, currentGlobal) - const flattenedFields = buildVersionGlobalFields(this.payload.config, currentGlobal, true) - const options: QueryOptions = { + const fields = buildVersionGlobalFields(this.payload.config, globalConfig) + const flattenedFields = buildVersionGlobalFields(this.payload.config, globalConfig, true) + const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, new: true, @@ -49,7 +50,12 @@ export async function updateGlobalVersion( transform({ adapter: this, data: versionData, fields, operation: 'write' }) - const doc = await VersionModel.findOneAndUpdate(query, versionData, options) + if (returning === false) { + await Model.updateOne(query, versionData, options) + return null + } + + const doc = await Model.findOneAndUpdate(query, versionData, options) if (!doc) { return null diff --git a/packages/db-mongodb/src/updateMany.ts b/packages/db-mongodb/src/updateMany.ts new file mode 100644 index 0000000000..ceac20fa54 --- /dev/null +++ b/packages/db-mongodb/src/updateMany.ts @@ -0,0 +1,84 @@ +import type { MongooseUpdateQueryOptions } from 'mongoose' +import type { UpdateMany } from 'payload' + +import type { MongooseAdapter } from './index.js' + +import { buildQuery } from './queries/buildQuery.js' +import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' +import { getSession } from './utilities/getSession.js' +import { handleError } from './utilities/handleError.js' +import { transform } from './utilities/transform.js' + +export const updateMany: UpdateMany = async function updateMany( + this: MongooseAdapter, + { + collection: collectionSlug, + data, + limit, + locale, + options: optionsArgs = {}, + req, + returning, + select, + where, + }, +) { + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) + + const options: MongooseUpdateQueryOptions = { + ...optionsArgs, + lean: true, + new: true, + projection: buildProjectionFromSelect({ + adapter: this, + fields: collectionConfig.flattenedFields, + select, + }), + session: await getSession(this, req), + } + + let query = await buildQuery({ + adapter: this, + collectionSlug, + fields: collectionConfig.flattenedFields, + locale, + where, + }) + + transform({ adapter: this, data, fields: collectionConfig.fields, operation: 'write' }) + + try { + if (typeof limit === 'number' && limit > 0) { + const documentsToUpdate = await Model.find( + query, + {}, + { ...options, limit, projection: { _id: 1 } }, + ) + if (documentsToUpdate.length === 0) { + return null + } + + query = { _id: { $in: documentsToUpdate.map((doc) => doc._id) } } + } + + await Model.updateMany(query, data, options) + } catch (error) { + handleError({ collection: collectionSlug, error, req }) + } + + if (returning === false) { + return null + } + + const result = await Model.find(query, {}, options) + + transform({ + adapter: this, + data: result, + fields: collectionConfig.fields, + operation: 'read', + }) + + return result +} diff --git a/packages/db-mongodb/src/updateOne.ts b/packages/db-mongodb/src/updateOne.ts index 25dd47ba37..f5b3ef2e10 100644 --- a/packages/db-mongodb/src/updateOne.ts +++ b/packages/db-mongodb/src/updateOne.ts @@ -1,28 +1,40 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import type { UpdateOne } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { handleError } from './utilities/handleError.js' import { transform } from './utilities/transform.js' export const updateOne: UpdateOne = async function updateOne( this: MongooseAdapter, - { id, collection, data, locale, options: optionsArgs = {}, req, select, where: whereArg }, + { + id, + collection: collectionSlug, + data, + locale, + options: optionsArgs = {}, + req, + returning, + select, + where: whereArg = {}, + }, ) { + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) const where = id ? { id: { equals: id } } : whereArg - const Model = this.collections[collection] - const fields = this.payload.collections[collection].config.fields - const options: QueryOptions = { + const fields = collectionConfig.fields + + const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, new: true, projection: buildProjectionFromSelect({ adapter: this, - fields: this.payload.collections[collection].config.flattenedFields, + fields: collectionConfig.flattenedFields, select, }), session: await getSession(this, req), @@ -30,8 +42,8 @@ export const updateOne: UpdateOne = async function updateOne( const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, locale, where, }) @@ -41,9 +53,14 @@ export const updateOne: UpdateOne = async function updateOne( transform({ adapter: this, data, fields, operation: 'write' }) try { - result = await Model.findOneAndUpdate(query, data, options) + if (returning === false) { + await Model.updateOne(query, data, options) + return null + } else { + result = await Model.findOneAndUpdate(query, data, options) + } } catch (error) { - handleError({ collection, error, req }) + handleError({ collection: collectionSlug, error, req }) } if (!result) { diff --git a/packages/db-mongodb/src/updateVersion.ts b/packages/db-mongodb/src/updateVersion.ts index a2431388a4..1fcc005ddb 100644 --- a/packages/db-mongodb/src/updateVersion.ts +++ b/packages/db-mongodb/src/updateVersion.ts @@ -1,4 +1,4 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import { buildVersionCollectionFields, type UpdateVersion } from 'payload' @@ -6,27 +6,36 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const updateVersion: UpdateVersion = async function updateVersion( this: MongooseAdapter, - { id, collection, locale, options: optionsArgs = {}, req, select, versionData, where }, + { + id, + collection: collectionSlug, + locale, + options: optionsArgs = {}, + req, + returning, + select, + versionData, + where, + }, ) { - const VersionModel = this.versions[collection] + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) + const whereToUse = where || { id: { equals: id } } - const fields = buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collection].config, - ) + const fields = buildVersionCollectionFields(this.payload.config, collectionConfig) - const flattenedFields = buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collection].config, - true, - ) + const flattenedFields = buildVersionCollectionFields(this.payload.config, collectionConfig, true) - const options: QueryOptions = { + const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, new: true, @@ -47,7 +56,12 @@ export const updateVersion: UpdateVersion = async function updateVersion( transform({ adapter: this, data: versionData, fields, operation: 'write' }) - const doc = await VersionModel.findOneAndUpdate(query, versionData, options) + if (returning === false) { + await Model.updateOne(query, versionData, options) + return null + } + + const doc = await Model.findOneAndUpdate(query, versionData, options) if (!doc) { return null diff --git a/packages/db-mongodb/src/upsert.ts b/packages/db-mongodb/src/upsert.ts index 3ee7303a19..0f662e914d 100644 --- a/packages/db-mongodb/src/upsert.ts +++ b/packages/db-mongodb/src/upsert.ts @@ -4,7 +4,16 @@ import type { MongooseAdapter } from './index.js' export const upsert: Upsert = async function upsert( this: MongooseAdapter, - { collection, data, locale, req, select, where }, + { collection, data, locale, req, returning, select, where }, ) { - return this.updateOne({ collection, data, locale, options: { upsert: true }, req, select, where }) + return this.updateOne({ + collection, + data, + locale, + options: { upsert: true }, + req, + returning, + select, + where, + }) } diff --git a/packages/db-mongodb/src/utilities/aggregatePaginate.ts b/packages/db-mongodb/src/utilities/aggregatePaginate.ts new file mode 100644 index 0000000000..de6a3ed6bd --- /dev/null +++ b/packages/db-mongodb/src/utilities/aggregatePaginate.ts @@ -0,0 +1,106 @@ +import type { CollationOptions } from 'mongodb' +import type { ClientSession, Model, PipelineStage } from 'mongoose' +import type { PaginatedDocs } from 'payload' + +import type { MongooseAdapter } from '../index.js' + +export const aggregatePaginate = async ({ + adapter, + collation, + joinAggregation, + limit, + Model, + page, + pagination, + projection, + query, + session, + sort, + useEstimatedCount, +}: { + adapter: MongooseAdapter + collation?: CollationOptions + joinAggregation?: PipelineStage[] + limit?: number + Model: Model + page?: number + pagination?: boolean + projection?: Record + query: Record + session?: ClientSession + sort?: object + useEstimatedCount?: boolean +}): Promise> => { + const aggregation: PipelineStage[] = [{ $match: query }] + + if (sort) { + const $sort: Record = {} + + Object.entries(sort).forEach(([key, value]) => { + $sort[key] = value === 'desc' ? -1 : 1 + }) + + aggregation.push({ $sort }) + } + + if (page) { + aggregation.push({ $skip: (page - 1) * (limit ?? 0) }) + } + + if (limit) { + aggregation.push({ $limit: limit }) + } + + if (joinAggregation) { + for (const stage of joinAggregation) { + aggregation.push(stage) + } + } + + if (projection) { + aggregation.push({ $project: projection }) + } + + let countPromise: Promise = Promise.resolve(null) + + if (pagination !== false && limit) { + if (useEstimatedCount) { + countPromise = Model.estimatedDocumentCount(query) + } else { + const hint = adapter.disableIndexHints !== true ? { _id: 1 } : undefined + countPromise = Model.countDocuments(query, { collation, hint, session }) + } + } + + const [docs, countResult] = await Promise.all([ + Model.aggregate(aggregation, { collation, session }), + countPromise, + ]) + + const count = countResult === null ? docs.length : countResult + + const totalPages = + pagination !== false && typeof limit === 'number' && limit !== 0 ? Math.ceil(count / limit) : 1 + + const hasPrevPage = typeof page === 'number' && pagination !== false && page > 1 + const hasNextPage = typeof page === 'number' && pagination !== false && totalPages > page + const pagingCounter = + typeof page === 'number' && pagination !== false && typeof limit === 'number' + ? (page - 1) * limit + 1 + : 1 + + const result: PaginatedDocs = { + docs, + hasNextPage, + hasPrevPage, + limit: limit ?? 0, + nextPage: hasNextPage ? page + 1 : null, + page, + pagingCounter, + prevPage: hasPrevPage ? page - 1 : null, + totalDocs: count, + totalPages, + } + + return result +} diff --git a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts index 4af139b5a7..3dd629b004 100644 --- a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts +++ b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts @@ -1,30 +1,29 @@ import type { PipelineStage } from 'mongoose' -import type { - CollectionSlug, - FlattenedField, - JoinQuery, - SanitizedCollectionConfig, - Where, -} from 'payload' +import { + APIError, + type CollectionSlug, + type FlattenedField, + type JoinQuery, + type SanitizedCollectionConfig, +} from 'payload' import { fieldShouldBeLocalized } from 'payload/shared' import type { MongooseAdapter } from '../index.js' import { buildQuery } from '../queries/buildQuery.js' import { buildSortParam } from '../queries/buildSortParam.js' +import { getCollection } from './getEntity.js' type BuildJoinAggregationArgs = { adapter: MongooseAdapter collection: CollectionSlug collectionConfig: SanitizedCollectionConfig - joins: JoinQuery - // the number of docs to get at the top collection level - limit?: number - locale: string + joins?: JoinQuery + locale?: string projection?: Record // the where clause for the top collection - query?: Where + query?: Record /** whether the query is from drafts */ versions?: boolean } @@ -34,10 +33,8 @@ export const buildJoinAggregation = async ({ collection, collectionConfig, joins, - limit, locale, projection, - query, versions, }: BuildJoinAggregationArgs): Promise => { if ( @@ -48,24 +45,17 @@ export const buildJoinAggregation = async ({ return } - const joinConfig = adapter.payload.collections[collection].config.joins - const polymorphicJoinsConfig = adapter.payload.collections[collection].config.polymorphicJoins - const aggregate: PipelineStage[] = [ - { - $sort: { createdAt: -1 }, - }, - ] + const joinConfig = adapter.payload.collections[collection]?.config?.joins - if (query) { - aggregate.push({ - $match: query, - }) + if (!joinConfig) { + throw new APIError(`Could not retrieve sanitized join config for ${collection}.`) } - if (limit) { - aggregate.push({ - $limit: limit, - }) + const aggregate: PipelineStage[] = [] + const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins + + if (!polymorphicJoinsConfig) { + throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`) } for (const join of polymorphicJoinsConfig) { @@ -78,15 +68,18 @@ export const buildJoinAggregation = async ({ } const { + count = false, limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, - where: whereJoin, + where: whereJoin = {}, } = joins?.[join.joinPath] || {} const aggregatedFields: FlattenedField[] = [] for (const collectionSlug of join.field.collection) { - for (const field of adapter.payload.collections[collectionSlug].config.flattenedFields) { + const { collectionConfig } = getCollection({ adapter, collectionSlug }) + + for (const field of collectionConfig.flattenedFields) { if (!aggregatedFields.some((eachField) => eachField.name === field.name)) { aggregatedFields.push(field) } @@ -108,7 +101,7 @@ export const buildJoinAggregation = async ({ where: whereJoin, }) - const sortProperty = Object.keys(sort)[0] + const sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key. const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1 const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo' @@ -121,33 +114,39 @@ export const buildJoinAggregation = async ({ const alias = `${as}.docs.${collectionSlug}` aliases.push(alias) + const basePipeline = [ + { + $addFields: { + relationTo: { + $literal: collectionSlug, + }, + }, + }, + { + $match: { + $and: [ + { + $expr: { + $eq: [`$${join.field.on}`, '$$root_id_'], + }, + }, + $match, + ], + }, + }, + ] + + const { Model: JoinModel } = getCollection({ adapter, collectionSlug }) + aggregate.push({ $lookup: { as: alias, - from: adapter.collections[collectionSlug].collection.name, + from: JoinModel.collection.name, let: { root_id_: '$_id', }, pipeline: [ - { - $addFields: { - relationTo: { - $literal: collectionSlug, - }, - }, - }, - { - $match: { - $and: [ - { - $expr: { - $eq: [`$${join.field.on}`, '$$root_id_'], - }, - }, - $match, - ], - }, - }, + ...basePipeline, { $sort: { [sortProperty]: sortDirection, @@ -169,6 +168,24 @@ export const buildJoinAggregation = async ({ ], }, }) + + if (count) { + aggregate.push({ + $lookup: { + as: `${as}.totalDocs.${alias}`, + from: JoinModel.collection.name, + let: { + root_id_: '$_id', + }, + pipeline: [ + ...basePipeline, + { + $count: 'result', + }, + ], + }, + }) + } } aggregate.push({ @@ -179,6 +196,23 @@ export const buildJoinAggregation = async ({ }, }) + if (count) { + aggregate.push({ + $addFields: { + [`${as}.totalDocs`]: { + $add: aliases.map((alias) => ({ + $ifNull: [ + { + $first: `$${as}.totalDocs.${alias}.result`, + }, + 0, + ], + })), + }, + }, + }) + } + aggregate.push({ $set: { [`${as}.docs`]: { @@ -194,14 +228,6 @@ export const buildJoinAggregation = async ({ const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin] - aggregate.push({ - $set: { - [`${as}.docs`]: { - $slice: [`$${as}.docs`, ...sliceValue], - }, - }, - }) - aggregate.push({ $addFields: { [`${as}.hasNextPage`]: { @@ -209,10 +235,24 @@ export const buildJoinAggregation = async ({ }, }, }) + + aggregate.push({ + $set: { + [`${as}.docs`]: { + $slice: [`$${as}.docs`, ...sliceValue], + }, + }, + }) } for (const slug of Object.keys(joinConfig)) { - for (const join of joinConfig[slug]) { + const joinsList = joinConfig[slug] + + if (!joinsList) { + throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`) + } + + for (const join of joinsList) { if (projection && !projection[join.joinPath]) { continue } @@ -221,30 +261,34 @@ export const buildJoinAggregation = async ({ continue } + const { collectionConfig, Model: JoinModel } = getCollection({ + adapter, + collectionSlug: join.field.collection as string, + }) + const { + count, limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, - where: whereJoin, + where: whereJoin = {}, } = joins?.[join.joinPath] || {} if (Array.isArray(join.field.collection)) { throw new Error('Unreachable') } - const joinModel = adapter.collections[join.field.collection] - const sort = buildSortParam({ config: adapter.payload.config, - fields: adapter.payload.collections[slug].config.flattenedFields, + fields: collectionConfig.flattenedFields, locale, sort: sortJoin, timestamps: true, }) - const sortProperty = Object.keys(sort)[0] + const sortProperty = Object.keys(sort)[0]! const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1 - const $match = await joinModel.buildQuery({ + const $match = await JoinModel.buildQuery({ locale, payload: adapter.payload, where: whereJoin, @@ -274,6 +318,31 @@ export const buildJoinAggregation = async ({ polymorphicSuffix = '.value' } + const addTotalDocsAggregation = (as: string, foreignField: string) => + aggregate.push( + { + $lookup: { + as: `${as}.totalDocs`, + foreignField, + from: JoinModel.collection.name, + localField: versions ? 'parent' : '_id', + pipeline: [ + { + $match, + }, + { + $count: 'result', + }, + ], + }, + }, + { + $addFields: { + [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] }, + }, + }, + ) + if (adapter.payload.config.localization && locale === 'all') { adapter.payload.config.localization.localeCodes.forEach((code) => { const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}` @@ -283,7 +352,7 @@ export const buildJoinAggregation = async ({ $lookup: { as: `${as}.docs`, foreignField: `${join.field.on}${code}${polymorphicSuffix}`, - from: adapter.collections[slug].collection.name, + from: JoinModel.collection.name, localField: versions ? 'parent' : '_id', pipeline, }, @@ -304,6 +373,7 @@ export const buildJoinAggregation = async ({ }, }, ) + if (limitJoin > 0) { aggregate.push({ $addFields: { @@ -313,6 +383,10 @@ export const buildJoinAggregation = async ({ }, }) } + + if (count) { + addTotalDocsAggregation(as, `${join.field.on}${code}${polymorphicSuffix}`) + } }) } else { const localeSuffix = @@ -339,7 +413,7 @@ export const buildJoinAggregation = async ({ $lookup: { as: `${as}.docs`, foreignField, - from: adapter.collections[slug].collection.name, + from: JoinModel.collection.name, localField: versions ? 'parent' : '_id', pipeline, }, @@ -359,6 +433,11 @@ export const buildJoinAggregation = async ({ }, }, ) + + if (count) { + addTotalDocsAggregation(as, foreignField) + } + if (limitJoin > 0) { aggregate.push({ $addFields: { @@ -372,9 +451,5 @@ export const buildJoinAggregation = async ({ } } - if (projection) { - aggregate.push({ $project: projection }) - } - return aggregate } diff --git a/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts b/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts index 5ef4f09b89..98a659643c 100644 --- a/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts +++ b/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts @@ -1,4 +1,10 @@ -import type { FieldAffectingData, FlattenedField, SelectMode, SelectType } from 'payload' +import type { + FieldAffectingData, + FlattenedField, + SelectIncludeType, + SelectMode, + SelectType, +} from 'payload' import { deepCopyObjectSimple, @@ -107,7 +113,7 @@ const traverseFields = ({ const fieldSelect = select[field.name] as SelectType if (field.type === 'array' && selectMode === 'include') { - fieldSelect['id'] = true + fieldSelect.id = true } traverseFields({ @@ -128,6 +134,11 @@ const traverseFields = ({ for (const _block of field.blockReferences ?? field.blocks) { const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block + + if (!block) { + continue + } + if ( (selectMode === 'include' && blocksSelect[block.slug] === true) || (selectMode === 'exclude' && typeof blocksSelect[block.slug] === 'undefined') @@ -155,9 +166,10 @@ const traverseFields = ({ blocksSelect[block.slug] = {} } - if (blockSelectMode === 'include') { - blocksSelect[block.slug]['id'] = true - blocksSelect[block.slug]['blockType'] = true + if (blockSelectMode === 'include' && typeof blocksSelect[block.slug] === 'object') { + const blockSelect = blocksSelect[block.slug] as SelectIncludeType + blockSelect.id = true + blockSelect.blockType = true } traverseFields({ diff --git a/packages/db-mongodb/src/utilities/getDBName.ts b/packages/db-mongodb/src/utilities/getDBName.ts index f7835b25e0..b79e0e94b6 100644 --- a/packages/db-mongodb/src/utilities/getDBName.ts +++ b/packages/db-mongodb/src/utilities/getDBName.ts @@ -1,4 +1,4 @@ -import type { DBIdentifierName } from 'payload' +import { APIError, type DBIdentifierName } from 'payload' type Args = { config: { @@ -22,7 +22,7 @@ export const getDBName = ({ target = 'dbName', versions = false, }: Args): string => { - let result: string + let result: null | string = null let custom = config[target] if (!custom && target === 'enumName') { @@ -32,12 +32,16 @@ export const getDBName = ({ if (custom) { result = typeof custom === 'function' ? custom({}) : custom } else { - result = name ?? slug + result = name ?? slug ?? null } if (versions) { result = `_${result}_versions` } + if (!result) { + throw new APIError(`Assertion for DB name of ${name} ${slug} was failed.`) + } + return result } diff --git a/packages/db-mongodb/src/utilities/getEntity.ts b/packages/db-mongodb/src/utilities/getEntity.ts new file mode 100644 index 0000000000..75eeb7eeb7 --- /dev/null +++ b/packages/db-mongodb/src/utilities/getEntity.ts @@ -0,0 +1,91 @@ +import type { Collection, SanitizedCollectionConfig, SanitizedGlobalConfig } from 'payload' + +import { APIError } from 'payload' + +import type { MongooseAdapter } from '../index.js' +import type { CollectionModel, GlobalModel } from '../types.js' + +export const getCollection = ({ + adapter, + collectionSlug, + versions = false, +}: { + adapter: MongooseAdapter + collectionSlug: string + versions?: boolean +}): { + collectionConfig: SanitizedCollectionConfig + customIDType: Collection['customIDType'] + + Model: CollectionModel +} => { + const collection = adapter.payload.collections[collectionSlug] + + if (!collection) { + throw new APIError( + `ERROR: Failed to retrieve collection with the slug "${collectionSlug}". Does not exist.`, + ) + } + + if (versions) { + const Model = adapter.versions[collectionSlug] + + if (!Model) { + throw new APIError( + `ERROR: Failed to retrieve collection version model with the slug "${collectionSlug}". Does not exist.`, + ) + } + + return { collectionConfig: collection.config, customIDType: collection.customIDType, Model } + } + + const Model = adapter.collections[collectionSlug] + + if (!Model) { + throw new APIError( + `ERROR: Failed to retrieve collection model with the slug "${collectionSlug}". Does not exist.`, + ) + } + + return { collectionConfig: collection.config, customIDType: collection.customIDType, Model } +} + +type BaseGetGlobalArgs = { + adapter: MongooseAdapter + globalSlug: string +} + +interface GetGlobal { + (args: { versions?: false | undefined } & BaseGetGlobalArgs): { + globalConfig: SanitizedGlobalConfig + Model: GlobalModel + } + (args: { versions?: true } & BaseGetGlobalArgs): { + globalConfig: SanitizedGlobalConfig + Model: CollectionModel + } +} + +export const getGlobal: GetGlobal = ({ adapter, globalSlug, versions = false }) => { + const globalConfig = adapter.payload.config.globals.find((each) => each.slug === globalSlug) + + if (!globalConfig) { + throw new APIError( + `ERROR: Failed to retrieve global with the slug "${globalSlug}". Does not exist.`, + ) + } + + if (versions) { + const Model = adapter.versions[globalSlug] + + if (!Model) { + throw new APIError( + `ERROR: Failed to retrieve global version model with the slug "${globalSlug}". Does not exist.`, + ) + } + + return { globalConfig, Model } + } + + return { globalConfig, Model: adapter.globals } as any +} diff --git a/packages/db-mongodb/src/utilities/handleError.ts b/packages/db-mongodb/src/utilities/handleError.ts index 8cdc20a816..d7a44656ef 100644 --- a/packages/db-mongodb/src/utilities/handleError.ts +++ b/packages/db-mongodb/src/utilities/handleError.ts @@ -9,7 +9,7 @@ export const handleError = ({ req, }: { collection?: string - error: Error + error: unknown global?: string req?: Partial }) => { @@ -18,14 +18,20 @@ export const handleError = ({ } // Handle uniqueness error from MongoDB - if ('code' in error && error.code === 11000 && 'keyValue' in error && error.keyValue) { + if ( + 'code' in error && + error.code === 11000 && + 'keyValue' in error && + error.keyValue && + typeof error.keyValue === 'object' + ) { throw new ValidationError( { collection, errors: [ { message: req?.t ? req.t('error:valueMustBeUnique') : 'Value must be unique', - path: Object.keys(error.keyValue)[0], + path: Object.keys(error.keyValue)[0] ?? '', }, ], global, @@ -34,5 +40,6 @@ export const handleError = ({ ) } + // eslint-disable-next-line @typescript-eslint/only-throw-error throw error } diff --git a/packages/db-mongodb/src/utilities/transform.ts b/packages/db-mongodb/src/utilities/transform.ts index 02c7b63cdf..7f1dae84a7 100644 --- a/packages/db-mongodb/src/utilities/transform.ts +++ b/packages/db-mongodb/src/utilities/transform.ts @@ -2,6 +2,8 @@ import type { CollectionConfig, DateField, Field, + FlattenedBlock, + FlattenedField, JoinField, RelationshipField, SanitizedConfig, @@ -10,7 +12,7 @@ import type { } from 'payload' import { Types } from 'mongoose' -import { traverseFields } from 'payload' +import { flattenAllFields, traverseFields } from 'payload' import { fieldAffectsData, fieldShouldBeLocalized } from 'payload/shared' import type { MongooseAdapter } from '../index.js' @@ -228,18 +230,153 @@ type Args = { validateRelationships?: boolean } +const stripFields = ({ + config, + data, + fields, + reservedKeys = [], +}: { + config: SanitizedConfig + data: any + fields: FlattenedField[] + reservedKeys?: string[] +}) => { + for (const k in data) { + if (!fields.some((field) => field.name === k) && !reservedKeys.includes(k)) { + delete data[k] + } + } + + for (const field of fields) { + reservedKeys = [] + const fieldData = data[field.name] + if (!fieldData || typeof fieldData !== 'object') { + continue + } + + if (field.type === 'blocks') { + reservedKeys.push('blockType') + } + + if ('flattenedFields' in field || 'blocks' in field) { + if (field.localized && config.localization) { + for (const localeKey in fieldData) { + if (!config.localization.localeCodes.some((code) => code === localeKey)) { + delete fieldData[localeKey] + continue + } + + const localeData = fieldData[localeKey] + + if (!localeData || typeof localeData !== 'object') { + continue + } + + if (field.type === 'array' || field.type === 'blocks') { + if (!Array.isArray(localeData)) { + continue + } + + for (const data of localeData) { + let fields: FlattenedField[] | null = null + + if (field.type === 'array') { + fields = field.flattenedFields + } else { + let maybeBlock: FlattenedBlock | undefined = undefined + + if (field.blockReferences) { + const maybeBlockReference = field.blockReferences.find( + (each) => typeof each === 'object' && each.slug === data.blockType, + ) + if (maybeBlockReference && typeof maybeBlockReference === 'object') { + maybeBlock = maybeBlockReference + } + } + + if (!maybeBlock) { + maybeBlock = field.blocks.find((each) => each.slug === data.blockType) + } + + if (maybeBlock) { + fields = maybeBlock.flattenedFields + } + } + + if (!fields) { + continue + } + + stripFields({ config, data, fields, reservedKeys }) + } + + continue + } else { + stripFields({ config, data: localeData, fields: field.flattenedFields, reservedKeys }) + } + } + continue + } + + if (field.type === 'array' || field.type === 'blocks') { + if (!Array.isArray(fieldData)) { + continue + } + + for (const data of fieldData) { + let fields: FlattenedField[] | null = null + + if (field.type === 'array') { + fields = field.flattenedFields + } else { + let maybeBlock: FlattenedBlock | undefined = undefined + + if (field.blockReferences) { + const maybeBlockReference = field.blockReferences.find( + (each) => typeof each === 'object' && each.slug === data.blockType, + ) + + if (maybeBlockReference && typeof maybeBlockReference === 'object') { + maybeBlock = maybeBlockReference + } + } + + if (!maybeBlock) { + maybeBlock = field.blocks.find((each) => each.slug === data.blockType) + } + + if (maybeBlock) { + fields = maybeBlock.flattenedFields + } + } + + if (!fields) { + continue + } + + stripFields({ config, data, fields, reservedKeys }) + } + + continue + } else { + stripFields({ config, data: fieldData, fields: field.flattenedFields, reservedKeys }) + } + } + } +} + export const transform = ({ adapter, data, fields, globalSlug, operation, - parentIsLocalized, + parentIsLocalized = false, validateRelationships = true, }: Args) => { if (Array.isArray(data)) { - for (let i = 0; i < data.length; i++) { - transform({ adapter, data: data[i], fields, globalSlug, operation, validateRelationships }) + for (const item of data) { + transform({ adapter, data: item, fields, globalSlug, operation, validateRelationships }) } return } @@ -256,20 +393,31 @@ export const transform = ({ if (data.id instanceof Types.ObjectId) { data.id = data.id.toHexString() } + + if (!adapter.allowAdditionalKeys) { + stripFields({ + config, + data, + fields: flattenAllFields({ cache: true, fields }), + reservedKeys: ['id', 'globalType'], + }) + } } if (operation === 'write' && globalSlug) { data.globalType = globalSlug } - const sanitize: TraverseFieldsCallback = ({ field, ref }) => { - if (!ref || typeof ref !== 'object') { + const sanitize: TraverseFieldsCallback = ({ field, ref: incomingRef }) => { + if (!incomingRef || typeof incomingRef !== 'object') { return } - if (field.type === 'date' && operation === 'read' && ref[field.name]) { + const ref = incomingRef as Record + + if (field.type === 'date' && operation === 'read' && field.name in ref && ref[field.name]) { if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) { - const fieldRef = ref[field.name] + const fieldRef = ref[field.name] as Record if (!fieldRef || typeof fieldRef !== 'object') { return } @@ -284,7 +432,7 @@ export const transform = ({ } else { sanitizeDate({ field, - ref: ref as Record, + ref, value: ref[field.name], }) } @@ -302,13 +450,13 @@ export const transform = ({ // handle localized relationships if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) { const locales = config.localization.locales - const fieldRef = ref[field.name] + const fieldRef = ref[field.name] as Record if (typeof fieldRef !== 'object') { return } for (const { code } of locales) { - const value = ref[field.name][code] + const value = fieldRef[code] if (value) { sanitizeRelationship({ config, @@ -328,7 +476,7 @@ export const transform = ({ field, locale: undefined, operation, - ref: ref as Record, + ref, validateRelationships, value: ref[field.name], }) diff --git a/packages/db-mongodb/tsconfig.json b/packages/db-mongodb/tsconfig.json index ce82aadf9c..a181cd4bf9 100644 --- a/packages/db-mongodb/tsconfig.json +++ b/packages/db-mongodb/tsconfig.json @@ -1,9 +1,4 @@ { "extends": "../../tsconfig.base.json", - "compilerOptions": { - /* TODO: remove the following lines */ - "strict": false, - "noUncheckedIndexedAccess": false, - }, "references": [{ "path": "../payload" }, { "path": "../translations" }] } diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 48772ba576..de294da261 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.24.0", + "version": "3.27.0", "description": "The officially supported Postgres database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-postgres/src/index.ts b/packages/db-postgres/src/index.ts index d08366be54..484a327f61 100644 --- a/packages/db-postgres/src/index.ts +++ b/packages/db-postgres/src/index.ts @@ -33,6 +33,7 @@ import { rollbackTransaction, updateGlobal, updateGlobalVersion, + updateMany, updateOne, updateVersion, } from '@payloadcms/drizzle' @@ -185,6 +186,7 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj rollbackTransaction, updateGlobal, updateGlobalVersion, + updateMany, updateOne, updateVersion, upsert: updateOne, diff --git a/packages/db-sqlite/package.json b/packages/db-sqlite/package.json index c02490e8aa..c225e02002 100644 --- a/packages/db-sqlite/package.json +++ b/packages/db-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-sqlite", - "version": "3.24.0", + "version": "3.27.0", "description": "The officially supported SQLite database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-sqlite/src/index.ts b/packages/db-sqlite/src/index.ts index 2bd3e0a674..0bedf75450 100644 --- a/packages/db-sqlite/src/index.ts +++ b/packages/db-sqlite/src/index.ts @@ -34,6 +34,7 @@ import { rollbackTransaction, updateGlobal, updateGlobalVersion, + updateMany, updateOne, updateVersion, } from '@payloadcms/drizzle' @@ -120,6 +121,7 @@ export function sqliteAdapter(args: Args): DatabaseAdapterObj { tableNameMap: new Map(), tables: {}, transactionOptions: args.transactionOptions || undefined, + updateMany, versionsSuffix: args.versionsSuffix || '_v', // DatabaseAdapter diff --git a/packages/db-vercel-postgres/package.json b/packages/db-vercel-postgres/package.json index 25fff2ee7c..f8818df804 100644 --- a/packages/db-vercel-postgres/package.json +++ b/packages/db-vercel-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-vercel-postgres", - "version": "3.24.0", + "version": "3.27.0", "description": "Vercel Postgres adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-vercel-postgres/src/index.ts b/packages/db-vercel-postgres/src/index.ts index ca8594c993..703db3ce7f 100644 --- a/packages/db-vercel-postgres/src/index.ts +++ b/packages/db-vercel-postgres/src/index.ts @@ -33,6 +33,7 @@ import { rollbackTransaction, updateGlobal, updateGlobalVersion, + updateMany, updateOne, updateVersion, } from '@payloadcms/drizzle' @@ -186,6 +187,7 @@ export function vercelPostgresAdapter(args: Args = {}): DatabaseAdapterObj>( this: DrizzleAdapter, - { slug, data, req }: CreateGlobalArgs, + { slug, data, req, returning }: CreateGlobalArgs, ): Promise { const db = await getTransaction(this, req) const globalConfig = this.payload.globals.config.find((config) => config.slug === slug) @@ -26,8 +26,13 @@ export async function createGlobal>( operation: 'create', req, tableName, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + result.globalType = slug return result diff --git a/packages/drizzle/src/createGlobalVersion.ts b/packages/drizzle/src/createGlobalVersion.ts index c419e8f584..fb32a6dc94 100644 --- a/packages/drizzle/src/createGlobalVersion.ts +++ b/packages/drizzle/src/createGlobalVersion.ts @@ -21,6 +21,7 @@ export async function createGlobalVersion( snapshot, updatedAt, versionData, + returning, }: CreateGlobalVersionArgs, ) { const db = await getTransaction(this, req) @@ -45,6 +46,7 @@ export async function createGlobalVersion( req, select, tableName, + ignoreResult: returning === false ? 'idOnly' : false, }) const table = this.tables[tableName] @@ -59,5 +61,9 @@ export async function createGlobalVersion( }) } + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/createVersion.ts b/packages/drizzle/src/createVersion.ts index c7e880bf23..c5e2ce028c 100644 --- a/packages/drizzle/src/createVersion.ts +++ b/packages/drizzle/src/createVersion.ts @@ -22,6 +22,7 @@ export async function createVersion( snapshot, updatedAt, versionData, + returning, }: CreateVersionArgs, ) { const db = await getTransaction(this, req) @@ -72,5 +73,9 @@ export async function createVersion( }) } + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/deleteOne.ts b/packages/drizzle/src/deleteOne.ts index 66b7409843..2c2d12c65b 100644 --- a/packages/drizzle/src/deleteOne.ts +++ b/packages/drizzle/src/deleteOne.ts @@ -13,7 +13,7 @@ import { getTransaction } from './utilities/getTransaction.js' export const deleteOne: DeleteOne = async function deleteOne( this: DrizzleAdapter, - { collection: collectionSlug, req, select, where: whereArg }, + { collection: collectionSlug, req, select, where: whereArg, returning }, ) { const db = await getTransaction(this, req) const collection = this.payload.collections[collectionSlug].config @@ -59,13 +59,16 @@ export const deleteOne: DeleteOne = async function deleteOne( docToDelete = await db.query[tableName].findFirst(findManyArgs) } - const result = transform({ - adapter: this, - config: this.payload.config, - data: docToDelete, - fields: collection.flattenedFields, - joinQuery: false, - }) + const result = + returning === false + ? null + : transform({ + adapter: this, + config: this.payload.config, + data: docToDelete, + fields: collection.flattenedFields, + joinQuery: false, + }) await this.deleteWhere({ db, diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index d4cf87df3e..629f5b124e 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -2,7 +2,7 @@ import type { LibSQLDatabase } from 'drizzle-orm/libsql' import type { SQLiteSelectBase } from 'drizzle-orm/sqlite-core' import type { FlattenedField, JoinQuery, SelectMode, SelectType, Where } from 'payload' -import { and, asc, desc, eq, or, sql } from 'drizzle-orm' +import { and, asc, count, desc, eq, or, sql } from 'drizzle-orm' import { fieldIsVirtual, fieldShouldBeLocalized } from 'payload/shared' import toSnakeCase from 'to-snake-case' @@ -386,6 +386,7 @@ export const traverseFields = ({ } const { + count: shouldCount = false, limit: limitArg = field.defaultLimit ?? 10, page, sort = field.defaultSort, @@ -480,6 +481,13 @@ export const traverseFields = ({ sqlWhere = and(sqlWhere, buildSQLWhere(where, subQueryAlias)) } + if (shouldCount) { + currentArgs.extras[`${columnName}_count`] = sql`${db + .select({ count: count() }) + .from(sql`${currentQuery.as(subQueryAlias)}`) + .where(sqlWhere)}`.as(`${columnName}_count`) + } + currentQuery = currentQuery.orderBy(sortOrder(sql`"sortPath"`)) as SQLSelect if (page && limit !== 0) { @@ -611,6 +619,20 @@ export const traverseFields = ({ .orderBy(() => orderBy.map(({ column, order }) => order(column))), }).as(subQueryAlias) + if (shouldCount) { + currentArgs.extras[`${columnName}_count`] = sql`${db + .select({ + count: count(), + }) + .from( + sql`${db + .select(selectFields as any) + .from(newAliasTable) + .where(subQueryWhere) + .as(`${subQueryAlias}_count_subquery`)}`, + )}`.as(`${subQueryAlias}_count`) + } + currentArgs.extras[columnName] = sql`${db .select({ result: jsonAggBuildObject(adapter, { diff --git a/packages/drizzle/src/index.ts b/packages/drizzle/src/index.ts index f7036cfc0d..308ccec703 100644 --- a/packages/drizzle/src/index.ts +++ b/packages/drizzle/src/index.ts @@ -31,9 +31,10 @@ export { buildRawSchema } from './schema/buildRawSchema.js' export { beginTransaction } from './transactions/beginTransaction.js' export { commitTransaction } from './transactions/commitTransaction.js' export { rollbackTransaction } from './transactions/rollbackTransaction.js' -export { updateOne } from './update.js' export { updateGlobal } from './updateGlobal.js' export { updateGlobalVersion } from './updateGlobalVersion.js' +export { updateMany } from './updateMany.js' +export { updateOne } from './updateOne.js' export { updateVersion } from './updateVersion.js' export { upsertRow } from './upsertRow/index.js' export { buildCreateMigration } from './utilities/buildCreateMigration.js' diff --git a/packages/drizzle/src/schema/build.ts b/packages/drizzle/src/schema/build.ts index 045c7fd251..746ad3aada 100644 --- a/packages/drizzle/src/schema/build.ts +++ b/packages/drizzle/src/schema/build.ts @@ -1,5 +1,6 @@ -import type { FlattenedField } from 'payload' +import type { FlattenedField, SanitizedCompoundIndex } from 'payload' +import { InvalidConfiguration } from 'payload' import toSnakeCase from 'to-snake-case' import type { @@ -33,6 +34,7 @@ type Args = { baseIndexes?: Record buildNumbers?: boolean buildRelationships?: boolean + compoundIndexes?: SanitizedCompoundIndex[] disableNotNull: boolean disableRelsTableUnique?: boolean disableUnique: boolean @@ -68,6 +70,7 @@ export const buildTable = ({ baseColumns = {}, baseForeignKeys = {}, baseIndexes = {}, + compoundIndexes, disableNotNull, disableRelsTableUnique = false, disableUnique = false, @@ -268,6 +271,61 @@ export const buildTable = ({ adapter.rawRelations[localeTableName] = localeRelations } + if (compoundIndexes) { + for (const index of compoundIndexes) { + let someLocalized: boolean | null = null + const columns: string[] = [] + + const getTableToUse = () => { + if (someLocalized) { + return localesTable + } + + return table + } + + for (const { path, pathHasLocalized } of index.fields) { + if (someLocalized === null) { + someLocalized = pathHasLocalized + } + + if (someLocalized !== pathHasLocalized) { + throw new InvalidConfiguration( + `Compound indexes within localized and non localized fields are not supported in SQL. Expected ${path} to be ${someLocalized ? 'non' : ''} localized.`, + ) + } + + const columnPath = path.replaceAll('.', '_') + + if (!getTableToUse().columns[columnPath]) { + throw new InvalidConfiguration( + `Column ${columnPath} for compound index on ${path} was not found in the ${getTableToUse().name} table.`, + ) + } + + columns.push(columnPath) + } + + if (someLocalized) { + columns.push('_locale') + } + + let name = columns.join('_') + // truncate against the limit, buildIndexName will handle collisions + if (name.length > 63) { + name = 'compound_index' + } + + const indexName = buildIndexName({ name, adapter }) + + getTableToUse().indexes[indexName] = { + name: indexName, + on: columns, + unique: disableUnique ? false : index.unique, + } + } + } + if (isRoot) { if (hasManyTextField) { const textsTableName = `${rootTableName}_texts` diff --git a/packages/drizzle/src/schema/buildRawSchema.ts b/packages/drizzle/src/schema/buildRawSchema.ts index 101118f182..a669753235 100644 --- a/packages/drizzle/src/schema/buildRawSchema.ts +++ b/packages/drizzle/src/schema/buildRawSchema.ts @@ -1,4 +1,8 @@ -import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' +import { + buildVersionCollectionFields, + buildVersionCompoundIndexes, + buildVersionGlobalFields, +} from 'payload' import toSnakeCase from 'to-snake-case' import type { DrizzleAdapter, RawIndex, SetColumnID } from '../types.js' @@ -52,6 +56,7 @@ export const buildRawSchema = ({ buildTable({ adapter, + compoundIndexes: collection.sanitizedIndexes, disableNotNull: !!collection?.versions?.drafts, disableUnique: false, fields: collection.flattenedFields, @@ -70,6 +75,7 @@ export const buildRawSchema = ({ buildTable({ adapter, + compoundIndexes: buildVersionCompoundIndexes({ indexes: collection.sanitizedIndexes }), disableNotNull: !!collection.versions?.drafts, disableUnique: true, fields: versionFields, diff --git a/packages/drizzle/src/schema/traverseFields.ts b/packages/drizzle/src/schema/traverseFields.ts index d5243366a5..f82bd34335 100644 --- a/packages/drizzle/src/schema/traverseFields.ts +++ b/packages/drizzle/src/schema/traverseFields.ts @@ -1,4 +1,4 @@ -import type { FlattenedField } from 'payload' +import type { CompoundIndex, FlattenedField } from 'payload' import { InvalidConfiguration } from 'payload' import { diff --git a/packages/drizzle/src/transform/read/traverseFields.ts b/packages/drizzle/src/transform/read/traverseFields.ts index 3bb4aedb2c..9a051d1f67 100644 --- a/packages/drizzle/src/transform/read/traverseFields.ts +++ b/packages/drizzle/src/transform/read/traverseFields.ts @@ -1,6 +1,7 @@ import type { FlattenedBlock, FlattenedField, JoinQuery, SanitizedConfig } from 'payload' import { fieldIsVirtual, fieldShouldBeLocalized } from 'payload/shared' +import toSnakeCase from 'to-snake-case' import type { DrizzleAdapter } from '../../types.js' import type { BlocksMap } from '../../utilities/createBlocksMap.js' @@ -398,7 +399,7 @@ export const traverseFields = >({ } if (field.type === 'join') { - const { limit = field.defaultLimit ?? 10 } = + const { count, limit = field.defaultLimit ?? 10 } = joinQuery?.[`${fieldPrefix.replaceAll('_', '.')}${field.name}`] || {} // raw hasMany results from SQLite @@ -407,8 +408,8 @@ export const traverseFields = >({ } let fieldResult: - | { docs: unknown[]; hasNextPage: boolean } - | Record + | { docs: unknown[]; hasNextPage: boolean; totalDocs?: number } + | Record if (Array.isArray(fieldData)) { if (isLocalized && adapter.payload.config.localization) { fieldResult = fieldData.reduce( @@ -449,6 +450,17 @@ export const traverseFields = >({ } } + if (count) { + const countPath = `${fieldName}_count` + if (typeof table[countPath] !== 'undefined') { + let value = Number(table[countPath]) + if (Number.isNaN(value)) { + value = 0 + } + fieldResult.totalDocs = value + } + } + result[field.name] = fieldResult return result } @@ -607,6 +619,7 @@ export const traverseFields = >({ deletions, fieldPrefix: groupFieldPrefix, fields: field.flattenedFields, + joinQuery, numbers, parentIsLocalized: parentIsLocalized || field.localized, path: `${sanitizedPath}${field.name}`, diff --git a/packages/drizzle/src/updateGlobal.ts b/packages/drizzle/src/updateGlobal.ts index d3ba00858d..29039f83e4 100644 --- a/packages/drizzle/src/updateGlobal.ts +++ b/packages/drizzle/src/updateGlobal.ts @@ -9,7 +9,7 @@ import { getTransaction } from './utilities/getTransaction.js' export async function updateGlobal>( this: DrizzleAdapter, - { slug, data, req, select }: UpdateGlobalArgs, + { slug, data, req, select, returning }: UpdateGlobalArgs, ): Promise { const db = await getTransaction(this, req) const globalConfig = this.payload.globals.config.find((config) => config.slug === slug) @@ -26,8 +26,13 @@ export async function updateGlobal>( req, select, tableName, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + result.globalType = slug return result diff --git a/packages/drizzle/src/updateGlobalVersion.ts b/packages/drizzle/src/updateGlobalVersion.ts index 8cb4572a35..99b140ccec 100644 --- a/packages/drizzle/src/updateGlobalVersion.ts +++ b/packages/drizzle/src/updateGlobalVersion.ts @@ -16,7 +16,16 @@ import { getTransaction } from './utilities/getTransaction.js' export async function updateGlobalVersion( this: DrizzleAdapter, - { id, global, locale, req, select, versionData, where: whereArg }: UpdateGlobalVersionArgs, + { + id, + global, + locale, + req, + select, + versionData, + where: whereArg, + returning, + }: UpdateGlobalVersionArgs, ) { const db = await getTransaction(this, req) const globalConfig: SanitizedGlobalConfig = this.payload.globals.config.find( @@ -49,7 +58,12 @@ export async function updateGlobalVersion( select, tableName, where, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/updateMany.ts b/packages/drizzle/src/updateMany.ts new file mode 100644 index 0000000000..40cea50911 --- /dev/null +++ b/packages/drizzle/src/updateMany.ts @@ -0,0 +1,107 @@ +import type { LibSQLDatabase } from 'drizzle-orm/libsql' +import type { UpdateMany } from 'payload' + +import toSnakeCase from 'to-snake-case' + +import type { DrizzleAdapter } from './types.js' + +import buildQuery from './queries/buildQuery.js' +import { selectDistinct } from './queries/selectDistinct.js' +import { upsertRow } from './upsertRow/index.js' +import { getTransaction } from './utilities/getTransaction.js' + +export const updateMany: UpdateMany = async function updateMany( + this: DrizzleAdapter, + { + collection: collectionSlug, + data, + joins: joinQuery, + limit, + locale, + req, + returning, + select, + where: whereToUse, + }, +) { + const db = await getTransaction(this, req) + const collection = this.payload.collections[collectionSlug].config + const tableName = this.tableNameMap.get(toSnakeCase(collection.slug)) + + const { joins, selectFields, where } = buildQuery({ + adapter: this, + fields: collection.flattenedFields, + locale, + tableName, + where: whereToUse, + }) + + let idsToUpdate: (number | string)[] = [] + + const selectDistinctResult = await selectDistinct({ + adapter: this, + db, + joins, + selectFields, + tableName, + where, + }) + + if (selectDistinctResult?.[0]?.id) { + idsToUpdate = selectDistinctResult?.map((doc) => doc.id) + + // If id wasn't passed but `where` without any joins, retrieve it with findFirst + } else if (whereToUse && !joins.length) { + const _db = db as LibSQLDatabase + + const table = this.tables[tableName] + + const docsToUpdate = + typeof limit === 'number' && limit > 0 + ? await _db + .select({ + id: table.id, + }) + .from(table) + .where(where) + .limit(limit) + : await _db + .select({ + id: table.id, + }) + .from(table) + .where(where) + + idsToUpdate = docsToUpdate?.map((doc) => doc.id) + } + + if (!idsToUpdate.length) { + return [] + } + + const results = [] + + // TODO: We need to batch this to reduce the amount of db calls. This can get very slow if we are updating a lot of rows. + for (const idToUpdate of idsToUpdate) { + const result = await upsertRow({ + id: idToUpdate, + adapter: this, + data, + db, + fields: collection.flattenedFields, + ignoreResult: returning === false, + joinQuery, + operation: 'update', + req, + select, + tableName, + }) + results.push(result) + } + + if (returning === false) { + return null + } + + return results +} diff --git a/packages/drizzle/src/update.ts b/packages/drizzle/src/updateOne.ts similarity index 72% rename from packages/drizzle/src/update.ts rename to packages/drizzle/src/updateOne.ts index 935133fd71..4ebb3abafc 100644 --- a/packages/drizzle/src/update.ts +++ b/packages/drizzle/src/updateOne.ts @@ -1,10 +1,10 @@ +import type { LibSQLDatabase } from 'drizzle-orm/libsql' import type { UpdateOne } from 'payload' import toSnakeCase from 'to-snake-case' import type { DrizzleAdapter } from './types.js' -import { buildFindManyArgs } from './find/buildFindManyArgs.js' import buildQuery from './queries/buildQuery.js' import { selectDistinct } from './queries/selectDistinct.js' import { upsertRow } from './upsertRow/index.js' @@ -12,7 +12,17 @@ import { getTransaction } from './utilities/getTransaction.js' export const updateOne: UpdateOne = async function updateOne( this: DrizzleAdapter, - { id, collection: collectionSlug, data, joins: joinQuery, locale, req, select, where: whereArg }, + { + id, + collection: collectionSlug, + data, + joins: joinQuery, + locale, + req, + select, + where: whereArg, + returning, + }, ) { const db = await getTransaction(this, req) const collection = this.payload.collections[collectionSlug].config @@ -28,6 +38,7 @@ export const updateOne: UpdateOne = async function updateOne( where: whereToUse, }) + // selectDistinct will only return if there are joins const selectDistinctResult = await selectDistinct({ adapter: this, chainedMethods: [{ args: [1], method: 'limit' }], @@ -40,22 +51,18 @@ export const updateOne: UpdateOne = async function updateOne( if (selectDistinctResult?.[0]?.id) { idToUpdate = selectDistinctResult?.[0]?.id - // If id wasn't passed but `where` without any joins, retrieve it with findFirst } else if (whereArg && !joins.length) { - const findManyArgs = buildFindManyArgs({ - adapter: this, - depth: 0, - fields: collection.flattenedFields, - joinQuery: false, - select: {}, - tableName, - }) + const table = this.tables[tableName] - findManyArgs.where = where - - const docToUpdate = await db.query[tableName].findFirst(findManyArgs) - idToUpdate = docToUpdate?.id + const docsToUpdate = await (db as LibSQLDatabase) + .select({ + id: table.id, + }) + .from(table) + .where(where) + .limit(1) + idToUpdate = docsToUpdate?.[0]?.id } const result = await upsertRow({ @@ -69,7 +76,12 @@ export const updateOne: UpdateOne = async function updateOne( req, select, tableName, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/updateVersion.ts b/packages/drizzle/src/updateVersion.ts index d5bb55c657..1a05dee870 100644 --- a/packages/drizzle/src/updateVersion.ts +++ b/packages/drizzle/src/updateVersion.ts @@ -16,7 +16,16 @@ import { getTransaction } from './utilities/getTransaction.js' export async function updateVersion( this: DrizzleAdapter, - { id, collection, locale, req, select, versionData, where: whereArg }: UpdateVersionArgs, + { + id, + collection, + locale, + req, + select, + versionData, + where: whereArg, + returning, + }: UpdateVersionArgs, ) { const db = await getTransaction(this, req) const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config @@ -47,7 +56,12 @@ export async function updateVersion( select, tableName, where, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/upsertRow/index.ts b/packages/drizzle/src/upsertRow/index.ts index b2438eca29..32f6e4ff16 100644 --- a/packages/drizzle/src/upsertRow/index.ts +++ b/packages/drizzle/src/upsertRow/index.ts @@ -428,6 +428,10 @@ export const upsertRow = async | TypeWithID>( } } + if (ignoreResult === 'idOnly') { + return { id: insertedRow.id } as T + } + if (ignoreResult) { return data as T } diff --git a/packages/drizzle/src/upsertRow/types.ts b/packages/drizzle/src/upsertRow/types.ts index 991540c727..9a0c4df0db 100644 --- a/packages/drizzle/src/upsertRow/types.ts +++ b/packages/drizzle/src/upsertRow/types.ts @@ -12,7 +12,7 @@ type BaseArgs = { * When true, skips reading the data back from the database and returns the input data * @default false */ - ignoreResult?: boolean + ignoreResult?: boolean | 'idOnly' joinQuery?: JoinQuery path?: string req?: Partial diff --git a/packages/email-nodemailer/package.json b/packages/email-nodemailer/package.json index 19c8f487fa..4a94da5259 100644 --- a/packages/email-nodemailer/package.json +++ b/packages/email-nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-nodemailer", - "version": "3.24.0", + "version": "3.27.0", "description": "Payload Nodemailer Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/email-resend/package.json b/packages/email-resend/package.json index 8264428a1d..d7163d1c78 100644 --- a/packages/email-resend/package.json +++ b/packages/email-resend/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-resend", - "version": "3.24.0", + "version": "3.27.0", "description": "Payload Resend Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/eslint-plugin/customRules/no-imports-from-self.js b/packages/eslint-plugin/customRules/no-imports-from-self.js index da6a9b5117..77b92e2832 100644 --- a/packages/eslint-plugin/customRules/no-imports-from-self.js +++ b/packages/eslint-plugin/customRules/no-imports-from-self.js @@ -18,11 +18,11 @@ export const rule = { return { ImportDeclaration(node) { const importPath = node.source.value - const pkgName = getPackageName(context, packageName) - if (pkgName && importPath.startsWith(pkgName)) { + packageName = getPackageName(context, packageName) + if (packageName && importPath.startsWith(packageName)) { context.report({ node, - message: `Package "${pkgName}" should not import from itself. Use relative instead.`, + message: `Package "${packageName}" should not import from itself. Use relative instead.`, }) } }, @@ -41,8 +41,7 @@ function getPackageName(context, packageName) { return packageName } - const fileName = context.getFilename() - const pkg = findNearestPackageJson(path.dirname(fileName)) + const pkg = findNearestPackageJson(path.dirname(context.filename)) if (pkg) { return pkg.name } diff --git a/packages/graphql/package.json b/packages/graphql/package.json index 4afa05af41..ec09ba797e 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.24.0", + "version": "3.27.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/live-preview-react/package.json b/packages/live-preview-react/package.json index 64b0bb7f48..89cea8d0be 100644 --- a/packages/live-preview-react/package.json +++ b/packages/live-preview-react/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-react", - "version": "3.24.0", + "version": "3.27.0", "description": "The official React SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { @@ -45,8 +45,8 @@ }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/live-preview-vue/package.json b/packages/live-preview-vue/package.json index df0e998639..71ea2197bb 100644 --- a/packages/live-preview-vue/package.json +++ b/packages/live-preview-vue/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-vue", - "version": "3.24.0", + "version": "3.27.0", "description": "The official Vue SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/live-preview/package.json b/packages/live-preview/package.json index 45e1b58e2d..82562ea789 100644 --- a/packages/live-preview/package.json +++ b/packages/live-preview/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview", - "version": "3.24.0", + "version": "3.27.0", "description": "The official live preview JavaScript SDK for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/next/package.json b/packages/next/package.json index 9085aebe97..12da32cc9f 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.24.0", + "version": "3.27.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", @@ -94,7 +94,7 @@ "http-status": "2.1.0", "path-to-regexp": "6.3.0", "qs-esm": "7.0.2", - "react-diff-viewer-continued": "4.0.4", + "react-diff-viewer-continued": "4.0.5", "sass": "1.77.4", "uuid": "10.0.0" }, @@ -107,8 +107,8 @@ "@next/eslint-plugin-next": "15.1.5", "@payloadcms/eslint-config": "workspace:*", "@types/busboy": "1.5.4", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "@types/uuid": "10.0.0", "babel-plugin-react-compiler": "19.0.0-beta-714736e-20250131", "esbuild": "0.24.2", diff --git a/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx b/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx index 526551dfbb..55832945bc 100644 --- a/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx +++ b/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx @@ -2,8 +2,8 @@ import type { SanitizedConfig } from 'payload' import { Link } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' import { useParams, usePathname, useSearchParams } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React from 'react' export const DocumentTabLink: React.FC<{ diff --git a/packages/next/src/elements/Nav/index.client.tsx b/packages/next/src/elements/Nav/index.client.tsx index aeedc49576..95379a1480 100644 --- a/packages/next/src/elements/Nav/index.client.tsx +++ b/packages/next/src/elements/Nav/index.client.tsx @@ -5,8 +5,9 @@ import type { NavPreferences } from 'payload' import { getTranslation } from '@payloadcms/translations' import { Link, NavGroup, useConfig, useTranslation } from '@payloadcms/ui' -import { EntityType, formatAdminURL } from '@payloadcms/ui/shared' +import { EntityType } from '@payloadcms/ui/shared' import { usePathname } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { Fragment } from 'react' const baseClass = 'nav' @@ -44,23 +45,29 @@ export const DefaultNavClient: React.FC<{ id = `nav-global-${slug}` } - const LinkElement = Link || 'a' - const activeCollection = + const isActive = pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length]) - return ( - - {activeCollection &&
} + const Label = ( + <> + {isActive &&
} {getTranslation(label, i18n)} - + + ) + + // If the URL matches the link exactly + if (pathname === href) { + return ( +
+ {Label} +
+ ) + } + + return ( + + {Label} + ) })} diff --git a/packages/next/src/elements/Nav/index.scss b/packages/next/src/elements/Nav/index.scss index 93c03802f9..76ce29f562 100644 --- a/packages/next/src/elements/Nav/index.scss +++ b/packages/next/src/elements/Nav/index.scss @@ -93,36 +93,37 @@ } } - nav { - a { - position: relative; - padding-block: base(0.125); - padding-inline-start: 0; - padding-inline-end: base(1.5); - display: flex; - text-decoration: none; - - &:focus:not(:focus-visible) { - box-shadow: none; - font-weight: 600; - } - - &:hover, - &:focus-visible { - text-decoration: underline; - } - - &.active { - font-weight: normal; - padding-left: 0; - font-weight: 600; - } - } - } - &__link { display: flex; align-items: center; + position: relative; + padding-block: base(0.125); + padding-inline-start: 0; + padding-inline-end: base(1.5); + text-decoration: none; + + &:focus:not(:focus-visible) { + box-shadow: none; + font-weight: 600; + } + + &.active { + font-weight: normal; + padding-left: 0; + font-weight: 600; + } + } + + a.nav__link { + &:hover, + &:focus-visible { + text-decoration: underline; + } + } + + &__link:has(.nav__link-indicator) { + font-weight: 600; + padding-left: 0; } &__link-indicator { @@ -148,7 +149,7 @@ padding: var(--app-header-height) var(--gutter-h) base(2); } - nav a { + &__link { font-size: base(0.875); line-height: base(1.5); } diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index d8f6ac5f0a..7f72e347d2 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -4,8 +4,7 @@ import type { ImportMap, LanguageOptions, SanitizedConfig, ServerFunctionClient import { rtlLanguages } from '@payloadcms/translations' import { ProgressBar, RootProvider } from '@payloadcms/ui' import { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig' -import { headers as getHeaders, cookies as nextCookies } from 'next/headers.js' -import { getPayload, getRequestLanguage, parseCookies } from 'payload' +import { cookies as nextCookies } from 'next/headers.js' import React from 'react' import { getNavPrefs } from '../../elements/Nav/getNavPrefs.js' @@ -34,16 +33,16 @@ export const RootLayout = async ({ }) => { checkDependencies() - const config = await configPromise - - const headers = await getHeaders() - const cookies = parseCookies(headers) - - const languageCode = getRequestLanguage({ - config, + const { cookies, headers, - }) + languageCode, + permissions, + req, + req: { + payload: { config }, + }, + } = await initReq({ configPromise, importMap, key: 'RootLayout' }) const theme = getRequestTheme({ config, @@ -51,10 +50,6 @@ export const RootLayout = async ({ headers, }) - const payload = await getPayload({ config, importMap }) - - const { permissions, req } = await initReq(config) - const dir = (rtlLanguages as unknown as AcceptedLanguages[]).includes(languageCode) ? 'RTL' : 'LTR' @@ -134,11 +129,11 @@ export const RootLayout = async ({ {Array.isArray(config.admin?.components?.providers) && config.admin?.components?.providers.length > 0 ? ( { const { name: fnKey, args: fnArgs, config: configPromise, importMap } = args - const { req } = await initReq(configPromise) + const { req } = await initReq({ + configPromise, + importMap, + key: 'RootLayout', + }) const augmentedArgs: Parameters[0] = { ...fnArgs, diff --git a/packages/next/src/utilities/initPage/handleAuthRedirect.ts b/packages/next/src/utilities/initPage/handleAuthRedirect.ts index 937592fdf8..ea5463ff00 100644 --- a/packages/next/src/utilities/initPage/handleAuthRedirect.ts +++ b/packages/next/src/utilities/initPage/handleAuthRedirect.ts @@ -1,6 +1,6 @@ import type { User } from 'payload' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import * as qs from 'qs-esm' type Args = { diff --git a/packages/next/src/utilities/initPage/index.ts b/packages/next/src/utilities/initPage/index.ts index 3cfc65bb6c..6e47632d40 100644 --- a/packages/next/src/utilities/initPage/index.ts +++ b/packages/next/src/utilities/initPage/index.ts @@ -1,8 +1,7 @@ import type { InitPageResult, VisibleEntities } from 'payload' -import { headers as getHeaders } from 'next/headers.js' import { notFound } from 'next/navigation.js' -import { getPayload, isEntityHidden, parseCookies } from 'payload' +import { isEntityHidden } from 'payload' import * as qs from 'qs-esm' import type { Args } from './types.js' @@ -18,31 +17,38 @@ export const initPage = async ({ importMap, route, searchParams, + useLayoutReq, }: Args): Promise => { - const headers = await getHeaders() - const payload = await getPayload({ config: configPromise, importMap }) const queryString = `${qs.stringify(searchParams ?? {}, { addQueryPrefix: true })}` + const { + cookies, + locale, + permissions, + req, + req: { payload }, + } = await initReq({ + configPromise, + importMap, + key: useLayoutReq ? 'RootLayout' : 'initPage', + overrides: { + fallbackLocale: false, + req: { + query: qs.parse(queryString, { + depth: 10, + ignoreQueryPrefix: true, + }), + }, + urlSuffix: `${route}${searchParams ? queryString : ''}`, + }, + }) + const { collections, globals, routes: { admin: adminRoute }, } = payload.config - const cookies = parseCookies(headers) - - const { locale, permissions, req } = await initReq(payload.config, { - fallbackLocale: false, - req: { - headers, - query: qs.parse(queryString, { - depth: 10, - ignoreQueryPrefix: true, - }), - url: `${payload.config.serverURL}${route}${searchParams ? queryString : ''}`, - }, - }) - const languageOptions = Object.entries(payload.config.i18n.supportedLanguages || {}).reduce( (acc, [language, languageConfig]) => { if (Object.keys(payload.config.i18n.supportedLanguages).includes(language)) { diff --git a/packages/next/src/utilities/initPage/types.ts b/packages/next/src/utilities/initPage/types.ts index ca85a88f9b..11dfb13d46 100644 --- a/packages/next/src/utilities/initPage/types.ts +++ b/packages/next/src/utilities/initPage/types.ts @@ -20,4 +20,15 @@ export type Args = { * The search parameters of the current route provided to all pages in Next.js. */ searchParams: { [key: string]: string | string[] | undefined } + /** + * If `useLayoutReq` is `true`, this page will use the cached `req` created by the root layout + * instead of creating a new one. + * + * This improves performance for pages that are able to share the same `req` as the root layout, + * as permissions do not need to be re-calculated. + * + * If the page has unique query and url params that need to be part of the `req` object, or if you + * need permissions calculation to respect those you should not use this property. + */ + useLayoutReq?: boolean } diff --git a/packages/next/src/utilities/initReq.ts b/packages/next/src/utilities/initReq.ts index ce1c9cba52..140b21ee7c 100644 --- a/packages/next/src/utilities/initReq.ts +++ b/packages/next/src/utilities/initReq.ts @@ -1,5 +1,13 @@ -import type { I18n, I18nClient } from '@payloadcms/translations' -import type { Locale, PayloadRequest, SanitizedConfig, SanitizedPermissions } from 'payload' +import type { AcceptedLanguages, I18n, I18nClient } from '@payloadcms/translations' +import type { + ImportMap, + Locale, + Payload, + PayloadRequest, + SanitizedConfig, + SanitizedPermissions, + User, +} from 'payload' import { initI18n } from '@payloadcms/translations' import { headers as getHeaders } from 'next/headers.js' @@ -11,78 +19,114 @@ import { getRequestLanguage, parseCookies, } from 'payload' -import { cache } from 'react' import { getRequestLocale } from './getRequestLocale.js' +import { selectiveCache } from './selectiveCache.js' type Result = { + cookies: Map + headers: Awaited> + languageCode: AcceptedLanguages locale?: Locale permissions: SanitizedPermissions req: PayloadRequest } -export const initReq = cache(async function ( - configPromise: Promise | SanitizedConfig, - overrides?: Parameters[0], -): Promise { - const config = await configPromise - const payload = await getPayload({ config }) +type PartialResult = { + i18n: I18nClient + languageCode: AcceptedLanguages + payload: Payload + responseHeaders: Headers + user: null | User +} +// Create cache instances for different parts of our application +const partialReqCache = selectiveCache('partialReq') +const reqCache = selectiveCache('req') + +/** + * Initializes a full request object, including the `req` object and access control. + * As access control and getting the request locale is dependent on the current URL and + */ +export const initReq = async function ({ + configPromise, + importMap, + key, + overrides, +}: { + configPromise: Promise | SanitizedConfig + importMap: ImportMap + key: string + overrides?: Parameters[0] +}): Promise { const headers = await getHeaders() const cookies = parseCookies(headers) - const languageCode = getRequestLanguage({ - config, - cookies, - headers, - }) + const partialResult = await partialReqCache.get(async () => { + const config = await configPromise + const payload = await getPayload({ config, importMap }) + const languageCode = getRequestLanguage({ + config, + cookies, + headers, + }) + const i18n: I18nClient = await initI18n({ + config: config.i18n, + context: 'client', + language: languageCode, + }) - const i18n: I18nClient = await initI18n({ - config: config.i18n, - context: 'client', - language: languageCode, - }) + const { responseHeaders, user } = await executeAuthStrategies({ + headers, + payload, + }) - /** - * Cannot simply call `payload.auth` here, as we need the user to get the locale, and we need the locale to get the access results - * I.e. the `payload.auth` function would call `getAccessResults` without a fully-formed `req` object - */ - const { responseHeaders, user } = await executeAuthStrategies({ - headers, - payload, - }) + return { + i18n, + languageCode, + payload, + responseHeaders, + user, + } + }, 'global') - const { req: reqOverrides, ...optionsOverrides } = overrides || {} + return reqCache.get(async () => { + const { i18n, languageCode, payload, responseHeaders, user } = partialResult - const req = await createLocalReq( - { - req: { - headers, - host: headers.get('host'), - i18n: i18n as I18n, - responseHeaders, - url: `${payload.config.serverURL}`, - user, - ...(reqOverrides || {}), + const { req: reqOverrides, ...optionsOverrides } = overrides || {} + + const req = await createLocalReq( + { + req: { + headers, + host: headers.get('host'), + i18n: i18n as I18n, + responseHeaders, + user, + ...(reqOverrides || {}), + }, + ...(optionsOverrides || {}), }, - ...(optionsOverrides || {}), - }, - payload, - ) + payload, + ) - const locale = await getRequestLocale({ - req, - }) + const locale = await getRequestLocale({ + req, + }) - req.locale = locale?.code + req.locale = locale?.code - const permissions = await getAccessResults({ - req, - }) + const permissions = await getAccessResults({ + req, + }) - return { - locale, - permissions, - req, - } -}) + return { + cookies, + headers, + languageCode, + locale, + permissions, + req, + } + }, key) +} diff --git a/packages/next/src/utilities/selectiveCache.ts b/packages/next/src/utilities/selectiveCache.ts new file mode 100644 index 0000000000..728835f43d --- /dev/null +++ b/packages/next/src/utilities/selectiveCache.ts @@ -0,0 +1,57 @@ +import { cache } from 'react' + +type CachedValue = object + +// Module-scoped cache container that holds all cached, stable containers +// - these may hold the stable value, or a promise to the stable value +const globalCacheContainer: Record< + string, + ( + ...args: unknown[] + ) => { + value: null | Promise | TValue + } +> = {} + +/** + * Creates a selective cache function that provides more control over React's request-level caching behavior. + * + * @param namespace - A namespace to group related cached values + * @returns A function that manages cached values within the specified namespace + */ +export function selectiveCache(namespace: string) { + // Create a stable namespace container if it doesn't exist + if (!globalCacheContainer[namespace]) { + globalCacheContainer[namespace] = cache((...args) => ({ + value: null, + })) + } + + /** + * Gets or creates a cached value for a specific key within the namespace + * + * @param key - The key to identify the cached value + * @param factory - A function that produces the value if not cached + * @returns The cached or newly created value + */ + const getCached = async (factory: () => Promise, ...cacheArgs): Promise => { + const stableObjectFn = globalCacheContainer[namespace] + const stableObject = stableObjectFn(...cacheArgs) + + if ( + stableObject?.value && + 'then' in stableObject.value && + typeof stableObject.value?.then === 'function' + ) { + return await stableObject.value + } + + stableObject.value = factory() + + return await stableObject.value + } + + return { + get: getCached, + } +} diff --git a/packages/next/src/views/Dashboard/Default/index.tsx b/packages/next/src/views/Dashboard/Default/index.tsx index 524761f8c3..e8111bdb12 100644 --- a/packages/next/src/views/Dashboard/Default/index.tsx +++ b/packages/next/src/views/Dashboard/Default/index.tsx @@ -4,7 +4,8 @@ import type { ClientUser, Locale, ServerProps } from 'payload' import { getTranslation } from '@payloadcms/translations' import { Button, Card, Gutter, Locked } from '@payloadcms/ui' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' -import { EntityType, formatAdminURL } from '@payloadcms/ui/shared' +import { EntityType } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React, { Fragment } from 'react' import './index.scss' diff --git a/packages/next/src/views/Document/index.tsx b/packages/next/src/views/Document/index.tsx index 5b37230980..74d96af927 100644 --- a/packages/next/src/views/Document/index.tsx +++ b/packages/next/src/views/Document/index.tsx @@ -9,10 +9,11 @@ import type { import { DocumentInfoProvider, EditDepthProvider, HydrateAuthProvider } from '@payloadcms/ui' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' -import { formatAdminURL, isEditing as getIsEditing } from '@payloadcms/ui/shared' +import { isEditing as getIsEditing } from '@payloadcms/ui/shared' import { buildFormState } from '@payloadcms/ui/utilities/buildFormState' import { notFound, redirect } from 'next/navigation.js' import { logError } from 'payload' +import { formatAdminURL } from 'payload/shared' import React from 'react' import type { GenerateEditViewMetadata } from './getMetaBySegment.js' diff --git a/packages/next/src/views/ForgotPassword/index.tsx b/packages/next/src/views/ForgotPassword/index.tsx index 38d8e42a5d..4dc4f25017 100644 --- a/packages/next/src/views/ForgotPassword/index.tsx +++ b/packages/next/src/views/ForgotPassword/index.tsx @@ -1,7 +1,8 @@ import type { AdminViewServerProps } from 'payload' import { Button, Link } from '@payloadcms/ui' -import { formatAdminURL, Translation } from '@payloadcms/ui/shared' +import { Translation } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React, { Fragment } from 'react' import { FormHeader } from '../../elements/FormHeader/index.js' diff --git a/packages/next/src/views/List/index.tsx b/packages/next/src/views/List/index.tsx index 177fbde7fb..3ad3e8f8e0 100644 --- a/packages/next/src/views/List/index.tsx +++ b/packages/next/src/views/List/index.tsx @@ -1,18 +1,18 @@ -import type { - AdminViewServerProps, - ListPreferences, - ListQuery, - ListViewClientProps, - ListViewServerPropsOnly, - Where, -} from 'payload' - import { DefaultListView, HydrateAuthProvider, ListQueryProvider } from '@payloadcms/ui' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' import { renderFilters, renderTable, upsertPreferences } from '@payloadcms/ui/rsc' -import { formatAdminURL, mergeListSearchAndWhere } from '@payloadcms/ui/shared' +import { mergeListSearchAndWhere } from '@payloadcms/ui/shared' import { notFound } from 'next/navigation.js' -import { isNumber } from 'payload/shared' +import { + type AdminViewServerProps, + type ColumnPreference, + type ListPreferences, + type ListQuery, + type ListViewClientProps, + type ListViewServerPropsOnly, + type Where, +} from 'payload' +import { formatAdminURL, isNumber, transformColumnsToPreferences } from 'payload/shared' import React, { Fragment } from 'react' import { renderListViewSlots } from './renderListViewSlots.js' @@ -72,10 +72,20 @@ export const renderListView = async ( const query = queryFromArgs || queryFromReq + const columns: ColumnPreference[] = transformColumnsToPreferences( + query?.columns as ColumnPreference[] | string, + ) + + /** + * @todo: find a pattern to avoid setting preferences on hard navigation, i.e. direct links, page refresh, etc. + * This will ensure that prefs are only updated when explicitly set by the user + * This could potentially be done by injecting a `sessionID` into the params and comparing it against a session cookie + */ const listPreferences = await upsertPreferences({ key: `${collectionSlug}-list`, req, value: { + columns, limit: isNumber(query?.limit) ? Number(query.limit) : undefined, sort: query?.sort as string, }, @@ -141,6 +151,7 @@ export const renderListView = async ( clientCollectionConfig, collectionConfig, columnPreferences: listPreferences?.columns, + columns, customCellProps, docs: data.docs, drawerSlug, @@ -203,9 +214,11 @@ export const renderListView = async ( {RenderServerComponent({ diff --git a/packages/next/src/views/LivePreview/index.client.tsx b/packages/next/src/views/LivePreview/index.client.tsx index a1cb8eb93d..30181d28fd 100644 --- a/packages/next/src/views/LivePreview/index.client.tsx +++ b/packages/next/src/views/LivePreview/index.client.tsx @@ -35,13 +35,13 @@ import { } from '@payloadcms/ui' import { abortAndIgnore, - formatAdminURL, handleAbortRef, handleBackToDashboard, handleGoBack, handleTakeOver, } from '@payloadcms/ui/shared' import { useRouter, useSearchParams } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { Fragment, useCallback, useEffect, useRef, useState } from 'react' import { useLivePreviewContext } from './Context/context.js' diff --git a/packages/next/src/views/Login/LoginForm/index.tsx b/packages/next/src/views/Login/LoginForm/index.tsx index 1816c8b8cd..a258da9bcc 100644 --- a/packages/next/src/views/Login/LoginForm/index.tsx +++ b/packages/next/src/views/Login/LoginForm/index.tsx @@ -16,8 +16,7 @@ import { useConfig, useTranslation, } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' -import { getLoginOptions } from 'payload/shared' +import { formatAdminURL, getLoginOptions } from 'payload/shared' import type { LoginFieldProps } from '../LoginField/index.js' diff --git a/packages/next/src/views/Logout/LogoutClient.tsx b/packages/next/src/views/Logout/LogoutClient.tsx index 88fba7f02a..066d32c37f 100644 --- a/packages/next/src/views/Logout/LogoutClient.tsx +++ b/packages/next/src/views/Logout/LogoutClient.tsx @@ -7,8 +7,8 @@ import { useRouteTransition, useTranslation, } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { useEffect } from 'react' import './index.scss' diff --git a/packages/next/src/views/NotFound/index.tsx b/packages/next/src/views/NotFound/index.tsx index 235585025b..49e0e3b8df 100644 --- a/packages/next/src/views/NotFound/index.tsx +++ b/packages/next/src/views/NotFound/index.tsx @@ -2,7 +2,7 @@ import type { I18n } from '@payloadcms/translations' import type { Metadata } from 'next' import type { AdminViewServerProps, ImportMap, SanitizedConfig } from 'payload' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { DefaultTemplate } from '../../templates/Default/index.js' @@ -58,6 +58,7 @@ export const NotFoundPage = async ({ redirectUnauthenticatedUser: true, route: formatAdminURL({ adminRoute, path: '/not-found' }), searchParams, + useLayoutReq: true, }) const params = await paramsPromise diff --git a/packages/next/src/views/ResetPassword/ResetPasswordForm/index.tsx b/packages/next/src/views/ResetPassword/ResetPasswordForm/index.tsx index 8e1aa600fa..1bb70bffc2 100644 --- a/packages/next/src/views/ResetPassword/ResetPasswordForm/index.tsx +++ b/packages/next/src/views/ResetPassword/ResetPasswordForm/index.tsx @@ -9,9 +9,9 @@ import { useConfig, useTranslation, } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' import { useRouter } from 'next/navigation.js' import { type FormState } from 'payload' +import { formatAdminURL } from 'payload/shared' import React from 'react' type Args = { diff --git a/packages/next/src/views/ResetPassword/index.tsx b/packages/next/src/views/ResetPassword/index.tsx index 46a60f3f92..138e92473e 100644 --- a/packages/next/src/views/ResetPassword/index.tsx +++ b/packages/next/src/views/ResetPassword/index.tsx @@ -1,7 +1,8 @@ import type { AdminViewServerProps } from 'payload' import { Button, Link } from '@payloadcms/ui' -import { formatAdminURL, Translation } from '@payloadcms/ui/shared' +import { Translation } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { FormHeader } from '../../elements/FormHeader/index.js' diff --git a/packages/next/src/views/Root/getViewFromConfig.ts b/packages/next/src/views/Root/getViewFromConfig.ts index 3ae02d6c8e..4911791882 100644 --- a/packages/next/src/views/Root/getViewFromConfig.ts +++ b/packages/next/src/views/Root/getViewFromConfig.ts @@ -9,7 +9,7 @@ import type { } from 'payload' import type React from 'react' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import type { initPage } from '../../utilities/initPage/index.js' diff --git a/packages/next/src/views/Root/index.tsx b/packages/next/src/views/Root/index.tsx index 9877ed539d..625510b256 100644 --- a/packages/next/src/views/Root/index.tsx +++ b/packages/next/src/views/Root/index.tsx @@ -8,9 +8,9 @@ import type { } from 'payload' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' -import { formatAdminURL } from '@payloadcms/ui/shared' import { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig' import { notFound, redirect } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { Fragment } from 'react' import { DefaultTemplate } from '../../templates/Default/index.js' @@ -56,7 +56,7 @@ export const RootPage = async ({ const currentRoute = formatAdminURL({ adminRoute, - path: `${Array.isArray(params.segments) ? `/${params.segments.join('/')}` : ''}`, + path: Array.isArray(params.segments) ? `/${params.segments.join('/')}` : null, }) const segments = Array.isArray(params.segments) ? params.segments : [] diff --git a/packages/next/src/views/Unauthorized/index.tsx b/packages/next/src/views/Unauthorized/index.tsx index cb297fc8b4..eee1e8e63f 100644 --- a/packages/next/src/views/Unauthorized/index.tsx +++ b/packages/next/src/views/Unauthorized/index.tsx @@ -1,7 +1,7 @@ import type { AdminViewServerProps } from 'payload' import { Button } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { FormHeader } from '../../elements/FormHeader/index.js' diff --git a/packages/next/src/views/Verify/index.tsx b/packages/next/src/views/Verify/index.tsx index 390e6510dd..18601ec584 100644 --- a/packages/next/src/views/Verify/index.tsx +++ b/packages/next/src/views/Verify/index.tsx @@ -1,6 +1,6 @@ import type { AdminViewServerProps } from 'payload' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { Logo } from '../../elements/Logo/index.js' @@ -14,7 +14,7 @@ export { generateVerifyMetadata } from './meta.js' export async function Verify({ initPageResult, params, searchParams }: AdminViewServerProps) { // /:collectionSlug/verify/:token - const [collectionSlug, token] = params.segments + const [collectionSlug, verify, token] = params.segments const { locale, permissions, req } = initPageResult const { diff --git a/packages/next/src/views/Version/Default/SetStepNav.tsx b/packages/next/src/views/Version/Default/SetStepNav.tsx index 8af753fe94..53717e103e 100644 --- a/packages/next/src/views/Version/Default/SetStepNav.tsx +++ b/packages/next/src/views/Version/Default/SetStepNav.tsx @@ -5,8 +5,8 @@ import type React from 'react' import { getTranslation } from '@payloadcms/translations' import { useConfig, useLocale, useStepNav, useTranslation } from '@payloadcms/ui' -import { formatAdminURL, formatDate } from '@payloadcms/ui/shared' -import { fieldAffectsData } from 'payload/shared' +import { formatDate } from '@payloadcms/ui/shared' +import { fieldAffectsData, formatAdminURL } from 'payload/shared' import { useEffect } from 'react' export const SetStepNav: React.FC<{ diff --git a/packages/next/src/views/Version/Restore/index.tsx b/packages/next/src/views/Version/Restore/index.tsx index bd0c0fa475..d10de9d120 100644 --- a/packages/next/src/views/Version/Restore/index.tsx +++ b/packages/next/src/views/Version/Restore/index.tsx @@ -11,8 +11,9 @@ import { useRouteTransition, useTranslation, } from '@payloadcms/ui' -import { formatAdminURL, requests } from '@payloadcms/ui/shared' +import { requests } from '@payloadcms/ui/shared' import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { Fragment, useCallback, useState } from 'react' import type { Props } from './types.js' diff --git a/packages/next/src/views/Version/index.tsx b/packages/next/src/views/Version/index.tsx index 4cb614dbc9..e2563f658f 100644 --- a/packages/next/src/views/Version/index.tsx +++ b/packages/next/src/views/Version/index.tsx @@ -1,6 +1,7 @@ import type { Document, DocumentViewServerProps, + Locale, OptionObject, SanitizedCollectionPermission, SanitizedGlobalPermission, @@ -142,26 +143,29 @@ export async function VersionView(props: DocumentViewServerProps) { } } - const selectedLocales: OptionObject[] = [] + let selectedLocales: OptionObject[] = [] if (localization) { + let locales: Locale[] = [] if (localeCodesFromParams) { for (const code of localeCodesFromParams) { const locale = localization.locales.find((locale) => locale.code === code) - if (locale) { - selectedLocales.push({ - label: locale.label, - value: locale.code, - }) + if (!locale) { + continue } + locales.push(locale) } } else { - for (const { code, label } of localization.locales) { - selectedLocales.push({ - label, - value: code, - }) - } + locales = localization.locales } + + if (localization.filterAvailableLocales) { + locales = (await localization.filterAvailableLocales({ locales, req })) || [] + } + + selectedLocales = locales.map((locale) => ({ + label: locale.label, + value: locale.code, + })) } const latestVersion = diff --git a/packages/next/src/views/Versions/cells/CreatedAt/index.tsx b/packages/next/src/views/Versions/cells/CreatedAt/index.tsx index 9bee7ca9c5..ce245fb2b7 100644 --- a/packages/next/src/views/Versions/cells/CreatedAt/index.tsx +++ b/packages/next/src/views/Versions/cells/CreatedAt/index.tsx @@ -1,6 +1,7 @@ 'use client' import { Link, useConfig, useTranslation } from '@payloadcms/ui' -import { formatAdminURL, formatDate } from '@payloadcms/ui/shared' +import { formatDate } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' type CreatedAtCellProps = { diff --git a/packages/payload-cloud/package.json b/packages/payload-cloud/package.json index 4a25711dcb..f28d161f42 100644 --- a/packages/payload-cloud/package.json +++ b/packages/payload-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/payload-cloud", - "version": "3.24.0", + "version": "3.27.0", "description": "The official Payload Cloud plugin", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/payload/package.json b/packages/payload/package.json index 8ef59945a2..4a8e34d47c 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.24.0", + "version": "3.27.0", "description": "Node, React, Headless CMS and Application Framework built on Next.js", "keywords": [ "admin panel", diff --git a/packages/payload/src/admin/RichText.ts b/packages/payload/src/admin/RichText.ts index f5cacf4c10..5644f07e30 100644 --- a/packages/payload/src/admin/RichText.ts +++ b/packages/payload/src/admin/RichText.ts @@ -87,6 +87,12 @@ export type BeforeChangeRichTextHookArgs< duplicate?: boolean errors?: ValidationFieldError[] + /** + * Built up field label + * + * @example "Group Field > Tab Field > Rich Text Field" + */ + fieldLabelPath: string /** Only available in `beforeChange` field hooks */ mergeLocaleActions?: (() => Promise | void)[] /** A string relating to which operation the field type is currently executing within. */ @@ -95,11 +101,11 @@ export type BeforeChangeRichTextHookArgs< previousSiblingDoc?: TData /** The previous value of the field, before changes */ previousValue?: TValue + /** * The original siblingData with locales (not modified by any hooks). */ siblingDocWithLocales?: JsonObject - skipValidation?: boolean } @@ -121,7 +127,6 @@ export type BaseRichTextHookArgs< /** The full original document in `update` operations. In the `afterChange` hook, this is the resulting document of the operation. */ originalDoc?: TData parentIsLocalized: boolean - /** * The path of the field, e.g. ["group", "myArray", 1, "textField"]. The path is the schemaPath but with indexes and would be used in the context of field data, not field schemas. */ diff --git a/packages/payload/src/admin/functions/index.ts b/packages/payload/src/admin/functions/index.ts index 6a127de063..a1966b19b9 100644 --- a/packages/payload/src/admin/functions/index.ts +++ b/packages/payload/src/admin/functions/index.ts @@ -1,8 +1,9 @@ import type { ImportMap } from '../../bin/generateImportMap/index.js' import type { SanitizedConfig } from '../../config/types.js' import type { PaginatedDocs } from '../../database/types.js' -import type { CollectionSlug } from '../../index.js' +import type { CollectionSlug, ColumnPreference } from '../../index.js' import type { PayloadRequest, Sort, Where } from '../../types/index.js' +import type { ColumnsFromURL } from '../../utilities/transformColumnPreferences.js' export type DefaultServerFunctionArgs = { importMap: ImportMap @@ -38,6 +39,11 @@ export type ServerFunctionHandler = ( ) => Promise export type ListQuery = { + /* + * This is an of strings, i.e. `['title', '-slug']` + * Use `transformColumnsToPreferences` to convert it back and forth + */ + columns?: ColumnsFromURL limit?: string page?: string /* @@ -50,7 +56,7 @@ export type ListQuery = { export type BuildTableStateArgs = { collectionSlug: string | string[] - columns?: { accessor: string; active: boolean }[] + columns?: ColumnPreference[] docs?: PaginatedDocs['docs'] enableRowSelections?: boolean parent?: { diff --git a/packages/payload/src/admin/views/list.ts b/packages/payload/src/admin/views/list.ts index 5823abf01c..624d842c11 100644 --- a/packages/payload/src/admin/views/list.ts +++ b/packages/payload/src/admin/views/list.ts @@ -42,8 +42,14 @@ export type ListViewClientProps = { disableBulkEdit?: boolean enableRowSelections?: boolean hasCreatePermission: boolean + /** + * @deprecated + */ listPreferences?: ListPreferences newDocumentURL: string + /** + * @deprecated + */ preferenceKey?: string renderedFilters?: Map resolvedFilterOptions?: Map diff --git a/packages/payload/src/auth/executeAuthStrategies.ts b/packages/payload/src/auth/executeAuthStrategies.ts index 3eb41d9fa2..9da6598361 100644 --- a/packages/payload/src/auth/executeAuthStrategies.ts +++ b/packages/payload/src/auth/executeAuthStrategies.ts @@ -1,19 +1,36 @@ import type { AuthStrategyFunctionArgs, AuthStrategyResult } from './index.js' + +import { logError } from '../utilities/logError.js' +import { mergeHeaders } from '../utilities/mergeHeaders.js' export const executeAuthStrategies = async ( args: AuthStrategyFunctionArgs, ): Promise => { + let result: AuthStrategyResult = { user: null } + if (!args.payload.authStrategies?.length) { - return { user: null } + return result } for (const strategy of args.payload.authStrategies) { // add the configured AuthStrategy `name` to the strategy function args args.strategyName = strategy.name - const result = await strategy.authenticate(args) + try { + const authResult = await strategy.authenticate(args) + if (authResult.responseHeaders) { + authResult.responseHeaders = mergeHeaders( + result.responseHeaders || new Headers(), + authResult.responseHeaders || new Headers(), + ) + } + result = authResult + } catch (err) { + logError({ err, payload: args.payload }) + } + if (result.user) { return result } } - return { user: null } + return result } diff --git a/packages/payload/src/auth/extractJWT.ts b/packages/payload/src/auth/extractJWT.ts index 901368c8e9..85b2ffad9c 100644 --- a/packages/payload/src/auth/extractJWT.ts +++ b/packages/payload/src/auth/extractJWT.ts @@ -1,32 +1,60 @@ +import type { BasePayload } from '../index.js' import type { AuthStrategyFunctionArgs } from './index.js' import { parseCookies } from '../utilities/parseCookies.js' +type ExtractionMethod = (args: { headers: Headers; payload: BasePayload }) => null | string + +const extractionMethods: Record = { + Bearer: ({ headers }) => { + const jwtFromHeader = headers.get('Authorization') + + // allow RFC6750 OAuth 2.0 compliant Bearer tokens + // in addition to the payload default JWT format + if (jwtFromHeader?.startsWith('Bearer ')) { + return jwtFromHeader.replace('Bearer ', '') + } + + return null + }, + cookie: ({ headers, payload }) => { + const origin = headers.get('Origin') + const cookies = parseCookies(headers) + const tokenCookieName = `${payload.config.cookiePrefix}-token` + const cookieToken = cookies.get(tokenCookieName) + + if (!cookieToken) { + return null + } + + if (!origin || payload.config.csrf.length === 0 || payload.config.csrf.indexOf(origin) > -1) { + return cookieToken + } + + return null + }, + JWT: ({ headers }) => { + const jwtFromHeader = headers.get('Authorization') + + if (jwtFromHeader?.startsWith('JWT ')) { + return jwtFromHeader.replace('JWT ', '') + } + + return null + }, +} + export const extractJWT = (args: Omit): null | string => { const { headers, payload } = args - const jwtFromHeader = headers.get('Authorization') - const origin = headers.get('Origin') + const extractionOrder = payload.config.auth.jwtOrder - if (jwtFromHeader?.startsWith('JWT ')) { - return jwtFromHeader.replace('JWT ', '') - } - // allow RFC6750 OAuth 2.0 compliant Bearer tokens - // in addition to the payload default JWT format - if (jwtFromHeader?.startsWith('Bearer ')) { - return jwtFromHeader.replace('Bearer ', '') - } + for (const extractionStrategy of extractionOrder) { + const result = extractionMethods[extractionStrategy]({ headers, payload }) - const cookies = parseCookies(headers) - const tokenCookieName = `${payload.config.cookiePrefix}-token` - const cookieToken = cookies.get(tokenCookieName) - - if (!cookieToken) { - return null - } - - if (!origin || payload.config.csrf.length === 0 || payload.config.csrf.indexOf(origin) > -1) { - return cookieToken + if (result) { + return result + } } return null diff --git a/packages/payload/src/auth/operations/forgotPassword.ts b/packages/payload/src/auth/operations/forgotPassword.ts index f0ce36af7c..a51f947b32 100644 --- a/packages/payload/src/auth/operations/forgotPassword.ts +++ b/packages/payload/src/auth/operations/forgotPassword.ts @@ -14,6 +14,7 @@ import { buildAfterOperation } from '../../collections/operations/utils.js' import { APIError } from '../../errors/index.js' import { Forbidden } from '../../index.js' import { commitTransaction } from '../../utilities/commitTransaction.js' +import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { initTransaction } from '../../utilities/initTransaction.js' import { killTransaction } from '../../utilities/killTransaction.js' import { getLoginOptions } from '../getLoginOptions.js' @@ -155,9 +156,13 @@ export const forgotPasswordOperation = async ( config.serverURL !== null && config.serverURL !== '' ? config.serverURL : `${protocol}//${req.headers.get('host')}` - + const forgotURL = formatAdminURL({ + adminRoute: config.routes.admin, + path: `${config.admin.routes.reset}/${token}`, + serverURL, + }) let html = `${req.t('authentication:youAreReceivingResetPassword')} - ${serverURL}${config.routes.admin}${config.admin.routes.reset}/${token} + ${forgotURL} ${req.t('authentication:youDidNotRequestPassword')}` if (typeof collectionConfig.auth.forgotPassword?.generateEmailHTML === 'function') { diff --git a/packages/payload/src/auth/operations/verifyEmail.ts b/packages/payload/src/auth/operations/verifyEmail.ts index dab7d6d2a6..ede5f3c2d0 100644 --- a/packages/payload/src/auth/operations/verifyEmail.ts +++ b/packages/payload/src/auth/operations/verifyEmail.ts @@ -48,6 +48,7 @@ export const verifyEmailOperation = async (args: Args): Promise => { _verified: true, }, req, + returning: false, }) if (shouldCommit) { diff --git a/packages/payload/src/bin/generateImportMap/index.ts b/packages/payload/src/bin/generateImportMap/index.ts index fe0679f475..f77f9fcd8c 100644 --- a/packages/payload/src/bin/generateImportMap/index.ts +++ b/packages/payload/src/bin/generateImportMap/index.ts @@ -209,15 +209,28 @@ export async function writeImportMap({ log?: boolean rootDir: string }) { - let importMapFolderPath = '' - if (fs.existsSync(path.resolve(rootDir, `app/(payload)${config.routes.admin}/`))) { - importMapFolderPath = path.resolve(rootDir, `app/(payload)${config.routes.admin}/`) - } else if (fs.existsSync(path.resolve(rootDir, `src/app/(payload)${config.routes.admin}/`))) { - importMapFolderPath = path.resolve(rootDir, `src/app/(payload)${config.routes.admin}/`) + let importMapFilePath: string | undefined = undefined + + if (config?.admin?.importMap?.importMapFile?.length) { + if (!fs.existsSync(config.admin.importMap.importMapFile)) { + throw new Error( + `Could not find the import map file at ${config.admin.importMap.importMapFile}`, + ) + } + importMapFilePath = config.admin.importMap.importMapFile } else { - throw new Error( - `Could not find the payload admin directory. Looked in ${path.resolve(rootDir, `app/(payload)${config.routes.admin}/`)} and ${path.resolve(rootDir, `src/app/(payload)${config.routes.admin}/`)}`, - ) + const appLocation = path.resolve(rootDir, `app/(payload)${config.routes.admin}/`) + const srcAppLocation = path.resolve(rootDir, `src/app/(payload)${config.routes.admin}/`) + + if (fs.existsSync(appLocation)) { + importMapFilePath = path.resolve(appLocation, fileName) + } else if (fs.existsSync(srcAppLocation)) { + importMapFilePath = path.resolve(srcAppLocation, fileName) + } else { + throw new Error( + `Could not find Payload import map folder. Looked in ${appLocation} and ${srcAppLocation}`, + ) + } } const imports: string[] = [] @@ -237,8 +250,6 @@ ${mapKeys.join(',\n')} } ` - const importMapFilePath = path.resolve(importMapFolderPath, fileName) - if (!force) { // Read current import map and check in the IMPORTS if there are any new imports. If not, don't write the file. const currentImportMap = await fs.promises.readFile(importMapFilePath, 'utf-8') diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index 9170a0234d..5894670860 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -17,7 +17,15 @@ import { createClientFields } from '../../fields/config/client.js' export type ServerOnlyCollectionProperties = keyof Pick< SanitizedCollectionConfig, - 'access' | 'custom' | 'endpoints' | 'flattenedFields' | 'hooks' | 'joins' | 'polymorphicJoins' + | 'access' + | 'custom' + | 'endpoints' + | 'flattenedFields' + | 'hooks' + | 'indexes' + | 'joins' + | 'polymorphicJoins' + | 'sanitizedIndexes' > export type ServerOnlyCollectionAdminProperties = keyof Pick< @@ -70,6 +78,8 @@ const serverOnlyCollectionProperties: Partial[] 'joins', 'polymorphicJoins', 'flattenedFields', + 'indexes', + 'sanitizedIndexes', // `upload` // `admin` // are all handled separately diff --git a/packages/payload/src/collections/config/defaults.ts b/packages/payload/src/collections/config/defaults.ts index e3d292b652..eb338df75e 100644 --- a/packages/payload/src/collections/config/defaults.ts +++ b/packages/payload/src/collections/config/defaults.ts @@ -3,6 +3,9 @@ import type { CollectionConfig } from './types.js' import defaultAccess from '../../auth/defaultAccess.js' +/** + * @deprecated - remove in 4.0. This is error-prone, as mutating this object will affect any objects that use the defaults as a base. + */ export const defaults: Partial = { access: { create: defaultAccess, @@ -45,11 +48,74 @@ export const defaults: Partial = { me: [], refresh: [], }, + indexes: [], timestamps: true, upload: false, versions: false, } +export const addDefaultsToCollectionConfig = (collection: CollectionConfig): CollectionConfig => { + collection.access = { + create: defaultAccess, + delete: defaultAccess, + read: defaultAccess, + unlock: defaultAccess, + update: defaultAccess, + ...(collection.access || {}), + } + + collection.admin = { + components: {}, + custom: {}, + enableRichTextLink: true, + enableRichTextRelationship: true, + useAsTitle: 'id', + ...(collection.admin || {}), + pagination: { + defaultLimit: 10, + limits: [5, 10, 25, 50, 100], + ...(collection.admin?.pagination || {}), + }, + } + + collection.auth = collection.auth ?? false + collection.custom = collection.custom ?? {} + collection.endpoints = collection.endpoints ?? [] + collection.fields = collection.fields ?? [] + + collection.hooks = { + afterChange: [], + afterDelete: [], + afterForgotPassword: [], + afterLogin: [], + afterLogout: [], + afterMe: [], + afterOperation: [], + afterRead: [], + afterRefresh: [], + beforeChange: [], + beforeDelete: [], + beforeLogin: [], + beforeOperation: [], + beforeRead: [], + beforeValidate: [], + me: [], + refresh: [], + ...(collection.hooks || {}), + } + + collection.timestamps = collection.timestamps ?? true + collection.upload = collection.upload ?? false + collection.versions = collection.versions ?? false + + collection.indexes = collection.indexes ?? [] + + return collection +} + +/** + * @deprecated - remove in 4.0. This is error-prone, as mutating this object will affect any objects that use the defaults as a base. + */ export const authDefaults: IncomingAuthType = { cookies: { sameSite: 'Lax', @@ -63,8 +129,43 @@ export const authDefaults: IncomingAuthType = { verify: false, } +export const addDefaultsToAuthConfig = (auth: IncomingAuthType): IncomingAuthType => { + auth.cookies = { + sameSite: 'Lax', + secure: false, + ...(auth.cookies || {}), + } + + auth.forgotPassword = auth.forgotPassword ?? {} + auth.lockTime = auth.lockTime ?? 600000 // 10 minutes + auth.loginWithUsername = auth.loginWithUsername ?? false + auth.maxLoginAttempts = auth.maxLoginAttempts ?? 5 + auth.tokenExpiration = auth.tokenExpiration ?? 7200 + auth.verify = auth.verify ?? false + auth.strategies = auth.strategies ?? [] + + if (!auth.disableLocalStrategy && auth.verify === true) { + auth.verify = {} + } + + return auth +} + +/** + * @deprecated - remove in 4.0. This is error-prone, as mutating this object will affect any objects that use the defaults as a base. + */ export const loginWithUsernameDefaults: LoginWithUsernameOptions = { allowEmailLogin: false, requireEmail: false, requireUsername: true, } + +export const addDefaultsToLoginWithUsernameConfig = ( + loginWithUsername: LoginWithUsernameOptions, +): LoginWithUsernameOptions => + ({ + allowEmailLogin: false, + requireEmail: false, + requireUsername: true, + ...(loginWithUsername || {}), + }) as LoginWithUsernameOptions diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index bcd0755964..18051ffe26 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -1,7 +1,7 @@ +// @ts-strict-ignore + import { generateKeyBetween, generateNKeysBetween } from 'fractional-indexing' -// @ts-strict-ignore -import type { LoginWithUsernameOptions } from '../../auth/types.js' import type { Config, Endpoint, PayloadHandler, SanitizedConfig } from '../../config/types.js' import type { Field } from '../../fields/config/types.js' import type { @@ -20,14 +20,18 @@ import { fieldAffectsData } from '../../fields/config/types.js' import mergeBaseFields from '../../fields/mergeBaseFields.js' import { uploadCollectionEndpoints } from '../../uploads/endpoints/index.js' import { getBaseUploadFields } from '../../uploads/getBaseFields.js' -import { deepMergeWithReactComponents } from '../../utilities/deepMerge.js' import { flattenAllFields } from '../../utilities/flattenAllFields.js' import { formatLabels } from '../../utilities/formatLabels.js' import baseVersionFields from '../../versions/baseFields.js' import { versionDefaults } from '../../versions/defaults.js' import { defaultCollectionEndpoints } from '../endpoints/index.js' -import { authDefaults, defaults, loginWithUsernameDefaults } from './defaults.js' +import { + addDefaultsToAuthConfig, + addDefaultsToCollectionConfig, + addDefaultsToLoginWithUsernameConfig, +} from './defaults.js' import { sanitizeAuthFields, sanitizeUploadFields } from './reservedFieldNames.js' +import { sanitizeCompoundIndexes } from './sanitizeCompoundIndexes.js' import { validateUseAsTitle } from './useAsTitle.js' export const sanitizeCollection = async ( @@ -40,11 +44,15 @@ export const sanitizeCollection = async ( richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise>, _validRelationships?: string[], ): Promise => { + if (collection._sanitized) { + return collection as SanitizedCollectionConfig + } + collection._sanitized = true // ///////////////////////////////// // Make copy of collection config // ///////////////////////////////// - const sanitized: CollectionConfig = deepMergeWithReactComponents(defaults, collection) + const sanitized: CollectionConfig = addDefaultsToCollectionConfig(collection) // ///////////////////////////////// // Sanitize fields @@ -194,30 +202,20 @@ export const sanitizeCollection = async ( // sanitize fields for reserved names sanitizeAuthFields(sanitized.fields, sanitized) - sanitized.auth = deepMergeWithReactComponents( - authDefaults, - typeof sanitized.auth === 'object' ? sanitized.auth : {}, + sanitized.auth = addDefaultsToAuthConfig( + typeof sanitized.auth === 'boolean' ? {} : sanitized.auth, ) - if (!sanitized.auth.disableLocalStrategy && sanitized.auth.verify === true) { - sanitized.auth.verify = {} - } - // disable duplicate for auth enabled collections by default sanitized.disableDuplicate = sanitized.disableDuplicate ?? true - if (!sanitized.auth.strategies) { - sanitized.auth.strategies = [] - } - if (sanitized.auth.loginWithUsername) { if (sanitized.auth.loginWithUsername === true) { - sanitized.auth.loginWithUsername = loginWithUsernameDefaults + sanitized.auth.loginWithUsername = addDefaultsToLoginWithUsernameConfig({}) } else { - const loginWithUsernameWithDefaults = { - ...loginWithUsernameDefaults, - ...sanitized.auth.loginWithUsername, - } as LoginWithUsernameOptions + const loginWithUsernameWithDefaults = addDefaultsToLoginWithUsernameConfig( + sanitized.auth.loginWithUsername, + ) // if allowEmailLogin is false, requireUsername must be true if (loginWithUsernameWithDefaults.allowEmailLogin === false) { @@ -254,6 +252,11 @@ export const sanitizeCollection = async ( sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields }) + sanitizedConfig.sanitizedIndexes = sanitizeCompoundIndexes({ + fields: sanitizedConfig.flattenedFields, + indexes: sanitizedConfig.indexes, + }) + return sanitizedConfig } diff --git a/packages/payload/src/collections/config/sanitizeCompoundIndexes.ts b/packages/payload/src/collections/config/sanitizeCompoundIndexes.ts new file mode 100644 index 0000000000..38f83fc49d --- /dev/null +++ b/packages/payload/src/collections/config/sanitizeCompoundIndexes.ts @@ -0,0 +1,40 @@ +import type { FlattenedField } from '../../fields/config/types.js' +import type { CompoundIndex, SanitizedCompoundIndex } from './types.js' + +import { InvalidConfiguration } from '../../errors/InvalidConfiguration.js' +import { getFieldByPath } from '../../utilities/getFieldByPath.js' + +export const sanitizeCompoundIndexes = ({ + fields, + indexes, +}: { + fields: FlattenedField[] + indexes: CompoundIndex[] +}): SanitizedCompoundIndex[] => { + const sanitizedCompoundIndexes: SanitizedCompoundIndex[] = [] + + for (const index of indexes) { + const sanitized: SanitizedCompoundIndex = { fields: [], unique: index.unique ?? false } + for (const path of index.fields) { + const result = getFieldByPath({ fields, path }) + + if (!result) { + throw new InvalidConfiguration(`Field ${path} was not found`) + } + + const { field, localizedPath, pathHasLocalized } = result + + if (['array', 'blocks', 'group', 'tab'].includes(field.type)) { + throw new InvalidConfiguration( + `Compound index on ${field.type} cannot be set. Path: ${localizedPath}`, + ) + } + + sanitized.fields.push({ field, localizedPath, path, pathHasLocalized }) + } + + sanitizedCompoundIndexes.push(sanitized) + } + + return sanitizedCompoundIndexes +} diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 6b41c341fa..63a0b62598 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -327,6 +327,11 @@ export type CollectionAdminOptions = { * Custom description for collection. This will also be used as JSDoc for the generated types */ description?: EntityDescription + /** + * Disable the Copy To Locale button in the edit document view + * @default false + */ + disableCopyToLocale?: boolean enableRichTextLink?: boolean enableRichTextRelationship?: boolean /** @@ -369,6 +374,11 @@ export type CollectionAdminOptions = { /** Manage all aspects of a data collection */ export type CollectionConfig = { + /** + * Do not set this property manually. This is set to true during sanitization, to avoid + * sanitizing the same collection multiple times. + */ + _sanitized?: boolean /** * Access control */ @@ -459,6 +469,16 @@ export type CollectionConfig = { */ refresh?: RefreshHook[] } + /** + * Define compound indexes for this collection. + * This can be used to either speed up querying/sorting by 2 or more fields at the same time or + * to ensure uniqueness between several fields. + * Specify field paths + * @example + * [{ unique: true, fields: ['title', 'group.name'] }] + * @default [] + */ + indexes?: CompoundIndex[] /** * If true, enables custom ordering for the collection, and documents in the listView can be reordered via drag and drop. * New documents are inserted at the end of the list according to this parameter. @@ -548,7 +568,6 @@ export interface SanitizedCollectionConfig auth: Auth endpoints: Endpoint[] | false fields: Field[] - /** * Fields in the database schema structure * Rows / collapsible / tabs w/o name `fields` merged to top, UIs are excluded @@ -565,6 +584,8 @@ export interface SanitizedCollectionConfig */ polymorphicJoins: SanitizedJoin[] + sanitizedIndexes: SanitizedCompoundIndex[] + slug: CollectionSlug upload: SanitizedUploadConfig versions: SanitizedCollectionVersions @@ -608,3 +629,18 @@ export type TypeWithTimestamps = { id: number | string updatedAt: string } + +export type CompoundIndex = { + fields: string[] + unique?: boolean +} + +export type SanitizedCompoundIndex = { + fields: { + field: FlattenedField + localizedPath: string + path: string + pathHasLocalized: boolean + }[] + unique: boolean +} diff --git a/packages/payload/src/collections/operations/delete.ts b/packages/payload/src/collections/operations/delete.ts index ff88fbf29f..28a777319f 100644 --- a/packages/payload/src/collections/operations/delete.ts +++ b/packages/payload/src/collections/operations/delete.ts @@ -195,6 +195,7 @@ export const deleteOperation = async < await payload.db.deleteOne({ collection: collectionConfig.slug, req, + returning: false, where: { id: { equals: id, diff --git a/packages/payload/src/collections/operations/find.ts b/packages/payload/src/collections/operations/find.ts index 0de5ba87a8..766a4526e4 100644 --- a/packages/payload/src/collections/operations/find.ts +++ b/packages/payload/src/collections/operations/find.ts @@ -21,6 +21,7 @@ import { combineQueries } from '../../database/combineQueries.js' import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js' import { sanitizeJoinQuery } from '../../database/sanitizeJoinQuery.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' +import { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js' import { killTransaction } from '../../utilities/killTransaction.js' import { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js' import { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js' @@ -199,7 +200,7 @@ export const findOperation = async < const now = new Date().getTime() const lockedDocuments = await payload.find({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, depth: 1, limit: sanitizedLimit, overrideAccess: false, diff --git a/packages/payload/src/collections/operations/findByID.ts b/packages/payload/src/collections/operations/findByID.ts index 135b23d3dd..dfb2a2c5c4 100644 --- a/packages/payload/src/collections/operations/findByID.ts +++ b/packages/payload/src/collections/operations/findByID.ts @@ -20,6 +20,7 @@ import { sanitizeJoinQuery } from '../../database/sanitizeJoinQuery.js' import { NotFound } from '../../errors/index.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' import { validateQueryPaths } from '../../index.js' +import { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js' import { killTransaction } from '../../utilities/killTransaction.js' import replaceWithDraftIfAvailable from '../../versions/drafts/replaceWithDraftIfAvailable.js' import { buildAfterOperation } from './utils.js' @@ -162,7 +163,7 @@ export const findByIDOperation = async < const lockDurationInMilliseconds = lockDuration * 1000 const lockedDocument = await req.payload.find({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, depth: 1, limit: 1, overrideAccess: false, diff --git a/packages/payload/src/config/defaults.ts b/packages/payload/src/config/defaults.ts index 283ebe2fbb..12761de1a1 100644 --- a/packages/payload/src/config/defaults.ts +++ b/packages/payload/src/config/defaults.ts @@ -3,6 +3,9 @@ import type { Config } from './types.js' import defaultAccess from '../auth/defaultAccess.js' +/** + * @deprecated - remove in 4.0. This is error-prone, as mutating this object will affect any objects that use the defaults as a base. + */ export const defaults: Omit = { admin: { avatar: 'gravatar', @@ -29,6 +32,9 @@ export const defaults: Omit = { }, theme: 'all', }, + auth: { + jwtOrder: ['JWT', 'Bearer', 'cookie'], + }, bin: [], collections: [], cookiePrefix: 'payload', @@ -69,3 +75,87 @@ export const defaults: Omit = { }, upload: {}, } + +export const addDefaultsToConfig = (config: Config): Config => { + config.admin = { + avatar: 'gravatar', + components: {}, + custom: {}, + dateFormat: 'MMMM do yyyy, h:mm a', + dependencies: {}, + theme: 'all', + ...(config.admin || {}), + importMap: { + baseDir: `${typeof process?.cwd === 'function' ? process.cwd() : ''}`, + ...(config?.admin?.importMap || {}), + }, + meta: { + defaultOGImageType: 'dynamic', + titleSuffix: '- Payload', + ...(config?.admin?.meta || {}), + }, + routes: { + account: '/account', + createFirstUser: '/create-first-user', + forgot: '/forgot', + inactivity: '/logout-inactivity', + login: '/login', + logout: '/logout', + reset: '/reset', + unauthorized: '/unauthorized', + ...(config?.admin?.routes || {}), + }, + } + + config.bin = config.bin ?? [] + config.collections = config.collections ?? [] + config.cookiePrefix = config.cookiePrefix ?? 'payload' + config.cors = config.cors ?? [] + config.csrf = config.csrf ?? [] + config.custom = config.custom ?? {} + config.defaultDepth = config.defaultDepth ?? 2 + config.defaultMaxTextLength = config.defaultMaxTextLength ?? 40000 + config.endpoints = config.endpoints ?? [] + config.globals = config.globals ?? [] + config.graphQL = { + disablePlaygroundInProduction: true, + maxComplexity: 1000, + schemaOutputFile: `${typeof process?.cwd === 'function' ? process.cwd() : ''}/schema.graphql`, + ...(config.graphQL || {}), + } + config.hooks = config.hooks ?? {} + config.i18n = config.i18n ?? {} + config.jobs = { + deleteJobOnComplete: true, + depth: 0, + ...(config.jobs || {}), + access: { + run: defaultAccess, + ...(config.jobs?.access || {}), + }, + } as JobsConfig + config.localization = config.localization ?? false + config.maxDepth = config.maxDepth ?? 10 + config.routes = { + admin: '/admin', + api: (process.env.NEXT_BASE_PATH ?? '') + '/api', + graphQL: '/graphql', + graphQLPlayground: '/graphql-playground', + ...(config.routes || {}), + } + config.serverURL = config.serverURL ?? '' + config.telemetry = config.telemetry ?? true + config.typescript = { + autoGenerate: true, + outputFile: `${typeof process?.cwd === 'function' ? process.cwd() : ''}/payload-types.ts`, + ...(config.typescript || {}), + } + config.upload = config.upload ?? {} + + config.auth = { + jwtOrder: ['JWT', 'Bearer', 'cookie'], + ...(config.auth || {}), + } + + return config +} diff --git a/packages/payload/src/config/sanitize.ts b/packages/payload/src/config/sanitize.ts index 8168f3c073..aaff0a1271 100644 --- a/packages/payload/src/config/sanitize.ts +++ b/packages/payload/src/config/sanitize.ts @@ -26,12 +26,15 @@ import { type GlobalSlug, sanitizeFields, } from '../index.js' -import { getLockedDocumentsCollection } from '../lockedDocuments/lockedDocumentsCollection.js' -import getPreferencesCollection from '../preferences/preferencesCollection.js' -import { getDefaultJobsCollection } from '../queues/config/jobsCollection.js' +import { + getLockedDocumentsCollection, + lockedDocumentsCollectionSlug, +} from '../locked-documents/config.js' +import { getPreferencesCollection, preferencesCollectionSlug } from '../preferences/config.js' +import { getDefaultJobsCollection, jobsCollectionSlug } from '../queues/config/index.js' import { flattenBlock } from '../utilities/flattenAllFields.js' import { getSchedulePublishTask } from '../versions/schedule/job.js' -import { defaults } from './defaults.js' +import { addDefaultsToConfig } from './defaults.js' const sanitizeAdminConfig = (configToSanitize: Config): Partial => { const sanitizedConfig = { ...configToSanitize } @@ -100,55 +103,7 @@ const sanitizeAdminConfig = (configToSanitize: Config): Partial } export const sanitizeConfig = async (incomingConfig: Config): Promise => { - const configWithDefaults = { - ...defaults, - ...incomingConfig, - admin: { - ...defaults.admin, - ...incomingConfig?.admin, - meta: { - ...defaults.admin.meta, - ...incomingConfig?.admin?.meta, - }, - routes: { - ...defaults.admin.routes, - ...incomingConfig?.admin?.routes, - }, - }, - graphQL: { - ...defaults.graphQL, - ...incomingConfig?.graphQL, - }, - jobs: { - ...defaults.jobs, - ...incomingConfig?.jobs, - access: { - ...defaults.jobs.access, - ...incomingConfig?.jobs?.access, - }, - tasks: incomingConfig?.jobs?.tasks || [], - workflows: incomingConfig?.jobs?.workflows || [], - }, - routes: { - ...defaults.routes, - ...incomingConfig?.routes, - }, - typescript: { - ...defaults.typescript, - ...incomingConfig?.typescript, - }, - } - - if (!configWithDefaults?.serverURL) { - configWithDefaults.serverURL = '' - } - - if (process.env.NEXT_BASE_PATH) { - if (!incomingConfig?.routes?.api) { - // check for incomingConfig, as configWithDefaults will always have a default value for routes.api - configWithDefaults.routes.api = process.env.NEXT_BASE_PATH + '/api' - } - } + const configWithDefaults = addDefaultsToConfig(incomingConfig) const config: Partial = sanitizeAdminConfig(configWithDefaults) @@ -227,9 +182,9 @@ export const sanitizeConfig = async (incomingConfig: Config): Promise c.slug) ?? []), - 'payload-jobs', - 'payload-locked-documents', - 'payload-preferences', + jobsCollectionSlug, + lockedDocumentsCollectionSlug, + preferencesCollectionSlug, ] /** @@ -326,46 +281,57 @@ export const sanitizeConfig = async (incomingConfig: Config): Promise void > + /** + * If Payload cannot find the import map file location automatically, + * you can manually provide it here. + */ + importMapFile?: string } livePreview?: { collections?: string[] @@ -881,22 +886,46 @@ export type Config = { /** Base meta data to use for the Admin Panel. Included properties are titleSuffix, ogImage, and favicon. */ meta?: MetaConfig routes?: { - /** The route for the account page. */ - account?: string - /** The route for the create first user page. */ - createFirstUser?: string - /** The route for the forgot password page. */ - forgot?: string - /** The route the user will be redirected to after being inactive for too long. */ - inactivity?: string - /** The route for the login page. */ - login?: string - /** The route for the logout page. */ - logout?: string - /** The route for the reset password page. */ - reset?: string - /** The route for the unauthorized page. */ - unauthorized?: string + /** The route for the account page. + * + * @default '/account' + */ + account?: `/${string}` + /** The route for the create first user page. + * + * @default '/create-first-user' + */ + createFirstUser?: `/${string}` + /** The route for the forgot password page. + * + * @default '/forgot' + */ + forgot?: `/${string}` + /** The route the user will be redirected to after being inactive for too long. + * + * @default '/logout-inactivity' + */ + inactivity?: `/${string}` + /** The route for the login page. + * + * @default '/login' + */ + login?: `/${string}` + /** The route for the logout page. + * + * @default '/logout' + */ + logout?: `/${string}` + /** The route for the reset password page. + * + * @default '/reset' + */ + reset?: `/${string}` + /** The route for the unauthorized page. + * + * @default '/unauthorized' + */ + unauthorized?: `/${string}` } /** * Suppresses React hydration mismatch warnings during the hydration of the root tag. @@ -917,6 +946,16 @@ export type Config = { /** The slug of a Collection that you want to be used to log in to the Admin dashboard. */ user?: string } + /** + * Configure authentication-related Payload-wide settings. + */ + auth?: { + /** + * Define which JWT identification methods you'd like to support for Payload's local auth strategy, as well as the order that they're retrieved in. + * Defaults to ['JWT', 'Bearer', 'cookie] + */ + jwtOrder: ('Bearer' | 'cookie' | 'JWT')[] + } /** Custom Payload bin scripts can be injected via the config. */ bin?: BinScriptConfig[] blocks?: Block[] diff --git a/packages/payload/src/database/migrations/readMigrationFiles.ts b/packages/payload/src/database/migrations/readMigrationFiles.ts index 5bf413b7b9..ed8b788a5e 100644 --- a/packages/payload/src/database/migrations/readMigrationFiles.ts +++ b/packages/payload/src/database/migrations/readMigrationFiles.ts @@ -29,7 +29,7 @@ export const readMigrationFiles = async ({ .readdirSync(payload.db.migrationDir) .sort() .filter((f) => { - return (f.endsWith('.ts') || f.endsWith('.js')) && !f.includes('index.') + return (f.endsWith('.ts') || f.endsWith('.js')) && f !== 'index.js' && f !== 'index.ts' }) .map((file) => { return path.resolve(payload.db.migrationDir, file) diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 791aea0709..d9abba968a 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -145,6 +145,8 @@ export interface BaseDatabaseAdapter { updateGlobalVersion: UpdateGlobalVersion + updateMany: UpdateMany + updateOne: UpdateOne updateVersion: UpdateVersion @@ -292,6 +294,12 @@ export type UpdateGlobalVersionArgs = { */ options?: Record req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType versionData: T } & ( @@ -319,6 +327,12 @@ export type FindGlobal = = any>( export type CreateGlobalArgs = any> = { data: T req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean slug: string } export type CreateGlobal = = any>( @@ -332,6 +346,12 @@ export type UpdateGlobalArgs = any> = { */ options?: Record req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType slug: string } @@ -365,6 +385,12 @@ export type CreateVersionArgs = { parent: number | string publishedLocale?: string req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType snapshot?: true updatedAt: string @@ -383,6 +409,12 @@ export type CreateGlobalVersionArgs = { parent: number | string publishedLocale?: string req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType snapshot?: true updatedAt: string @@ -403,6 +435,12 @@ export type UpdateVersionArgs = { */ options?: Record req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType versionData: T } & ( @@ -429,6 +467,12 @@ export type CreateArgs = { draft?: boolean locale?: string req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType } @@ -445,6 +489,12 @@ export type UpdateOneArgs = { */ options?: Record req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType } & ( | { @@ -462,12 +512,42 @@ export type UpdateOneArgs = { */ export type UpdateOne = (args: UpdateOneArgs) => Promise +export type UpdateManyArgs = { + collection: CollectionSlug + data: Record + draft?: boolean + joins?: JoinQuery + limit?: number + locale?: string + /** + * Additional database adapter specific options to pass to the query + */ + options?: Record + req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean + select?: SelectType + where: Where +} + +export type UpdateMany = (args: UpdateManyArgs) => Promise + export type UpsertArgs = { collection: CollectionSlug data: Record joins?: JoinQuery locale?: string req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType where: Where } @@ -478,6 +558,12 @@ export type DeleteOneArgs = { collection: CollectionSlug joins?: JoinQuery req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType where: Where } diff --git a/packages/payload/src/exports/shared.ts b/packages/payload/src/exports/shared.ts index afbc060ff8..520f369bae 100644 --- a/packages/payload/src/exports/shared.ts +++ b/packages/payload/src/exports/shared.ts @@ -52,6 +52,7 @@ export { deepCopyObjectSimple, deepCopyObjectSimpleWithoutReactComponents, } from '../utilities/deepCopyObject.js' + export { deepMerge, deepMergeWithCombinedArrays, @@ -60,8 +61,10 @@ export { } from '../utilities/deepMerge.js' export { fieldSchemaToJSON } from '../utilities/fieldSchemaToJSON.js' + export { flattenAllFields } from '../utilities/flattenAllFields.js' export { default as flattenTopLevelFields } from '../utilities/flattenTopLevelFields.js' +export { formatAdminURL } from '../utilities/formatAdminURL.js' export { getDataByPath } from '../utilities/getDataByPath.js' export { getSelectMode } from '../utilities/getSelectMode.js' @@ -87,6 +90,11 @@ export { setsAreEqual } from '../utilities/setsAreEqual.js' export { default as toKebabCase } from '../utilities/toKebabCase.js' +export { + transformColumnsToPreferences, + transformColumnsToSearchParams, +} from '../utilities/transformColumnPreferences.js' + export { unflatten } from '../utilities/unflatten.js' export { validateMimeType } from '../utilities/validateMimeType.js' export { wait } from '../utilities/wait.js' diff --git a/packages/payload/src/fields/config/client.ts b/packages/payload/src/fields/config/client.ts index 48d6be5733..478a282c99 100644 --- a/packages/payload/src/fields/config/client.ts +++ b/packages/payload/src/fields/config/client.ts @@ -126,6 +126,15 @@ export const createClientBlocks = ({ clientBlock.jsx = jsxResolved } + if (block?.admin?.disableBlockName) { + // Check for existing admin object, this way we don't have to spread it in + if (clientBlock.admin) { + clientBlock.admin.disableBlockName = block.admin.disableBlockName + } else { + clientBlock.admin = { disableBlockName: block.admin.disableBlockName } + } + } + if (block.labels) { clientBlock.labels = {} as unknown as LabelsClient diff --git a/packages/payload/src/fields/config/sanitize.spec.ts b/packages/payload/src/fields/config/sanitize.spec.ts index 5bd1ef17a0..3da7508577 100644 --- a/packages/payload/src/fields/config/sanitize.spec.ts +++ b/packages/payload/src/fields/config/sanitize.spec.ts @@ -362,4 +362,71 @@ describe('sanitizeFields', () => { expect(sanitizedFields).toStrictEqual([]) }) }) + describe('blocks', () => { + it('should maintain admin.blockName true after sanitization', async () => { + const fields: Field[] = [ + { + name: 'noLabelBlock', + type: 'blocks', + blocks: [ + { + slug: 'number', + admin: { + disableBlockName: true, + }, + fields: [ + { + name: 'testNumber', + type: 'number', + }, + ], + }, + ], + label: false, + }, + ] + const sanitizedField = ( + await sanitizeFields({ + config, + fields, + validRelationships: [], + }) + )[0] as BlocksField + + const sanitizedBlock = sanitizedField.blocks[0] + + expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(true) + }) + it('should default admin.disableBlockName to true after sanitization', async () => { + const fields: Field[] = [ + { + name: 'noLabelBlock', + type: 'blocks', + blocks: [ + { + slug: 'number', + fields: [ + { + name: 'testNumber', + type: 'number', + }, + ], + }, + ], + label: false, + }, + ] + const sanitizedField = ( + await sanitizeFields({ + config, + fields, + validRelationships: [], + }) + )[0] as BlocksField + + const sanitizedBlock = sanitizedField.blocks[0] + + expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(undefined) + }) + }) }) diff --git a/packages/payload/src/fields/config/sanitize.ts b/packages/payload/src/fields/config/sanitize.ts index 127bb56fe7..254f8e3180 100644 --- a/packages/payload/src/fields/config/sanitize.ts +++ b/packages/payload/src/fields/config/sanitize.ts @@ -79,6 +79,9 @@ export const sanitizeFields = async ({ if ('_sanitized' in field && field._sanitized === true) { continue } + if ('_sanitized' in field) { + field._sanitized = true + } if (!field.type) { throw new MissingFieldType(field) @@ -305,10 +308,6 @@ export const sanitizeFields = async ({ field.admin.disableBulkEdit = true } - if ('_sanitized' in field) { - field._sanitized = true - } - fields[i] = field // Insert our field after assignment diff --git a/packages/payload/src/fields/config/sanitizeJoinField.ts b/packages/payload/src/fields/config/sanitizeJoinField.ts index 84add39a5d..133b244922 100644 --- a/packages/payload/src/fields/config/sanitizeJoinField.ts +++ b/packages/payload/src/fields/config/sanitizeJoinField.ts @@ -139,6 +139,10 @@ export const sanitizeJoinField = ({ throw new InvalidFieldJoin(join.field) } + if (!joinRelationship.index && !joinRelationship.unique) { + joinRelationship.index = true + } + if (validateOnly) { return } diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index c14a96db27..f5c1a8b6de 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -264,12 +264,17 @@ export type Condition = ( siblingData: Partial, { blockData, + path, user, }: { /** * The data of the nearest parent block. If the field is not within a block, `blockData` will be equal to `undefined`. */ blockData: Partial + /** + * The path of the field, e.g. ["group", "myArray", 1, "textField"]. The path is the schemaPath but with indexes and would be used in the context of field data, not field schemas. + */ + path: (number | string)[] user: PayloadRequest['user'] }, ) => boolean @@ -1373,6 +1378,12 @@ export type Block = { } /** Extension point to add your custom data. Available in server and client. */ custom?: Record + /** + * Hides the block name field from the Block's header + * + * @default false + */ + disableBlockName?: boolean group?: Record | string jsx?: PayloadComponent } @@ -1388,6 +1399,9 @@ export type Block = { singularName?: string } imageAltText?: string + /** + * Preferred aspect ratio of the image is 3 : 2 + */ imageURL?: string /** Customize generated GraphQL and Typescript schema names. * The slug is used by default. @@ -1402,7 +1416,7 @@ export type Block = { } export type ClientBlock = { - admin?: Pick + admin?: Pick fields: ClientField[] labels?: LabelsClient } & Pick diff --git a/packages/payload/src/fields/hooks/afterRead/promise.ts b/packages/payload/src/fields/hooks/afterRead/promise.ts index bbc2787ee0..11abfa4398 100644 --- a/packages/payload/src/fields/hooks/afterRead/promise.ts +++ b/packages/payload/src/fields/hooks/afterRead/promise.ts @@ -123,7 +123,7 @@ export const promise = async ({ } // Strip unselected fields - if (fieldAffectsData(field) && select && selectMode) { + if (fieldAffectsData(field) && select && selectMode && path !== 'id') { if (selectMode === 'include') { if (!select[field.name]) { delete siblingDoc[field.name] diff --git a/packages/payload/src/fields/hooks/beforeChange/index.ts b/packages/payload/src/fields/hooks/beforeChange/index.ts index 4631d2b4e1..1571893011 100644 --- a/packages/payload/src/fields/hooks/beforeChange/index.ts +++ b/packages/payload/src/fields/hooks/beforeChange/index.ts @@ -54,6 +54,7 @@ export const beforeChange = async ({ doc, docWithLocales, errors, + fieldLabelPath: '', fields: collection?.fields || global?.fields, global, mergeLocaleActions, diff --git a/packages/payload/src/fields/hooks/beforeChange/promise.ts b/packages/payload/src/fields/hooks/beforeChange/promise.ts index 6dafbd0141..401274f2c1 100644 --- a/packages/payload/src/fields/hooks/beforeChange/promise.ts +++ b/packages/payload/src/fields/hooks/beforeChange/promise.ts @@ -9,13 +9,19 @@ import type { Block, Field, TabAsField, Validate } from '../../config/types.js' import { MissingEditorProp } from '../../../errors/index.js' import { deepMergeWithSourceArrays } from '../../../utilities/deepMerge.js' -import { getLabelFromPath } from '../../../utilities/getLabelFromPath.js' import { getTranslatedLabel } from '../../../utilities/getTranslatedLabel.js' import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../../config/types.js' import { getFieldPathsModified as getFieldPaths } from '../../getFieldPaths.js' import { getExistingRowDoc } from './getExistingRowDoc.js' import { traverseFields } from './traverseFields.js' +function buildFieldLabel(parentLabel: string, label: string): string { + const capitalizedLabel = label.charAt(0).toUpperCase() + label.slice(1) + return parentLabel && capitalizedLabel + ? `${parentLabel} > ${capitalizedLabel}` + : capitalizedLabel || parentLabel +} + type Args = { /** * Data of the nearest parent block. If no parent block exists, this will be the `undefined` @@ -29,6 +35,12 @@ type Args = { errors: ValidationFieldError[] field: Field | TabAsField fieldIndex: number + /** + * Built up labels of parent fields + * + * @example "Group Field > Tab Field > Text Field" + */ + fieldLabelPath: string global: null | SanitizedGlobalConfig id?: number | string mergeLocaleActions: (() => Promise | void)[] @@ -64,6 +76,7 @@ export const promise = async ({ errors, field, fieldIndex, + fieldLabelPath, global, mergeLocaleActions, operation, @@ -86,10 +99,6 @@ export const promise = async ({ parentSchemaPath, }) - const passesCondition = field.admin?.condition - ? Boolean(field.admin.condition(data, siblingData, { blockData, user: req.user })) - : true - let skipValidationFromHere = skipValidation || !passesCondition const { localization } = req.payload.config const defaultLocale = localization ? localization?.defaultLocale : 'en' const operationLocale = req.locale || defaultLocale @@ -98,6 +107,13 @@ export const promise = async ({ const schemaPathSegments = schemaPath ? schemaPath.split('.') : [] const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : [] + const passesCondition = field.admin?.condition + ? Boolean( + field.admin.condition(data, siblingData, { blockData, path: pathSegments, user: req.user }), + ) + : true + let skipValidationFromHere = skipValidation || !passesCondition + if (fieldAffectsData(field)) { // skip validation if the field is localized and the incoming data is null if (fieldShouldBeLocalized({ field, parentIsLocalized }) && operationLocale !== defaultLocale) { @@ -172,13 +188,10 @@ export const promise = async ({ }) if (typeof validationResult === 'string') { - const label = getTranslatedLabel(field?.label || field?.name, req.i18n) - const parentPathSegments = parentPath ? parentPath.split('.') : [] - - const fieldLabel = - Array.isArray(parentPathSegments) && parentPathSegments.length > 0 - ? getLabelFromPath(parentPathSegments.concat(label)) - : label + const fieldLabel = buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.name, req.i18n), + ) errors.push({ label: fieldLabel, @@ -231,6 +244,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + `${getTranslatedLabel(field?.label || field?.name, req.i18n)} ${rowIndex + 1}`, + ), fields: field.fields, global, mergeLocaleActions, @@ -289,6 +309,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + `${getTranslatedLabel(field?.label || field?.name, req.i18n)} ${rowIndex + 1}`, + ), fields: block.fields, global, mergeLocaleActions, @@ -324,6 +351,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field.type === 'row' || field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.type, req.i18n), + ), fields: field.fields, global, mergeLocaleActions, @@ -364,6 +398,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.name, req.i18n), + ), fields: field.fields, global, mergeLocaleActions, @@ -421,6 +462,13 @@ export const promise = async ({ docWithLocales, errors, field, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.name, req.i18n), + ), global, indexPath: indexPathSegments, mergeLocaleActions, @@ -481,6 +529,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.name, req.i18n), + ), fields: field.fields, global, mergeLocaleActions, @@ -509,6 +564,10 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel(fieldLabelPath, getTranslatedLabel(field?.label || '', req.i18n)), fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), global, mergeLocaleActions, diff --git a/packages/payload/src/fields/hooks/beforeChange/traverseFields.ts b/packages/payload/src/fields/hooks/beforeChange/traverseFields.ts index 84c9eabf9a..e5f3ac316c 100644 --- a/packages/payload/src/fields/hooks/beforeChange/traverseFields.ts +++ b/packages/payload/src/fields/hooks/beforeChange/traverseFields.ts @@ -25,6 +25,12 @@ type Args = { */ docWithLocales: JsonObject errors: ValidationFieldError[] + /** + * Built up labels of parent fields + * + * @example "Group Field > Tab Field > Text Field" + */ + fieldLabelPath: string fields: (Field | TabAsField)[] global: null | SanitizedGlobalConfig id?: number | string @@ -67,6 +73,7 @@ export const traverseFields = async ({ doc, docWithLocales, errors, + fieldLabelPath, fields, global, mergeLocaleActions, @@ -96,6 +103,7 @@ export const traverseFields = async ({ errors, field, fieldIndex, + fieldLabelPath, global, mergeLocaleActions, operation, diff --git a/packages/payload/src/fields/hooks/beforeValidate/getFallbackValue.ts b/packages/payload/src/fields/hooks/beforeValidate/getFallbackValue.ts new file mode 100644 index 0000000000..7c83848f9b --- /dev/null +++ b/packages/payload/src/fields/hooks/beforeValidate/getFallbackValue.ts @@ -0,0 +1,31 @@ +import type { JsonObject, JsonValue, PayloadRequest } from '../../../types/index.js' +import type { FieldAffectingData } from '../../config/types.js' + +import { getDefaultValue } from '../../getDefaultValue.js' +import { cloneDataFromOriginalDoc } from '../beforeChange/cloneDataFromOriginalDoc.js' + +export async function getFallbackValue({ + field, + req, + siblingDoc, +}: { + field: FieldAffectingData + req: PayloadRequest + siblingDoc: JsonObject +}): Promise { + let fallbackValue = undefined + if ('name' in field && field.name) { + if (typeof siblingDoc[field.name] !== 'undefined') { + fallbackValue = cloneDataFromOriginalDoc(siblingDoc[field.name]) + } else if ('defaultValue' in field && typeof field.defaultValue !== 'undefined') { + fallbackValue = await getDefaultValue({ + defaultValue: field.defaultValue, + locale: req.locale || '', + req, + user: req.user, + }) + } + } + + return fallbackValue +} diff --git a/packages/payload/src/fields/hooks/beforeValidate/promise.ts b/packages/payload/src/fields/hooks/beforeValidate/promise.ts index 59ba4a8a70..2cda4e9b38 100644 --- a/packages/payload/src/fields/hooks/beforeValidate/promise.ts +++ b/packages/payload/src/fields/hooks/beforeValidate/promise.ts @@ -8,10 +8,9 @@ import type { Block, Field, TabAsField } from '../../config/types.js' import { MissingEditorProp } from '../../../errors/index.js' import { fieldAffectsData, tabHasName, valueIsValueWithRelation } from '../../config/types.js' -import { getDefaultValue } from '../../getDefaultValue.js' import { getFieldPathsModified as getFieldPaths } from '../../getFieldPaths.js' -import { cloneDataFromOriginalDoc } from '../beforeChange/cloneDataFromOriginalDoc.js' import { getExistingRowDoc } from '../beforeChange/getExistingRowDoc.js' +import { getFallbackValue } from './getFallbackValue.js' import { traverseFields } from './traverseFields.js' type Args = { @@ -274,6 +273,17 @@ export const promise = async ({ } } + // ensure the fallback value is only computed one time + // either here or when access control returns false + const fallbackResult = { + executed: false, + value: undefined, + } + if (typeof siblingData[field.name] === 'undefined') { + fallbackResult.value = await getFallbackValue({ field, req, siblingDoc }) + fallbackResult.executed = true + } + // Execute hooks if (field.hooks?.beforeValidate) { for (const hook of field.hooks.beforeValidate) { @@ -295,7 +305,10 @@ export const promise = async ({ schemaPath: schemaPathSegments, siblingData, siblingFields, - value: siblingData[field.name], + value: + typeof siblingData[field.name] === 'undefined' + ? fallbackResult.value + : siblingData[field.name], }) if (hookedValue !== undefined) { @@ -316,20 +329,9 @@ export const promise = async ({ } if (typeof siblingData[field.name] === 'undefined') { - // If no incoming data, but existing document data is found, merge it in - if (typeof siblingDoc[field.name] !== 'undefined') { - siblingData[field.name] = cloneDataFromOriginalDoc(siblingDoc[field.name]) - - // Otherwise compute default value - } else if (typeof field.defaultValue !== 'undefined') { - siblingData[field.name] = await getDefaultValue({ - defaultValue: field.defaultValue, - locale: req.locale, - req, - user: req.user, - value: siblingData[field.name], - }) - } + siblingData[field.name] = !fallbackResult.executed + ? await getFallbackValue({ field, req, siblingDoc }) + : fallbackResult.value } } diff --git a/packages/payload/src/globals/config/sanitize.ts b/packages/payload/src/globals/config/sanitize.ts index 289b2ae58b..dccd0f733b 100644 --- a/packages/payload/src/globals/config/sanitize.ts +++ b/packages/payload/src/globals/config/sanitize.ts @@ -22,7 +22,10 @@ export const sanitizeGlobal = async ( richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise>, _validRelationships?: string[], ): Promise => { - const { collections } = config + if (global._sanitized) { + return global as SanitizedGlobalConfig + } + global._sanitized = true global.label = global.label || toWords(global.slug) diff --git a/packages/payload/src/globals/config/types.ts b/packages/payload/src/globals/config/types.ts index 7b8b071a38..ba36e7cf8f 100644 --- a/packages/payload/src/globals/config/types.ts +++ b/packages/payload/src/globals/config/types.ts @@ -143,6 +143,11 @@ export type GlobalAdminOptions = { } export type GlobalConfig = { + /** + * Do not set this property manually. This is set to true during sanitization, to avoid + * sanitizing the same global multiple times. + */ + _sanitized?: boolean access?: { read?: Access readDrafts?: Access diff --git a/packages/payload/src/globals/operations/findOne.ts b/packages/payload/src/globals/operations/findOne.ts index 48c989e977..c721d4f87d 100644 --- a/packages/payload/src/globals/operations/findOne.ts +++ b/packages/payload/src/globals/operations/findOne.ts @@ -5,6 +5,7 @@ import type { SanitizedGlobalConfig } from '../config/types.js' import executeAccess from '../../auth/executeAccess.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' +import { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js' import { getSelectMode } from '../../utilities/getSelectMode.js' import { killTransaction } from '../../utilities/killTransaction.js' import replaceWithDraftIfAvailable from '../../versions/drafts/replaceWithDraftIfAvailable.js' @@ -80,7 +81,7 @@ export const findOneOperation = async >( const lockDurationInMilliseconds = lockDuration * 1000 const lockedDocument = await req.payload.find({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, depth: 1, limit: 1, overrideAccess: false, diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index d955eab676..349befae35 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -1058,6 +1058,8 @@ export type { TypeWithID, TypeWithTimestamps, } from './collections/config/types.js' +export type { CompoundIndex } from './collections/config/types.js' +export type { SanitizedCompoundIndex } from './collections/config/types.js' export { createDataloaderCacheKey, getDataLoader } from './collections/dataloader.js' export { countOperation } from './collections/operations/count.js' export { createOperation } from './collections/operations/create.js' @@ -1072,6 +1074,7 @@ export { findVersionsOperation } from './collections/operations/findVersions.js' export { restoreVersionOperation } from './collections/operations/restoreVersion.js' export { updateOperation } from './collections/operations/update.js' export { updateByIDOperation } from './collections/operations/updateByID.js' + export { buildConfig } from './config/build.js' export { type ClientConfig, @@ -1080,7 +1083,6 @@ export { serverOnlyConfigProperties, type UnsanitizedClientConfig, } from './config/client.js' - export { defaults } from './config/defaults.js' export { sanitizeConfig } from './config/sanitize.js' export type * from './config/types.js' @@ -1112,6 +1114,7 @@ export type { Connect, Count, CountArgs, + CountGlobalVersionArgs, CountGlobalVersions, CountVersions, Create, @@ -1156,6 +1159,8 @@ export type { UpdateGlobalArgs, UpdateGlobalVersion, UpdateGlobalVersionArgs, + UpdateMany, + UpdateManyArgs, UpdateOne, UpdateOneArgs, UpdateVersion, @@ -1190,10 +1195,11 @@ export { ValidationError, ValidationErrorName, } from './errors/index.js' + export type { ValidationFieldError } from './errors/index.js' export { baseBlockFields } from './fields/baseFields/baseBlockFields.js' - export { baseIDField } from './fields/baseFields/baseIDField.js' + export { createClientField, createClientFields, @@ -1305,12 +1311,12 @@ export type { ValueWithRelation, } from './fields/config/types.js' export { getDefaultValue } from './fields/getDefaultValue.js' - export { traverseFields as afterChangeTraverseFields } from './fields/hooks/afterChange/traverseFields.js' export { promise as afterReadPromise } from './fields/hooks/afterRead/promise.js' export { traverseFields as afterReadTraverseFields } from './fields/hooks/afterRead/traverseFields.js' export { traverseFields as beforeChangeTraverseFields } from './fields/hooks/beforeChange/traverseFields.js' export { traverseFields as beforeValidateTraverseFields } from './fields/hooks/beforeValidate/traverseFields.js' + export { default as sortableFieldTypes } from './fields/sortableFieldTypes.js' export { validations } from './fields/validations.js' @@ -1345,6 +1351,7 @@ export type { UploadFieldValidation, UsernameFieldValidation, } from './fields/validations.js' + export { type ClientGlobalConfig, createClientGlobalConfig, @@ -1364,9 +1371,7 @@ export type { GlobalConfig, SanitizedGlobalConfig, } from './globals/config/types.js' - export { docAccessOperation as docAccessOperationGlobal } from './globals/operations/docAccess.js' - export { findOneOperation } from './globals/operations/findOne.js' export { findVersionByIDOperation as findVersionByIDOperationGlobal } from './globals/operations/findVersionByID.js' export { findVersionsOperation as findVersionsOperationGlobal } from './globals/operations/findVersions.js' @@ -1374,6 +1379,7 @@ export { restoreVersionOperation as restoreVersionOperationGlobal } from './glob export { updateOperation as updateOperationGlobal } from './globals/operations/update.js' export type { CollapsedPreferences, + ColumnPreference, DocumentPreferences, FieldsPreferences, InsideFieldsPreferences, @@ -1410,8 +1416,8 @@ export { importHandlerPath } from './queues/operations/runJobs/runJob/importHand export { getLocalI18n } from './translations/getLocalI18n.js' export * from './types/index.js' export { getFileByPath } from './uploads/getFileByPath.js' -export type * from './uploads/types.js' +export type * from './uploads/types.js' export { addDataAndFileToRequest } from './utilities/addDataAndFileToRequest.js' export { addLocalesToRequestFromData, sanitizeLocales } from './utilities/addLocalesToRequest.js' export { commitTransaction } from './utilities/commitTransaction.js' @@ -1474,6 +1480,7 @@ export { traverseFields } from './utilities/traverseFields.js' export type { TraverseFieldsCallback } from './utilities/traverseFields.js' export { buildVersionCollectionFields } from './versions/buildCollectionFields.js' export { buildVersionGlobalFields } from './versions/buildGlobalFields.js' +export { buildVersionCompoundIndexes } from './versions/buildVersionCompoundIndexes.js' export { versionDefaults } from './versions/defaults.js' export { deleteCollectionVersions } from './versions/deleteCollectionVersions.js' export { enforceMaxVersions } from './versions/enforceMaxVersions.js' diff --git a/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts b/packages/payload/src/locked-documents/config.ts similarity index 88% rename from packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts rename to packages/payload/src/locked-documents/config.ts index 59fa37f916..b450b72a8e 100644 --- a/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts +++ b/packages/payload/src/locked-documents/config.ts @@ -2,8 +2,10 @@ import type { CollectionConfig } from '../collections/config/types.js' import type { Config } from '../config/types.js' +export const lockedDocumentsCollectionSlug = 'payload-locked-documents' + export const getLockedDocumentsCollection = (config: Config): CollectionConfig => ({ - slug: 'payload-locked-documents', + slug: lockedDocumentsCollectionSlug, admin: { hidden: true, }, diff --git a/packages/payload/src/preferences/preferencesCollection.ts b/packages/payload/src/preferences/config.ts similarity index 91% rename from packages/payload/src/preferences/preferencesCollection.ts rename to packages/payload/src/preferences/config.ts index c6b0d4d5c0..cb4cdb06b6 100644 --- a/packages/payload/src/preferences/preferencesCollection.ts +++ b/packages/payload/src/preferences/config.ts @@ -18,8 +18,10 @@ const preferenceAccess: Access = ({ req }) => { } } -const getPreferencesCollection = (config: Config): CollectionConfig => ({ - slug: 'payload-preferences', +export const preferencesCollectionSlug = 'payload-preferences' + +export const getPreferencesCollection = (config: Config): CollectionConfig => ({ + slug: preferencesCollectionSlug, access: { delete: preferenceAccess, read: preferenceAccess, @@ -91,5 +93,3 @@ const getPreferencesCollection = (config: Config): CollectionConfig => ({ ], lockDocuments: false, }) - -export default getPreferencesCollection diff --git a/packages/payload/src/preferences/deleteUserPreferences.ts b/packages/payload/src/preferences/deleteUserPreferences.ts index b1a5f6f0e2..8676f6492b 100644 --- a/packages/payload/src/preferences/deleteUserPreferences.ts +++ b/packages/payload/src/preferences/deleteUserPreferences.ts @@ -2,6 +2,8 @@ import type { SanitizedCollectionConfig } from '../collections/config/types.js' import type { Payload } from '../index.js' import type { PayloadRequest } from '../types/index.js' +import { preferencesCollectionSlug } from './config.js' + type Args = { collectionConfig: SanitizedCollectionConfig /** @@ -14,7 +16,7 @@ type Args = { export const deleteUserPreferences = async ({ collectionConfig, ids, payload, req }: Args) => { if (collectionConfig.auth) { await payload.db.deleteMany({ - collection: 'payload-preferences', + collection: preferencesCollectionSlug, req, where: { or: [ @@ -36,7 +38,7 @@ export const deleteUserPreferences = async ({ collectionConfig, ids, payload, re }) } else { await payload.db.deleteMany({ - collection: 'payload-preferences', + collection: preferencesCollectionSlug, req, where: { key: { in: ids.map((id) => `collection-${collectionConfig.slug}-${id}`) }, diff --git a/packages/payload/src/preferences/operations/delete.ts b/packages/payload/src/preferences/operations/delete.ts index da55d20b09..c52814be8f 100644 --- a/packages/payload/src/preferences/operations/delete.ts +++ b/packages/payload/src/preferences/operations/delete.ts @@ -3,6 +3,7 @@ import type { PreferenceRequest } from '../types.js' import { NotFound } from '../../errors/NotFound.js' import { UnauthorizedError } from '../../errors/UnauthorizedError.js' +import { preferencesCollectionSlug } from '../config.js' export async function deleteOperation(args: PreferenceRequest): Promise { const { @@ -25,7 +26,7 @@ export async function deleteOperation(args: PreferenceRequest): Promise { const { key, @@ -24,7 +26,7 @@ export async function findOne(args: PreferenceRequest): Promise CollectionConfig | null = (config) => { - if (!Array.isArray(config?.jobs?.workflows)) { - return null - } +export const jobsCollectionSlug = 'payload-jobs' +export const getDefaultJobsCollection: (config: Config) => CollectionConfig | null = (config) => { const workflowSlugs: Set = new Set() const taskSlugs: Set = new Set(['inline']) - if (config.jobs?.workflows.length) { + if (config.jobs?.workflows?.length) { config.jobs?.workflows.forEach((workflow) => { workflowSlugs.add(workflow.slug) }) } - if (config.jobs?.tasks.length) { + if (config.jobs?.tasks?.length) { config.jobs.tasks.forEach((task) => { if (workflowSlugs.has(task.slug)) { throw new Error( @@ -95,7 +93,7 @@ export const getDefaultJobsCollection: (config: Config) => CollectionConfig | nu } const jobsCollection: CollectionConfig = { - slug: 'payload-jobs', + slug: jobsCollectionSlug, admin: { group: 'System', hidden: true, @@ -221,6 +219,21 @@ export const getDefaultJobsCollection: (config: Config) => CollectionConfig | nu return doc }, ], + /** + * If another update comes in after a job as already been cancelled, we need to make sure that update doesn't + * change the state of the job. + */ + beforeChange: [ + ({ data, originalDoc }) => { + if (originalDoc?.error?.cancelled) { + data.processing = false + data.hasError = true + delete data.completedAt + delete data.waitUntil + } + return data + }, + ], }, lockDocuments: false, } diff --git a/packages/payload/src/queues/config/types/taskTypes.ts b/packages/payload/src/queues/config/types/taskTypes.ts index e225bc8bcb..0a698905a0 100644 --- a/packages/payload/src/queues/config/types/taskTypes.ts +++ b/packages/payload/src/queues/config/types/taskTypes.ts @@ -7,14 +7,19 @@ export type TaskInputOutput = { } export type TaskHandlerResult< TTaskSlugOrInputOutput extends keyof TypedJobs['tasks'] | TaskInputOutput, -> = { - output: TTaskSlugOrInputOutput extends keyof TypedJobs['tasks'] - ? TypedJobs['tasks'][TTaskSlugOrInputOutput]['output'] - : TTaskSlugOrInputOutput extends TaskInputOutput // Check if it's actually TaskInputOutput type - ? TTaskSlugOrInputOutput['output'] - : never - state?: 'failed' | 'succeeded' -} +> = + | { + errorMessage?: string + state: 'failed' + } + | { + output: TTaskSlugOrInputOutput extends keyof TypedJobs['tasks'] + ? TypedJobs['tasks'][TTaskSlugOrInputOutput]['output'] + : TTaskSlugOrInputOutput extends TaskInputOutput // Check if it's actually TaskInputOutput type + ? TTaskSlugOrInputOutput['output'] + : never + state?: 'succeeded' + } export type TaskHandlerArgs< TTaskSlugOrInputOutput extends keyof TypedJobs['tasks'] | TaskInputOutput, @@ -84,6 +89,8 @@ export type RunTaskFunctions = { [TTaskSlug in keyof TypedJobs['tasks']]: RunTaskFunction } +type MaybePromise = Promise | T + export type RunInlineTaskFunction = ( taskID: string, taskArgs: { @@ -103,12 +110,16 @@ export type RunInlineTaskFunction = req: PayloadRequest tasks: RunTaskFunctions - }) => + }) => MaybePromise< + | { + errorMessage?: string + state: 'failed' + } | { output: TTaskOutput - state?: 'failed' | 'succeeded' + state?: 'succeeded' } - | Promise<{ output: TTaskOutput; state?: 'failed' | 'succeeded' }> + > }, ) => Promise diff --git a/packages/payload/src/queues/localAPI.ts b/packages/payload/src/queues/localAPI.ts index 6ef1d9cab1..d2cb3c55bd 100644 --- a/packages/payload/src/queues/localAPI.ts +++ b/packages/payload/src/queues/localAPI.ts @@ -1,4 +1,3 @@ -// @ts-strict-ignore import type { BaseJob, RunningJobFromTask } from './config/types/workflowTypes.js' import { @@ -9,6 +8,7 @@ import { type TypedJobs, type Where, } from '../index.js' +import { jobsCollectionSlug } from './config/index.js' import { runJobs } from './operations/runJobs/index.js' export const getJobsLocalAPI = (payload: Payload) => ({ @@ -41,7 +41,7 @@ export const getJobsLocalAPI = (payload: Payload) => ({ ? RunningJob : RunningJobFromTask > => { - let queue: string + let queue: string | undefined = undefined // If user specifies queue, use that if (args.queue) { @@ -55,15 +55,26 @@ export const getJobsLocalAPI = (payload: Payload) => ({ } } + const data: Partial = { + input: args.input, + } + + if (queue) { + data.queue = queue + } + if (args.waitUntil) { + data.waitUntil = args.waitUntil?.toISOString() + } + if (args.workflow) { + data.workflowSlug = args.workflow as string + } + if (args.task) { + data.taskSlug = args.task as string + } + return (await payload.create({ - collection: 'payload-jobs', - data: { - input: args.input, - queue, - taskSlug: 'task' in args ? args.task : undefined, - waitUntil: args.waitUntil?.toISOString() ?? undefined, - workflowSlug: 'workflow' in args ? args.workflow : undefined, - } as BaseJob, + collection: jobsCollectionSlug, + data, req: args.req, })) as TTaskOrWorkflowSlug extends keyof TypedJobs['workflows'] ? RunningJob @@ -78,14 +89,14 @@ export const getJobsLocalAPI = (payload: Payload) => ({ where?: Where }): Promise> => { const newReq: PayloadRequest = args?.req ?? (await createLocalReq({}, payload)) - const result = await runJobs({ + + return await runJobs({ limit: args?.limit, overrideAccess: args?.overrideAccess !== false, queue: args?.queue, req: newReq, where: args?.where, }) - return result }, runByID: async (args: { @@ -93,12 +104,89 @@ export const getJobsLocalAPI = (payload: Payload) => ({ overrideAccess?: boolean req?: PayloadRequest }): Promise> => { - const newReq: PayloadRequest = args?.req ?? (await createLocalReq({}, payload)) - const result = await runJobs({ + const newReq: PayloadRequest = args.req ?? (await createLocalReq({}, payload)) + + return await runJobs({ id: args.id, - overrideAccess: args?.overrideAccess !== false, + overrideAccess: args.overrideAccess !== false, + req: newReq, + }) + }, + + cancel: async (args: { + overrideAccess?: boolean + queue?: string + req?: PayloadRequest + where: Where + }): Promise => { + const newReq: PayloadRequest = args.req ?? (await createLocalReq({}, payload)) + + const and: Where[] = [ + args.where, + { + completedAt: { + exists: false, + }, + }, + { + hasError: { + not_equals: true, + }, + }, + ] + + if (args.queue) { + and.push({ + queue: { + equals: args.queue, + }, + }) + } + + await payload.db.updateMany({ + collection: jobsCollectionSlug, + data: { + completedAt: null, + error: { + cancelled: true, + }, + hasError: true, + processing: false, + waitUntil: null, + } as Partial< + { + completedAt: null + waitUntil: null + } & BaseJob + >, + req: newReq, + where: { and }, + }) + }, + + cancelByID: async (args: { + id: number | string + overrideAccess?: boolean + req?: PayloadRequest + }): Promise => { + const newReq: PayloadRequest = args.req ?? (await createLocalReq({}, payload)) + + await payload.db.updateOne({ + id: args.id, + collection: jobsCollectionSlug, + data: { + completedAt: null, + error: { + cancelled: true, + }, + hasError: true, + processing: false, + waitUntil: null, + } as { + completedAt: null + waitUntil: null + } & BaseJob, req: newReq, }) - return result }, }) diff --git a/packages/payload/src/queues/operations/runJobs/index.ts b/packages/payload/src/queues/operations/runJobs/index.ts index 9c67a0444b..e474401b6c 100644 --- a/packages/payload/src/queues/operations/runJobs/index.ts +++ b/packages/payload/src/queues/operations/runJobs/index.ts @@ -12,6 +12,7 @@ import type { RunJobResult } from './runJob/index.js' import { Forbidden } from '../../../errors/Forbidden.js' import isolateObjectProperty from '../../../utilities/isolateObjectProperty.js' +import { jobsCollectionSlug } from '../../config/index.js' import { getUpdateJobFunction } from './runJob/getUpdateJobFunction.js' import { importHandlerPath } from './runJob/importHandlerPath.js' import { runJob } from './runJob/index.js' @@ -110,7 +111,7 @@ export const runJobs = async ({ docs: [ (await req.payload.update({ id, - collection: 'payload-jobs', + collection: jobsCollectionSlug, data: { processing: true, seenByWorker: true, @@ -122,7 +123,7 @@ export const runJobs = async ({ ], } : ((await req.payload.update({ - collection: 'payload-jobs', + collection: jobsCollectionSlug, data: { processing: true, seenByWorker: true, @@ -253,7 +254,7 @@ export const runJobs = async ({ if (jobsToDelete && jobsToDelete.length > 0) { try { await req.payload.delete({ - collection: 'payload-jobs', + collection: jobsCollectionSlug, req, where: { id: { in: jobsToDelete } }, }) diff --git a/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts b/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts index f2b9f6ad39..eb4be61d77 100644 --- a/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts +++ b/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts @@ -48,9 +48,9 @@ export async function handleTaskFailed({ parent, req, retriesConfig, - runnerOutput, state, taskConfig, + taskHandlerResult, taskID, taskSlug, taskStatus, @@ -65,9 +65,9 @@ export async function handleTaskFailed({ parent?: TaskParent req: PayloadRequest retriesConfig: number | RetryConfig - runnerOutput?: TaskHandlerResult state: RunTaskFunctionState taskConfig?: TaskConfig + taskHandlerResult?: TaskHandlerResult taskID: string taskSlug: string taskStatus: null | SingleTaskStatus @@ -88,7 +88,12 @@ export async function handleTaskFailed({ message: error.message, stack: error.stack, } - : runnerOutput.state + : { + message: + taskHandlerResult.state === 'failed' + ? (taskHandlerResult.errorMessage ?? taskHandlerResult.state) + : 'failed', + } job.log.push({ completedAt: new Date().toISOString(), @@ -259,11 +264,9 @@ export const getRunTaskFunction = ( processing: false, }) - return + throw new Error(errorMessage) } - let output: object = {} - let maxRetries: number | undefined = finalRetriesConfig?.attempts if (maxRetries === undefined || maxRetries === null) { @@ -278,8 +281,11 @@ export const getRunTaskFunction = ( } } + let taskHandlerResult: TaskHandlerResult + let output: object = {} + try { - const runnerOutput = await runner({ + taskHandlerResult = await runner({ inlineTask: getRunTaskFunction(state, job, workflowConfig, req, true, updateJob, { taskID, taskSlug, @@ -292,29 +298,6 @@ export const getRunTaskFunction = ( taskSlug, }), }) - - if (runnerOutput.state === 'failed') { - await handleTaskFailed({ - executedAt, - input, - job, - maxRetries, - output, - parent, - req, - retriesConfig: finalRetriesConfig, - runnerOutput, - state, - taskConfig, - taskID, - taskSlug, - taskStatus, - updateJob, - }) - throw new Error('Task failed') - } else { - output = runnerOutput.output - } } catch (err) { await handleTaskFailed({ error: err, @@ -336,6 +319,29 @@ export const getRunTaskFunction = ( throw new Error('Task failed') } + if (taskHandlerResult.state === 'failed') { + await handleTaskFailed({ + executedAt, + input, + job, + maxRetries, + output, + parent, + req, + retriesConfig: finalRetriesConfig, + state, + taskConfig, + taskHandlerResult, + taskID, + taskSlug, + taskStatus, + updateJob, + }) + throw new Error('Task failed') + } else { + output = taskHandlerResult.output + } + if (taskConfig?.onSuccess) { await taskConfig.onSuccess() } diff --git a/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts b/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts index 9bfa8f71e2..5967792ec2 100644 --- a/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts +++ b/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts @@ -2,13 +2,15 @@ import type { PayloadRequest } from '../../../../types/index.js' import type { BaseJob } from '../../../config/types/workflowTypes.js' +import { jobsCollectionSlug } from '../../../config/index.js' + export type UpdateJobFunction = (jobData: Partial) => Promise export function getUpdateJobFunction(job: BaseJob, req: PayloadRequest): UpdateJobFunction { return async (jobData) => { const updatedJob = (await req.payload.update({ id: job.id, - collection: 'payload-jobs', + collection: jobsCollectionSlug, data: jobData, depth: 0, disableTransaction: true, @@ -19,6 +21,10 @@ export function getUpdateJobFunction(job: BaseJob, req: PayloadRequest): UpdateJ job[key] = updatedJob[key] } + if ((updatedJob.error as any)?.cancelled) { + throw new Error('Job cancelled') + } + return updatedJob } } diff --git a/packages/payload/src/types/index.ts b/packages/payload/src/types/index.ts index 185962d6a9..b1793e9c5d 100644 --- a/packages/payload/src/types/index.ts +++ b/packages/payload/src/types/index.ts @@ -90,6 +90,10 @@ type PayloadRequestData = { data?: JsonObject /** The file on the request, same rules apply as the `data` property */ file?: { + /** + * Context of the file when it was uploaded via client side. + */ + clientUploadContext?: unknown data: Buffer mimetype: string name: string @@ -145,6 +149,7 @@ export type JoinQuery = | Partial<{ [K in keyof TypedCollectionJoins[TSlug]]: | { + count?: boolean limit?: number page?: number sort?: string diff --git a/packages/payload/src/uploads/canResizeImage.ts b/packages/payload/src/uploads/canResizeImage.ts index 15f4c63b1f..b3df32d1b3 100644 --- a/packages/payload/src/uploads/canResizeImage.ts +++ b/packages/payload/src/uploads/canResizeImage.ts @@ -1,3 +1,7 @@ export function canResizeImage(mimeType: string): boolean { - return ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/tiff'].indexOf(mimeType) > -1 + return ( + ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/tiff', 'image/avif'].indexOf( + mimeType, + ) > -1 + ) } diff --git a/packages/payload/src/uploads/types.ts b/packages/payload/src/uploads/types.ts index cf24da507b..da29c9dd08 100644 --- a/packages/payload/src/uploads/types.ts +++ b/packages/payload/src/uploads/types.ts @@ -178,7 +178,7 @@ export type UploadConfig = { req: PayloadRequest, args: { doc: TypeWithID - params: { collection: string; filename: string } + params: { clientUploadContext?: unknown; collection: string; filename: string } }, ) => Promise | Promise | Response | void)[] /** diff --git a/packages/payload/src/utilities/addDataAndFileToRequest.ts b/packages/payload/src/utilities/addDataAndFileToRequest.ts index 3fff110a57..4e24fe4ee4 100644 --- a/packages/payload/src/utilities/addDataAndFileToRequest.ts +++ b/packages/payload/src/utilities/addDataAndFileToRequest.ts @@ -19,7 +19,8 @@ export const addDataAndFileToRequest: AddDataAndFileToRequest = async (req) => { if (contentType === 'application/json') { let data = {} try { - data = await req.json() + const text = await req.text() + data = text ? JSON.parse(text) : {} } catch (error) { req.payload.logger.error(error) } finally { @@ -43,6 +44,55 @@ export const addDataAndFileToRequest: AddDataAndFileToRequest = async (req) => { if (fields?._payload && typeof fields._payload === 'string') { req.data = JSON.parse(fields._payload) } + + if (!req.file && fields?.file && typeof fields?.file === 'string') { + const { clientUploadContext, collectionSlug, filename, mimeType, size } = JSON.parse( + fields.file, + ) + const uploadConfig = req.payload.collections[collectionSlug].config.upload + + if (!uploadConfig.handlers) { + throw new APIError('uploadConfig.handlers is not present for ' + collectionSlug) + } + + let response: null | Response = null + let error: unknown + + for (const handler of uploadConfig.handlers) { + try { + const result = await handler(req, { + doc: null, + params: { + clientUploadContext, // Pass additional specific to adapters context returned from UploadHandler, then staticHandler can use them. + collection: collectionSlug, + filename, + }, + }) + if (result) { + response = result + } + // If we couldn't get the file from that handler, save the error and try other. + } catch (err) { + error = err + } + } + + if (!response) { + if (error) { + payload.logger.error(error) + } + + throw new APIError('Expected response from the upload handler.') + } + + req.file = { + name: filename, + clientUploadContext, + data: Buffer.from(await response.arrayBuffer()), + mimetype: response.headers.get('Content-Type') || mimeType, + size, + } + } } } } diff --git a/packages/payload/src/utilities/checkDocumentLockStatus.ts b/packages/payload/src/utilities/checkDocumentLockStatus.ts index 87accb2f54..a8c334bb30 100644 --- a/packages/payload/src/utilities/checkDocumentLockStatus.ts +++ b/packages/payload/src/utilities/checkDocumentLockStatus.ts @@ -3,6 +3,7 @@ import type { PaginatedDocs } from '../database/types.js' import type { JsonObject, PayloadRequest } from '../types/index.js' import { Locked } from '../errors/index.js' +import { lockedDocumentsCollectionSlug } from '../locked-documents/config.js' type CheckDocumentLockStatusArgs = { collectionSlug?: string @@ -60,7 +61,7 @@ export const checkDocumentLockStatus = async ({ const finalLockErrorMessage = lockErrorMessage || defaultLockErrorMessage const lockedDocumentResult: PaginatedDocs = await payload.db.find({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, limit: 1, pagination: false, sort: '-updatedAt', @@ -91,7 +92,7 @@ export const checkDocumentLockStatus = async ({ // Perform the delete operation regardless of overrideLock status await payload.db.deleteMany({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, // Not passing req fails on postgres req: payload.db.name === 'mongoose' ? undefined : req, where: lockedDocumentQuery, diff --git a/packages/payload/src/utilities/configToJSONSchema.spec.ts b/packages/payload/src/utilities/configToJSONSchema.spec.ts index e456c68cc1..3bb159559f 100644 --- a/packages/payload/src/utilities/configToJSONSchema.spec.ts +++ b/packages/payload/src/utilities/configToJSONSchema.spec.ts @@ -4,6 +4,7 @@ import type { Config } from '../config/types.js' import { sanitizeConfig } from '../config/sanitize.js' import { configToJSONSchema } from './configToJSONSchema.js' +import type { Block, BlocksField, RichTextField } from '../fields/config/types.js' describe('configToJSONSchema', () => { it('should handle optional arrays with required fields', async () => { @@ -333,4 +334,81 @@ describe('configToJSONSchema', () => { title: 'Test', }) }) + + it('should handle same block object being referenced in both collection and config.blocks', async () => { + const sharedBlock: Block = { + slug: 'sharedBlock', + interfaceName: 'SharedBlock', + fields: [ + { + name: 'richText', + type: 'richText', + editor: () => { + // stub rich text editor + return { + CellComponent: '', + FieldComponent: '', + validate: () => true, + } + }, + }, + ], + } + + // @ts-expect-error + const config: Config = { + blocks: [sharedBlock], + collections: [ + { + slug: 'test', + fields: [ + { + name: 'someBlockField', + type: 'blocks', + blocks: [sharedBlock], + }, + ], + timestamps: false, + }, + ], + } + + // Ensure both rich text editor are sanitized + const sanitizedConfig = await sanitizeConfig(config) + expect(typeof (sanitizedConfig?.blocks?.[0]?.fields?.[0] as RichTextField)?.editor).toBe( + 'object', + ) + expect( + typeof ( + (sanitizedConfig.collections[0].fields[0] as BlocksField)?.blocks?.[0] + ?.fields?.[0] as RichTextField + )?.editor, + ).toBe('object') + + const schema = configToJSONSchema(sanitizedConfig, 'text') + + expect(schema?.definitions?.test).toStrictEqual({ + type: 'object', + additionalProperties: false, + title: 'Test', + properties: { + id: { + type: 'string', + }, + someBlockField: { + type: ['array', 'null'], + items: { + oneOf: [ + { + $ref: '#/definitions/SharedBlock', + }, + ], + }, + }, + }, + required: ['id'], + }) + + expect(schema?.definitions?.SharedBlock).toBeDefined() + }) }) diff --git a/packages/payload/src/utilities/configToJSONSchema.ts b/packages/payload/src/utilities/configToJSONSchema.ts index d17d39a869..ddba5263d5 100644 --- a/packages/payload/src/utilities/configToJSONSchema.ts +++ b/packages/payload/src/utilities/configToJSONSchema.ts @@ -434,14 +434,15 @@ export function fieldsToJSONSchema( fieldSchema = { ...baseFieldSchema, - type: withNullableJSONSchemaType('object', false), + type: 'object', additionalProperties: false, properties: { docs: { - type: withNullableJSONSchemaType('array', false), + type: 'array', items, }, - hasNextPage: { type: withNullableJSONSchemaType('boolean', false) }, + hasNextPage: { type: 'boolean' }, + totalDocs: { type: 'number' }, }, } break diff --git a/packages/payload/src/utilities/createLocalReq.ts b/packages/payload/src/utilities/createLocalReq.ts index 21931e6b49..9ee2a980bf 100644 --- a/packages/payload/src/utilities/createLocalReq.ts +++ b/packages/payload/src/utilities/createLocalReq.ts @@ -23,25 +23,36 @@ function getRequestContext( } } -const attachFakeURLProperties = (req: Partial) => { +const attachFakeURLProperties = (req: Partial, urlSuffix?: string) => { /** * *NOTE* - * If no URL is provided, the local API was called directly outside + * If no URL is provided, the local API was called outside * the context of a request. Therefore we create a fake URL object. - * `ts-expect-error` is used below for properties that are 'read-only' - * since they do not exist yet we can safely ignore the error. + * `ts-expect-error` is used below for properties that are 'read-only'. + * Since they do not exist yet we can safely ignore the error. */ - let urlObject + let urlObject: undefined | URL function getURLObject() { if (urlObject) { return urlObject } - const urlToUse = req?.url || req.payload.config?.serverURL || 'http://localhost' + + const fallbackURL = `http://${req.host || 'localhost'}${urlSuffix || ''}` + + const urlToUse = + req?.url || req.payload.config?.serverURL + ? `${req.payload.config.serverURL}${urlSuffix || ''}` + : fallbackURL + try { urlObject = new URL(urlToUse) - } catch (error) { - urlObject = new URL('http://localhost') + } catch (_err) { + req.payload.logger.error( + `Failed to create URL object from URL: ${urlToUse}, falling back to ${fallbackURL}`, + ) + + urlObject = new URL(fallbackURL) } return urlObject @@ -50,20 +61,25 @@ const attachFakeURLProperties = (req: Partial) => { if (!req.host) { req.host = getURLObject().host } + if (!req.protocol) { req.protocol = getURLObject().protocol } + if (!req.pathname) { req.pathname = getURLObject().pathname } + if (!req.searchParams) { // @ts-expect-error eslint-disable-next-line no-param-reassign req.searchParams = getURLObject().searchParams } + if (!req.origin) { // @ts-expect-error eslint-disable-next-line no-param-reassign req.origin = getURLObject().origin } + if (!req?.url) { // @ts-expect-error eslint-disable-next-line no-param-reassign req.url = getURLObject().href @@ -76,13 +92,14 @@ type CreateLocalReq = ( fallbackLocale?: false | TypedLocale locale?: string req?: Partial + urlSuffix?: string user?: User }, payload: Payload, ) => Promise export const createLocalReq: CreateLocalReq = async ( - { context, fallbackLocale, locale: localeArg, req = {} as PayloadRequest, user }, + { context, fallbackLocale, locale: localeArg, req = {} as PayloadRequest, urlSuffix, user }, payload, ) => { const localization = payload.config?.localization @@ -122,7 +139,7 @@ export const createLocalReq: CreateLocalReq = async ( req.routeParams = req?.routeParams || {} req.query = req?.query || {} - attachFakeURLProperties(req) + attachFakeURLProperties(req, urlSuffix) return req as PayloadRequest } diff --git a/packages/payload/src/utilities/flattenAllFields.ts b/packages/payload/src/utilities/flattenAllFields.ts index e2b0c4ebfb..f1a09c4d2d 100644 --- a/packages/payload/src/utilities/flattenAllFields.ts +++ b/packages/payload/src/utilities/flattenAllFields.ts @@ -16,7 +16,23 @@ export const flattenBlock = ({ block }: { block: Block }): FlattenedBlock => { } } -export const flattenAllFields = ({ fields }: { fields: Field[] }): FlattenedField[] => { +const flattenedFieldsCache = new Map() + +export const flattenAllFields = ({ + cache, + fields, +}: { + /** Allows you to get FlattenedField[] from Field[] anywhere without performance overhead by caching. */ + cache?: boolean + fields: Field[] +}): FlattenedField[] => { + if (cache) { + const maybeFields = flattenedFieldsCache.get(fields) + if (maybeFields) { + return maybeFields + } + } + const result: FlattenedField[] = [] for (const field of fields) { @@ -97,5 +113,7 @@ export const flattenAllFields = ({ fields }: { fields: Field[] }): FlattenedFiel } } + flattenedFieldsCache.set(fields, result) + return result } diff --git a/packages/payload/src/utilities/formatAdminURL.ts b/packages/payload/src/utilities/formatAdminURL.ts new file mode 100644 index 0000000000..2ba612838e --- /dev/null +++ b/packages/payload/src/utilities/formatAdminURL.ts @@ -0,0 +1,24 @@ +import type { Config } from '../config/types.js' + +/** Will read the `routes.admin` config and appropriately handle `"/"` admin paths */ +export const formatAdminURL = (args: { + adminRoute: NonNullable['admin'] + basePath?: string + path: '' | `/${string}` | null | undefined + serverURL?: Config['serverURL'] +}): string => { + const { adminRoute, basePath = '', path: pathFromArgs, serverURL } = args + const path = pathFromArgs || '' + + if (adminRoute) { + if (adminRoute === '/') { + if (!path) { + return `${serverURL || ''}${basePath}${adminRoute}` + } + } else { + return `${serverURL || ''}${basePath}${adminRoute}${path}` + } + } + + return `${serverURL || ''}${basePath}${path}` +} diff --git a/packages/payload/src/utilities/getFieldByPath.spec.ts b/packages/payload/src/utilities/getFieldByPath.spec.ts new file mode 100644 index 0000000000..414b38147b --- /dev/null +++ b/packages/payload/src/utilities/getFieldByPath.spec.ts @@ -0,0 +1,108 @@ +import { assert } from 'ts-essentials' +import { flattenAllFields } from './flattenAllFields.js' +import { getFieldByPath } from './getFieldByPath.js' +import type { FlattenedArrayField, FlattenedGroupField } from '../fields/config/types.js' + +const fields = flattenAllFields({ + fields: [ + { + type: 'text', + name: 'text', + }, + { + type: 'text', + name: 'textLocalized', + localized: true, + }, + { + type: 'array', + name: 'array', + fields: [ + { + name: 'text', + type: 'text', + }, + { + name: 'textLocalized', + localized: true, + type: 'text', + }, + { + name: 'group', + type: 'group', + fields: [ + { + name: 'text', + type: 'text', + }, + ], + }, + ], + }, + { + type: 'tabs', + tabs: [ + { + name: 'tab', + fields: [ + { + type: 'array', + name: 'localizedArray', + localized: true, + fields: [ + { + name: 'text', + type: 'text', + }, + ], + }, + ], + }, + ], + }, + ], +}) + +describe('getFieldByPath', () => { + it('asserts getFieldByPath', () => { + const assert_1 = getFieldByPath({ fields, path: 'text' }) + assert(assert_1) + expect(assert_1.field).toBe(fields[0]) + expect(assert_1.pathHasLocalized).toBe(false) + + const assert_2 = getFieldByPath({ fields, path: 'textLocalized' }) + assert(assert_2) + expect(assert_2.field).toBe(fields[1]) + expect(assert_2.pathHasLocalized).toBe(true) + expect(assert_2.localizedPath).toBe('textLocalized.') + + const arrayField = fields[2] as FlattenedArrayField + const assert_3 = getFieldByPath({ fields, path: 'array' }) + assert(assert_3) + expect(assert_3.field).toBe(arrayField) + expect(assert_3.pathHasLocalized).toBe(false) + + const assert_4 = getFieldByPath({ fields, path: 'array.text' }) + assert(assert_4) + expect(assert_4.field).toBe(arrayField.flattenedFields[0]) + expect(assert_4.pathHasLocalized).toBe(false) + + const assert_5 = getFieldByPath({ fields, path: 'array.textLocalized' }) + assert(assert_5) + expect(assert_5.field).toBe(arrayField.flattenedFields[1]) + expect(assert_5.pathHasLocalized).toBe(true) + expect(assert_5.localizedPath).toBe('array.textLocalized.') + + const groupWithinArray = arrayField.flattenedFields[2] as FlattenedGroupField + const assert_6 = getFieldByPath({ fields, path: 'array.group.text' }) + assert(assert_6) + expect(assert_6.field).toBe(groupWithinArray.flattenedFields[0]) + expect(assert_6.pathHasLocalized).toBe(false) + + const assert_7 = getFieldByPath({ fields, path: 'tab.localizedArray.text' }) + assert(assert_7) + expect(assert_7.field).toBe((fields[3] as any).flattenedFields[0].flattenedFields[0]) + expect(assert_7.pathHasLocalized).toBe(true) + expect(assert_7.localizedPath).toBe('tab.localizedArray..text') + }) +}) diff --git a/packages/payload/src/utilities/getFieldByPath.ts b/packages/payload/src/utilities/getFieldByPath.ts new file mode 100644 index 0000000000..7760eacebf --- /dev/null +++ b/packages/payload/src/utilities/getFieldByPath.ts @@ -0,0 +1,70 @@ +import type { FlattenedField } from '../fields/config/types.js' + +/** + * Get the field from by its path. + * Can accept nested paths, e.g: group.title, array.group.title + * If there were any localized on the path, pathHasLocalized will be true and localizedPath will look like: + * group..title // group is localized here + */ +export const getFieldByPath = ({ + fields, + localizedPath = '', + path, +}: { + fields: FlattenedField[] + localizedPath?: string + path: string +}): { + field: FlattenedField + localizedPath: string + pathHasLocalized: boolean +} | null => { + let currentFields: FlattenedField[] = fields + + let currentField: FlattenedField | null = null + + const segments = path.split('.') + + let pathHasLocalized = false + + while (segments.length > 0) { + const segment = segments.shift() + localizedPath = `${localizedPath ? `${localizedPath}.` : ''}${segment}` + const field = currentFields.find((each) => each.name === segment) + + if (!field) { + return null + } + + if (field.localized) { + pathHasLocalized = true + localizedPath = `${localizedPath}.` + } + + if ('flattenedFields' in field) { + currentFields = field.flattenedFields + } + + if ('blocks' in field) { + for (const block of field.blocks) { + const maybeField = getFieldByPath({ + fields: block.flattenedFields, + localizedPath, + path: [...segments].join('.'), + }) + + if (maybeField) { + return maybeField + } + } + } + + currentField = field + } + + if (!currentField) { + return null + } + + return { field: currentField, localizedPath, pathHasLocalized } +} diff --git a/packages/payload/src/utilities/getLabelFromPath.ts b/packages/payload/src/utilities/getLabelFromPath.ts deleted file mode 100644 index fbf4bec5fc..0000000000 --- a/packages/payload/src/utilities/getLabelFromPath.ts +++ /dev/null @@ -1,16 +0,0 @@ -export const getLabelFromPath = (path: (number | string)[]): string => { - return path - .filter((pathSegment) => !(typeof pathSegment === 'string' && pathSegment.includes('_index'))) - .reduce((acc, part) => { - if (typeof part === 'number' || (typeof part === 'string' && !isNaN(Number(part)))) { - // Convert index to 1-based and format as "Array 01", "Array 02", etc. - const fieldName = acc.pop() - acc.push(`${fieldName} ${Number(part) + 1}`) - } else { - // Capitalize field names - acc.push(part.charAt(0).toUpperCase() + part.slice(1)) - } - return acc - }, []) - .join(' > ') -} diff --git a/packages/payload/src/utilities/sanitizeJoinParams.ts b/packages/payload/src/utilities/sanitizeJoinParams.ts index 894c1103c0..30215be8a3 100644 --- a/packages/payload/src/utilities/sanitizeJoinParams.ts +++ b/packages/payload/src/utilities/sanitizeJoinParams.ts @@ -27,6 +27,7 @@ export const sanitizeJoinParams = ( joinQuery[schemaPath] = false } else { joinQuery[schemaPath] = { + count: joins[schemaPath].count === 'true', 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, diff --git a/packages/payload/src/utilities/sanitizePermissions.spec.ts b/packages/payload/src/utilities/sanitizePermissions.spec.ts index b21fd90e2a..7c15b7a3e7 100644 --- a/packages/payload/src/utilities/sanitizePermissions.spec.ts +++ b/packages/payload/src/utilities/sanitizePermissions.spec.ts @@ -1,4 +1,5 @@ import type { CollectionPermission, Permissions } from '../auth/types.js' +import { preferencesCollectionSlug } from '../preferences/config.js' import { sanitizePermissions } from './sanitizePermissions.js' @@ -1561,7 +1562,7 @@ describe('sanitizePermissions', () => { const permissions: Permissions = { canAccessAdmin: false, collections: { - 'payload-preferences': { + preferencesCollectionSlug: { fields: { user: { create: { diff --git a/packages/payload/src/utilities/transformColumnPreferences.ts b/packages/payload/src/utilities/transformColumnPreferences.ts new file mode 100644 index 0000000000..e427897a2c --- /dev/null +++ b/packages/payload/src/utilities/transformColumnPreferences.ts @@ -0,0 +1,48 @@ +import type { Column } from '../admin/types.js' +import type { ColumnPreference } from '../preferences/types.js' + +export type ColumnsFromURL = string[] + +/** + * Transforms various forms of columns into `ColumnPreference[]` which is what is stored in the user's preferences table + * In React state, for example, columns are stored in in their entirety, including React components: `[{ accessor: 'title', active: true, Label: React.ReactNode, ... }]` + * In the URL, they are stored as an array of strings: `['title', '-slug']`, where the `-` prefix is used to indicate that the column is inactive + * However in the database, columns must be in this exact shape: `[{ accessor: 'title', active: true }, { accessor: 'slug', active: false }]` + * This means that when handling columns, they need to be consistently transformed back and forth + */ +export const transformColumnsToPreferences = ( + columns: Column[] | ColumnPreference[] | ColumnsFromURL | string, +): ColumnPreference[] | undefined => { + let columnsToTransform = columns + + // Columns that originate from the URL are a stringified JSON array and need to be parsed first + if (typeof columns === 'string') { + try { + columnsToTransform = JSON.parse(columns) + } catch (e) { + console.error('Error parsing columns', columns, e) // eslint-disable-line no-console + } + } + + if (columnsToTransform && Array.isArray(columnsToTransform)) { + return columnsToTransform.map((col) => { + if (typeof col === 'string') { + const active = col[0] !== '-' + return { accessor: active ? col : col.slice(1), active } + } + + return { accessor: col.accessor, active: col.active } + }) + } +} + +/** + * Does the opposite of `transformColumnsToPreferences`, where `ColumnPreference[]` and `Column[]` are transformed into `ColumnsFromURL` + * This is useful for storing the columns in the URL, where it appears as a simple comma delimited array of strings + * The `-` prefix is used to indicate that the column is inactive + */ +export const transformColumnsToSearchParams = ( + columns: Column[] | ColumnPreference[], +): ColumnsFromURL => { + return columns.map((col) => (col.active ? col.accessor : `-${col.accessor}`)) +} diff --git a/packages/payload/src/versions/buildVersionCompoundIndexes.ts b/packages/payload/src/versions/buildVersionCompoundIndexes.ts new file mode 100644 index 0000000000..3a5ccdfb7b --- /dev/null +++ b/packages/payload/src/versions/buildVersionCompoundIndexes.ts @@ -0,0 +1,17 @@ +import type { SanitizedCompoundIndex } from '../collections/config/types.js' + +export const buildVersionCompoundIndexes = ({ + indexes, +}: { + indexes: SanitizedCompoundIndex[] +}): SanitizedCompoundIndex[] => { + return indexes.map((each) => ({ + fields: each.fields.map(({ field, localizedPath, path, pathHasLocalized }) => ({ + field, + localizedPath: `version.${localizedPath}`, + path: `version.${path}`, + pathHasLocalized, + })), + unique: false, + })) +} diff --git a/packages/payload/src/versions/deleteScheduledPublishJobs.ts b/packages/payload/src/versions/deleteScheduledPublishJobs.ts index 6d6faf8617..4020ad4fd6 100644 --- a/packages/payload/src/versions/deleteScheduledPublishJobs.ts +++ b/packages/payload/src/versions/deleteScheduledPublishJobs.ts @@ -1,6 +1,7 @@ import type { PayloadRequest } from '../types/index.js' import { type Payload } from '../index.js' +import { jobsCollectionSlug } from '../queues/config/index.js' type Args = { id?: number | string @@ -17,7 +18,7 @@ export const deleteScheduledPublishJobs = async ({ }: Args): Promise => { try { await payload.db.deleteMany({ - collection: 'payload-jobs', + collection: jobsCollectionSlug, req, where: { and: [ diff --git a/packages/payload/src/versions/payloadPackageList.ts b/packages/payload/src/versions/payloadPackageList.ts index f223f9e4e6..7f824c5a86 100644 --- a/packages/payload/src/versions/payloadPackageList.ts +++ b/packages/payload/src/versions/payloadPackageList.ts @@ -13,6 +13,7 @@ export const PAYLOAD_PACKAGE_LIST = [ '@payloadcms/plugin-cloud-storage', '@payloadcms/payload-cloud', '@payloadcms/plugin-form-builder', + '@payloadcms/plugin-import-export', // '@payloadcms/plugin-multi-tenant', '@payloadcms/plugin-nested-docs', '@payloadcms/plugin-redirects', diff --git a/packages/payload/src/versions/saveVersion.ts b/packages/payload/src/versions/saveVersion.ts index 8911d5eb32..2242c4c7bb 100644 --- a/packages/payload/src/versions/saveVersion.ts +++ b/packages/payload/src/versions/saveVersion.ts @@ -1,7 +1,7 @@ // @ts-strict-ignore import type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js' import type { SanitizedGlobalConfig } from '../globals/config/types.js' -import type { Payload } from '../index.js' +import type { CreateGlobalVersionArgs, CreateVersionArgs, Payload } from '../index.js' import type { PayloadRequest, SelectType } from '../types/index.js' import { deepCopyObjectSimple } from '../index.js' @@ -159,10 +159,11 @@ export const saveVersion = async ({ const updatedArgs = { ...createVersionArgs, createdAt: snapshotDate, + returning: false, snapshot: true, updatedAt: snapshotDate, versionData: snapshotData, - } as any + } as CreateGlobalVersionArgs & CreateVersionArgs if (collection) { await payload.db.createVersion(updatedArgs) diff --git a/packages/plugin-cloud-storage/.swcrc b/packages/plugin-cloud-storage/.swcrc index 14463f4b08..b4fb882caa 100644 --- a/packages/plugin-cloud-storage/.swcrc +++ b/packages/plugin-cloud-storage/.swcrc @@ -7,6 +7,15 @@ "syntax": "typescript", "tsx": true, "dts": true + }, + "transform": { + "react": { + "runtime": "automatic", + "pragmaFrag": "React.Fragment", + "throwIfNamespace": true, + "development": false, + "useBuiltins": true + } } }, "module": { diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index e78ed9d19d..bbff733362 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-cloud-storage", - "version": "3.24.0", + "version": "3.27.0", "description": "The official cloud storage plugin for Payload CMS", "homepage": "https://payloadcms.com", "repository": { @@ -33,6 +33,11 @@ "import": "./src/exports/utilities.ts", "types": "./src/exports/utilities.ts", "default": "./src/exports/utilities.ts" + }, + "./client": { + "import": "./src/exports/client.ts", + "types": "./src/exports/client.ts", + "default": "./src/exports/client.ts" } }, "main": "./src/index.ts", @@ -53,15 +58,20 @@ "test": "echo \"No tests available.\"" }, "dependencies": { + "@payloadcms/ui": "workspace:*", "find-node-modules": "^2.1.3", "range-parser": "^1.2.1" }, "devDependencies": { "@types/find-node-modules": "^2.1.2", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { - "payload": "workspace:*" + "payload": "workspace:*", + "react": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020", + "react-dom": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020" }, "publishConfig": { "exports": { @@ -79,6 +89,11 @@ "import": "./dist/exports/utilities.js", "types": "./dist/exports/utilities.d.ts", "default": "./dist/exports/utilities.js" + }, + "./client": { + "import": "./dist/exports/client.js", + "types": "./dist/exports/client.d.ts", + "default": "./dist/exports/client.js" } }, "main": "./dist/index.js", diff --git a/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx b/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx new file mode 100644 index 0000000000..0aab613fe0 --- /dev/null +++ b/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx @@ -0,0 +1,73 @@ +'use client' + +import type { UploadCollectionSlug } from 'payload' + +import { useConfig, useEffectEvent, useUploadHandlers } from '@payloadcms/ui' +import { Fragment, type ReactNode, useEffect } from 'react' + +type ClientUploadHandlerProps> = { + children: ReactNode + collectionSlug: UploadCollectionSlug + enabled?: boolean + extra: T + prefix?: string + serverHandlerPath: string +} + +export const createClientUploadHandler = >({ + handler, +}: { + handler: (args: { + apiRoute: string + collectionSlug: UploadCollectionSlug + extra: T + file: File + prefix?: string + serverHandlerPath: string + serverURL: string + updateFilename: (value: string) => void + }) => Promise +}) => { + return function ClientUploadHandler({ + children, + collectionSlug, + enabled, + extra, + prefix, + serverHandlerPath, + }: ClientUploadHandlerProps) { + const { setUploadHandler } = useUploadHandlers() + const { + config: { + routes: { api: apiRoute }, + serverURL, + }, + } = useConfig() + + const initializeHandler = useEffectEvent(() => { + if (enabled) { + setUploadHandler({ + collectionSlug, + handler: ({ file, updateFilename }) => { + return handler({ + apiRoute, + collectionSlug, + extra, + file, + prefix, + serverHandlerPath, + serverURL, + updateFilename, + }) + }, + }) + } + }) + + useEffect(() => { + initializeHandler() + }, []) + + return {children} + } +} diff --git a/packages/plugin-cloud-storage/src/exports/client.ts b/packages/plugin-cloud-storage/src/exports/client.ts new file mode 100644 index 0000000000..e63875627a --- /dev/null +++ b/packages/plugin-cloud-storage/src/exports/client.ts @@ -0,0 +1 @@ +export { createClientUploadHandler } from '../client/createClientUploadHandler.js' diff --git a/packages/plugin-cloud-storage/src/exports/utilities.ts b/packages/plugin-cloud-storage/src/exports/utilities.ts index e36f9b33ec..129de1ec87 100644 --- a/packages/plugin-cloud-storage/src/exports/utilities.ts +++ b/packages/plugin-cloud-storage/src/exports/utilities.ts @@ -1 +1,2 @@ export { getFilePrefix } from '../utilities/getFilePrefix.js' +export { initClientUploads } from '../utilities/initClientUploads.js' diff --git a/packages/plugin-cloud-storage/src/hooks/beforeChange.ts b/packages/plugin-cloud-storage/src/hooks/beforeChange.ts index 5450683a8b..0503ba5b0c 100644 --- a/packages/plugin-cloud-storage/src/hooks/beforeChange.ts +++ b/packages/plugin-cloud-storage/src/hooks/beforeChange.ts @@ -44,7 +44,13 @@ export const getBeforeChangeHook = } const promises = files.map(async (file) => { - await adapter.handleUpload({ collection, data, file, req }) + await adapter.handleUpload({ + clientUploadContext: file.clientUploadContext, + collection, + data, + file, + req, + }) }) await Promise.all(promises) diff --git a/packages/plugin-cloud-storage/src/plugin.ts b/packages/plugin-cloud-storage/src/plugin.ts index a7d4f7e80f..ae789cc936 100644 --- a/packages/plugin-cloud-storage/src/plugin.ts +++ b/packages/plugin-cloud-storage/src/plugin.ts @@ -60,6 +60,17 @@ export const cloudStoragePlugin = if (!options.disablePayloadAccessControl) { handlers.push(adapter.staticHandler) + // Else if disablePayloadAccessControl: true and clientUploads is used + // Build the "proxied" handler that responses only when the file was requested by client upload in addDataAndFileToRequest + } else if (adapter.clientUploads) { + handlers.push((req, args) => { + if ('clientUploadContext' in args.params) { + return adapter.staticHandler(req, args) + } + + // Otherwise still skip staticHandler + return null + }) } return { diff --git a/packages/plugin-cloud-storage/src/types.ts b/packages/plugin-cloud-storage/src/types.ts index 38ea00a981..a1e1da9aee 100644 --- a/packages/plugin-cloud-storage/src/types.ts +++ b/packages/plugin-cloud-storage/src/types.ts @@ -10,13 +10,26 @@ import type { export interface File { buffer: Buffer + clientUploadContext?: unknown filename: string filesize: number mimeType: string tempFilePath?: string } +export type ClientUploadsAccess = (args: { + collectionSlug: UploadCollectionSlug + req: PayloadRequest +}) => boolean | Promise + +export type ClientUploadsConfig = + | { + access?: ClientUploadsAccess + } + | boolean + export type HandleUpload = (args: { + clientUploadContext: unknown collection: CollectionConfig data: any file: File @@ -43,10 +56,14 @@ export type GenerateURL = (args: { export type StaticHandler = ( req: PayloadRequest, - args: { doc?: TypeWithID; params: { collection: string; filename: string } }, + args: { + doc?: TypeWithID + params: { clientUploadContext?: unknown; collection: string; filename: string } + }, ) => Promise | Response export interface GeneratedAdapter { + clientUploads?: ClientUploadsConfig /** * Additional fields to be injected into the base collection and image sizes */ diff --git a/packages/plugin-cloud-storage/src/utilities/getFilePrefix.ts b/packages/plugin-cloud-storage/src/utilities/getFilePrefix.ts index fd9778acb5..6e2771f51d 100644 --- a/packages/plugin-cloud-storage/src/utilities/getFilePrefix.ts +++ b/packages/plugin-cloud-storage/src/utilities/getFilePrefix.ts @@ -1,14 +1,26 @@ import type { CollectionConfig, PayloadRequest, UploadConfig } from 'payload' export async function getFilePrefix({ + clientUploadContext, collection, filename, req, }: { + clientUploadContext?: unknown collection: CollectionConfig filename: string req: PayloadRequest }): Promise { + // Prioritize from clientUploadContext if there is: + if ( + clientUploadContext && + typeof clientUploadContext === 'object' && + 'prefix' in clientUploadContext && + typeof clientUploadContext.prefix === 'string' + ) { + return clientUploadContext.prefix + } + const imageSizes = (collection?.upload as UploadConfig)?.imageSizes || [] const files = await req.payload.find({ diff --git a/packages/plugin-cloud-storage/src/utilities/getIncomingFiles.ts b/packages/plugin-cloud-storage/src/utilities/getIncomingFiles.ts index 7fa8b85572..282bc55ecb 100644 --- a/packages/plugin-cloud-storage/src/utilities/getIncomingFiles.ts +++ b/packages/plugin-cloud-storage/src/utilities/getIncomingFiles.ts @@ -16,6 +16,7 @@ export function getIncomingFiles({ if (file && data.filename && data.mimeType) { const mainFile: File = { buffer: file.data, + clientUploadContext: file.clientUploadContext, filename: data.filename, filesize: file.size, mimeType: data.mimeType, diff --git a/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts b/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts new file mode 100644 index 0000000000..6b8b454e73 --- /dev/null +++ b/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts @@ -0,0 +1,88 @@ +import type { Config, PayloadHandler } from 'payload' + +export const initClientUploads = , T>({ + clientHandler, + collections, + config, + enabled, + extraClientHandlerProps, + serverHandler, + serverHandlerPath, +}: { + /** Path to clientHandler component */ + clientHandler: string + collections: Record + config: Config + enabled: boolean + /** extra props to pass to the client handler */ + extraClientHandlerProps?: (collection: T) => ExtraProps + serverHandler: PayloadHandler + serverHandlerPath: string +}) => { + if (enabled) { + if (!config.endpoints) { + config.endpoints = [] + } + + /** + * Tracks how many times the same handler was already applied. + * This allows to apply the same plugin multiple times, for example + * to use different buckets for different collections. + */ + let handlerCount = 0 + + for (const endpoint of config.endpoints) { + if (endpoint.path === serverHandlerPath) { + handlerCount++ + } + } + + if (handlerCount) { + serverHandlerPath = `${serverHandlerPath}-${handlerCount}` + } + + config.endpoints.push({ + handler: serverHandler, + method: 'post', + path: serverHandlerPath, + }) + } + + if (!config.admin) { + config.admin = {} + } + + if (!config.admin.components) { + config.admin.components = {} + } + + if (!config.admin.components.providers) { + config.admin.components.providers = [] + } + + for (const collectionSlug in collections) { + const collection = collections[collectionSlug] + + let prefix: string | undefined + + if ( + collection && + typeof collection === 'object' && + 'prefix' in collection && + typeof collection.prefix === 'string' + ) { + prefix = collection.prefix + } + + config.admin.components.providers.push({ + clientProps: { + collectionSlug, + enabled, + extra: extraClientHandlerProps ? extraClientHandlerProps(collection) : undefined, + prefix, + serverHandlerPath, + }, + path: clientHandler, + }) + } +} diff --git a/packages/plugin-cloud-storage/tsconfig.json b/packages/plugin-cloud-storage/tsconfig.json index 14564e0715..6c57b9f880 100644 --- a/packages/plugin-cloud-storage/tsconfig.json +++ b/packages/plugin-cloud-storage/tsconfig.json @@ -5,5 +5,5 @@ "strict": false, "noUncheckedIndexedAccess": false, }, - "references": [{ "path": "../payload" }] + "references": [{ "path": "../payload" }, { "path": "../ui" }] } diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 9eb5be0233..b398693b83 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-form-builder", - "version": "3.24.0", + "version": "3.27.0", "description": "Form builder plugin for Payload CMS", "keywords": [ "payload", @@ -67,8 +67,8 @@ "devDependencies": { "@payloadcms/eslint-config": "workspace:*", "@types/escape-html": "^1.0.4", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "copyfiles": "^2.4.1", "cross-env": "^7.0.3", "payload": "workspace:*" diff --git a/packages/plugin-import-export/.gitignore b/packages/plugin-import-export/.gitignore new file mode 100644 index 0000000000..4baaac85f0 --- /dev/null +++ b/packages/plugin-import-export/.gitignore @@ -0,0 +1,7 @@ +node_modules +.env +dist +demo/uploads +build +.DS_Store +package-lock.json diff --git a/packages/plugin-import-export/.prettierignore b/packages/plugin-import-export/.prettierignore new file mode 100644 index 0000000000..17883dc0e5 --- /dev/null +++ b/packages/plugin-import-export/.prettierignore @@ -0,0 +1,12 @@ +.tmp +**/.git +**/.hg +**/.pnp.* +**/.svn +**/.yarn/** +**/build +**/dist/** +**/node_modules +**/temp +**/docs/** +tsconfig.json diff --git a/packages/plugin-import-export/.swcrc b/packages/plugin-import-export/.swcrc new file mode 100644 index 0000000000..b4fb882caa --- /dev/null +++ b/packages/plugin-import-export/.swcrc @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "sourceMaps": true, + "jsc": { + "target": "esnext", + "parser": { + "syntax": "typescript", + "tsx": true, + "dts": true + }, + "transform": { + "react": { + "runtime": "automatic", + "pragmaFrag": "React.Fragment", + "throwIfNamespace": true, + "development": false, + "useBuiltins": true + } + } + }, + "module": { + "type": "es6" + } +} diff --git a/packages/plugin-import-export/README.md b/packages/plugin-import-export/README.md new file mode 100644 index 0000000000..a25c4e55f9 --- /dev/null +++ b/packages/plugin-import-export/README.md @@ -0,0 +1,7 @@ +# Payload Import/Export Plugin + +A plugin for [Payload](https://github.com/payloadcms/payload) to easily import and export data. + +- [Source code](https://github.com/payloadcms/payload/tree/main/packages/plugin-import-export) +- [Documentation](https://payloadcms.com/docs/plugins/import-export) +- [Documentation source](https://github.com/payloadcms/payload/tree/main/docs/plugins/import-export.mdx) diff --git a/packages/plugin-import-export/eslint.config.js b/packages/plugin-import-export/eslint.config.js new file mode 100644 index 0000000000..f9d341be50 --- /dev/null +++ b/packages/plugin-import-export/eslint.config.js @@ -0,0 +1,18 @@ +import { rootEslintConfig, rootParserOptions } from '../../eslint.config.js' + +/** @typedef {import('eslint').Linter.Config} Config */ + +/** @type {Config[]} */ +export const index = [ + ...rootEslintConfig, + { + languageOptions: { + parserOptions: { + ...rootParserOptions, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +] + +export default index diff --git a/packages/plugin-import-export/license.md b/packages/plugin-import-export/license.md new file mode 100644 index 0000000000..b31a68cbd0 --- /dev/null +++ b/packages/plugin-import-export/license.md @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2018-2024 Payload CMS, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/plugin-import-export/package.json b/packages/plugin-import-export/package.json new file mode 100644 index 0000000000..1f60607451 --- /dev/null +++ b/packages/plugin-import-export/package.json @@ -0,0 +1,101 @@ +{ + "name": "@payloadcms/plugin-import-export", + "version": "3.27.0", + "description": "Import-Export plugin for Payload", + "keywords": [ + "payload", + "cms", + "plugin", + "typescript", + "react", + "nextjs", + "import", + "export" + ], + "repository": { + "type": "git", + "url": "https://github.com/payloadcms/payload.git", + "directory": "packages/plugin-import-export" + }, + "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" + }, + "./types": { + "import": "./src/exports/types.ts", + "types": "./src/exports/types.ts", + "default": "./src/exports/types.ts" + }, + "./rsc": { + "import": "./src/exports/rsc.ts", + "types": "./src/exports/rsc.ts", + "default": "./src/exports/rsc.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/", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "prepublishOnly": "pnpm clean && pnpm turbo build" + }, + "dependencies": { + "@faceless-ui/modal": "3.0.0-beta.2", + "@payloadcms/translations": "workspace:*", + "@payloadcms/ui": "workspace:*", + "csv-parse": "^5.6.0", + "csv-stringify": "^6.5.2", + "qs-esm": "7.0.2" + }, + "devDependencies": { + "@payloadcms/eslint-config": "workspace:*", + "@payloadcms/ui": "workspace:*", + "payload": "workspace:*" + }, + "peerDependencies": { + "@payloadcms/ui": "workspace:*", + "payload": "workspace:*" + }, + "publishConfig": { + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./types": { + "import": "./dist/exports/types.js", + "types": "./dist/exports/types.d.ts", + "default": "./dist/exports/types.js" + }, + "./rsc": { + "import": "./dist/exports/rsc.js", + "types": "./dist/exports/rsc.d.ts", + "default": "./dist/exports/rsc.js" + } + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "homepage:": "https://payloadcms.com" +} diff --git a/packages/plugin-import-export/src/components/CollectionField/index.tsx b/packages/plugin-import-export/src/components/CollectionField/index.tsx new file mode 100644 index 0000000000..efda7073ac --- /dev/null +++ b/packages/plugin-import-export/src/components/CollectionField/index.tsx @@ -0,0 +1,22 @@ +'use client' +import type React from 'react' + +import { useDocumentInfo, useField } from '@payloadcms/ui' +import { useEffect } from 'react' + +import { useImportExport } from '../ImportExportProvider/index.js' + +export const CollectionField: React.FC = () => { + const { id } = useDocumentInfo() + const { setValue } = useField({ path: 'collectionSlug' }) + const { collection } = useImportExport() + + useEffect(() => { + if (id) { + return + } + setValue(collection) + }, [id, collection, setValue]) + + return null +} diff --git a/packages/plugin-import-export/src/components/ExportListMenuItem/index.scss b/packages/plugin-import-export/src/components/ExportListMenuItem/index.scss new file mode 100644 index 0000000000..eb05087f51 --- /dev/null +++ b/packages/plugin-import-export/src/components/ExportListMenuItem/index.scss @@ -0,0 +1,52 @@ +@import '~@payloadcms/ui/scss'; + +@layer payload-default { + .export-list-menu-item { + .doc-drawer__toggler { + height: 100%; + width: 100%; + text-align: left; + } + + + // TODO: is any of this css needed? + &__subheader, + &__header { + padding: 0 var(--gutter-h); + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid var(--theme-border-color); + + & h2 { + margin: calc(var(--gutter-h) * 0.5) 0; + } + } + + &__options, + &__preview { + padding: calc(var(--gutter-h) * 0.5) var(--gutter-h); + } + + &__preview-title { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: calc(var(--gutter-h) * 0.5); + } + + &__close { + @include btn-reset; + } + + &__icon { + width: 3rem; + height: 3rem; + cursor: pointer; + + &:hover { + opacity: 0.8; + } + } + } +} diff --git a/packages/plugin-import-export/src/components/ExportListMenuItem/index.tsx b/packages/plugin-import-export/src/components/ExportListMenuItem/index.tsx new file mode 100644 index 0000000000..e018917880 --- /dev/null +++ b/packages/plugin-import-export/src/components/ExportListMenuItem/index.tsx @@ -0,0 +1,38 @@ +'use client' + +import { getTranslation } from '@payloadcms/translations' +import { PopupList, useConfig, useDocumentDrawer, useTranslation } from '@payloadcms/ui' +import React, { useEffect } from 'react' + +import { useImportExport } from '../ImportExportProvider/index.js' +import './index.scss' + +const baseClass = 'export-list-menu-item' + +export const ExportListMenuItem: React.FC<{ + collectionSlug: string + exportCollectionSlug: string +}> = ({ collectionSlug, exportCollectionSlug }) => { + const { getEntityConfig } = useConfig() + const { i18n } = useTranslation() + const currentCollectionConfig = getEntityConfig({ collectionSlug }) + + const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({ + collectionSlug: exportCollectionSlug, + }) + const { setCollection } = useImportExport() + + // Set collection and selected items on mount or when selection changes + useEffect(() => { + setCollection(currentCollectionConfig.slug ?? '') + }, [currentCollectionConfig, setCollection]) + + return ( + + + Export {getTranslation(currentCollectionConfig.labels.plural, i18n)} + + + + ) +} diff --git a/packages/plugin-import-export/src/components/ExportSaveButton/index.tsx b/packages/plugin-import-export/src/components/ExportSaveButton/index.tsx new file mode 100644 index 0000000000..2ebd46f478 --- /dev/null +++ b/packages/plugin-import-export/src/components/ExportSaveButton/index.tsx @@ -0,0 +1,72 @@ +'use client' + +import { Button, SaveButton, useConfig, useForm, useTranslation } from '@payloadcms/ui' +import React from 'react' + +export const ExportSaveButton: React.FC = () => { + const { t } = useTranslation() + const { + config: { + routes: { api }, + serverURL, + }, + } = useConfig() + + const { getData } = useForm() + + const label = t('general:save') + + const handleDownload = async () => { + try { + const data = getData() + const response = await fetch(`${serverURL}${api}/exports/download`, { + body: JSON.stringify({ + data, + }), + credentials: 'include', + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }) + + if (!response.ok) { + throw new Error('Failed to download file') + } + + const fileStream = response.body + const reader = fileStream?.getReader() + const decoder = new TextDecoder() + let result = '' + + while (reader) { + const { done, value } = await reader.read() + if (done) { + break + } + result += decoder.decode(value, { stream: true }) + } + + const blob = new Blob([result], { type: 'text/plain' }) + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `${data.name}.${data.format}` + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(url) + } catch (error) { + console.error('Error downloading file:', error) + } + } + + return ( + + + + + ) +} diff --git a/packages/plugin-import-export/src/components/FieldsToExport/index.scss b/packages/plugin-import-export/src/components/FieldsToExport/index.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/plugin-import-export/src/components/FieldsToExport/index.tsx b/packages/plugin-import-export/src/components/FieldsToExport/index.tsx new file mode 100644 index 0000000000..1a33f1fe1e --- /dev/null +++ b/packages/plugin-import-export/src/components/FieldsToExport/index.tsx @@ -0,0 +1,102 @@ +'use client' + +import type { ListPreferences, SelectFieldClientComponent } from 'payload' +import type { ReactNode } from 'react' + +import { + FieldLabel, + ReactSelect, + useConfig, + useDocumentInfo, + useField, + usePreferences, +} from '@payloadcms/ui' +import React, { useEffect, useState } from 'react' + +import { useImportExport } from '../ImportExportProvider/index.js' +import { reduceFields } from './reduceFields.js' + +const baseClass = 'fields-to-export' + +export const FieldsToExport: SelectFieldClientComponent = (props) => { + const { id } = useDocumentInfo() + const { path } = props + const { setValue, value } = useField({ path }) + const { value: collectionSlug } = useField({ path: 'collectionSlug' }) + const { getEntityConfig } = useConfig() + const { collection } = useImportExport() + const { getPreference } = usePreferences() + const [displayedValue, setDisplayedValue] = useState< + { id: string; label: ReactNode; value: string }[] + >([]) + + const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection }) + const fieldOptions = reduceFields({ fields: collectionConfig?.fields }) + + useEffect(() => { + if (value && value.length > 0) { + setDisplayedValue((prevDisplayedValue) => { + if (prevDisplayedValue.length > 0) { + return prevDisplayedValue + } // Prevent unnecessary updates + + return value.map((field) => { + const match = fieldOptions.find((option) => option.value === field) + return match ? { ...match, id: field } : { id: field, label: field, value: field } + }) + }) + } + }, [value, fieldOptions]) + + useEffect(() => { + if (id || !collectionSlug) { + return + } + const doAsync = async () => { + const currentPreferences = await getPreference<{ + columns: ListPreferences['columns'] + }>(`${collectionSlug}-list`) + + const columns = currentPreferences?.columns?.filter((a) => a.active).map((b) => b.accessor) + setValue(columns ?? collectionConfig?.admin?.defaultColumns ?? []) + } + + void doAsync() + }, [ + getPreference, + collection, + setValue, + collectionSlug, + id, + collectionConfig?.admin?.defaultColumns, + ]) + const onChange = (options: { id: string; label: ReactNode; value: string }[]) => { + if (!options) { + setValue([]) + return + } + const updatedValue = options?.map((option) => + typeof option === 'object' ? option.value : option, + ) + setValue(updatedValue) + setDisplayedValue(options) + } + + return ( +
+ + String(option.value)} + isClearable={true} + isMulti={true} + isSortable={true} + // @ts-expect-error react select option + onChange={onChange} + options={fieldOptions} + value={displayedValue} + /> +
+ ) +} diff --git a/packages/plugin-import-export/src/components/FieldsToExport/reduceFields.tsx b/packages/plugin-import-export/src/components/FieldsToExport/reduceFields.tsx new file mode 100644 index 0000000000..9d71530511 --- /dev/null +++ b/packages/plugin-import-export/src/components/FieldsToExport/reduceFields.tsx @@ -0,0 +1,111 @@ +import type { ClientField } from 'payload' + +import { fieldAffectsData, fieldHasSubFields } from 'payload/shared' +import React, { Fragment } from 'react' + +const createNestedClientFieldPath = (parentPath: string, field: ClientField): string => { + if (parentPath) { + if (fieldAffectsData(field)) { + return `${parentPath}.${field.name}` + } + return parentPath + } + + if (fieldAffectsData(field)) { + return field.name + } + + return '' +} + +const combineLabel = ({ + field, + prefix, +}: { + field: ClientField + prefix?: React.ReactNode +}): React.ReactNode => { + return ( + + {prefix ? ( + + {prefix} + {' > '} + + ) : null} + + {'label' in field && typeof field.label === 'string' + ? field.label + : (('name' in field && field.name) ?? 'unnamed field')} + + + ) +} + +export const reduceFields = ({ + fields, + labelPrefix = null, + path = '', +}: { + fields: ClientField[] + labelPrefix?: React.ReactNode + path?: string +}): { id: string; label: React.ReactNode; value: string }[] => { + if (!fields) { + return [] + } + + return fields.reduce<{ id: string; label: React.ReactNode; value: string }[]>( + (fieldsToUse, field) => { + // escape for a variety of reasons, include ui fields as they have `name`. + if (field.type === 'ui') { + return fieldsToUse + } + + if (!(field.type === 'array' || field.type === 'blocks') && fieldHasSubFields(field)) { + return [ + ...fieldsToUse, + ...reduceFields({ + fields: field.fields, + labelPrefix: combineLabel({ field, prefix: labelPrefix }), + path: createNestedClientFieldPath(path, field), + }), + ] + } + + if (field.type === 'tabs' && 'tabs' in field) { + return [ + ...fieldsToUse, + ...field.tabs.reduce<{ id: string; label: React.ReactNode; value: string }[]>( + (tabFields, tab) => { + if ('fields' in tab) { + const isNamedTab = 'name' in tab && tab.name + return [ + ...tabFields, + ...reduceFields({ + fields: tab.fields, + labelPrefix, + path: isNamedTab ? createNestedClientFieldPath(path, field) : path, + }), + ] + } + return tabFields + }, + [], + ), + ] + } + + const val = createNestedClientFieldPath(path, field) + + const formattedField = { + id: val, + label: combineLabel({ field, prefix: labelPrefix }), + value: val, + } + + return [...fieldsToUse, formattedField] + }, + [], + ) +} diff --git a/packages/plugin-import-export/src/components/ImportExportProvider/index.tsx b/packages/plugin-import-export/src/components/ImportExportProvider/index.tsx new file mode 100644 index 0000000000..fc4c4d03f4 --- /dev/null +++ b/packages/plugin-import-export/src/components/ImportExportProvider/index.tsx @@ -0,0 +1,30 @@ +'use client' +import React, { createContext, useCallback, useContext, useState } from 'react' + +type ImportExportContext = { + collection: string + setCollection: (collection: string) => void +} + +export const ImportExportContext = createContext({} as ImportExportContext) + +export const ImportExportProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [collection, setCollectionState] = useState('') + + const setCollection = useCallback((collection: string) => { + setCollectionState(collection) + }, []) + + return ( + + {children} + + ) +} + +export const useImportExport = (): ImportExportContext => useContext(ImportExportContext) diff --git a/packages/plugin-import-export/src/components/Preview/index.scss b/packages/plugin-import-export/src/components/Preview/index.scss new file mode 100644 index 0000000000..4571ee6231 --- /dev/null +++ b/packages/plugin-import-export/src/components/Preview/index.scss @@ -0,0 +1,8 @@ +.preview { + &__header { + display: flex; + justify-content: space-between; + align-items: flex-end; + margin-bottom: 10px; + } +} diff --git a/packages/plugin-import-export/src/components/Preview/index.tsx b/packages/plugin-import-export/src/components/Preview/index.tsx new file mode 100644 index 0000000000..0862c94305 --- /dev/null +++ b/packages/plugin-import-export/src/components/Preview/index.tsx @@ -0,0 +1,109 @@ +'use client' +import type { Column } from '@payloadcms/ui' +import type { ClientField, FieldAffectingDataClient } from 'payload' + +import { Table, useConfig, useField } from '@payloadcms/ui' +import { fieldAffectsData } from 'payload/shared' +import * as qs from 'qs-esm' +import React from 'react' + +import { useImportExport } from '../ImportExportProvider/index.js' +import './index.scss' + +const baseClass = 'preview' + +export const Preview = () => { + const { collection } = useImportExport() + const { config } = useConfig() + const { value: where } = useField({ path: 'where' }) + const { value: limit } = useField({ path: 'limit' }) + const { value: fields } = useField({ path: 'fields' }) + const { value: sort } = useField({ path: 'sort' }) + const { value: draft } = useField({ path: 'draft' }) + const [dataToRender, setDataToRender] = React.useState([]) + const [resultCount, setResultCount] = React.useState('') + const [columns, setColumns] = React.useState([]) + + const collectionSlug = typeof collection === 'string' && collection + const collectionConfig = config.collections.find( + (collection) => collection.slug === collectionSlug, + ) + + React.useEffect(() => { + const fetchData = async () => { + if (!collectionSlug) { + return + } + + try { + const whereQuery = qs.stringify( + { + depth: 0, + draft, + limit: limit > 10 ? 10 : limit, + sort, + where, + }, + { + addQueryPrefix: true, + }, + ) + const response = await fetch(`/api/${collectionSlug}${whereQuery}`, { + headers: { + 'Content-Type': 'application/json', + }, + method: 'GET', + }) + + if (response.ok) { + const data = await response.json() + setResultCount(limit && limit < data.totalDocs ? limit : data.totalDocs) + // TODO: check if this data is in the correct format for the table + + const filteredFields = (collectionConfig?.fields?.filter((field) => { + if (!fieldAffectsData(field)) { + return false + } + if (fields?.length > 0) { + return fields.includes(field.name) + } + return true + }) ?? []) as FieldAffectingDataClient[] + + setColumns( + filteredFields.map((field) => ({ + accessor: field.name || '', + active: true, + field: field as ClientField, + Heading: field?.label || field.name, + renderedCells: data.docs.map((doc: Record) => { + if (!field.name || !doc[field.name]) { + return null + } + if (typeof doc[field.name] === 'object') { + return JSON.stringify(doc[field.name]) + } + return String(doc[field.name]) + }), + })) as Column[], + ) + setDataToRender(data.docs) + } + } catch (error) { + console.error('Error fetching data:', error) + } + } + + void fetchData() + }, [collectionConfig?.fields, collectionSlug, draft, fields, limit, sort, where]) + + return ( +
+
+

Preview

+ {resultCount && {resultCount} total documents} +
+ {dataToRender && } + + ) +} diff --git a/packages/plugin-import-export/src/components/SortBy/index.scss b/packages/plugin-import-export/src/components/SortBy/index.scss new file mode 100644 index 0000000000..b142d9f3c3 --- /dev/null +++ b/packages/plugin-import-export/src/components/SortBy/index.scss @@ -0,0 +1,4 @@ +.sort-by-fields { + display: block; + width: 33%; +} diff --git a/packages/plugin-import-export/src/components/SortBy/index.tsx b/packages/plugin-import-export/src/components/SortBy/index.tsx new file mode 100644 index 0000000000..75d7cbb297 --- /dev/null +++ b/packages/plugin-import-export/src/components/SortBy/index.tsx @@ -0,0 +1,90 @@ +'use client' + +import type { SelectFieldClientComponent } from 'payload' +import type { ReactNode } from 'react' + +import { + FieldLabel, + ReactSelect, + useConfig, + useDocumentInfo, + useField, + useListQuery, +} from '@payloadcms/ui' +import React, { useEffect, useState } from 'react' + +import { reduceFields } from '../FieldsToExport/reduceFields.js' +import { useImportExport } from '../ImportExportProvider/index.js' + +const baseClass = 'sort-by-fields' + +export const SortBy: SelectFieldClientComponent = (props) => { + const { id } = useDocumentInfo() + const { path } = props + const { setValue, value } = useField({ path }) + const { value: collectionSlug } = useField({ path: 'collectionSlug' }) + const { query } = useListQuery() + const { getEntityConfig } = useConfig() + const { collection } = useImportExport() + const [displayedValue, setDisplayedValue] = useState<{ + id: string + label: ReactNode + value: string + } | null>(null) + + const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection }) + const fieldOptions = reduceFields({ fields: collectionConfig?.fields }) + + // Sync displayedValue with value from useField + useEffect(() => { + if (!value) { + setDisplayedValue(null) + return + } + + const option = fieldOptions.find((field) => field.value === value) + if (option && (!displayedValue || displayedValue.value !== value)) { + setDisplayedValue(option) + } + }, [value, fieldOptions]) + + useEffect(() => { + if (id || !query?.sort || value) { + return + } + + const option = fieldOptions.find((field) => field.value === query.sort) + if (option) { + setValue(option.value) + setDisplayedValue(option) + } + }, [fieldOptions, id, query?.sort, value, setValue]) + + const onChange = (option: { id: string; label: ReactNode; value: string } | null) => { + if (!option) { + setValue('') + setDisplayedValue(null) + } else { + setValue(option.value) + setDisplayedValue(option) + } + } + + return ( +
+ + String(option.value)} + isClearable={true} + isSortable={true} + // @ts-expect-error react select option + onChange={onChange} + options={fieldOptions} + // @ts-expect-error react select + value={displayedValue} + /> +
+ ) +} diff --git a/packages/plugin-import-export/src/components/WhereField/index.scss b/packages/plugin-import-export/src/components/WhereField/index.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/plugin-import-export/src/components/WhereField/index.tsx b/packages/plugin-import-export/src/components/WhereField/index.tsx new file mode 100644 index 0000000000..02c1d3db38 --- /dev/null +++ b/packages/plugin-import-export/src/components/WhereField/index.tsx @@ -0,0 +1,71 @@ +'use client' + +import type React from 'react' + +import { useDocumentInfo, useField, useListQuery, useSelection } from '@payloadcms/ui' +import { useEffect } from 'react' + +import './index.scss' + +export const WhereField: React.FC = () => { + const { setValue: setSelectionToUseValue, value: selectionToUseValue } = useField({ + path: 'selectionToUse', + }) + const { setValue } = useField({ path: 'where' }) + const { selectAll, selected } = useSelection() + const { query } = useListQuery() + const { id } = useDocumentInfo() + + // setValue based on selectionToUseValue + useEffect(() => { + if (id) { + return + } + + if (selectionToUseValue === 'currentFilters' && query && query?.where) { + setValue(query.where) + } + + if (selectionToUseValue === 'currentSelection' && selected) { + const ids = [] + + for (const [key, value] of selected) { + if (value) { + ids.push(key) + } + } + + setValue({ + id: { + in: ids, + }, + }) + } + + if (selectionToUseValue === 'all' && selected) { + setValue({}) + } + + // Selected set a where query with IDs + }, [id, selectionToUseValue, query, selected, setValue]) + + // handles default value of selectionToUse + useEffect(() => { + if (id) { + return + } + let defaultSelection: 'all' | 'currentFilters' | 'currentSelection' = 'all' + + if (['allInPage', 'some'].includes(selectAll)) { + defaultSelection = 'currentSelection' + } + + if (defaultSelection === 'all' && query?.where) { + defaultSelection = 'currentFilters' + } + + setSelectionToUseValue(defaultSelection) + }, [id, query, selectAll, setSelectionToUseValue]) + + return null +} diff --git a/packages/plugin-import-export/src/export/createExport.ts b/packages/plugin-import-export/src/export/createExport.ts new file mode 100644 index 0000000000..ff408eacb9 --- /dev/null +++ b/packages/plugin-import-export/src/export/createExport.ts @@ -0,0 +1,151 @@ +import type { PaginatedDocs, PayloadRequest, Sort, User, Where } from 'payload' + +import { stringify } from 'csv-stringify/sync' +import { APIError } from 'payload' +import { Readable } from 'stream' + +import { flattenObject } from './flattenObject.js' +import { getFilename } from './getFilename.js' +import { getSelect } from './getSelect.js' + +type Export = { + collectionSlug: string + exportsCollection: string + fields?: string[] + format: 'csv' | 'json' + globals?: string[] + id: number | string + locale?: string + name: string + slug: string + sort: Sort + user: string + userCollection: string + where?: Where +} + +export type CreateExportArgs = { + /** + * If true, stream the file instead of saving it + */ + download?: boolean + input: Export + req: PayloadRequest + user?: User +} + +export const createExport = async (args: CreateExportArgs) => { + const { + download, + input: { + id, + name: nameArg, + collectionSlug, + exportsCollection, + fields, + format, + locale: localeInput, + sort, + user, + where, + }, + req: { locale: localeArg, payload }, + req, + } = args + const locale = localeInput ?? localeArg + const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug) + if (!collectionConfig) { + throw new APIError(`Collection with slug ${collectionSlug} not found`) + } + + const name = `${nameArg ?? `${getFilename()}-${collectionSlug}`}.${format}` + const isCSV = format === 'csv' + + const findArgs = { + collection: collectionSlug, + depth: 0, + limit: 100, + locale, + overrideAccess: false, + page: 0, + select: fields ? getSelect(fields) : undefined, + sort, + user, + where, + } + + let result: PaginatedDocs = { hasNextPage: true } as PaginatedDocs + + if (download) { + const encoder = new TextEncoder() + const stream = new Readable({ + async read() { + let result = await payload.find(findArgs) + let isFirstBatch = true + + while (result.docs.length > 0) { + const csvInput = result.docs.map((doc) => flattenObject(doc)) + const csvString = stringify(csvInput, { header: isFirstBatch }) + this.push(encoder.encode(csvString)) + isFirstBatch = false + + if (!result.hasNextPage) { + this.push(null) // End the stream + break + } + + findArgs.page += 1 + result = await payload.find(findArgs) + } + }, + }) + + return new Response(stream as any, { + headers: { + 'Content-Disposition': `attachment; filename="${name}"`, + 'Content-Type': isCSV ? 'text/csv' : 'application/json', + }, + }) + } + + const outputData: string[] = [] + let isFirstBatch = true + + while (result.hasNextPage) { + findArgs.page += 1 + result = await payload.find(findArgs) + + if (isCSV) { + const csvInput = result.docs.map((doc) => flattenObject(doc)) + outputData.push(stringify(csvInput, { header: isFirstBatch })) + isFirstBatch = false + } else { + const jsonInput = result.docs.map((doc) => JSON.stringify(doc)) + outputData.push(jsonInput.join(',\n')) + } + } + + const buffer = Buffer.from(format === 'json' ? `[${outputData.join(',')}]` : outputData.join('')) + + if (!id) { + req.file = { + name, + data: buffer, + mimetype: isCSV ? 'text/csv' : 'application/json', + size: buffer.length, + } + } else { + await req.payload.update({ + id, + collection: exportsCollection, + data: {}, + file: { + name, + data: buffer, + mimetype: isCSV ? 'text/csv' : 'application/json', + size: buffer.length, + }, + user, + }) + } +} diff --git a/packages/plugin-import-export/src/export/download.ts b/packages/plugin-import-export/src/export/download.ts new file mode 100644 index 0000000000..86d02b0978 --- /dev/null +++ b/packages/plugin-import-export/src/export/download.ts @@ -0,0 +1,26 @@ +import type { PayloadHandler } from 'payload' + +import { APIError } from 'payload' + +import { createExport } from './createExport.js' + +export const download: PayloadHandler = async (req) => { + let body + if (typeof req?.json === 'function') { + body = await req.json() + } + + if (!body || !body.data) { + throw new APIError('Request data is required.') + } + + req.payload.logger.info(`Download request received ${body.data.collectionSlug}`) + + body.data.user = req.user + + return createExport({ + download: true, + input: body.data, + req, + }) as Promise +} diff --git a/packages/plugin-import-export/src/export/flattenObject.ts b/packages/plugin-import-export/src/export/flattenObject.ts new file mode 100644 index 0000000000..8fe2c83f23 --- /dev/null +++ b/packages/plugin-import-export/src/export/flattenObject.ts @@ -0,0 +1,23 @@ +export const flattenObject = (obj: any, prefix: string = ''): Record => { + const result: Record = {} + + Object.entries(obj).forEach(([key, value]) => { + const newKey = prefix ? `${prefix}_${key}` : key + + if (Array.isArray(value)) { + value.forEach((item, index) => { + if (typeof item === 'object' && item !== null) { + Object.assign(result, flattenObject(item, `${newKey}_${index}`)) + } else { + result[`${newKey}_${index}`] = item + } + }) + } else if (typeof value === 'object' && value !== null) { + Object.assign(result, flattenObject(value, newKey)) + } else { + result[newKey] = value + } + }) + + return result +} diff --git a/packages/plugin-import-export/src/export/getCreateExportCollectionTask.ts b/packages/plugin-import-export/src/export/getCreateExportCollectionTask.ts new file mode 100644 index 0000000000..6302f1c7f3 --- /dev/null +++ b/packages/plugin-import-export/src/export/getCreateExportCollectionTask.ts @@ -0,0 +1,55 @@ +import type { Config, TaskHandler, User } from 'payload' + +import type { CreateExportArgs } from './createExport.js' + +import { createExport } from './createExport.js' +import { getFields } from './getFields.js' + +export const getCreateCollectionExportTask = (config: Config): TaskHandler => { + const inputSchema = getFields(config).concat( + { + name: 'user', + type: 'text', + }, + { + name: 'userCollection', + type: 'text', + }, + { + name: 'exportsCollection', + type: 'text', + }, + ) + + return { + // @ts-expect-error plugin tasks cannot have predefined type slug + slug: 'createCollectionExport', + handler: async ({ input, req }: CreateExportArgs) => { + let user: undefined | User + + if (input.userCollection && input.user) { + user = (await req.payload.findByID({ + id: input.user, + collection: input.userCollection, + })) as User + } + + if (!user) { + throw new Error('User not found') + } + + await createExport({ input, req, user }) + + return { + success: true, + } + }, + inputSchema, + outputSchema: [ + { + name: 'success', + type: 'checkbox', + }, + ], + } +} diff --git a/packages/plugin-import-export/src/export/getFields.ts b/packages/plugin-import-export/src/export/getFields.ts new file mode 100644 index 0000000000..e088957d26 --- /dev/null +++ b/packages/plugin-import-export/src/export/getFields.ts @@ -0,0 +1,189 @@ +import type { Config, Field, SelectField } from 'payload' + +import { getFilename } from './getFilename.js' + +export const getFields = (config: Config): Field[] => { + let localeField: SelectField | undefined + if (config.localization) { + localeField = { + name: 'locale', + type: 'select', + admin: { + width: '33%', + }, + defaultValue: 'all', + label: 'Locale', + options: [ + { + label: 'All Locales', + value: 'all', + }, + ...config.localization.locales.map((locale) => ({ + label: typeof locale === 'string' ? locale : locale.label, + value: typeof locale === 'string' ? locale : locale.code, + })), + ], + } + } + + return [ + { + type: 'collapsible', + fields: [ + { + name: 'name', + type: 'text', + defaultValue: () => getFilename(), + label: 'File Name', + }, + { + type: 'row', + fields: [ + { + name: 'format', + type: 'select', + admin: { + width: '33%', + }, + defaultValue: 'csv', + label: 'Export Format', + options: [ + { + label: 'CSV', + value: 'csv', + }, + { + label: 'JSON', + value: 'json', + }, + ], + required: true, + }, + { + name: 'limit', + type: 'number', + admin: { + placeholder: 'No limit', + width: '33%', + }, + }, + { + name: 'sort', + type: 'text', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#SortBy', + }, + }, + }, + ], + }, + { + type: 'row', + fields: [ + ...(localeField ? [localeField] : []), + { + name: 'drafts', + type: 'select', + admin: { + condition: (data) => { + const collectionConfig = (config.collections ?? []).find( + (collection) => collection.slug === data.collectionSlug, + ) + return Boolean( + typeof collectionConfig?.versions === 'object' && + collectionConfig?.versions?.drafts, + ) + }, + width: '33%', + }, + defaultValue: 'true', + label: 'Drafts', + options: [ + { + label: 'True', + value: 'true', + }, + { + label: 'False', + value: 'false', + }, + ], + }, + // { + // name: 'depth', + // type: 'number', + // admin: { + // width: '33%', + // }, + // defaultValue: 1, + // required: true, + // }, + ], + }, + { + // virtual field for the UI component to modify the hidden `where` field + name: 'selectionToUse', + type: 'radio', + defaultValue: 'all', + options: [ + { + label: 'Use current selection', + value: 'currentSelection', + }, + { + label: 'Use current filters', + value: 'currentFilters', + }, + { + label: 'Use all documents', + value: 'all', + }, + ], + virtual: true, + }, + { + name: 'fields', + type: 'text', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#FieldsToExport', + }, + }, + hasMany: true, + }, + { + name: 'collectionSlug', + type: 'text', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#CollectionField', + }, + hidden: true, + }, + required: true, + }, + { + name: 'where', + type: 'json', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#WhereField', + }, + }, + defaultValue: {}, + }, + ], + label: 'Export Options', + }, + { + name: 'preview', + type: 'ui', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#Preview', + }, + }, + }, + ] +} diff --git a/packages/plugin-import-export/src/export/getFilename.ts b/packages/plugin-import-export/src/export/getFilename.ts new file mode 100644 index 0000000000..d931c23d28 --- /dev/null +++ b/packages/plugin-import-export/src/export/getFilename.ts @@ -0,0 +1,7 @@ +export const getFilename = () => { + const now = new Date() + const yyymmdd = now.toISOString().split('T')[0] // "YYYY-MM-DD" + const hhmmss = now.toTimeString().split(' ')[0] // "HH:MM:SS" + + return `${yyymmdd} ${hhmmss}` +} diff --git a/packages/plugin-import-export/src/export/getSelect.ts b/packages/plugin-import-export/src/export/getSelect.ts new file mode 100644 index 0000000000..4e156816a3 --- /dev/null +++ b/packages/plugin-import-export/src/export/getSelect.ts @@ -0,0 +1,31 @@ +import type { SelectType } from 'payload' + +/** + * Takes an input of array of string paths in dot notation and returns a select object + * example args: ['id', 'title', 'group.value', 'createdAt', 'updatedAt'] + */ +export const getSelect = (fields: string[]): SelectType => { + const select: SelectType = {} + + fields.forEach((field) => { + // TODO: this can likely be removed, the form was not saving, leaving in for now + if (!field) { + return + } + const segments = field.split('.') + let selectRef = select + + segments.forEach((segment, i) => { + if (i === segments.length - 1) { + selectRef[segment] = true + } else { + if (!selectRef[segment]) { + selectRef[segment] = {} + } + selectRef = selectRef[segment] as SelectType + } + }) + }) + + return select +} diff --git a/packages/plugin-import-export/src/exports/rsc.ts b/packages/plugin-import-export/src/exports/rsc.ts new file mode 100644 index 0000000000..5072288925 --- /dev/null +++ b/packages/plugin-import-export/src/exports/rsc.ts @@ -0,0 +1,8 @@ +export { CollectionField } from '../components/CollectionField/index.js' +export { ExportListMenuItem } from '../components/ExportListMenuItem/index.js' +export { ExportSaveButton } from '../components/ExportSaveButton/index.js' +export { FieldsToExport } from '../components/FieldsToExport/index.js' +export { ImportExportProvider } from '../components/ImportExportProvider/index.js' +export { Preview } from '../components/Preview/index.js' +export { SortBy } from '../components/SortBy/index.js' +export { WhereField } from '../components/WhereField/index.js' diff --git a/packages/plugin-import-export/src/exports/types.ts b/packages/plugin-import-export/src/exports/types.ts new file mode 100644 index 0000000000..af681756fa --- /dev/null +++ b/packages/plugin-import-export/src/exports/types.ts @@ -0,0 +1 @@ +export type { ImportExportPluginConfig } from '../types.js' diff --git a/packages/plugin-import-export/src/getExportCollection.ts b/packages/plugin-import-export/src/getExportCollection.ts new file mode 100644 index 0000000000..9c863059ea --- /dev/null +++ b/packages/plugin-import-export/src/getExportCollection.ts @@ -0,0 +1,88 @@ +import type { + CollectionAfterChangeHook, + CollectionBeforeChangeHook, + CollectionBeforeOperationHook, + CollectionConfig, + Config, +} from 'payload' + +import type { CollectionOverride, ImportExportPluginConfig } from './types.js' + +import { createExport } from './export/createExport.js' +import { download } from './export/download.js' +import { getFields } from './export/getFields.js' + +export const getExportCollection = ({ + config, + pluginConfig, +}: { + config: Config + pluginConfig: ImportExportPluginConfig +}): CollectionConfig => { + const { overrideExportCollection } = pluginConfig + + const beforeOperation: CollectionBeforeOperationHook[] = [] + const afterChange: CollectionAfterChangeHook[] = [] + + let collection: CollectionOverride = { + slug: 'exports', + access: { + update: () => false, + }, + admin: { + group: false, + useAsTitle: 'name', + }, + disableDuplicate: true, + endpoints: [ + { + handler: download, + method: 'post', + path: '/download', + }, + ], + fields: getFields(config), + hooks: { + afterChange, + beforeOperation, + }, + upload: { + filesRequiredOnCreate: false, + hideFileInputOnCreate: true, + hideRemoveFile: true, + }, + } + + if (typeof overrideExportCollection === 'function') { + collection = overrideExportCollection(collection) + } + + if (pluginConfig.disableJobsQueue) { + beforeOperation.push(async ({ args, operation, req }) => { + if (operation !== 'create') { + return + } + const { user } = req + await createExport({ input: { ...args.data, user }, req }) + }) + } else { + afterChange.push(async ({ doc, operation, req }) => { + if (operation !== 'create') { + return + } + + const input = { + ...doc, + exportsCollection: collection.slug, + user: req?.user?.id || req?.user?.user?.id, + userCollection: 'users', + } + await req.payload.jobs.queue({ + input, + task: 'createCollectionExport', + }) + }) + } + + return collection +} diff --git a/packages/plugin-import-export/src/index.ts b/packages/plugin-import-export/src/index.ts new file mode 100644 index 0000000000..74326a2c6d --- /dev/null +++ b/packages/plugin-import-export/src/index.ts @@ -0,0 +1,72 @@ +import type { Config, JobsConfig } from 'payload' + +import { deepMergeSimple } from 'payload' + +import type { ImportExportPluginConfig } from './types.js' + +import { getCreateCollectionExportTask } from './export/getCreateExportCollectionTask.js' +import { getExportCollection } from './getExportCollection.js' +import { translations } from './translations/index.js' + +export const importExportPlugin = + (pluginConfig: ImportExportPluginConfig) => + (config: Config): Config => { + const exportCollection = getExportCollection({ config, pluginConfig }) + if (config.collections) { + config.collections.push(exportCollection) + } else { + config.collections = [exportCollection] + } + + // inject custom import export provider + config.admin = config.admin || {} + config.admin.components = config.admin.components || {} + config.admin.components.providers = config.admin.components.providers || [] + config.admin.components.providers.push( + '@payloadcms/plugin-import-export/rsc#ImportExportProvider', + ) + + // inject the createExport job into the config + config.jobs = + config.jobs || + ({ + tasks: [getCreateCollectionExportTask(config)], + } as unknown as JobsConfig) // cannot type jobs config inside of plugins + + let collectionsToUpdate = config.collections + + const usePluginCollections = pluginConfig.collections && pluginConfig.collections?.length > 0 + + if (usePluginCollections) { + collectionsToUpdate = config.collections?.filter((collection) => { + return pluginConfig.collections?.includes(collection.slug) + }) + } + + collectionsToUpdate.forEach((collection) => { + if (!collection.admin) { + collection.admin = { components: { listMenuItems: [] } } + } + const components = collection.admin.components || {} + if (!components.listMenuItems) { + components.listMenuItems = [] + } + if (!components.edit) { + components.edit = {} + } + if (!components.edit.SaveButton) { + components.edit.SaveButton = '@payloadcms/plugin-import-export/rsc#ExportSaveButton' + } + components.listMenuItems.push({ + clientProps: { + exportCollectionSlug: exportCollection.slug, + }, + path: '@payloadcms/plugin-import-export/rsc#ExportListMenuItem', + }) + collection.admin.components = components + }) + + config.i18n = deepMergeSimple(translations, config.i18n?.translations ?? {}) + + return config + } diff --git a/packages/plugin-import-export/src/translations/en.ts b/packages/plugin-import-export/src/translations/en.ts new file mode 100644 index 0000000000..3ae206461b --- /dev/null +++ b/packages/plugin-import-export/src/translations/en.ts @@ -0,0 +1,9 @@ +import type { GenericTranslationsObject } from '@payloadcms/translations' + +export const en: GenericTranslationsObject = { + $schema: './translation-schema.json', + 'plugin-seo': { + export: 'Export', + import: 'Import', + }, +} diff --git a/packages/plugin-import-export/src/translations/index.ts b/packages/plugin-import-export/src/translations/index.ts new file mode 100644 index 0000000000..82fb59f80d --- /dev/null +++ b/packages/plugin-import-export/src/translations/index.ts @@ -0,0 +1,11 @@ +import type { GenericTranslationsObject, NestedKeysStripped } from '@payloadcms/translations' + +import { en } from './en.js' + +export const translations = { + en, +} + +export type PluginImportExportTranslations = GenericTranslationsObject + +export type PluginImportExportTranslationKeys = NestedKeysStripped diff --git a/packages/plugin-import-export/src/translations/translation-schema.json b/packages/plugin-import-export/src/translations/translation-schema.json new file mode 100644 index 0000000000..a42e09dc5b --- /dev/null +++ b/packages/plugin-import-export/src/translations/translation-schema.json @@ -0,0 +1,24 @@ +{ + "type": "object", + "$schema": "http://json-schema.org/draft-04/schema#", + "additionalProperties": false, + "properties": { + "$schema": { + "type": "string" + }, + "plugin-import-export": { + "type": "object", + "additionalProperties": false, + "properties": { + "export": { + "type": "string" + }, + "import": { + "type": "string" + } + }, + "required": ["export", "import"] + } + }, + "required": ["plugin-import-export"] +} diff --git a/packages/plugin-import-export/src/types.ts b/packages/plugin-import-export/src/types.ts new file mode 100644 index 0000000000..a53cade0e0 --- /dev/null +++ b/packages/plugin-import-export/src/types.ts @@ -0,0 +1,24 @@ +import type { CollectionAdminOptions, CollectionConfig, UploadConfig } from 'payload' + +export type CollectionOverride = { + admin: CollectionAdminOptions + upload: UploadConfig +} & CollectionConfig + +export type ImportExportPluginConfig = { + /** + * Collections to include the Import/Export controls in + * Defaults to all collections + */ + collections?: string[] + /** + * Enable to force the export to run synchronously + */ + disableJobsQueue?: boolean + /** + * This function takes the default export collection configured in the plugin and allows you to override it by modifying and returning it + * @param collection + * @returns collection + */ + overrideExportCollection?: (collection: CollectionOverride) => CollectionOverride +} diff --git a/packages/plugin-import-export/tsconfig.json b/packages/plugin-import-export/tsconfig.json new file mode 100644 index 0000000000..261a42c3b2 --- /dev/null +++ b/packages/plugin-import-export/tsconfig.json @@ -0,0 +1,25 @@ +{ + "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/**/**/*.ts", "src/**/**/*.tsx", "src/**/*.d.ts", "src/**/*.json", ], + "references": [{ "path": "../payload" }, { "path": "../ui"}] +} diff --git a/packages/plugin-multi-tenant/package.json b/packages/plugin-multi-tenant/package.json index def4177d8d..71d1bdd737 100644 --- a/packages/plugin-multi-tenant/package.json +++ b/packages/plugin-multi-tenant/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-multi-tenant", - "version": "3.24.0", + "version": "3.27.0", "description": "Multi Tenant plugin for Payload", "keywords": [ "payload", @@ -78,6 +78,7 @@ }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", + "@payloadcms/translations": "workspace:*", "@payloadcms/ui": "workspace:*", "payload": "workspace:*" }, diff --git a/packages/plugin-multi-tenant/src/components/TenantSelector/index.tsx b/packages/plugin-multi-tenant/src/components/TenantSelector/index.tsx index 91e9a116cb..915b5ff8fe 100644 --- a/packages/plugin-multi-tenant/src/components/TenantSelector/index.tsx +++ b/packages/plugin-multi-tenant/src/components/TenantSelector/index.tsx @@ -2,17 +2,17 @@ import type { ReactSelectOption } from '@payloadcms/ui' import type { ViewTypes } from 'payload' -import { SelectInput } from '@payloadcms/ui' - import './index.scss' +import { SelectInput, useTranslation } from '@payloadcms/ui' import React from 'react' import { SELECT_ALL } from '../../constants.js' import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js' -export const TenantSelector = ({ viewType }: { viewType?: ViewTypes }) => { +export const TenantSelector = ({ label, viewType }: { label: string; viewType?: ViewTypes }) => { const { options, selectedTenantID, setTenant } = useTenantSelection() + const { t } = useTranslation() const handleChange = React.useCallback( (option: ReactSelectOption | ReactSelectOption[]) => { @@ -33,7 +33,7 @@ export const TenantSelector = ({ viewType }: { viewType?: ViewTypes }) => {
(pluginConfig: MultiTenantPluginConfig) => @@ -33,6 +37,7 @@ export const multiTenantPlugin = pluginConfig?.tenantsArrayField?.arrayFieldName || defaults.tenantsArrayFieldName const tenantsArrayTenantFieldName = pluginConfig?.tenantsArrayField?.arrayTenantFieldName || defaults.tenantsArrayTenantFieldName + let tenantSelectorLabel = pluginConfig.tenantSelectorLabel || defaults.tenantSelectorLabel /** * Add defaults for admin properties @@ -60,6 +65,38 @@ export const multiTenantPlugin = incomingConfig.collections = [] } + /** + * Add tenant selector localized labels + */ + if (pluginConfig.tenantSelectorLabel && typeof pluginConfig.tenantSelectorLabel === 'object') { + if (!incomingConfig.i18n) { + incomingConfig.i18n = {} + } + Object.entries(pluginConfig.tenantSelectorLabel).forEach(([_locale, label]) => { + const locale = _locale as AcceptedLanguages + if (!incomingConfig.i18n) { + incomingConfig.i18n = {} + } + if (!incomingConfig.i18n.translations) { + incomingConfig.i18n.translations = {} + } + if (!(locale in incomingConfig.i18n.translations)) { + incomingConfig.i18n.translations[locale] = {} + } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + if (!('multiTenant' in incomingConfig.i18n.translations[locale])) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + incomingConfig.i18n.translations[locale].multiTenant = {} + } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + incomingConfig.i18n.translations[locale].multiTenant.selectorLabel = label + tenantSelectorLabel = 'multiTenant:selectorLabel' + }) + } + /** * Add tenants array field to users collection */ @@ -90,6 +127,7 @@ export const multiTenantPlugin = } addCollectionAccess({ + adminUsersSlug: adminUsersCollection.slug, collection: adminUsersCollection, fieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`, tenantsArrayFieldName, @@ -97,6 +135,23 @@ export const multiTenantPlugin = userHasAccessToAllTenants, }) + if (pluginConfig.useUsersTenantFilter !== false) { + if (!adminUsersCollection.admin) { + adminUsersCollection.admin = {} + } + + adminUsersCollection.admin.baseListFilter = combineListFilters({ + baseListFilter: adminUsersCollection.admin?.baseListFilter, + customFilter: (args) => + filterUsersBySelectedTenant({ + req: args.req, + tenantsArrayFieldName, + tenantsArrayTenantFieldName, + tenantsCollectionSlug, + }), + }) + } + let tenantCollection: CollectionConfig | undefined const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce< @@ -130,6 +185,7 @@ export const multiTenantPlugin = * - constrains access a users assigned tenants */ addCollectionAccess({ + adminUsersSlug: adminUsersCollection.slug, collection, fieldName: 'id', tenantsArrayFieldName, @@ -138,6 +194,25 @@ export const multiTenantPlugin = }) } + if (pluginConfig.useTenantsListFilter !== false) { + /** + * Add list filter to tenants collection + * - filter by selected tenant + */ + if (!collection.admin) { + collection.admin = {} + } + + collection.admin.baseListFilter = combineListFilters({ + baseListFilter: collection.admin?.baseListFilter, + customFilter: (args) => + filterTenantsBySelectedTenant({ + req: args.req, + tenantsCollectionSlug, + }), + }) + } + if (pluginConfig.cleanupAfterTenantDelete !== false) { /** * Add cleanup logic when tenant is deleted @@ -190,15 +265,21 @@ export const multiTenantPlugin = if (pluginConfig.collections[collection.slug]?.useBaseListFilter !== false) { /** - * Collection baseListFilter with selected tenant constraint (if selected) + * Add list filter to enabled collections + * - filters results by selected tenant */ if (!collection.admin) { collection.admin = {} } - collection.admin.baseListFilter = withTenantListFilter({ + + collection.admin.baseListFilter = combineListFilters({ baseListFilter: collection.admin?.baseListFilter, - tenantFieldName, - tenantsCollectionSlug, + customFilter: (args) => + filterDocumentsBySelectedTenant({ + req: args.req, + tenantFieldName, + tenantsCollectionSlug, + }), }) } @@ -207,6 +288,7 @@ export const multiTenantPlugin = * Add access control constraint to tenant enabled collection */ addCollectionAccess({ + adminUsersSlug: adminUsersCollection.slug, collection, fieldName: tenantFieldName, tenantsArrayFieldName, @@ -251,6 +333,9 @@ export const multiTenantPlugin = * Add tenant selector to admin UI */ incomingConfig.admin.components.beforeNavLinks.push({ + clientProps: { + label: tenantSelectorLabel, + }, path: '@payloadcms/plugin-multi-tenant/client#TenantSelector', }) diff --git a/packages/plugin-multi-tenant/src/utilities/getTenantListFilter.ts b/packages/plugin-multi-tenant/src/list-filters/filterDocumentsBySelectedTenant.ts similarity index 74% rename from packages/plugin-multi-tenant/src/utilities/getTenantListFilter.ts rename to packages/plugin-multi-tenant/src/list-filters/filterDocumentsBySelectedTenant.ts index 47ae504b05..1f6b32fa63 100644 --- a/packages/plugin-multi-tenant/src/utilities/getTenantListFilter.ts +++ b/packages/plugin-multi-tenant/src/list-filters/filterDocumentsBySelectedTenant.ts @@ -1,15 +1,15 @@ import type { PayloadRequest, Where } from 'payload' import { SELECT_ALL } from '../constants.js' -import { getCollectionIDType } from './getCollectionIDType.js' -import { getTenantFromCookie } from './getTenantFromCookie.js' +import { getCollectionIDType } from '../utilities/getCollectionIDType.js' +import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js' type Args = { req: PayloadRequest tenantFieldName: string tenantsCollectionSlug: string } -export const getTenantListFilter = ({ +export const filterDocumentsBySelectedTenant = ({ req, tenantFieldName, tenantsCollectionSlug, diff --git a/packages/plugin-multi-tenant/src/list-filters/filterTenantsBySelectedTenant.ts b/packages/plugin-multi-tenant/src/list-filters/filterTenantsBySelectedTenant.ts new file mode 100644 index 0000000000..89cf1b886f --- /dev/null +++ b/packages/plugin-multi-tenant/src/list-filters/filterTenantsBySelectedTenant.ts @@ -0,0 +1,30 @@ +import type { PayloadRequest, Where } from 'payload' + +import { SELECT_ALL } from '../constants.js' +import { getCollectionIDType } from '../utilities/getCollectionIDType.js' +import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js' + +type Args = { + req: PayloadRequest + tenantsCollectionSlug: string +} +export const filterTenantsBySelectedTenant = ({ + req, + tenantsCollectionSlug, +}: Args): null | Where => { + const idType = getCollectionIDType({ + collectionSlug: tenantsCollectionSlug, + payload: req.payload, + }) + const selectedTenant = getTenantFromCookie(req.headers, idType) + + if (selectedTenant === SELECT_ALL) { + return {} + } + + return { + id: { + equals: selectedTenant, + }, + } +} diff --git a/packages/plugin-multi-tenant/src/list-filters/filterUsersBySelectedTenant.ts b/packages/plugin-multi-tenant/src/list-filters/filterUsersBySelectedTenant.ts new file mode 100644 index 0000000000..595d45e1bf --- /dev/null +++ b/packages/plugin-multi-tenant/src/list-filters/filterUsersBySelectedTenant.ts @@ -0,0 +1,37 @@ +import type { PayloadRequest, Where } from 'payload' + +import { SELECT_ALL } from '../constants.js' +import { getCollectionIDType } from '../utilities/getCollectionIDType.js' +import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js' + +type Args = { + req: PayloadRequest + tenantsArrayFieldName: string + tenantsArrayTenantFieldName: string + tenantsCollectionSlug: string +} +/** + * Filter the list of users by the selected tenant + */ +export const filterUsersBySelectedTenant = ({ + req, + tenantsArrayFieldName, + tenantsArrayTenantFieldName, + tenantsCollectionSlug, +}: Args): null | Where => { + const idType = getCollectionIDType({ + collectionSlug: tenantsCollectionSlug, + payload: req.payload, + }) + const selectedTenant = getTenantFromCookie(req.headers, idType) + + if (selectedTenant === SELECT_ALL) { + return {} + } + + return { + [`${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`]: { + in: [selectedTenant], + }, + } +} diff --git a/packages/plugin-multi-tenant/src/types.ts b/packages/plugin-multi-tenant/src/types.ts index abb026f19d..8d0eb4fce3 100644 --- a/packages/plugin-multi-tenant/src/types.ts +++ b/packages/plugin-multi-tenant/src/types.ts @@ -1,3 +1,4 @@ +import type { AcceptedLanguages } from '@payloadcms/translations' import type { ArrayField, CollectionSlug, Field, RelationshipField, User } from 'payload' export type MultiTenantPluginConfig = { @@ -107,6 +108,16 @@ export type MultiTenantPluginConfig = { rowFields?: never tenantFieldAccess?: never } + /** + * Customize tenant selector label + * + * Either a string or an object where the keys are locales and the values are the string labels + */ + tenantSelectorLabel?: + | Partial<{ + [key in AcceptedLanguages]?: string + }> + | string /** * The slug for the tenant collection * @@ -125,6 +136,14 @@ export type MultiTenantPluginConfig = { * Opt out of adding access constraints to the tenants collection */ useTenantsCollectionAccess?: boolean + /** + * Opt out including the baseListFilter to filter tenants by selected tenant + */ + useTenantsListFilter?: boolean + /** + * Opt out including the baseListFilter to filter users by selected tenant + */ + useUsersTenantFilter?: boolean } export type Tenant = { @@ -133,7 +152,9 @@ export type Tenant = { } export type UserWithTenantsField = { - tenants: { - tenant: number | string | Tenant - }[] + tenants?: + | { + tenant: number | string | Tenant + }[] + | null } & User diff --git a/packages/plugin-multi-tenant/src/utilities/addCollectionAccess.ts b/packages/plugin-multi-tenant/src/utilities/addCollectionAccess.ts index e70d45965f..ff35a04a6a 100644 --- a/packages/plugin-multi-tenant/src/utilities/addCollectionAccess.ts +++ b/packages/plugin-multi-tenant/src/utilities/addCollectionAccess.ts @@ -18,6 +18,7 @@ const collectionAccessKeys: AllAccessKeys< > = ['create', 'read', 'update', 'delete', 'readVersions', 'unlock'] as const type Args = { + adminUsersSlug: string collection: CollectionConfig fieldName: string tenantsArrayFieldName?: string @@ -32,6 +33,7 @@ type Args = { * - constrains access a users assigned tenants */ export const addCollectionAccess = ({ + adminUsersSlug, collection, fieldName, tenantsArrayFieldName, @@ -44,6 +46,7 @@ export const addCollectionAccess = ({ } collection.access[key] = withTenantAccess({ accessFunction: collection.access?.[key], + adminUsersSlug, collection, fieldName: key === 'readVersions' ? `version.${fieldName}` : fieldName, operation: key, diff --git a/packages/plugin-multi-tenant/src/utilities/withTenantListFilter.ts b/packages/plugin-multi-tenant/src/utilities/combineListFilters.ts similarity index 66% rename from packages/plugin-multi-tenant/src/utilities/withTenantListFilter.ts rename to packages/plugin-multi-tenant/src/utilities/combineListFilters.ts index 7f3e70bb4e..c8024330fb 100644 --- a/packages/plugin-multi-tenant/src/utilities/withTenantListFilter.ts +++ b/packages/plugin-multi-tenant/src/utilities/combineListFilters.ts @@ -1,19 +1,16 @@ import type { BaseListFilter, Where } from 'payload' -import { getTenantListFilter } from './getTenantListFilter.js' - type Args = { baseListFilter?: BaseListFilter - tenantFieldName: string - tenantsCollectionSlug: string + customFilter: BaseListFilter } /** * Combines a base list filter with a tenant list filter * * Combines where constraints inside of an AND operator */ -export const withTenantListFilter = - ({ baseListFilter, tenantFieldName, tenantsCollectionSlug }: Args): BaseListFilter => +export const combineListFilters = + ({ baseListFilter, customFilter }: Args): BaseListFilter => async (args) => { const filterConstraints = [] @@ -25,14 +22,10 @@ export const withTenantListFilter = } } - const tenantListFilter = getTenantListFilter({ - req: args.req, - tenantFieldName, - tenantsCollectionSlug, - }) + const customFilterResult = await customFilter(args) - if (tenantListFilter) { - filterConstraints.push(tenantListFilter) + if (customFilterResult) { + filterConstraints.push(customFilterResult) } if (filterConstraints.length) { diff --git a/packages/plugin-multi-tenant/src/utilities/withTenantAccess.ts b/packages/plugin-multi-tenant/src/utilities/withTenantAccess.ts index 78fb779650..0d4e1a5bb2 100644 --- a/packages/plugin-multi-tenant/src/utilities/withTenantAccess.ts +++ b/packages/plugin-multi-tenant/src/utilities/withTenantAccess.ts @@ -15,6 +15,7 @@ import { getTenantAccess } from './getTenantAccess.js' type Args = { accessFunction?: Access + adminUsersSlug: string collection: CollectionConfig fieldName: string operation: AllOperations @@ -27,6 +28,7 @@ type Args = { export const withTenantAccess = ({ accessFunction, + adminUsersSlug, collection, fieldName, tenantsArrayFieldName, @@ -49,6 +51,7 @@ export const withTenantAccess = if ( args.req.user && + args.req.user.collection === adminUsersSlug && !userHasAccessToAllTenants( args.req.user as ConfigType extends { user: unknown } ? ConfigType['user'] : User, ) diff --git a/packages/plugin-multi-tenant/tsconfig.json b/packages/plugin-multi-tenant/tsconfig.json index 2b41f4df60..b14b853dc0 100644 --- a/packages/plugin-multi-tenant/tsconfig.json +++ b/packages/plugin-multi-tenant/tsconfig.json @@ -1,4 +1,4 @@ { "extends": "../../tsconfig.base.json", - "references": [{ "path": "../payload" }, { "path": "../ui"}] + "references": [{ "path": "../payload" }, { "path": "../ui"}, { "path": "../translations"}] } diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index e93be9b2e8..c86ed391a5 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.24.0", + "version": "3.27.0", "description": "The official Nested Docs plugin for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 8d930e9b0e..608e0f158b 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.24.0", + "version": "3.27.0", "description": "Redirects plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index b42ec3ec3f..389e992a5f 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.24.0", + "version": "3.27.0", "description": "Search plugin for Payload", "keywords": [ "payload", @@ -64,8 +64,8 @@ }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/plugin-search/src/Search/index.ts b/packages/plugin-search/src/Search/index.ts index 425259909a..9941cb68fc 100644 --- a/packages/plugin-search/src/Search/index.ts +++ b/packages/plugin-search/src/Search/index.ts @@ -1,13 +1,13 @@ import type { CollectionConfig, Field } from 'payload' -import type { SearchPluginConfigWithLocales } from '../types.js' +import type { SanitizedSearchPluginConfig } from '../types.js' import type { ReindexButtonServerProps } from './ui/ReindexButton/types.js' import { generateReindexHandler } from '../utilities/generateReindexHandler.js' // all settings can be overridden by the config export const generateSearchCollection = ( - pluginConfig: SearchPluginConfigWithLocales, + pluginConfig: SanitizedSearchPluginConfig, ): CollectionConfig => { const searchSlug = pluginConfig?.searchOverrides?.slug || 'search' const searchCollections = pluginConfig?.collections || [] @@ -55,6 +55,10 @@ export const generateSearchCollection = ( }, ] + if (!collectionLabels) { + throw new Error('collectionLabels is required') + } + const newConfig: CollectionConfig = { ...(pluginConfig?.searchOverrides || {}), slug: searchSlug, diff --git a/packages/plugin-search/src/Search/ui/LinkToDoc/index.client.tsx b/packages/plugin-search/src/Search/ui/LinkToDoc/index.client.tsx index b3960fd24f..1f31a074ab 100644 --- a/packages/plugin-search/src/Search/ui/LinkToDoc/index.client.tsx +++ b/packages/plugin-search/src/Search/ui/LinkToDoc/index.client.tsx @@ -1,7 +1,7 @@ 'use client' import { CopyToClipboard, Link, useConfig, useField } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' export const LinkToDocClient: React.FC = () => { diff --git a/packages/plugin-search/src/Search/ui/ReindexButton/index.client.tsx b/packages/plugin-search/src/Search/ui/ReindexButton/index.client.tsx index ef46bf14e5..2c4f1a9d7c 100644 --- a/packages/plugin-search/src/Search/ui/ReindexButton/index.client.tsx +++ b/packages/plugin-search/src/Search/ui/ReindexButton/index.client.tsx @@ -89,7 +89,7 @@ export const ReindexButtonClient: React.FC = ({ if (typeof label === 'string') { return label } else { - return Object.hasOwn(label, locale.code) ? label[locale.code] : slug + return label && Object.hasOwn(label, locale.code) ? label[locale.code] : slug } }, [collectionLabels, locale.code], @@ -97,7 +97,10 @@ export const ReindexButtonClient: React.FC = ({ const pluralizedLabels = useMemo(() => { return searchCollections.reduce>((acc, slug) => { - acc[slug] = getPluralizedLabel(slug) + const label = getPluralizedLabel(slug) + if (label) { + acc[slug] = label + } return acc }, {}) }, [searchCollections, getPluralizedLabel]) @@ -111,9 +114,6 @@ export const ReindexButtonClient: React.FC = ({ const modalDescription = selectedAll ? t('general:confirmReindexDescriptionAll') : t('general:confirmReindexDescription', { collections: selectedLabels }) - const loadingText = selectedAll - ? t('general:reindexingAll', { collections: t('general:collections') }) - : t('general:reindexingAll', { collections: selectedLabels }) return (
diff --git a/packages/plugin-search/src/Search/ui/ReindexButton/index.tsx b/packages/plugin-search/src/Search/ui/ReindexButton/index.tsx index 03327ca4db..6f08a481fb 100644 --- a/packages/plugin-search/src/Search/ui/ReindexButton/index.tsx +++ b/packages/plugin-search/src/Search/ui/ReindexButton/index.tsx @@ -12,6 +12,7 @@ export const ReindexButton: SearchReindexButtonServerComponent = (props) => { const pluralLabel = labels?.plural if (typeof pluralLabel === 'function') { + // @ts-expect-error - I don't know why it gives an error. pluralLabel and i18n.t should both resolve to TFunction return [collection, pluralLabel({ t: i18n.t })] } diff --git a/packages/plugin-search/src/index.ts b/packages/plugin-search/src/index.ts index a43939d1c6..05a4939dc1 100644 --- a/packages/plugin-search/src/index.ts +++ b/packages/plugin-search/src/index.ts @@ -1,6 +1,6 @@ import type { CollectionAfterChangeHook, CollectionAfterDeleteHook, Config } from 'payload' -import type { SearchPluginConfig, SearchPluginConfigWithLocales } from './types.js' +import type { SanitizedSearchPluginConfig, SearchPluginConfig } from './types.js' import { deleteFromSearch } from './Search/hooks/deleteFromSearch.js' import { syncWithSearch } from './Search/hooks/syncWithSearch.js' @@ -35,7 +35,7 @@ export const searchPlugin = .map((collection) => [collection.slug, collection.labels]), ) - const pluginConfig: SearchPluginConfigWithLocales = { + const pluginConfig: SanitizedSearchPluginConfig = { // write any config defaults here deleteDrafts: true, labels, diff --git a/packages/plugin-search/src/types.ts b/packages/plugin-search/src/types.ts index 48bdf0749e..4b0e4c1f36 100644 --- a/packages/plugin-search/src/types.ts +++ b/packages/plugin-search/src/types.ts @@ -77,6 +77,11 @@ export type SearchPluginConfigWithLocales = { locales?: string[] } & SearchPluginConfig +export type SanitizedSearchPluginConfig = { + reindexBatchSize: number + syncDrafts: boolean +} & SearchPluginConfigWithLocales + export type SyncWithSearchArgs = { collection: string pluginConfig: SearchPluginConfig diff --git a/packages/plugin-search/src/utilities/generateReindexHandler.ts b/packages/plugin-search/src/utilities/generateReindexHandler.ts index c773373014..b14184228c 100644 --- a/packages/plugin-search/src/utilities/generateReindexHandler.ts +++ b/packages/plugin-search/src/utilities/generateReindexHandler.ts @@ -9,7 +9,7 @@ import { killTransaction, } from 'payload' -import type { SearchPluginConfigWithLocales } from '../types.js' +import type { SanitizedSearchPluginConfig } from '../types.js' import { syncDocAsSearchIndex } from './syncDocAsSearchIndex.js' @@ -19,19 +19,29 @@ type ValidationResult = { } export const generateReindexHandler = - (pluginConfig: SearchPluginConfigWithLocales): PayloadHandler => + (pluginConfig: SanitizedSearchPluginConfig): PayloadHandler => async (req) => { addLocalesToRequestFromData(req) + if (!req.json) { + return new Response('Req.json is undefined', { status: 400 }) + } const { collections = [] } = (await req.json()) as { collections: string[] } const t = req.t const searchSlug = pluginConfig?.searchOverrides?.slug || 'search' const searchCollections = pluginConfig?.collections || [] - const reindexLocales = pluginConfig?.locales?.length ? pluginConfig.locales : [req.locale] + const reindexLocales = pluginConfig?.locales?.length + ? pluginConfig.locales + : req.locale + ? [req.locale] + : [] const validatePermissions = async (): Promise => { const accessResults = await getAccessResults({ req }) - const searchAccessResults = accessResults.collections[searchSlug] + const searchAccessResults = accessResults.collections?.[searchSlug] + if (!searchAccessResults) { + return { isValid: false, message: t('error:notAllowedToPerformAction') } + } const permissions = [searchAccessResults.delete, searchAccessResults.update] // plugin doesn't allow create by default: diff --git a/packages/plugin-search/src/utilities/syncDocAsSearchIndex.ts b/packages/plugin-search/src/utilities/syncDocAsSearchIndex.ts index bb8734439f..2f2159815f 100644 --- a/packages/plugin-search/src/utilities/syncDocAsSearchIndex.ts +++ b/packages/plugin-search/src/utilities/syncDocAsSearchIndex.ts @@ -56,7 +56,7 @@ export const syncDocAsSearchIndex = async ({ `Error gathering default priority for ${searchSlug} documents related to ${collection}`, ) } - } else { + } else if (priority !== undefined) { defaultPriority = priority } } diff --git a/packages/plugin-search/tsconfig.json b/packages/plugin-search/tsconfig.json index 1d4d43b8fc..fb21182864 100644 --- a/packages/plugin-search/tsconfig.json +++ b/packages/plugin-search/tsconfig.json @@ -1,8 +1,4 @@ { "extends": "../../tsconfig.base.json", - "compilerOptions": { - /* TODO: remove the following lines */ - "strict": false, - }, "references": [{ "path": "../payload" }, { "path": "../ui" }, { "path": "../next" }] } diff --git a/packages/plugin-sentry/package.json b/packages/plugin-sentry/package.json index 2f7072aded..6edb83295a 100644 --- a/packages/plugin-sentry/package.json +++ b/packages/plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-sentry", - "version": "3.24.0", + "version": "3.27.0", "description": "Sentry plugin for Payload", "keywords": [ "payload", @@ -58,8 +58,8 @@ }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index e8c897d3a0..bf7fde355b 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.24.0", + "version": "3.27.0", "description": "SEO plugin for Payload", "keywords": [ "payload", @@ -70,8 +70,8 @@ "devDependencies": { "@payloadcms/eslint-config": "workspace:*", "@payloadcms/next": "workspace:*", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/plugin-stripe/package.json b/packages/plugin-stripe/package.json index 9b15aa5013..01c4acbed0 100644 --- a/packages/plugin-stripe/package.json +++ b/packages/plugin-stripe/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-stripe", - "version": "3.24.0", + "version": "3.27.0", "description": "Stripe plugin for Payload", "keywords": [ "payload", @@ -71,8 +71,8 @@ "@payloadcms/eslint-config": "workspace:*", "@payloadcms/next": "workspace:*", "@types/lodash.get": "^4.4.7", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "@types/uuid": "10.0.0", "payload": "workspace:*" }, diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index e3bc7dc9e1..c53f85af20 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.24.0", + "version": "3.27.0", "description": "The officially supported Lexical richtext adapter for Payload", "homepage": "https://payloadcms.com", "repository": { @@ -35,6 +35,16 @@ "types": "./src/exports/react/index.ts", "default": "./src/exports/react/index.ts" }, + "./html": { + "import": "./src/exports/html/index.ts", + "types": "./src/exports/html/index.ts", + "default": "./src/exports/html/index.ts" + }, + "./html-async": { + "import": "./src/exports/html-async/index.ts", + "types": "./src/exports/html-async/index.ts", + "default": "./src/exports/html-async/index.ts" + }, "./rsc": { "import": "./src/exports/server/rsc.ts", "types": "./src/exports/server/rsc.ts", @@ -255,11 +265,6 @@ "types": "./src/lexical-proxy/@lexical-react/LexicalTabIndentationPlugin.ts", "default": "./src/lexical-proxy/@lexical-react/LexicalTabIndentationPlugin.ts" }, - "./lexical/react/LexicalTableOfContents": { - "import": "./src/lexical-proxy/@lexical-react/LexicalTableOfContents.ts", - "types": "./src/lexical-proxy/@lexical-react/LexicalTableOfContents.ts", - "default": "./src/lexical-proxy/@lexical-react/LexicalTableOfContents.ts" - }, "./lexical/react/LexicalTableOfContentsPlugin": { "import": "./src/lexical-proxy/@lexical-react/LexicalTableOfContentsPlugin.ts", "types": "./src/lexical-proxy/@lexical-react/LexicalTableOfContentsPlugin.ts", @@ -346,16 +351,16 @@ ] }, "dependencies": { - "@lexical/headless": "0.21.0", - "@lexical/html": "0.21.0", - "@lexical/link": "0.21.0", - "@lexical/list": "0.21.0", - "@lexical/mark": "0.21.0", - "@lexical/react": "0.21.0", - "@lexical/rich-text": "0.21.0", - "@lexical/selection": "0.21.0", - "@lexical/table": "0.21.0", - "@lexical/utils": "0.21.0", + "@lexical/headless": "0.27.1", + "@lexical/html": "0.27.1", + "@lexical/link": "0.27.1", + "@lexical/list": "0.27.1", + "@lexical/mark": "0.27.1", + "@lexical/react": "0.27.1", + "@lexical/rich-text": "0.27.1", + "@lexical/selection": "0.27.1", + "@lexical/table": "0.27.1", + "@lexical/utils": "0.27.1", "@payloadcms/translations": "workspace:*", "@payloadcms/ui": "workspace:*", "@types/uuid": "10.0.0", @@ -364,10 +369,11 @@ "dequal": "2.0.3", "escape-html": "1.0.3", "jsox": "1.2.121", - "lexical": "0.21.0", + "lexical": "0.27.1", "mdast-util-from-markdown": "2.0.2", "mdast-util-mdx-jsx": "3.1.3", "micromark-extension-mdx-jsx": "3.0.1", + "qs-esm": "7.0.2", "react-error-boundary": "4.1.2", "ts-essentials": "10.0.3", "uuid": "10.0.0" @@ -378,13 +384,13 @@ "@babel/preset-env": "7.26.7", "@babel/preset-react": "7.26.3", "@babel/preset-typescript": "7.26.0", - "@lexical/eslint-plugin": "0.21.0", + "@lexical/eslint-plugin": "0.27.1", "@payloadcms/eslint-config": "workspace:*", "@types/escape-html": "1.0.4", "@types/json-schema": "7.0.15", "@types/node": "22.5.4", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "babel-plugin-react-compiler": "19.0.0-beta-714736e-20250131", "babel-plugin-transform-remove-imports": "^1.8.0", "esbuild": "0.24.2", @@ -421,6 +427,16 @@ "types": "./dist/exports/react/index.d.ts", "default": "./dist/exports/react/index.js" }, + "./html": { + "import": "./dist/exports/html/index.js", + "types": "./dist/exports/html/index.d.ts", + "default": "./dist/exports/html/index.js" + }, + "./html-async": { + "import": "./dist/exports/html-async/index.js", + "types": "./dist/exports/html-async/index.d.ts", + "default": "./dist/exports/html-async/index.js" + }, "./rsc": { "import": "./dist/exports/server/rsc.js", "types": "./dist/exports/server/rsc.d.ts", @@ -641,11 +657,6 @@ "types": "./dist/lexical-proxy/@lexical-react/LexicalTabIndentationPlugin.d.ts", "default": "./dist/lexical-proxy/@lexical-react/LexicalTabIndentationPlugin.js" }, - "./lexical/react/LexicalTableOfContents": { - "import": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContents.js", - "types": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContents.d.ts", - "default": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContents.js" - }, "./lexical/react/LexicalTableOfContentsPlugin": { "import": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContentsPlugin.js", "types": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContentsPlugin.d.ts", diff --git a/packages/richtext-lexical/src/cell/rscEntry.tsx b/packages/richtext-lexical/src/cell/rscEntry.tsx index 7ecec35bee..c8f1649b11 100644 --- a/packages/richtext-lexical/src/cell/rscEntry.tsx +++ b/packages/richtext-lexical/src/cell/rscEntry.tsx @@ -3,7 +3,7 @@ import type { Payload } from 'payload' import { getTranslation, type I18nClient } from '@payloadcms/translations' import { Link } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import type { SanitizedServerEditorConfig } from '../lexical/config/types.js' diff --git a/packages/richtext-lexical/src/exports/client/index.ts b/packages/richtext-lexical/src/exports/client/index.ts index e7bc38e5be..541de82c28 100644 --- a/packages/richtext-lexical/src/exports/client/index.ts +++ b/packages/richtext-lexical/src/exports/client/index.ts @@ -146,3 +146,4 @@ export { BlockCollapsible } from '../../features/blocks/client/component/compone export { BlockEditButton } from '../../features/blocks/client/component/components/BlockEditButton.js' export { BlockRemoveButton } from '../../features/blocks/client/component/components/BlockRemoveButton.js' export { useBlockComponentContext } from '../../features/blocks/client/component/BlockContent.js' +export { getRestPopulateFn } from '../../features/converters/utilities/restPopulateFn.js' diff --git a/packages/richtext-lexical/src/exports/html-async/index.ts b/packages/richtext-lexical/src/exports/html-async/index.ts new file mode 100644 index 0000000000..aaf296b68e --- /dev/null +++ b/packages/richtext-lexical/src/exports/html-async/index.ts @@ -0,0 +1,25 @@ +export { BlockquoteHTMLConverterAsync } from '../../features/converters/html/async/converters/blockquote.js' +export { HeadingHTMLConverterAsync } from '../../features/converters/html/async/converters/heading.js' +export { HorizontalRuleHTMLConverterAsync } from '../../features/converters/html/async/converters/horizontalRule.js' +export { LinebreakHTMLConverterAsync } from '../../features/converters/html/async/converters/linebreak.js' +export { LinkHTMLConverterAsync } from '../../features/converters/html/async/converters/link.js' +export { ListHTMLConverterAsync } from '../../features/converters/html/async/converters/list.js' +export { ParagraphHTMLConverterAsync } from '../../features/converters/html/async/converters/paragraph.js' +export { TabHTMLConverterAsync } from '../../features/converters/html/async/converters/tab.js' +export { TableHTMLConverterAsync } from '../../features/converters/html/async/converters/table.js' +export { TextHTMLConverterAsync } from '../../features/converters/html/async/converters/text.js' + +export { UploadHTMLConverterAsync } from '../../features/converters/html/async/converters/upload.js' + +export { defaultHTMLConvertersAsync } from '../../features/converters/html/async/defaultConverters.js' +export { convertLexicalToHTMLAsync } from '../../features/converters/html/async/index.js' +export type { + HTMLConverterAsync, + HTMLConvertersAsync, + HTMLConvertersFunctionAsync, +} from '../../features/converters/html/async/types.js' + +export type { + ProvidedCSS, + SerializedLexicalNodeWithParent, +} from '../../features/converters/html/shared/types.js' diff --git a/packages/richtext-lexical/src/exports/html/index.ts b/packages/richtext-lexical/src/exports/html/index.ts new file mode 100644 index 0000000000..614dd33aa1 --- /dev/null +++ b/packages/richtext-lexical/src/exports/html/index.ts @@ -0,0 +1,25 @@ +export type { + ProvidedCSS, + SerializedLexicalNodeWithParent, +} from '../../features/converters/html/shared/types.js' +export { BlockquoteHTMLConverter } from '../../features/converters/html/sync/converters/blockquote.js' +export { HeadingHTMLConverter } from '../../features/converters/html/sync/converters/heading.js' +export { HorizontalRuleHTMLConverter } from '../../features/converters/html/sync/converters/horizontalRule.js' +export { LinebreakHTMLConverter } from '../../features/converters/html/sync/converters/linebreak.js' +export { LinkHTMLConverter } from '../../features/converters/html/sync/converters/link.js' +export { ListHTMLConverter } from '../../features/converters/html/sync/converters/list.js' +export { ParagraphHTMLConverter } from '../../features/converters/html/sync/converters/paragraph.js' +export { TabHTMLConverter } from '../../features/converters/html/sync/converters/tab.js' +export { TableHTMLConverter } from '../../features/converters/html/sync/converters/table.js' + +export { TextHTMLConverter } from '../../features/converters/html/sync/converters/text.js' + +export { UploadHTMLConverter } from '../../features/converters/html/sync/converters/upload.js' +export { defaultHTMLConverters } from '../../features/converters/html/sync/defaultConverters.js' +export { convertLexicalToHTML } from '../../features/converters/html/sync/index.js' + +export type { + HTMLConverter, + HTMLConverters, + HTMLConvertersFunction, +} from '../../features/converters/html/sync/types.js' diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/tab.tsx b/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/tab.tsx deleted file mode 100644 index 63d66a216c..0000000000 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/tab.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import type { SerializedTabNode } from '../../../../../../nodeTypes.js' -import type { JSXConverters } from '../types.js' - -export const TabJSXConverter: JSXConverters = { - tab: ({ node }) => { - // Tab - return node.text - }, -} diff --git a/packages/richtext-lexical/src/exports/react/index.ts b/packages/richtext-lexical/src/exports/react/index.ts index 70de9c5d53..904fdf92cf 100644 --- a/packages/richtext-lexical/src/exports/react/index.ts +++ b/packages/richtext-lexical/src/exports/react/index.ts @@ -1,21 +1,24 @@ -export { BlockquoteJSXConverter } from './components/RichText/converter/converters/blockquote.js' -export { HeadingJSXConverter } from './components/RichText/converter/converters/heading.js' -export { HorizontalRuleJSXConverter } from './components/RichText/converter/converters/horizontalRule.js' -export { LinebreakJSXConverter } from './components/RichText/converter/converters/linebreak.js' -export { LinkJSXConverter } from './components/RichText/converter/converters/link.js' -export { ListJSXConverter } from './components/RichText/converter/converters/list.js' -export { ParagraphJSXConverter } from './components/RichText/converter/converters/paragraph.js' -export { TabJSXConverter } from './components/RichText/converter/converters/tab.js' -export { TableJSXConverter } from './components/RichText/converter/converters/table.js' -export { TextJSXConverter } from './components/RichText/converter/converters/text.js' +export { + type JSXConvertersFunction, + RichText, +} from '../../features/converters/jsx/Component/index.js' +export { BlockquoteJSXConverter } from '../../features/converters/jsx/converter/converters/blockquote.js' +export { HeadingJSXConverter } from '../../features/converters/jsx/converter/converters/heading.js' +export { HorizontalRuleJSXConverter } from '../../features/converters/jsx/converter/converters/horizontalRule.js' +export { LinebreakJSXConverter } from '../../features/converters/jsx/converter/converters/linebreak.js' +export { LinkJSXConverter } from '../../features/converters/jsx/converter/converters/link.js' +export { ListJSXConverter } from '../../features/converters/jsx/converter/converters/list.js' +export { ParagraphJSXConverter } from '../../features/converters/jsx/converter/converters/paragraph.js' +export { TabJSXConverter } from '../../features/converters/jsx/converter/converters/tab.js' +export { TableJSXConverter } from '../../features/converters/jsx/converter/converters/table.js' -export { UploadJSXConverter } from './components/RichText/converter/converters/upload.js' +export { TextJSXConverter } from '../../features/converters/jsx/converter/converters/text.js' -export { defaultJSXConverters } from './components/RichText/converter/defaultConverters.js' -export { convertLexicalNodesToJSX } from './components/RichText/converter/index.js' +export { UploadJSXConverter } from '../../features/converters/jsx/converter/converters/upload.js' +export { defaultJSXConverters } from '../../features/converters/jsx/converter/defaultConverters.js' +export { convertLexicalNodesToJSX } from '../../features/converters/jsx/converter/index.js' export type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent, -} from './components/RichText/converter/types.js' -export { type JSXConvertersFunction, RichText } from './components/RichText/index.js' +} from '../../features/converters/jsx/converter/types.js' diff --git a/packages/richtext-lexical/src/features/blockquote/markdownTransformer.ts b/packages/richtext-lexical/src/features/blockquote/markdownTransformer.ts index 262f0da045..394e3c1b34 100644 --- a/packages/richtext-lexical/src/features/blockquote/markdownTransformer.ts +++ b/packages/richtext-lexical/src/features/blockquote/markdownTransformer.ts @@ -1,5 +1,4 @@ import { $createQuoteNode, $isQuoteNode, QuoteNode } from '@lexical/rich-text' -import { $createLineBreakNode } from 'lexical' import type { ElementTransformer } from '../../packages/@lexical/markdown/index.js' @@ -23,10 +22,7 @@ export const MarkdownTransformer: ElementTransformer = { if (isImport) { const previousNode = parentNode.getPreviousSibling() if ($isQuoteNode(previousNode)) { - previousNode.splice(previousNode.getChildrenSize(), 0, [ - $createLineBreakNode(), - ...children, - ]) + previousNode.splice(previousNode.getChildrenSize(), 0, [...children]) previousNode.select(0, 0) parentNode.remove() return diff --git a/packages/richtext-lexical/src/features/blockquote/server/index.ts b/packages/richtext-lexical/src/features/blockquote/server/index.ts index 4f4ccfc1df..be87f77af7 100644 --- a/packages/richtext-lexical/src/features/blockquote/server/index.ts +++ b/packages/richtext-lexical/src/features/blockquote/server/index.ts @@ -4,7 +4,7 @@ import type { Spread } from 'lexical' import { QuoteNode } from '@lexical/rich-text' import { createServerFeature } from '../../../utilities/createServerFeature.js' -import { convertLexicalNodesToHTML } from '../../converters/html/converter/index.js' +import { convertLexicalNodesToHTML } from '../../converters/html_deprecated/converter/index.js' import { createNode } from '../../typeUtilities.js' import { MarkdownTransformer } from '../markdownTransformer.js' import { i18n } from './i18n.js' 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 a7348e12cc..5b17cda0ad 100644 --- a/packages/richtext-lexical/src/features/blocks/client/component/index.tsx +++ b/packages/richtext-lexical/src/features/blocks/client/component/index.tsx @@ -541,6 +541,7 @@ export const BlockComponent: React.FC = (props) => { return await onChange({ formState, submit: true }) }, ]} + el="div" fields={clientBlockFields} initialState={initialState} onChange={[onChange]} diff --git a/packages/richtext-lexical/src/features/blocks/client/componentInline/index.tsx b/packages/richtext-lexical/src/features/blocks/client/componentInline/index.tsx index 10330ddb3c..8b38497e41 100644 --- a/packages/richtext-lexical/src/features/blocks/client/componentInline/index.tsx +++ b/packages/richtext-lexical/src/features/blocks/client/componentInline/index.tsx @@ -391,6 +391,7 @@ export const InlineBlockComponent: React.FC = (props) => { }, ]} disableValidationOnSubmit + el="div" fields={clientBlock?.fields} initialState={initialState || {}} onChange={[onChange]} diff --git a/packages/richtext-lexical/src/features/blocks/server/nodes/BlocksNode.tsx b/packages/richtext-lexical/src/features/blocks/server/nodes/BlocksNode.tsx index 9f9c9bc384..37da8ec51a 100644 --- a/packages/richtext-lexical/src/features/blocks/server/nodes/BlocksNode.tsx +++ b/packages/richtext-lexical/src/features/blocks/server/nodes/BlocksNode.tsx @@ -95,8 +95,8 @@ export class ServerBlockNode extends DecoratorBlockNode { return false } - override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element | null { - return null + override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element { + return null as unknown as JSX.Element } override exportDOM(): DOMExportOutput { diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/blockquote.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/blockquote.ts new file mode 100644 index 0000000000..4c01250410 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/blockquote.ts @@ -0,0 +1,14 @@ +import type { SerializedQuoteNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const BlockquoteHTMLConverterAsync: HTMLConvertersAsync = { + quote: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return `${children}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/heading.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/heading.ts new file mode 100644 index 0000000000..26465d1bac --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/heading.ts @@ -0,0 +1,14 @@ +import type { SerializedHeadingNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const HeadingHTMLConverterAsync: HTMLConvertersAsync = { + heading: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return `<${node.tag}${providedStyleTag}>${children}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/horizontalRule.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/horizontalRule.ts new file mode 100644 index 0000000000..5d3c96c34a --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/horizontalRule.ts @@ -0,0 +1,5 @@ +import type { SerializedHorizontalRuleNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' +export const HorizontalRuleHTMLConverterAsync: HTMLConvertersAsync = { + horizontalrule: '
', +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/linebreak.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/linebreak.ts new file mode 100644 index 0000000000..148b4cbad2 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/linebreak.ts @@ -0,0 +1,6 @@ +import type { SerializedLineBreakNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const LinebreakHTMLConverterAsync: HTMLConvertersAsync = { + linebreak: '
', +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/link.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/link.ts new file mode 100644 index 0000000000..0799726015 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/link.ts @@ -0,0 +1,56 @@ +import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync, HTMLPopulateFn } from '../types.js' + +export const LinkHTMLConverterAsync: (args: { + internalDocToHref?: (args: { + linkNode: SerializedLinkNode + populate?: HTMLPopulateFn + }) => Promise | string +}) => HTMLConvertersAsync = ({ + internalDocToHref, +}) => ({ + autolink: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined + const target: string | undefined = node.fields.newTab ? '_blank' : undefined + + return `( + + ${children} + + )` + }, + link: async ({ node, nodesToHTML, populate, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined + const target: string | undefined = node.fields.newTab ? '_blank' : undefined + + let href: string = node.fields.url ?? '' + if (node.fields.linkType === 'internal') { + if (internalDocToHref) { + href = await internalDocToHref({ linkNode: node, populate }) + } else { + console.error( + 'Lexical => HTML converter: Link converter: found internal link, but internalDocToHref is not provided', + ) + href = '#' // fallback + } + } + + return `( + + ${children} + + )` + }, +}) diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/list.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/list.ts new file mode 100644 index 0000000000..c72689c21c --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/list.ts @@ -0,0 +1,53 @@ +import { v4 as uuidv4 } from 'uuid' + +import type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const ListHTMLConverterAsync: HTMLConvertersAsync< + SerializedListItemNode | SerializedListNode +> = { + list: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return `<${node.tag}${providedStyleTag} class="list-${node.listType}">${children}` + }, + listitem: async ({ node, nodesToHTML, parent, providedCSSString }) => { + const hasSubLists = node.children.some((child) => child.type === 'list') + + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + if ('listType' in parent && parent?.listType === 'check') { + const uuid = uuidv4() + return `` + } else { + return `
  • ${children}
  • ` + } + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/paragraph.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/paragraph.ts new file mode 100644 index 0000000000..8db85b674b --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/paragraph.ts @@ -0,0 +1,16 @@ +import type { SerializedParagraphNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const ParagraphHTMLConverterAsync: HTMLConvertersAsync = { + paragraph: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = await nodesToHTML({ + nodes: node.children, + }) + + if (!children?.length) { + return `

    ` + } + + return `${children.join('')}

    ` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/tab.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/tab.ts new file mode 100644 index 0000000000..1c68e9a747 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/tab.ts @@ -0,0 +1,6 @@ +import type { SerializedTabNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const TabHTMLConverterAsync: HTMLConvertersAsync = { + tab: '\t', +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/table.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/table.ts new file mode 100644 index 0000000000..5a412e44d1 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/table.ts @@ -0,0 +1,65 @@ +import type { + SerializedTableCellNode, + SerializedTableNode, + SerializedTableRowNode, +} from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const TableHTMLConverterAsync: HTMLConvertersAsync< + SerializedTableCellNode | SerializedTableNode | SerializedTableRowNode +> = { + table: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return ` +
    + ${children} +
    +
    ` + }, + + tablecell: async ({ node, nodesToHTML, providedCSSString }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + const TagName = node.headerState > 0 ? 'th' : 'td' + const headerStateClass = `lexical-table-cell-header-${node.headerState}` + + let style = 'border: 1px solid #ccc; padding: 8px;' + providedCSSString + if (node.backgroundColor) { + style += ` background-color: ${node.backgroundColor};` + } + + const colSpanAttr = node.colSpan && node.colSpan > 1 ? ` colspan="${node.colSpan}"` : '' + const rowSpanAttr = node.rowSpan && node.rowSpan > 1 ? ` rowspan="${node.rowSpan}"` : '' + + return `<${TagName} + class="lexical-table-cell ${headerStateClass}" + ${colSpanAttr} + ${rowSpanAttr} + style="${style}" + > + ${children} + + ` + }, + + tablerow: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return ` + ${children} + ` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/text.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/text.ts new file mode 100644 index 0000000000..1ecfd5a900 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/text.ts @@ -0,0 +1,34 @@ +import type { SerializedTextNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +import { NodeFormat } from '../../../../../lexical/utils/nodeFormat.js' + +export const TextHTMLConverterAsync: HTMLConvertersAsync = { + text: ({ node }) => { + let text = node.text + + if (node.format & NodeFormat.IS_BOLD) { + text = `${text}` + } + if (node.format & NodeFormat.IS_ITALIC) { + text = `${text}` + } + if (node.format & NodeFormat.IS_STRIKETHROUGH) { + text = `${text}` + } + if (node.format & NodeFormat.IS_UNDERLINE) { + text = `${text}` + } + if (node.format & NodeFormat.IS_CODE) { + text = `${text}` + } + if (node.format & NodeFormat.IS_SUBSCRIPT) { + text = `${text}` + } + if (node.format & NodeFormat.IS_SUPERSCRIPT) { + text = `${text}` + } + + return text + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/upload.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/upload.ts new file mode 100644 index 0000000000..7ff32453fd --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/upload.ts @@ -0,0 +1,87 @@ +import type { FileData, FileSizeImproved, TypeWithID } from 'payload' + +import type { SerializedUploadNode } from '../../../../../nodeTypes.js' +import type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const UploadHTMLConverterAsync: HTMLConvertersAsync = { + upload: async ({ node, populate, providedStyleTag }) => { + const uploadNode = node as UploadDataImproved + + let uploadDoc: (FileData & TypeWithID) | undefined = undefined + + // If there's no valid upload data, populate return an empty string + if (typeof uploadNode.value !== 'object') { + if (!populate) { + return '' + } + uploadDoc = await populate({ + id: uploadNode.value, + collectionSlug: uploadNode.relationTo, + }) + } else { + uploadDoc = uploadNode.value as unknown as FileData & TypeWithID + } + + if (!uploadDoc) { + return '' + } + + const url = uploadDoc.url + + // 1) If upload is NOT an image, return a link + if (!uploadDoc.mimeType.startsWith('image')) { + return `${uploadDoc.filename}` + } + + // 2) If image has no different sizes, return a simple + if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) { + return ` + + ` + } + + // 3) If image has different sizes, build a element with tags + let pictureHTML = '' + + for (const size in uploadDoc.sizes) { + const imageSize = uploadDoc.sizes[size] as FileSizeImproved + + if ( + !imageSize || + !imageSize.width || + !imageSize.height || + !imageSize.mimeType || + !imageSize.filesize || + !imageSize.filename || + !imageSize.url + ) { + continue + } + + pictureHTML += ` + + ` + } + + pictureHTML += ` + ${uploadDoc.filename} + ` + + return `${pictureHTML}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/defaultConverters.ts b/packages/richtext-lexical/src/features/converters/html/async/defaultConverters.ts new file mode 100644 index 0000000000..2ff3650dcb --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/defaultConverters.ts @@ -0,0 +1,28 @@ +import type { DefaultNodeTypes } from '../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from './types.js' + +import { BlockquoteHTMLConverterAsync } from './converters/blockquote.js' +import { HeadingHTMLConverterAsync } from './converters/heading.js' +import { HorizontalRuleHTMLConverterAsync } from './converters/horizontalRule.js' +import { LinebreakHTMLConverterAsync } from './converters/linebreak.js' +import { LinkHTMLConverterAsync } from './converters/link.js' +import { ListHTMLConverterAsync } from './converters/list.js' +import { ParagraphHTMLConverterAsync } from './converters/paragraph.js' +import { TabHTMLConverterAsync } from './converters/tab.js' +import { TableHTMLConverterAsync } from './converters/table.js' +import { TextHTMLConverterAsync } from './converters/text.js' +import { UploadHTMLConverterAsync } from './converters/upload.js' + +export const defaultHTMLConvertersAsync: HTMLConvertersAsync = { + ...ParagraphHTMLConverterAsync, + ...TextHTMLConverterAsync, + ...LinebreakHTMLConverterAsync, + ...BlockquoteHTMLConverterAsync, + ...TableHTMLConverterAsync, + ...HeadingHTMLConverterAsync, + ...HorizontalRuleHTMLConverterAsync, + ...ListHTMLConverterAsync, + ...LinkHTMLConverterAsync({}), + ...UploadHTMLConverterAsync, + ...TabHTMLConverterAsync, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/field/index.ts b/packages/richtext-lexical/src/features/converters/html/async/field/index.ts new file mode 100644 index 0000000000..28f7d87f44 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/field/index.ts @@ -0,0 +1,93 @@ +import type { SerializedEditorState } from 'lexical' +import type { Field } from 'payload' + +import type { HTMLConvertersAsync, HTMLConvertersFunctionAsync } from '../types.js' + +import { getPayloadPopulateFn } from '../../../utilities/payloadPopulateFn.js' +import { convertLexicalToHTMLAsync } from '../index.js' + +type Args = { + converters?: HTMLConvertersAsync | HTMLConvertersFunctionAsync + /** + * Whether the lexicalHTML field should be hidden in the admin panel + * + * @default true + */ + hidden?: boolean + htmlFieldName: string + /** + * A string which matches the lexical field name you want to convert to HTML. + * + * This has to be a sibling field of this lexicalHTML field - otherwise, it won't be able to find the lexical field. + **/ + lexicalFieldName: string + /** + * Whether the HTML should be stored in the database + * + * @default false + */ + storeInDB?: boolean +} + +/** + * + * Field that converts a sibling lexical field to HTML + * + * @todo will be renamed to lexicalHTML in 4.0, replacing the deprecated `lexicalHTML` converter + */ +export const lexicalHTMLField: (args: Args) => Field = (args) => { + const { converters, hidden = true, htmlFieldName, lexicalFieldName, storeInDB = false } = args + return { + name: htmlFieldName, + type: 'code', + admin: { + editorOptions: { + language: 'html', + }, + hidden, + }, + hooks: { + afterRead: [ + async ({ + currentDepth, + depth, + draft, + overrideAccess, + req, + showHiddenFields, + siblingData, + }) => { + const lexicalFieldData: SerializedEditorState = siblingData[lexicalFieldName] + + if (!lexicalFieldData) { + return '' + } + + const htmlPopulateFn = await getPayloadPopulateFn({ + currentDepth: currentDepth ?? 0, + depth: depth ?? req.payload.config.defaultDepth, + draft: draft ?? false, + overrideAccess: overrideAccess ?? false, + req, + showHiddenFields: showHiddenFields ?? false, + }) + + return await convertLexicalToHTMLAsync({ + converters, + data: lexicalFieldData, + populate: htmlPopulateFn, + }) + }, + ], + beforeChange: [ + ({ siblingData, value }) => { + if (storeInDB) { + return value + } + delete siblingData[htmlFieldName] + return null + }, + ], + }, + } +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/index.ts b/packages/richtext-lexical/src/features/converters/html/async/index.ts new file mode 100644 index 0000000000..9ca4a7f018 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/index.ts @@ -0,0 +1,157 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ +import type { SerializedEditorState, SerializedLexicalNode } from 'lexical' + +import type { SerializedLexicalNodeWithParent } from '../shared/types.js' +import type { + HTMLConverterAsync, + HTMLConvertersAsync, + HTMLConvertersFunctionAsync, + HTMLPopulateFn, +} from './types.js' + +import { hasText } from '../../../../validate/hasText.js' +import { findConverterForNode } from '../shared/findConverterForNode.js' +import { defaultHTMLConvertersAsync } from './defaultConverters.js' + +export type ConvertLexicalToHTMLAsyncArgs = { + /** + * Override class names for the container. + */ + className?: string + converters?: HTMLConvertersAsync | HTMLConvertersFunctionAsync + data: SerializedEditorState + /** + * If true, removes the container div wrapper. + */ + disableContainer?: boolean + /** + * If true, disables indentation globally. If an array, disables for specific node `type` values. + */ + disableIndent?: boolean | string[] + /** + * If true, disables text alignment globally. If an array, disables for specific node `type` values. + */ + disableTextAlign?: boolean | string[] + populate?: HTMLPopulateFn +} + +export async function convertLexicalToHTMLAsync({ + className, + converters, + data, + disableContainer, + disableIndent, + disableTextAlign, + populate, +}: ConvertLexicalToHTMLAsyncArgs): Promise { + if (hasText(data)) { + let finalConverters: HTMLConvertersAsync = {} + if (converters) { + if (typeof converters === 'function') { + finalConverters = converters({ defaultConverters: defaultHTMLConvertersAsync }) + } else { + finalConverters = converters + } + } else { + finalConverters = defaultHTMLConvertersAsync + } + + const html = ( + await convertLexicalNodesToHTMLAsync({ + converters: finalConverters, + disableIndent, + disableTextAlign, + nodes: data?.root?.children, + parent: data?.root, + populate, + }) + ).join('') + + if (disableContainer) { + return html + } else { + return `
    ${html}
    ` + } + } + if (disableContainer) { + return '' + } else { + return `
    ` + } +} + +export async function convertLexicalNodesToHTMLAsync({ + converters, + disableIndent, + disableTextAlign, + nodes, + parent, + populate, +}: { + converters: HTMLConvertersAsync + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent: SerializedLexicalNodeWithParent + populate?: HTMLPopulateFn +}): Promise { + const unknownConverter: HTMLConverterAsync = converters.unknown as HTMLConverterAsync + + const htmlArray: string[] = [] + + let i = -1 + for (const node of nodes) { + i++ + const { converterForNode, providedCSSString, providedStyleTag } = findConverterForNode({ + converters, + disableIndent, + disableTextAlign, + node, + unknownConverter, + }) + + try { + let nodeHTML: string + + if (converterForNode) { + const converted = + typeof converterForNode === 'function' + ? await converterForNode({ + childIndex: i, + converters, + node, + populate, + + nodesToHTML: async (args) => { + return await convertLexicalNodesToHTMLAsync({ + converters: args.converters ?? converters, + disableIndent: args.disableIndent ?? disableIndent, + disableTextAlign: args.disableTextAlign ?? disableTextAlign, + nodes: args.nodes, + parent: args.parent ?? { + ...node, + parent, + }, + populate, + }) + }, + parent, + providedCSSString, + providedStyleTag, + }) + : converterForNode + nodeHTML = converted + } else { + nodeHTML = 'unknown node' + } + + htmlArray.push(nodeHTML) + } catch (error) { + console.error('Error converting lexical node to HTML:', error, 'node:', node) + htmlArray.push('') + } + } + + return htmlArray.filter(Boolean) +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/types.ts b/packages/richtext-lexical/src/features/converters/html/async/types.ts new file mode 100644 index 0000000000..04e5115a86 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/types.ts @@ -0,0 +1,93 @@ +import type { SerializedLexicalNode } from 'lexical' +import type { SelectType, TypeWithID } from 'payload' + +import type { + DefaultNodeTypes, + SerializedBlockNode, + SerializedInlineBlockNode, +} from '../../../../nodeTypes.js' +import type { SerializedLexicalNodeWithParent } from '../shared/types.js' +export type HTMLPopulateArguments = { + collectionSlug: string + id: number | string + select?: SelectType +} + +export type HTMLPopulateFn = ( + args: HTMLPopulateArguments, +) => Promise + +export type HTMLConverterAsync< + T extends { [key: string]: any; type?: string } = SerializedLexicalNode, +> = + | ((args: { + childIndex: number + converters: HTMLConvertersAsync + node: T + nodesToHTML: (args: { + converters?: HTMLConvertersAsync + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent?: SerializedLexicalNodeWithParent + }) => Promise + parent: SerializedLexicalNodeWithParent + populate?: HTMLPopulateFn + providedCSSString: string + providedStyleTag: string + }) => Promise | string) + | string + +export type HTMLConvertersAsync< + T extends { [key: string]: any; type?: string } = + | DefaultNodeTypes + | SerializedBlockNode<{ blockName?: null | string; blockType: string }> // need these to ensure types for blocks and inlineBlocks work if no generics are provided + | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, // need these to ensure types for blocks and inlineBlocks work if no generics are provided +> = { + [key: string]: + | { + [blockSlug: string]: HTMLConverterAsync + } + | HTMLConverterAsync + | undefined +} & { + [nodeType in Exclude, 'block' | 'inlineBlock'>]?: HTMLConverterAsync< + Extract + > +} & { + blocks?: { + [K in Extract< + Extract extends SerializedBlockNode + ? B extends { blockType: string } + ? B['blockType'] + : never + : never, + string + >]?: HTMLConverterAsync< + Extract extends SerializedBlockNode + ? SerializedBlockNode> + : SerializedBlockNode + > + } + inlineBlocks?: { + [K in Extract< + Extract extends SerializedInlineBlockNode + ? B extends { blockType: string } + ? B['blockType'] + : never + : never, + string + >]?: HTMLConverterAsync< + Extract extends SerializedInlineBlockNode + ? SerializedInlineBlockNode> + : SerializedInlineBlockNode + > + } +} + +export type HTMLConvertersFunctionAsync< + T extends { [key: string]: any; type?: string } = + | DefaultNodeTypes + | SerializedBlockNode<{ blockName?: null | string }> + | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, +> = (args: { defaultConverters: HTMLConvertersAsync }) => HTMLConvertersAsync diff --git a/packages/richtext-lexical/src/features/converters/html/shared/findConverterForNode.ts b/packages/richtext-lexical/src/features/converters/html/shared/findConverterForNode.ts new file mode 100644 index 0000000000..0b1b96c74a --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/shared/findConverterForNode.ts @@ -0,0 +1,101 @@ +import type { SerializedLexicalNode } from 'lexical' + +import type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js' +import type { HTMLConverterAsync, HTMLConvertersAsync } from '../async/types.js' +import type { HTMLConverter, HTMLConverters } from '../sync/types.js' +import type { ProvidedCSS } from './types.js' + +export function findConverterForNode< + TConverters extends HTMLConverters | HTMLConvertersAsync, + TConverter extends HTMLConverter | HTMLConverterAsync, +>({ + converters, + disableIndent, + disableTextAlign, + node, + unknownConverter, +}: { + converters: TConverters + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + node: SerializedLexicalNode + unknownConverter: TConverter +}): { + converterForNode: TConverter | undefined + providedCSSString: string + providedStyleTag: string +} { + let converterForNode: TConverter | undefined + if (node.type === 'block') { + converterForNode = converters?.blocks?.[ + (node as SerializedBlockNode)?.fields?.blockType + ] as TConverter + if (!converterForNode) { + console.error( + `Lexical => HTML converter: Blocks converter: found ${(node as SerializedBlockNode)?.fields?.blockType} block, but no converter is provided`, + ) + } + } else if (node.type === 'inlineBlock') { + converterForNode = converters?.inlineBlocks?.[ + (node as SerializedInlineBlockNode)?.fields?.blockType + ] as TConverter + if (!converterForNode) { + console.error( + `Lexical => HTML converter: Inline Blocks converter: found ${(node as SerializedInlineBlockNode)?.fields?.blockType} inline block, but no converter is provided`, + ) + } + } else { + converterForNode = converters[node.type] as TConverter + } + + const style: ProvidedCSS = {} + + // Check if disableTextAlign is not true and does not include node type + if ( + !disableTextAlign && + (!Array.isArray(disableTextAlign) || !disableTextAlign?.includes(node.type)) + ) { + if ('format' in node && node.format) { + switch (node.format) { + case 'center': + style['text-align'] = 'center' + break + case 'end': + style['text-align'] = 'right' + break + case 'justify': + style['text-align'] = 'justify' + break + case 'left': + //style['text-align'] = 'left' + // Do nothing, as left is the default + break + case 'right': + style['text-align'] = 'right' + break + case 'start': + style['text-align'] = 'left' + break + } + } + } + + if (!disableIndent && (!Array.isArray(disableIndent) || !disableIndent?.includes(node.type))) { + if ('indent' in node && node.indent && node.type !== 'listitem') { + style['padding-inline-start'] = `${Number(node.indent) * 2}em` + } + } + + let providedCSSString: string = '' + for (const key of Object.keys(style)) { + // @ts-expect-error we're iterating over the keys of the object + providedCSSString += `${key}: ${style[key]};` + } + const providedStyleTag = providedCSSString?.length ? ` style="${providedCSSString}"` : '' + + return { + converterForNode: converterForNode ?? unknownConverter, + providedCSSString, + providedStyleTag, + } +} diff --git a/packages/richtext-lexical/src/features/converters/html/shared/types.ts b/packages/richtext-lexical/src/features/converters/html/shared/types.ts new file mode 100644 index 0000000000..d82e65164c --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/shared/types.ts @@ -0,0 +1,10 @@ +import type { SerializedLexicalNode } from 'lexical' + +export type ProvidedCSS = { + 'padding-inline-start'?: string + 'text-align'?: string +} + +export type SerializedLexicalNodeWithParent = { + parent?: SerializedLexicalNode +} & SerializedLexicalNode diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/blockquote.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/blockquote.ts new file mode 100644 index 0000000000..56b69844d9 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/blockquote.ts @@ -0,0 +1,12 @@ +import type { SerializedQuoteNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const BlockquoteHTMLConverter: HTMLConverters = { + quote: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return `${children}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/heading.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/heading.ts new file mode 100644 index 0000000000..11ccd154e5 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/heading.ts @@ -0,0 +1,12 @@ +import type { SerializedHeadingNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const HeadingHTMLConverter: HTMLConverters = { + heading: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return `<${node.tag}${providedStyleTag}>${children}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/horizontalRule.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/horizontalRule.ts new file mode 100644 index 0000000000..eb0c3788b2 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/horizontalRule.ts @@ -0,0 +1,5 @@ +import type { SerializedHorizontalRuleNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' +export const HorizontalRuleHTMLConverter: HTMLConverters = { + horizontalrule: '
    ', +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/linebreak.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/linebreak.ts new file mode 100644 index 0000000000..76dc5b80fe --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/linebreak.ts @@ -0,0 +1,6 @@ +import type { SerializedLineBreakNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const LinebreakHTMLConverter: HTMLConverters = { + linebreak: '
    ', +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/link.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/link.ts new file mode 100644 index 0000000000..e69a461d9a --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/link.ts @@ -0,0 +1,47 @@ +import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const LinkHTMLConverter: (args: { + internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string +}) => HTMLConverters = ({ internalDocToHref }) => ({ + autolink: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined + const target: string | undefined = node.fields.newTab ? '_blank' : undefined + + return `( + + ${children} + + )` + }, + link: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined + const target: string | undefined = node.fields.newTab ? '_blank' : undefined + + let href: string = node.fields.url ?? '' + if (node.fields.linkType === 'internal') { + if (internalDocToHref) { + href = internalDocToHref({ linkNode: node }) + } else { + console.error( + 'Lexical => HTML converter: Link converter: found internal link, but internalDocToHref is not provided', + ) + href = '#' // fallback + } + } + + return `( + + ${children} + + )` + }, +}) diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/list.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/list.ts new file mode 100644 index 0000000000..57a6de62e9 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/list.ts @@ -0,0 +1,47 @@ +import { v4 as uuidv4 } from 'uuid' + +import type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const ListHTMLConverter: HTMLConverters = { + list: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return `<${node.tag}${providedStyleTag} class="list-${node.listType}">${children}` + }, + listitem: ({ node, nodesToHTML, parent, providedCSSString }) => { + const hasSubLists = node.children.some((child) => child.type === 'list') + + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + if ('listType' in parent && parent?.listType === 'check') { + const uuid = uuidv4() + return `` + } else { + return `
  • ${children}
  • ` + } + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/paragraph.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/paragraph.ts new file mode 100644 index 0000000000..1065e69204 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/paragraph.ts @@ -0,0 +1,16 @@ +import type { SerializedParagraphNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const ParagraphHTMLConverter: HTMLConverters = { + paragraph: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }) + + if (!children?.length) { + return `

    ` + } + + return `${children.join('')}

    ` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/tab.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/tab.ts new file mode 100644 index 0000000000..da70ac9419 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/tab.ts @@ -0,0 +1,6 @@ +import type { SerializedTabNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const TabHTMLConverter: HTMLConverters = { + tab: '\t', +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/table.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/table.ts new file mode 100644 index 0000000000..40bfdfdc7c --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/table.ts @@ -0,0 +1,59 @@ +import type { + SerializedTableCellNode, + SerializedTableNode, + SerializedTableRowNode, +} from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const TableHTMLConverter: HTMLConverters< + SerializedTableCellNode | SerializedTableNode | SerializedTableRowNode +> = { + table: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return ` + + ${children} +
    +
    ` + }, + + tablecell: ({ node, nodesToHTML, providedCSSString }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + const TagName = node.headerState > 0 ? 'th' : 'td' + const headerStateClass = `lexical-table-cell-header-${node.headerState}` + + let style = 'border: 1px solid #ccc; padding: 8px;' + providedCSSString + if (node.backgroundColor) { + style += ` background-color: ${node.backgroundColor};` + } + + const colSpanAttr = node.colSpan && node.colSpan > 1 ? ` colspan="${node.colSpan}"` : '' + const rowSpanAttr = node.rowSpan && node.rowSpan > 1 ? ` rowspan="${node.rowSpan}"` : '' + + return `<${TagName} + class="lexical-table-cell ${headerStateClass}" + ${colSpanAttr} + ${rowSpanAttr} + style="${style}" + > + ${children} + + ` + }, + + tablerow: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return ` + ${children} + ` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/text.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/text.ts new file mode 100644 index 0000000000..b78955e734 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/text.ts @@ -0,0 +1,34 @@ +import type { SerializedTextNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +import { NodeFormat } from '../../../../../lexical/utils/nodeFormat.js' + +export const TextHTMLConverter: HTMLConverters = { + text: ({ node }) => { + let text = node.text + + if (node.format & NodeFormat.IS_BOLD) { + text = `${text}` + } + if (node.format & NodeFormat.IS_ITALIC) { + text = `${text}` + } + if (node.format & NodeFormat.IS_STRIKETHROUGH) { + text = `${text}` + } + if (node.format & NodeFormat.IS_UNDERLINE) { + text = `${text}` + } + if (node.format & NodeFormat.IS_CODE) { + text = `${text}` + } + if (node.format & NodeFormat.IS_SUBSCRIPT) { + text = `${text}` + } + if (node.format & NodeFormat.IS_SUPERSCRIPT) { + text = `${text}` + } + + return text + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/upload.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/upload.ts new file mode 100644 index 0000000000..fbd15863eb --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/upload.ts @@ -0,0 +1,81 @@ +import type { FileData, FileSizeImproved, TypeWithID } from 'payload' + +import type { SerializedUploadNode } from '../../../../../nodeTypes.js' +import type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js' +import type { HTMLConverters } from '../types.js' + +export const UploadHTMLConverter: HTMLConverters = { + upload: ({ node, providedStyleTag }) => { + const uploadNode = node as UploadDataImproved + + let uploadDoc: (FileData & TypeWithID) | undefined = undefined + + // If there's no valid upload data, populate return an empty string + if (typeof uploadNode.value !== 'object') { + return '' + } else { + uploadDoc = uploadNode.value as unknown as FileData & TypeWithID + } + + if (!uploadDoc) { + return '' + } + + const url = uploadDoc.url + + // 1) If upload is NOT an image, return a link + if (!uploadDoc.mimeType.startsWith('image')) { + return `${uploadDoc.filename}` + } + + // 2) If image has no different sizes, return a simple + if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) { + return ` + + ` + } + + // 3) If image has different sizes, build a element with tags + let pictureHTML = '' + + for (const size in uploadDoc.sizes) { + const imageSize = uploadDoc.sizes[size] as FileSizeImproved + + if ( + !imageSize || + !imageSize.width || + !imageSize.height || + !imageSize.mimeType || + !imageSize.filesize || + !imageSize.filename || + !imageSize.url + ) { + continue + } + + pictureHTML += ` + + ` + } + + pictureHTML += ` + ${uploadDoc.filename} + ` + + return `${pictureHTML}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/defaultConverters.ts b/packages/richtext-lexical/src/features/converters/html/sync/defaultConverters.ts new file mode 100644 index 0000000000..d9f1913ea3 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/defaultConverters.ts @@ -0,0 +1,28 @@ +import type { DefaultNodeTypes } from '../../../../nodeTypes.js' +import type { HTMLConverters } from './types.js' + +import { BlockquoteHTMLConverter } from './converters/blockquote.js' +import { HeadingHTMLConverter } from './converters/heading.js' +import { HorizontalRuleHTMLConverter } from './converters/horizontalRule.js' +import { LinebreakHTMLConverter } from './converters/linebreak.js' +import { LinkHTMLConverter } from './converters/link.js' +import { ListHTMLConverter } from './converters/list.js' +import { ParagraphHTMLConverter } from './converters/paragraph.js' +import { TabHTMLConverter } from './converters/tab.js' +import { TableHTMLConverter } from './converters/table.js' +import { TextHTMLConverter } from './converters/text.js' +import { UploadHTMLConverter } from './converters/upload.js' + +export const defaultHTMLConverters: HTMLConverters = { + ...ParagraphHTMLConverter, + ...TextHTMLConverter, + ...LinebreakHTMLConverter, + ...BlockquoteHTMLConverter, + ...TableHTMLConverter, + ...HeadingHTMLConverter, + ...HorizontalRuleHTMLConverter, + ...ListHTMLConverter, + ...LinkHTMLConverter({}), + ...UploadHTMLConverter, + ...TabHTMLConverter, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/index.ts b/packages/richtext-lexical/src/features/converters/html/sync/index.ts new file mode 100644 index 0000000000..08ba5a1483 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/index.ts @@ -0,0 +1,142 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ +import type { SerializedEditorState, SerializedLexicalNode } from 'lexical' + +import type { SerializedLexicalNodeWithParent } from '../shared/types.js' +import type { HTMLConverter, HTMLConverters, HTMLConvertersFunction } from './types.js' + +import { hasText } from '../../../../validate/hasText.js' +import { findConverterForNode } from '../shared/findConverterForNode.js' +import { defaultHTMLConverters } from './defaultConverters.js' + +export type ConvertLexicalToHTMLArgs = { + /** + * Override class names for the container. + */ + className?: string + converters?: HTMLConverters | HTMLConvertersFunction + data: SerializedEditorState + /** + * If true, removes the container div wrapper. + */ + disableContainer?: boolean + /** + * If true, disables indentation globally. If an array, disables for specific node `type` values. + */ + disableIndent?: boolean | string[] + /** + * If true, disables text alignment globally. If an array, disables for specific node `type` values. + */ + disableTextAlign?: boolean | string[] +} + +export function convertLexicalToHTML({ + className, + converters, + data, + disableContainer, + disableIndent, + disableTextAlign, +}: ConvertLexicalToHTMLArgs): string { + if (hasText(data)) { + let finalConverters: HTMLConverters = {} + if (converters) { + if (typeof converters === 'function') { + finalConverters = converters({ defaultConverters: defaultHTMLConverters }) + } else { + finalConverters = converters + } + } else { + finalConverters = defaultHTMLConverters + } + + const html = convertLexicalNodesToHTML({ + converters: finalConverters, + disableIndent, + disableTextAlign, + nodes: data?.root?.children, + parent: data?.root, + }).join('') + + if (disableContainer) { + return html + } else { + return `
    ${html}
    ` + } + } + if (disableContainer) { + return '' + } else { + return `
    ` + } +} + +export function convertLexicalNodesToHTML({ + converters, + disableIndent, + disableTextAlign, + nodes, + parent, +}: { + converters: HTMLConverters + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent: SerializedLexicalNodeWithParent +}): string[] { + const unknownConverter: HTMLConverter = converters.unknown as HTMLConverter + + const htmlArray: string[] = [] + + let i = -1 + for (const node of nodes) { + i++ + const { converterForNode, providedCSSString, providedStyleTag } = findConverterForNode({ + converters, + disableIndent, + disableTextAlign, + node, + unknownConverter, + }) + + try { + let nodeHTML: string + + if (converterForNode) { + const converted = + typeof converterForNode === 'function' + ? converterForNode({ + childIndex: i, + converters, + node, + nodesToHTML: (args) => { + return convertLexicalNodesToHTML({ + converters: args.converters ?? converters, + disableIndent: args.disableIndent ?? disableIndent, + disableTextAlign: args.disableTextAlign ?? disableTextAlign, + nodes: args.nodes, + parent: args.parent ?? { + ...node, + parent, + }, + }) + }, + parent, + providedCSSString, + providedStyleTag, + }) + : converterForNode + nodeHTML = converted + } else { + nodeHTML = 'unknown node' + } + + htmlArray.push(nodeHTML) + } catch (error) { + console.error('Error converting lexical node to HTML:', error, 'node:', node) + htmlArray.push('') + } + } + + return htmlArray.filter(Boolean) +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/types.ts b/packages/richtext-lexical/src/features/converters/html/sync/types.ts new file mode 100644 index 0000000000..fa03dc7522 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/types.ts @@ -0,0 +1,81 @@ +import type { SerializedLexicalNode } from 'lexical' + +import type { + DefaultNodeTypes, + SerializedBlockNode, + SerializedInlineBlockNode, +} from '../../../../nodeTypes.js' +import type { SerializedLexicalNodeWithParent } from '../shared/types.js' + +export type HTMLConverter = + + | ((args: { + childIndex: number + converters: HTMLConverters + node: T + nodesToHTML: (args: { + converters?: HTMLConverters + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent?: SerializedLexicalNodeWithParent + }) => string[] + parent: SerializedLexicalNodeWithParent + providedCSSString: string + providedStyleTag: string + }) => string) + | string + +export type HTMLConverters< + T extends { [key: string]: any; type?: string } = + | DefaultNodeTypes + | SerializedBlockNode<{ blockName?: null | string; blockType: string }> // need these to ensure types for blocks and inlineBlocks work if no generics are provided + | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, // need these to ensure types for blocks and inlineBlocks work if no generics are provided +> = { + [key: string]: + | { + [blockSlug: string]: HTMLConverter + } + | HTMLConverter + | undefined +} & { + [nodeType in Exclude, 'block' | 'inlineBlock'>]?: HTMLConverter< + Extract + > +} & { + blocks?: { + [K in Extract< + Extract extends SerializedBlockNode + ? B extends { blockType: string } + ? B['blockType'] + : never + : never, + string + >]?: HTMLConverter< + Extract extends SerializedBlockNode + ? SerializedBlockNode> + : SerializedBlockNode + > + } + inlineBlocks?: { + [K in Extract< + Extract extends SerializedInlineBlockNode + ? B extends { blockType: string } + ? B['blockType'] + : never + : never, + string + >]?: HTMLConverter< + Extract extends SerializedInlineBlockNode + ? SerializedInlineBlockNode> + : SerializedInlineBlockNode + > + } +} + +export type HTMLConvertersFunction< + T extends { [key: string]: any; type?: string } = + | DefaultNodeTypes + | SerializedBlockNode<{ blockName?: null | string }> + | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, +> = (args: { defaultConverters: HTMLConverters }) => HTMLConverters diff --git a/packages/richtext-lexical/src/features/converters/htmlToLexical/index.ts b/packages/richtext-lexical/src/features/converters/htmlToLexical/index.ts new file mode 100644 index 0000000000..1db2425df5 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/htmlToLexical/index.ts @@ -0,0 +1,50 @@ +import { createHeadlessEditor } from '@lexical/headless' +import { $getRoot, $getSelection, type SerializedLexicalNode } from 'lexical' + +import type { SanitizedServerEditorConfig } from '../../../lexical/config/types.js' +import type { DefaultNodeTypes, TypedEditorState } from '../../../nodeTypes.js' + +import {} from '../../../lexical/config/server/sanitize.js' +import { getEnabledNodes } from '../../../lexical/nodes/index.js' +import { $generateNodesFromDOM } from '../../../lexical-proxy/@lexical-html.js' + +export const convertHTMLToLexical = ({ + editorConfig, + html, + JSDOM, +}: { + editorConfig: SanitizedServerEditorConfig + html: string + JSDOM: new (html: string) => { + window: { + document: Document + } + } +}): TypedEditorState => { + const headlessEditor = createHeadlessEditor({ + nodes: getEnabledNodes({ + editorConfig, + }), + }) + + headlessEditor.update( + () => { + const dom = new JSDOM(html) + + const nodes = $generateNodesFromDOM(headlessEditor, dom.window.document) + + $getRoot().select() + + const selection = $getSelection() + if (selection === null) { + throw new Error('Selection is null') + } + selection.insertNodes(nodes) + }, + { discrete: true }, + ) + + const editorJSON = headlessEditor.getEditorState().toJSON() + + return editorJSON as TypedEditorState +} diff --git a/packages/richtext-lexical/src/features/converters/html/converter/converters/linebreak.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/linebreak.ts similarity index 100% rename from packages/richtext-lexical/src/features/converters/html/converter/converters/linebreak.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/linebreak.ts diff --git a/packages/richtext-lexical/src/features/converters/html/converter/converters/paragraph.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/paragraph.ts similarity index 100% rename from packages/richtext-lexical/src/features/converters/html/converter/converters/paragraph.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/paragraph.ts diff --git a/packages/richtext-lexical/src/features/converters/html/converter/converters/tab.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/tab.ts similarity index 100% rename from packages/richtext-lexical/src/features/converters/html/converter/converters/tab.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/tab.ts diff --git a/packages/richtext-lexical/src/features/converters/html/converter/converters/text.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/text.ts similarity index 100% rename from packages/richtext-lexical/src/features/converters/html/converter/converters/text.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/text.ts diff --git a/packages/richtext-lexical/src/features/converters/html/converter/defaultConverters.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/defaultConverters.ts similarity index 90% rename from packages/richtext-lexical/src/features/converters/html/converter/defaultConverters.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/defaultConverters.ts index b4ca3d6093..2b324514e2 100644 --- a/packages/richtext-lexical/src/features/converters/html/converter/defaultConverters.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/defaultConverters.ts @@ -5,6 +5,9 @@ import { ParagraphHTMLConverter } from './converters/paragraph.js' import { TabHTMLConverter } from './converters/tab.js' import { TextHTMLConverter } from './converters/text.js' +/** + * @deprecated - will be removed in 4.0 + */ export const defaultHTMLConverters: HTMLConverter[] = [ ParagraphHTMLConverter, TextHTMLConverter, diff --git a/packages/richtext-lexical/src/features/converters/html/converter/index.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/index.ts similarity index 96% rename from packages/richtext-lexical/src/features/converters/html/converter/index.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/index.ts index 2de7b5769d..d81f6b6775 100644 --- a/packages/richtext-lexical/src/features/converters/html/converter/index.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/index.ts @@ -7,6 +7,9 @@ import type { HTMLConverter, SerializedLexicalNodeWithParent } from './types.js' import { hasText } from '../../../../validate/hasText.js' +/** + * @deprecated - will be removed in 4.0 + */ export type ConvertLexicalToHTMLArgs = { converters: HTMLConverter[] currentDepth?: number @@ -44,6 +47,9 @@ export type ConvertLexicalToHTMLArgs = { } ) +/** + * @deprecated - will be removed in 4.0 + */ export async function convertLexicalToHTML({ converters, currentDepth, @@ -83,6 +89,9 @@ export async function convertLexicalToHTML({ return '' } +/** + * @deprecated - will be removed in 4.0 + */ export async function convertLexicalNodesToHTML({ converters, currentDepth, diff --git a/packages/richtext-lexical/src/features/converters/html/converter/types.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/types.ts similarity index 93% rename from packages/richtext-lexical/src/features/converters/html/converter/types.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/types.ts index de487c34c4..238873909d 100644 --- a/packages/richtext-lexical/src/features/converters/html/converter/types.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/types.ts @@ -1,6 +1,9 @@ import type { SerializedLexicalNode } from 'lexical' import type { PayloadRequest } from 'payload' +/** + * @deprecated - will be removed in 4.0 + */ export type HTMLConverter = { converter: (args: { childIndex: number diff --git a/packages/richtext-lexical/src/features/converters/html/field/index.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/field/index.ts similarity index 95% rename from packages/richtext-lexical/src/features/converters/html/field/index.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/field/index.ts index 800e91a93f..6cc2d3ff5b 100644 --- a/packages/richtext-lexical/src/features/converters/html/field/index.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/field/index.ts @@ -1,5 +1,5 @@ import type { SerializedEditorState } from 'lexical' -import type { Field, FieldAffectingData, PayloadRequest, RichTextField } from 'payload' +import type { Field, RichTextField } from 'payload' import type { SanitizedServerEditorConfig } from '../../../../lexical/config/types.js' import type { AdapterProps, LexicalRichTextAdapter } from '../../../../types.js' @@ -9,7 +9,7 @@ import type { HTMLConverterFeatureProps } from '../index.js' import { defaultHTMLConverters } from '../converter/defaultConverters.js' import { convertLexicalToHTML } from '../converter/index.js' -type Props = { +type Args = { /** * Whether the lexicalHTML field should be hidden in the admin panel * @@ -28,6 +28,7 @@ type Props = { /** * Combines the default HTML converters with HTML converters found in the features, and with HTML converters configured in the htmlConverter feature. * + * @deprecated - will be removed in 4.0 * @param editorConfig */ export const consolidateHTMLConverters = ({ @@ -83,16 +84,19 @@ export const consolidateHTMLConverters = ({ return filteredConverters } +/** + * @deprecated - will be removed in 4.0 + */ export const lexicalHTML: ( /** * A string which matches the lexical field name you want to convert to HTML. * - * This has to be a SIBLING field of this lexicalHTML field - otherwise, it won't be able to find the lexical field. + * This has to be a sibling field of this lexicalHTML field - otherwise, it won't be able to find the lexical field. **/ lexicalFieldName: string, - props: Props, -) => Field = (lexicalFieldName, props) => { - const { name = 'lexicalHTML', hidden = true, storeInDB = false } = props + args: Args, +) => Field = (lexicalFieldName, args) => { + const { name = 'lexicalHTML', hidden = true, storeInDB = false } = args return { name, type: 'code', diff --git a/packages/richtext-lexical/src/features/converters/html/index.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/index.ts similarity index 91% rename from packages/richtext-lexical/src/features/converters/html/index.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/index.ts index 6696844e7f..26db8e0561 100644 --- a/packages/richtext-lexical/src/features/converters/html/index.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/index.ts @@ -9,6 +9,9 @@ export type HTMLConverterFeatureProps = { } // This is just used to save the props on the richText field +/** + * @deprecated - will be removed in 4.0 + */ export const HTMLConverterFeature = createServerFeature({ feature: {}, key: 'htmlConverter', diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/index.tsx b/packages/richtext-lexical/src/features/converters/jsx/Component/index.tsx similarity index 90% rename from packages/richtext-lexical/src/exports/react/components/RichText/index.tsx rename to packages/richtext-lexical/src/features/converters/jsx/Component/index.tsx index 8267773c46..2d561950fa 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/index.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/Component/index.tsx @@ -7,10 +7,10 @@ import type { SerializedBlockNode, SerializedInlineBlockNode, } from '../../../../nodeTypes.js' -import type { JSXConverters } from './converter/types.js' +import type { JSXConverters } from '../converter/types.js' -import { defaultJSXConverters } from './converter/defaultConverters.js' -import { convertLexicalToJSX } from './converter/index.js' +import { defaultJSXConverters } from '../converter/defaultConverters.js' +import { convertLexicalToJSX } from '../converter/index.js' export type JSXConvertersFunction< T extends { [key: string]: any; type?: string } = @@ -21,7 +21,7 @@ export type JSXConvertersFunction< type RichTextProps = { /** - * Additional class names for the container. + * Override class names for the container. */ className?: string /** diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/blockquote.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/blockquote.tsx similarity index 79% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/blockquote.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/blockquote.tsx index ad40b06485..2440195c62 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/blockquote.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/blockquote.tsx @@ -1,4 +1,4 @@ -import type { SerializedQuoteNode } from '../../../../../../nodeTypes.js' +import type { SerializedQuoteNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const BlockquoteJSXConverter: JSXConverters = { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/heading.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/heading.tsx similarity index 80% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/heading.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/heading.tsx index 0c10b2cd1f..a9f6289234 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/heading.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/heading.tsx @@ -1,4 +1,4 @@ -import type { SerializedHeadingNode } from '../../../../../../nodeTypes.js' +import type { SerializedHeadingNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const HeadingJSXConverter: JSXConverters = { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/horizontalRule.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/horizontalRule.tsx similarity index 75% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/horizontalRule.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/horizontalRule.tsx index fc25a9fe99..7370a08ac3 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/horizontalRule.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/horizontalRule.tsx @@ -1,7 +1,5 @@ -import type { SerializedHorizontalRuleNode } from '../../../../../../nodeTypes.js' +import type { SerializedHorizontalRuleNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const HorizontalRuleJSXConverter: JSXConverters = { - horizontalrule: () => { - return
    - }, + horizontalrule:
    , } diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/linebreak.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/linebreak.tsx similarity index 51% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/linebreak.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/linebreak.tsx index 9b769b4170..1261ca5bff 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/linebreak.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/linebreak.tsx @@ -1,8 +1,6 @@ -import type { SerializedLineBreakNode } from '../../../../../../nodeTypes.js' +import type { SerializedLineBreakNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const LinebreakJSXConverter: JSXConverters = { - linebreak: () => { - return
    - }, + linebreak:
    , } diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/link.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/link.tsx similarity index 97% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/link.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/link.tsx index 810f47a01d..6c8fe65530 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/link.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/link.tsx @@ -1,4 +1,4 @@ -import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../../nodeTypes.js' +import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const LinkJSXConverter: (args: { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/list.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/list.tsx similarity index 98% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/list.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/list.tsx index ad3a8115cb..7c538a959c 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/list.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/list.tsx @@ -1,6 +1,6 @@ import { v4 as uuidv4 } from 'uuid' -import type { SerializedListItemNode, SerializedListNode } from '../../../../../../nodeTypes.js' +import type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const ListJSXConverter: JSXConverters = { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/paragraph.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/paragraph.tsx similarity index 82% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/paragraph.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/paragraph.tsx index 751b4144ba..1b7814cd56 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/paragraph.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/paragraph.tsx @@ -1,4 +1,4 @@ -import type { SerializedParagraphNode } from '../../../../../../nodeTypes.js' +import type { SerializedParagraphNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const ParagraphJSXConverter: JSXConverters = { diff --git a/packages/richtext-lexical/src/features/converters/jsx/converter/converters/tab.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/tab.tsx new file mode 100644 index 0000000000..ccc70b4824 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/tab.tsx @@ -0,0 +1,6 @@ +import type { SerializedTabNode } from '../../../../../nodeTypes.js' +import type { JSXConverters } from '../types.js' + +export const TabJSXConverter: JSXConverters = { + tab: '\t', +} diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/table.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/table.tsx similarity index 97% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/table.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/table.tsx index 561a9ebd0f..6c3ebc50b3 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/table.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/table.tsx @@ -2,7 +2,7 @@ import type { SerializedTableCellNode, SerializedTableNode, SerializedTableRowNode, -} from '../../../../../../nodeTypes.js' +} from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const TableJSXConverter: JSXConverters< diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/text.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/text.tsx similarity index 86% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/text.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/text.tsx index 28c41d9d10..4dfe7a2a4e 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/text.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/text.tsx @@ -1,9 +1,9 @@ import React from 'react' -import type { SerializedTextNode } from '../../../../../../nodeTypes.js' +import type { SerializedTextNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' -import { NodeFormat } from '../../../../../../lexical/utils/nodeFormat.js' +import { NodeFormat } from '../../../../../lexical/utils/nodeFormat.js' export const TextJSXConverter: JSXConverters = { text: ({ node }) => { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/upload.tsx similarity index 58% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/upload.tsx index 76ac03781c..16664bc1f9 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/upload.tsx @@ -1,27 +1,29 @@ -import type { FileSizeImproved } from 'payload' +import type { FileData, FileSizeImproved, TypeWithID } from 'payload' -import type { UploadDataImproved } from '../../../../../../features/upload/server/nodes/UploadNode.js' -import type { SerializedUploadNode } from '../../../../../../nodeTypes.js' +import type { SerializedUploadNode } from '../../../../../nodeTypes.js' +import type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js' import type { JSXConverters } from '../types.js' export const UploadJSXConverter: JSXConverters = { upload: ({ node }) => { // TO-DO (v4): SerializedUploadNode should use UploadData_P4 - const uploadDocument = node as UploadDataImproved - if (typeof uploadDocument?.value !== 'object') { + const uploadNode = node as UploadDataImproved + if (typeof uploadNode.value !== 'object') { return null } - const value = uploadDocument.value - const url = value.url + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + const uploadDoc = uploadNode.value as FileData & TypeWithID + + const url = uploadDoc.url /** * If the upload is not an image, return a link to the upload */ - if (!value.mimeType.startsWith('image')) { + if (!uploadDoc.mimeType.startsWith('image')) { return ( - {value.filename} + {uploadDoc.filename} ) } @@ -29,8 +31,10 @@ export const UploadJSXConverter: JSXConverters = { /** * If the upload is a simple image with no different sizes, return a simple img tag */ - if (!Object.keys(value.sizes).length) { - return {value.filename} + if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) { + return ( + {uploadDoc.filename} + ) } /** @@ -39,8 +43,8 @@ export const UploadJSXConverter: JSXConverters = { const pictureJSX: React.ReactNode[] = [] // Iterate through each size in the data.sizes object - for (const size in value.sizes) { - const imageSize = value.sizes[size] as FileSizeImproved + for (const size in uploadDoc.sizes) { + const imageSize = uploadDoc.sizes[size] as FileSizeImproved // Skip if any property of the size object is null if ( @@ -62,18 +66,18 @@ export const UploadJSXConverter: JSXConverters = { media={`(max-width: ${imageSize.width}px)`} srcSet={imageSizeURL} type={imageSize.mimeType} - >, + />, ) } // Add the default img tag pictureJSX.push( {value?.filename}, ) return {pictureJSX} diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/defaultConverters.ts b/packages/richtext-lexical/src/features/converters/jsx/converter/defaultConverters.ts similarity index 94% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/defaultConverters.ts rename to packages/richtext-lexical/src/features/converters/jsx/converter/defaultConverters.ts index 5e59c80941..f00439be97 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/defaultConverters.ts +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/defaultConverters.ts @@ -1,4 +1,4 @@ -import type { DefaultNodeTypes } from '../../../../../nodeTypes.js' +import type { DefaultNodeTypes } from '../../../../nodeTypes.js' import type { JSXConverters } from './types.js' import { BlockquoteJSXConverter } from './converters/blockquote.js' diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/index.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/index.tsx similarity index 72% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/index.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/index.tsx index 7923f4caaf..5e21da2d6a 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/index.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/index.tsx @@ -2,12 +2,12 @@ import type { SerializedEditorState, SerializedLexicalNode } from 'lexical' import React from 'react' -import type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../../nodeTypes.js' +import type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js' import type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent } from './types.js' -import { hasText } from '../../../../../validate/hasText.js' +import { hasText } from '../../../../validate/hasText.js' -export type ConvertLexicalToHTMLArgs = { +export type ConvertLexicalToJSXArgs = { converters: JSXConverters data: SerializedEditorState disableIndent?: boolean | string[] @@ -19,7 +19,7 @@ export function convertLexicalToJSX({ data, disableIndent, disableTextAlign, -}: ConvertLexicalToHTMLArgs): React.ReactNode { +}: ConvertLexicalToJSXArgs): React.ReactNode { if (hasText(data)) { return convertLexicalNodesToJSX({ converters, @@ -69,48 +69,37 @@ export function convertLexicalNodesToJSX({ } try { - if (!converterForNode) { - if (unknownConverter) { - return unknownConverter({ - childIndex: i, - converters, - node, - nodesToJSX: (args) => { - return convertLexicalNodesToJSX({ - converters: args.converters ?? converters, - disableIndent: args.disableIndent ?? disableIndent, - disableTextAlign: args.disableTextAlign ?? disableTextAlign, - nodes: args.nodes, - parent: args.parent ?? { - ...node, - parent, - }, - }) - }, - parent, - }) - } - return unknown node + if (!converterForNode && unknownConverter) { + converterForNode = unknownConverter } - const reactNode = converterForNode({ - childIndex: i, - converters, - node, - nodesToJSX: (args) => { - return convertLexicalNodesToJSX({ - converters: args.converters ?? converters, - disableIndent: args.disableIndent ?? disableIndent, - disableTextAlign: args.disableTextAlign ?? disableTextAlign, - nodes: args.nodes, - parent: args.parent ?? { - ...node, - parent, - }, - }) - }, - parent, - }) + let reactNode: React.ReactNode + if (converterForNode) { + const converted = + typeof converterForNode === 'function' + ? converterForNode({ + childIndex: i, + converters, + node, + nodesToJSX: (args) => { + return convertLexicalNodesToJSX({ + converters: args.converters ?? converters, + disableIndent: args.disableIndent ?? disableIndent, + disableTextAlign: args.disableTextAlign ?? disableTextAlign, + nodes: args.nodes, + parent: args.parent ?? { + ...node, + parent, + }, + }) + }, + parent, + }) + : converterForNode + reactNode = converted + } else { + reactNode = unknown node + } const style: React.CSSProperties = {} @@ -176,10 +165,10 @@ export function convertLexicalNodesToJSX({ return reactNode } catch (error) { - console.error('Error converting lexical node to HTML:', error, 'node:', node) + console.error('Error converting lexical node to JSX:', error, 'node:', node) return null } }) - return jsxArray.filter(Boolean).map((jsx) => jsx) + return jsxArray.filter(Boolean) } diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/types.ts b/packages/richtext-lexical/src/features/converters/jsx/converter/types.ts similarity index 80% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/types.ts rename to packages/richtext-lexical/src/features/converters/jsx/converter/types.ts index c43400b4b9..61205f5d7e 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/types.ts +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/types.ts @@ -4,21 +4,22 @@ import type { DefaultNodeTypes, SerializedBlockNode, SerializedInlineBlockNode, -} from '../../../../../nodeTypes.js' +} from '../../../../nodeTypes.js' export type JSXConverter = - (args: { - childIndex: number - converters: JSXConverters - node: T - nodesToJSX: (args: { - converters?: JSXConverters - disableIndent?: boolean | string[] - disableTextAlign?: boolean | string[] - nodes: SerializedLexicalNode[] - parent?: SerializedLexicalNodeWithParent - }) => React.ReactNode[] - parent: SerializedLexicalNodeWithParent - }) => React.ReactNode + | ((args: { + childIndex: number + converters: JSXConverters + node: T + nodesToJSX: (args: { + converters?: JSXConverters + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent?: SerializedLexicalNodeWithParent + }) => React.ReactNode[] + parent: SerializedLexicalNodeWithParent + }) => React.ReactNode) + | React.ReactNode export type JSXConverters< T extends { [key: string]: any; type?: string } = diff --git a/packages/richtext-lexical/src/features/converters/utilities/payloadPopulateFn.ts b/packages/richtext-lexical/src/features/converters/utilities/payloadPopulateFn.ts new file mode 100644 index 0000000000..f567b1d371 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/utilities/payloadPopulateFn.ts @@ -0,0 +1,81 @@ +import { createLocalReq, type Payload, type PayloadRequest, type TypedLocale } from 'payload' + +import type { HTMLPopulateFn } from '../html/async/types.js' + +import { populate } from '../../../populateGraphQL/populate.js' + +export const getPayloadPopulateFn: ( + args: { + currentDepth: number + depth: number + draft?: boolean + locale?: TypedLocale + + overrideAccess?: boolean + showHiddenFields?: boolean + } & ( + | { + /** + * This payload property will only be used if req is undefined. If localization is enabled, you must pass `req` instead. + */ + payload: Payload + /** + * When the converter is called, req CAN be passed in depending on where it's run. + * If this is undefined and config is passed through, lexical will create a new req object for you. + */ + req?: never + } + | { + /** + * This payload property will only be used if req is undefined. If localization is enabled, you must pass `req` instead. + */ + payload?: never + /** + * When the converter is called, req CAN be passed in depending on where it's run. + * If this is undefined and config is passed through, lexical will create a new req object for you. + */ + req: PayloadRequest + } + ), +) => Promise = async ({ + currentDepth, + depth, + draft, + overrideAccess, + payload, + req, + showHiddenFields, +}) => { + let reqToUse: PayloadRequest | undefined = req + if (req === undefined && payload) { + reqToUse = await createLocalReq({}, payload) + } + + if (!reqToUse) { + throw new Error('No req or payload provided') + } + + const populateFn: HTMLPopulateFn = async ({ id, collectionSlug, select }) => { + const dataContainer: { + value?: any + } = {} + + await populate({ + id, + collectionSlug, + currentDepth, + data: dataContainer, + depth, + draft: draft ?? false, + key: 'value', + overrideAccess: overrideAccess ?? true, + req: reqToUse, + select, + showHiddenFields: showHiddenFields ?? false, + }) + + return dataContainer.value + } + + return populateFn +} diff --git a/packages/richtext-lexical/src/features/converters/utilities/restPopulateFn.ts b/packages/richtext-lexical/src/features/converters/utilities/restPopulateFn.ts new file mode 100644 index 0000000000..efe5f83baf --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/utilities/restPopulateFn.ts @@ -0,0 +1,33 @@ +import { stringify } from 'qs-esm' + +import type { HTMLPopulateFn } from '../html/async/types.js' + +export const getRestPopulateFn: (args: { + /** + * E.g. `http://localhost:3000/api` + */ + apiURL: string + depth?: number + draft?: boolean + locale?: string +}) => HTMLPopulateFn = ({ apiURL, depth, draft, locale }) => { + const populateFn: HTMLPopulateFn = async ({ id, collectionSlug, select }) => { + const query = stringify( + { depth: depth ?? 0, draft: draft ?? false, locale, select }, + { addQueryPrefix: true }, + ) + + const res = await fetch(`${apiURL}/${collectionSlug}/${id}${query}`, { + credentials: 'include', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + method: 'GET', + }).then((res) => res.json()) + + return res + } + + return populateFn +} diff --git a/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss b/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss index 5ff0539b12..804ad5ede6 100644 --- a/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss +++ b/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss @@ -3,6 +3,7 @@ @layer payload-default { .table-cell-action-button-container { position: absolute; + z-index: 3; top: 0; left: 0; will-change: transform; diff --git a/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx b/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx index 93c1825962..abd094628a 100644 --- a/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx +++ b/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx @@ -1,12 +1,13 @@ 'use client' -import type { TableObserver, TableRowNode, TableSelection } from '@lexical/table' +import type { TableObserver, TableSelection } from '@lexical/table' import type { ElementNode } from 'lexical' import type { JSX } from 'react' import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' import { useLexicalEditable } from '@lexical/react/useLexicalEditable' import { + $computeTableMapSkipCellCheck, $deleteTableColumn__EXPERIMENTAL, $deleteTableRow__EXPERIMENTAL, $getNodeTriplet, @@ -17,7 +18,6 @@ import { $insertTableColumn__EXPERIMENTAL, $insertTableRow__EXPERIMENTAL, $isTableCellNode, - $isTableRowNode, $isTableSelection, $unmergeCell, getTableElement, @@ -37,6 +37,7 @@ import { $isTextNode, COMMAND_PRIORITY_CRITICAL, getDOMSelection, + isDOMNode, SELECTION_CHANGE_COMMAND, } from 'lexical' import * as React from 'react' @@ -186,8 +187,9 @@ function TableActionMenu({ if ( dropDownRef.current != null && contextRef.current != null && - !dropDownRef.current.contains(event.target as Node) && - !contextRef.current.contains(event.target as Node) + isDOMNode(event.target) && + !dropDownRef.current.contains(event.target) && + !contextRef.current.contains(event.target) ) { setIsMenuOpen(false) } @@ -226,35 +228,105 @@ function TableActionMenu({ editor.update(() => { const selection = $getSelection() if ($isTableSelection(selection)) { - const { columns, rows } = computeSelectionCount(selection) + // Get all selected cells and compute the total area const nodes = selection.getNodes() - let firstCell: null | TableCellNode = null - for (let i = 0; i < nodes.length; i++) { - const node = nodes[i] - if ($isTableCellNode(node)) { - if (firstCell === null) { - node.setColSpan(columns).setRowSpan(rows) - firstCell = node - const isEmpty = $cellContainsEmptyParagraph(node) - let firstChild - if (isEmpty && $isParagraphNode((firstChild = node.getFirstChild()))) { - firstChild.remove() - } - } else if ($isTableCellNode(firstCell)) { - const isEmpty = $cellContainsEmptyParagraph(node) - if (!isEmpty) { - firstCell.append(...node.getChildren()) - } - node.remove() + const tableCells = nodes.filter($isTableCellNode) + + if (tableCells.length === 0) { + return + } + + // Find the table node + const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCells[0] as TableCellNode) + const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null) + + // Find the boundaries of the selection including merged cells + let minRow = Infinity + let maxRow = -Infinity + let minCol = Infinity + let maxCol = -Infinity + + // First pass: find the actual boundaries considering merged cells + const processedCells = new Set() + for (const row of gridMap) { + for (const mapCell of row) { + if (!mapCell || !mapCell.cell) { + continue + } + + const cellKey = mapCell.cell.getKey() + if (processedCells.has(cellKey)) { + continue + } + + if (tableCells.some((cell) => cell.is(mapCell.cell))) { + processedCells.add(cellKey) + // Get the actual position of this cell in the grid + const cellStartRow = mapCell.startRow + const cellStartCol = mapCell.startColumn + const cellRowSpan = mapCell.cell.__rowSpan || 1 + const cellColSpan = mapCell.cell.__colSpan || 1 + + // Update boundaries considering the cell's actual position and span + minRow = Math.min(minRow, cellStartRow) + maxRow = Math.max(maxRow, cellStartRow + cellRowSpan - 1) + minCol = Math.min(minCol, cellStartCol) + maxCol = Math.max(maxCol, cellStartCol + cellColSpan - 1) } } } - if (firstCell !== null) { - if (firstCell.getChildrenSize() === 0) { - firstCell.append($createParagraphNode()) - } - $selectLastDescendant(firstCell) + + // Validate boundaries + if (minRow === Infinity || minCol === Infinity) { + return } + + // The total span of the merged cell + const totalRowSpan = maxRow - minRow + 1 + const totalColSpan = maxCol - minCol + 1 + + // Use the top-left cell as the target cell + const targetCellMap = gridMap?.[minRow]?.[minCol] + if (!targetCellMap?.cell) { + return + } + const targetCell = targetCellMap.cell + + // Set the spans for the target cell + targetCell.setColSpan(totalColSpan) + targetCell.setRowSpan(totalRowSpan) + + // Move content from other cells to the target cell + const seenCells = new Set([targetCell.getKey()]) + + // Second pass: merge content and remove other cells + for (let row = minRow; row <= maxRow; row++) { + for (let col = minCol; col <= maxCol; col++) { + const mapCell = gridMap?.[row]?.[col] + if (!mapCell?.cell) { + continue + } + + const currentCell = mapCell.cell + const key = currentCell.getKey() + + if (!seenCells.has(key)) { + seenCells.add(key) + const isEmpty = $cellContainsEmptyParagraph(currentCell) + if (!isEmpty) { + targetCell.append(...currentCell.getChildren()) + } + currentCell.remove() + } + } + } + + // Ensure target cell has content + if (targetCell.getChildrenSize() === 0) { + targetCell.append($createParagraphNode()) + } + + $selectLastDescendant(targetCell) onClose() } }) @@ -269,11 +341,13 @@ function TableActionMenu({ const insertTableRowAtSelection = useCallback( (shouldInsertAfter: boolean) => { editor.update(() => { - $insertTableRow__EXPERIMENTAL(shouldInsertAfter) + for (let i = 0; i < selectionCounts.rows; i++) { + $insertTableRow__EXPERIMENTAL(shouldInsertAfter) + } onClose() }) }, - [editor, onClose], + [editor, onClose, selectionCounts.rows], ) const insertTableColumnAtSelection = useCallback( @@ -318,26 +392,25 @@ function TableActionMenu({ const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode) - const tableRows = tableNode.getChildren() + const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null) - if (tableRowIndex >= tableRows.length || tableRowIndex < 0) { - throw new Error('Expected table cell to be inside of table row.') - } - - const tableRow = tableRows[tableRowIndex] - - if (!$isTableRowNode(tableRow)) { - throw new Error('Expected table row') - } + const rowCells = new Set() const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW - tableRow.getChildren().forEach((tableCell) => { - if (!$isTableCellNode(tableCell)) { - throw new Error('Expected table cell') - } + if (gridMap[tableRowIndex]) { + for (let col = 0; col < gridMap[tableRowIndex].length; col++) { + const mapCell = gridMap[tableRowIndex][col] - tableCell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW) - }) + if (!mapCell?.cell) { + continue + } + + if (!rowCells.has(mapCell.cell)) { + rowCells.add(mapCell.cell) + mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW) + } + } + } clearTableSelection() onClose() @@ -350,35 +423,26 @@ function TableActionMenu({ const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode) - const tableRows = tableNode.getChildren() - const maxRowsLength = Math.max(...tableRows.map((row) => row.getChildren().length)) + const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null) - if (tableColumnIndex >= maxRowsLength || tableColumnIndex < 0) { - throw new Error('Expected table cell to be inside of table row.') - } + const columnCells = new Set() const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN - for (let r = 0; r < tableRows.length; r++) { - const tableRow = tableRows[r] + if (gridMap) { + for (let row = 0; row < gridMap.length; row++) { + const mapCell = gridMap?.[row]?.[tableColumnIndex] - if (!$isTableRowNode(tableRow)) { - throw new Error('Expected table row') + if (!mapCell?.cell) { + continue + } + + if (!columnCells.has(mapCell.cell)) { + columnCells.add(mapCell.cell) + mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN) + } } - - const tableCells = tableRow.getChildren() - if (tableColumnIndex >= tableCells.length) { - // if cell is outside of bounds for the current row (for example various merge cell cases) we shouldn't highlight it - continue - } - - const tableCell = tableCells[tableColumnIndex] - - if (!$isTableCellNode(tableCell)) { - throw new Error('Expected table cell') - } - - tableCell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN) } + clearTableSelection() onClose() }) @@ -398,6 +462,19 @@ function TableActionMenu({ }) }, [editor, tableCellNode, clearTableSelection, onClose]) + const toggleFirstColumnFreeze = useCallback(() => { + editor.update(() => { + if (tableCellNode.isAttached()) { + const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode) + if (tableNode) { + tableNode.setFrozenColumns(tableNode.getFrozenColumns() === 0 ? 1 : 0) + } + } + clearTableSelection() + onClose() + }) + }, [editor, tableCellNode, clearTableSelection, onClose]) + let mergeCellButton: JSX.Element | null = null if (cellMerge) { if (canMergeCells) { @@ -449,6 +526,14 @@ function TableActionMenu({ > Toggle Row Striping +
    -
    diff --git a/packages/ui/src/elements/Autosave/index.tsx b/packages/ui/src/elements/Autosave/index.tsx index 0d9d30d3a7..4ddac35fbc 100644 --- a/packages/ui/src/elements/Autosave/index.tsx +++ b/packages/ui/src/elements/Autosave/index.tsx @@ -11,6 +11,7 @@ import { useAllFormFields, useForm, useFormModified, + useFormProcessing, useFormSubmitted, } from '../../forms/Form/context.js' import { useDebounce } from '../../hooks/useDebounce.js' @@ -57,7 +58,8 @@ export const Autosave: React.FC = ({ id, collection, global: globalDoc }) const isProcessingRef = useRef(false) const { reportUpdate } = useDocumentEvents() - const { dispatchFields, isValid, setIsValid, setSubmitted } = useForm() + const { dispatchFields, isValid, setBackgroundProcessing, setIsValid, setSubmitted } = useForm() + const isFormProcessing = useFormProcessing() const [fields] = useAllFormFields() const modified = useFormModified() @@ -108,6 +110,13 @@ export const Autosave: React.FC = ({ id, collection, global: globalDoc }) return } + // Do not autosave if the form is already processing (e.g. if the user clicked the publish button + // right before this autosave runs), as parallel updates could cause conflicts + if (isFormProcessing) { + queueRef.current = [] + return + } + if (!isValidRef.current) { // Clear queue so we don't end up in an infinite loop queueRef.current = [] @@ -120,15 +129,18 @@ export const Autosave: React.FC = ({ id, collection, global: globalDoc }) const latestAction = queueRef.current[queueRef.current.length - 1] queueRef.current = [] + setBackgroundProcessing(true) try { await latestAction() } finally { isProcessingRef.current = false + setBackgroundProcessing(false) if (queueRef.current.length > 0) { await processQueue() } } - }, []) + setBackgroundProcessing(false) + }, [isFormProcessing, setBackgroundProcessing]) const autosaveTimeoutRef = useRef(null) diff --git a/packages/ui/src/elements/BulkUpload/EditForm/index.tsx b/packages/ui/src/elements/BulkUpload/EditForm/index.tsx index 3cc517d09e..7c186d498b 100644 --- a/packages/ui/src/elements/BulkUpload/EditForm/index.tsx +++ b/packages/ui/src/elements/BulkUpload/EditForm/index.tsx @@ -1,6 +1,7 @@ 'use client' import { useRouter, useSearchParams } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { useCallback, useEffect } from 'react' import type { EditFormProps } from './types.js' @@ -17,7 +18,6 @@ import { useRouteTransition } from '../../../providers/RouteTransition/index.js' import { useServerFunctions } from '../../../providers/ServerFunctions/index.js' import { useUploadEdits } from '../../../providers/UploadEdits/index.js' import { abortAndIgnore, handleAbortRef } from '../../../utilities/abortAndIgnore.js' -import { formatAdminURL } from '../../../utilities/formatAdminURL.js' import { useDocumentDrawerContext } from '../../DocumentDrawer/Provider.js' import { DocumentFields } from '../../DocumentFields/index.js' import { Upload } from '../../Upload/index.js' diff --git a/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts b/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts index 6adfedd708..b58c03d9d5 100644 --- a/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts +++ b/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts @@ -1,16 +1,42 @@ -import type { FormState } from 'payload' +import type { CollectionSlug, FormState } from 'payload' import { serialize } from 'object-to-formdata' import { reduceFieldsToValues } from 'payload/shared' -export function createFormData(formState: FormState = {}, overrides: Record = {}) { +import type { UploadHandlersContext } from '../../../providers/UploadHandlers/index.js' + +export async function createFormData( + formState: FormState = {}, + overrides: Record = {}, + collectionSlug: CollectionSlug, + uploadHandler: ReturnType, +) { const data = reduceFieldsToValues(formState, true) - const file = data?.file + let file = data?.file if (file) { delete data.file } + if (file && typeof uploadHandler === 'function') { + let filename = file.name + + const clientUploadContext = await uploadHandler({ + file, + updateFilename: (value) => { + filename = value + }, + }) + + file = JSON.stringify({ + clientUploadContext, + collectionSlug, + filename, + mimeType: file.type, + size: file.size, + }) + } + const dataWithOverrides = { ...data, ...overrides, diff --git a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx index 762b49493e..4bd7fdf52e 100644 --- a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx +++ b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx @@ -3,6 +3,7 @@ import type { Data, DocumentSlots, FormState, SanitizedDocumentPermissions } from 'payload' import { useModal } from '@faceless-ui/modal' +import { isImage } from 'payload/shared' import * as qs from 'qs-esm' import React from 'react' import { toast } from 'sonner' @@ -14,6 +15,7 @@ import { useConfig } from '../../../providers/Config/index.js' import { useLocale } from '../../../providers/Locale/index.js' import { useServerFunctions } from '../../../providers/ServerFunctions/index.js' import { useTranslation } from '../../../providers/Translation/index.js' +import { useUploadHandlers } from '../../../providers/UploadHandlers/index.js' import { hasSavePermission as getHasSavePermission } from '../../../utilities/hasSavePermission.js' import { LoadingOverlay } from '../../Loading/index.js' import { useLoadingOverlay } from '../../LoadingOverlay/index.js' @@ -93,6 +95,7 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { const { i18n, t } = useTranslation() const { getDocumentSlots, getFormState } = useServerFunctions() + const { getUploadHandler } = useUploadHandlers() const [documentSlots, setDocumentSlots] = React.useState({}) const [hasSubmitted, setHasSubmitted] = React.useState(false) @@ -122,7 +125,7 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { const file = formsRef.current[i].formState.file.value as File // Skip if already processed - if (processedFiles.current.has(file) || !file) { + if (processedFiles.current.has(file) || !file || !isImage(file.type)) { continue } processedFiles.current.add(file) @@ -261,10 +264,19 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { [initializeSharedFormState, hasInitializedState, toggleLoadingOverlay], ) - const removeFile: FormsManagerContext['removeFile'] = React.useCallback((index) => { - dispatch({ type: 'REMOVE_FORM', index }) + const removeThumbnails = React.useCallback((indexes: number[]) => { + thumbnailUrlsRef.current = thumbnailUrlsRef.current.filter((_, i) => !indexes.includes(i)) + setRenderedThumbnails([...thumbnailUrlsRef.current]) }, []) + const removeFile: FormsManagerContext['removeFile'] = React.useCallback( + (index) => { + dispatch({ type: 'REMOVE_FORM', index }) + removeThumbnails([index]) + }, + [removeThumbnails], + ) + const setFormTotalErrorCount: FormsManagerContext['setFormTotalErrorCount'] = React.useCallback( ({ errorCount, index }) => { dispatch({ @@ -295,7 +307,12 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { setLoadingText(t('general:uploadingBulk', { current: i + 1, total: currentForms.length })) const req = await fetch(actionURL, { - body: createFormData(form.formState, overrides), + body: await createFormData( + form.formState, + overrides, + collectionSlug, + getUploadHandler({ collectionSlug }), + ), method: 'POST', }) @@ -359,7 +376,17 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { setLoadingText('') setIsUploading(false) - const remainingForms = currentForms.filter(({ errorCount }) => errorCount > 0) + const remainingForms = [] + const thumbnailIndexesToRemove = [] + + currentForms.forEach(({ errorCount }, i) => { + if (errorCount) { + remainingForms.push(currentForms[i]) + } else { + thumbnailIndexesToRemove.push(i) + } + }) + const successCount = Math.max(0, currentForms.length - remainingForms.length) const errorCount = currentForms.length - successCount @@ -369,6 +396,10 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { if (typeof onSuccess === 'function') { onSuccess(newDocs, errorCount) } + + if (remainingForms.length && thumbnailIndexesToRemove.length) { + removeThumbnails(thumbnailIndexesToRemove) + } } if (errorCount) { @@ -386,7 +417,18 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { }, }) }, - [actionURL, activeIndex, forms, onSuccess, t, closeModal, drawerSlug], + [ + actionURL, + activeIndex, + forms, + removeThumbnails, + onSuccess, + collectionSlug, + getUploadHandler, + t, + closeModal, + drawerSlug, + ], ) const bulkUpdateForm = React.useCallback( diff --git a/packages/ui/src/elements/DeleteDocument/index.tsx b/packages/ui/src/elements/DeleteDocument/index.tsx index cb934a5bd7..59e5d24fdf 100644 --- a/packages/ui/src/elements/DeleteDocument/index.tsx +++ b/packages/ui/src/elements/DeleteDocument/index.tsx @@ -4,6 +4,7 @@ import type { SanitizedCollectionConfig } from 'payload' import { useModal } from '@faceless-ui/modal' import { getTranslation } from '@payloadcms/translations' import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { useCallback } from 'react' import { toast } from 'sonner' @@ -15,7 +16,6 @@ import { useDocumentInfo } from '../../providers/DocumentInfo/index.js' import { useRouteTransition } from '../../providers/RouteTransition/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { requests } from '../../utilities/api.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { ConfirmationModal } from '../ConfirmationModal/index.js' import { PopupList } from '../Popup/index.js' import { Translation } from '../Translation/index.js' diff --git a/packages/ui/src/elements/DocumentControls/index.tsx b/packages/ui/src/elements/DocumentControls/index.tsx index be8d3495da..0986f80ea2 100644 --- a/packages/ui/src/elements/DocumentControls/index.tsx +++ b/packages/ui/src/elements/DocumentControls/index.tsx @@ -7,6 +7,7 @@ import type { } from 'payload' import { getTranslation } from '@payloadcms/translations' +import { formatAdminURL } from 'payload/shared' import React, { Fragment, useEffect } from 'react' import type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js' @@ -15,7 +16,6 @@ import { useFormInitializing, useFormProcessing } from '../../forms/Form/context import { useConfig } from '../../providers/Config/index.js' import { useEditDepth } from '../../providers/EditDepth/index.js' import { useTranslation } from '../../providers/Translation/index.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { formatDate } from '../../utilities/formatDate.js' import { Autosave } from '../Autosave/index.js' import { Button } from '../Button/index.js' @@ -137,6 +137,8 @@ export const DocumentControls: React.FC<{ (collectionConfig?.versions?.drafts && collectionConfig?.versions?.drafts?.autosave) || (globalConfig?.versions?.drafts && globalConfig?.versions?.drafts?.autosave) + const disableCopyToLocale = localization && collectionConfig?.admin?.disableCopyToLocale + return (
    @@ -263,7 +265,7 @@ export const DocumentControls: React.FC<{ verticalAlign="bottom" > - {localization && } + {!disableCopyToLocale && } {hasCreatePermission && ( {!disableCreate && ( diff --git a/packages/ui/src/elements/DuplicateDocument/index.tsx b/packages/ui/src/elements/DuplicateDocument/index.tsx index bac2266787..65e9710c30 100644 --- a/packages/ui/src/elements/DuplicateDocument/index.tsx +++ b/packages/ui/src/elements/DuplicateDocument/index.tsx @@ -5,6 +5,7 @@ import type { SanitizedCollectionConfig } from 'payload' import { useModal } from '@faceless-ui/modal' import { getTranslation } from '@payloadcms/translations' import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { useCallback } from 'react' import { toast } from 'sonner' @@ -16,7 +17,6 @@ import { useLocale } from '../../providers/Locale/index.js' import { useRouteTransition } from '../../providers/RouteTransition/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { requests } from '../../utilities/api.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { ConfirmationModal } from '../ConfirmationModal/index.js' import { PopupList } from '../Popup/index.js' diff --git a/packages/ui/src/elements/FieldSelect/index.tsx b/packages/ui/src/elements/FieldSelect/index.tsx index 2ebfe60cec..c50f0eedd5 100644 --- a/packages/ui/src/elements/FieldSelect/index.tsx +++ b/packages/ui/src/elements/FieldSelect/index.tsx @@ -67,7 +67,7 @@ const reduceFields = ({ // escape for a variety of reasons, include ui fields as they have `name`. if ( (fieldAffectsData(field) || field.type === 'ui') && - (field.admin.disableBulkEdit || + (field.admin?.disableBulkEdit || field.unique || fieldIsHiddenOrDisabled(field) || ('readOnly' in field && field.readOnly)) diff --git a/packages/ui/src/elements/FileDetails/StaticFileDetails/index.tsx b/packages/ui/src/elements/FileDetails/StaticFileDetails/index.tsx index 3e3c549841..15d46a6012 100644 --- a/packages/ui/src/elements/FileDetails/StaticFileDetails/index.tsx +++ b/packages/ui/src/elements/FileDetails/StaticFileDetails/index.tsx @@ -38,17 +38,21 @@ export const StaticFileDetails: React.FC = (props) => { const { filename, filesize, height, mimeType, thumbnailURL, url, width } = doc + const previewAllowed = uploadConfig.displayPreview ?? true + return (
    - + {previewAllowed && ( + + )}
    { setLocaleIsLoading(true) close() + + // can't use `useSearchParams` here because it is stale due to `window.history.pushState` in `ListQueryProvider` + const searchParams = new URLSearchParams(window.location.search) + + const url = qs.stringify( + { + ...qs.parse(searchParams.toString(), { + depth: 10, + ignoreQueryPrefix: true, + }), + locale: localeOption.code, + }, + { addQueryPrefix: true }, + ) + + startRouteTransition(() => { + router.push(url) + }) }} > {localeOptionLabel !== localeOption.code ? ( diff --git a/packages/ui/src/elements/Logout/index.tsx b/packages/ui/src/elements/Logout/index.tsx index e729b9da5d..182fd7a1cb 100644 --- a/packages/ui/src/elements/Logout/index.tsx +++ b/packages/ui/src/elements/Logout/index.tsx @@ -1,10 +1,10 @@ 'use client' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { LogOutIcon } from '../../icons/LogOut/index.js' import { useConfig } from '../../providers/Config/index.js' import { useTranslation } from '../../providers/Translation/index.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { Link } from '../Link/index.js' const baseClass = 'nav' @@ -28,24 +28,17 @@ export const Logout: React.FC<{ routes: { admin: adminRoute }, } = config - const basePath = process.env.NEXT_BASE_PATH ?? '' - - const props = { - 'aria-label': t('authentication:logOut'), - className: `${baseClass}__log-out`, - prefetch: Link ? false : undefined, - tabIndex, - title: t('authentication:logOut'), - } - return ( diff --git a/packages/ui/src/elements/Nav/context.tsx b/packages/ui/src/elements/Nav/context.tsx index c074c285f8..a778c5cd8d 100644 --- a/packages/ui/src/elements/Nav/context.tsx +++ b/packages/ui/src/elements/Nav/context.tsx @@ -1,5 +1,6 @@ 'use client' import { useWindowInfo } from '@faceless-ui/window-info' +import { usePathname } from 'next/navigation.js' import React, { useEffect, useRef } from 'react' import { usePreferences } from '../../providers/Preferences/index.js' @@ -40,6 +41,8 @@ export const NavProvider: React.FC<{ breakpoints: { l: largeBreak, m: midBreak, s: smallBreak }, } = useWindowInfo() + const pathname = usePathname() + const { getPreference } = usePreferences() const navRef = useRef(null) @@ -64,8 +67,13 @@ export const NavProvider: React.FC<{ } }, [largeBreak, getPreference, setNavOpen]) - // TODO: on smaller screens where the nav is a modal + // on smaller screens where the nav is a modal // close the nav when the user navigates away + useEffect(() => { + if (smallBreak === true) { + setNavOpen(false) + } + }, [pathname]) // on open and close, lock the body scroll // do not do this on desktop, the sidebar is not a modal diff --git a/packages/ui/src/elements/PublishButton/index.tsx b/packages/ui/src/elements/PublishButton/index.tsx index 64703e6981..640d622590 100644 --- a/packages/ui/src/elements/PublishButton/index.tsx +++ b/packages/ui/src/elements/PublishButton/index.tsx @@ -222,7 +222,7 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { )} {localization && canPublish && ( - + {secondaryLabel} diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index e45d2ecfeb..76795c6c1e 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -1,14 +1,14 @@ 'use client' -import type { - CollectionSlug, - Column, - JoinFieldClient, - ListQuery, - PaginatedDocs, - Where, -} from 'payload' - import { getTranslation } from '@payloadcms/translations' +import { + type CollectionSlug, + type Column, + type JoinFieldClient, + type ListQuery, + type PaginatedDocs, + type Where, +} from 'payload' +import { transformColumnsToPreferences } from 'payload/shared' import React, { Fragment, useCallback, useEffect, useState } from 'react' import type { DocumentDrawerProps } from '../DocumentDrawer/types.js' @@ -137,7 +137,7 @@ export const RelationshipTable: React.FC = (pro Table: NewTable, } = await getTableState({ collectionSlug: relationTo, - columns: defaultColumns, + columns: transformColumnsToPreferences(query?.columns) || defaultColumns, docs, enableRowSelections: false, parent, @@ -154,7 +154,6 @@ export const RelationshipTable: React.FC = (pro [ field.defaultLimit, field.defaultSort, - field.admin.defaultColumns, collectionConfig?.admin?.pagination?.defaultLimit, collectionConfig?.defaultSort, query, @@ -215,8 +214,6 @@ export const RelationshipTable: React.FC = (pro [data?.docs, renderTable], ) - const preferenceKey = `${Array.isArray(relationTo) ? `${parent.collectionSlug}-${parent.joinPath}` : relationTo}-list` - const canCreate = allowCreate !== false && permissions?.collections?.[Array.isArray(relationTo) ? relationTo[0] : relationTo]?.create @@ -326,6 +323,7 @@ export const RelationshipTable: React.FC = (pro {data?.docs && data.docs.length > 0 && ( = (pro } - preferenceKey={preferenceKey} - renderRowTypes - setTable={setTable} - sortColumnProps={{ - appearance: 'condensed', - }} - tableAppearance="condensed" > = ({ cellData: filename, collectionConfig, + field, rowData, }) => { - return ( -
    - - {String(filename)} -
    - ) + const fieldPreviewAllowed = 'displayPreview' in field ? field.displayPreview : undefined + const previewAllowed = fieldPreviewAllowed ?? collectionConfig.upload?.displayPreview ?? true + + if (previewAllowed) { + return ( +
    + + {String(filename)} +
    + ) + } else { + return <>{String(filename)} + } } 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 36efaa9753..c166ef2dcd 100644 --- a/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx +++ b/packages/ui/src/elements/Table/DefaultCell/fields/Relationship/index.tsx @@ -110,9 +110,9 @@ export const RelationshipCell: React.FC = ({ let fileField = null if (field.type === 'upload') { - const relatedCollectionPreview = !!relatedCollection.upload.displayPreview + const fieldPreviewAllowed = 'displayPreview' in field ? field.displayPreview : undefined const previewAllowed = - field.displayPreview || (relatedCollectionPreview && field.displayPreview !== false) + fieldPreviewAllowed ?? relatedCollection.upload?.displayPreview ?? true if (previewAllowed && document) { fileField = ( diff --git a/packages/ui/src/elements/Table/DefaultCell/index.tsx b/packages/ui/src/elements/Table/DefaultCell/index.tsx index e9ba11ae00..b1969f4b5a 100644 --- a/packages/ui/src/elements/Table/DefaultCell/index.tsx +++ b/packages/ui/src/elements/Table/DefaultCell/index.tsx @@ -1,13 +1,12 @@ 'use client' -import type { ClientCollectionConfig, DefaultCellComponentProps, UploadFieldClient } from 'payload' +import type { DefaultCellComponentProps, UploadFieldClient } from 'payload' import { getTranslation } from '@payloadcms/translations' -import { fieldAffectsData, fieldIsID } from 'payload/shared' +import { fieldAffectsData, fieldIsID, formatAdminURL } from 'payload/shared' import React from 'react' // TODO: abstract this out to support all routers import { useConfig } from '../../../providers/Config/index.js' import { useTranslation } from '../../../providers/Translation/index.js' -import { formatAdminURL } from '../../../utilities/formatAdminURL.js' import { Link } from '../../Link/index.js' import { CodeCell } from './fields/Code/index.js' import { cellComponents } from './fields/index.js' diff --git a/packages/ui/src/elements/TableColumns/context.ts b/packages/ui/src/elements/TableColumns/context.ts new file mode 100644 index 0000000000..183f071041 --- /dev/null +++ b/packages/ui/src/elements/TableColumns/context.ts @@ -0,0 +1,7 @@ +import { createContext, useContext } from 'react' + +import type { ITableColumns } from './types.js' + +export const TableColumnContext = createContext({} as ITableColumns) + +export const useTableColumns = (): ITableColumns => useContext(TableColumnContext) diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index 5d7120e7a0..0616985fbf 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -1,293 +1,98 @@ 'use client' -import type { Column, ListPreferences, SanitizedCollectionConfig } from 'payload' +import { type Column } from 'payload' +import { transformColumnsToSearchParams } from 'payload/shared' +import React, { startTransition, useCallback } from 'react' -import React, { createContext, useCallback, useContext, useEffect } from 'react' - -import type { SortColumnProps } from '../SortColumn/index.js' +import type { TableColumnsProviderProps } from './types.js' import { useConfig } from '../../providers/Config/index.js' -import { usePreferences } from '../../providers/Preferences/index.js' -import { useServerFunctions } from '../../providers/ServerFunctions/index.js' -import { abortAndIgnore, handleAbortRef } from '../../utilities/abortAndIgnore.js' +import { useListQuery } from '../../providers/ListQuery/index.js' +import { TableColumnContext } from './context.js' -export interface ITableColumns { - columns: Column[] - LinkedCellOverride?: React.ReactNode - moveColumn: (args: { fromIndex: number; toIndex: number }) => Promise - resetColumnsState: () => Promise - setActiveColumns: (columns: string[]) => Promise - toggleColumn: (column: string) => Promise -} +export { useTableColumns } from './context.js' -export const TableColumnContext = createContext({} as ITableColumns) - -export const useTableColumns = (): ITableColumns => useContext(TableColumnContext) - -type Props = { - readonly children: React.ReactNode - readonly collectionSlug: string | string[] - readonly columnState: Column[] - readonly docs: any[] - readonly enableRowSelections?: boolean - readonly LinkedCellOverride?: React.ReactNode - readonly listPreferences?: ListPreferences - readonly preferenceKey: string - readonly renderRowTypes?: boolean - readonly setTable: (Table: React.ReactNode) => void - readonly sortColumnProps?: Partial - readonly tableAppearance?: 'condensed' | 'default' -} - -// strip out Heading, Label, and renderedCells properties, they cannot be sent to the server -const sanitizeColumns = (columns: Column[]) => { - return columns.map(({ accessor, active }) => ({ - accessor, - active, - })) -} - -export const TableColumnsProvider: React.FC = ({ +export const TableColumnsProvider: React.FC = ({ children, collectionSlug, - columnState, - docs, - enableRowSelections, + columnState: columnStateFromProps, LinkedCellOverride, - listPreferences, - preferenceKey, - renderRowTypes, - setTable, - sortColumnProps, - tableAppearance, }) => { const { getEntityConfig } = useConfig() + const { query: currentQuery, refineListData } = useListQuery() - const { getTableState } = useServerFunctions() - - const { admin: { defaultColumns, useAsTitle } = {}, fields } = getEntityConfig({ + const { admin: { defaultColumns } = {} } = getEntityConfig({ collectionSlug, }) - const prevCollection = React.useRef( - Array.isArray(collectionSlug) ? collectionSlug[0] : collectionSlug, - ) - const { getPreference } = usePreferences() - - const [tableColumns, setTableColumns] = React.useState(columnState) - const abortTableStateRef = React.useRef(null) - const abortToggleColumnRef = React.useRef(null) - - const moveColumn = useCallback( - async (args: { fromIndex: number; toIndex: number }) => { - const controller = handleAbortRef(abortTableStateRef) - - const { fromIndex, toIndex } = args - const withMovedColumn = [...tableColumns] - const [columnToMove] = withMovedColumn.splice(fromIndex, 1) - withMovedColumn.splice(toIndex, 0, columnToMove) - - setTableColumns(withMovedColumn) - - const result = await getTableState({ - collectionSlug, - columns: sanitizeColumns(withMovedColumn), - docs, - enableRowSelections, - renderRowTypes, - signal: controller.signal, - tableAppearance, - }) - - if (result) { - setTableColumns(result.state) - setTable(result.Table) - } - - abortTableStateRef.current = null - }, - [ - tableColumns, - collectionSlug, - docs, - getTableState, - setTable, - enableRowSelections, - renderRowTypes, - tableAppearance, - ], + const [columnState, setOptimisticColumnState] = React.useOptimistic( + columnStateFromProps, + (state, action: Column[]) => action, ) const toggleColumn = useCallback( async (column: string) => { - const controller = handleAbortRef(abortToggleColumnRef) - - const { newColumnState, toggledColumns } = tableColumns.reduce<{ - newColumnState: Column[] - toggledColumns: Pick[] - }>( - (acc, col) => { - if (col.accessor === column) { - acc.newColumnState.push({ - ...col, - accessor: col.accessor, - active: !col.active, - }) - acc.toggledColumns.push({ - accessor: col.accessor, - active: !col.active, - }) - } else { - acc.newColumnState.push(col) - acc.toggledColumns.push({ - accessor: col.accessor, - active: col.active, - }) - } - - return acc - }, - { newColumnState: [], toggledColumns: [] }, - ) - - setTableColumns(newColumnState) - - const result = await getTableState({ - collectionSlug, - columns: toggledColumns, - docs, - enableRowSelections, - renderRowTypes, - signal: controller.signal, - tableAppearance, + const newColumnState = (columnState || []).map((col) => { + if (col.accessor === column) { + return { ...col, active: !col.active } + } + return col }) - if (result) { - setTableColumns(result.state) - setTable(result.Table) - } + startTransition(() => { + setOptimisticColumnState(newColumnState) + }) - abortToggleColumnRef.current = null + await refineListData({ + columns: transformColumnsToSearchParams(newColumnState), + }) }, - [ - tableColumns, - getTableState, - setTable, - collectionSlug, - docs, - enableRowSelections, - renderRowTypes, - tableAppearance, - ], + [refineListData, columnState, setOptimisticColumnState], ) - const setActiveColumns = React.useCallback( - async (activeColumnAccessors: string[]) => { - const activeColumns: Pick[] = tableColumns - .map((col) => { - return { - accessor: col.accessor, - active: activeColumnAccessors.includes(col.accessor), - } - }) - .sort((first, second) => { - const indexOfFirst = activeColumnAccessors.indexOf(first.accessor) - const indexOfSecond = activeColumnAccessors.indexOf(second.accessor) + const moveColumn = useCallback( + async (args: { fromIndex: number; toIndex: number }) => { + const { fromIndex, toIndex } = args + const newColumnState = [...(columnState || [])] + const [columnToMove] = newColumnState.splice(fromIndex, 1) + newColumnState.splice(toIndex, 0, columnToMove) - if (indexOfFirst === -1 || indexOfSecond === -1) { - return 0 - } - - return indexOfFirst > indexOfSecond ? 1 : -1 - }) - - const { state: columnState, Table } = await getTableState({ - collectionSlug, - columns: activeColumns, - docs, - enableRowSelections, - renderRowTypes, - tableAppearance, + startTransition(() => { + setOptimisticColumnState(newColumnState) }) - setTableColumns(columnState) - setTable(Table) + await refineListData({ + columns: transformColumnsToSearchParams(newColumnState), + }) }, - [ - tableColumns, - getTableState, - setTable, - collectionSlug, - docs, - enableRowSelections, - renderRowTypes, - tableAppearance, - ], + [columnState, refineListData, setOptimisticColumnState], + ) + + const setActiveColumns = useCallback( + async (columns: string[]) => { + const newColumnState = currentQuery.columns + + columns.forEach((colName) => { + const colIndex = newColumnState.findIndex((c) => colName === c) + + // ensure the name does not begin with a `-` which denotes an inactive column + if (colIndex !== undefined && newColumnState[colIndex][0] === '-') { + newColumnState[colIndex] = colName.slice(1) + } + }) + + await refineListData({ columns: newColumnState }) + }, + [currentQuery, refineListData], ) const resetColumnsState = React.useCallback(async () => { await setActiveColumns(defaultColumns) }, [defaultColumns, setActiveColumns]) - // ////////////////////////////////////////////// - // Get preferences on collection change (drawers) - // ////////////////////////////////////////////// - - React.useEffect(() => { - const sync = async () => { - const defaultCollection = Array.isArray(collectionSlug) ? collectionSlug[0] : collectionSlug - const collectionHasChanged = prevCollection.current !== defaultCollection - - if (collectionHasChanged || !listPreferences) { - const currentPreferences = await getPreference<{ - columns: ListPreferences['columns'] - }>(preferenceKey) - - prevCollection.current = defaultCollection - - if (currentPreferences?.columns) { - // setTableColumns() - // buildColumnState({ - // beforeRows, - // columnPreferences: currentPreferences?.columns, - // columns: initialColumns, - // enableRowSelections, - // fields, - // sortColumnProps, - // useAsTitle, - // }), - } - } - } - - void sync() - }, [ - preferenceKey, - getPreference, - collectionSlug, - fields, - defaultColumns, - useAsTitle, - listPreferences, - enableRowSelections, - sortColumnProps, - ]) - - useEffect(() => { - setTableColumns(columnState) - }, [columnState]) - - useEffect(() => { - const abortTableState = abortTableStateRef.current - - return () => { - abortAndIgnore(abortTableState) - } - }, []) - return ( Promise + resetColumnsState: () => Promise + setActiveColumns: (columns: string[]) => Promise + toggleColumn: (column: string) => Promise +} + +export type TableColumnsProviderProps = { + readonly children: React.ReactNode + readonly collectionSlug: string | string[] + readonly columnState: Column[] + /** + * @deprecated + */ + readonly docs?: any[] + /** + * @deprecated + */ + readonly enableRowSelections?: boolean + readonly LinkedCellOverride?: React.ReactNode + /** + * @deprecated + */ + readonly listPreferences?: ListPreferences + /** + * @deprecated + */ + readonly preferenceKey?: string + /** + * @deprecated + */ + readonly renderRowTypes?: boolean + /** + * @deprecated + */ + readonly setTable?: (Table: React.ReactNode) => void + /** + * @deprecated + */ + readonly sortColumnProps?: Partial + /** + * @deprecated + */ + readonly tableAppearance?: 'condensed' | 'default' +} diff --git a/packages/ui/src/elements/ThumbnailCard/index.scss b/packages/ui/src/elements/ThumbnailCard/index.scss index 42c805d554..534ba87f99 100644 --- a/packages/ui/src/elements/ThumbnailCard/index.scss +++ b/packages/ui/src/elements/ThumbnailCard/index.scss @@ -9,9 +9,10 @@ border: 1px solid var(--theme-border-color); border-radius: var(--style-radius-m); transition: border 100ms cubic-bezier(0, 0.2, 0.2, 1); + padding: base(0.5); &__label { - padding: base(0.5); + padding: base(0.75) base(0.5) base(0.25) base(0.5); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/packages/ui/src/elements/Toasts/fieldErrors.tsx b/packages/ui/src/elements/Toasts/fieldErrors.tsx new file mode 100644 index 0000000000..d936d2fe1d --- /dev/null +++ b/packages/ui/src/elements/Toasts/fieldErrors.tsx @@ -0,0 +1,75 @@ +'use client' + +import React from 'react' + +function groupSimilarErrors(items: string[]): string[] { + const result: string[] = [] + + for (const item of items) { + if (item) { + const parts = item.split(' → ') + let inserted = false + + // Find a place where a similar path exists + for (let i = 0; i < result.length; i++) { + if (result[i].startsWith(parts[0])) { + result.splice(i + 1, 0, item) + inserted = true + break + } + } + + // If no similar path was found, add to the end + if (!inserted) { + result.push(item) + } + } + } + + return result +} + +function createErrorsFromMessage(message: string): { + errors?: string[] + message: string +} { + const [intro, errorsString] = message.split(':') + const errors = (errorsString || '') + .split(',') + .map((error) => error.replaceAll(' > ', ' → ').trim()) + + if (errors.length === 0) { + return { + message: intro, + } + } + + if (errors.length === 1) { + return { + errors, + message: `${intro}:`, + } + } + + return { + errors: groupSimilarErrors(errors), + message: `${intro} (${errors.length}):`, + } +} + +export function FieldErrorsToast({ errorMessage }) { + const [{ errors, message }] = React.useState(() => createErrorsFromMessage(errorMessage)) + + return ( +
    + {message} + {Array.isArray(errors) && errors.length > 0 ? ( +
      + {errors.map((error, index) => { + return
    • {error}
    • + })} +
    + ) : null} +
    + ) +} diff --git a/packages/ui/src/elements/WhereBuilder/Condition/index.tsx b/packages/ui/src/elements/WhereBuilder/Condition/index.tsx index 73850bec4d..644ee39215 100644 --- a/packages/ui/src/elements/WhereBuilder/Condition/index.tsx +++ b/packages/ui/src/elements/WhereBuilder/Condition/index.tsx @@ -1,7 +1,7 @@ 'use client' import React, { useCallback, useEffect, useState } from 'react' -import type { AddCondition, ReducedField, UpdateCondition } from '../types.js' +import type { AddCondition, ReducedField, RemoveCondition, UpdateCondition } from '../types.js' export type Props = { readonly addCondition: AddCondition @@ -11,7 +11,7 @@ export type Props = { readonly operator: Operator readonly orIndex: number readonly reducedFields: ReducedField[] - readonly removeCondition: ({ andIndex, orIndex }: { andIndex: number; orIndex: number }) => void + readonly removeCondition: RemoveCondition readonly RenderedFilter: React.ReactNode readonly updateCondition: UpdateCondition readonly value: string @@ -67,9 +67,9 @@ export const Condition: React.FC = (props) => { valueOptions = reducedField.field.options } - const updateValue = useEffectEvent((debouncedValue) => { + const updateValue = useEffectEvent(async (debouncedValue) => { if (operator) { - updateCondition({ + await updateCondition({ andIndex, field: reducedField, operator, @@ -80,7 +80,7 @@ export const Condition: React.FC = (props) => { }) useEffect(() => { - updateValue(debouncedValue) + void updateValue(debouncedValue) }, [debouncedValue]) const disabled = @@ -88,9 +88,9 @@ export const Condition: React.FC = (props) => { reducedField?.field?.admin?.disableListFilter const handleFieldChange = useCallback( - (field: Option) => { + async (field: Option) => { setInternalValue(undefined) - updateCondition({ + await updateCondition({ andIndex, field: reducedFields.find((option) => option.value === field.value), operator, @@ -102,8 +102,8 @@ export const Condition: React.FC = (props) => { ) const handleOperatorChange = useCallback( - (operator: Option) => { - updateCondition({ + async (operator: Option) => { + await updateCondition({ andIndex, field: reducedField, operator: operator.value, diff --git a/packages/ui/src/elements/WhereBuilder/index.tsx b/packages/ui/src/elements/WhereBuilder/index.tsx index d7cb5ca9b4..d9b4b21bda 100644 --- a/packages/ui/src/elements/WhereBuilder/index.tsx +++ b/packages/ui/src/elements/WhereBuilder/index.tsx @@ -1,10 +1,10 @@ 'use client' -import type { Operator, Where } from 'payload' +import type { Operator } from 'payload' import { getTranslation } from '@payloadcms/translations' import React, { useMemo } from 'react' -import type { AddCondition, UpdateCondition, WhereBuilderProps } from './types.js' +import type { AddCondition, RemoveCondition, UpdateCondition, WhereBuilderProps } from './types.js' import { useListQuery } from '../../providers/ListQuery/index.js' import { useTranslation } from '../../providers/Translation/index.js' @@ -31,9 +31,8 @@ export const WhereBuilder: React.FC = (props) => { const reducedFields = useMemo(() => reduceFields({ fields, i18n }), [fields, i18n]) const { handleWhereChange, query } = useListQuery() - const [shouldUpdateQuery, setShouldUpdateQuery] = React.useState(false) - const [conditions, setConditions] = React.useState(() => { + const conditions = useMemo(() => { const whereFromSearch = query.where if (whereFromSearch) { @@ -52,10 +51,10 @@ export const WhereBuilder: React.FC = (props) => { } return [] - }) + }, [query.where]) const addCondition: AddCondition = React.useCallback( - ({ andIndex, field, orIndex, relation }) => { + async ({ andIndex, field, orIndex, relation }) => { const newConditions = [...conditions] const defaultOperator = fieldTypes[field.field.type].operators[0].value @@ -78,13 +77,13 @@ export const WhereBuilder: React.FC = (props) => { }) } - setConditions(newConditions) + await handleWhereChange({ or: newConditions }) }, - [conditions], + [conditions, handleWhereChange], ) const updateCondition: UpdateCondition = React.useCallback( - ({ andIndex, field, operator: incomingOperator, orIndex, value: valueArg }) => { + async ({ andIndex, field, operator: incomingOperator, orIndex, value: valueArg }) => { const existingRowCondition = conditions[orIndex].and[andIndex] const defaults = fieldTypes[field.field.type] @@ -100,15 +99,14 @@ export const WhereBuilder: React.FC = (props) => { const newConditions = [...conditions] newConditions[orIndex].and[andIndex] = newRowCondition - setConditions(newConditions) - setShouldUpdateQuery(true) + await handleWhereChange({ or: newConditions }) } }, - [conditions], + [conditions, handleWhereChange], ) - const removeCondition = React.useCallback( - ({ andIndex, orIndex }) => { + const removeCondition: RemoveCondition = React.useCallback( + async ({ andIndex, orIndex }) => { const newConditions = [...conditions] newConditions[orIndex].and.splice(andIndex, 1) @@ -116,22 +114,11 @@ export const WhereBuilder: React.FC = (props) => { newConditions.splice(orIndex, 1) } - setConditions(newConditions) - setShouldUpdateQuery(true) + await handleWhereChange({ or: newConditions }) }, - [conditions], + [conditions, handleWhereChange], ) - React.useEffect(() => { - if (shouldUpdateQuery) { - async function handleChange() { - await handleWhereChange({ or: conditions }) - setShouldUpdateQuery(false) - } - void handleChange() - } - }, [conditions, handleWhereChange, shouldUpdateQuery]) - return (
    {conditions.length > 0 && ( @@ -189,8 +176,8 @@ export const WhereBuilder: React.FC = (props) => { icon="plus" iconPosition="left" iconStyle="with-border" - onClick={() => { - addCondition({ + onClick={async () => { + await addCondition({ andIndex: 0, field: reducedFields[0], orIndex: conditions.length, @@ -211,9 +198,9 @@ export const WhereBuilder: React.FC = (props) => { icon="plus" iconPosition="left" iconStyle="with-border" - onClick={() => { + onClick={async () => { if (reducedFields.length > 0) { - addCondition({ + await addCondition({ andIndex: 0, field: reducedFields.find((field) => !field.field.admin?.disableListFilter), orIndex: conditions.length, diff --git a/packages/ui/src/elements/WhereBuilder/types.ts b/packages/ui/src/elements/WhereBuilder/types.ts index 86cc7f530c..e7bd61fb6d 100644 --- a/packages/ui/src/elements/WhereBuilder/types.ts +++ b/packages/ui/src/elements/WhereBuilder/types.ts @@ -65,7 +65,7 @@ export type AddCondition = ({ field: ReducedField orIndex: number relation: 'and' | 'or' -}) => void +}) => Promise | void export type UpdateCondition = ({ andIndex, @@ -79,4 +79,12 @@ export type UpdateCondition = ({ operator: string orIndex: number value: string -}) => void +}) => Promise | void + +export type RemoveCondition = ({ + andIndex, + orIndex, +}: { + andIndex: number + orIndex: number +}) => Promise | void diff --git a/packages/ui/src/exports/client/index.ts b/packages/ui/src/exports/client/index.ts index 2dccdfc451..1d1a53d725 100644 --- a/packages/ui/src/exports/client/index.ts +++ b/packages/ui/src/exports/client/index.ts @@ -192,6 +192,7 @@ export { useAllFormFields, useDocumentForm, useForm, + useFormBackgroundProcessing, useFormFields, useFormInitializing, useFormModified, @@ -290,6 +291,8 @@ export { export { ScrollInfoProvider, useScrollInfo } from '../../providers/ScrollInfo/index.js' export { SearchParamsProvider, useSearchParams } from '../../providers/SearchParams/index.js' export { SelectionProvider, useSelection } from '../../providers/Selection/index.js' +export { UploadHandlersProvider, useUploadHandlers } from '../../providers/UploadHandlers/index.js' +export type { UploadHandlersContext } from '../../providers/UploadHandlers/index.js' export { defaultTheme, type Theme, ThemeProvider, useTheme } from '../../providers/Theme/index.js' export { TranslationProvider, useTranslation } from '../../providers/Translation/index.js' export { useWindowInfo, WindowInfoProvider } from '../../providers/WindowInfo/index.js' diff --git a/packages/ui/src/fields/Blocks/BlockRow.tsx b/packages/ui/src/fields/Blocks/BlockRow.tsx index c3bdba4271..f4e867b18e 100644 --- a/packages/ui/src/fields/Blocks/BlockRow.tsx +++ b/packages/ui/src/fields/Blocks/BlockRow.tsx @@ -80,6 +80,8 @@ export const BlockRow: React.FC = ({ const fieldHasErrors = hasSubmitted && errorCount > 0 + const showBlockName = !block.admin?.disableBlockName + const classNames = [ `${baseClass}__row`, fieldHasErrors ? `${baseClass}__row--has-errors` : `${baseClass}__row--no-errors`, @@ -155,7 +157,7 @@ export const BlockRow: React.FC = ({ > {getTranslation(block.labels.singular, i18n)} - + {showBlockName && } {fieldHasErrors && } )} diff --git a/packages/ui/src/fields/Blocks/BlocksDrawer/index.scss b/packages/ui/src/fields/Blocks/BlocksDrawer/index.scss index 07d0947722..c84741e9b1 100644 --- a/packages/ui/src/fields/Blocks/BlocksDrawer/index.scss +++ b/packages/ui/src/fields/Blocks/BlocksDrawer/index.scss @@ -16,9 +16,19 @@ } &__default-image { + display: flex; + align-items: center; + justify-content: center; width: 100%; + aspect-ratio: 3 / 2; overflow: hidden; - padding-top: base(0.75); + + img, + svg { + width: 100%; + height: 100%; + object-fit: cover; + } } &__block-groups { @@ -60,7 +70,6 @@ &__blocks { grid-template-columns: repeat(3, 1fr); - gap: base(0.5); } &__block-groups { diff --git a/packages/ui/src/fields/Blocks/BlocksDrawer/index.tsx b/packages/ui/src/fields/Blocks/BlocksDrawer/index.tsx index 4b638a0664..9ce79c32a6 100644 --- a/packages/ui/src/fields/Blocks/BlocksDrawer/index.tsx +++ b/packages/ui/src/fields/Blocks/BlocksDrawer/index.tsx @@ -123,13 +123,13 @@ export const BlocksDrawer: React.FC = (props) => { closeModal(drawerSlug) }} thumbnail={ - imageURL ? ( - {imageAltText} - ) : ( -
    +
    + {imageURL ? ( + {imageAltText} + ) : ( -
    - ) + )} +
    } /> diff --git a/packages/ui/src/fields/Collapsible/index.tsx b/packages/ui/src/fields/Collapsible/index.tsx index b4a307fda1..4955fc40ec 100644 --- a/packages/ui/src/fields/Collapsible/index.tsx +++ b/packages/ui/src/fields/Collapsible/index.tsx @@ -107,7 +107,12 @@ const CollapsibleFieldComponent: CollapsibleFieldClientComponent = (props) => { return ( - +
    *:nth-child(1)) { + margin-bottom: var(--base); + } + // If there is more than one child, add inline-margins to space them out. &:has(> *:nth-child(2)) { margin-inline: calc(var(--base) / -4); // add negative margin to counteract the gap. diff --git a/packages/ui/src/fields/Row/index.tsx b/packages/ui/src/fields/Row/index.tsx index ce1c172642..d6ddb6324b 100644 --- a/packages/ui/src/fields/Row/index.tsx +++ b/packages/ui/src/fields/Row/index.tsx @@ -13,7 +13,7 @@ const baseClass = 'row' const RowFieldComponent: RowFieldClientComponent = (props) => { const { - field: { admin: { className } = {}, fields }, + field: { admin: { className, style } = {}, fields }, forceRender = false, indexPath = '', parentPath = '', @@ -24,7 +24,10 @@ const RowFieldComponent: RowFieldClientComponent = (props) => { return ( -
    +
    = ({ isActive, parentPath, setIsAc const [errorCount, setErrorCount] = useState(undefined) const path = [ - ...(parentPath ? parentPath.split('.') : []), + // removes parent 'tabs' path segment, i.e. `_index-0` + ...(parentPath ? parentPath.split('.').slice(0, -1) : []), ...(tabHasName(tab) ? [tab.name] : []), - ].join('.') + ] const fieldHasErrors = errorCount > 0 return ( - +