Compare commits

..

3 Commits

Author SHA1 Message Date
Elliot DeNolf
429f1a1ccd chore(release): v3.0.0-beta.115 [skip ci] 2024-10-16 14:12:20 -04:00
Dan Ribbens
7019f22aad chore: bump drizzle-orm 0.35.1 (#8742) 2024-10-16 15:14:20 +00:00
Said Akhrarov
c4fa885e84 fix(ui): restrict file picking via upload config mimetypes (#8710)
Fixes #8673

This PR restricts inputs with `type="file"` to only those mimetypes
specified in collection upload configs. This also works for the input in
`bulkUpload` and drag-and-drop capabilities by omitting dropped files if
they do not conform to the upload config mimetypes. This PR also assumes
that an upload config with an empty mimetype array should accept all
files since the negation of that statement makes an upload collection
redundant.
2024-10-16 09:24:21 -04:00
39 changed files with 83 additions and 67 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "payload-monorepo",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"private": true,
"type": "module",
"scripts": {
@@ -133,7 +133,7 @@
"cross-env": "7.0.3",
"dotenv": "16.4.5",
"drizzle-kit": "0.26.1",
"drizzle-orm": "0.35.0",
"drizzle-orm": "0.35.1",
"escape-html": "^1.0.3",
"execa": "5.1.1",
"form-data": "3.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "create-payload-app",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"homepage": "https://payloadcms.com",
"repository": {
"type": "git",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/db-mongodb",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The officially supported MongoDB database adapter for Payload",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/db-postgres",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The officially supported Postgres database adapter for Payload",
"homepage": "https://payloadcms.com",
"repository": {
@@ -51,7 +51,7 @@
"@types/pg": "8.10.2",
"console-table-printer": "2.11.2",
"drizzle-kit": "0.26.1",
"drizzle-orm": "0.35.0",
"drizzle-orm": "0.35.1",
"pg": "8.11.3",
"prompts": "2.4.2",
"to-snake-case": "1.0.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/db-sqlite",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The officially supported SQLite database adapter for Payload",
"homepage": "https://payloadcms.com",
"repository": {
@@ -49,7 +49,7 @@
"@payloadcms/drizzle": "workspace:*",
"console-table-printer": "2.11.2",
"drizzle-kit": "0.26.1",
"drizzle-orm": "0.35.0",
"drizzle-orm": "0.35.1",
"prompts": "2.4.2",
"to-snake-case": "1.0.0",
"uuid": "9.0.0"

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/db-vercel-postgres",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Vercel Postgres adapter for Payload",
"homepage": "https://payloadcms.com",
"repository": {
@@ -51,7 +51,7 @@
"@vercel/postgres": "^0.9.0",
"console-table-printer": "2.11.2",
"drizzle-kit": "0.26.1",
"drizzle-orm": "0.35.0",
"drizzle-orm": "0.35.1",
"pg": "8.11.3",
"prompts": "2.4.2",
"to-snake-case": "1.0.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/drizzle",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "A library of shared functions used by different payload database adapters",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/email-nodemailer",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Payload Nodemailer Email Adapter",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/email-resend",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Payload Resend Email Adapter",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/graphql",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"homepage": "https://payloadcms.com",
"repository": {
"type": "git",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/live-preview-react",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The official React SDK for Payload Live Preview",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/live-preview-vue",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The official Vue SDK for Payload Live Preview",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/live-preview",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The official live preview JavaScript SDK for Payload",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/next",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"homepage": "https://payloadcms.com",
"repository": {
"type": "git",

View File

@@ -1,6 +1,6 @@
{
"name": "payload",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Node, React, Headless CMS and Application Framework built on Next.js",
"keywords": [
"admin panel",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-cloud-storage",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The official cloud storage plugin for Payload CMS",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-cloud",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The official Payload Cloud plugin",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-form-builder",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Form builder plugin for Payload CMS",
"keywords": [
"payload",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-nested-docs",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The official Nested Docs plugin for Payload",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-redirects",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Redirects plugin for Payload",
"keywords": [
"payload",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-search",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Search plugin for Payload",
"keywords": [
"payload",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-sentry",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Sentry plugin for Payload",
"keywords": [
"payload",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-seo",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "SEO plugin for Payload",
"keywords": [
"payload",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/plugin-stripe",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Stripe plugin for Payload",
"keywords": [
"payload",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/richtext-lexical",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The officially supported Lexical richtext adapter for Payload",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/richtext-slate",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "The officially supported Slate richtext adapter for Payload",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/storage-azure",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Payload storage adapter for Azure Blob Storage",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/storage-gcs",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Payload storage adapter for Google Cloud Storage",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/storage-s3",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Payload storage adapter for Amazon S3",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/storage-uploadthing",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Payload storage adapter for uploadthing",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/storage-vercel-blob",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"description": "Payload storage adapter for Vercel Blob Storage",
"homepage": "https://payloadcms.com",
"repository": {

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/translations",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"homepage": "https://payloadcms.com",
"repository": {
"type": "git",

View File

@@ -1,6 +1,6 @@
{
"name": "@payloadcms/ui",
"version": "3.0.0-beta.114",
"version": "3.0.0-beta.115",
"homepage": "https://payloadcms.com",
"repository": {
"type": "git",

View File

@@ -11,10 +11,11 @@ import './index.scss'
const baseClass = 'bulk-upload--add-files'
type Props = {
readonly acceptMimeTypes?: string
readonly onCancel: () => void
readonly onDrop: (acceptedFiles: FileList) => void
}
export function AddFilesView({ onCancel, onDrop }: Props) {
export function AddFilesView({ acceptMimeTypes, onCancel, onDrop }: Props) {
const { t } = useTranslation()
const inputRef = React.useRef(null)
@@ -37,6 +38,7 @@ export function AddFilesView({ onCancel, onDrop }: Props) {
{t('upload:selectFile')}
</Button>
<input
accept={acceptMimeTypes}
aria-hidden="true"
className={`${baseClass}__hidden-input`}
hidden

View File

@@ -5,6 +5,7 @@ import type { JsonObject } from 'payload'
import { useModal } from '@faceless-ui/modal'
import React from 'react'
import { useConfig } from '../../providers/Config/index.js'
import { EditDepthProvider, useEditDepth } from '../../providers/EditDepth/index.js'
import { Drawer } from '../Drawer/index.js'
import { AddFilesView } from './AddFilesView/index.js'
@@ -17,12 +18,27 @@ function DrawerContent() {
const { addFiles, forms, isInitializing } = useFormsManager()
const { closeModal } = useModal()
const { collectionSlug, drawerSlug } = useBulkUpload()
const { config } = useConfig()
const uploadCollection = config.collections.find((col) => col.slug === collectionSlug)
const uploadConfig = uploadCollection.upload
const uploadMimeTypes = uploadConfig.mimeTypes
const onDrop = React.useCallback(
(acceptedFiles: FileList) => {
void addFiles(acceptedFiles)
const fileTransfer = new DataTransfer()
for (const candidateFile of acceptedFiles) {
if (
uploadMimeTypes === undefined ||
uploadMimeTypes.length === 0 ||
uploadMimeTypes?.includes(candidateFile.type)
) {
fileTransfer.items.add(candidateFile)
}
}
void addFiles(fileTransfer.files)
},
[addFiles],
[addFiles, uploadMimeTypes],
)
if (!collectionSlug) {
@@ -30,7 +46,13 @@ function DrawerContent() {
}
if (!forms.length && !isInitializing) {
return <AddFilesView onCancel={() => closeModal(drawerSlug)} onDrop={onDrop} />
return (
<AddFilesView
acceptMimeTypes={uploadMimeTypes?.join(', ')}
onCancel={() => closeModal(drawerSlug)}
onDrop={onDrop}
/>
)
} else {
return <AddingFilesView />
}

View File

@@ -218,6 +218,8 @@ export const Upload: React.FC<UploadProps> = (props) => {
const showFocalPoint = focalPoint && (hasImageSizes || hasResizeOptions || focalPointEnabled)
const acceptMimeTypes = uploadConfig.mimeTypes?.join(', ')
return (
<div className={[fieldBaseClass, baseClass].filter(Boolean).join(' ')}>
<FieldError field={null} message={errorMessage} showError={showError} />
@@ -251,6 +253,7 @@ export const Upload: React.FC<UploadProps> = (props) => {
{t('upload:selectFile')}
</Button>
<input
accept={acceptMimeTypes}
aria-hidden="true"
className={`${baseClass}__hidden-input`}
hidden

30
pnpm-lock.yaml generated
View File

@@ -10,7 +10,7 @@ overrides:
copyfiles: 2.4.1
cross-env: 7.0.3
dotenv: 16.4.5
drizzle-orm: 0.35.0
drizzle-orm: 0.35.1
graphql: ^16.8.1
mongodb-memory-server: ^9.0
react: 19.0.0-rc-3edc000d-20240926
@@ -112,8 +112,8 @@ importers:
specifier: 0.26.1
version: 0.26.1
drizzle-orm:
specifier: 0.35.0
version: 0.35.0(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
specifier: 0.35.1
version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
escape-html:
specifier: ^1.0.3
version: 1.0.3
@@ -318,8 +318,8 @@ importers:
specifier: 0.26.1
version: 0.26.1
drizzle-orm:
specifier: 0.35.0
version: 0.35.0(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
specifier: 0.35.1
version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
pg:
specifier: 8.11.3
version: 8.11.3
@@ -364,8 +364,8 @@ importers:
specifier: 0.26.1
version: 0.26.1
drizzle-orm:
specifier: 0.35.0
version: 0.35.0(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
specifier: 0.35.1
version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
prompts:
specifier: 2.4.2
version: 2.4.2
@@ -404,8 +404,8 @@ importers:
specifier: 0.26.1
version: 0.26.1
drizzle-orm:
specifier: 0.35.0
version: 0.35.0(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
specifier: 0.35.1
version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
pg:
specifier: 8.11.3
version: 8.11.3
@@ -444,8 +444,8 @@ importers:
specifier: 2.11.2
version: 2.11.2
drizzle-orm:
specifier: 0.35.0
version: 0.35.0(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
specifier: 0.35.1
version: 0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1)
prompts:
specifier: 2.4.2
version: 2.4.2
@@ -5873,8 +5873,8 @@ packages:
resolution: {integrity: sha512-5/e1tzOPicPDooCm/uJIU9mWK3eD5dhW5EY61TQyVVo29xYxFLmZpXlBdOYlbfDHBsNhVzhb0XjWFmAAj7d7WA==}
hasBin: true
drizzle-orm@0.35.0:
resolution: {integrity: sha512-fyTKnQ6WZQqSUy6yM4Do2tJPBg1ALR0vJtO9xUTLLubD+0qS1PPuu8aVOeLZQo+g8RPJn+Vqoh30/3lSS8/a2w==}
drizzle-orm@0.35.1:
resolution: {integrity: sha512-HQxDdYuXlZFuvDPztlUIzrX8TqWa/Ej6uN6L0hkbuGL4slexOUMc3u4nXVU15RQ5QYbk+uLQnR6v1+OIrdCTXQ==}
peerDependencies:
'@aws-sdk/client-rds-data': '>=3'
'@cloudflare/workers-types': '>=3'
@@ -15445,7 +15445,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
drizzle-orm@0.35.0(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1):
drizzle-orm@0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1):
optionalDependencies:
'@libsql/client': 0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)
'@neondatabase/serverless': 0.9.4
@@ -15456,7 +15456,7 @@ snapshots:
pg: 8.11.3
react: 19.0.0-rc-3edc000d-20240926
drizzle-orm@0.35.0(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1):
drizzle-orm@0.35.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.4)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0-rc-3edc000d-20240926)(types-react@19.0.0-rc.1):
optionalDependencies:
'@libsql/client': 0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)
'@neondatabase/serverless': 0.9.4

View File

@@ -1,7 +0,0 @@
import type { CollectionConfig } from 'payload'
export const UsersCollection: CollectionConfig = {
slug: 'users',
auth: true,
fields: [],
}

View File

@@ -6,16 +6,13 @@ import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js'
import { devUser } from '../credentials.js'
import { MediaCollection } from './collections/Media/index.js'
import { PostsCollection, postsSlug } from './collections/Posts/index.js'
import { UsersCollection } from './collections/Users/index.js'
import { MenuGlobal } from './globals/Menu/index.js'
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
export default buildConfigWithDefaults({
// ...extend config here
collections: [
UsersCollection,
PostsCollection,
{
slug: 'simple',
@@ -29,7 +26,6 @@ export default buildConfigWithDefaults({
MediaCollection,
],
admin: {
user: 'users',
importMap: {
baseDir: path.resolve(dirname),
},