payload 3.0.0-beta.10 → 3.0.0-beta.12
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/auth/cookies.d.ts +16 -4
- package/dist/auth/cookies.d.ts.map +1 -1
- package/dist/auth/cookies.js +45 -14
- package/dist/auth/cookies.js.map +1 -1
- package/dist/auth/getFieldsToSign.d.ts.map +1 -1
- package/dist/auth/getFieldsToSign.js.map +1 -1
- package/dist/auth/operations/forgotPassword.js +3 -3
- package/dist/auth/operations/forgotPassword.js.map +1 -1
- package/dist/auth/operations/login.d.ts.map +1 -1
- package/dist/auth/operations/login.js +17 -1
- package/dist/auth/operations/login.js.map +1 -1
- package/dist/auth/sendVerificationEmail.d.ts +5 -6
- package/dist/auth/sendVerificationEmail.d.ts.map +1 -1
- package/dist/auth/sendVerificationEmail.js +4 -5
- package/dist/auth/sendVerificationEmail.js.map +1 -1
- package/dist/collections/config/client.d.ts +4 -1
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +3 -1
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/defaults.d.ts +1 -0
- 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/schema.d.ts.map +1 -1
- package/dist/collections/config/schema.js +2 -0
- package/dist/collections/config/schema.js.map +1 -1
- package/dist/collections/config/types.d.ts +5 -2
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/count.d.ts +13 -0
- package/dist/collections/operations/count.d.ts.map +1 -0
- package/dist/collections/operations/count.js +75 -0
- package/dist/collections/operations/count.js.map +1 -0
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +3 -4
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/local/count.d.ts +20 -0
- package/dist/collections/operations/local/count.d.ts.map +1 -0
- package/dist/collections/operations/local/count.js +19 -0
- package/dist/collections/operations/local/count.js.map +1 -0
- package/dist/collections/operations/local/index.d.ts +2 -0
- package/dist/collections/operations/local/index.d.ts.map +1 -1
- package/dist/collections/operations/local/index.js +2 -0
- package/dist/collections/operations/local/index.js.map +1 -1
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +2 -2
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/updateByID.js +1 -1
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/collections/operations/utils.d.ts +6 -0
- package/dist/collections/operations/utils.d.ts.map +1 -1
- package/dist/collections/operations/utils.js.map +1 -1
- package/dist/config/client.d.ts +2 -1
- package/dist/config/client.d.ts.map +1 -1
- package/dist/config/client.js +2 -1
- package/dist/config/client.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +1 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/types.d.ts +7 -36
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -12
- package/dist/config/types.js.map +1 -1
- package/dist/database/types.d.ts +10 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/email/consoleEmailAdapter.d.ts +3 -0
- package/dist/email/consoleEmailAdapter.d.ts.map +1 -0
- package/dist/email/consoleEmailAdapter.js +16 -0
- package/dist/email/consoleEmailAdapter.js.map +1 -0
- package/dist/email/defaults.d.ts +2 -2
- package/dist/email/defaults.d.ts.map +1 -1
- package/dist/email/defaults.js +3 -3
- package/dist/email/defaults.js.map +1 -1
- package/dist/email/getStringifiedToAddress.d.ts +3 -0
- package/dist/email/getStringifiedToAddress.d.ts.map +1 -0
- package/dist/email/getStringifiedToAddress.js +20 -0
- package/dist/email/getStringifiedToAddress.js.map +1 -0
- package/dist/email/sendEmail.d.ts +3 -2
- package/dist/email/sendEmail.d.ts.map +1 -1
- package/dist/email/sendEmail.js +8 -4
- package/dist/email/sendEmail.js.map +1 -1
- package/dist/email/types.d.ts +25 -18
- package/dist/email/types.d.ts.map +1 -1
- package/dist/email/types.js +5 -1
- package/dist/email/types.js.map +1 -1
- package/dist/exports/auth.d.ts +1 -0
- package/dist/exports/auth.d.ts.map +1 -1
- package/dist/exports/auth.js +1 -0
- package/dist/exports/auth.js.map +1 -1
- package/dist/exports/database.d.ts +1 -1
- package/dist/exports/database.d.ts.map +1 -1
- package/dist/exports/database.js.map +1 -1
- package/dist/exports/node.d.ts +3 -0
- package/dist/exports/node.d.ts.map +1 -1
- package/dist/exports/node.js +3 -1
- package/dist/exports/node.js.map +1 -1
- package/dist/exports/operations.d.ts +1 -0
- package/dist/exports/operations.d.ts.map +1 -1
- package/dist/exports/operations.js +1 -0
- package/dist/exports/operations.js.map +1 -1
- package/dist/exports/types.d.ts +1 -0
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/exports/utilities.d.ts +3 -0
- package/dist/exports/utilities.d.ts.map +1 -1
- package/dist/exports/utilities.js +3 -1
- package/dist/exports/utilities.js.map +1 -1
- package/dist/fields/config/client.d.ts +26 -1
- package/dist/fields/config/client.d.ts.map +1 -1
- package/dist/fields/config/client.js +2 -1
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/config/schema.d.ts.map +1 -1
- package/dist/fields/config/schema.js +7 -1
- package/dist/fields/config/schema.js.map +1 -1
- package/dist/fields/config/types.d.ts +12 -3
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/validations.d.ts +2 -0
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +44 -1
- package/dist/fields/validations.js.map +1 -1
- package/dist/globals/config/client.d.ts +1 -1
- package/dist/globals/config/client.d.ts.map +1 -1
- package/dist/globals/config/client.js +2 -1
- package/dist/globals/config/client.js.map +1 -1
- package/dist/globals/config/schema.d.ts.map +1 -1
- package/dist/globals/config/schema.js +1 -0
- package/dist/globals/config/schema.js.map +1 -1
- package/dist/globals/config/types.d.ts +3 -1
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/index.d.ts +13 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -13
- package/dist/index.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +3 -2
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getExternalFile.d.ts +4 -3
- package/dist/uploads/getExternalFile.d.ts.map +1 -1
- package/dist/uploads/getExternalFile.js +5 -4
- package/dist/uploads/getExternalFile.js.map +1 -1
- package/dist/uploads/getImageSize.d.ts +1 -1
- package/dist/uploads/getImageSize.d.ts.map +1 -1
- package/dist/uploads/getImageSize.js +19 -5
- package/dist/uploads/getImageSize.js.map +1 -1
- package/dist/uploads/tempFile.d.ts +7 -0
- package/dist/uploads/tempFile.d.ts.map +1 -0
- package/dist/uploads/tempFile.js +39 -0
- package/dist/uploads/tempFile.js.map +1 -0
- package/dist/uploads/types.d.ts +6 -0
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/utilities/importWithoutClientFiles.d.ts.map +1 -1
- package/dist/utilities/importWithoutClientFiles.js +8 -5
- package/dist/utilities/importWithoutClientFiles.js.map +1 -1
- package/dist/utilities/isEntityHidden.d.ts +1 -1
- package/dist/utilities/isEntityHidden.d.ts.map +1 -1
- package/dist/utilities/isEntityHidden.js.map +1 -1
- package/dist/utilities/telemetry/index.d.ts +3 -0
- package/dist/utilities/telemetry/index.d.ts.map +1 -1
- package/dist/utilities/telemetry/index.js +32 -6
- package/dist/utilities/telemetry/index.js.map +1 -1
- package/dist/versions/saveVersion.js +1 -1
- package/dist/versions/saveVersion.js.map +1 -1
- package/package.json +13 -4
- package/dist/email/build.d.ts +0 -5
- package/dist/email/build.d.ts.map +0 -1
- package/dist/email/build.js +0 -63
- package/dist/email/build.js.map +0 -1
- package/dist/email/mockHandler.d.ts +0 -5
- package/dist/email/mockHandler.d.ts.map +0 -1
- package/dist/email/mockHandler.js +0 -24
- package/dist/email/mockHandler.js.map +0 -1
- package/src/index.ts +0 -499
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ExecutionResult, GraphQLSchema, ValidationRule } from 'graphql';
|
|
2
2
|
import type { OperationArgs, Request as graphQLRequest } from 'graphql-http';
|
|
3
|
-
import type { SendMailOptions } from 'nodemailer';
|
|
4
3
|
import type pino from 'pino';
|
|
5
4
|
import type { AuthArgs } from './auth/operations/auth.js';
|
|
6
5
|
import type { Result as ForgotPasswordResult } from './auth/operations/forgotPassword.js';
|
|
@@ -13,6 +12,7 @@ import type { Result as LoginResult } from './auth/operations/login.js';
|
|
|
13
12
|
import type { Result as ResetPasswordResult } from './auth/operations/resetPassword.js';
|
|
14
13
|
import type { AuthStrategy } from './auth/types.js';
|
|
15
14
|
import type { BulkOperationResult, Collection, TypeWithID } from './collections/config/types.js';
|
|
15
|
+
import type { Options as CountOptions } from './collections/operations/local/count.js';
|
|
16
16
|
import type { Options as CreateOptions } from './collections/operations/local/create.js';
|
|
17
17
|
import type { ByIDOptions as DeleteByIDOptions, ManyOptions as DeleteManyOptions } from './collections/operations/local/delete.js';
|
|
18
18
|
import type { Options as DuplicateOptions } from './collections/operations/local/duplicate.js';
|
|
@@ -22,9 +22,9 @@ import type { Options as FindVersionByIDOptions } from './collections/operations
|
|
|
22
22
|
import type { Options as FindVersionsOptions } from './collections/operations/local/findVersions.js';
|
|
23
23
|
import type { Options as RestoreVersionOptions } from './collections/operations/local/restoreVersion.js';
|
|
24
24
|
import type { ByIDOptions as UpdateByIDOptions, ManyOptions as UpdateManyOptions } from './collections/operations/local/update.js';
|
|
25
|
-
import type {
|
|
25
|
+
import type { InitOptions, SanitizedConfig } from './config/types.js';
|
|
26
26
|
import type { BaseDatabaseAdapter, PaginatedDocs } from './database/types.js';
|
|
27
|
-
import type {
|
|
27
|
+
import type { InitializedEmailAdapter } from './email/types.js';
|
|
28
28
|
import type { TypeWithID as GlobalTypeWithID, Globals } from './globals/config/types.js';
|
|
29
29
|
import type { Options as FindGlobalOptions } from './globals/operations/local/findOne.js';
|
|
30
30
|
import type { Options as FindGlobalVersionByIDOptions } from './globals/operations/local/findVersionByID.js';
|
|
@@ -49,6 +49,14 @@ export declare class BasePayload<TGeneratedTypes extends GeneratedTypes> {
|
|
|
49
49
|
[slug: number | string | symbol]: Collection;
|
|
50
50
|
};
|
|
51
51
|
config: SanitizedConfig;
|
|
52
|
+
/**
|
|
53
|
+
* @description Performs count operation
|
|
54
|
+
* @param options
|
|
55
|
+
* @returns count of documents satisfying query
|
|
56
|
+
*/
|
|
57
|
+
count: <T extends keyof TGeneratedTypes["collections"]>(options: CountOptions<T>) => Promise<{
|
|
58
|
+
totalDocs: number;
|
|
59
|
+
}>;
|
|
52
60
|
/**
|
|
53
61
|
* @description Performs create operation
|
|
54
62
|
* @param options
|
|
@@ -58,8 +66,7 @@ export declare class BasePayload<TGeneratedTypes extends GeneratedTypes> {
|
|
|
58
66
|
db: DatabaseAdapter;
|
|
59
67
|
decrypt: typeof decrypt;
|
|
60
68
|
duplicate: <T extends keyof TGeneratedTypes["collections"]>(options: DuplicateOptions<T>) => Promise<TGeneratedTypes['collections'][T]>;
|
|
61
|
-
email:
|
|
62
|
-
emailOptions: EmailOptions;
|
|
69
|
+
email: InitializedEmailAdapter;
|
|
63
70
|
encrypt: typeof encrypt;
|
|
64
71
|
extensions: (args: {
|
|
65
72
|
args: OperationArgs<any>;
|
|
@@ -126,7 +133,7 @@ export declare class BasePayload<TGeneratedTypes extends GeneratedTypes> {
|
|
|
126
133
|
restoreVersion: <T extends keyof TGeneratedTypes["collections"]>(options: RestoreVersionOptions<T>) => Promise<TGeneratedTypes['collections'][T]>;
|
|
127
134
|
schema: GraphQLSchema;
|
|
128
135
|
secret: string;
|
|
129
|
-
sendEmail:
|
|
136
|
+
sendEmail: InitializedEmailAdapter['sendEmail'];
|
|
130
137
|
types: {
|
|
131
138
|
arrayTypes: any;
|
|
132
139
|
blockInputTypes: any;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,9 +4,7 @@ import { APIKeyAuthentication } from './auth/strategies/apiKey.js';
|
|
|
4
4
|
import { JWTAuthentication } from './auth/strategies/jwt.js';
|
|
5
5
|
import localOperations from './collections/operations/local/index.js';
|
|
6
6
|
import { validateSchema } from './config/validate.js';
|
|
7
|
-
import
|
|
8
|
-
import { defaults as emailDefaults } from './email/defaults.js';
|
|
9
|
-
import sendEmail from './email/sendEmail.js';
|
|
7
|
+
import { consoleEmailAdapter } from './email/consoleEmailAdapter.js';
|
|
10
8
|
import { fieldAffectsData } from './exports/types.js';
|
|
11
9
|
import localGlobalOperations from './globals/operations/local/index.js';
|
|
12
10
|
import flattenFields from './utilities/flattenTopLevelFields.js';
|
|
@@ -28,6 +26,14 @@ import { serverInit as serverInitTelemetry } from './utilities/telemetry/events/
|
|
|
28
26
|
collections = {};
|
|
29
27
|
config;
|
|
30
28
|
/**
|
|
29
|
+
* @description Performs count operation
|
|
30
|
+
* @param options
|
|
31
|
+
* @returns count of documents satisfying query
|
|
32
|
+
*/ count = async (options)=>{
|
|
33
|
+
const { count } = localOperations;
|
|
34
|
+
return count(this, options);
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
31
37
|
* @description Performs create operation
|
|
32
38
|
* @param options
|
|
33
39
|
* @returns created document
|
|
@@ -42,7 +48,6 @@ import { serverInit as serverInitTelemetry } from './utilities/telemetry/events/
|
|
|
42
48
|
return duplicate(this, options);
|
|
43
49
|
};
|
|
44
50
|
email;
|
|
45
|
-
emailOptions;
|
|
46
51
|
// TODO: re-implement or remove?
|
|
47
52
|
// errorHandler: ErrorHandler
|
|
48
53
|
encrypt = encrypt;
|
|
@@ -191,16 +196,23 @@ import { serverInit as serverInitTelemetry } from './utilities/telemetry/events/
|
|
|
191
196
|
if (!options.disableDBConnect && this.db.connect) {
|
|
192
197
|
await this.db.connect();
|
|
193
198
|
}
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
199
|
+
// Load email adapter
|
|
200
|
+
if (this.config.email instanceof Promise) {
|
|
201
|
+
const awaitedAdapter = await this.config.email;
|
|
202
|
+
this.email = awaitedAdapter({
|
|
203
|
+
payload: this
|
|
204
|
+
});
|
|
205
|
+
} else if (this.config.email) {
|
|
206
|
+
this.email = this.config.email({
|
|
207
|
+
payload: this
|
|
208
|
+
});
|
|
209
|
+
} else {
|
|
210
|
+
this.logger.warn(`No email adapter provided. Email will be written to console. More info at https://payloadcms.com/docs/email/overview.`);
|
|
211
|
+
this.email = consoleEmailAdapter({
|
|
212
|
+
payload: this
|
|
213
|
+
});
|
|
200
214
|
}
|
|
201
|
-
this.
|
|
202
|
-
this.email = buildEmail(this.emailOptions, this.logger);
|
|
203
|
-
this.sendEmail = sendEmail.bind(this);
|
|
215
|
+
this.sendEmail = this.email['sendEmail'];
|
|
204
216
|
serverInitTelemetry(this);
|
|
205
217
|
// 1. loop over collections, if collection has auth strategy, initialize and push to array
|
|
206
218
|
let jwtStrategyEnabled = false;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { ExecutionResult, GraphQLSchema, ValidationRule } from 'graphql'\nimport type { OperationArgs, Request as graphQLRequest } from 'graphql-http'\nimport type { SendMailOptions } from 'nodemailer'\nimport type pino from 'pino'\n\nimport crypto from 'crypto'\n\nimport type { AuthArgs } from './auth/operations/auth.js'\nimport type { Result as ForgotPasswordResult } from './auth/operations/forgotPassword.js'\nimport type { Options as ForgotPasswordOptions } from './auth/operations/local/forgotPassword.js'\nimport type { Options as LoginOptions } from './auth/operations/local/login.js'\nimport type { Options as ResetPasswordOptions } from './auth/operations/local/resetPassword.js'\nimport type { Options as UnlockOptions } from './auth/operations/local/unlock.js'\nimport type { Options as VerifyEmailOptions } from './auth/operations/local/verifyEmail.js'\nimport type { Result as LoginResult } from './auth/operations/login.js'\nimport type { Result as ResetPasswordResult } from './auth/operations/resetPassword.js'\nimport type { AuthStrategy } from './auth/types.js'\nimport type { BulkOperationResult, Collection, TypeWithID } from './collections/config/types.js'\nimport type { Options as CreateOptions } from './collections/operations/local/create.js'\nimport type {\n ByIDOptions as DeleteByIDOptions,\n ManyOptions as DeleteManyOptions,\n Options as DeleteOptions,\n} from './collections/operations/local/delete.js'\nimport type { Options as DuplicateOptions } from './collections/operations/local/duplicate.js'\nimport type { Options as FindOptions } from './collections/operations/local/find.js'\nimport type { Options as FindByIDOptions } from './collections/operations/local/findByID.js'\nimport type { Options as FindVersionByIDOptions } from './collections/operations/local/findVersionByID.js'\nimport type { Options as FindVersionsOptions } from './collections/operations/local/findVersions.js'\nimport type { Options as RestoreVersionOptions } from './collections/operations/local/restoreVersion.js'\nimport type {\n ByIDOptions as UpdateByIDOptions,\n ManyOptions as UpdateManyOptions,\n Options as UpdateOptions,\n} from './collections/operations/local/update.js'\nimport type { EmailOptions, InitOptions, SanitizedConfig } from './config/types.js'\nimport type { BaseDatabaseAdapter, PaginatedDocs } from './database/types.js'\nimport type { BuildEmailResult } from './email/types.js'\nimport type { TypeWithID as GlobalTypeWithID, Globals } from './globals/config/types.js'\nimport type { Options as FindGlobalOptions } from './globals/operations/local/findOne.js'\nimport type { Options as FindGlobalVersionByIDOptions } from './globals/operations/local/findVersionByID.js'\nimport type { Options as FindGlobalVersionsOptions } from './globals/operations/local/findVersions.js'\nimport type { Options as RestoreGlobalVersionOptions } from './globals/operations/local/restoreVersion.js'\nimport type { Options as UpdateGlobalOptions } from './globals/operations/local/update.js'\nimport type { TypeWithVersion } from './versions/types.js'\n\nimport { decrypt, encrypt } from './auth/crypto.js'\nimport { APIKeyAuthentication } from './auth/strategies/apiKey.js'\nimport { JWTAuthentication } from './auth/strategies/jwt.js'\nimport localOperations from './collections/operations/local/index.js'\nimport { validateSchema } from './config/validate.js'\nimport buildEmail from './email/build.js'\nimport { defaults as emailDefaults } from './email/defaults.js'\nimport sendEmail from './email/sendEmail.js'\nimport { fieldAffectsData } from './exports/types.js'\nimport localGlobalOperations from './globals/operations/local/index.js'\nimport flattenFields from './utilities/flattenTopLevelFields.js'\nimport Logger from './utilities/logger.js'\nimport { serverInit as serverInitTelemetry } from './utilities/telemetry/events/serverInit.js'\n\n/**\n * @description Payload\n */\nexport class BasePayload<TGeneratedTypes extends GeneratedTypes> {\n /**\n * @description Authorization and Authentication using headers and cookies to run auth user strategies\n * @returns cookies: Map<string, string>\n * @returns permissions: Permissions\n * @returns user: User\n */\n auth = async (options: AuthArgs) => {\n const { auth } = localOperations.auth\n return auth(this, options)\n }\n\n authStrategies: AuthStrategy[]\n\n collections: {\n [slug: number | string | symbol]: Collection\n } = {}\n\n config: SanitizedConfig\n\n /**\n * @description Performs create operation\n * @param options\n * @returns created document\n */\n create = async <T extends keyof TGeneratedTypes['collections']>(\n options: CreateOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { create } = localOperations\n return create<T>(this, options)\n }\n\n db: DatabaseAdapter\n\n decrypt = decrypt\n\n duplicate = async <T extends keyof TGeneratedTypes['collections']>(\n options: DuplicateOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { duplicate } = localOperations\n return duplicate<T>(this, options)\n }\n\n email: BuildEmailResult\n\n emailOptions: EmailOptions\n\n // TODO: re-implement or remove?\n // errorHandler: ErrorHandler\n\n encrypt = encrypt\n\n extensions: (args: {\n args: OperationArgs<any>\n req: graphQLRequest<unknown, unknown>\n result: ExecutionResult\n }) => Promise<any>\n\n /**\n * @description Find documents with criteria\n * @param options\n * @returns documents satisfying query\n */\n find = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindOptions<T>,\n ): Promise<PaginatedDocs<TGeneratedTypes['collections'][T]>> => {\n const { find } = localOperations\n return find<T>(this, options)\n }\n\n /**\n * @description Find document by ID\n * @param options\n * @returns document with specified ID\n */\n findByID = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { findByID } = localOperations\n return findByID<T>(this, options)\n }\n\n findGlobal = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { findOne } = localGlobalOperations\n return findOne<T>(this, options)\n }\n\n /**\n * @description Find global version by ID\n * @param options\n * @returns global version with specified ID\n */\n findGlobalVersionByID = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalVersionByIDOptions<T>,\n ): Promise<TypeWithVersion<TGeneratedTypes['globals'][T]>> => {\n const { findVersionByID } = localGlobalOperations\n return findVersionByID<T>(this, options)\n }\n\n /**\n * @description Find global versions with criteria\n * @param options\n * @returns versions satisfying query\n */\n findGlobalVersions = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalVersionsOptions<T>,\n ): Promise<PaginatedDocs<TypeWithVersion<TGeneratedTypes['globals'][T]>>> => {\n const { findVersions } = localGlobalOperations\n return findVersions<T>(this, options)\n }\n\n /**\n * @description Find version by ID\n * @param options\n * @returns version with specified ID\n */\n findVersionByID = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindVersionByIDOptions<T>,\n ): Promise<TypeWithVersion<TGeneratedTypes['collections'][T]>> => {\n const { findVersionByID } = localOperations\n return findVersionByID<T>(this, options)\n }\n\n /**\n * @description Find versions with criteria\n * @param options\n * @returns versions satisfying query\n */\n findVersions = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindVersionsOptions<T>,\n ): Promise<PaginatedDocs<TypeWithVersion<TGeneratedTypes['collections'][T]>>> => {\n const { findVersions } = localOperations\n return findVersions<T>(this, options)\n }\n\n forgotPassword = async <T extends keyof TGeneratedTypes['collections']>(\n options: ForgotPasswordOptions<T>,\n ): Promise<ForgotPasswordResult> => {\n const { forgotPassword } = localOperations.auth\n return forgotPassword<T>(this, options)\n }\n\n getAPIURL = (): string => `${this.config.serverURL}${this.config.routes.api}`\n\n getAdminURL = (): string => `${this.config.serverURL}${this.config.routes.admin}`\n\n globals: Globals\n\n logger: pino.Logger\n\n login = async <T extends keyof TGeneratedTypes['collections']>(\n options: LoginOptions<T>,\n ): Promise<LoginResult & { user: TGeneratedTypes['collections'][T] }> => {\n const { login } = localOperations.auth\n return login<T>(this, options)\n }\n\n resetPassword = async <T extends keyof TGeneratedTypes['collections']>(\n options: ResetPasswordOptions<T>,\n ): Promise<ResetPasswordResult> => {\n const { resetPassword } = localOperations.auth\n return resetPassword<T>(this, options)\n }\n\n /**\n * @description Restore global version by ID\n * @param options\n * @returns version with specified ID\n */\n restoreGlobalVersion = async <T extends keyof TGeneratedTypes['globals']>(\n options: RestoreGlobalVersionOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { restoreVersion } = localGlobalOperations\n return restoreVersion<T>(this, options)\n }\n\n /**\n * @description Restore version by ID\n * @param options\n * @returns version with specified ID\n */\n restoreVersion = async <T extends keyof TGeneratedTypes['collections']>(\n options: RestoreVersionOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { restoreVersion } = localOperations\n return restoreVersion<T>(this, options)\n }\n\n schema: GraphQLSchema\n\n secret: string\n\n sendEmail: (message: SendMailOptions) => Promise<unknown>\n\n types: {\n arrayTypes: any\n blockInputTypes: any\n blockTypes: any\n fallbackLocaleInputType?: any\n groupTypes: any\n localeInputType?: any\n tabTypes: any\n }\n\n unlock = async <T extends keyof TGeneratedTypes['collections']>(\n options: UnlockOptions<T>,\n ): Promise<boolean> => {\n const { unlock } = localOperations.auth\n return unlock(this, options)\n }\n\n updateGlobal = async <T extends keyof TGeneratedTypes['globals']>(\n options: UpdateGlobalOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { update } = localGlobalOperations\n return update<T>(this, options)\n }\n\n validationRules: (args: OperationArgs<any>) => ValidationRule[]\n\n verifyEmail = async <T extends keyof TGeneratedTypes['collections']>(\n options: VerifyEmailOptions<T>,\n ): Promise<boolean> => {\n const { verifyEmail } = localOperations.auth\n return verifyEmail(this, options)\n }\n\n versions: {\n [slug: string]: any // TODO: Type this\n } = {}\n\n /**\n * @description delete one or more documents\n * @param options\n * @returns Updated document(s)\n */\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]>\n\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteManyOptions<T>,\n ): Promise<BulkOperationResult<T>>\n\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteOptions<T>,\n ): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {\n const { deleteLocal } = localOperations\n return deleteLocal<T>(this, options)\n }\n\n /**\n * @description Initializes Payload\n * @param options\n */\n async init(options: InitOptions): Promise<Payload> {\n if (!options?.config) {\n throw new Error('Error: the payload config is required to initialize payload.')\n }\n\n this.logger = Logger('payload', options.loggerOptions, options.loggerDestination)\n\n this.config = await options.config\n\n if (process.env.NODE_ENV !== 'production') {\n validateSchema(this.config, this.logger)\n }\n\n if (!this.config.secret) {\n throw new Error('Error: missing secret key. A secret key is needed to secure Payload.')\n }\n\n this.secret = crypto.createHash('sha256').update(this.config.secret).digest('hex').slice(0, 32)\n\n this.globals = {\n config: this.config.globals,\n }\n\n this.config.collections.forEach((collection) => {\n const customID = flattenFields(collection.fields).find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n let customIDType\n\n if (customID?.type === 'number' || customID?.type === 'text') customIDType = customID.type\n\n this.collections[collection.slug] = {\n config: collection,\n customIDType,\n }\n })\n\n this.db = this.config.db.init({ payload: this })\n this.db.payload = this\n\n if (this.db?.init) {\n await this.db.init()\n }\n\n if (!options.disableDBConnect && this.db.connect) {\n await this.db.connect()\n }\n\n // Configure email service\n const emailOptions = options.email ? { ...options.email } : this.config.email\n if (options.email && this.config.email) {\n this.logger.warn(\n 'Email options provided in both init options and config. Using init options.',\n )\n }\n\n this.emailOptions = emailOptions ?? emailDefaults\n this.email = buildEmail(this.emailOptions, this.logger)\n this.sendEmail = sendEmail.bind(this)\n\n serverInitTelemetry(this)\n\n // 1. loop over collections, if collection has auth strategy, initialize and push to array\n let jwtStrategyEnabled = false\n this.authStrategies = this.config.collections.reduce((authStrategies, collection) => {\n if (collection?.auth) {\n if (collection.auth.strategies.length > 0) {\n authStrategies.push(...collection.auth.strategies)\n }\n\n // 2. if api key enabled, push api key strategy into the array\n if (collection.auth?.useAPIKey) {\n authStrategies.push({\n name: `${collection.slug}-api-key`,\n authenticate: APIKeyAuthentication(collection),\n })\n }\n\n // 3. if localStrategy flag is true\n if (!collection.auth.disableLocalStrategy && !jwtStrategyEnabled) {\n jwtStrategyEnabled = true\n }\n }\n\n return authStrategies\n }, [] as AuthStrategy[])\n\n // 4. if enabled, push jwt strategy into authStrategies last\n if (jwtStrategyEnabled) {\n this.authStrategies.push({\n name: 'local-jwt',\n authenticate: JWTAuthentication,\n })\n }\n\n if (!options.disableOnInit) {\n if (typeof options.onInit === 'function') await options.onInit(this)\n if (typeof this.config.onInit === 'function') await this.config.onInit(this)\n }\n\n return this\n }\n\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateManyOptions<T>,\n ): Promise<BulkOperationResult<T>>\n\n /**\n * @description Update one or more documents\n * @param options\n * @returns Updated document(s)\n */\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]>\n\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateOptions<T>,\n ): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {\n const { update } = localOperations\n return update<T>(this, options)\n }\n}\n\nconst initialized = new BasePayload()\n\nexport default initialized\n\nlet cached = global._payload\n\nif (!cached) {\n // eslint-disable-next-line no-multi-assign\n cached = global._payload = { payload: null, promise: null }\n}\n\nexport const getPayload = async (options: InitOptions): Promise<BasePayload<GeneratedTypes>> => {\n if (!options?.config) {\n throw new Error('Error: the payload config is required for getPayload to work.')\n }\n\n if (cached.payload) {\n return cached.payload\n }\n\n if (!cached.promise) {\n cached.promise = new BasePayload<GeneratedTypes>().init(options)\n }\n\n try {\n cached.payload = await cached.promise\n } catch (e) {\n cached.promise = null\n throw e\n }\n\n return cached.payload\n}\n\ntype GeneratedTypes = {\n collections: {\n [slug: number | string | symbol]: TypeWithID & Record<string, unknown>\n }\n globals: {\n [slug: number | string | symbol]: GlobalTypeWithID & Record<string, unknown>\n }\n locale: null | string\n user: TypeWithID & Record<string, unknown> & { collection: string }\n}\n\ntype Payload = BasePayload<GeneratedTypes>\n\ninterface RequestContext {\n [key: string]: unknown\n}\n\ntype DatabaseAdapter = BaseDatabaseAdapter\n\nexport type { DatabaseAdapter, GeneratedTypes, Payload, RequestContext }\n"],"names":["crypto","decrypt","encrypt","APIKeyAuthentication","JWTAuthentication","localOperations","validateSchema","buildEmail","defaults","emailDefaults","sendEmail","fieldAffectsData","localGlobalOperations","flattenFields","Logger","serverInit","serverInitTelemetry","BasePayload","auth","options","authStrategies","collections","config","create","db","duplicate","email","emailOptions","extensions","find","findByID","findGlobal","findOne","findGlobalVersionByID","findVersionByID","findGlobalVersions","findVersions","forgotPassword","getAPIURL","serverURL","routes","api","getAdminURL","admin","globals","logger","login","resetPassword","restoreGlobalVersion","restoreVersion","schema","secret","types","unlock","updateGlobal","update","validationRules","verifyEmail","versions","delete","deleteLocal","init","Error","loggerOptions","loggerDestination","process","env","NODE_ENV","createHash","digest","slice","forEach","collection","customID","fields","field","name","customIDType","type","slug","payload","disableDBConnect","connect","warn","bind","jwtStrategyEnabled","reduce","strategies","length","push","useAPIKey","authenticate","disableLocalStrategy","disableOnInit","onInit","initialized","cached","global","_payload","promise","getPayload","e"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAKA,OAAOA,YAAY,SAAQ;AAyC3B,SAASC,OAAO,EAAEC,OAAO,QAAQ,mBAAkB;AACnD,SAASC,oBAAoB,QAAQ,8BAA6B;AAClE,SAASC,iBAAiB,QAAQ,2BAA0B;AAC5D,OAAOC,qBAAqB,0CAAyC;AACrE,SAASC,cAAc,QAAQ,uBAAsB;AACrD,OAAOC,gBAAgB,mBAAkB;AACzC,SAASC,YAAYC,aAAa,QAAQ,sBAAqB;AAC/D,OAAOC,eAAe,uBAAsB;AAC5C,SAASC,gBAAgB,QAAQ,qBAAoB;AACrD,OAAOC,2BAA2B,sCAAqC;AACvE,OAAOC,mBAAmB,uCAAsC;AAChE,OAAOC,YAAY,wBAAuB;AAC1C,SAASC,cAAcC,mBAAmB,QAAQ,6CAA4C;AAE9F;;CAEC,GACD,OAAO,MAAMC;IACX;;;;;GAKC,GACDC,OAAO,OAAOC;QACZ,MAAM,EAAED,IAAI,EAAE,GAAGb,gBAAgBa,IAAI;QACrC,OAAOA,KAAK,IAAI,EAAEC;IACpB,EAAC;IAEDC,eAA8B;IAE9BC,cAEI,CAAC,EAAC;IAENC,OAAuB;IAEvB;;;;GAIC,GACDC,SAAS,OACPJ;QAEA,MAAM,EAAEI,MAAM,EAAE,GAAGlB;QACnB,OAAOkB,OAAU,IAAI,EAAEJ;IACzB,EAAC;IAEDK,GAAmB;IAEnBvB,UAAUA,QAAO;IAEjBwB,YAAY,OACVN;QAEA,MAAM,EAAEM,SAAS,EAAE,GAAGpB;QACtB,OAAOoB,UAAa,IAAI,EAAEN;IAC5B,EAAC;IAEDO,MAAuB;IAEvBC,aAA0B;IAE1B,gCAAgC;IAChC,6BAA6B;IAE7BzB,UAAUA,QAAO;IAEjB0B,WAIkB;IAElB;;;;GAIC,GACDC,OAAO,OACLV;QAEA,MAAM,EAAEU,IAAI,EAAE,GAAGxB;QACjB,OAAOwB,KAAQ,IAAI,EAAEV;IACvB,EAAC;IAED;;;;GAIC,GACDW,WAAW,OACTX;QAEA,MAAM,EAAEW,QAAQ,EAAE,GAAGzB;QACrB,OAAOyB,SAAY,IAAI,EAAEX;IAC3B,EAAC;IAEDY,aAAa,OACXZ;QAEA,MAAM,EAAEa,OAAO,EAAE,GAAGpB;QACpB,OAAOoB,QAAW,IAAI,EAAEb;IAC1B,EAAC;IAED;;;;GAIC,GACDc,wBAAwB,OACtBd;QAEA,MAAM,EAAEe,eAAe,EAAE,GAAGtB;QAC5B,OAAOsB,gBAAmB,IAAI,EAAEf;IAClC,EAAC;IAED;;;;GAIC,GACDgB,qBAAqB,OACnBhB;QAEA,MAAM,EAAEiB,YAAY,EAAE,GAAGxB;QACzB,OAAOwB,aAAgB,IAAI,EAAEjB;IAC/B,EAAC;IAED;;;;GAIC,GACDe,kBAAkB,OAChBf;QAEA,MAAM,EAAEe,eAAe,EAAE,GAAG7B;QAC5B,OAAO6B,gBAAmB,IAAI,EAAEf;IAClC,EAAC;IAED;;;;GAIC,GACDiB,eAAe,OACbjB;QAEA,MAAM,EAAEiB,YAAY,EAAE,GAAG/B;QACzB,OAAO+B,aAAgB,IAAI,EAAEjB;IAC/B,EAAC;IAEDkB,iBAAiB,OACflB;QAEA,MAAM,EAAEkB,cAAc,EAAE,GAAGhC,gBAAgBa,IAAI;QAC/C,OAAOmB,eAAkB,IAAI,EAAElB;IACjC,EAAC;IAEDmB,YAAY,IAAc,CAAC,EAAE,IAAI,CAAChB,MAAM,CAACiB,SAAS,CAAC,EAAE,IAAI,CAACjB,MAAM,CAACkB,MAAM,CAACC,GAAG,CAAC,CAAC,CAAA;IAE7EC,cAAc,IAAc,CAAC,EAAE,IAAI,CAACpB,MAAM,CAACiB,SAAS,CAAC,EAAE,IAAI,CAACjB,MAAM,CAACkB,MAAM,CAACG,KAAK,CAAC,CAAC,CAAA;IAEjFC,QAAgB;IAEhBC,OAAmB;IAEnBC,QAAQ,OACN3B;QAEA,MAAM,EAAE2B,KAAK,EAAE,GAAGzC,gBAAgBa,IAAI;QACtC,OAAO4B,MAAS,IAAI,EAAE3B;IACxB,EAAC;IAED4B,gBAAgB,OACd5B;QAEA,MAAM,EAAE4B,aAAa,EAAE,GAAG1C,gBAAgBa,IAAI;QAC9C,OAAO6B,cAAiB,IAAI,EAAE5B;IAChC,EAAC;IAED;;;;GAIC,GACD6B,uBAAuB,OACrB7B;QAEA,MAAM,EAAE8B,cAAc,EAAE,GAAGrC;QAC3B,OAAOqC,eAAkB,IAAI,EAAE9B;IACjC,EAAC;IAED;;;;GAIC,GACD8B,iBAAiB,OACf9B;QAEA,MAAM,EAAE8B,cAAc,EAAE,GAAG5C;QAC3B,OAAO4C,eAAkB,IAAI,EAAE9B;IACjC,EAAC;IAED+B,OAAqB;IAErBC,OAAc;IAEdzC,UAAyD;IAEzD0C,MAQC;IAEDC,SAAS,OACPlC;QAEA,MAAM,EAAEkC,MAAM,EAAE,GAAGhD,gBAAgBa,IAAI;QACvC,OAAOmC,OAAO,IAAI,EAAElC;IACtB,EAAC;IAEDmC,eAAe,OACbnC;QAEA,MAAM,EAAEoC,MAAM,EAAE,GAAG3C;QACnB,OAAO2C,OAAU,IAAI,EAAEpC;IACzB,EAAC;IAEDqC,gBAA+D;IAE/DC,cAAc,OACZtC;QAEA,MAAM,EAAEsC,WAAW,EAAE,GAAGpD,gBAAgBa,IAAI;QAC5C,OAAOuC,YAAY,IAAI,EAAEtC;IAC3B,EAAC;IAEDuC,WAEI,CAAC,EAAC;IAeNC,OACExC,OAAyB,EAC4C;QACrE,MAAM,EAAEyC,WAAW,EAAE,GAAGvD;QACxB,OAAOuD,YAAe,IAAI,EAAEzC;IAC9B;IAEA;;;GAGC,GACD,MAAM0C,KAAK1C,OAAoB,EAAoB;QACjD,IAAI,CAACA,SAASG,QAAQ;YACpB,MAAM,IAAIwC,MAAM;QAClB;QAEA,IAAI,CAACjB,MAAM,GAAG/B,OAAO,WAAWK,QAAQ4C,aAAa,EAAE5C,QAAQ6C,iBAAiB;QAEhF,IAAI,CAAC1C,MAAM,GAAG,MAAMH,QAAQG,MAAM;QAElC,IAAI2C,QAAQC,GAAG,CAACC,QAAQ,KAAK,cAAc;YACzC7D,eAAe,IAAI,CAACgB,MAAM,EAAE,IAAI,CAACuB,MAAM;QACzC;QAEA,IAAI,CAAC,IAAI,CAACvB,MAAM,CAAC6B,MAAM,EAAE;YACvB,MAAM,IAAIW,MAAM;QAClB;QAEA,IAAI,CAACX,MAAM,GAAGnD,OAAOoE,UAAU,CAAC,UAAUb,MAAM,CAAC,IAAI,CAACjC,MAAM,CAAC6B,MAAM,EAAEkB,MAAM,CAAC,OAAOC,KAAK,CAAC,GAAG;QAE5F,IAAI,CAAC1B,OAAO,GAAG;YACbtB,QAAQ,IAAI,CAACA,MAAM,CAACsB,OAAO;QAC7B;QAEA,IAAI,CAACtB,MAAM,CAACD,WAAW,CAACkD,OAAO,CAAC,CAACC;YAC/B,MAAMC,WAAW5D,cAAc2D,WAAWE,MAAM,EAAE7C,IAAI,CACpD,CAAC8C,QAAUhE,iBAAiBgE,UAAUA,MAAMC,IAAI,KAAK;YAGvD,IAAIC;YAEJ,IAAIJ,UAAUK,SAAS,YAAYL,UAAUK,SAAS,QAAQD,eAAeJ,SAASK,IAAI;YAE1F,IAAI,CAACzD,WAAW,CAACmD,WAAWO,IAAI,CAAC,GAAG;gBAClCzD,QAAQkD;gBACRK;YACF;QACF;QAEA,IAAI,CAACrD,EAAE,GAAG,IAAI,CAACF,MAAM,CAACE,EAAE,CAACqC,IAAI,CAAC;YAAEmB,SAAS,IAAI;QAAC;QAC9C,IAAI,CAACxD,EAAE,CAACwD,OAAO,GAAG,IAAI;QAEtB,IAAI,IAAI,CAACxD,EAAE,EAAEqC,MAAM;YACjB,MAAM,IAAI,CAACrC,EAAE,CAACqC,IAAI;QACpB;QAEA,IAAI,CAAC1C,QAAQ8D,gBAAgB,IAAI,IAAI,CAACzD,EAAE,CAAC0D,OAAO,EAAE;YAChD,MAAM,IAAI,CAAC1D,EAAE,CAAC0D,OAAO;QACvB;QAEA,0BAA0B;QAC1B,MAAMvD,eAAeR,QAAQO,KAAK,GAAG;YAAE,GAAGP,QAAQO,KAAK;QAAC,IAAI,IAAI,CAACJ,MAAM,CAACI,KAAK;QAC7E,IAAIP,QAAQO,KAAK,IAAI,IAAI,CAACJ,MAAM,CAACI,KAAK,EAAE;YACtC,IAAI,CAACmB,MAAM,CAACsC,IAAI,CACd;QAEJ;QAEA,IAAI,CAACxD,YAAY,GAAGA,gBAAgBlB;QACpC,IAAI,CAACiB,KAAK,GAAGnB,WAAW,IAAI,CAACoB,YAAY,EAAE,IAAI,CAACkB,MAAM;QACtD,IAAI,CAACnC,SAAS,GAAGA,UAAU0E,IAAI,CAAC,IAAI;QAEpCpE,oBAAoB,IAAI;QAExB,0FAA0F;QAC1F,IAAIqE,qBAAqB;QACzB,IAAI,CAACjE,cAAc,GAAG,IAAI,CAACE,MAAM,CAACD,WAAW,CAACiE,MAAM,CAAC,CAAClE,gBAAgBoD;YACpE,IAAIA,YAAYtD,MAAM;gBACpB,IAAIsD,WAAWtD,IAAI,CAACqE,UAAU,CAACC,MAAM,GAAG,GAAG;oBACzCpE,eAAeqE,IAAI,IAAIjB,WAAWtD,IAAI,CAACqE,UAAU;gBACnD;gBAEA,8DAA8D;gBAC9D,IAAIf,WAAWtD,IAAI,EAAEwE,WAAW;oBAC9BtE,eAAeqE,IAAI,CAAC;wBAClBb,MAAM,CAAC,EAAEJ,WAAWO,IAAI,CAAC,QAAQ,CAAC;wBAClCY,cAAcxF,qBAAqBqE;oBACrC;gBACF;gBAEA,mCAAmC;gBACnC,IAAI,CAACA,WAAWtD,IAAI,CAAC0E,oBAAoB,IAAI,CAACP,oBAAoB;oBAChEA,qBAAqB;gBACvB;YACF;YAEA,OAAOjE;QACT,GAAG,EAAE;QAEL,4DAA4D;QAC5D,IAAIiE,oBAAoB;YACtB,IAAI,CAACjE,cAAc,CAACqE,IAAI,CAAC;gBACvBb,MAAM;gBACNe,cAAcvF;YAChB;QACF;QAEA,IAAI,CAACe,QAAQ0E,aAAa,EAAE;YAC1B,IAAI,OAAO1E,QAAQ2E,MAAM,KAAK,YAAY,MAAM3E,QAAQ2E,MAAM,CAAC,IAAI;YACnE,IAAI,OAAO,IAAI,CAACxE,MAAM,CAACwE,MAAM,KAAK,YAAY,MAAM,IAAI,CAACxE,MAAM,CAACwE,MAAM,CAAC,IAAI;QAC7E;QAEA,OAAO,IAAI;IACb;IAeAvC,OACEpC,OAAyB,EAC4C;QACrE,MAAM,EAAEoC,MAAM,EAAE,GAAGlD;QACnB,OAAOkD,OAAU,IAAI,EAAEpC;IACzB;AACF;AAEA,MAAM4E,cAAc,IAAI9E;AAExB,eAAe8E,YAAW;AAE1B,IAAIC,SAASC,OAAOC,QAAQ;AAE5B,IAAI,CAACF,QAAQ;IACX,2CAA2C;IAC3CA,SAASC,OAAOC,QAAQ,GAAG;QAAElB,SAAS;QAAMmB,SAAS;IAAK;AAC5D;AAEA,OAAO,MAAMC,aAAa,OAAOjF;IAC/B,IAAI,CAACA,SAASG,QAAQ;QACpB,MAAM,IAAIwC,MAAM;IAClB;IAEA,IAAIkC,OAAOhB,OAAO,EAAE;QAClB,OAAOgB,OAAOhB,OAAO;IACvB;IAEA,IAAI,CAACgB,OAAOG,OAAO,EAAE;QACnBH,OAAOG,OAAO,GAAG,IAAIlF,cAA8B4C,IAAI,CAAC1C;IAC1D;IAEA,IAAI;QACF6E,OAAOhB,OAAO,GAAG,MAAMgB,OAAOG,OAAO;IACvC,EAAE,OAAOE,GAAG;QACVL,OAAOG,OAAO,GAAG;QACjB,MAAME;IACR;IAEA,OAAOL,OAAOhB,OAAO;AACvB,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { ExecutionResult, GraphQLSchema, ValidationRule } from 'graphql'\nimport type { OperationArgs, Request as graphQLRequest } from 'graphql-http'\nimport type pino from 'pino'\n\nimport crypto from 'crypto'\n\nimport type { AuthArgs } from './auth/operations/auth.js'\nimport type { Result as ForgotPasswordResult } from './auth/operations/forgotPassword.js'\nimport type { Options as ForgotPasswordOptions } from './auth/operations/local/forgotPassword.js'\nimport type { Options as LoginOptions } from './auth/operations/local/login.js'\nimport type { Options as ResetPasswordOptions } from './auth/operations/local/resetPassword.js'\nimport type { Options as UnlockOptions } from './auth/operations/local/unlock.js'\nimport type { Options as VerifyEmailOptions } from './auth/operations/local/verifyEmail.js'\nimport type { Result as LoginResult } from './auth/operations/login.js'\nimport type { Result as ResetPasswordResult } from './auth/operations/resetPassword.js'\nimport type { AuthStrategy } from './auth/types.js'\nimport type { BulkOperationResult, Collection, TypeWithID } from './collections/config/types.js'\nimport type { Options as CountOptions } from './collections/operations/local/count.js'\nimport type { Options as CreateOptions } from './collections/operations/local/create.js'\nimport type {\n ByIDOptions as DeleteByIDOptions,\n ManyOptions as DeleteManyOptions,\n Options as DeleteOptions,\n} from './collections/operations/local/delete.js'\nimport type { Options as DuplicateOptions } from './collections/operations/local/duplicate.js'\nimport type { Options as FindOptions } from './collections/operations/local/find.js'\nimport type { Options as FindByIDOptions } from './collections/operations/local/findByID.js'\nimport type { Options as FindVersionByIDOptions } from './collections/operations/local/findVersionByID.js'\nimport type { Options as FindVersionsOptions } from './collections/operations/local/findVersions.js'\nimport type { Options as RestoreVersionOptions } from './collections/operations/local/restoreVersion.js'\nimport type {\n ByIDOptions as UpdateByIDOptions,\n ManyOptions as UpdateManyOptions,\n Options as UpdateOptions,\n} from './collections/operations/local/update.js'\nimport type { InitOptions, SanitizedConfig } from './config/types.js'\nimport type { BaseDatabaseAdapter, PaginatedDocs } from './database/types.js'\nimport type { InitializedEmailAdapter } from './email/types.js'\nimport type { TypeWithID as GlobalTypeWithID, Globals } from './globals/config/types.js'\nimport type { Options as FindGlobalOptions } from './globals/operations/local/findOne.js'\nimport type { Options as FindGlobalVersionByIDOptions } from './globals/operations/local/findVersionByID.js'\nimport type { Options as FindGlobalVersionsOptions } from './globals/operations/local/findVersions.js'\nimport type { Options as RestoreGlobalVersionOptions } from './globals/operations/local/restoreVersion.js'\nimport type { Options as UpdateGlobalOptions } from './globals/operations/local/update.js'\nimport type { TypeWithVersion } from './versions/types.js'\n\nimport { decrypt, encrypt } from './auth/crypto.js'\nimport { APIKeyAuthentication } from './auth/strategies/apiKey.js'\nimport { JWTAuthentication } from './auth/strategies/jwt.js'\nimport localOperations from './collections/operations/local/index.js'\nimport { validateSchema } from './config/validate.js'\nimport { consoleEmailAdapter } from './email/consoleEmailAdapter.js'\nimport { fieldAffectsData } from './exports/types.js'\nimport localGlobalOperations from './globals/operations/local/index.js'\nimport flattenFields from './utilities/flattenTopLevelFields.js'\nimport Logger from './utilities/logger.js'\nimport { serverInit as serverInitTelemetry } from './utilities/telemetry/events/serverInit.js'\n\n/**\n * @description Payload\n */\nexport class BasePayload<TGeneratedTypes extends GeneratedTypes> {\n /**\n * @description Authorization and Authentication using headers and cookies to run auth user strategies\n * @returns cookies: Map<string, string>\n * @returns permissions: Permissions\n * @returns user: User\n */\n auth = async (options: AuthArgs) => {\n const { auth } = localOperations.auth\n return auth(this, options)\n }\n\n authStrategies: AuthStrategy[]\n\n collections: {\n [slug: number | string | symbol]: Collection\n } = {}\n\n config: SanitizedConfig\n\n /**\n * @description Performs count operation\n * @param options\n * @returns count of documents satisfying query\n */\n count = async <T extends keyof TGeneratedTypes['collections']>(\n options: CountOptions<T>,\n ): Promise<{ totalDocs: number }> => {\n const { count } = localOperations\n return count(this, options)\n }\n\n /**\n * @description Performs create operation\n * @param options\n * @returns created document\n */\n create = async <T extends keyof TGeneratedTypes['collections']>(\n options: CreateOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { create } = localOperations\n return create<T>(this, options)\n }\n db: DatabaseAdapter\n\n decrypt = decrypt\n\n duplicate = async <T extends keyof TGeneratedTypes['collections']>(\n options: DuplicateOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { duplicate } = localOperations\n return duplicate<T>(this, options)\n }\n\n email: InitializedEmailAdapter\n\n // TODO: re-implement or remove?\n // errorHandler: ErrorHandler\n\n encrypt = encrypt\n\n extensions: (args: {\n args: OperationArgs<any>\n req: graphQLRequest<unknown, unknown>\n result: ExecutionResult\n }) => Promise<any>\n\n /**\n * @description Find documents with criteria\n * @param options\n * @returns documents satisfying query\n */\n find = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindOptions<T>,\n ): Promise<PaginatedDocs<TGeneratedTypes['collections'][T]>> => {\n const { find } = localOperations\n return find<T>(this, options)\n }\n\n /**\n * @description Find document by ID\n * @param options\n * @returns document with specified ID\n */\n findByID = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { findByID } = localOperations\n return findByID<T>(this, options)\n }\n\n findGlobal = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { findOne } = localGlobalOperations\n return findOne<T>(this, options)\n }\n\n /**\n * @description Find global version by ID\n * @param options\n * @returns global version with specified ID\n */\n findGlobalVersionByID = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalVersionByIDOptions<T>,\n ): Promise<TypeWithVersion<TGeneratedTypes['globals'][T]>> => {\n const { findVersionByID } = localGlobalOperations\n return findVersionByID<T>(this, options)\n }\n\n /**\n * @description Find global versions with criteria\n * @param options\n * @returns versions satisfying query\n */\n findGlobalVersions = async <T extends keyof TGeneratedTypes['globals']>(\n options: FindGlobalVersionsOptions<T>,\n ): Promise<PaginatedDocs<TypeWithVersion<TGeneratedTypes['globals'][T]>>> => {\n const { findVersions } = localGlobalOperations\n return findVersions<T>(this, options)\n }\n\n /**\n * @description Find version by ID\n * @param options\n * @returns version with specified ID\n */\n findVersionByID = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindVersionByIDOptions<T>,\n ): Promise<TypeWithVersion<TGeneratedTypes['collections'][T]>> => {\n const { findVersionByID } = localOperations\n return findVersionByID<T>(this, options)\n }\n\n /**\n * @description Find versions with criteria\n * @param options\n * @returns versions satisfying query\n */\n findVersions = async <T extends keyof TGeneratedTypes['collections']>(\n options: FindVersionsOptions<T>,\n ): Promise<PaginatedDocs<TypeWithVersion<TGeneratedTypes['collections'][T]>>> => {\n const { findVersions } = localOperations\n return findVersions<T>(this, options)\n }\n\n forgotPassword = async <T extends keyof TGeneratedTypes['collections']>(\n options: ForgotPasswordOptions<T>,\n ): Promise<ForgotPasswordResult> => {\n const { forgotPassword } = localOperations.auth\n return forgotPassword<T>(this, options)\n }\n\n getAPIURL = (): string => `${this.config.serverURL}${this.config.routes.api}`\n\n getAdminURL = (): string => `${this.config.serverURL}${this.config.routes.admin}`\n\n globals: Globals\n\n logger: pino.Logger\n\n login = async <T extends keyof TGeneratedTypes['collections']>(\n options: LoginOptions<T>,\n ): Promise<LoginResult & { user: TGeneratedTypes['collections'][T] }> => {\n const { login } = localOperations.auth\n return login<T>(this, options)\n }\n\n resetPassword = async <T extends keyof TGeneratedTypes['collections']>(\n options: ResetPasswordOptions<T>,\n ): Promise<ResetPasswordResult> => {\n const { resetPassword } = localOperations.auth\n return resetPassword<T>(this, options)\n }\n\n /**\n * @description Restore global version by ID\n * @param options\n * @returns version with specified ID\n */\n restoreGlobalVersion = async <T extends keyof TGeneratedTypes['globals']>(\n options: RestoreGlobalVersionOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { restoreVersion } = localGlobalOperations\n return restoreVersion<T>(this, options)\n }\n\n /**\n * @description Restore version by ID\n * @param options\n * @returns version with specified ID\n */\n restoreVersion = async <T extends keyof TGeneratedTypes['collections']>(\n options: RestoreVersionOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]> => {\n const { restoreVersion } = localOperations\n return restoreVersion<T>(this, options)\n }\n\n schema: GraphQLSchema\n\n secret: string\n\n sendEmail: InitializedEmailAdapter['sendEmail']\n\n types: {\n arrayTypes: any\n blockInputTypes: any\n blockTypes: any\n fallbackLocaleInputType?: any\n groupTypes: any\n localeInputType?: any\n tabTypes: any\n }\n\n unlock = async <T extends keyof TGeneratedTypes['collections']>(\n options: UnlockOptions<T>,\n ): Promise<boolean> => {\n const { unlock } = localOperations.auth\n return unlock(this, options)\n }\n\n updateGlobal = async <T extends keyof TGeneratedTypes['globals']>(\n options: UpdateGlobalOptions<T>,\n ): Promise<TGeneratedTypes['globals'][T]> => {\n const { update } = localGlobalOperations\n return update<T>(this, options)\n }\n\n validationRules: (args: OperationArgs<any>) => ValidationRule[]\n\n verifyEmail = async <T extends keyof TGeneratedTypes['collections']>(\n options: VerifyEmailOptions<T>,\n ): Promise<boolean> => {\n const { verifyEmail } = localOperations.auth\n return verifyEmail(this, options)\n }\n\n versions: {\n [slug: string]: any // TODO: Type this\n } = {}\n\n /**\n * @description delete one or more documents\n * @param options\n * @returns Updated document(s)\n */\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]>\n\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteManyOptions<T>,\n ): Promise<BulkOperationResult<T>>\n\n delete<T extends keyof TGeneratedTypes['collections']>(\n options: DeleteOptions<T>,\n ): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {\n const { deleteLocal } = localOperations\n return deleteLocal<T>(this, options)\n }\n\n /**\n * @description Initializes Payload\n * @param options\n */\n async init(options: InitOptions): Promise<Payload> {\n if (!options?.config) {\n throw new Error('Error: the payload config is required to initialize payload.')\n }\n\n this.logger = Logger('payload', options.loggerOptions, options.loggerDestination)\n\n this.config = await options.config\n\n if (process.env.NODE_ENV !== 'production') {\n validateSchema(this.config, this.logger)\n }\n\n if (!this.config.secret) {\n throw new Error('Error: missing secret key. A secret key is needed to secure Payload.')\n }\n\n this.secret = crypto.createHash('sha256').update(this.config.secret).digest('hex').slice(0, 32)\n\n this.globals = {\n config: this.config.globals,\n }\n\n this.config.collections.forEach((collection) => {\n const customID = flattenFields(collection.fields).find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n let customIDType\n\n if (customID?.type === 'number' || customID?.type === 'text') customIDType = customID.type\n\n this.collections[collection.slug] = {\n config: collection,\n customIDType,\n }\n })\n\n this.db = this.config.db.init({ payload: this })\n this.db.payload = this\n\n if (this.db?.init) {\n await this.db.init()\n }\n\n if (!options.disableDBConnect && this.db.connect) {\n await this.db.connect()\n }\n\n // Load email adapter\n if (this.config.email instanceof Promise) {\n const awaitedAdapter = await this.config.email\n this.email = awaitedAdapter({ payload: this })\n } else if (this.config.email) {\n this.email = this.config.email({ payload: this })\n } else {\n this.logger.warn(\n `No email adapter provided. Email will be written to console. More info at https://payloadcms.com/docs/email/overview.`,\n )\n\n this.email = consoleEmailAdapter({ payload: this })\n }\n\n this.sendEmail = this.email['sendEmail']\n\n serverInitTelemetry(this)\n\n // 1. loop over collections, if collection has auth strategy, initialize and push to array\n let jwtStrategyEnabled = false\n this.authStrategies = this.config.collections.reduce((authStrategies, collection) => {\n if (collection?.auth) {\n if (collection.auth.strategies.length > 0) {\n authStrategies.push(...collection.auth.strategies)\n }\n\n // 2. if api key enabled, push api key strategy into the array\n if (collection.auth?.useAPIKey) {\n authStrategies.push({\n name: `${collection.slug}-api-key`,\n authenticate: APIKeyAuthentication(collection),\n })\n }\n\n // 3. if localStrategy flag is true\n if (!collection.auth.disableLocalStrategy && !jwtStrategyEnabled) {\n jwtStrategyEnabled = true\n }\n }\n\n return authStrategies\n }, [] as AuthStrategy[])\n\n // 4. if enabled, push jwt strategy into authStrategies last\n if (jwtStrategyEnabled) {\n this.authStrategies.push({\n name: 'local-jwt',\n authenticate: JWTAuthentication,\n })\n }\n\n if (!options.disableOnInit) {\n if (typeof options.onInit === 'function') await options.onInit(this)\n if (typeof this.config.onInit === 'function') await this.config.onInit(this)\n }\n\n return this\n }\n\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateManyOptions<T>,\n ): Promise<BulkOperationResult<T>>\n\n /**\n * @description Update one or more documents\n * @param options\n * @returns Updated document(s)\n */\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateByIDOptions<T>,\n ): Promise<TGeneratedTypes['collections'][T]>\n\n update<T extends keyof TGeneratedTypes['collections']>(\n options: UpdateOptions<T>,\n ): Promise<BulkOperationResult<T> | TGeneratedTypes['collections'][T]> {\n const { update } = localOperations\n return update<T>(this, options)\n }\n}\n\nconst initialized = new BasePayload()\n\nexport default initialized\n\nlet cached = global._payload\n\nif (!cached) {\n // eslint-disable-next-line no-multi-assign\n cached = global._payload = { payload: null, promise: null }\n}\n\nexport const getPayload = async (options: InitOptions): Promise<BasePayload<GeneratedTypes>> => {\n if (!options?.config) {\n throw new Error('Error: the payload config is required for getPayload to work.')\n }\n\n if (cached.payload) {\n return cached.payload\n }\n\n if (!cached.promise) {\n cached.promise = new BasePayload<GeneratedTypes>().init(options)\n }\n\n try {\n cached.payload = await cached.promise\n } catch (e) {\n cached.promise = null\n throw e\n }\n\n return cached.payload\n}\n\ntype GeneratedTypes = {\n collections: {\n [slug: number | string | symbol]: TypeWithID & Record<string, unknown>\n }\n globals: {\n [slug: number | string | symbol]: GlobalTypeWithID & Record<string, unknown>\n }\n locale: null | string\n user: TypeWithID & Record<string, unknown> & { collection: string }\n}\n\ntype Payload = BasePayload<GeneratedTypes>\n\ninterface RequestContext {\n [key: string]: unknown\n}\n\ntype DatabaseAdapter = BaseDatabaseAdapter\n\nexport type { DatabaseAdapter, GeneratedTypes, Payload, RequestContext }\n"],"names":["crypto","decrypt","encrypt","APIKeyAuthentication","JWTAuthentication","localOperations","validateSchema","consoleEmailAdapter","fieldAffectsData","localGlobalOperations","flattenFields","Logger","serverInit","serverInitTelemetry","BasePayload","auth","options","authStrategies","collections","config","count","create","db","duplicate","email","extensions","find","findByID","findGlobal","findOne","findGlobalVersionByID","findVersionByID","findGlobalVersions","findVersions","forgotPassword","getAPIURL","serverURL","routes","api","getAdminURL","admin","globals","logger","login","resetPassword","restoreGlobalVersion","restoreVersion","schema","secret","sendEmail","types","unlock","updateGlobal","update","validationRules","verifyEmail","versions","delete","deleteLocal","init","Error","loggerOptions","loggerDestination","process","env","NODE_ENV","createHash","digest","slice","forEach","collection","customID","fields","field","name","customIDType","type","slug","payload","disableDBConnect","connect","Promise","awaitedAdapter","warn","jwtStrategyEnabled","reduce","strategies","length","push","useAPIKey","authenticate","disableLocalStrategy","disableOnInit","onInit","initialized","cached","global","_payload","promise","getPayload","e"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAY,UAAU,EAAmB,MAAM,YAAY,CAAA;AAYvE,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AAEF,eAAO,MAAM,gBAAgB,4GAM1B,KAAK,CAAC,CAAC,KAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAY,UAAU,EAAmB,MAAM,YAAY,CAAA;AAYvE,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AAEF,eAAO,MAAM,gBAAgB,4GAM1B,KAAK,CAAC,CAAC,KAAG,OAAO,CAAC,CA+NpB,CAAA"}
|
|
@@ -35,7 +35,8 @@ export const generateFileData = async ({ collection: { config: collectionConfig
|
|
|
35
35
|
} else if (filename && url) {
|
|
36
36
|
file = await getExternalFile({
|
|
37
37
|
data: data,
|
|
38
|
-
req
|
|
38
|
+
req,
|
|
39
|
+
uploadConfig: collectionConfig.upload
|
|
39
40
|
});
|
|
40
41
|
overwriteExistingFiles = true;
|
|
41
42
|
}
|
|
@@ -88,7 +89,7 @@ export const generateFileData = async ({ collection: { config: collectionConfig
|
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
if (fileSupportsResize || isImage(file.mimetype)) {
|
|
91
|
-
dimensions = getImageSize(file);
|
|
92
|
+
dimensions = await getImageSize(file);
|
|
92
93
|
fileData.width = dimensions.width;
|
|
93
94
|
fileData.height = dimensions.height;
|
|
94
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport fileType from 'file-type'\nconst { fromBuffer } = fileType\nimport fs from 'fs'\nimport mkdirp from 'mkdirp'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize } from './types.js'\n\nimport { FileUploadError, MissingFile } from '../errors/index.js'\nimport canResizeImage from './canResizeImage.js'\nimport cropImage from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport getSafeFileName from './getSafeFilename.js'\nimport resizeAndTransformImageSizes from './imageResizer.js'\nimport isImage from './isImage.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = req.query['uploadEdits'] || {}\n\n const { disableLocalStorage, formatOptions, imageSizes, resizeOptions, staticDir, trimOptions } =\n collectionConfig.upload\n\n const staticPath = staticDir\n\n if (!file && uploadEdits && data) {\n const { filename, url } = data as FileData\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({ data: data as FileData, req })\n overwriteExistingFiles = true\n }\n } catch (err) {\n throw new FileUploadError(req.t)\n }\n }\n\n if (!file) {\n if (throwOnMissingFile) throw new MissingFile(req.t)\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n mkdirp.sync(staticPath)\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimated = file.mimetype === 'image/gif' || file.mimetype === 'image/webp'\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimated) sharpOptions.animated = true\n\n if (fileHasAdjustments && sharp) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = await fromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()\n } else {\n ext = ''\n }\n }\n\n // Adust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') mime = 'image/svg+xml'\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({ cropData, dimensions, file, sharp })\n\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n fileData.width = info.width\n fileData.height = info.height\n fileData.filesize = info.size\n\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (Array.isArray(imageSizes) && fileSupportsResize && sharp) {\n req.payloadUploadSizes = {}\n const { sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n })\n\n fileData.sizes = sizeData\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n console.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n"],"names":["fileType","fromBuffer","fs","mkdirp","sanitize","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","generateFileData","collection","config","collectionConfig","data","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","query","disableLocalStorage","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","staticPath","filename","url","startsWith","filePath","response","err","t","sync","newData","filesToSave","fileData","fileIsAnimated","mimetype","cropData","crop","undefined","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","includes","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","push","buffer","path","promises","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","console","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport fileType from 'file-type'\nconst { fromBuffer } = fileType\nimport fs from 'fs'\nimport mkdirp from 'mkdirp'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize } from './types.js'\n\nimport { FileUploadError, MissingFile } from '../errors/index.js'\nimport canResizeImage from './canResizeImage.js'\nimport cropImage from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport getSafeFileName from './getSafeFilename.js'\nimport resizeAndTransformImageSizes from './imageResizer.js'\nimport isImage from './isImage.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = req.query['uploadEdits'] || {}\n\n const { disableLocalStorage, formatOptions, imageSizes, resizeOptions, staticDir, trimOptions } =\n collectionConfig.upload\n\n const staticPath = staticDir\n\n if (!file && uploadEdits && data) {\n const { filename, url } = data as FileData\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({\n data: data as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err) {\n throw new FileUploadError(req.t)\n }\n }\n\n if (!file) {\n if (throwOnMissingFile) throw new MissingFile(req.t)\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n mkdirp.sync(staticPath)\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimated = file.mimetype === 'image/gif' || file.mimetype === 'image/webp'\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimated) sharpOptions.animated = true\n\n if (fileHasAdjustments && sharp) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = await fromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()\n } else {\n ext = ''\n }\n }\n\n // Adust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') mime = 'image/svg+xml'\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({ cropData, dimensions, file, sharp })\n\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n fileData.width = info.width\n fileData.height = info.height\n fileData.filesize = info.size\n\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (Array.isArray(imageSizes) && fileSupportsResize && sharp) {\n req.payloadUploadSizes = {}\n const { sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n })\n\n fileData.sizes = sizeData\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n console.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n"],"names":["fileType","fromBuffer","fs","mkdirp","sanitize","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","generateFileData","collection","config","collectionConfig","data","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","query","disableLocalStorage","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","staticPath","filename","url","startsWith","filePath","response","uploadConfig","err","t","sync","newData","filesToSave","fileData","fileIsAnimated","mimetype","cropData","crop","undefined","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","includes","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","push","buffer","path","promises","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","console","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type { PayloadRequest } from '../types/index.
|
|
2
|
-
import type { File, FileData } from './types.js';
|
|
1
|
+
import type { PayloadRequest } from '../types/index.js';
|
|
2
|
+
import type { File, FileData, UploadConfig } from './types.js';
|
|
3
3
|
type Args = {
|
|
4
4
|
data: FileData;
|
|
5
5
|
req: PayloadRequest;
|
|
6
|
+
uploadConfig: UploadConfig;
|
|
6
7
|
};
|
|
7
|
-
export declare const getExternalFile: ({ data, req }: Args) => Promise<File>;
|
|
8
|
+
export declare const getExternalFile: ({ data, req, uploadConfig }: Args) => Promise<File>;
|
|
8
9
|
export {};
|
|
9
10
|
//# sourceMappingURL=getExternalFile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getExternalFile.d.ts","sourceRoot":"","sources":["../../src/uploads/getExternalFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"getExternalFile.d.ts","sourceRoot":"","sources":["../../src/uploads/getExternalFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AACD,eAAO,MAAM,eAAe,gCAAuC,IAAI,KAAG,QAAQ,IAAI,CA8BrF,CAAA"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { APIError } from '../errors/index.js';
|
|
2
|
-
export const getExternalFile = async ({ data, req })=>{
|
|
2
|
+
export const getExternalFile = async ({ data, req, uploadConfig })=>{
|
|
3
3
|
const baseUrl = req.origin || `${req.protocol}://${req.host}`;
|
|
4
4
|
const { filename, url } = data;
|
|
5
5
|
if (typeof url === 'string') {
|
|
6
6
|
const fileURL = `${baseUrl}${url}`;
|
|
7
|
+
const headers = uploadConfig.externalFileHeaderFilter ? uploadConfig.externalFileHeaderFilter(Object.fromEntries(new Headers(req.headers))) : {
|
|
8
|
+
cookie: req.headers.get('cookie')
|
|
9
|
+
};
|
|
7
10
|
const res = await fetch(fileURL, {
|
|
8
11
|
credentials: 'include',
|
|
9
|
-
headers
|
|
10
|
-
...req.headers
|
|
11
|
-
},
|
|
12
|
+
headers,
|
|
12
13
|
method: 'GET'
|
|
13
14
|
});
|
|
14
15
|
if (!res.ok) throw new APIError(`Failed to fetch file from ${fileURL}`, res.status);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/getExternalFile.ts"],"sourcesContent":["import type { PayloadRequest } from '../types/index.
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/getExternalFile.ts"],"sourcesContent":["import type { PayloadRequest } from '../types/index.js'\nimport type { File, FileData, UploadConfig } from './types.js'\n\nimport { APIError } from '../errors/index.js'\n\ntype Args = {\n data: FileData\n req: PayloadRequest\n uploadConfig: UploadConfig\n}\nexport const getExternalFile = async ({ data, req, uploadConfig }: Args): Promise<File> => {\n const baseUrl = req.origin || `${req.protocol}://${req.host}`\n const { filename, url } = data\n\n if (typeof url === 'string') {\n const fileURL = `${baseUrl}${url}`\n\n const headers = uploadConfig.externalFileHeaderFilter\n ? uploadConfig.externalFileHeaderFilter(Object.fromEntries(new Headers(req.headers)))\n : { cookie: req.headers.get('cookie') }\n\n const res = await fetch(fileURL, {\n credentials: 'include',\n headers,\n method: 'GET',\n })\n\n if (!res.ok) throw new APIError(`Failed to fetch file from ${fileURL}`, res.status)\n\n const data = await res.arrayBuffer()\n\n return {\n name: filename,\n data: Buffer.from(data),\n mimetype: res.headers.get('content-type') || undefined,\n size: Number(res.headers.get('content-length')) || 0,\n }\n }\n\n throw new APIError('Invalid file url', 400)\n}\n"],"names":["APIError","getExternalFile","data","req","uploadConfig","baseUrl","origin","protocol","host","filename","url","fileURL","headers","externalFileHeaderFilter","Object","fromEntries","Headers","cookie","get","res","fetch","credentials","method","ok","status","arrayBuffer","name","Buffer","from","mimetype","undefined","size","Number"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAGA,SAASA,QAAQ,QAAQ,qBAAoB;AAO7C,OAAO,MAAMC,kBAAkB,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAEC,YAAY,EAAQ;IACrE,MAAMC,UAAUF,IAAIG,MAAM,IAAI,CAAC,EAAEH,IAAII,QAAQ,CAAC,GAAG,EAAEJ,IAAIK,IAAI,CAAC,CAAC;IAC7D,MAAM,EAAEC,QAAQ,EAAEC,GAAG,EAAE,GAAGR;IAE1B,IAAI,OAAOQ,QAAQ,UAAU;QAC3B,MAAMC,UAAU,CAAC,EAAEN,QAAQ,EAAEK,IAAI,CAAC;QAElC,MAAME,UAAUR,aAAaS,wBAAwB,GACjDT,aAAaS,wBAAwB,CAACC,OAAOC,WAAW,CAAC,IAAIC,QAAQb,IAAIS,OAAO,MAChF;YAAEK,QAAQd,IAAIS,OAAO,CAACM,GAAG,CAAC;QAAU;QAExC,MAAMC,MAAM,MAAMC,MAAMT,SAAS;YAC/BU,aAAa;YACbT;YACAU,QAAQ;QACV;QAEA,IAAI,CAACH,IAAII,EAAE,EAAE,MAAM,IAAIvB,SAAS,CAAC,0BAA0B,EAAEW,QAAQ,CAAC,EAAEQ,IAAIK,MAAM;QAElF,MAAMtB,OAAO,MAAMiB,IAAIM,WAAW;QAElC,OAAO;YACLC,MAAMjB;YACNP,MAAMyB,OAAOC,IAAI,CAAC1B;YAClB2B,UAAUV,IAAIP,OAAO,CAACM,GAAG,CAAC,mBAAmBY;YAC7CC,MAAMC,OAAOb,IAAIP,OAAO,CAACM,GAAG,CAAC,sBAAsB;QACrD;IACF;IAEA,MAAM,IAAIlB,SAAS,oBAAoB;AACzC,EAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { PayloadRequest } from '../types/index.js';
|
|
2
2
|
import type { ProbedImageSize } from './types.js';
|
|
3
|
-
export declare function getImageSize(file: PayloadRequest['file']): ProbedImageSize
|
|
3
|
+
export declare function getImageSize(file: PayloadRequest['file']): Promise<ProbedImageSize>;
|
|
4
4
|
//# sourceMappingURL=getImageSize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getImageSize.d.ts","sourceRoot":"","sources":["../../src/uploads/getImageSize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getImageSize.d.ts","sourceRoot":"","sources":["../../src/uploads/getImageSize.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAOjD,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAmBzF"}
|
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import sizeOfImport from 'image-size';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
import { temporaryFileTask } from './tempFile.js';
|
|
5
|
+
const { imageSize } = sizeOfImport;
|
|
6
|
+
const imageSizePromise = promisify(imageSize);
|
|
7
|
+
export async function getImageSize(file) {
|
|
4
8
|
if (file.tempFilePath) {
|
|
5
|
-
|
|
6
|
-
return probeImageSize.sync(data);
|
|
9
|
+
return imageSizePromise(file.tempFilePath);
|
|
7
10
|
}
|
|
8
|
-
|
|
11
|
+
// Tiff file do not support buffers or streams, so we must write to file first
|
|
12
|
+
// then retrieve dimensions. https://github.com/image-size/image-size/issues/103
|
|
13
|
+
if (file.mimetype === 'image/tiff') {
|
|
14
|
+
const dimensions = await temporaryFileTask(async (filepath)=>{
|
|
15
|
+
fs.writeFileSync(filepath, file.data);
|
|
16
|
+
return imageSizePromise(filepath);
|
|
17
|
+
}, {
|
|
18
|
+
extension: 'tiff'
|
|
19
|
+
});
|
|
20
|
+
return dimensions;
|
|
21
|
+
}
|
|
22
|
+
return imageSize(file.data);
|
|
9
23
|
}
|
|
10
24
|
|
|
11
25
|
//# sourceMappingURL=getImageSize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/getImageSize.ts"],"sourcesContent":["import fs from 'fs'\nimport
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/getImageSize.ts"],"sourcesContent":["import fs from 'fs'\nimport sizeOfImport from 'image-size'\nimport { promisify } from 'util'\n\nimport type { PayloadRequest } from '../types/index.js'\nimport type { ProbedImageSize } from './types.js'\n\nimport { temporaryFileTask } from './tempFile.js'\n\nconst { imageSize } = sizeOfImport\nconst imageSizePromise = promisify(imageSize)\n\nexport async function getImageSize(file: PayloadRequest['file']): Promise<ProbedImageSize> {\n if (file.tempFilePath) {\n return imageSizePromise(file.tempFilePath)\n }\n\n // Tiff file do not support buffers or streams, so we must write to file first\n // then retrieve dimensions. https://github.com/image-size/image-size/issues/103\n if (file.mimetype === 'image/tiff') {\n const dimensions = await temporaryFileTask(\n async (filepath: string) => {\n fs.writeFileSync(filepath, file.data)\n return imageSizePromise(filepath)\n },\n { extension: 'tiff' },\n )\n return dimensions\n }\n\n return imageSize(file.data)\n}\n"],"names":["fs","sizeOfImport","promisify","temporaryFileTask","imageSize","imageSizePromise","getImageSize","file","tempFilePath","mimetype","dimensions","filepath","writeFileSync","data","extension"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,OAAOC,kBAAkB,aAAY;AACrC,SAASC,SAAS,QAAQ,OAAM;AAKhC,SAASC,iBAAiB,QAAQ,gBAAe;AAEjD,MAAM,EAAEC,SAAS,EAAE,GAAGH;AACtB,MAAMI,mBAAmBH,UAAUE;AAEnC,OAAO,eAAeE,aAAaC,IAA4B;IAC7D,IAAIA,KAAKC,YAAY,EAAE;QACrB,OAAOH,iBAAiBE,KAAKC,YAAY;IAC3C;IAEA,8EAA8E;IAC9E,gFAAgF;IAChF,IAAID,KAAKE,QAAQ,KAAK,cAAc;QAClC,MAAMC,aAAa,MAAMP,kBACvB,OAAOQ;YACLX,GAAGY,aAAa,CAACD,UAAUJ,KAAKM,IAAI;YACpC,OAAOR,iBAAiBM;QAC1B,GACA;YAAEG,WAAW;QAAO;QAEtB,OAAOJ;IACT;IAEA,OAAON,UAAUG,KAAKM,IAAI;AAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tempFile.d.ts","sourceRoot":"","sources":["../../src/uploads/tempFile.ts"],"names":[],"mappings":"AAaA,KAAK,OAAO,GAAG;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,iBAAiB,4BAA6B,OAAO,iBAGjE,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { promises as fsPromises } from 'fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { v4 as uuid } from 'uuid';
|
|
5
|
+
async function runTask(temporaryPath, callback) {
|
|
6
|
+
try {
|
|
7
|
+
return await callback(temporaryPath);
|
|
8
|
+
} finally{
|
|
9
|
+
await fsPromises.rm(temporaryPath, {
|
|
10
|
+
force: true,
|
|
11
|
+
maxRetries: 2,
|
|
12
|
+
recursive: true
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export const temporaryFileTask = async (callback, options = {})=>{
|
|
17
|
+
const filePath = await temporaryFile(options);
|
|
18
|
+
return runTask(filePath, callback);
|
|
19
|
+
};
|
|
20
|
+
async function temporaryFile(options) {
|
|
21
|
+
if (options.name) {
|
|
22
|
+
if (options.extension !== undefined && options.extension !== null) {
|
|
23
|
+
throw new Error('The `name` and `extension` options are mutually exclusive');
|
|
24
|
+
}
|
|
25
|
+
return path.join(await temporaryDirectory(), options.name);
|
|
26
|
+
}
|
|
27
|
+
return await getPath() + (options.extension === undefined || options.extension === null ? '' : '.' + options.extension.replace(/^\./, ''));
|
|
28
|
+
}
|
|
29
|
+
async function temporaryDirectory({ prefix = '' } = {}) {
|
|
30
|
+
const directory = await getPath(prefix);
|
|
31
|
+
await fsPromises.mkdir(directory);
|
|
32
|
+
return directory;
|
|
33
|
+
}
|
|
34
|
+
async function getPath(prefix = '') {
|
|
35
|
+
const temporaryDirectory = await fsPromises.realpath(os.tmpdir());
|
|
36
|
+
return path.join(temporaryDirectory, prefix + uuid());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=tempFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/tempFile.ts"],"sourcesContent":["import { promises as fsPromises } from 'fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { v4 as uuid } from 'uuid'\n\nasync function runTask(temporaryPath: string, callback) {\n try {\n return await callback(temporaryPath)\n } finally {\n await fsPromises.rm(temporaryPath, { force: true, maxRetries: 2, recursive: true })\n }\n}\n\ntype Options = {\n extension?: string\n name?: string\n}\n\nexport const temporaryFileTask = async (callback, options: Options = {}) => {\n const filePath = await temporaryFile(options)\n return runTask(filePath, callback)\n}\n\nasync function temporaryFile(options: Options) {\n if (options.name) {\n if (options.extension !== undefined && options.extension !== null) {\n throw new Error('The `name` and `extension` options are mutually exclusive')\n }\n\n return path.join(await temporaryDirectory(), options.name)\n }\n\n return (\n (await getPath()) +\n (options.extension === undefined || options.extension === null\n ? ''\n : '.' + options.extension.replace(/^\\./, ''))\n )\n}\n\nasync function temporaryDirectory({ prefix = '' } = {}) {\n const directory = await getPath(prefix)\n await fsPromises.mkdir(directory)\n return directory\n}\n\nasync function getPath(prefix = ''): Promise<string> {\n const temporaryDirectory = await fsPromises.realpath(os.tmpdir())\n return path.join(temporaryDirectory, prefix + uuid())\n}\n"],"names":["promises","fsPromises","os","path","v4","uuid","runTask","temporaryPath","callback","rm","force","maxRetries","recursive","temporaryFileTask","options","filePath","temporaryFile","name","extension","undefined","Error","join","temporaryDirectory","getPath","replace","prefix","directory","mkdir","realpath","tmpdir"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,YAAYC,UAAU,QAAQ,KAAI;AAC3C,OAAOC,QAAQ,UAAS;AACxB,OAAOC,UAAU,YAAW;AAC5B,SAASC,MAAMC,IAAI,QAAQ,OAAM;AAEjC,eAAeC,QAAQC,aAAqB,EAAEC,QAAQ;IACpD,IAAI;QACF,OAAO,MAAMA,SAASD;IACxB,SAAU;QACR,MAAMN,WAAWQ,EAAE,CAACF,eAAe;YAAEG,OAAO;YAAMC,YAAY;YAAGC,WAAW;QAAK;IACnF;AACF;AAOA,OAAO,MAAMC,oBAAoB,OAAOL,UAAUM,UAAmB,CAAC,CAAC;IACrE,MAAMC,WAAW,MAAMC,cAAcF;IACrC,OAAOR,QAAQS,UAAUP;AAC3B,EAAC;AAED,eAAeQ,cAAcF,OAAgB;IAC3C,IAAIA,QAAQG,IAAI,EAAE;QAChB,IAAIH,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,MAAM;YACjE,MAAM,IAAIE,MAAM;QAClB;QAEA,OAAOjB,KAAKkB,IAAI,CAAC,MAAMC,sBAAsBR,QAAQG,IAAI;IAC3D;IAEA,OACE,AAAC,MAAMM,YACNT,CAAAA,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,OACtD,KACA,MAAMJ,QAAQI,SAAS,CAACM,OAAO,CAAC,OAAO,GAAE;AAEjD;AAEA,eAAeF,mBAAmB,EAAEG,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,MAAMC,YAAY,MAAMH,QAAQE;IAChC,MAAMxB,WAAW0B,KAAK,CAACD;IACvB,OAAOA;AACT;AAEA,eAAeH,QAAQE,SAAS,EAAE;IAChC,MAAMH,qBAAqB,MAAMrB,WAAW2B,QAAQ,CAAC1B,GAAG2B,MAAM;IAC9D,OAAO1B,KAAKkB,IAAI,CAACC,oBAAoBG,SAASpB;AAChD"}
|
package/dist/uploads/types.d.ts
CHANGED
|
@@ -71,6 +71,12 @@ export type UploadConfig = {
|
|
|
71
71
|
adminThumbnail?: GetAdminThumbnail | string;
|
|
72
72
|
crop?: boolean;
|
|
73
73
|
disableLocalStorage?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Accepts existing headers and can filter/modify them.
|
|
76
|
+
*
|
|
77
|
+
* Useful for adding custom headers to fetch from external providers.
|
|
78
|
+
*/
|
|
79
|
+
externalFileHeaderFilter?: (headers: Record<string, string>) => Record<string, string>;
|
|
74
80
|
filesRequiredOnCreate?: boolean;
|
|
75
81
|
focalPoint?: boolean;
|
|
76
82
|
/** Options for original upload file only. For sizes, set each formatOptions individually. */
|