payload 4.0.0-internal.e55ccef → 4.0.0-internal.e7d4ebc

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.
Files changed (52) hide show
  1. package/dist/admin/functions/index.d.ts +0 -7
  2. package/dist/admin/functions/index.d.ts.map +1 -1
  3. package/dist/admin/functions/index.js.map +1 -1
  4. package/dist/admin/types.d.ts +1 -1
  5. package/dist/admin/types.d.ts.map +1 -1
  6. package/dist/admin/types.js.map +1 -1
  7. package/dist/collections/config/client.d.ts +8 -2
  8. package/dist/collections/config/client.d.ts.map +1 -1
  9. package/dist/collections/config/client.js +6 -1
  10. package/dist/collections/config/client.js.map +1 -1
  11. package/dist/config/sanitize.d.ts.map +1 -1
  12. package/dist/config/sanitize.js +4 -0
  13. package/dist/config/sanitize.js.map +1 -1
  14. package/dist/exports/internal.d.ts +2 -0
  15. package/dist/exports/internal.d.ts.map +1 -1
  16. package/dist/exports/internal.js +3 -1
  17. package/dist/exports/internal.js.map +1 -1
  18. package/dist/fields/baseFields/slug/generateSlug.d.ts +16 -5
  19. package/dist/fields/baseFields/slug/generateSlug.d.ts.map +1 -1
  20. package/dist/fields/baseFields/slug/generateSlug.js +22 -26
  21. package/dist/fields/baseFields/slug/generateSlug.js.map +1 -1
  22. package/dist/index.bundled.d.ts +3907 -3862
  23. package/dist/types/index.d.ts +1 -4
  24. package/dist/types/index.d.ts.map +1 -1
  25. package/dist/types/index.js.map +1 -1
  26. package/dist/uploads/checkFileRestrictions.d.ts +1 -1
  27. package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
  28. package/dist/uploads/checkFileRestrictions.js +15 -1
  29. package/dist/uploads/checkFileRestrictions.js.map +1 -1
  30. package/dist/uploads/endpoints/uploadInstructions.d.ts +15 -0
  31. package/dist/uploads/endpoints/uploadInstructions.d.ts.map +1 -0
  32. package/dist/uploads/endpoints/uploadInstructions.js +84 -0
  33. package/dist/uploads/endpoints/uploadInstructions.js.map +1 -0
  34. package/dist/uploads/getFileFromUploadInstructions.d.ts +8 -0
  35. package/dist/uploads/getFileFromUploadInstructions.d.ts.map +1 -0
  36. package/dist/uploads/getFileFromUploadInstructions.js +62 -0
  37. package/dist/uploads/getFileFromUploadInstructions.js.map +1 -0
  38. package/dist/uploads/stagedUpload.d.ts +27 -0
  39. package/dist/uploads/stagedUpload.d.ts.map +1 -0
  40. package/dist/uploads/stagedUpload.js +197 -0
  41. package/dist/uploads/stagedUpload.js.map +1 -0
  42. package/dist/uploads/types.d.ts +53 -1
  43. package/dist/uploads/types.d.ts.map +1 -1
  44. package/dist/uploads/types.js.map +1 -1
  45. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  46. package/dist/utilities/addDataAndFileToRequest.js +12 -45
  47. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  48. package/package.json +2 -2
  49. package/dist/fields/baseFields/slug/countVersions.d.ts +0 -13
  50. package/dist/fields/baseFields/slug/countVersions.d.ts.map +0 -1
  51. package/dist/fields/baseFields/slug/countVersions.js +0 -27
  52. package/dist/fields/baseFields/slug/countVersions.js.map +0 -1
