fix: filesRequiredOnCreate typing, tests, linting (#3737)
This commit is contained in:
@@ -162,8 +162,8 @@ const collectionSchema = joi.object().keys({
|
||||
adminThumbnail: joi.alternatives().try(joi.string(), joi.func()),
|
||||
crop: joi.bool(),
|
||||
disableLocalStorage: joi.bool(),
|
||||
focalPoint: joi.bool(),
|
||||
filesRequiredOnCreate: joi.bool(),
|
||||
focalPoint: joi.bool(),
|
||||
formatOptions: joi.object().keys({
|
||||
format: joi.string(),
|
||||
options: joi.object(),
|
||||
|
||||
@@ -63,6 +63,7 @@ export type IncomingUploadType = {
|
||||
adminThumbnail?: GetAdminThumbnail | string
|
||||
crop?: boolean
|
||||
disableLocalStorage?: boolean
|
||||
filesRequiredOnCreate?: boolean
|
||||
focalPoint?: boolean
|
||||
/** Options for original upload file only. For sizes, set each formatOptions individually. */
|
||||
formatOptions?: ImageUploadFormatOptions
|
||||
@@ -80,6 +81,7 @@ export type Upload = {
|
||||
adminThumbnail?: GetAdminThumbnail | string
|
||||
crop?: boolean
|
||||
disableLocalStorage?: boolean
|
||||
filesRequiredOnCreate?: boolean
|
||||
focalPoint?: boolean
|
||||
formatOptions?: ImageUploadFormatOptions
|
||||
handlers?: any[]
|
||||
@@ -90,7 +92,6 @@ export type Upload = {
|
||||
staticOptions?: serveStatic.ServeStaticOptions<express.Response<any, Record<string, any>>>
|
||||
staticURL: string
|
||||
trimOptions?: ImageUploadTrimOptions
|
||||
filesRequiredOnCreate?: boolean
|
||||
}
|
||||
|
||||
export type File = {
|
||||
|
||||
@@ -401,6 +401,24 @@ export default buildConfigWithDefaults({
|
||||
Uploads1,
|
||||
Uploads2,
|
||||
AdminThumbnailCol,
|
||||
{
|
||||
slug: 'optional-file',
|
||||
upload: {
|
||||
staticURL: '/optional',
|
||||
staticDir: './optional',
|
||||
filesRequiredOnCreate: false,
|
||||
},
|
||||
fields: [],
|
||||
},
|
||||
{
|
||||
slug: 'required-file',
|
||||
upload: {
|
||||
staticURL: '/required',
|
||||
staticDir: './required',
|
||||
filesRequiredOnCreate: true,
|
||||
},
|
||||
fields: [],
|
||||
},
|
||||
],
|
||||
onInit: async (payload) => {
|
||||
const uploadsDir = path.resolve(__dirname, './media')
|
||||
|
||||
@@ -540,6 +540,48 @@ describe('Collections - Uploads', () => {
|
||||
|
||||
expect(await fileExists(path.join(__dirname, doc.filename))).toBe(false)
|
||||
})
|
||||
|
||||
describe('filesRequiredOnCreate', () => {
|
||||
// eslint-disable-next-line @typescript-eslint/require-await
|
||||
it('should allow file to be optional if filesRequiredOnCreate is false', async () => {
|
||||
expect(
|
||||
async () =>
|
||||
await payload.create({
|
||||
// @ts-ignore
|
||||
collection: 'optional-file',
|
||||
data: {},
|
||||
}),
|
||||
).not.toThrow()
|
||||
})
|
||||
|
||||
it('should throw an error if no file and filesRequiredOnCreate is true', async () => {
|
||||
await expect(async () =>
|
||||
payload.create({
|
||||
// @ts-ignore
|
||||
collection: 'required-file',
|
||||
data: {},
|
||||
}),
|
||||
).rejects.toThrow(
|
||||
expect.objectContaining({
|
||||
name: 'MissingFile',
|
||||
message: 'No files were uploaded.',
|
||||
}),
|
||||
)
|
||||
})
|
||||
it('should throw an error if no file and filesRequiredOnCreate is not defined', async () => {
|
||||
await expect(async () =>
|
||||
payload.create({
|
||||
collection: mediaSlug,
|
||||
data: {},
|
||||
}),
|
||||
).rejects.toThrow(
|
||||
expect.objectContaining({
|
||||
name: 'MissingFile',
|
||||
message: 'No files were uploaded.',
|
||||
}),
|
||||
)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
async function fileExists(fileName: string): Promise<boolean> {
|
||||
|
||||
@@ -11,13 +11,23 @@ export interface Config {
|
||||
relation: Relation
|
||||
audio: Audio
|
||||
'gif-resize': GifResize
|
||||
'no-image-sizes': NoImageSize
|
||||
'crop-only': CropOnly
|
||||
'focal-only': FocalOnly
|
||||
media: Media
|
||||
enlarge: Enlarge
|
||||
reduce: Reduce
|
||||
'media-trim': MediaTrim
|
||||
'unstored-media': UnstoredMedia
|
||||
'externally-served-media': ExternallyServedMedia
|
||||
'uploads-1': Uploads1
|
||||
'uploads-2': Uploads2
|
||||
'admin-thumbnail': AdminThumbnail
|
||||
'optional-file': OptionalFile
|
||||
'required-file': RequiredFile
|
||||
users: User
|
||||
'payload-preferences': PayloadPreference
|
||||
'payload-migrations': PayloadMigration
|
||||
}
|
||||
globals: {}
|
||||
}
|
||||
@@ -70,6 +80,14 @@ export interface Media {
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
accidentalSameSize?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
tablet?: {
|
||||
url?: string
|
||||
width?: number
|
||||
@@ -94,6 +112,62 @@ export interface Media {
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest2?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest3?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest4?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest5?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest6?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest7?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
}
|
||||
}
|
||||
export interface Audio {
|
||||
@@ -131,6 +205,189 @@ export interface GifResize {
|
||||
}
|
||||
}
|
||||
}
|
||||
export interface NoImageSize {
|
||||
id: string
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
url?: string
|
||||
filename?: string
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
width?: number
|
||||
height?: number
|
||||
}
|
||||
export interface CropOnly {
|
||||
id: string
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
url?: string
|
||||
filename?: string
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
width?: number
|
||||
height?: number
|
||||
sizes?: {
|
||||
focalTest?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest2?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest3?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
}
|
||||
}
|
||||
export interface FocalOnly {
|
||||
id: string
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
url?: string
|
||||
filename?: string
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
width?: number
|
||||
height?: number
|
||||
sizes?: {
|
||||
focalTest?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest2?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
focalTest3?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
}
|
||||
}
|
||||
export interface Enlarge {
|
||||
id: string
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
url?: string
|
||||
filename?: string
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
width?: number
|
||||
height?: number
|
||||
sizes?: {
|
||||
accidentalSameSize?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
sameSizeWithNewFormat?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
resizedLarger?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
resizedSmaller?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
widthLowerHeightLarger?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
}
|
||||
}
|
||||
export interface Reduce {
|
||||
id: string
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
url?: string
|
||||
filename?: string
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
width?: number
|
||||
height?: number
|
||||
sizes?: {
|
||||
accidentalSameSize?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
sameSizeWithNewFormat?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
resizedLarger?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
resizedSmaller?: {
|
||||
url?: string
|
||||
width?: number
|
||||
height?: number
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
filename?: string
|
||||
}
|
||||
}
|
||||
}
|
||||
export interface MediaTrim {
|
||||
id: string
|
||||
updatedAt: string
|
||||
@@ -217,6 +474,39 @@ export interface Uploads2 {
|
||||
width?: number
|
||||
height?: number
|
||||
}
|
||||
export interface AdminThumbnail {
|
||||
id: string
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
url?: string
|
||||
filename?: string
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
width?: number
|
||||
height?: number
|
||||
}
|
||||
export interface OptionalFile {
|
||||
id: string
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
url?: string
|
||||
filename?: string
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
width?: number
|
||||
height?: number
|
||||
}
|
||||
export interface RequiredFile {
|
||||
id: string
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
url?: string
|
||||
filename?: string
|
||||
mimeType?: string
|
||||
filesize?: number
|
||||
width?: number
|
||||
height?: number
|
||||
}
|
||||
export interface User {
|
||||
id: string
|
||||
updatedAt: string
|
||||
@@ -228,5 +518,58 @@ export interface User {
|
||||
hash?: string
|
||||
loginAttempts?: number
|
||||
lockUntil?: string
|
||||
password?: string
|
||||
password: string
|
||||
}
|
||||
export interface PayloadPreference {
|
||||
id: string
|
||||
user: {
|
||||
relationTo: 'users'
|
||||
value: string | User
|
||||
}
|
||||
key?: string
|
||||
value?:
|
||||
| {
|
||||
[k: string]: unknown
|
||||
}
|
||||
| unknown[]
|
||||
| string
|
||||
| number
|
||||
| boolean
|
||||
| null
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
}
|
||||
export interface PayloadMigration {
|
||||
id: string
|
||||
name?: string
|
||||
batch?: number
|
||||
updatedAt: string
|
||||
createdAt: string
|
||||
}
|
||||
|
||||
declare module 'payload' {
|
||||
export interface GeneratedTypes {
|
||||
collections: {
|
||||
relation: Relation
|
||||
audio: Audio
|
||||
'gif-resize': GifResize
|
||||
'no-image-sizes': NoImageSize
|
||||
'crop-only': CropOnly
|
||||
'focal-only': FocalOnly
|
||||
media: Media
|
||||
enlarge: Enlarge
|
||||
reduce: Reduce
|
||||
'media-trim': MediaTrim
|
||||
'unstored-media': UnstoredMedia
|
||||
'externally-served-media': ExternallyServedMedia
|
||||
'uploads-1': Uploads1
|
||||
'uploads-2': Uploads2
|
||||
'admin-thumbnail': AdminThumbnail
|
||||
'optional-file': OptionalFile
|
||||
'required-file': RequiredFile
|
||||
users: User
|
||||
'payload-preferences': PayloadPreference
|
||||
'payload-migrations': PayloadMigration
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user