payload 4.0.0-internal.cd69eef → 4.0.0-internal.d1cc1d3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/RichText.d.ts +1 -1
- package/dist/admin/RichText.d.ts.map +1 -1
- package/dist/admin/RichText.js.map +1 -1
- package/dist/admin/functions/index.d.ts +10 -8
- package/dist/admin/functions/index.d.ts.map +1 -1
- package/dist/admin/functions/index.js.map +1 -1
- package/dist/admin/types.d.ts +2 -2
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/admin/types.js.map +1 -1
- package/dist/auth/endpoints/login.d.ts.map +1 -1
- package/dist/auth/endpoints/login.js +2 -11
- package/dist/auth/endpoints/login.js.map +1 -1
- package/dist/auth/loginWithCookie.d.ts +33 -0
- package/dist/auth/loginWithCookie.d.ts.map +1 -0
- package/dist/auth/loginWithCookie.js +34 -0
- package/dist/auth/loginWithCookie.js.map +1 -0
- package/dist/auth/serverFunctions/cookies.d.ts +47 -0
- package/dist/auth/serverFunctions/cookies.d.ts.map +1 -0
- package/dist/auth/serverFunctions/cookies.js +52 -0
- package/dist/auth/serverFunctions/cookies.js.map +1 -0
- package/dist/auth/serverFunctions/login.d.ts +29 -0
- package/dist/auth/serverFunctions/login.d.ts.map +1 -0
- package/dist/auth/serverFunctions/login.js +63 -0
- package/dist/auth/serverFunctions/login.js.map +1 -0
- package/dist/auth/serverFunctions/logout.d.ts +17 -0
- package/dist/auth/serverFunctions/logout.d.ts.map +1 -0
- package/dist/auth/serverFunctions/logout.js +58 -0
- package/dist/auth/serverFunctions/logout.js.map +1 -0
- package/dist/auth/serverFunctions/refresh.d.ts +17 -0
- package/dist/auth/serverFunctions/refresh.d.ts.map +1 -0
- package/dist/auth/serverFunctions/refresh.js +61 -0
- package/dist/auth/serverFunctions/refresh.js.map +1 -0
- package/dist/collections/config/client.d.ts +2 -3
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +5 -7
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/defaults.d.ts.map +1 -1
- package/dist/collections/config/defaults.js +1 -0
- package/dist/collections/config/defaults.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts +3 -8
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +2 -6
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/config/types.d.ts +1 -1
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/config/useAsTitle.spec.js +27 -27
- package/dist/collections/config/useAsTitle.spec.js.map +1 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +10 -0
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/restoreVersion.js +7 -4
- package/dist/collections/operations/restoreVersion.js.map +1 -1
- package/dist/collections/operations/updateByID.js +1 -0
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/config/build.js +1 -1
- package/dist/config/build.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +5 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/orderable/index.d.ts +1 -1
- package/dist/config/orderable/index.d.ts.map +1 -1
- package/dist/config/orderable/index.js +2 -2
- package/dist/config/orderable/index.js.map +1 -1
- package/dist/config/sanitize.d.ts +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +33 -40
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/createDatabaseAdapter.d.ts +1 -1
- package/dist/database/createDatabaseAdapter.d.ts.map +1 -1
- package/dist/database/createDatabaseAdapter.js +0 -2
- package/dist/database/createDatabaseAdapter.js.map +1 -1
- package/dist/database/types.d.ts +6 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/exports/auth.d.ts +5 -0
- package/dist/exports/auth.d.ts.map +1 -0
- package/dist/exports/auth.js +6 -0
- package/dist/exports/auth.js.map +1 -0
- package/dist/exports/internal.d.ts +2 -0
- package/dist/exports/internal.d.ts.map +1 -1
- package/dist/exports/internal.js +3 -1
- package/dist/exports/internal.js.map +1 -1
- package/dist/fields/baseFields/slug/duplicateContext.d.ts +11 -0
- package/dist/fields/baseFields/slug/duplicateContext.d.ts.map +1 -0
- package/dist/fields/baseFields/slug/duplicateContext.js +21 -0
- package/dist/fields/baseFields/slug/duplicateContext.js.map +1 -0
- package/dist/fields/baseFields/slug/fillEmptyLocalizedSlugs.d.ts +22 -0
- package/dist/fields/baseFields/slug/fillEmptyLocalizedSlugs.d.ts.map +1 -0
- package/dist/fields/baseFields/slug/fillEmptyLocalizedSlugs.js +63 -0
- package/dist/fields/baseFields/slug/fillEmptyLocalizedSlugs.js.map +1 -0
- package/dist/fields/baseFields/slug/generateSlug.d.ts +13 -8
- package/dist/fields/baseFields/slug/generateSlug.d.ts.map +1 -1
- package/dist/fields/baseFields/slug/generateSlug.js +98 -45
- package/dist/fields/baseFields/slug/generateSlug.js.map +1 -1
- package/dist/fields/baseFields/slug/generateSlugBeforeDuplicate.d.ts +18 -0
- package/dist/fields/baseFields/slug/generateSlugBeforeDuplicate.d.ts.map +1 -0
- package/dist/fields/baseFields/slug/generateSlugBeforeDuplicate.js +20 -0
- package/dist/fields/baseFields/slug/generateSlugBeforeDuplicate.js.map +1 -0
- package/dist/fields/baseFields/slug/getSlugFallbackValue.d.ts +22 -0
- package/dist/fields/baseFields/slug/getSlugFallbackValue.d.ts.map +1 -0
- package/dist/fields/baseFields/slug/getSlugFallbackValue.js +23 -0
- package/dist/fields/baseFields/slug/getSlugFallbackValue.js.map +1 -0
- package/dist/fields/baseFields/slug/hasValue.d.ts +3 -0
- package/dist/fields/baseFields/slug/hasValue.d.ts.map +1 -0
- package/dist/fields/baseFields/slug/hasValue.js +3 -0
- package/dist/fields/baseFields/slug/hasValue.js.map +1 -0
- package/dist/fields/config/reservedFieldNames.spec.js +18 -18
- package/dist/fields/config/reservedFieldNames.spec.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts +3 -9
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +33 -34
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/config/sanitize.spec.js +128 -105
- package/dist/fields/config/sanitize.spec.js.map +1 -1
- package/dist/fields/config/types.d.ts +4 -3
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +5 -3
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts +10 -0
- package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts.map +1 -0
- package/dist/fields/hooks/beforeValidate/stripNullRows.js +18 -0
- package/dist/fields/hooks/beforeValidate/stripNullRows.js.map +1 -0
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +7 -8
- package/dist/fields/validations.js.map +1 -1
- package/dist/fields/validations.spec.js +61 -37
- package/dist/fields/validations.spec.js.map +1 -1
- package/dist/globals/config/sanitize.d.ts +2 -7
- package/dist/globals/config/sanitize.d.ts.map +1 -1
- package/dist/globals/config/sanitize.js +2 -6
- package/dist/globals/config/sanitize.js.map +1 -1
- package/dist/globals/config/sanitize.spec.js +6 -6
- package/dist/globals/config/sanitize.spec.js.map +1 -1
- package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -1
- package/dist/globals/operations/countGlobalVersions.js +1 -0
- package/dist/globals/operations/countGlobalVersions.js.map +1 -1
- package/dist/index.bundled.d.ts +247 -178
- package/dist/index.d.ts +49 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/query-presets/constraints.js +1 -1
- package/dist/query-presets/constraints.js.map +1 -1
- package/dist/queues/config/collection.d.ts.map +1 -1
- package/dist/queues/config/collection.js +37 -43
- package/dist/queues/config/collection.js.map +1 -1
- package/dist/queues/config/global.d.ts +5 -6
- package/dist/queues/config/global.d.ts.map +1 -1
- package/dist/queues/config/global.js +1 -1
- package/dist/queues/config/global.js.map +1 -1
- package/dist/queues/config/types/index.d.ts +29 -24
- package/dist/queues/config/types/index.d.ts.map +1 -1
- package/dist/queues/config/types/index.js.map +1 -1
- package/dist/queues/config/types/taskTypes.d.ts +4 -7
- package/dist/queues/config/types/taskTypes.d.ts.map +1 -1
- package/dist/queues/config/types/taskTypes.js.map +1 -1
- package/dist/queues/config/types/workflowJSONTypes.d.ts +10 -9
- package/dist/queues/config/types/workflowJSONTypes.d.ts.map +1 -1
- package/dist/queues/config/types/workflowJSONTypes.js.map +1 -1
- package/dist/queues/config/types/workflowTypes.d.ts +11 -58
- package/dist/queues/config/types/workflowTypes.d.ts.map +1 -1
- package/dist/queues/config/types/workflowTypes.js.map +1 -1
- package/dist/queues/endpoints/handleSchedules.js +1 -1
- package/dist/queues/endpoints/handleSchedules.js.map +1 -1
- package/dist/queues/errors/handleTaskError.js +4 -4
- package/dist/queues/errors/handleTaskError.js.map +1 -1
- package/dist/queues/errors/handleWorkflowError.js +1 -1
- package/dist/queues/errors/handleWorkflowError.js.map +1 -1
- package/dist/queues/errors/index.d.ts +6 -0
- package/dist/queues/errors/index.d.ts.map +1 -1
- package/dist/queues/errors/index.js +5 -0
- package/dist/queues/errors/index.js.map +1 -1
- package/dist/queues/localAPI.d.ts +4 -4
- package/dist/queues/localAPI.d.ts.map +1 -1
- package/dist/queues/localAPI.js +63 -66
- package/dist/queues/localAPI.js.map +1 -1
- package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.d.ts +4 -4
- package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.d.ts.map +1 -1
- package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.js.map +1 -1
- package/dist/queues/operations/handleSchedules/index.d.ts +1 -1
- package/dist/queues/operations/handleSchedules/index.d.ts.map +1 -1
- package/dist/queues/operations/handleSchedules/index.js +1 -1
- package/dist/queues/operations/handleSchedules/index.js.map +1 -1
- package/dist/queues/operations/runJobs/heartbeat.d.ts +13 -0
- package/dist/queues/operations/runJobs/heartbeat.d.ts.map +1 -0
- package/dist/queues/operations/runJobs/heartbeat.js +66 -0
- package/dist/queues/operations/runJobs/heartbeat.js.map +1 -0
- package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/index.js +133 -84
- package/dist/queues/operations/runJobs/index.js.map +1 -1
- package/dist/queues/operations/runJobs/runJSONJob/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJSONJob/index.js +6 -3
- package/dist/queues/operations/runJobs/runJSONJob/index.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +5 -5
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.d.ts +2 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.js +39 -8
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/importHandlerPath.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/index.js +4 -4
- package/dist/queues/operations/runJobs/runJob/index.js.map +1 -1
- package/dist/queues/utilities/updateJob.d.ts.map +1 -1
- package/dist/queues/utilities/updateJob.js +3 -0
- package/dist/queues/utilities/updateJob.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/checkFileRestrictions.d.ts +1 -1
- package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
- package/dist/uploads/checkFileRestrictions.js +15 -1
- package/dist/uploads/checkFileRestrictions.js.map +1 -1
- package/dist/uploads/endpoints/uploadInstructions.d.ts +12 -0
- package/dist/uploads/endpoints/uploadInstructions.d.ts.map +1 -1
- package/dist/uploads/endpoints/uploadInstructions.js +66 -20
- package/dist/uploads/endpoints/uploadInstructions.js.map +1 -1
- package/dist/uploads/generateFileData.js +4 -1
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getFileFromUploadInstructions.d.ts +8 -0
- package/dist/uploads/getFileFromUploadInstructions.d.ts.map +1 -0
- package/dist/uploads/getFileFromUploadInstructions.js +62 -0
- package/dist/uploads/getFileFromUploadInstructions.js.map +1 -0
- package/dist/uploads/getImageSize.d.ts +12 -1
- package/dist/uploads/getImageSize.d.ts.map +1 -1
- package/dist/uploads/getImageSize.js +20 -18
- package/dist/uploads/getImageSize.js.map +1 -1
- package/dist/uploads/getImageSize.spec.js +298 -0
- package/dist/uploads/getImageSize.spec.js.map +1 -0
- package/dist/uploads/probeImageSize.d.ts +39 -0
- package/dist/uploads/probeImageSize.d.ts.map +1 -0
- package/dist/uploads/probeImageSize.js +374 -0
- package/dist/uploads/probeImageSize.js.map +1 -0
- package/dist/uploads/probeImageSize.spec.js +366 -0
- package/dist/uploads/probeImageSize.spec.js.map +1 -0
- package/dist/uploads/stagedUpload.d.ts +27 -0
- package/dist/uploads/stagedUpload.d.ts.map +1 -0
- package/dist/uploads/stagedUpload.js +197 -0
- package/dist/uploads/stagedUpload.js.map +1 -0
- package/dist/uploads/types.d.ts +41 -13
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.js +12 -46
- package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
- package/dist/utilities/configToJSONSchema.spec.js +33 -33
- package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
- package/dist/utilities/fieldValueExists.d.ts +29 -0
- package/dist/utilities/fieldValueExists.d.ts.map +1 -0
- package/dist/utilities/fieldValueExists.js +27 -0
- package/dist/utilities/fieldValueExists.js.map +1 -0
- package/dist/utilities/getUniqueFieldValue.d.ts +27 -0
- package/dist/utilities/getUniqueFieldValue.d.ts.map +1 -0
- package/dist/utilities/getUniqueFieldValue.js +26 -0
- package/dist/utilities/getUniqueFieldValue.js.map +1 -0
- package/dist/versions/deleteScheduledPublishJobs.js +2 -2
- package/dist/versions/deleteScheduledPublishJobs.js.map +1 -1
- package/dist/versions/payloadPackageList.d.ts.map +1 -1
- package/dist/versions/payloadPackageList.js +0 -1
- package/dist/versions/payloadPackageList.js.map +1 -1
- package/package.json +8 -3
- package/dist/database/defaultUpdateJobs.d.ts +0 -3
- package/dist/database/defaultUpdateJobs.d.ts.map +0 -1
- package/dist/database/defaultUpdateJobs.js +0 -41
- package/dist/database/defaultUpdateJobs.js.map +0 -1
- package/dist/fields/baseFields/slug/countVersions.d.ts +0 -13
- package/dist/fields/baseFields/slug/countVersions.d.ts.map +0 -1
- package/dist/fields/baseFields/slug/countVersions.js +0 -27
- package/dist/fields/baseFields/slug/countVersions.js.map +0 -1
- package/dist/uploads/tempFile.d.ts +0 -7
- package/dist/uploads/tempFile.d.ts.map +0 -1
- package/dist/uploads/tempFile.js +0 -39
- package/dist/uploads/tempFile.js.map +0 -1
package/dist/uploads/types.d.ts
CHANGED
|
@@ -51,7 +51,7 @@ export type GenerateImageName = (args: {
|
|
|
51
51
|
sizeName: string;
|
|
52
52
|
width: number;
|
|
53
53
|
}) => string;
|
|
54
|
-
|
|
54
|
+
type ImageSizeBase = {
|
|
55
55
|
/**
|
|
56
56
|
* Admin UI options that control how this image size appears in list views.
|
|
57
57
|
*/
|
|
@@ -70,16 +70,21 @@ export type ImageSize = {
|
|
|
70
70
|
groupBy?: boolean;
|
|
71
71
|
};
|
|
72
72
|
};
|
|
73
|
-
/**
|
|
74
|
-
* @deprecated prefer position
|
|
75
|
-
*/
|
|
76
|
-
crop?: string;
|
|
77
|
-
formatOptions?: ImageUploadFormatOptions;
|
|
78
73
|
/**
|
|
79
74
|
* Generate a custom name for the file of this image size.
|
|
80
75
|
*/
|
|
81
76
|
generateImageName?: GenerateImageName;
|
|
82
77
|
name: string;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Image size options implemented by Payload's default Sharp image processor.
|
|
81
|
+
*/
|
|
82
|
+
export type SharpImageSizeOptions = {
|
|
83
|
+
/**
|
|
84
|
+
* @deprecated prefer position
|
|
85
|
+
*/
|
|
86
|
+
crop?: string;
|
|
87
|
+
formatOptions?: ImageUploadFormatOptions;
|
|
83
88
|
trimOptions?: ImageUploadTrimOptions;
|
|
84
89
|
/**
|
|
85
90
|
* When an uploaded image is smaller than the defined image size, we have 3 options:
|
|
@@ -92,6 +97,23 @@ export type ImageSize = {
|
|
|
92
97
|
*/
|
|
93
98
|
withoutEnlargement?: ResizeOptions['withoutEnlargement'];
|
|
94
99
|
} & Omit<ResizeOptions, 'withoutEnlargement'>;
|
|
100
|
+
/**
|
|
101
|
+
* Interface to be module-augmented by image processing providers.
|
|
102
|
+
*
|
|
103
|
+
* When no provider is registered, ImageSize uses SharpImageSizeOptions.
|
|
104
|
+
* When providers are registered, ImageSize uses their registered options instead.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* declare module 'payload' {
|
|
108
|
+
* interface RegisteredImageSizeOptions {
|
|
109
|
+
* myProvider: MyProviderImageSizeOptions
|
|
110
|
+
* }
|
|
111
|
+
* }
|
|
112
|
+
*/
|
|
113
|
+
export interface RegisteredImageSizeOptions {
|
|
114
|
+
}
|
|
115
|
+
type ImageSizeOptions = keyof RegisteredImageSizeOptions extends never ? SharpImageSizeOptions : RegisteredImageSizeOptions[keyof RegisteredImageSizeOptions];
|
|
116
|
+
export type ImageSize = ImageSizeBase & ImageSizeOptions;
|
|
95
117
|
export type GetAdminThumbnail = (args: {
|
|
96
118
|
doc: Record<string, unknown>;
|
|
97
119
|
}) => false | null | string;
|
|
@@ -236,9 +258,9 @@ export type UploadConfig = {
|
|
|
236
258
|
headers?: Headers;
|
|
237
259
|
params: {
|
|
238
260
|
collection: string;
|
|
239
|
-
directUpload?: unknown;
|
|
240
261
|
filename: string;
|
|
241
262
|
prefix?: string;
|
|
263
|
+
uploadReference?: unknown;
|
|
242
264
|
};
|
|
243
265
|
}) => Promise<Response> | Promise<void> | Response | void)[];
|
|
244
266
|
/**
|
|
@@ -291,8 +313,7 @@ export type UploadConfig = {
|
|
|
291
313
|
staticDir?: string;
|
|
292
314
|
trimOptions?: ImageUploadTrimOptions;
|
|
293
315
|
/**
|
|
294
|
-
* Adapter-provided upload instructions.
|
|
295
|
-
* the server-only access and generate functions.
|
|
316
|
+
* Adapter-provided upload instructions.
|
|
296
317
|
* @internal
|
|
297
318
|
*/
|
|
298
319
|
uploadInstructions?: UploadInstructionsCapability;
|
|
@@ -321,10 +342,11 @@ export type UploadInstructionsRequest = {
|
|
|
321
342
|
};
|
|
322
343
|
export type UploadInstructions = {
|
|
323
344
|
file: {
|
|
324
|
-
|
|
345
|
+
collectionSlug?: UploadCollectionSlug;
|
|
325
346
|
filename: string;
|
|
326
347
|
mimeType: string;
|
|
327
348
|
size: number;
|
|
349
|
+
uploadReference: Record<string, unknown>;
|
|
328
350
|
};
|
|
329
351
|
} & ({
|
|
330
352
|
data?: unknown;
|
|
@@ -339,15 +361,21 @@ export type UploadInstructions = {
|
|
|
339
361
|
type: 'http';
|
|
340
362
|
});
|
|
341
363
|
export type GenerateUploadInstructions = (args: {
|
|
364
|
+
overrideAccess?: boolean;
|
|
342
365
|
req: PayloadRequest;
|
|
343
366
|
} & UploadInstructionsRequest) => Promise<UploadInstructions> | UploadInstructions;
|
|
344
367
|
export type UploadInstructionsCapability = {
|
|
345
|
-
/**
|
|
346
|
-
access?: UploadInstructionsAccess;
|
|
347
|
-
/** Generates instructions for uploading a file. */
|
|
368
|
+
/** Generates upload instructions. The generator or supporting endpoint must check access. */
|
|
348
369
|
generate: GenerateUploadInstructions;
|
|
370
|
+
/**
|
|
371
|
+
* Whether the Admin panel should use these instructions before saving a document.
|
|
372
|
+
* This can still be useful when upload chunks pass through Payload.
|
|
373
|
+
*/
|
|
374
|
+
useInAdmin: boolean;
|
|
349
375
|
};
|
|
350
376
|
export type checkFileRestrictionsParams = {
|
|
377
|
+
/** Set to false when the file bytes have not been uploaded yet. */
|
|
378
|
+
checkFileContents?: boolean;
|
|
351
379
|
collection: CollectionConfig;
|
|
352
380
|
file: File;
|
|
353
381
|
req: PayloadRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/uploads/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAEjE,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,GAAG,EAAE,IAAI,GAAG,MAAM,CAAA;IAClB,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,OAAO,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CAC3C,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEjE,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd,KAAK,MAAM,CAAA;AAEZ,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/uploads/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/types.ts"],"sourcesContent":["import type { ResizeOptions, Sharp, SharpOptions } from 'sharp'\n\nimport type { CollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { PayloadComponent } from '../config/types.js'\nimport type { UploadCollectionSlug } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { WithMetadata } from './optionallyAppendMetadata.js'\n\nexport type FileSize = {\n filename: null | string\n filesize: null | number\n height: null | number\n mimeType: null | string\n url: null | string\n width: null | number\n}\n\nexport type FileSizes = {\n [size: string]: FileSize\n}\n\nexport type FileData = {\n filename: string\n filesize: number\n focalX?: number\n focalY?: number\n height: number\n mimeType: string\n sizes: FileSizes\n tempFilePath?: string\n url?: string\n width: number\n}\n\nexport type ProbedImageSize = {\n height: number\n width: number\n}\n\n/**\n * Params sent to the sharp `toFormat()` function\n * @link https://sharp.pixelplumbing.com/api-output#toformat\n */\nexport type ImageUploadFormatOptions = {\n format: Parameters<Sharp['toFormat']>[0]\n options?: Parameters<Sharp['toFormat']>[1]\n}\n\n/**\n * Params sent to the sharp trim() function\n * @link https://sharp.pixelplumbing.com/api-resize#trim\n */\nexport type ImageUploadTrimOptions = Parameters<Sharp['trim']>[0]\n\nexport type GenerateImageName = (args: {\n extension: string\n height: number\n originalName: string\n sizeName: string\n width: number\n}) => string\n\nexport type ImageSize = {\n /**\n * Admin UI options that control how this image size appears in list views.\n */\n admin?: {\n /**\n * Controls visibility of this image size in the collection list view.\n * Defaults to hiding the image size from columns, filters, and group-by to reduce noise.\n *\n * - `column` — whether to hide this size from selectable list columns. @default false\n * - `filter` — whether to hide this size from filter options. @default false\n * - `groupBy` — whether to hide this size from group-by options. @default false\n */\n disabled?: {\n column?: boolean\n filter?: boolean\n groupBy?: boolean\n }\n }\n /**\n * @deprecated prefer position\n */\n crop?: string // comes from sharp package\n formatOptions?: ImageUploadFormatOptions\n /**\n * Generate a custom name for the file of this image size.\n */\n generateImageName?: GenerateImageName\n name: string\n trimOptions?: ImageUploadTrimOptions\n /**\n * When an uploaded image is smaller than the defined image size, we have 3 options:\n *\n * `undefined | false | true`\n *\n * 1. `undefined` [default]: uploading images with smaller width AND height than the image size will return null\n * 2. `false`: always enlarge images to the image size\n * 3. `true`: if the image is smaller than the image size, return the original image\n */\n withoutEnlargement?: ResizeOptions['withoutEnlargement']\n} & Omit<ResizeOptions, 'withoutEnlargement'>\n\nexport type GetAdminThumbnail = (args: { doc: Record<string, unknown> }) => false | null | string\n\nexport type AllowList = Array<{\n hostname: string\n pathname?: string\n port?: string\n protocol?: 'http' | 'https'\n search?: string\n}>\n\nexport type FileAllowList = Array<{\n extensions: string[]\n mimeType: string\n}>\n\nexport type UploadFilePreviewClientProps = {\n filename: string\n filesize: number\n /** Resolved URL of the file (data.url). */\n fileSrc: string\n height?: number\n mimeType: string\n width?: number\n}\n\ntype UploadFilePreviewMap = {\n [mimeTypePattern: string]: PayloadComponent\n}\n\ntype Admin = {\n components?: {\n /**\n * The Controls component to extend the upload controls in the admin panel.\n */\n controls?: PayloadComponent[]\n /**\n * A custom component to render in place of the default Thumbnail in the upload side panel.\n *\n * Can be a single PayloadComponent (renders for all MIME types) or a Record keyed by\n * MIME type patterns. Pattern resolution priority: exact match → category wildcard\n * (e.g. `video/*`) → universal fallback (`*`). Falls back to the default Thumbnail\n * when nothing matches.\n */\n filePreview?: PayloadComponent | UploadFilePreviewMap\n }\n}\n\nexport type UploadConfig = {\n /**\n * The adapter name to use for uploads. Used for storage adapter telemetry.\n * @default undefined\n */\n adapter?: string\n /**\n * The admin configuration for the upload field.\n */\n admin?: Admin\n /**\n * Represents an admin thumbnail, which can be either a React component or a string.\n * - If a string, it should be one of the image size names.\n * - A function that generates a fully qualified URL for the thumbnail, receives the doc as the only argument.\n **/\n adminThumbnail?: GetAdminThumbnail | string\n /**\n * Allow restricted file types known to be problematic.\n * - If set to `true`, it will allow all file types.\n * - If set to `false`, it will not allow file types and extensions known to be problematic.\n * - This setting is overriden by the `mimeTypes` option.\n * @default false\n */\n allowRestrictedFileTypes?: boolean\n /**\n * Enables bulk upload of files from the list view.\n * @default true\n */\n bulkUpload?: boolean\n /**\n * Appends a cache tag to the image URL when fetching the thumbnail in the admin panel. It may be desirable to disable this when hosting via CDNs with strict parameters.\n *\n * @default true\n */\n cacheTags?: boolean\n /**\n * Sharp constructor options to be passed to the uploaded file.\n * @link https://sharp.pixelplumbing.com/api-constructor/#sharp\n */\n constructorOptions?: SharpOptions\n /**\n * Enables cropping of images.\n * @default true\n */\n crop?: boolean\n /**\n * Disable the ability to save files to disk.\n * @default false\n */\n disableLocalStorage?: boolean\n /**\n * Enable displaying preview of the uploaded file in Upload fields related to this Collection.\n * Can be locally overridden by `displayPreview` option in Upload field.\n * @default false\n */\n displayPreview?: boolean\n /**\n *\n * Accepts existing headers and returns the headers after filtering or modifying.\n * If using this option, you should handle the removal of any sensitive cookies\n * (like payload-prefixed cookies) to prevent leaking session information to external\n * services. By default, Payload automatically filters out payload-prefixed cookies\n * when this option is NOT defined.\n *\n * Useful for adding custom headers to fetch from external providers.\n * @default undefined\n */\n externalFileHeaderFilter?: (headers: Record<string, string>) => Record<string, string>\n /**\n * Field slugs to use for a compound index instead of the default filename index.\n */\n filenameCompoundIndex?: string[]\n /**\n * Require files to be uploaded when creating a document.\n * @default true\n */\n filesRequiredOnCreate?: boolean\n /**\n * Enables focal point positioning for image manipulation.\n * @default true\n */\n focalPoint?: boolean\n /**\n * Format options for the uploaded file. Formatting image sizes needs to be done within each formatOptions individually.\n */\n formatOptions?: ImageUploadFormatOptions\n /**\n * Custom handlers to run when a file is fetched.\n *\n * - If a handler returns a Response, the response will be sent to the client and no further handlers will be run.\n * - If a handler returns null, the next handler will be run.\n * - If no handlers return a response the file will be returned by default.\n *\n * @link https://sharp.pixelplumbing.com/api-output/#toformat\n * @default undefined\n */\n handlers?: ((\n req: PayloadRequest,\n args: {\n doc: TypeWithID\n headers?: Headers\n params: {\n collection: string\n directUpload?: unknown\n filename: string\n prefix?: string\n }\n },\n ) => Promise<Response> | Promise<void> | Response | void)[]\n /**\n * Set to `true` to prevent the admin UI from showing file inputs during document creation, useful for programmatic file generation.\n */\n hideFileInputOnCreate?: boolean\n /**\n * Set to `true` to prevent the admin UI having a way to remove an existing file while editing.\n */\n hideRemoveFile?: boolean\n imageSizes?: ImageSize[]\n /**\n * Restrict mimeTypes in the file picker. Array of valid mime types or mimetype wildcards\n * @example ['image/*', 'application/pdf']\n * @default undefined\n */\n mimeTypes?: string[]\n /**\n * Ability to modify the response headers fetching a file.\n * @default undefined\n */\n modifyResponseHeaders?: ({ headers }: { headers: Headers }) => Headers | void\n /**\n * Controls the behavior of pasting/uploading files from URLs.\n * If set to `false`, fetching from remote URLs is disabled.\n * If an `allowList` is provided, server-side fetching will be enabled for specified URLs.\n *\n * @default true (client-side fetching enabled)\n */\n pasteURL?:\n | {\n allowList: AllowList\n }\n | false\n /**\n * Sharp resize options for the original image.\n * @link https://sharp.pixelplumbing.com/api-resize#resize\n * @default undefined\n */\n resizeOptions?: ResizeOptions\n /**\n * Skip safe fetch when using server-side fetching for external files from these URLs.\n * @default false\n */\n skipSafeFetch?: AllowList | boolean\n /**\n * The directory to serve static files from. Defaults to collection slug.\n * @default undefined\n */\n staticDir?: string\n trimOptions?: ImageUploadTrimOptions\n /**\n * Adapter-provided upload instructions. Client config exposes this as a `true` marker without\n * the server-only access and generate functions.\n * @internal\n */\n uploadInstructions?: UploadInstructionsCapability\n /**\n * Optionally append metadata to the image during processing.\n *\n * Can be a boolean or a function.\n *\n * If true, metadata will be appended to the image.\n * If false, no metadata will be appended.\n * If a function, it will receive an object containing the metadata and should return a boolean indicating whether to append the metadata.\n * @default false\n */\n withMetadata?: WithMetadata\n}\n\nexport type UploadInstructionsAccess = (args: {\n collectionSlug: UploadCollectionSlug\n req: PayloadRequest\n}) => boolean | Promise<boolean>\n\nexport type UploadInstructionsRequest = {\n collectionSlug: UploadCollectionSlug\n docPrefix?: string\n filename: string\n filesize: number\n mimeType: string\n}\n\nexport type UploadInstructions = {\n file: {\n directUpload: Record<string, unknown>\n filename: string\n mimeType: string\n size: number\n }\n} & (\n | {\n data?: unknown\n name: string\n type: 'dispatch'\n }\n | {\n request: {\n headers?: Record<string, string>\n method: 'POST' | 'PUT'\n url: string\n }\n type: 'http'\n }\n)\n\nexport type GenerateUploadInstructions = (\n args: { req: PayloadRequest } & UploadInstructionsRequest,\n) => Promise<UploadInstructions> | UploadInstructions\n\nexport type UploadInstructionsCapability = {\n /** Controls access to generating upload instructions. */\n access?: UploadInstructionsAccess\n /** Generates instructions for uploading a file. */\n generate: GenerateUploadInstructions\n}\nexport type checkFileRestrictionsParams = {\n collection: CollectionConfig\n file: File\n req: PayloadRequest\n}\n\nexport type SanitizedUploadConfig = {\n staticDir: UploadConfig['staticDir']\n} & UploadConfig\n\nexport type File = {\n /**\n * The buffer of the file.\n */\n data: Buffer\n /**\n * The mimetype of the file.\n */\n mimetype: string\n /**\n * The name of the file.\n */\n name: string\n /**\n * The size of the file in bytes.\n */\n size: number\n /**\n * Path to the temp file on disk when useTempFiles is enabled. In this case file.data will be an empty buffer.\n */\n tempFilePath?: string\n}\n\nexport type FileToSave = {\n /**\n * The buffer of the file.\n */\n buffer: Buffer\n /**\n * The path to save the file.\n */\n path: string\n}\n\ntype Crop = {\n height: number\n unit: '%' | 'px'\n width: number\n x: number\n y: number\n}\n\nexport type FocalPoint = {\n x: number\n y: number\n}\n\nexport type UploadEdits = {\n crop?: Crop\n focalPoint?: FocalPoint\n heightInPixels?: number\n widthInPixels?: number\n}\n"],"names":[],"mappings":"AA+aA,WAKC"}
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/types.ts"],"sourcesContent":["import type { ResizeOptions, Sharp, SharpOptions } from 'sharp'\n\nimport type { CollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { PayloadComponent } from '../config/types.js'\nimport type { UploadCollectionSlug } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { WithMetadata } from './optionallyAppendMetadata.js'\n\nexport type FileSize = {\n filename: null | string\n filesize: null | number\n height: null | number\n mimeType: null | string\n url: null | string\n width: null | number\n}\n\nexport type FileSizes = {\n [size: string]: FileSize\n}\n\nexport type FileData = {\n filename: string\n filesize: number\n focalX?: number\n focalY?: number\n height: number\n mimeType: string\n sizes: FileSizes\n tempFilePath?: string\n url?: string\n width: number\n}\n\nexport type ProbedImageSize = {\n height: number\n width: number\n}\n\n/**\n * Params sent to the sharp `toFormat()` function\n * @link https://sharp.pixelplumbing.com/api-output#toformat\n */\nexport type ImageUploadFormatOptions = {\n format: Parameters<Sharp['toFormat']>[0]\n options?: Parameters<Sharp['toFormat']>[1]\n}\n\n/**\n * Params sent to the sharp trim() function\n * @link https://sharp.pixelplumbing.com/api-resize#trim\n */\nexport type ImageUploadTrimOptions = Parameters<Sharp['trim']>[0]\n\nexport type GenerateImageName = (args: {\n extension: string\n height: number\n originalName: string\n sizeName: string\n width: number\n}) => string\n\ntype ImageSizeBase = {\n /**\n * Admin UI options that control how this image size appears in list views.\n */\n admin?: {\n /**\n * Controls visibility of this image size in the collection list view.\n * Defaults to hiding the image size from columns, filters, and group-by to reduce noise.\n *\n * - `column` — whether to hide this size from selectable list columns. @default false\n * - `filter` — whether to hide this size from filter options. @default false\n * - `groupBy` — whether to hide this size from group-by options. @default false\n */\n disabled?: {\n column?: boolean\n filter?: boolean\n groupBy?: boolean\n }\n }\n /**\n * Generate a custom name for the file of this image size.\n */\n generateImageName?: GenerateImageName\n name: string\n}\n\n/**\n * Image size options implemented by Payload's default Sharp image processor.\n */\nexport type SharpImageSizeOptions = {\n /**\n * @deprecated prefer position\n */\n crop?: string // comes from sharp package\n formatOptions?: ImageUploadFormatOptions\n trimOptions?: ImageUploadTrimOptions\n /**\n * When an uploaded image is smaller than the defined image size, we have 3 options:\n *\n * `undefined | false | true`\n *\n * 1. `undefined` [default]: uploading images with smaller width AND height than the image size will return null\n * 2. `false`: always enlarge images to the image size\n * 3. `true`: if the image is smaller than the image size, return the original image\n */\n withoutEnlargement?: ResizeOptions['withoutEnlargement']\n} & Omit<ResizeOptions, 'withoutEnlargement'>\n\n/**\n * Interface to be module-augmented by image processing providers.\n *\n * When no provider is registered, ImageSize uses SharpImageSizeOptions.\n * When providers are registered, ImageSize uses their registered options instead.\n *\n * @example\n * declare module 'payload' {\n * interface RegisteredImageSizeOptions {\n * myProvider: MyProviderImageSizeOptions\n * }\n * }\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Intentionally empty so image processing providers can augment it.\nexport interface RegisteredImageSizeOptions {}\n\ntype ImageSizeOptions = keyof RegisteredImageSizeOptions extends never\n ? SharpImageSizeOptions\n : RegisteredImageSizeOptions[keyof RegisteredImageSizeOptions]\n\nexport type ImageSize = ImageSizeBase & ImageSizeOptions\n\nexport type GetAdminThumbnail = (args: { doc: Record<string, unknown> }) => false | null | string\n\nexport type AllowList = Array<{\n hostname: string\n pathname?: string\n port?: string\n protocol?: 'http' | 'https'\n search?: string\n}>\n\nexport type FileAllowList = Array<{\n extensions: string[]\n mimeType: string\n}>\n\nexport type UploadFilePreviewClientProps = {\n filename: string\n filesize: number\n /** Resolved URL of the file (data.url). */\n fileSrc: string\n height?: number\n mimeType: string\n width?: number\n}\n\ntype UploadFilePreviewMap = {\n [mimeTypePattern: string]: PayloadComponent\n}\n\ntype Admin = {\n components?: {\n /**\n * The Controls component to extend the upload controls in the admin panel.\n */\n controls?: PayloadComponent[]\n /**\n * A custom component to render in place of the default Thumbnail in the upload side panel.\n *\n * Can be a single PayloadComponent (renders for all MIME types) or a Record keyed by\n * MIME type patterns. Pattern resolution priority: exact match → category wildcard\n * (e.g. `video/*`) → universal fallback (`*`). Falls back to the default Thumbnail\n * when nothing matches.\n */\n filePreview?: PayloadComponent | UploadFilePreviewMap\n }\n}\n\nexport type UploadConfig = {\n /**\n * The adapter name to use for uploads. Used for storage adapter telemetry.\n * @default undefined\n */\n adapter?: string\n /**\n * The admin configuration for the upload field.\n */\n admin?: Admin\n /**\n * Represents an admin thumbnail, which can be either a React component or a string.\n * - If a string, it should be one of the image size names.\n * - A function that generates a fully qualified URL for the thumbnail, receives the doc as the only argument.\n **/\n adminThumbnail?: GetAdminThumbnail | string\n /**\n * Allow restricted file types known to be problematic.\n * - If set to `true`, it will allow all file types.\n * - If set to `false`, it will not allow file types and extensions known to be problematic.\n * - This setting is overriden by the `mimeTypes` option.\n * @default false\n */\n allowRestrictedFileTypes?: boolean\n /**\n * Enables bulk upload of files from the list view.\n * @default true\n */\n bulkUpload?: boolean\n /**\n * Appends a cache tag to the image URL when fetching the thumbnail in the admin panel. It may be desirable to disable this when hosting via CDNs with strict parameters.\n *\n * @default true\n */\n cacheTags?: boolean\n /**\n * Sharp constructor options to be passed to the uploaded file.\n * @link https://sharp.pixelplumbing.com/api-constructor/#sharp\n */\n constructorOptions?: SharpOptions\n /**\n * Enables cropping of images.\n * @default true\n */\n crop?: boolean\n /**\n * Disable the ability to save files to disk.\n * @default false\n */\n disableLocalStorage?: boolean\n /**\n * Enable displaying preview of the uploaded file in Upload fields related to this Collection.\n * Can be locally overridden by `displayPreview` option in Upload field.\n * @default false\n */\n displayPreview?: boolean\n /**\n *\n * Accepts existing headers and returns the headers after filtering or modifying.\n * If using this option, you should handle the removal of any sensitive cookies\n * (like payload-prefixed cookies) to prevent leaking session information to external\n * services. By default, Payload automatically filters out payload-prefixed cookies\n * when this option is NOT defined.\n *\n * Useful for adding custom headers to fetch from external providers.\n * @default undefined\n */\n externalFileHeaderFilter?: (headers: Record<string, string>) => Record<string, string>\n /**\n * Field slugs to use for a compound index instead of the default filename index.\n */\n filenameCompoundIndex?: string[]\n /**\n * Require files to be uploaded when creating a document.\n * @default true\n */\n filesRequiredOnCreate?: boolean\n /**\n * Enables focal point positioning for image manipulation.\n * @default true\n */\n focalPoint?: boolean\n /**\n * Format options for the uploaded file. Formatting image sizes needs to be done within each formatOptions individually.\n */\n formatOptions?: ImageUploadFormatOptions\n /**\n * Custom handlers to run when a file is fetched.\n *\n * - If a handler returns a Response, the response will be sent to the client and no further handlers will be run.\n * - If a handler returns null, the next handler will be run.\n * - If no handlers return a response the file will be returned by default.\n *\n * @link https://sharp.pixelplumbing.com/api-output/#toformat\n * @default undefined\n */\n handlers?: ((\n req: PayloadRequest,\n args: {\n doc: TypeWithID\n headers?: Headers\n params: {\n collection: string\n filename: string\n prefix?: string\n uploadReference?: unknown\n }\n },\n ) => Promise<Response> | Promise<void> | Response | void)[]\n /**\n * Set to `true` to prevent the admin UI from showing file inputs during document creation, useful for programmatic file generation.\n */\n hideFileInputOnCreate?: boolean\n /**\n * Set to `true` to prevent the admin UI having a way to remove an existing file while editing.\n */\n hideRemoveFile?: boolean\n imageSizes?: ImageSize[]\n /**\n * Restrict mimeTypes in the file picker. Array of valid mime types or mimetype wildcards\n * @example ['image/*', 'application/pdf']\n * @default undefined\n */\n mimeTypes?: string[]\n /**\n * Ability to modify the response headers fetching a file.\n * @default undefined\n */\n modifyResponseHeaders?: ({ headers }: { headers: Headers }) => Headers | void\n /**\n * Controls the behavior of pasting/uploading files from URLs.\n * If set to `false`, fetching from remote URLs is disabled.\n * If an `allowList` is provided, server-side fetching will be enabled for specified URLs.\n *\n * @default true (client-side fetching enabled)\n */\n pasteURL?:\n | {\n allowList: AllowList\n }\n | false\n /**\n * Sharp resize options for the original image.\n * @link https://sharp.pixelplumbing.com/api-resize#resize\n * @default undefined\n */\n resizeOptions?: ResizeOptions\n /**\n * Skip safe fetch when using server-side fetching for external files from these URLs.\n * @default false\n */\n skipSafeFetch?: AllowList | boolean\n /**\n * The directory to serve static files from. Defaults to collection slug.\n * @default undefined\n */\n staticDir?: string\n trimOptions?: ImageUploadTrimOptions\n /**\n * Adapter-provided upload instructions.\n * @internal\n */\n uploadInstructions?: UploadInstructionsCapability\n /**\n * Optionally append metadata to the image during processing.\n *\n * Can be a boolean or a function.\n *\n * If true, metadata will be appended to the image.\n * If false, no metadata will be appended.\n * If a function, it will receive an object containing the metadata and should return a boolean indicating whether to append the metadata.\n * @default false\n */\n withMetadata?: WithMetadata\n}\n\nexport type UploadInstructionsAccess = (args: {\n collectionSlug: UploadCollectionSlug\n req: PayloadRequest\n}) => boolean | Promise<boolean>\n\nexport type UploadInstructionsRequest = {\n collectionSlug: UploadCollectionSlug\n docPrefix?: string\n filename: string\n filesize: number\n mimeType: string\n}\n\nexport type UploadInstructions = {\n file: {\n collectionSlug?: UploadCollectionSlug\n filename: string\n mimeType: string\n size: number\n uploadReference: Record<string, unknown>\n }\n} & (\n | {\n data?: unknown\n name: string\n type: 'dispatch'\n }\n | {\n request: {\n headers?: Record<string, string>\n method: 'POST' | 'PUT'\n url: string\n }\n type: 'http'\n }\n)\n\nexport type GenerateUploadInstructions = (\n args: { overrideAccess?: boolean; req: PayloadRequest } & UploadInstructionsRequest,\n) => Promise<UploadInstructions> | UploadInstructions\n\nexport type UploadInstructionsCapability = {\n /** Generates upload instructions. The generator or supporting endpoint must check access. */\n generate: GenerateUploadInstructions\n /**\n * Whether the Admin panel should use these instructions before saving a document.\n * This can still be useful when upload chunks pass through Payload.\n */\n useInAdmin: boolean\n}\nexport type checkFileRestrictionsParams = {\n /** Set to false when the file bytes have not been uploaded yet. */\n checkFileContents?: boolean\n collection: CollectionConfig\n file: File\n req: PayloadRequest\n}\n\nexport type SanitizedUploadConfig = {\n staticDir: UploadConfig['staticDir']\n} & UploadConfig\n\nexport type File = {\n /**\n * The buffer of the file.\n */\n data: Buffer\n /**\n * The mimetype of the file.\n */\n mimetype: string\n /**\n * The name of the file.\n */\n name: string\n /**\n * The size of the file in bytes.\n */\n size: number\n /**\n * Path to the temp file on disk when useTempFiles is enabled. In this case file.data will be an empty buffer.\n */\n tempFilePath?: string\n}\n\nexport type FileToSave = {\n /**\n * The buffer of the file.\n */\n buffer: Buffer\n /**\n * The path to save the file.\n */\n path: string\n}\n\ntype Crop = {\n height: number\n unit: '%' | 'px'\n width: number\n x: number\n y: number\n}\n\nexport type FocalPoint = {\n x: number\n y: number\n}\n\nexport type UploadEdits = {\n crop?: Crop\n focalPoint?: FocalPoint\n heightInPixels?: number\n widthInPixels?: number\n}\n"],"names":[],"mappings":"AAgdA,WAKC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addDataAndFileToRequest.d.ts","sourceRoot":"","sources":["../../src/utilities/addDataAndFileToRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"addDataAndFileToRequest.d.ts","sourceRoot":"","sources":["../../src/utilities/addDataAndFileToRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAOvD,KAAK,uBAAuB,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAErE;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,uBA4ErC,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { APIError } from '../errors/APIError.js';
|
|
2
2
|
import { processMultipartFormdata } from '../uploads/fetchAPI-multipart/index.js';
|
|
3
|
+
import { getFileFromUploadInstructions } from '../uploads/getFileFromUploadInstructions.js';
|
|
3
4
|
/**
|
|
4
5
|
* Mutates the Request, appending 'data' and 'file' if found
|
|
5
6
|
*/ export const addDataAndFileToRequest = async (req)=>{
|
|
@@ -50,57 +51,22 @@ import { processMultipartFormdata } from '../uploads/fetchAPI-multipart/index.js
|
|
|
50
51
|
req.data = JSON.parse(fields._payload);
|
|
51
52
|
}
|
|
52
53
|
if (!req.file && fields?.file && typeof fields?.file === 'string') {
|
|
53
|
-
let
|
|
54
|
-
const collectionSlug = req.routeParams?.collection;
|
|
54
|
+
let uploadedFile;
|
|
55
55
|
try {
|
|
56
|
-
;
|
|
57
|
-
({ directUpload, filename, mimeType, size } = JSON.parse(fields.file));
|
|
56
|
+
uploadedFile = JSON.parse(fields.file);
|
|
58
57
|
} catch {
|
|
59
58
|
throw new APIError('A file name is required.', 400);
|
|
60
59
|
}
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
const collectionSlug = typeof req.routeParams?.collection === 'string' ? req.routeParams.collection : uploadedFile.collectionSlug;
|
|
61
|
+
const uploadConfig = collectionSlug ? req.payload.collections[collectionSlug]?.config.upload : undefined;
|
|
62
|
+
if (!collectionSlug || !uploadConfig) {
|
|
63
|
+
throw new APIError('Invalid upload collection.', 400);
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
doc: null,
|
|
71
|
-
params: {
|
|
72
|
-
collection: collectionSlug,
|
|
73
|
-
directUpload,
|
|
74
|
-
filename
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
if (result) {
|
|
78
|
-
response = result;
|
|
79
|
-
}
|
|
80
|
-
// If we couldn't get the file from that handler, save the error and try other.
|
|
81
|
-
} catch (err) {
|
|
82
|
-
error = err;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (!response) {
|
|
86
|
-
if (error) {
|
|
87
|
-
payload.logger.error(error);
|
|
88
|
-
}
|
|
89
|
-
throw new APIError('Expected response from the upload handler.');
|
|
90
|
-
}
|
|
91
|
-
if (response.status >= 300 && response.status < 400) {
|
|
92
|
-
const redirectUrl = response.headers.get('Location');
|
|
93
|
-
if (redirectUrl) {
|
|
94
|
-
response = await fetch(redirectUrl);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
req.file = {
|
|
98
|
-
name: filename,
|
|
99
|
-
data: Buffer.from(await response.arrayBuffer()),
|
|
100
|
-
directUpload,
|
|
101
|
-
mimetype: response.headers.get('Content-Type') || mimeType,
|
|
102
|
-
size
|
|
103
|
-
};
|
|
65
|
+
req.file = await getFileFromUploadInstructions({
|
|
66
|
+
collectionSlug,
|
|
67
|
+
file: uploadedFile,
|
|
68
|
+
req
|
|
69
|
+
});
|
|
104
70
|
}
|
|
105
71
|
}
|
|
106
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/addDataAndFileToRequest.ts"],"sourcesContent":["import type { PayloadRequest } from '../types/index.js'\n\nimport { APIError } from '../errors/APIError.js'\nimport { processMultipartFormdata } from '../uploads/fetchAPI-multipart/index.js'\n\ntype AddDataAndFileToRequest = (req: PayloadRequest) => Promise<void>\n\n/**\n * Mutates the Request, appending 'data' and 'file' if found\n */\nexport const addDataAndFileToRequest: AddDataAndFileToRequest = async (req) => {\n const { body, headers, method, payload } = req\n\n if (method && ['PATCH', 'POST', 'PUT'].includes(method.toUpperCase()) && body) {\n const [contentType] = (headers.get('Content-Type') || '').split(';', 1)\n const bodyByteSize = parseInt(req.headers.get('Content-Length') || '0', 10)\n const hasBodyStream = req.body !== null\n\n if (contentType === 'application/json') {\n try {\n const text = await req.text?.()\n const data = text ? JSON.parse(text) : {}\n req.data = data\n // @ts-expect-error attach json method to request\n req.json = () => Promise.resolve(data)\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new APIError('Invalid JSON', 400)\n }\n req.payload.logger.error(error)\n throw error\n }\n } else if ((bodyByteSize || hasBodyStream) && contentType?.includes('multipart/')) {\n const { error, fields, files } = await processMultipartFormdata({\n options: {\n ...(payload.config.bodyParser || {}),\n ...(payload.config.upload || {}),\n },\n request: req as Request,\n })\n\n if (error) {\n throw new APIError(error.message)\n }\n\n // Set all files on req.files for access by hooks\n if (files) {\n req.files = files\n // Backwards compatibility: set req.file for standard upload collections\n // Guard: if multiple files share the field name \"file\", files.file is an array — skip\n if (files.file && !Array.isArray(files.file)) {\n req.file = files.file\n }\n }\n\n if (fields?._payload && typeof fields._payload === 'string') {\n req.data = JSON.parse(fields._payload)\n }\n\n if (!req.file && fields?.file && typeof fields?.file === 'string') {\n let
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/addDataAndFileToRequest.ts"],"sourcesContent":["import type { PayloadRequest } from '../types/index.js'\nimport type { UploadInstructions } from '../uploads/types.js'\n\nimport { APIError } from '../errors/APIError.js'\nimport { processMultipartFormdata } from '../uploads/fetchAPI-multipart/index.js'\nimport { getFileFromUploadInstructions } from '../uploads/getFileFromUploadInstructions.js'\n\ntype AddDataAndFileToRequest = (req: PayloadRequest) => Promise<void>\n\n/**\n * Mutates the Request, appending 'data' and 'file' if found\n */\nexport const addDataAndFileToRequest: AddDataAndFileToRequest = async (req) => {\n const { body, headers, method, payload } = req\n\n if (method && ['PATCH', 'POST', 'PUT'].includes(method.toUpperCase()) && body) {\n const [contentType] = (headers.get('Content-Type') || '').split(';', 1)\n const bodyByteSize = parseInt(req.headers.get('Content-Length') || '0', 10)\n const hasBodyStream = req.body !== null\n\n if (contentType === 'application/json') {\n try {\n const text = await req.text?.()\n const data = text ? JSON.parse(text) : {}\n req.data = data\n // @ts-expect-error attach json method to request\n req.json = () => Promise.resolve(data)\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new APIError('Invalid JSON', 400)\n }\n req.payload.logger.error(error)\n throw error\n }\n } else if ((bodyByteSize || hasBodyStream) && contentType?.includes('multipart/')) {\n const { error, fields, files } = await processMultipartFormdata({\n options: {\n ...(payload.config.bodyParser || {}),\n ...(payload.config.upload || {}),\n },\n request: req as Request,\n })\n\n if (error) {\n throw new APIError(error.message)\n }\n\n // Set all files on req.files for access by hooks\n if (files) {\n req.files = files\n // Backwards compatibility: set req.file for standard upload collections\n // Guard: if multiple files share the field name \"file\", files.file is an array — skip\n if (files.file && !Array.isArray(files.file)) {\n req.file = files.file\n }\n }\n\n if (fields?._payload && typeof fields._payload === 'string') {\n req.data = JSON.parse(fields._payload)\n }\n\n if (!req.file && fields?.file && typeof fields?.file === 'string') {\n let uploadedFile: UploadInstructions['file']\n try {\n uploadedFile = JSON.parse(fields.file)\n } catch {\n throw new APIError('A file name is required.', 400)\n }\n const collectionSlug =\n typeof req.routeParams?.collection === 'string'\n ? req.routeParams.collection\n : uploadedFile.collectionSlug\n const uploadConfig = collectionSlug\n ? req.payload.collections[collectionSlug]?.config.upload\n : undefined\n\n if (!collectionSlug || !uploadConfig) {\n throw new APIError('Invalid upload collection.', 400)\n }\n\n req.file = await getFileFromUploadInstructions({\n collectionSlug,\n file: uploadedFile,\n req,\n })\n }\n }\n }\n}\n"],"names":["APIError","processMultipartFormdata","getFileFromUploadInstructions","addDataAndFileToRequest","req","body","headers","method","payload","includes","toUpperCase","contentType","get","split","bodyByteSize","parseInt","hasBodyStream","text","data","JSON","parse","json","Promise","resolve","error","SyntaxError","logger","fields","files","options","config","bodyParser","upload","request","message","file","Array","isArray","_payload","uploadedFile","collectionSlug","routeParams","collection","uploadConfig","collections","undefined"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,wBAAwB,QAAQ,yCAAwC;AACjF,SAASC,6BAA6B,QAAQ,8CAA6C;AAI3F;;CAEC,GACD,OAAO,MAAMC,0BAAmD,OAAOC;IACrE,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,MAAM,EAAEC,OAAO,EAAE,GAAGJ;IAE3C,IAAIG,UAAU;QAAC;QAAS;QAAQ;KAAM,CAACE,QAAQ,CAACF,OAAOG,WAAW,OAAOL,MAAM;QAC7E,MAAM,CAACM,YAAY,GAAG,AAACL,CAAAA,QAAQM,GAAG,CAAC,mBAAmB,EAAC,EAAGC,KAAK,CAAC,KAAK;QACrE,MAAMC,eAAeC,SAASX,IAAIE,OAAO,CAACM,GAAG,CAAC,qBAAqB,KAAK;QACxE,MAAMI,gBAAgBZ,IAAIC,IAAI,KAAK;QAEnC,IAAIM,gBAAgB,oBAAoB;YACtC,IAAI;gBACF,MAAMM,OAAO,MAAMb,IAAIa,IAAI;gBAC3B,MAAMC,OAAOD,OAAOE,KAAKC,KAAK,CAACH,QAAQ,CAAC;gBACxCb,IAAIc,IAAI,GAAGA;gBACX,iDAAiD;gBACjDd,IAAIiB,IAAI,GAAG,IAAMC,QAAQC,OAAO,CAACL;YACnC,EAAE,OAAOM,OAAO;gBACd,IAAIA,iBAAiBC,aAAa;oBAChC,MAAM,IAAIzB,SAAS,gBAAgB;gBACrC;gBACAI,IAAII,OAAO,CAACkB,MAAM,CAACF,KAAK,CAACA;gBACzB,MAAMA;YACR;QACF,OAAO,IAAI,AAACV,CAAAA,gBAAgBE,aAAY,KAAML,aAAaF,SAAS,eAAe;YACjF,MAAM,EAAEe,KAAK,EAAEG,MAAM,EAAEC,KAAK,EAAE,GAAG,MAAM3B,yBAAyB;gBAC9D4B,SAAS;oBACP,GAAIrB,QAAQsB,MAAM,CAACC,UAAU,IAAI,CAAC,CAAC;oBACnC,GAAIvB,QAAQsB,MAAM,CAACE,MAAM,IAAI,CAAC,CAAC;gBACjC;gBACAC,SAAS7B;YACX;YAEA,IAAIoB,OAAO;gBACT,MAAM,IAAIxB,SAASwB,MAAMU,OAAO;YAClC;YAEA,iDAAiD;YACjD,IAAIN,OAAO;gBACTxB,IAAIwB,KAAK,GAAGA;gBACZ,wEAAwE;gBACxE,sFAAsF;gBACtF,IAAIA,MAAMO,IAAI,IAAI,CAACC,MAAMC,OAAO,CAACT,MAAMO,IAAI,GAAG;oBAC5C/B,IAAI+B,IAAI,GAAGP,MAAMO,IAAI;gBACvB;YACF;YAEA,IAAIR,QAAQW,YAAY,OAAOX,OAAOW,QAAQ,KAAK,UAAU;gBAC3DlC,IAAIc,IAAI,GAAGC,KAAKC,KAAK,CAACO,OAAOW,QAAQ;YACvC;YAEA,IAAI,CAAClC,IAAI+B,IAAI,IAAIR,QAAQQ,QAAQ,OAAOR,QAAQQ,SAAS,UAAU;gBACjE,IAAII;gBACJ,IAAI;oBACFA,eAAepB,KAAKC,KAAK,CAACO,OAAOQ,IAAI;gBACvC,EAAE,OAAM;oBACN,MAAM,IAAInC,SAAS,4BAA4B;gBACjD;gBACA,MAAMwC,iBACJ,OAAOpC,IAAIqC,WAAW,EAAEC,eAAe,WACnCtC,IAAIqC,WAAW,CAACC,UAAU,GAC1BH,aAAaC,cAAc;gBACjC,MAAMG,eAAeH,iBACjBpC,IAAII,OAAO,CAACoC,WAAW,CAACJ,eAAe,EAAEV,OAAOE,SAChDa;gBAEJ,IAAI,CAACL,kBAAkB,CAACG,cAAc;oBACpC,MAAM,IAAI3C,SAAS,8BAA8B;gBACnD;gBAEAI,IAAI+B,IAAI,GAAG,MAAMjC,8BAA8B;oBAC7CsC;oBACAL,MAAMI;oBACNnC;gBACF;YACF;QACF;IACF;AACF,EAAC"}
|
|
@@ -2,7 +2,7 @@ import { describe, it, expect } from 'vitest';
|
|
|
2
2
|
import { sanitizeConfig } from '../config/sanitize.js';
|
|
3
3
|
import { configToJSONSchema, entityToStandaloneJSONSchema } from './configToJSONSchema.js';
|
|
4
4
|
describe('configToJSONSchema', ()=>{
|
|
5
|
-
it('should handle optional arrays with required fields',
|
|
5
|
+
it('should handle optional arrays with required fields', ()=>{
|
|
6
6
|
// @ts-expect-error
|
|
7
7
|
const config = {
|
|
8
8
|
collections: [
|
|
@@ -26,7 +26,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
26
26
|
}
|
|
27
27
|
]
|
|
28
28
|
};
|
|
29
|
-
const sanitizedConfig =
|
|
29
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
30
30
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
31
31
|
expect(schema?.$defs?.test).toStrictEqual({
|
|
32
32
|
type: 'object',
|
|
@@ -66,7 +66,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
66
66
|
title: 'Test'
|
|
67
67
|
});
|
|
68
68
|
});
|
|
69
|
-
it('should generate separate input types when generateInputTypes is enabled',
|
|
69
|
+
it('should generate separate input types when generateInputTypes is enabled', ()=>{
|
|
70
70
|
// @ts-expect-error partial config
|
|
71
71
|
const config = {
|
|
72
72
|
collections: [
|
|
@@ -124,7 +124,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
124
124
|
generateInputTypes: true
|
|
125
125
|
}
|
|
126
126
|
};
|
|
127
|
-
const sanitizedConfig =
|
|
127
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
128
128
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
129
129
|
// Output (read) shape is unchanged: relationships may be populated, managed fields are present,
|
|
130
130
|
// and a required field with a defaultValue stays required.
|
|
@@ -212,7 +212,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
212
212
|
$ref: '#/$defs/posts_input'
|
|
213
213
|
});
|
|
214
214
|
});
|
|
215
|
-
it('should keep _status in the input schema for draft-enabled entities',
|
|
215
|
+
it('should keep _status in the input schema for draft-enabled entities', ()=>{
|
|
216
216
|
// @ts-expect-error partial config
|
|
217
217
|
const config = {
|
|
218
218
|
collections: [
|
|
@@ -231,7 +231,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
231
231
|
}
|
|
232
232
|
]
|
|
233
233
|
};
|
|
234
|
-
const sanitizedConfig =
|
|
234
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
235
235
|
const entity = sanitizedConfig.collections[0];
|
|
236
236
|
const schema = entityToStandaloneJSONSchema({
|
|
237
237
|
config: sanitizedConfig,
|
|
@@ -249,7 +249,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
249
249
|
expect(schema.properties?.createdAt).toBeUndefined();
|
|
250
250
|
expect(schema.properties?.updatedAt).toBeUndefined();
|
|
251
251
|
});
|
|
252
|
-
it('should skip input types by default and generate them when enabled',
|
|
252
|
+
it('should skip input types by default and generate them when enabled', ()=>{
|
|
253
253
|
// @ts-expect-error partial config
|
|
254
254
|
const offByDefault = {
|
|
255
255
|
collections: [
|
|
@@ -264,7 +264,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
264
264
|
}
|
|
265
265
|
]
|
|
266
266
|
};
|
|
267
|
-
const { jsonSchema: defaultSchema } = configToJSONSchema(
|
|
267
|
+
const { jsonSchema: defaultSchema } = configToJSONSchema(sanitizeConfig(offByDefault), 'text');
|
|
268
268
|
expect(defaultSchema?.$defs?.posts_input).toBeUndefined();
|
|
269
269
|
expect(defaultSchema?.properties?.collectionsInput).toBeUndefined();
|
|
270
270
|
// @ts-expect-error partial config
|
|
@@ -284,11 +284,11 @@ describe('configToJSONSchema', ()=>{
|
|
|
284
284
|
generateInputTypes: true
|
|
285
285
|
}
|
|
286
286
|
};
|
|
287
|
-
const { jsonSchema: enabledSchema } = configToJSONSchema(
|
|
287
|
+
const { jsonSchema: enabledSchema } = configToJSONSchema(sanitizeConfig(enabled), 'text');
|
|
288
288
|
expect(enabledSchema?.$defs?.posts_input).toBeDefined();
|
|
289
289
|
expect(enabledSchema?.properties?.collectionsInput).toBeDefined();
|
|
290
290
|
});
|
|
291
|
-
it('should generate Input-suffixed definitions for named interfaces and blocks',
|
|
291
|
+
it('should generate Input-suffixed definitions for named interfaces and blocks', ()=>{
|
|
292
292
|
// @ts-expect-error partial config
|
|
293
293
|
const config = {
|
|
294
294
|
collections: [
|
|
@@ -344,7 +344,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
344
344
|
generateInputTypes: true
|
|
345
345
|
}
|
|
346
346
|
};
|
|
347
|
-
const sanitizedConfig =
|
|
347
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
348
348
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
349
349
|
// Read-shaped named interface keeps the populated-doc union...
|
|
350
350
|
expect((schema?.$defs?.Meta).properties.author).toStrictEqual({
|
|
@@ -393,7 +393,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
393
393
|
]
|
|
394
394
|
});
|
|
395
395
|
});
|
|
396
|
-
it('passes the variant to field-level jsonSchema transforms',
|
|
396
|
+
it('passes the variant to field-level jsonSchema transforms', ()=>{
|
|
397
397
|
// @ts-expect-error partial config
|
|
398
398
|
const config = {
|
|
399
399
|
collections: [
|
|
@@ -417,12 +417,12 @@ describe('configToJSONSchema', ()=>{
|
|
|
417
417
|
generateInputTypes: true
|
|
418
418
|
}
|
|
419
419
|
};
|
|
420
|
-
const sanitizedConfig =
|
|
420
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
421
421
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
422
422
|
expect((schema?.$defs?.posts).properties.custom.description).toBe('output');
|
|
423
423
|
expect((schema?.$defs?.posts_input).properties.custom.description).toBe('input');
|
|
424
424
|
});
|
|
425
|
-
it('should handle block fields with no blocks',
|
|
425
|
+
it('should handle block fields with no blocks', ()=>{
|
|
426
426
|
// @ts-expect-error
|
|
427
427
|
const config = {
|
|
428
428
|
collections: [
|
|
@@ -477,7 +477,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
477
477
|
}
|
|
478
478
|
]
|
|
479
479
|
};
|
|
480
|
-
const sanitizedConfig =
|
|
480
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
481
481
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
482
482
|
expect(schema?.$defs?.test).toStrictEqual({
|
|
483
483
|
type: 'object',
|
|
@@ -531,7 +531,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
531
531
|
title: 'Test'
|
|
532
532
|
});
|
|
533
533
|
});
|
|
534
|
-
it('keeps the first block interface name clean and content-hashes the colliding one',
|
|
534
|
+
it('keeps the first block interface name clean and content-hashes the colliding one', ()=>{
|
|
535
535
|
// @ts-expect-error - partial config for testing
|
|
536
536
|
const config = {
|
|
537
537
|
collections: [
|
|
@@ -591,7 +591,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
591
591
|
}
|
|
592
592
|
]
|
|
593
593
|
};
|
|
594
|
-
const sanitizedConfig =
|
|
594
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
595
595
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
596
596
|
const defs = schema.$defs;
|
|
597
597
|
// The first `hero` keeps the clean name; the unique block is unaffected.
|
|
@@ -614,7 +614,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
614
614
|
const { jsonSchema: schema2 } = configToJSONSchema(sanitizedConfig, 'text');
|
|
615
615
|
expect(Object.keys(schema2.$defs).filter((k)=>/^Hero/.test(k)).sort()).toStrictEqual(Object.keys(defs).filter((k)=>/^Hero/.test(k)).sort());
|
|
616
616
|
});
|
|
617
|
-
it('should handle tabs and named tabs with required fields',
|
|
617
|
+
it('should handle tabs and named tabs with required fields', ()=>{
|
|
618
618
|
// @ts-expect-error
|
|
619
619
|
const config = {
|
|
620
620
|
collections: [
|
|
@@ -662,7 +662,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
662
662
|
}
|
|
663
663
|
]
|
|
664
664
|
};
|
|
665
|
-
const sanitizedConfig =
|
|
665
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
666
666
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
667
667
|
expect(schema?.$defs?.test).toStrictEqual({
|
|
668
668
|
type: 'object',
|
|
@@ -710,7 +710,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
710
710
|
title: 'Test'
|
|
711
711
|
});
|
|
712
712
|
});
|
|
713
|
-
it('should handle custom typescript schema and JSON field schema',
|
|
713
|
+
it('should handle custom typescript schema and JSON field schema', ()=>{
|
|
714
714
|
const customSchema = {
|
|
715
715
|
type: 'object',
|
|
716
716
|
properties: {
|
|
@@ -751,7 +751,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
751
751
|
}
|
|
752
752
|
]
|
|
753
753
|
};
|
|
754
|
-
const sanitizedConfig =
|
|
754
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
755
755
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
756
756
|
expect(schema?.$defs?.test).toStrictEqual({
|
|
757
757
|
type: 'object',
|
|
@@ -769,7 +769,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
769
769
|
title: 'Test'
|
|
770
770
|
});
|
|
771
771
|
});
|
|
772
|
-
it('should handle same block object being referenced in both collection and config.blocks',
|
|
772
|
+
it('should handle same block object being referenced in both collection and config.blocks', ()=>{
|
|
773
773
|
const sharedBlock = {
|
|
774
774
|
slug: 'sharedBlock',
|
|
775
775
|
interfaceName: 'SharedBlock',
|
|
@@ -811,7 +811,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
811
811
|
]
|
|
812
812
|
};
|
|
813
813
|
// Ensure both rich text editor are sanitized
|
|
814
|
-
const sanitizedConfig =
|
|
814
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
815
815
|
expect(typeof sanitizedConfig?.blocks?.[0]?.fields?.[0]?.editor).toBe('object');
|
|
816
816
|
expect(typeof sanitizedConfig.collections[0].fields[0]?.blocks?.[0]?.fields?.[0]?.editor).toBe('object');
|
|
817
817
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
@@ -877,7 +877,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
877
877
|
// The definition should still be registered for TypeScript type generation
|
|
878
878
|
expect(schema?.$defs?.SharedBlock).toStrictEqual(expectedBlockSchema);
|
|
879
879
|
});
|
|
880
|
-
it('content-hashes a colliding explicit interfaceName instead of overwriting it',
|
|
880
|
+
it('content-hashes a colliding explicit interfaceName instead of overwriting it', ()=>{
|
|
881
881
|
// Two different blocks both set `interfaceName: 'Hero'` - each must keep its own definition.
|
|
882
882
|
const config = {
|
|
883
883
|
collections: [
|
|
@@ -916,7 +916,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
916
916
|
}
|
|
917
917
|
]
|
|
918
918
|
};
|
|
919
|
-
const sanitizedConfig =
|
|
919
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
920
920
|
const { jsonSchema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
921
921
|
const defs = jsonSchema.$defs;
|
|
922
922
|
// Each differently-shaped block keeps its own interface (one clean, one hash-suffixed).
|
|
@@ -926,7 +926,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
926
926
|
const shapeOf = (name)=>Object.keys(defs[name].properties).sort().join(',');
|
|
927
927
|
expect(shapeOf(heroNames[0])).not.toBe(shapeOf(heroNames[1]));
|
|
928
928
|
});
|
|
929
|
-
it('reuses one definition when the same block is registered more than once',
|
|
929
|
+
it('reuses one definition when the same block is registered more than once', ()=>{
|
|
930
930
|
// Reusing one block across fields registers an identical schema each time, so it dedupes.
|
|
931
931
|
const heroBlock = {
|
|
932
932
|
slug: 'hero',
|
|
@@ -963,14 +963,14 @@ describe('configToJSONSchema', ()=>{
|
|
|
963
963
|
}
|
|
964
964
|
]
|
|
965
965
|
};
|
|
966
|
-
const sanitizedConfig =
|
|
966
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
967
967
|
const { jsonSchema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
968
968
|
const heroNames = Object.keys(jsonSchema.$defs).filter((k)=>/^Hero(_[0-9A-F]{8})?$/.test(k));
|
|
969
969
|
expect(heroNames).toEqual([
|
|
970
970
|
'Hero'
|
|
971
971
|
]);
|
|
972
972
|
});
|
|
973
|
-
it('should allow overriding required to false',
|
|
973
|
+
it('should allow overriding required to false', ()=>{
|
|
974
974
|
// @ts-expect-error
|
|
975
975
|
const config = {
|
|
976
976
|
collections: [
|
|
@@ -995,12 +995,12 @@ describe('configToJSONSchema', ()=>{
|
|
|
995
995
|
}
|
|
996
996
|
]
|
|
997
997
|
};
|
|
998
|
-
const sanitizedConfig =
|
|
998
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
999
999
|
const { jsonSchema: schema } = configToJSONSchema(sanitizedConfig, 'text');
|
|
1000
1000
|
// @ts-expect-error
|
|
1001
1001
|
expect(schema.$defs.test.properties.title.required).toStrictEqual(false);
|
|
1002
1002
|
});
|
|
1003
|
-
it('should propagate forceInlineBlocks to nested fields (array, group, tab)',
|
|
1003
|
+
it('should propagate forceInlineBlocks to nested fields (array, group, tab)', ()=>{
|
|
1004
1004
|
const namedBlock = {
|
|
1005
1005
|
slug: 'myBlock',
|
|
1006
1006
|
interfaceName: 'MyBlock',
|
|
@@ -1049,7 +1049,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
1049
1049
|
}
|
|
1050
1050
|
]
|
|
1051
1051
|
};
|
|
1052
|
-
const sanitizedConfig =
|
|
1052
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
1053
1053
|
// Without forceInlineBlocks: blocks field uses $ref
|
|
1054
1054
|
const { jsonSchema: schemaDefault } = configToJSONSchema(sanitizedConfig, 'text');
|
|
1055
1055
|
const arrItemsDefault = schemaDefault.$defs.test.properties.arr.items;
|
|
@@ -1073,7 +1073,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
1073
1073
|
const: 'myBlock'
|
|
1074
1074
|
});
|
|
1075
1075
|
});
|
|
1076
|
-
it('entityToStandaloneJSONSchema bundles only the definitions an entity references',
|
|
1076
|
+
it('entityToStandaloneJSONSchema bundles only the definitions an entity references', ()=>{
|
|
1077
1077
|
const sharedBlock = {
|
|
1078
1078
|
slug: 'sharedBlock',
|
|
1079
1079
|
interfaceName: 'SharedBlock',
|
|
@@ -1136,7 +1136,7 @@ describe('configToJSONSchema', ()=>{
|
|
|
1136
1136
|
}
|
|
1137
1137
|
]
|
|
1138
1138
|
};
|
|
1139
|
-
const sanitizedConfig =
|
|
1139
|
+
const sanitizedConfig = sanitizeConfig(config);
|
|
1140
1140
|
const entity = sanitizedConfig.collections.find((collection)=>collection.slug === 'with-refs');
|
|
1141
1141
|
const schema = entityToStandaloneJSONSchema({
|
|
1142
1142
|
config: sanitizedConfig,
|