@@ -97,10 +97,7 @@ type PayloadRequestData = {
97
97
  data?: JsonObject;
98
98
  /** The file on the request, same rules apply as the `data` property */
99
99
  file?: {
100
- /**
101
- * Context of the file when it was uploaded via client side.
102
- */
103
- clientUploadContext?: unknown;
100
+ uploadReference?: unknown;
104
101
  } & File;
105
102
  /** All files from multipart form data, keyed by field name */
106
103
  files?: Record<string, File | File[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["import type { I18n, TFunction } from '@payloadcms/translations'\nimport type DataLoader from 'dataloader'\nimport type { OptionalKeys, RequiredKeys } from 'ts-essentials'\nimport type { URL } from 'url'\n\nimport type { ServerAdapter } from '../admin/adapters/server.js'\nimport type {\n DataFromCollectionSlug,\n QueryDraftDataFromCollectionSlug,\n TypeWithID,\n TypeWithTimestamps,\n} from '../collections/config/types.js'\nimport type payload from '../index.js'\nimport type {\n AuthenticatedUser,\n CollectionSlug,\n DataFromGlobalSlug,\n GlobalSlug,\n Payload,\n RequestContext,\n TypedCollectionJoins,\n TypedCollectionSelect,\n TypedFallbackLocale,\n TypedLocale,\n} from '../index.js'\nimport type { File } from '../uploads/types.js'\nimport type { Operator } from './constants.js'\nexport type { TypeWithID } from '../collections/config/types.js'\nexport type { Payload } from '../index.js'\n\nexport interface PayloadRequestAPI {\n GraphQL: true\n local: true\n REST: true\n}\n\nexport type CustomPayloadRequestProperties = {\n context: RequestContext\n /** The locale that should be used for a field when it is not translated to the requested locale */\n fallbackLocale?: TypedFallbackLocale\n i18n: I18n\n /**\n * The requested locale if specified\n * Only available for localized collections\n *\n * Suppressing warning below as it is a valid use case - won't be an issue if generated types exist\n */\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n locale?: 'all' | TypedLocale\n /**\n * The payload object\n */\n payload: typeof payload\n /**\n * The context in which the request is being made\n */\n payloadAPI: keyof PayloadRequestAPI\n /** Optimized document loader */\n payloadDataLoader: {\n /**\n * Wraps `payload.find` with a cache to deduplicate requests\n * @experimental This is may be replaced by a more robust cache strategy in future versions\n * By calling this method with the same arguments many times in one request, it will only be handled one time\n * const result = await req.payloadDataLoader.find({\n * collection,\n * req,\n * where: findWhere,\n * })\n */\n find: Payload['find']\n } & DataLoader<string, TypeWithID>\n /** Resized versions of the image that was uploaded during this request */\n payloadUploadSizes?: Record<string, Buffer>\n /** Query params on the request */\n query: Record<string, unknown>\n /** Any response headers that are required to be set when a response is sent */\n responseHeaders?: Headers\n /** The route parameters\n * @example\n * /:collection/:id -> /posts/123\n * { collection: 'posts', id: '123' }\n */\n routeParams?: Record<string, unknown>\n /**\n * Framework abstraction for server-only navigation, cookies, and headers APIs.\n * Populated by the framework adapter (e.g. `@payloadcms/next`). Plugins that\n * have access to `req` should call methods here (`req.server.unauthorized()`,\n * `req.server.redirect(...)`) instead of importing from `next/navigation` or\n * `next/headers` directly. Optional because non-framework contexts (jobs,\n * scripts, tests) construct requests without a server adapter.\n */\n server?: ServerAdapter\n /** Translate function - duplicate of i18n.t */\n t: TFunction\n /**\n * Identifier for the database transaction for interactions in a single, all-or-nothing operation.\n * Can also be used to ensure consistency when multiple operations try to create a transaction concurrently on the same request.\n */\n transactionID?: number | Promise<number | string> | string\n /** The signed-in user */\n user: AuthenticatedUser | null\n} & Pick<\n URL,\n 'hash' | 'host' | 'href' | 'origin' | 'pathname' | 'port' | 'protocol' | 'search' | 'searchParams'\n>\ntype PayloadRequestData = {\n /**\n * Data from the request body\n *\n * Within Payload operations, i.e. hooks, data will be there\n * BUT in custom endpoints it will not be, you will need to\n * use either:\n * 1. `const data = await req.json()`\n *\n * 2. import { addDataAndFileToRequest } from 'payload'\n * `await addDataAndFileToRequest(req)`\n *\n * You should not expect this object to be the document data. It is the request data.\n * */\n data?: JsonObject\n /** The file on the request, same rules apply as the `data` property */\n file?: {\n /**\n * Context of the file when it was uploaded via client side.\n */\n clientUploadContext?: unknown\n } & File\n /** All files from multipart form data, keyed by field name */\n files?: Record<string, File | File[]>\n}\nexport interface PayloadRequest\n extends CustomPayloadRequestProperties,\n Partial<Request>,\n PayloadRequestData {\n headers: Request['headers']\n}\n\nexport type { Operator }\n\n// Makes it so things like passing new Date() will error\nexport type JsonValue = JsonArray | JsonObject | unknown //Date | JsonArray | JsonObject | boolean | null | number | string // TODO: Evaluate proper, strong type for this\n\nexport type JsonArray = Array<JsonValue>\n\nexport interface JsonObject {\n [key: string]: any\n}\n\nexport type WhereField = {\n // any json-serializable value\n [key in Operator]?: JsonValue\n}\n\nexport type Where = {\n [key: string]: Where[] | WhereField\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n and?: Where[]\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n or?: Where[]\n}\n\nexport type Sort = Array<string> | string\n\ntype SerializableValue = boolean | number | object | string\nexport type DefaultValue =\n | ((args: {\n locale?: TypedLocale\n req: PayloadRequest\n user: PayloadRequest['user']\n }) => SerializableValue)\n | SerializableValue\n\n/**\n * Applies pagination for join fields for including collection relationships\n */\nexport type JoinQuery<TSlug extends CollectionSlug = string> =\n TypedCollectionJoins[TSlug] extends Record<string, string>\n ?\n | false\n | Partial<{\n [K in keyof TypedCollectionJoins[TSlug]]:\n | {\n count?: boolean\n limit?: number\n page?: number\n sort?: string\n where?: Where\n }\n | false\n }>\n : never\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Document = any\n\nexport type Operation = 'create' | 'delete' | 'read' | 'update'\nexport type VersionOperations = 'readVersions'\nexport type AuthOperations = 'unlock'\nexport type AllOperations = AuthOperations | Operation | VersionOperations\n\nexport function docHasTimestamps(doc: any): doc is TypeWithTimestamps {\n return doc?.createdAt && doc?.updatedAt\n}\n\nexport type IfAny<T, Y, N> = 0 extends 1 & T ? Y : N // This is a commonly used trick to detect 'any'\nexport type IsAny<T> = IfAny<T, true, false>\nexport type ReplaceAny<T, DefaultType> = IsAny<T> extends true ? DefaultType : T\n\nexport type SelectIncludeType = {\n [k: string]: SelectIncludeType | true\n}\n\nexport type SelectExcludeType = {\n [k: string]: false | SelectExcludeType\n}\n\nexport type SelectMode = 'exclude' | 'include'\n\nexport type SelectType = SelectExcludeType | SelectIncludeType\n\n/**\n * Operations that invoke an entity-level `select` function.\n *\n * Narrower than `HookOperationType`: `select` runs only for read- and\n * write-path operations that materialize a document (`create`, `delete`,\n * `read`, `restoreVersion`, `update`). Operations like `autosave`, `count`,\n * `countVersions`, `forgotPassword`, `login`, `readDistinct`, `refresh`, and\n * `resetPassword` do not invoke `select` and are intentionally excluded.\n */\nexport type SelectFnOperation = 'create' | 'delete' | 'read' | 'restoreVersion' | 'update'\n\nexport type SelectFnArgs = {\n operation: SelectFnOperation\n req: PayloadRequest\n /** The caller's `select` arg, or `undefined` if not provided. */\n select?: SelectType\n}\n\nexport type SelectFn<TSelect extends SelectType = SelectType> = (\n args: SelectFnArgs,\n) => TSelect | undefined\n\n/**\n * Shared shape for the entity-level `select` config used by Collections and Globals.\n * The JSDoc on the `select` property is the single source of truth — pick from this\n * type when defining the config:\n *\n * & Pick<WithSelectFn<...>, 'select'>\n */\nexport type WithSelectFn<TSelect extends SelectType = SelectType> = {\n /**\n * Entity-level Select API configuration.\n *\n * A function that receives the current request context (`operation`, `req`,\n * the caller's `select`) and returns the final `select` to apply, replacing\n * the caller's. Return `undefined` to leave the caller's `select` unchanged.\n *\n * Useful to dynamically modify the caller's selection based on the request context:\n * - Forcing a field to be populated for reference within hooks / access control.\n * - Differentiating between API requests and admin panel requests, to optimize\n * the amount of data being queried in each case.\n *\n * Note: per-document data is not available — this runs before the read.\n *\n * @see https://payloadcms.com/docs/queries/select\n */\n select?: SelectFn<TSelect>\n}\n\nexport type ApplyDisableErrors<T, DisableErrors = false> = false extends DisableErrors\n ? T\n : null | T\n\nexport type TransformDataWithSelect<\n Data extends Record<string, any>,\n Select extends SelectType,\n> = Select extends never\n ? Data\n : string extends keyof Select\n ? Data\n : // START Handle types when they aren't generated\n // For example in any package in this repository outside of tests / plugins\n // This stil gives us autocomplete when using include select mode, i.e select: {title :true} returns type {title: any, id: string | number}\n string extends keyof Omit<Data, 'id'>\n ? Select extends SelectIncludeType\n ? {\n [K in Data extends TypeWithID ? 'id' | keyof Select : keyof Select]: K extends 'id'\n ? number | string\n : unknown\n }\n : Data\n : // END Handle types when they aren't generated\n // Handle include mode\n Select extends SelectIncludeType\n ? {\n [K in keyof Data as K extends keyof Select\n ? Select[K] extends object | true\n ? K\n : never\n : // select 'id' always\n K extends 'id'\n ? K\n : never]: Data[K]\n }\n : // Handle exclude mode\n {\n [K in keyof Data as K extends keyof Select\n ? Select[K] extends object | undefined\n ? K\n : never\n : K]: Data[K]\n }\n\nexport type TransformCollectionWithSelect<\n TSlug extends CollectionSlug,\n TSelect extends SelectType,\n> = TSelect extends SelectType\n ? TransformDataWithSelect<DataFromCollectionSlug<TSlug>, TSelect>\n : DataFromCollectionSlug<TSlug>\n\nexport type DraftTransformCollectionWithSelect<\n TSlug extends CollectionSlug,\n TSelect extends SelectType,\n> = TSelect extends SelectType\n ? TransformDataWithSelect<QueryDraftDataFromCollectionSlug<TSlug>, TSelect>\n : QueryDraftDataFromCollectionSlug<TSlug>\n\nexport type TransformGlobalWithSelect<\n TSlug extends GlobalSlug,\n TSelect extends SelectType,\n> = TSelect extends SelectType\n ? TransformDataWithSelect<DataFromGlobalSlug<TSlug>, TSelect>\n : DataFromGlobalSlug<TSlug>\n\nexport type PopulateType = Partial<TypedCollectionSelect>\n\nexport type ResolvedFilterOptions = { [collection: string]: Where }\n\nexport type PickPreserveOptional<T, K extends keyof T> = Partial<\n Pick<T, Extract<K, OptionalKeys<T>>>\n> &\n Pick<T, Extract<K, RequiredKeys<T>>>\n\nexport type MaybePromise<T> = Promise<T> | T\n"],"names":["docHasTimestamps","doc","createdAt","updatedAt"],"mappings":"AAwMA,OAAO,SAASA,iBAAiBC,GAAQ;IACvC,OAAOA,KAAKC,aAAaD,KAAKE;AAChC"}
1
+ {"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["import type { I18n, TFunction } from '@payloadcms/translations'\nimport type DataLoader from 'dataloader'\nimport type { OptionalKeys, RequiredKeys } from 'ts-essentials'\nimport type { URL } from 'url'\n\nimport type { ServerAdapter } from '../admin/adapters/server.js'\nimport type {\n DataFromCollectionSlug,\n QueryDraftDataFromCollectionSlug,\n TypeWithID,\n TypeWithTimestamps,\n} from '../collections/config/types.js'\nimport type payload from '../index.js'\nimport type {\n AuthenticatedUser,\n CollectionSlug,\n DataFromGlobalSlug,\n GlobalSlug,\n Payload,\n RequestContext,\n TypedCollectionJoins,\n TypedCollectionSelect,\n TypedFallbackLocale,\n TypedLocale,\n} from '../index.js'\nimport type { File } from '../uploads/types.js'\nimport type { Operator } from './constants.js'\nexport type { TypeWithID } from '../collections/config/types.js'\nexport type { Payload } from '../index.js'\n\nexport interface PayloadRequestAPI {\n GraphQL: true\n local: true\n REST: true\n}\n\nexport type CustomPayloadRequestProperties = {\n context: RequestContext\n /** The locale that should be used for a field when it is not translated to the requested locale */\n fallbackLocale?: TypedFallbackLocale\n i18n: I18n\n /**\n * The requested locale if specified\n * Only available for localized collections\n *\n * Suppressing warning below as it is a valid use case - won't be an issue if generated types exist\n */\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n locale?: 'all' | TypedLocale\n /**\n * The payload object\n */\n payload: typeof payload\n /**\n * The context in which the request is being made\n */\n payloadAPI: keyof PayloadRequestAPI\n /** Optimized document loader */\n payloadDataLoader: {\n /**\n * Wraps `payload.find` with a cache to deduplicate requests\n * @experimental This is may be replaced by a more robust cache strategy in future versions\n * By calling this method with the same arguments many times in one request, it will only be handled one time\n * const result = await req.payloadDataLoader.find({\n * collection,\n * req,\n * where: findWhere,\n * })\n */\n find: Payload['find']\n } & DataLoader<string, TypeWithID>\n /** Resized versions of the image that was uploaded during this request */\n payloadUploadSizes?: Record<string, Buffer>\n /** Query params on the request */\n query: Record<string, unknown>\n /** Any response headers that are required to be set when a response is sent */\n responseHeaders?: Headers\n /** The route parameters\n * @example\n * /:collection/:id -> /posts/123\n * { collection: 'posts', id: '123' }\n */\n routeParams?: Record<string, unknown>\n /**\n * Framework abstraction for server-only navigation, cookies, and headers APIs.\n * Populated by the framework adapter (e.g. `@payloadcms/next`). Plugins that\n * have access to `req` should call methods here (`req.server.unauthorized()`,\n * `req.server.redirect(...)`) instead of importing from `next/navigation` or\n * `next/headers` directly. Optional because non-framework contexts (jobs,\n * scripts, tests) construct requests without a server adapter.\n */\n server?: ServerAdapter\n /** Translate function - duplicate of i18n.t */\n t: TFunction\n /**\n * Identifier for the database transaction for interactions in a single, all-or-nothing operation.\n * Can also be used to ensure consistency when multiple operations try to create a transaction concurrently on the same request.\n */\n transactionID?: number | Promise<number | string> | string\n /** The signed-in user */\n user: AuthenticatedUser | null\n} & Pick<\n URL,\n 'hash' | 'host' | 'href' | 'origin' | 'pathname' | 'port' | 'protocol' | 'search' | 'searchParams'\n>\ntype PayloadRequestData = {\n /**\n * Data from the request body\n *\n * Within Payload operations, i.e. hooks, data will be there\n * BUT in custom endpoints it will not be, you will need to\n * use either:\n * 1. `const data = await req.json()`\n *\n * 2. import { addDataAndFileToRequest } from 'payload'\n * `await addDataAndFileToRequest(req)`\n *\n * You should not expect this object to be the document data. It is the request data.\n * */\n data?: JsonObject\n /** The file on the request, same rules apply as the `data` property */\n file?: {\n uploadReference?: unknown\n } & File\n /** All files from multipart form data, keyed by field name */\n files?: Record<string, File | File[]>\n}\nexport interface PayloadRequest\n extends CustomPayloadRequestProperties,\n Partial<Request>,\n PayloadRequestData {\n headers: Request['headers']\n}\n\nexport type { Operator }\n\n// Makes it so things like passing new Date() will error\nexport type JsonValue = JsonArray | JsonObject | unknown //Date | JsonArray | JsonObject | boolean | null | number | string // TODO: Evaluate proper, strong type for this\n\nexport type JsonArray = Array<JsonValue>\n\nexport interface JsonObject {\n [key: string]: any\n}\n\nexport type WhereField = {\n // any json-serializable value\n [key in Operator]?: JsonValue\n}\n\nexport type Where = {\n [key: string]: Where[] | WhereField\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n and?: Where[]\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n or?: Where[]\n}\n\nexport type Sort = Array<string> | string\n\ntype SerializableValue = boolean | number | object | string\nexport type DefaultValue =\n | ((args: {\n locale?: TypedLocale\n req: PayloadRequest\n user: PayloadRequest['user']\n }) => SerializableValue)\n | SerializableValue\n\n/**\n * Applies pagination for join fields for including collection relationships\n */\nexport type JoinQuery<TSlug extends CollectionSlug = string> =\n TypedCollectionJoins[TSlug] extends Record<string, string>\n ?\n | false\n | Partial<{\n [K in keyof TypedCollectionJoins[TSlug]]:\n | {\n count?: boolean\n limit?: number\n page?: number\n sort?: string\n where?: Where\n }\n | false\n }>\n : never\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Document = any\n\nexport type Operation = 'create' | 'delete' | 'read' | 'update'\nexport type VersionOperations = 'readVersions'\nexport type AuthOperations = 'unlock'\nexport type AllOperations = AuthOperations | Operation | VersionOperations\n\nexport function docHasTimestamps(doc: any): doc is TypeWithTimestamps {\n return doc?.createdAt && doc?.updatedAt\n}\n\nexport type IfAny<T, Y, N> = 0 extends 1 & T ? Y : N // This is a commonly used trick to detect 'any'\nexport type IsAny<T> = IfAny<T, true, false>\nexport type ReplaceAny<T, DefaultType> = IsAny<T> extends true ? DefaultType : T\n\nexport type SelectIncludeType = {\n [k: string]: SelectIncludeType | true\n}\n\nexport type SelectExcludeType = {\n [k: string]: false | SelectExcludeType\n}\n\nexport type SelectMode = 'exclude' | 'include'\n\nexport type SelectType = SelectExcludeType | SelectIncludeType\n\n/**\n * Operations that invoke an entity-level `select` function.\n *\n * Narrower than `HookOperationType`: `select` runs only for read- and\n * write-path operations that materialize a document (`create`, `delete`,\n * `read`, `restoreVersion`, `update`). Operations like `autosave`, `count`,\n * `countVersions`, `forgotPassword`, `login`, `readDistinct`, `refresh`, and\n * `resetPassword` do not invoke `select` and are intentionally excluded.\n */\nexport type SelectFnOperation = 'create' | 'delete' | 'read' | 'restoreVersion' | 'update'\n\nexport type SelectFnArgs = {\n operation: SelectFnOperation\n req: PayloadRequest\n /** The caller's `select` arg, or `undefined` if not provided. */\n select?: SelectType\n}\n\nexport type SelectFn<TSelect extends SelectType = SelectType> = (\n args: SelectFnArgs,\n) => TSelect | undefined\n\n/**\n * Shared shape for the entity-level `select` config used by Collections and Globals.\n * The JSDoc on the `select` property is the single source of truth — pick from this\n * type when defining the config:\n *\n * & Pick<WithSelectFn<...>, 'select'>\n */\nexport type WithSelectFn<TSelect extends SelectType = SelectType> = {\n /**\n * Entity-level Select API configuration.\n *\n * A function that receives the current request context (`operation`, `req`,\n * the caller's `select`) and returns the final `select` to apply, replacing\n * the caller's. Return `undefined` to leave the caller's `select` unchanged.\n *\n * Useful to dynamically modify the caller's selection based on the request context:\n * - Forcing a field to be populated for reference within hooks / access control.\n * - Differentiating between API requests and admin panel requests, to optimize\n * the amount of data being queried in each case.\n *\n * Note: per-document data is not available — this runs before the read.\n *\n * @see https://payloadcms.com/docs/queries/select\n */\n select?: SelectFn<TSelect>\n}\n\nexport type ApplyDisableErrors<T, DisableErrors = false> = false extends DisableErrors\n ? T\n : null | T\n\nexport type TransformDataWithSelect<\n Data extends Record<string, any>,\n Select extends SelectType,\n> = Select extends never\n ? Data\n : string extends keyof Select\n ? Data\n : // START Handle types when they aren't generated\n // For example in any package in this repository outside of tests / plugins\n // This stil gives us autocomplete when using include select mode, i.e select: {title :true} returns type {title: any, id: string | number}\n string extends keyof Omit<Data, 'id'>\n ? Select extends SelectIncludeType\n ? {\n [K in Data extends TypeWithID ? 'id' | keyof Select : keyof Select]: K extends 'id'\n ? number | string\n : unknown\n }\n : Data\n : // END Handle types when they aren't generated\n // Handle include mode\n Select extends SelectIncludeType\n ? {\n [K in keyof Data as K extends keyof Select\n ? Select[K] extends object | true\n ? K\n : never\n : // select 'id' always\n K extends 'id'\n ? K\n : never]: Data[K]\n }\n : // Handle exclude mode\n {\n [K in keyof Data as K extends keyof Select\n ? Select[K] extends object | undefined\n ? K\n : never\n : K]: Data[K]\n }\n\nexport type TransformCollectionWithSelect<\n TSlug extends CollectionSlug,\n TSelect extends SelectType,\n> = TSelect extends SelectType\n ? TransformDataWithSelect<DataFromCollectionSlug<TSlug>, TSelect>\n : DataFromCollectionSlug<TSlug>\n\nexport type DraftTransformCollectionWithSelect<\n TSlug extends CollectionSlug,\n TSelect extends SelectType,\n> = TSelect extends SelectType\n ? TransformDataWithSelect<QueryDraftDataFromCollectionSlug<TSlug>, TSelect>\n : QueryDraftDataFromCollectionSlug<TSlug>\n\nexport type TransformGlobalWithSelect<\n TSlug extends GlobalSlug,\n TSelect extends SelectType,\n> = TSelect extends SelectType\n ? TransformDataWithSelect<DataFromGlobalSlug<TSlug>, TSelect>\n : DataFromGlobalSlug<TSlug>\n\nexport type PopulateType = Partial<TypedCollectionSelect>\n\nexport type ResolvedFilterOptions = { [collection: string]: Where }\n\nexport type PickPreserveOptional<T, K extends keyof T> = Partial<\n Pick<T, Extract<K, OptionalKeys<T>>>\n> &\n Pick<T, Extract<K, RequiredKeys<T>>>\n\nexport type MaybePromise<T> = Promise<T> | T\n"],"names":["docHasTimestamps","doc","createdAt","updatedAt"],"mappings":"AAqMA,OAAO,SAASA,iBAAiBC,GAAQ;IACvC,OAAOA,KAAKC,aAAaD,KAAKE;AAChC"}
@@ -3,5 +3,5 @@ import type { checkFileRestrictionsParams, FileAllowList } from './types.js';
3
3
  * Restricted file types and their extensions.
4
4
  */
5
5
  export declare const RESTRICTED_FILE_EXT_AND_TYPES: FileAllowList;
6
- export declare const checkFileRestrictions: ({ collection, file, req, }: checkFileRestrictionsParams) => Promise<void>;
6
+ export declare const checkFileRestrictions: ({ checkFileContents, collection, file, req, }: checkFileRestrictionsParams) => Promise<void>;
7
7
  //# sourceMappingURL=checkFileRestrictions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkFileRestrictions.d.ts","sourceRoot":"","sources":["../../src/uploads/checkFileRestrictions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAS5E;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,aAgC3C,CAAA;AAED,eAAO,MAAM,qBAAqB,+BAI/B,2BAA2B,KAAG,OAAO,CAAC,IAAI,CAyJ5C,CAAA"}
1
+ {"version":3,"file":"checkFileRestrictions.d.ts","sourceRoot":"","sources":["../../src/uploads/checkFileRestrictions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAS5E;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,aAgC3C,CAAA;AAED,eAAO,MAAM,qBAAqB,kDAK/B,2BAA2B,KAAG,OAAO,CAAC,IAAI,CA2K5C,CAAA"}
@@ -219,7 +219,7 @@ import { validateSvg } from './validateSvg.js';
219
219
  mimeType: 'application/x-command'
220
220
  }
221
221
  ];
222
- export const checkFileRestrictions = async ({ collection, file, req })=>{
222
+ export const checkFileRestrictions = async ({ checkFileContents = true, collection, file, req })=>{
223
223
  const errors = [];
224
224
  const { upload: uploadConfig } = collection;
225
225
  const configMimeTypes = uploadConfig && typeof uploadConfig === 'object' && 'mimeTypes' in uploadConfig && Array.isArray(uploadConfig.mimeTypes) ? uploadConfig.mimeTypes : [];
@@ -240,6 +240,20 @@ export const checkFileRestrictions = async ({ collection, file, req })=>{
240
240
  if (allowRestrictedFileTypes) {
241
241
  return;
242
242
  }
243
+ if (!checkFileContents) {
244
+ const isAllowed = configMimeTypes.length ? validateMimeType(file.mimetype, configMimeTypes) : !RESTRICTED_FILE_EXT_AND_TYPES.some(({ extensions, mimeType })=>mimeType === file.mimetype || extensions.some((extension)=>file.name.toLowerCase().endsWith(extension)));
245
+ if (!isAllowed) {
246
+ throw new ValidationError({
247
+ errors: [
248
+ {
249
+ message: `File type '${file.mimetype}' is not allowed.`,
250
+ path: 'file'
251
+ }
252
+ ]
253
+ });
254
+ }
255
+ return;
256
+ }
243
257
  // For temp files, use fileTypeFromFile so large files (e.g. video) are never loaded into memory
244
258
  // just for detection. For content validation (SVG safety, PDF integrity), the full buffer is
245
259
  // loaded lazily and only when the file type actually requires it.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/checkFileRestrictions.ts"],"sourcesContent":["import { fileTypeFromBuffer, fileTypeFromFile } from 'file-type'\nimport fs from 'fs/promises'\n\nimport type { checkFileRestrictionsParams, FileAllowList } from './types.js'\n\nimport { ValidationError } from '../errors/index.js'\nimport { validateMimeType } from '../utilities/validateMimeType.js'\nimport { validatePDF } from '../utilities/validatePDF.js'\nimport { detectSvgFromXml } from './detectSvgFromXml.js'\nimport { getFileTypeFallback } from './getFileTypeFallback.js'\nimport { validateSvg } from './validateSvg.js'\n\n/**\n * Restricted file types and their extensions.\n */\nexport const RESTRICTED_FILE_EXT_AND_TYPES: FileAllowList = [\n { extensions: ['exe', 'dll'], mimeType: 'application/x-msdownload' },\n { extensions: ['exe', 'com', 'app', 'action'], mimeType: 'application/x-executable' },\n { extensions: ['bat', 'cmd'], mimeType: 'application/x-msdos-program' },\n { extensions: ['exe', 'com'], mimeType: 'application/x-ms-dos-executable' },\n { extensions: ['dmg'], mimeType: 'application/x-apple-diskimage' },\n { extensions: ['deb'], mimeType: 'application/x-debian-package' },\n { extensions: ['rpm'], mimeType: 'application/x-redhat-package-manager' },\n { extensions: ['exe', 'dll'], mimeType: 'application/vnd.microsoft.portable-executable' },\n { extensions: ['msi'], mimeType: 'application/x-msi' },\n { extensions: ['jar', 'ear', 'war'], mimeType: 'application/java-archive' },\n { extensions: ['desktop'], mimeType: 'application/x-desktop' },\n { extensions: ['cpl'], mimeType: 'application/x-cpl' },\n { extensions: ['lnk'], mimeType: 'application/x-ms-shortcut' },\n { extensions: ['pkg'], mimeType: 'application/x-apple-installer' },\n { extensions: ['htm', 'html', 'shtml', 'xhtml'], mimeType: 'text/html' },\n { extensions: ['php', 'phtml'], mimeType: 'application/x-httpd-php' },\n { extensions: ['js', 'jse'], mimeType: 'text/javascript' },\n { extensions: ['jsp'], mimeType: 'application/x-jsp' },\n { extensions: ['py'], mimeType: 'text/x-python' },\n { extensions: ['rb'], mimeType: 'text/x-ruby' },\n { extensions: ['pl'], mimeType: 'text/x-perl' },\n { extensions: ['ps1', 'psc1', 'psd1', 'psh', 'psm1'], mimeType: 'application/x-powershell' },\n { extensions: ['vbe', 'vbs'], mimeType: 'application/x-vbscript' },\n { extensions: ['ws', 'wsc', 'wsf', 'wsh'], mimeType: 'application/x-ms-wsh' },\n { extensions: ['scr'], mimeType: 'application/x-msdownload' },\n { extensions: ['asp', 'aspx'], mimeType: 'application/x-asp' },\n { extensions: ['hta'], mimeType: 'application/x-hta' },\n { extensions: ['reg'], mimeType: 'application/x-registry' },\n { extensions: ['url'], mimeType: 'application/x-url' },\n { extensions: ['workflow'], mimeType: 'application/x-workflow' },\n { extensions: ['command'], mimeType: 'application/x-command' },\n]\n\nexport const checkFileRestrictions = async ({\n collection,\n file,\n req,\n}: checkFileRestrictionsParams): Promise<void> => {\n const errors: string[] = []\n const { upload: uploadConfig } = collection\n const configMimeTypes =\n uploadConfig &&\n typeof uploadConfig === 'object' &&\n 'mimeTypes' in uploadConfig &&\n Array.isArray(uploadConfig.mimeTypes)\n ? uploadConfig.mimeTypes\n : []\n\n const allowRestrictedFileTypes =\n uploadConfig && typeof uploadConfig === 'object' && 'allowRestrictedFileTypes' in uploadConfig\n ? (uploadConfig as { allowRestrictedFileTypes?: boolean }).allowRestrictedFileTypes\n : false\n\n const expectsDetectableType = (mimeType: string): boolean => {\n const textBasedTypes = ['/svg', 'image/svg+xml', 'image/x-xbitmap', 'image/x-xpixmap']\n\n if (textBasedTypes.includes(mimeType)) {\n return false\n }\n\n return (\n mimeType.startsWith('image/') ||\n mimeType.startsWith('video/') ||\n mimeType.startsWith('audio/') ||\n mimeType === 'application/pdf'\n )\n }\n\n // Skip validation if `allowRestrictedFileTypes` is true\n if (allowRestrictedFileTypes) {\n return\n }\n\n // For temp files, use fileTypeFromFile so large files (e.g. video) are never loaded into memory\n // just for detection. For content validation (SVG safety, PDF integrity), the full buffer is\n // loaded lazily and only when the file type actually requires it.\n const { tempFilePath } = file\n const isTempFile = !!tempFilePath && (!file.data || file.data.length === 0)\n\n // Lazily reads the full file — only reached for small text-based types (SVG, PDF).\n let _fileBuffer: Buffer | undefined\n const getFileBuffer = async (): Promise<Buffer> => {\n if (_fileBuffer) {\n return _fileBuffer\n }\n if (!isTempFile || !tempFilePath) {\n return (_fileBuffer = file.data)\n }\n try {\n _fileBuffer = await fs.readFile(tempFilePath)\n return _fileBuffer\n } catch {\n throw new ValidationError({\n errors: [{ message: 'Could not read uploaded file for validation.', path: 'file' }],\n })\n }\n }\n\n // Secondary mimetype check to assess file type from buffer\n if (configMimeTypes.length > 0) {\n let detected\n try {\n detected =\n isTempFile && tempFilePath\n ? await fileTypeFromFile(tempFilePath)\n : await fileTypeFromBuffer(file.data)\n } catch {\n throw new ValidationError({\n errors: [{ message: 'Could not read uploaded file for type detection.', path: 'file' }],\n })\n }\n const typeFromExtension = file.name.split('.').pop() || ''\n\n // Handle SVG files that are detected as XML due to <?xml declarations\n if (\n detected?.mime === 'application/xml' &&\n configMimeTypes.some(\n (type) => type.includes('image/') && (type.includes('svg') || type === 'image/*'),\n )\n ) {\n const isSvg = detectSvgFromXml(await getFileBuffer())\n if (isSvg) {\n detected = { ext: 'svg', mime: 'image/svg+xml' }\n }\n }\n\n if (!detected) {\n const mimeTypeFromExtension = getFileTypeFallback(file.name).mime\n const extIsValid = validateMimeType(mimeTypeFromExtension, configMimeTypes)\n\n if (!extIsValid) {\n errors.push(\n `File type ${mimeTypeFromExtension} (from extension ${typeFromExtension}) is not allowed.`,\n )\n } else {\n // SVG security check (text-based files not detectable by buffer)\n if (typeFromExtension.toLowerCase() === 'svg') {\n const isSafeSvg = validateSvg(await getFileBuffer())\n if (!isSafeSvg) {\n errors.push('SVG file contains potentially harmful content.')\n }\n }\n\n // PDF validation\n if (mimeTypeFromExtension === 'application/pdf') {\n const isValidPDF = validatePDF(await getFileBuffer())\n if (!isValidPDF) {\n errors.push('Invalid or corrupted PDF file.')\n }\n }\n }\n\n if (expectsDetectableType(mimeTypeFromExtension)) {\n req.payload.logger.warn(\n `File buffer returned no detectable MIME type for ${file.name}. Falling back to extension-based validation.`,\n )\n }\n }\n\n const passesMimeTypeCheck = detected?.mime && validateMimeType(detected.mime, configMimeTypes)\n\n if (passesMimeTypeCheck && detected?.mime === 'application/pdf') {\n const isValidPDF = validatePDF(await getFileBuffer())\n if (!isValidPDF) {\n errors.push('Invalid PDF file.')\n }\n }\n\n if (detected && !passesMimeTypeCheck) {\n errors.push(`Invalid MIME type: ${detected.mime}.`)\n }\n } else {\n const isRestricted = RESTRICTED_FILE_EXT_AND_TYPES.some((type) => {\n const hasRestrictedExt = type.extensions.some((ext) => file.name.toLowerCase().endsWith(ext))\n const hasRestrictedMime = type.mimeType === file.mimetype\n return hasRestrictedExt || hasRestrictedMime\n })\n if (isRestricted) {\n errors.push(\n `File type '${file.mimetype}' not allowed ${file.name}: Restricted file type detected -- set 'allowRestrictedFileTypes' to true to skip this check for this Collection.`,\n )\n }\n }\n\n if (errors.length > 0) {\n req.payload.logger.error(errors.join(', '))\n throw new ValidationError({\n errors: [{ message: errors.join(', '), path: 'file' }],\n })\n }\n}\n"],"names":["fileTypeFromBuffer","fileTypeFromFile","fs","ValidationError","validateMimeType","validatePDF","detectSvgFromXml","getFileTypeFallback","validateSvg","RESTRICTED_FILE_EXT_AND_TYPES","extensions","mimeType","checkFileRestrictions","collection","file","req","errors","upload","uploadConfig","configMimeTypes","Array","isArray","mimeTypes","allowRestrictedFileTypes","expectsDetectableType","textBasedTypes","includes","startsWith","tempFilePath","isTempFile","data","length","_fileBuffer","getFileBuffer","readFile","message","path","detected","typeFromExtension","name","split","pop","mime","some","type","isSvg","ext","mimeTypeFromExtension","extIsValid","push","toLowerCase","isSafeSvg","isValidPDF","payload","logger","warn","passesMimeTypeCheck","isRestricted","hasRestrictedExt","endsWith","hasRestrictedMime","mimetype","error","join"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/checkFileRestrictions.ts"],"sourcesContent":["import { fileTypeFromBuffer, fileTypeFromFile } from 'file-type'\nimport fs from 'fs/promises'\n\nimport type { checkFileRestrictionsParams, FileAllowList } from './types.js'\n\nimport { ValidationError } from '../errors/index.js'\nimport { validateMimeType } from '../utilities/validateMimeType.js'\nimport { validatePDF } from '../utilities/validatePDF.js'\nimport { detectSvgFromXml } from './detectSvgFromXml.js'\nimport { getFileTypeFallback } from './getFileTypeFallback.js'\nimport { validateSvg } from './validateSvg.js'\n\n/**\n * Restricted file types and their extensions.\n */\nexport const RESTRICTED_FILE_EXT_AND_TYPES: FileAllowList = [\n { extensions: ['exe', 'dll'], mimeType: 'application/x-msdownload' },\n { extensions: ['exe', 'com', 'app', 'action'], mimeType: 'application/x-executable' },\n { extensions: ['bat', 'cmd'], mimeType: 'application/x-msdos-program' },\n { extensions: ['exe', 'com'], mimeType: 'application/x-ms-dos-executable' },\n { extensions: ['dmg'], mimeType: 'application/x-apple-diskimage' },\n { extensions: ['deb'], mimeType: 'application/x-debian-package' },\n { extensions: ['rpm'], mimeType: 'application/x-redhat-package-manager' },\n { extensions: ['exe', 'dll'], mimeType: 'application/vnd.microsoft.portable-executable' },\n { extensions: ['msi'], mimeType: 'application/x-msi' },\n { extensions: ['jar', 'ear', 'war'], mimeType: 'application/java-archive' },\n { extensions: ['desktop'], mimeType: 'application/x-desktop' },\n { extensions: ['cpl'], mimeType: 'application/x-cpl' },\n { extensions: ['lnk'], mimeType: 'application/x-ms-shortcut' },\n { extensions: ['pkg'], mimeType: 'application/x-apple-installer' },\n { extensions: ['htm', 'html', 'shtml', 'xhtml'], mimeType: 'text/html' },\n { extensions: ['php', 'phtml'], mimeType: 'application/x-httpd-php' },\n { extensions: ['js', 'jse'], mimeType: 'text/javascript' },\n { extensions: ['jsp'], mimeType: 'application/x-jsp' },\n { extensions: ['py'], mimeType: 'text/x-python' },\n { extensions: ['rb'], mimeType: 'text/x-ruby' },\n { extensions: ['pl'], mimeType: 'text/x-perl' },\n { extensions: ['ps1', 'psc1', 'psd1', 'psh', 'psm1'], mimeType: 'application/x-powershell' },\n { extensions: ['vbe', 'vbs'], mimeType: 'application/x-vbscript' },\n { extensions: ['ws', 'wsc', 'wsf', 'wsh'], mimeType: 'application/x-ms-wsh' },\n { extensions: ['scr'], mimeType: 'application/x-msdownload' },\n { extensions: ['asp', 'aspx'], mimeType: 'application/x-asp' },\n { extensions: ['hta'], mimeType: 'application/x-hta' },\n { extensions: ['reg'], mimeType: 'application/x-registry' },\n { extensions: ['url'], mimeType: 'application/x-url' },\n { extensions: ['workflow'], mimeType: 'application/x-workflow' },\n { extensions: ['command'], mimeType: 'application/x-command' },\n]\n\nexport const checkFileRestrictions = async ({\n checkFileContents = true,\n collection,\n file,\n req,\n}: checkFileRestrictionsParams): Promise<void> => {\n const errors: string[] = []\n const { upload: uploadConfig } = collection\n const configMimeTypes =\n uploadConfig &&\n typeof uploadConfig === 'object' &&\n 'mimeTypes' in uploadConfig &&\n Array.isArray(uploadConfig.mimeTypes)\n ? uploadConfig.mimeTypes\n : []\n\n const allowRestrictedFileTypes =\n uploadConfig && typeof uploadConfig === 'object' && 'allowRestrictedFileTypes' in uploadConfig\n ? (uploadConfig as { allowRestrictedFileTypes?: boolean }).allowRestrictedFileTypes\n : false\n\n const expectsDetectableType = (mimeType: string): boolean => {\n const textBasedTypes = ['/svg', 'image/svg+xml', 'image/x-xbitmap', 'image/x-xpixmap']\n\n if (textBasedTypes.includes(mimeType)) {\n return false\n }\n\n return (\n mimeType.startsWith('image/') ||\n mimeType.startsWith('video/') ||\n mimeType.startsWith('audio/') ||\n mimeType === 'application/pdf'\n )\n }\n\n // Skip validation if `allowRestrictedFileTypes` is true\n if (allowRestrictedFileTypes) {\n return\n }\n\n if (!checkFileContents) {\n const isAllowed = configMimeTypes.length\n ? validateMimeType(file.mimetype, configMimeTypes)\n : !RESTRICTED_FILE_EXT_AND_TYPES.some(\n ({ extensions, mimeType }) =>\n mimeType === file.mimetype ||\n extensions.some((extension) => file.name.toLowerCase().endsWith(extension)),\n )\n\n if (!isAllowed) {\n throw new ValidationError({\n errors: [{ message: `File type '${file.mimetype}' is not allowed.`, path: 'file' }],\n })\n }\n\n return\n }\n\n // For temp files, use fileTypeFromFile so large files (e.g. video) are never loaded into memory\n // just for detection. For content validation (SVG safety, PDF integrity), the full buffer is\n // loaded lazily and only when the file type actually requires it.\n const { tempFilePath } = file\n const isTempFile = !!tempFilePath && (!file.data || file.data.length === 0)\n\n // Lazily reads the full file — only reached for small text-based types (SVG, PDF).\n let _fileBuffer: Buffer | undefined\n const getFileBuffer = async (): Promise<Buffer> => {\n if (_fileBuffer) {\n return _fileBuffer\n }\n if (!isTempFile || !tempFilePath) {\n return (_fileBuffer = file.data)\n }\n try {\n _fileBuffer = await fs.readFile(tempFilePath)\n return _fileBuffer\n } catch {\n throw new ValidationError({\n errors: [{ message: 'Could not read uploaded file for validation.', path: 'file' }],\n })\n }\n }\n\n // Secondary mimetype check to assess file type from buffer\n if (configMimeTypes.length > 0) {\n let detected\n try {\n detected =\n isTempFile && tempFilePath\n ? await fileTypeFromFile(tempFilePath)\n : await fileTypeFromBuffer(file.data)\n } catch {\n throw new ValidationError({\n errors: [{ message: 'Could not read uploaded file for type detection.', path: 'file' }],\n })\n }\n const typeFromExtension = file.name.split('.').pop() || ''\n\n // Handle SVG files that are detected as XML due to <?xml declarations\n if (\n detected?.mime === 'application/xml' &&\n configMimeTypes.some(\n (type) => type.includes('image/') && (type.includes('svg') || type === 'image/*'),\n )\n ) {\n const isSvg = detectSvgFromXml(await getFileBuffer())\n if (isSvg) {\n detected = { ext: 'svg', mime: 'image/svg+xml' }\n }\n }\n\n if (!detected) {\n const mimeTypeFromExtension = getFileTypeFallback(file.name).mime\n const extIsValid = validateMimeType(mimeTypeFromExtension, configMimeTypes)\n\n if (!extIsValid) {\n errors.push(\n `File type ${mimeTypeFromExtension} (from extension ${typeFromExtension}) is not allowed.`,\n )\n } else {\n // SVG security check (text-based files not detectable by buffer)\n if (typeFromExtension.toLowerCase() === 'svg') {\n const isSafeSvg = validateSvg(await getFileBuffer())\n if (!isSafeSvg) {\n errors.push('SVG file contains potentially harmful content.')\n }\n }\n\n // PDF validation\n if (mimeTypeFromExtension === 'application/pdf') {\n const isValidPDF = validatePDF(await getFileBuffer())\n if (!isValidPDF) {\n errors.push('Invalid or corrupted PDF file.')\n }\n }\n }\n\n if (expectsDetectableType(mimeTypeFromExtension)) {\n req.payload.logger.warn(\n `File buffer returned no detectable MIME type for ${file.name}. Falling back to extension-based validation.`,\n )\n }\n }\n\n const passesMimeTypeCheck = detected?.mime && validateMimeType(detected.mime, configMimeTypes)\n\n if (passesMimeTypeCheck && detected?.mime === 'application/pdf') {\n const isValidPDF = validatePDF(await getFileBuffer())\n if (!isValidPDF) {\n errors.push('Invalid PDF file.')\n }\n }\n\n if (detected && !passesMimeTypeCheck) {\n errors.push(`Invalid MIME type: ${detected.mime}.`)\n }\n } else {\n const isRestricted = RESTRICTED_FILE_EXT_AND_TYPES.some((type) => {\n const hasRestrictedExt = type.extensions.some((ext) => file.name.toLowerCase().endsWith(ext))\n const hasRestrictedMime = type.mimeType === file.mimetype\n return hasRestrictedExt || hasRestrictedMime\n })\n if (isRestricted) {\n errors.push(\n `File type '${file.mimetype}' not allowed ${file.name}: Restricted file type detected -- set 'allowRestrictedFileTypes' to true to skip this check for this Collection.`,\n )\n }\n }\n\n if (errors.length > 0) {\n req.payload.logger.error(errors.join(', '))\n throw new ValidationError({\n errors: [{ message: errors.join(', '), path: 'file' }],\n })\n }\n}\n"],"names":["fileTypeFromBuffer","fileTypeFromFile","fs","ValidationError","validateMimeType","validatePDF","detectSvgFromXml","getFileTypeFallback","validateSvg","RESTRICTED_FILE_EXT_AND_TYPES","extensions","mimeType","checkFileRestrictions","checkFileContents","collection","file","req","errors","upload","uploadConfig","configMimeTypes","Array","isArray","mimeTypes","allowRestrictedFileTypes","expectsDetectableType","textBasedTypes","includes","startsWith","isAllowed","length","mimetype","some","extension","name","toLowerCase","endsWith","message","path","tempFilePath","isTempFile","data","_fileBuffer","getFileBuffer","readFile","detected","typeFromExtension","split","pop","mime","type","isSvg","ext","mimeTypeFromExtension","extIsValid","push","isSafeSvg","isValidPDF","payload","logger","warn","passesMimeTypeCheck","isRestricted","hasRestrictedExt","hasRestrictedMime","error","join"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Endpoint } from '../../config/types.js';
2
+ import type { PayloadRequest } from '../../types/index.js';
3
+ import type { UploadInstructions, UploadInstructionsRequest } from '../types.js';
4
+ export declare const getUploadInstructions: ({ overrideAccess, req, ...upload }: {
5
+ overrideAccess?: boolean;
6
+ req: PayloadRequest;
7
+ } & UploadInstructionsRequest) => Promise<UploadInstructions>;
8
+ export declare const uploadInstructionsEndpoint: Endpoint;
9
+ /**
10
+ * Stores or removes temporary files when no adapter-specific upload instructions are available.
11
+ * PUT keeps the file until it is used in a document request.
12
+ * DELETE removes a file the client no longer needs.
13
+ */
14
+ export declare const stagedUploadEndpoints: Endpoint[];
15
+ //# sourceMappingURL=uploadInstructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadInstructions.d.ts","sourceRoot":"","sources":["../../../src/uploads/endpoints/uploadInstructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AA8BhF,eAAO,MAAM,qBAAqB,uCAI/B;IACD,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,yBAAyB,KAAG,OAAO,CAAC,kBAAkB,CA+CzD,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,QAexC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,QAAQ,EAW3C,CAAA"}
@@ -0,0 +1,84 @@
1
+ import { getAccessResults } from '../../auth/getAccessResults.js';
2
+ import { APIError, Forbidden } from '../../errors/index.js';
3
+ import { checkFileRestrictions } from '../checkFileRestrictions.js';
4
+ import { deleteStagedFile, generateStagedUploadInstructions, uploadStagedFile } from '../stagedUpload.js';
5
+ const bytesToMB = (bytes)=>bytes / 1024 / 1024;
6
+ const isUploadInstructionsRequest = (upload)=>typeof upload === 'object' && upload !== null && 'collectionSlug' in upload && typeof upload.collectionSlug === 'string' && (!('docPrefix' in upload) || upload.docPrefix === undefined || typeof upload.docPrefix === 'string') && 'filename' in upload && typeof upload.filename === 'string' && 'filesize' in upload && typeof upload.filesize === 'number' && Number.isSafeInteger(upload.filesize) && upload.filesize >= 0 && 'mimeType' in upload && typeof upload.mimeType === 'string';
7
+ export const getUploadInstructions = async ({ overrideAccess = false, req, ...upload })=>{
8
+ const collection = req.payload.collections[upload.collectionSlug];
9
+ const uploadInstructions = collection?.config?.upload?.uploadInstructions;
10
+ if (!collection?.config?.upload) {
11
+ throw new APIError(`Upload collection ${upload.collectionSlug} was not found`, 400);
12
+ }
13
+ const filesizeLimit = req.payload.config.upload.limits?.fileSize;
14
+ if (filesizeLimit && upload.filesize > filesizeLimit) {
15
+ throw new APIError(`Exceeded file size limit. Limit: ${bytesToMB(filesizeLimit).toFixed(2)}MB, got: ${bytesToMB(upload.filesize).toFixed(2)}MB`, 400);
16
+ }
17
+ await checkFileRestrictions({
18
+ checkFileContents: false,
19
+ collection: collection.config,
20
+ file: {
21
+ name: upload.filename,
22
+ data: Buffer.alloc(0),
23
+ mimetype: upload.mimeType,
24
+ size: upload.filesize
25
+ },
26
+ req
27
+ });
28
+ if (!uploadInstructions && !overrideAccess) {
29
+ // Staged uploads write to Payload before a document is saved. Require a signed-in user who
30
+ // can create or update documents in this collection.
31
+ if (!req.user) {
32
+ throw new Forbidden(req.t);
33
+ }
34
+ const collectionPermissions = (await getAccessResults({
35
+ req
36
+ })).collections?.[upload.collectionSlug];
37
+ if (!collectionPermissions?.create && !collectionPermissions?.update) {
38
+ throw new Forbidden(req.t);
39
+ }
40
+ }
41
+ return uploadInstructions ? uploadInstructions.generate({
42
+ ...upload,
43
+ overrideAccess,
44
+ req
45
+ }) : generateStagedUploadInstructions({
46
+ ...upload,
47
+ req
48
+ });
49
+ };
50
+ export const uploadInstructionsEndpoint = {
51
+ handler: async (req)=>{
52
+ if (!req.json) {
53
+ throw new APIError('Content-Type expected to be application/json', 400);
54
+ }
55
+ const upload = await req.json();
56
+ if (!isUploadInstructionsRequest(upload)) {
57
+ throw new APIError('Invalid upload instructions request', 400);
58
+ }
59
+ return Response.json(await getUploadInstructions({
60
+ ...upload,
61
+ req
62
+ }));
63
+ },
64
+ method: 'post',
65
+ path: '/upload-instructions'
66
+ };
67
+ /**
68
+ * Stores or removes temporary files when no adapter-specific upload instructions are available.
69
+ * PUT keeps the file until it is used in a document request.
70
+ * DELETE removes a file the client no longer needs.
71
+ */ export const stagedUploadEndpoints = [
72
+ {
73
+ handler: uploadStagedFile,
74
+ method: 'put',
75
+ path: '/upload-instructions/:uploadId'
76
+ },
77
+ {
78
+ handler: deleteStagedFile,
79
+ method: 'delete',
80
+ path: '/upload-instructions/:uploadId'
81
+ }
82
+ ];
83
+
84
+ //# sourceMappingURL=uploadInstructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/uploads/endpoints/uploadInstructions.ts"],"sourcesContent":["import type { Endpoint } from '../../config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { UploadInstructions, UploadInstructionsRequest } from '../types.js'\n\nimport { getAccessResults } from '../../auth/getAccessResults.js'\nimport { APIError, Forbidden } from '../../errors/index.js'\nimport { checkFileRestrictions } from '../checkFileRestrictions.js'\nimport {\n deleteStagedFile,\n generateStagedUploadInstructions,\n uploadStagedFile,\n} from '../stagedUpload.js'\n\nconst bytesToMB = (bytes: number) => bytes / 1024 / 1024\n\nconst isUploadInstructionsRequest = (upload: unknown): upload is UploadInstructionsRequest =>\n typeof upload === 'object' &&\n upload !== null &&\n 'collectionSlug' in upload &&\n typeof upload.collectionSlug === 'string' &&\n (!('docPrefix' in upload) ||\n upload.docPrefix === undefined ||\n typeof upload.docPrefix === 'string') &&\n 'filename' in upload &&\n typeof upload.filename === 'string' &&\n 'filesize' in upload &&\n typeof upload.filesize === 'number' &&\n Number.isSafeInteger(upload.filesize) &&\n upload.filesize >= 0 &&\n 'mimeType' in upload &&\n typeof upload.mimeType === 'string'\n\nexport const getUploadInstructions = async ({\n overrideAccess = false,\n req,\n ...upload\n}: {\n overrideAccess?: boolean\n req: PayloadRequest\n} & UploadInstructionsRequest): Promise<UploadInstructions> => {\n const collection = req.payload.collections[upload.collectionSlug]\n const uploadInstructions = collection?.config?.upload?.uploadInstructions\n\n if (!collection?.config?.upload) {\n throw new APIError(`Upload collection ${upload.collectionSlug} was not found`, 400)\n }\n\n const filesizeLimit = req.payload.config.upload.limits?.fileSize\n if (filesizeLimit && upload.filesize > filesizeLimit) {\n throw new APIError(\n `Exceeded file size limit. Limit: ${bytesToMB(filesizeLimit).toFixed(2)}MB, got: ${bytesToMB(upload.filesize).toFixed(2)}MB`,\n 400,\n )\n }\n\n await checkFileRestrictions({\n checkFileContents: false,\n collection: collection.config,\n file: {\n name: upload.filename,\n data: Buffer.alloc(0),\n mimetype: upload.mimeType,\n size: upload.filesize,\n },\n req,\n })\n\n if (!uploadInstructions && !overrideAccess) {\n // Staged uploads write to Payload before a document is saved. Require a signed-in user who\n // can create or update documents in this collection.\n if (!req.user) {\n throw new Forbidden(req.t)\n }\n\n const collectionPermissions = (await getAccessResults({ req })).collections?.[\n upload.collectionSlug\n ]\n\n if (!collectionPermissions?.create && !collectionPermissions?.update) {\n throw new Forbidden(req.t)\n }\n }\n\n return uploadInstructions\n ? uploadInstructions.generate({ ...upload, overrideAccess, req })\n : generateStagedUploadInstructions({ ...upload, req })\n}\n\nexport const uploadInstructionsEndpoint: Endpoint = {\n handler: async (req) => {\n if (!req.json) {\n throw new APIError('Content-Type expected to be application/json', 400)\n }\n\n const upload: unknown = await req.json()\n if (!isUploadInstructionsRequest(upload)) {\n throw new APIError('Invalid upload instructions request', 400)\n }\n\n return Response.json(await getUploadInstructions({ ...upload, req }))\n },\n method: 'post',\n path: '/upload-instructions',\n}\n\n/**\n * Stores or removes temporary files when no adapter-specific upload instructions are available.\n * PUT keeps the file until it is used in a document request.\n * DELETE removes a file the client no longer needs.\n */\nexport const stagedUploadEndpoints: Endpoint[] = [\n {\n handler: uploadStagedFile,\n method: 'put',\n path: '/upload-instructions/:uploadId',\n },\n {\n handler: deleteStagedFile,\n method: 'delete',\n path: '/upload-instructions/:uploadId',\n },\n]\n"],"names":["getAccessResults","APIError","Forbidden","checkFileRestrictions","deleteStagedFile","generateStagedUploadInstructions","uploadStagedFile","bytesToMB","bytes","isUploadInstructionsRequest","upload","collectionSlug","docPrefix","undefined","filename","filesize","Number","isSafeInteger","mimeType","getUploadInstructions","overrideAccess","req","collection","payload","collections","uploadInstructions","config","filesizeLimit","limits","fileSize","toFixed","checkFileContents","file","name","data","Buffer","alloc","mimetype","size","user","t","collectionPermissions","create","update","generate","uploadInstructionsEndpoint","handler","json","Response","method","path","stagedUploadEndpoints"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { PayloadRequest } from '../types/index.js';
2
+ import type { UploadInstructions } from './types.js';
3
+ export declare const getFileFromUploadInstructions: ({ collectionSlug, file, req, }: {
4
+ collectionSlug: string;
5
+ file: UploadInstructions['file'];
6
+ req: PayloadRequest;
7
+ }) => Promise<NonNullable<PayloadRequest['file']>>;
8
+ //# sourceMappingURL=getFileFromUploadInstructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFileFromUploadInstructions.d.ts","sourceRoot":"","sources":["../../src/uploads/getFileFromUploadInstructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKpD,eAAO,MAAM,6BAA6B,mCAIvC;IACD,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CA0E9C,CAAA"}
@@ -0,0 +1,62 @@
1
+ import { APIError } from '../errors/APIError.js';
2
+ import { getStagedFile } from './stagedUpload.js';
3
+ export const getFileFromUploadInstructions = async ({ collectionSlug, file, req })=>{
4
+ if (!file || typeof file !== 'object' || !file.uploadReference || typeof file.uploadReference !== 'object') {
5
+ throw new APIError('Invalid upload reference.', 400);
6
+ }
7
+ /**
8
+ * Handlers fetch files uploaded to a storage provider. An uploadId points to a temporary file
9
+ * already stored by Payload, so no handler is needed.
10
+ */ if ('uploadId' in file.uploadReference) {
11
+ return getStagedFile({
12
+ collectionSlug,
13
+ req,
14
+ uploadReference: file.uploadReference
15
+ });
16
+ }
17
+ const uploadConfig = req.payload.collections[collectionSlug].config.upload;
18
+ if (!uploadConfig || !uploadConfig.handlers) {
19
+ throw new APIError('uploadConfig.handlers is not present for ' + collectionSlug);
20
+ }
21
+ let response = null;
22
+ let error;
23
+ for (const handler of uploadConfig.handlers){
24
+ try {
25
+ const result = await handler(req, {
26
+ doc: null,
27
+ params: {
28
+ collection: collectionSlug,
29
+ filename: file.filename,
30
+ uploadReference: file.uploadReference
31
+ }
32
+ });
33
+ if (result) {
34
+ response = result;
35
+ break;
36
+ }
37
+ } catch (err) {
38
+ error = err;
39
+ }
40
+ }
41
+ if (!response) {
42
+ if (error) {
43
+ req.payload.logger.error(error);
44
+ }
45
+ throw new APIError('Expected response from the upload handler.');
46
+ }
47
+ if (response.status >= 300 && response.status < 400) {
48
+ const redirectUrl = response.headers.get('Location');
49
+ if (redirectUrl) {
50
+ response = await fetch(redirectUrl);
51
+ }
52
+ }
53
+ return {
54
+ name: file.filename,
55
+ data: Buffer.from(await response.arrayBuffer()),
56
+ mimetype: response.headers.get('Content-Type') || file.mimeType,
57
+ size: file.size,
58
+ uploadReference: file.uploadReference
59
+ };
60
+ };
61
+
62
+ //# sourceMappingURL=getFileFromUploadInstructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/uploads/getFileFromUploadInstructions.ts"],"sourcesContent":["import type { PayloadRequest } from '../types/index.js'\nimport type { UploadInstructions } from './types.js'\n\nimport { APIError } from '../errors/APIError.js'\nimport { getStagedFile } from './stagedUpload.js'\n\nexport const getFileFromUploadInstructions = async ({\n collectionSlug,\n file,\n req,\n}: {\n collectionSlug: string\n file: UploadInstructions['file']\n req: PayloadRequest\n}): Promise<NonNullable<PayloadRequest['file']>> => {\n if (\n !file ||\n typeof file !== 'object' ||\n !file.uploadReference ||\n typeof file.uploadReference !== 'object'\n ) {\n throw new APIError('Invalid upload reference.', 400)\n }\n\n /**\n * Handlers fetch files uploaded to a storage provider. An uploadId points to a temporary file\n * already stored by Payload, so no handler is needed.\n */\n if ('uploadId' in file.uploadReference) {\n return getStagedFile({ collectionSlug, req, uploadReference: file.uploadReference })\n }\n\n const uploadConfig = req.payload.collections[collectionSlug]!.config.upload\n\n if (!uploadConfig || !uploadConfig.handlers) {\n throw new APIError('uploadConfig.handlers is not present for ' + collectionSlug)\n }\n\n let response: null | Response = null\n let error: unknown\n\n for (const handler of uploadConfig.handlers) {\n try {\n const result = await handler(req, {\n doc: null!,\n params: {\n collection: collectionSlug,\n filename: file.filename,\n uploadReference: file.uploadReference,\n },\n })\n if (result) {\n response = result\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 *\n * @see packages/payload/src/uploads/types.ts\n */\n break\n }\n } catch (err) {\n error = err\n }\n }\n\n if (!response) {\n if (error) {\n req.payload.logger.error(error)\n }\n\n throw new APIError('Expected response from the upload handler.')\n }\n\n if (response.status >= 300 && response.status < 400) {\n const redirectUrl = response.headers.get('Location')\n if (redirectUrl) {\n response = await fetch(redirectUrl)\n }\n }\n\n return {\n name: file.filename,\n data: Buffer.from(await response.arrayBuffer()),\n mimetype: response.headers.get('Content-Type') || file.mimeType,\n size: file.size,\n uploadReference: file.uploadReference,\n }\n}\n"],"names":["APIError","getStagedFile","getFileFromUploadInstructions","collectionSlug","file","req","uploadReference","uploadConfig","payload","collections","config","upload","handlers","response","error","handler","result","doc","params","collection","filename","err","logger","status","redirectUrl","headers","get","fetch","name","data","Buffer","from","arrayBuffer","mimetype","mimeType","size"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,aAAa,QAAQ,oBAAmB;AAEjD,OAAO,MAAMC,gCAAgC,OAAO,EAClDC,cAAc,EACdC,IAAI,EACJC,GAAG,EAKJ;IACC,IACE,CAACD,QACD,OAAOA,SAAS,YAChB,CAACA,KAAKE,eAAe,IACrB,OAAOF,KAAKE,eAAe,KAAK,UAChC;QACA,MAAM,IAAIN,SAAS,6BAA6B;IAClD;IAEA;;;GAGC,GACD,IAAI,cAAcI,KAAKE,eAAe,EAAE;QACtC,OAAOL,cAAc;YAAEE;YAAgBE;YAAKC,iBAAiBF,KAAKE,eAAe;QAAC;IACpF;IAEA,MAAMC,eAAeF,IAAIG,OAAO,CAACC,WAAW,CAACN,eAAe,CAAEO,MAAM,CAACC,MAAM;IAE3E,IAAI,CAACJ,gBAAgB,CAACA,aAAaK,QAAQ,EAAE;QAC3C,MAAM,IAAIZ,SAAS,8CAA8CG;IACnE;IAEA,IAAIU,WAA4B;IAChC,IAAIC;IAEJ,KAAK,MAAMC,WAAWR,aAAaK,QAAQ,CAAE;QAC3C,IAAI;YACF,MAAMI,SAAS,MAAMD,QAAQV,KAAK;gBAChCY,KAAK;gBACLC,QAAQ;oBACNC,YAAYhB;oBACZiB,UAAUhB,KAAKgB,QAAQ;oBACvBd,iBAAiBF,KAAKE,eAAe;gBACvC;YACF;YACA,IAAIU,QAAQ;gBACVH,WAAWG;gBAOX;YACF;QACF,EAAE,OAAOK,KAAK;YACZP,QAAQO;QACV;IACF;IAEA,IAAI,CAACR,UAAU;QACb,IAAIC,OAAO;YACTT,IAAIG,OAAO,CAACc,MAAM,CAACR,KAAK,CAACA;QAC3B;QAEA,MAAM,IAAId,SAAS;IACrB;IAEA,IAAIa,SAASU,MAAM,IAAI,OAAOV,SAASU,MAAM,GAAG,KAAK;QACnD,MAAMC,cAAcX,SAASY,OAAO,CAACC,GAAG,CAAC;QACzC,IAAIF,aAAa;YACfX,WAAW,MAAMc,MAAMH;QACzB;IACF;IAEA,OAAO;QACLI,MAAMxB,KAAKgB,QAAQ;QACnBS,MAAMC,OAAOC,IAAI,CAAC,MAAMlB,SAASmB,WAAW;QAC5CC,UAAUpB,SAASY,OAAO,CAACC,GAAG,CAAC,mBAAmBtB,KAAK8B,QAAQ;QAC/DC,MAAM/B,KAAK+B,IAAI;QACf7B,iBAAiBF,KAAKE,eAAe;IACvC;AACF,EAAC"}
@@ -0,0 +1,27 @@
1
+ import type { PayloadHandler } from '../config/types.js';
2
+ import type { PayloadRequest } from '../types/index.js';
3
+ import type { File, UploadInstructions, UploadInstructionsRequest } from './types.js';
4
+ /**
5
+ * Creates a signed, one-hour URL where the client can send the file bytes. The returned file value
6
+ * is later passed to a document create or update request.
7
+ */
8
+ export declare const generateStagedUploadInstructions: ({ collectionSlug, docPrefix, filename, filesize, mimeType, req, }: {
9
+ req: PayloadRequest;
10
+ } & UploadInstructionsRequest) => Promise<UploadInstructions>;
11
+ /**
12
+ * Saves the bytes sent to a signed upload URL. The file is written as a partial file first and only
13
+ * becomes available when its size exactly matches the size in the upload ID.
14
+ */
15
+ export declare const uploadStagedFile: PayloadHandler;
16
+ /** Removes a temporary upload that the client no longer needs. */
17
+ export declare const deleteStagedFile: PayloadHandler;
18
+ /**
19
+ * Loads a completed staged file for a document request. Only the same user and collection can use
20
+ * it, and the temporary file is deleted after it is read.
21
+ */
22
+ export declare const getStagedFile: ({ collectionSlug, req, uploadReference, }: {
23
+ collectionSlug: string;
24
+ req: PayloadRequest;
25
+ uploadReference: unknown;
26
+ }) => Promise<File>;
27
+ //# sourceMappingURL=stagedUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stagedUpload.d.ts","sourceRoot":"","sources":["../../src/uploads/stagedUpload.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAOrF;;;GAGG;AACH,eAAO,MAAM,gCAAgC,sEAO1C;IAAE,GAAG,EAAE,cAAc,CAAA;CAAE,GAAG,yBAAyB,KAAG,OAAO,CAAC,kBAAkB,CAsClF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,cA0D9B,CAAA;AAED,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,EAAE,cAO9B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,8CAIvB;IACD,cAAc,EAAE,MAAM,CAAA;IACtB,GAAG,EAAE,cAAc,CAAA;IACnB,eAAe,EAAE,OAAO,CAAA;CACzB,KAAG,OAAO,CAAC,IAAI,CAyCf,CAAA"}