payload 3.0.0-beta.11 → 3.0.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/auth/cookies.d.ts +16 -4
  2. package/dist/auth/cookies.d.ts.map +1 -1
  3. package/dist/auth/cookies.js +45 -14
  4. package/dist/auth/cookies.js.map +1 -1
  5. package/dist/auth/operations/forgotPassword.js +3 -3
  6. package/dist/auth/operations/forgotPassword.js.map +1 -1
  7. package/dist/auth/operations/login.d.ts.map +1 -1
  8. package/dist/auth/operations/login.js +17 -1
  9. package/dist/auth/operations/login.js.map +1 -1
  10. package/dist/auth/sendVerificationEmail.d.ts +5 -6
  11. package/dist/auth/sendVerificationEmail.d.ts.map +1 -1
  12. package/dist/auth/sendVerificationEmail.js +4 -5
  13. package/dist/auth/sendVerificationEmail.js.map +1 -1
  14. package/dist/collections/config/client.d.ts +4 -1
  15. package/dist/collections/config/client.d.ts.map +1 -1
  16. package/dist/collections/config/client.js +2 -1
  17. package/dist/collections/config/client.js.map +1 -1
  18. package/dist/collections/config/defaults.d.ts +1 -0
  19. package/dist/collections/config/defaults.d.ts.map +1 -1
  20. package/dist/collections/config/defaults.js +1 -0
  21. package/dist/collections/config/defaults.js.map +1 -1
  22. package/dist/collections/config/schema.d.ts.map +1 -1
  23. package/dist/collections/config/schema.js +1 -0
  24. package/dist/collections/config/schema.js.map +1 -1
  25. package/dist/collections/config/types.d.ts +5 -2
  26. package/dist/collections/config/types.d.ts.map +1 -1
  27. package/dist/collections/config/types.js.map +1 -1
  28. package/dist/collections/operations/count.d.ts +13 -0
  29. package/dist/collections/operations/count.d.ts.map +1 -0
  30. package/dist/collections/operations/count.js +75 -0
  31. package/dist/collections/operations/count.js.map +1 -0
  32. package/dist/collections/operations/create.d.ts.map +1 -1
  33. package/dist/collections/operations/create.js +3 -4
  34. package/dist/collections/operations/create.js.map +1 -1
  35. package/dist/collections/operations/local/count.d.ts +20 -0
  36. package/dist/collections/operations/local/count.d.ts.map +1 -0
  37. package/dist/collections/operations/local/count.js +19 -0
  38. package/dist/collections/operations/local/count.js.map +1 -0
  39. package/dist/collections/operations/local/index.d.ts +2 -0
  40. package/dist/collections/operations/local/index.d.ts.map +1 -1
  41. package/dist/collections/operations/local/index.js +2 -0
  42. package/dist/collections/operations/local/index.js.map +1 -1
  43. package/dist/collections/operations/update.d.ts.map +1 -1
  44. package/dist/collections/operations/update.js +2 -2
  45. package/dist/collections/operations/update.js.map +1 -1
  46. package/dist/collections/operations/updateByID.js +1 -1
  47. package/dist/collections/operations/updateByID.js.map +1 -1
  48. package/dist/collections/operations/utils.d.ts +6 -0
  49. package/dist/collections/operations/utils.d.ts.map +1 -1
  50. package/dist/collections/operations/utils.js.map +1 -1
  51. package/dist/config/client.d.ts +2 -1
  52. package/dist/config/client.d.ts.map +1 -1
  53. package/dist/config/client.js +2 -1
  54. package/dist/config/client.js.map +1 -1
  55. package/dist/config/defaults.d.ts.map +1 -1
  56. package/dist/config/defaults.js +1 -0
  57. package/dist/config/defaults.js.map +1 -1
  58. package/dist/config/schema.d.ts.map +1 -1
  59. package/dist/config/schema.js +1 -0
  60. package/dist/config/schema.js.map +1 -1
  61. package/dist/config/types.d.ts +7 -36
  62. package/dist/config/types.d.ts.map +1 -1
  63. package/dist/config/types.js +0 -12
  64. package/dist/config/types.js.map +1 -1
  65. package/dist/database/types.d.ts +10 -0
  66. package/dist/database/types.d.ts.map +1 -1
  67. package/dist/database/types.js.map +1 -1
  68. package/dist/email/consoleEmailAdapter.d.ts +3 -0
  69. package/dist/email/consoleEmailAdapter.d.ts.map +1 -0
  70. package/dist/email/consoleEmailAdapter.js +16 -0
  71. package/dist/email/consoleEmailAdapter.js.map +1 -0
  72. package/dist/email/defaults.d.ts +2 -2
  73. package/dist/email/defaults.d.ts.map +1 -1
  74. package/dist/email/defaults.js +3 -3
  75. package/dist/email/defaults.js.map +1 -1
  76. package/dist/email/getStringifiedToAddress.d.ts +3 -0
  77. package/dist/email/getStringifiedToAddress.d.ts.map +1 -0
  78. package/dist/email/getStringifiedToAddress.js +20 -0
  79. package/dist/email/getStringifiedToAddress.js.map +1 -0
  80. package/dist/email/sendEmail.d.ts +3 -2
  81. package/dist/email/sendEmail.d.ts.map +1 -1
  82. package/dist/email/sendEmail.js +8 -4
  83. package/dist/email/sendEmail.js.map +1 -1
  84. package/dist/email/types.d.ts +25 -18
  85. package/dist/email/types.d.ts.map +1 -1
  86. package/dist/email/types.js +5 -1
  87. package/dist/email/types.js.map +1 -1
  88. package/dist/exports/database.d.ts +1 -1
  89. package/dist/exports/database.d.ts.map +1 -1
  90. package/dist/exports/database.js.map +1 -1
  91. package/dist/exports/node.d.ts +3 -0
  92. package/dist/exports/node.d.ts.map +1 -1
  93. package/dist/exports/node.js +3 -1
  94. package/dist/exports/node.js.map +1 -1
  95. package/dist/exports/operations.d.ts +1 -0
  96. package/dist/exports/operations.d.ts.map +1 -1
  97. package/dist/exports/operations.js +1 -0
  98. package/dist/exports/operations.js.map +1 -1
  99. package/dist/exports/types.d.ts +1 -0
  100. package/dist/exports/types.d.ts.map +1 -1
  101. package/dist/exports/types.js.map +1 -1
  102. package/dist/exports/utilities.d.ts +3 -0
  103. package/dist/exports/utilities.d.ts.map +1 -1
  104. package/dist/exports/utilities.js +3 -1
  105. package/dist/exports/utilities.js.map +1 -1
  106. package/dist/fields/config/client.d.ts +26 -1
  107. package/dist/fields/config/client.d.ts.map +1 -1
  108. package/dist/fields/config/client.js +2 -1
  109. package/dist/fields/config/client.js.map +1 -1
  110. package/dist/fields/config/schema.d.ts.map +1 -1
  111. package/dist/fields/config/schema.js +7 -1
  112. package/dist/fields/config/schema.js.map +1 -1
  113. package/dist/fields/config/types.d.ts +12 -3
  114. package/dist/fields/config/types.d.ts.map +1 -1
  115. package/dist/fields/config/types.js.map +1 -1
  116. package/dist/fields/validations.d.ts +2 -0
  117. package/dist/fields/validations.d.ts.map +1 -1
  118. package/dist/fields/validations.js +44 -1
  119. package/dist/fields/validations.js.map +1 -1
  120. package/dist/globals/config/client.d.ts +1 -1
  121. package/dist/globals/config/client.d.ts.map +1 -1
  122. package/dist/globals/config/client.js +2 -1
  123. package/dist/globals/config/client.js.map +1 -1
  124. package/dist/globals/config/schema.d.ts.map +1 -1
  125. package/dist/globals/config/schema.js +1 -0
  126. package/dist/globals/config/schema.js.map +1 -1
  127. package/dist/globals/config/types.d.ts +3 -1
  128. package/dist/globals/config/types.d.ts.map +1 -1
  129. package/dist/globals/config/types.js.map +1 -1
  130. package/dist/index.d.ts +13 -6
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +25 -13
  133. package/dist/index.js.map +1 -1
  134. package/dist/uploads/getExternalFile.d.ts +1 -1
  135. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  136. package/dist/uploads/getExternalFile.js +1 -1
  137. package/dist/uploads/getExternalFile.js.map +1 -1
  138. package/dist/utilities/importWithoutClientFiles.d.ts.map +1 -1
  139. package/dist/utilities/importWithoutClientFiles.js +8 -5
  140. package/dist/utilities/importWithoutClientFiles.js.map +1 -1
  141. package/dist/utilities/telemetry/index.d.ts +3 -0
  142. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  143. package/dist/utilities/telemetry/index.js +32 -6
  144. package/dist/utilities/telemetry/index.js.map +1 -1
  145. package/package.json +5 -5
  146. package/dist/email/build.d.ts +0 -5
  147. package/dist/email/build.d.ts.map +0 -1
  148. package/dist/email/build.js +0 -63
  149. package/dist/email/build.js.map +0 -1
  150. package/dist/email/mockHandler.d.ts +0 -5
  151. package/dist/email/mockHandler.d.ts.map +0 -1
  152. package/dist/email/mockHandler.js +0 -24
  153. package/dist/email/mockHandler.js.map +0 -1
  154. package/src/index.ts +0 -499
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":"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"}
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,4 +1,4 @@
1
- import type { PayloadRequest } from '../types/index.ts';
1
+ import type { PayloadRequest } from '../types/index.js';
2
2
  import type { File, FileData, UploadConfig } from './types.js';
3
3
  type Args = {
4
4
  data: FileData;
@@ -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,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,CAgCrF,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"}
@@ -5,7 +5,7 @@ export const getExternalFile = async ({ data, req, uploadConfig })=>{
5
5
  if (typeof url === 'string') {
6
6
  const fileURL = `${baseUrl}${url}`;
7
7
  const headers = uploadConfig.externalFileHeaderFilter ? uploadConfig.externalFileHeaderFilter(Object.fromEntries(new Headers(req.headers))) : {
8
- cookie: req.headers['cookie']
8
+ cookie: req.headers.get('cookie')
9
9
  };
10
10
  const res = await fetch(fileURL, {
11
11
  credentials: 'include',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getExternalFile.ts"],"sourcesContent":["import type { PayloadRequest } from '../types/index.ts'\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 : {\n cookie: req.headers['cookie'],\n }\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","res","fetch","credentials","method","ok","status","arrayBuffer","name","Buffer","from","mimetype","get","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;YACEK,QAAQd,IAAIS,OAAO,CAAC,SAAS;QAC/B;QAEJ,MAAMM,MAAM,MAAMC,MAAMR,SAAS;YAC/BS,aAAa;YACbR;YACAS,QAAQ;QACV;QAEA,IAAI,CAACH,IAAII,EAAE,EAAE,MAAM,IAAItB,SAAS,CAAC,0BAA0B,EAAEW,QAAQ,CAAC,EAAEO,IAAIK,MAAM;QAElF,MAAMrB,OAAO,MAAMgB,IAAIM,WAAW;QAElC,OAAO;YACLC,MAAMhB;YACNP,MAAMwB,OAAOC,IAAI,CAACzB;YAClB0B,UAAUV,IAAIN,OAAO,CAACiB,GAAG,CAAC,mBAAmBC;YAC7CC,MAAMC,OAAOd,IAAIN,OAAO,CAACiB,GAAG,CAAC,sBAAsB;QACrD;IACF;IAEA,MAAM,IAAI7B,SAAS,oBAAoB;AACzC,EAAC"}
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 +1 @@
1
- {"version":3,"file":"importWithoutClientFiles.d.ts","sourceRoot":"","sources":["../../src/utilities/importWithoutClientFiles.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAKzD,eAAO,MAAM,wBAAwB,0BAAiC,MAAM,eAM3E,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,eAAsB,MAAM,6BAcpD,CAAA"}
1
+ {"version":3,"file":"importWithoutClientFiles.d.ts","sourceRoot":"","sources":["../../src/utilities/importWithoutClientFiles.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAKzD,eAAO,MAAM,wBAAwB,0BAAiC,MAAM,eAO3E,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,eAAsB,MAAM,6BAmBpD,CAAA"}
@@ -1,12 +1,13 @@
1
1
  import { register } from 'node:module';
2
- import { fileURLToPath, pathToFileURL } from 'node:url';
2
+ import { URL, fileURLToPath, pathToFileURL } from 'node:url';
3
3
  import path from 'path';
4
4
  const filename = fileURLToPath(import.meta.url);
5
5
  const dirname = path.dirname(filename);
6
6
  export const importWithoutClientFiles = async (filePath)=>{
7
- const url = pathToFileURL(filePath).toString();
8
- register(path.resolve(dirname, '../../dist/bin/loader/index.js'), url);
9
- const result = await import(filePath);
7
+ const { href: filePathUrl } = pathToFileURL(filePath);
8
+ const { href: loaderUrl } = pathToFileURL(path.resolve(dirname, '../../dist/bin/loader/index.js'));
9
+ register(loaderUrl, filePathUrl);
10
+ const result = await import(filePathUrl);
10
11
  return result;
11
12
  };
12
13
  /**
@@ -17,7 +18,9 @@ export const importWithoutClientFiles = async (filePath)=>{
17
18
  const config = await importWithoutClientFiles(configPath);
18
19
  return await config.default;
19
20
  }
20
- const callerDir = path.dirname(getCallerInfo()[1].getFileName()).replace('file://', '');
21
+ const callerFilename = getCallerInfo()[1].getFileName();
22
+ const url = new URL(callerFilename);
23
+ const callerDir = path.dirname(fileURLToPath(url));
21
24
  const fullConfigPath = path.resolve(callerDir, configPath);
22
25
  const config = await importWithoutClientFiles(fullConfigPath);
23
26
  return await config.default;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/importWithoutClientFiles.ts"],"sourcesContent":["import { register } from 'node:module'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport path from 'path'\n\nimport type { SanitizedConfig } from '../config/types.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nexport const importWithoutClientFiles = async <T = unknown>(filePath: string) => {\n const url = pathToFileURL(filePath).toString()\n\n register(path.resolve(dirname, '../../dist/bin/loader/index.js'), url)\n const result = await import(filePath)\n return result as T\n}\n\n/**\n * Resolve and load Payload config from either a relative or absolute path\n */\nexport const importConfig = async (configPath: string) => {\n const isAbsolutePath = path.isAbsolute(configPath)\n if (isAbsolutePath) {\n const config = await importWithoutClientFiles<{ default: Promise<SanitizedConfig> }>(configPath)\n return await config.default\n }\n\n const callerDir = path.dirname(getCallerInfo()[1].getFileName()).replace('file://', '')\n const fullConfigPath = path.resolve(callerDir, configPath)\n\n const config = await importWithoutClientFiles<{ default: Promise<SanitizedConfig> }>(\n fullConfigPath,\n )\n return await config.default\n}\n\nconst getCallerInfo = () => {\n const _prepareStackTrace = Error.prepareStackTrace\n try {\n let result = []\n Error.prepareStackTrace = (_, callSites) => {\n const callSitesWithoutCurrent = callSites.slice(1)\n result = callSitesWithoutCurrent\n return callSitesWithoutCurrent\n }\n\n new Error().stack\n return result\n } finally {\n Error.prepareStackTrace = _prepareStackTrace\n }\n}\n"],"names":["register","fileURLToPath","pathToFileURL","path","filename","url","dirname","importWithoutClientFiles","filePath","toString","resolve","result","importConfig","configPath","isAbsolutePath","isAbsolute","config","default","callerDir","getCallerInfo","getFileName","replace","fullConfigPath","_prepareStackTrace","Error","prepareStackTrace","_","callSites","callSitesWithoutCurrent","slice","stack"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAa;AACtC,SAASC,aAAa,EAAEC,aAAa,QAAQ,WAAU;AACvD,OAAOC,UAAU,OAAM;AAIvB,MAAMC,WAAWH,cAAc,YAAYI,GAAG;AAC9C,MAAMC,UAAUH,KAAKG,OAAO,CAACF;AAE7B,OAAO,MAAMG,2BAA2B,OAAoBC;IAC1D,MAAMH,MAAMH,cAAcM,UAAUC,QAAQ;IAE5CT,SAASG,KAAKO,OAAO,CAACJ,SAAS,mCAAmCD;IAClE,MAAMM,SAAS,MAAM,MAAM,CAACH;IAC5B,OAAOG;AACT,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,eAAe,OAAOC;IACjC,MAAMC,iBAAiBX,KAAKY,UAAU,CAACF;IACvC,IAAIC,gBAAgB;QAClB,MAAME,SAAS,MAAMT,yBAAgEM;QACrF,OAAO,MAAMG,OAAOC,OAAO;IAC7B;IAEA,MAAMC,YAAYf,KAAKG,OAAO,CAACa,eAAe,CAAC,EAAE,CAACC,WAAW,IAAIC,OAAO,CAAC,WAAW;IACpF,MAAMC,iBAAiBnB,KAAKO,OAAO,CAACQ,WAAWL;IAE/C,MAAMG,SAAS,MAAMT,yBACnBe;IAEF,OAAO,MAAMN,OAAOC,OAAO;AAC7B,EAAC;AAED,MAAME,gBAAgB;IACpB,MAAMI,qBAAqBC,MAAMC,iBAAiB;IAClD,IAAI;QACF,IAAId,SAAS,EAAE;QACfa,MAAMC,iBAAiB,GAAG,CAACC,GAAGC;YAC5B,MAAMC,0BAA0BD,UAAUE,KAAK,CAAC;YAChDlB,SAASiB;YACT,OAAOA;QACT;QAEA,IAAIJ,QAAQM,KAAK;QACjB,OAAOnB;IACT,SAAU;QACRa,MAAMC,iBAAiB,GAAGF;IAC5B;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/importWithoutClientFiles.ts"],"sourcesContent":["import { register } from 'node:module'\nimport { URL, fileURLToPath, pathToFileURL } from 'node:url'\nimport path from 'path'\n\nimport type { SanitizedConfig } from '../config/types.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nexport const importWithoutClientFiles = async <T = unknown>(filePath: string) => {\n const { href: filePathUrl } = pathToFileURL(filePath)\n const { href: loaderUrl } = pathToFileURL(path.resolve(dirname, '../../dist/bin/loader/index.js'))\n\n register(loaderUrl, filePathUrl)\n const result = await import(filePathUrl)\n return result as T\n}\n\n/**\n * Resolve and load Payload config from either a relative or absolute path\n */\nexport const importConfig = async (configPath: string) => {\n const isAbsolutePath = path.isAbsolute(configPath)\n if (isAbsolutePath) {\n const config = await importWithoutClientFiles<{ default: Promise<SanitizedConfig> }>(configPath)\n return await config.default\n }\n\n const callerFilename = getCallerInfo()[1].getFileName()\n\n const url = new URL(callerFilename)\n\n const callerDir = path.dirname(fileURLToPath(url))\n\n const fullConfigPath = path.resolve(callerDir, configPath)\n\n const config = await importWithoutClientFiles<{ default: Promise<SanitizedConfig> }>(\n fullConfigPath,\n )\n return await config.default\n}\n\nconst getCallerInfo = () => {\n const _prepareStackTrace = Error.prepareStackTrace\n try {\n let result = []\n Error.prepareStackTrace = (_, callSites) => {\n const callSitesWithoutCurrent = callSites.slice(1)\n result = callSitesWithoutCurrent\n return callSitesWithoutCurrent\n }\n\n new Error().stack\n return result\n } finally {\n Error.prepareStackTrace = _prepareStackTrace\n }\n}\n"],"names":["register","URL","fileURLToPath","pathToFileURL","path","filename","url","dirname","importWithoutClientFiles","filePath","href","filePathUrl","loaderUrl","resolve","result","importConfig","configPath","isAbsolutePath","isAbsolute","config","default","callerFilename","getCallerInfo","getFileName","callerDir","fullConfigPath","_prepareStackTrace","Error","prepareStackTrace","_","callSites","callSitesWithoutCurrent","slice","stack"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAa;AACtC,SAASC,GAAG,EAAEC,aAAa,EAAEC,aAAa,QAAQ,WAAU;AAC5D,OAAOC,UAAU,OAAM;AAIvB,MAAMC,WAAWH,cAAc,YAAYI,GAAG;AAC9C,MAAMC,UAAUH,KAAKG,OAAO,CAACF;AAE7B,OAAO,MAAMG,2BAA2B,OAAoBC;IAC1D,MAAM,EAAEC,MAAMC,WAAW,EAAE,GAAGR,cAAcM;IAC5C,MAAM,EAAEC,MAAME,SAAS,EAAE,GAAGT,cAAcC,KAAKS,OAAO,CAACN,SAAS;IAEhEP,SAASY,WAAWD;IACpB,MAAMG,SAAS,MAAM,MAAM,CAACH;IAC5B,OAAOG;AACT,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,eAAe,OAAOC;IACjC,MAAMC,iBAAiBb,KAAKc,UAAU,CAACF;IACvC,IAAIC,gBAAgB;QAClB,MAAME,SAAS,MAAMX,yBAAgEQ;QACrF,OAAO,MAAMG,OAAOC,OAAO;IAC7B;IAEA,MAAMC,iBAAiBC,eAAe,CAAC,EAAE,CAACC,WAAW;IAErD,MAAMjB,MAAM,IAAIL,IAAIoB;IAEpB,MAAMG,YAAYpB,KAAKG,OAAO,CAACL,cAAcI;IAE7C,MAAMmB,iBAAiBrB,KAAKS,OAAO,CAACW,WAAWR;IAE/C,MAAMG,SAAS,MAAMX,yBACnBiB;IAEF,OAAO,MAAMN,OAAOC,OAAO;AAC7B,EAAC;AAED,MAAME,gBAAgB;IACpB,MAAMI,qBAAqBC,MAAMC,iBAAiB;IAClD,IAAI;QACF,IAAId,SAAS,EAAE;QACfa,MAAMC,iBAAiB,GAAG,CAACC,GAAGC;YAC5B,MAAMC,0BAA0BD,UAAUE,KAAK,CAAC;YAChDlB,SAASiB;YACT,OAAOA;QACT;QAEA,IAAIJ,QAAQM,KAAK;QACjB,OAAOnB;IACT,SAAU;QACRa,MAAMC,iBAAiB,GAAGF;IAC5B;AACF"}
@@ -2,9 +2,12 @@ import type { Payload } from '../../types/index.js';
2
2
  import type { AdminInitEvent } from './events/adminInit.js';
3
3
  import type { ServerInitEvent } from './events/serverInit.js';
4
4
  export type BaseEvent = {
5
+ ciName: null | string;
5
6
  envID: string;
7
+ isCI: boolean;
6
8
  nodeEnv: string;
7
9
  nodeVersion: string;
10
+ payloadPackages: Record<string, string>;
8
11
  payloadVersion: string;
9
12
  projectID: string;
10
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/telemetry/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAM7D,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAChD,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,cAAc,GAAG,cAAc,GAAG,eAAe,CAAA;AAEtD,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,cAAc,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,SAAS,uBAA8B,IAAI,KAAG,QAAQ,IAAI,CAwBtE,CAAA;AAsDD,eAAO,MAAM,iBAAiB,gBAAiB,WAAW,KAAG,MAE5D,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/telemetry/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAM7D,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAChD,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,cAAc,GAAG,cAAc,GAAG,eAAe,CAAA;AAEtD,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,cAAc,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAID,eAAO,MAAM,SAAS,uBAA8B,IAAI,KAAG,QAAQ,IAAI,CAsCtE,CAAA;AA4DD,eAAO,MAAM,iBAAiB,gBAAiB,WAAW,KAAG,MAE5D,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { execSync } from 'child_process';
2
+ import ciInfo from 'ci-info';
2
3
  import ConfImport from 'conf';
3
4
  import { randomBytes } from 'crypto';
4
5
  import findUp from 'find-up';
@@ -7,17 +8,34 @@ import path from 'path';
7
8
  import { fileURLToPath } from 'url';
8
9
  import { oneWayHash } from './oneWayHash.js';
9
10
  const Conf = ConfImport.default || ConfImport;
11
+ let baseEvent = null;
10
12
  export const sendEvent = async ({ event, payload })=>{
11
- if (payload.config.telemetry !== false) {
12
- try {
13
- const packageJSON = await getPackageJSON();
14
- const baseEvent = {
13
+ try {
14
+ const packageJSON = await getPackageJSON();
15
+ // Only generate the base event once
16
+ if (!baseEvent) {
17
+ baseEvent = {
18
+ ciName: ciInfo.isCI ? ciInfo.name : null,
15
19
  envID: getEnvID(),
20
+ isCI: ciInfo.isCI,
16
21
  nodeEnv: process.env.NODE_ENV || 'development',
17
22
  nodeVersion: process.version,
23
+ payloadPackages: getPayloadPackages(packageJSON),
18
24
  payloadVersion: getPayloadVersion(packageJSON),
19
25
  projectID: getProjectID(payload, packageJSON)
20
26
  };
27
+ }
28
+ if (process.env.PAYLOAD_TELEMETRY_DEBUG) {
29
+ payload.logger.info({
30
+ event: {
31
+ ...baseEvent,
32
+ ...event
33
+ },
34
+ msg: 'Telemetry Event'
35
+ });
36
+ return;
37
+ }
38
+ if (payload.config.telemetry !== false) {
21
39
  await fetch('https://telemetry.payloadcms.com/events', {
22
40
  body: JSON.stringify({
23
41
  ...baseEvent,
@@ -28,9 +46,9 @@ export const sendEvent = async ({ event, payload })=>{
28
46
  },
29
47
  method: 'post'
30
48
  });
31
- } catch (_) {
32
- // Eat any errors in sending telemetry event
33
49
  }
50
+ } catch (_) {
51
+ // Eat any errors in sending telemetry event
34
52
  }
35
53
  };
36
54
  /**
@@ -62,6 +80,14 @@ const getGitID = (payload)=>{
62
80
  return null;
63
81
  }
64
82
  };
83
+ const getPayloadPackages = (packageJSON)=>{
84
+ return Object.keys(packageJSON.dependencies || {}).reduce((acc, key)=>{
85
+ return key.startsWith('@payloadcms/') ? {
86
+ ...acc,
87
+ [key]: packageJSON.dependencies[key]
88
+ } : acc;
89
+ }, {});
90
+ };
65
91
  const getPackageJSON = async ()=>{
66
92
  const filename = fileURLToPath(import.meta.url);
67
93
  const dirname = path.dirname(filename);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utilities/telemetry/index.ts"],"sourcesContent":["import { execSync } from 'child_process'\nimport ConfImport from 'conf'\nimport { randomBytes } from 'crypto'\nimport findUp from 'find-up'\nimport fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\n\nimport type { Payload } from '../../types/index.js'\nimport type { AdminInitEvent } from './events/adminInit.js'\nimport type { ServerInitEvent } from './events/serverInit.js'\n\nimport { oneWayHash } from './oneWayHash.js'\n\nconst Conf = (ConfImport.default || ConfImport) as unknown as typeof ConfImport.default\n\nexport type BaseEvent = {\n envID: string\n nodeEnv: string\n nodeVersion: string\n payloadVersion: string\n projectID: string\n}\n\ntype PackageJSON = {\n dependencies: Record<string, string | undefined>\n name: string\n}\n\ntype TelemetryEvent = AdminInitEvent | ServerInitEvent\n\ntype Args = {\n event: TelemetryEvent\n payload: Payload\n}\n\nexport const sendEvent = async ({ event, payload }: Args): Promise<void> => {\n if (payload.config.telemetry !== false) {\n try {\n const packageJSON = await getPackageJSON()\n\n const baseEvent: BaseEvent = {\n envID: getEnvID(),\n nodeEnv: process.env.NODE_ENV || 'development',\n nodeVersion: process.version,\n payloadVersion: getPayloadVersion(packageJSON),\n projectID: getProjectID(payload, packageJSON),\n }\n\n await fetch('https://telemetry.payloadcms.com/events', {\n body: JSON.stringify({ ...baseEvent, ...event }),\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'post',\n })\n } catch (_) {\n // Eat any errors in sending telemetry event\n }\n }\n}\n\n/**\n * This is a quasi-persistent identifier used to dedupe recurring events. It's\n * generated from random data and completely anonymous.\n */\nconst getEnvID = (): string => {\n const conf = new Conf()\n const ENV_ID = 'envID'\n\n const val = conf.get(ENV_ID)\n if (val) {\n return val as string\n }\n\n const generated = randomBytes(32).toString('hex')\n conf.set(ENV_ID, generated)\n return generated\n}\n\nconst getProjectID = (payload: Payload, packageJSON: PackageJSON): string => {\n const projectID =\n getGitID(payload) ||\n getPackageJSONID(payload, packageJSON) ||\n payload.config.serverURL ||\n process.cwd()\n return oneWayHash(projectID, payload.secret)\n}\n\nconst getGitID = (payload: Payload) => {\n try {\n const originBuffer = execSync('git config --local --get remote.origin.url', {\n stdio: 'pipe',\n timeout: 1000,\n })\n\n return oneWayHash(String(originBuffer).trim(), payload.secret)\n } catch (_) {\n return null\n }\n}\n\nconst getPackageJSON = async (): Promise<PackageJSON> => {\n const filename = fileURLToPath(import.meta.url)\n const dirname = path.dirname(filename)\n const packageJsonPath = await findUp('package.json', { cwd: dirname })\n const jsonContent: PackageJSON = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n return jsonContent\n}\n\nconst getPackageJSONID = (payload: Payload, packageJSON: PackageJSON): string => {\n return oneWayHash(packageJSON.name, payload.secret)\n}\n\nexport const getPayloadVersion = (packageJSON: PackageJSON): string => {\n return packageJSON?.dependencies?.payload ?? ''\n}\n"],"names":["execSync","ConfImport","randomBytes","findUp","fs","path","fileURLToPath","oneWayHash","Conf","default","sendEvent","event","payload","config","telemetry","packageJSON","getPackageJSON","baseEvent","envID","getEnvID","nodeEnv","process","env","NODE_ENV","nodeVersion","version","payloadVersion","getPayloadVersion","projectID","getProjectID","fetch","body","JSON","stringify","headers","method","_","conf","ENV_ID","val","get","generated","toString","set","getGitID","getPackageJSONID","serverURL","cwd","secret","originBuffer","stdio","timeout","String","trim","filename","url","dirname","packageJsonPath","jsonContent","parse","readFileSync","name","dependencies"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAe;AACxC,OAAOC,gBAAgB,OAAM;AAC7B,SAASC,WAAW,QAAQ,SAAQ;AACpC,OAAOC,YAAY,UAAS;AAC5B,OAAOC,QAAQ,KAAI;AACnB,OAAOC,UAAU,OAAM;AACvB,SAASC,aAAa,QAAQ,MAAK;AAMnC,SAASC,UAAU,QAAQ,kBAAiB;AAE5C,MAAMC,OAAQP,WAAWQ,OAAO,IAAIR;AAsBpC,OAAO,MAAMS,YAAY,OAAO,EAAEC,KAAK,EAAEC,OAAO,EAAQ;IACtD,IAAIA,QAAQC,MAAM,CAACC,SAAS,KAAK,OAAO;QACtC,IAAI;YACF,MAAMC,cAAc,MAAMC;YAE1B,MAAMC,YAAuB;gBAC3BC,OAAOC;gBACPC,SAASC,QAAQC,GAAG,CAACC,QAAQ,IAAI;gBACjCC,aAAaH,QAAQI,OAAO;gBAC5BC,gBAAgBC,kBAAkBZ;gBAClCa,WAAWC,aAAajB,SAASG;YACnC;YAEA,MAAMe,MAAM,2CAA2C;gBACrDC,MAAMC,KAAKC,SAAS,CAAC;oBAAE,GAAGhB,SAAS;oBAAE,GAAGN,KAAK;gBAAC;gBAC9CuB,SAAS;oBACP,gBAAgB;gBAClB;gBACAC,QAAQ;YACV;QACF,EAAE,OAAOC,GAAG;QACV,4CAA4C;QAC9C;IACF;AACF,EAAC;AAED;;;CAGC,GACD,MAAMjB,WAAW;IACf,MAAMkB,OAAO,IAAI7B;IACjB,MAAM8B,SAAS;IAEf,MAAMC,MAAMF,KAAKG,GAAG,CAACF;IACrB,IAAIC,KAAK;QACP,OAAOA;IACT;IAEA,MAAME,YAAYvC,YAAY,IAAIwC,QAAQ,CAAC;IAC3CL,KAAKM,GAAG,CAACL,QAAQG;IACjB,OAAOA;AACT;AAEA,MAAMZ,eAAe,CAACjB,SAAkBG;IACtC,MAAMa,YACJgB,SAAShC,YACTiC,iBAAiBjC,SAASG,gBAC1BH,QAAQC,MAAM,CAACiC,SAAS,IACxBzB,QAAQ0B,GAAG;IACb,OAAOxC,WAAWqB,WAAWhB,QAAQoC,MAAM;AAC7C;AAEA,MAAMJ,WAAW,CAAChC;IAChB,IAAI;QACF,MAAMqC,eAAejD,SAAS,8CAA8C;YAC1EkD,OAAO;YACPC,SAAS;QACX;QAEA,OAAO5C,WAAW6C,OAAOH,cAAcI,IAAI,IAAIzC,QAAQoC,MAAM;IAC/D,EAAE,OAAOZ,GAAG;QACV,OAAO;IACT;AACF;AAEA,MAAMpB,iBAAiB;IACrB,MAAMsC,WAAWhD,cAAc,YAAYiD,GAAG;IAC9C,MAAMC,UAAUnD,KAAKmD,OAAO,CAACF;IAC7B,MAAMG,kBAAkB,MAAMtD,OAAO,gBAAgB;QAAE4C,KAAKS;IAAQ;IACpE,MAAME,cAA2B1B,KAAK2B,KAAK,CAACvD,GAAGwD,YAAY,CAACH,iBAAiB;IAC7E,OAAOC;AACT;AAEA,MAAMb,mBAAmB,CAACjC,SAAkBG;IAC1C,OAAOR,WAAWQ,YAAY8C,IAAI,EAAEjD,QAAQoC,MAAM;AACpD;AAEA,OAAO,MAAMrB,oBAAoB,CAACZ;IAChC,OAAOA,aAAa+C,cAAclD,WAAW;AAC/C,EAAC"}
1
+ {"version":3,"sources":["../../../src/utilities/telemetry/index.ts"],"sourcesContent":["import { execSync } from 'child_process'\nimport ciInfo from 'ci-info'\nimport ConfImport from 'conf'\nimport { randomBytes } from 'crypto'\nimport findUp from 'find-up'\nimport fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\n\nimport type { Payload } from '../../types/index.js'\nimport type { AdminInitEvent } from './events/adminInit.js'\nimport type { ServerInitEvent } from './events/serverInit.js'\n\nimport { oneWayHash } from './oneWayHash.js'\n\nconst Conf = (ConfImport.default || ConfImport) as unknown as typeof ConfImport.default\n\nexport type BaseEvent = {\n ciName: null | string\n envID: string\n isCI: boolean\n nodeEnv: string\n nodeVersion: string\n payloadPackages: Record<string, string>\n payloadVersion: string\n projectID: string\n}\n\ntype PackageJSON = {\n dependencies: Record<string, string | undefined>\n name: string\n}\n\ntype TelemetryEvent = AdminInitEvent | ServerInitEvent\n\ntype Args = {\n event: TelemetryEvent\n payload: Payload\n}\n\nlet baseEvent: BaseEvent | null = null\n\nexport const sendEvent = async ({ event, payload }: Args): Promise<void> => {\n try {\n const packageJSON = await getPackageJSON()\n\n // Only generate the base event once\n if (!baseEvent) {\n baseEvent = {\n ciName: ciInfo.isCI ? ciInfo.name : null,\n envID: getEnvID(),\n isCI: ciInfo.isCI,\n nodeEnv: process.env.NODE_ENV || 'development',\n nodeVersion: process.version,\n payloadPackages: getPayloadPackages(packageJSON),\n payloadVersion: getPayloadVersion(packageJSON),\n projectID: getProjectID(payload, packageJSON),\n }\n }\n\n if (process.env.PAYLOAD_TELEMETRY_DEBUG) {\n payload.logger.info({\n event: { ...baseEvent, ...event },\n msg: 'Telemetry Event',\n })\n return\n }\n\n if (payload.config.telemetry !== false) {\n await fetch('https://telemetry.payloadcms.com/events', {\n body: JSON.stringify({ ...baseEvent, ...event }),\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'post',\n })\n }\n } catch (_) {\n // Eat any errors in sending telemetry event\n }\n}\n\n/**\n * This is a quasi-persistent identifier used to dedupe recurring events. It's\n * generated from random data and completely anonymous.\n */\nconst getEnvID = (): string => {\n const conf = new Conf()\n const ENV_ID = 'envID'\n\n const val = conf.get(ENV_ID)\n if (val) {\n return val as string\n }\n\n const generated = randomBytes(32).toString('hex')\n conf.set(ENV_ID, generated)\n return generated\n}\n\nconst getProjectID = (payload: Payload, packageJSON: PackageJSON): string => {\n const projectID =\n getGitID(payload) ||\n getPackageJSONID(payload, packageJSON) ||\n payload.config.serverURL ||\n process.cwd()\n return oneWayHash(projectID, payload.secret)\n}\n\nconst getGitID = (payload: Payload) => {\n try {\n const originBuffer = execSync('git config --local --get remote.origin.url', {\n stdio: 'pipe',\n timeout: 1000,\n })\n\n return oneWayHash(String(originBuffer).trim(), payload.secret)\n } catch (_) {\n return null\n }\n}\n\nconst getPayloadPackages = (packageJSON: PackageJSON): Record<string, string> => {\n return Object.keys(packageJSON.dependencies || {}).reduce((acc, key) => {\n return key.startsWith('@payloadcms/') ? { ...acc, [key]: packageJSON.dependencies[key] } : acc\n }, {})\n}\n\nconst getPackageJSON = async (): Promise<PackageJSON> => {\n const filename = fileURLToPath(import.meta.url)\n const dirname = path.dirname(filename)\n const packageJsonPath = await findUp('package.json', { cwd: dirname })\n const jsonContent: PackageJSON = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n return jsonContent\n}\n\nconst getPackageJSONID = (payload: Payload, packageJSON: PackageJSON): string => {\n return oneWayHash(packageJSON.name, payload.secret)\n}\n\nexport const getPayloadVersion = (packageJSON: PackageJSON): string => {\n return packageJSON?.dependencies?.payload ?? ''\n}\n"],"names":["execSync","ciInfo","ConfImport","randomBytes","findUp","fs","path","fileURLToPath","oneWayHash","Conf","default","baseEvent","sendEvent","event","payload","packageJSON","getPackageJSON","ciName","isCI","name","envID","getEnvID","nodeEnv","process","env","NODE_ENV","nodeVersion","version","payloadPackages","getPayloadPackages","payloadVersion","getPayloadVersion","projectID","getProjectID","PAYLOAD_TELEMETRY_DEBUG","logger","info","msg","config","telemetry","fetch","body","JSON","stringify","headers","method","_","conf","ENV_ID","val","get","generated","toString","set","getGitID","getPackageJSONID","serverURL","cwd","secret","originBuffer","stdio","timeout","String","trim","Object","keys","dependencies","reduce","acc","key","startsWith","filename","url","dirname","packageJsonPath","jsonContent","parse","readFileSync"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "3.0.0-beta.11",
3
+ "version": "3.0.0-beta.13",
4
4
  "description": "Node, React and MongoDB Headless CMS and Application Framework",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
@@ -26,6 +26,7 @@
26
26
  "@swc-node/sourcemap-support": "^0.5.0",
27
27
  "@types/probe-image-size": "^7.2.4",
28
28
  "bson-objectid": "2.0.4",
29
+ "ci-info": "^4.0.0",
29
30
  "conf": "10.2.0",
30
31
  "console-table-printer": "2.11.2",
31
32
  "dataloader": "2.2.2",
@@ -42,7 +43,6 @@
42
43
  "minimist": "1.2.8",
43
44
  "mkdirp": "1.0.4",
44
45
  "monaco-editor": "0.38.0",
45
- "nodemailer": "6.9.10",
46
46
  "pino": "8.15.0",
47
47
  "pino-pretty": "10.2.0",
48
48
  "pluralize": "8.0.0",
@@ -50,10 +50,11 @@
50
50
  "scheduler": "0.23.0",
51
51
  "scmp": "2.1.0",
52
52
  "uuid": "^9.0.1",
53
- "@payloadcms/translations": "3.0.0-beta.11"
53
+ "@payloadcms/translations": "3.0.0-beta.13"
54
54
  },
55
55
  "peerDependencies": {
56
- "@swc/core": "^1.4.13"
56
+ "@swc/core": "^1.4.13",
57
+ "graphql": "^16.8.1"
57
58
  },
58
59
  "peerDependenciesMeta": {
59
60
  "@swc/core": {
@@ -92,7 +93,6 @@
92
93
  "file-loader": "6.2.0",
93
94
  "form-data": "3.0.1",
94
95
  "get-port": "5.1.1",
95
- "graphql": "16.8.1",
96
96
  "graphql-http": "^1.22.0",
97
97
  "mini-css-extract-plugin": "1.6.2",
98
98
  "nodemon": "3.0.3",
@@ -1,5 +0,0 @@
1
- import type { Logger } from 'pino';
2
- import type { EmailOptions } from '../config/types.js';
3
- import type { BuildEmailResult } from './types.js';
4
- export default function buildEmail(emailConfig: EmailOptions | undefined, logger: Logger): BuildEmailResult;
5
- //# sourceMappingURL=build.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/email/build.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAIlC,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAA;AA+CpE,wBAA8B,UAAU,CACtC,WAAW,EAAE,YAAY,GAAG,SAAS,EACrC,MAAM,EAAE,MAAM,GACb,gBAAgB,CAoBlB"}
@@ -1,63 +0,0 @@
1
- import nodemailer from 'nodemailer';
2
- import { hasTransport, hasTransportOptions } from '../config/types.js';
3
- import { InvalidConfiguration } from '../errors/index.js';
4
- import mockHandler from './mockHandler.js';
5
- async function handleTransport(transport, email, logger) {
6
- try {
7
- await transport.verify();
8
- } catch (err) {
9
- logger.error(`There is an error with the email configuration you have provided. ${err}`);
10
- }
11
- return {
12
- ...email,
13
- transport
14
- };
15
- }
16
- const ensureConfigHasFrom = (emailConfig)=>{
17
- if (!emailConfig?.fromName || !emailConfig?.fromAddress) {
18
- throw new InvalidConfiguration('Email fromName and fromAddress must be configured when transport is configured');
19
- }
20
- };
21
- const handleMockAccount = async (emailConfig, logger)=>{
22
- let mockAccount;
23
- try {
24
- mockAccount = await mockHandler(emailConfig);
25
- const { account: { pass, user, web } } = mockAccount;
26
- if (emailConfig?.logMockCredentials) {
27
- logger.info('E-mail configured with mock configuration');
28
- logger.info(`Log into mock email provider at ${web}`);
29
- logger.info(`Mock email account username: ${user}`);
30
- logger.info(`Mock email account password: ${pass}`);
31
- }
32
- } catch (err) {
33
- logger.error({
34
- err,
35
- msg: 'There was a problem setting up the mock email handler'
36
- });
37
- }
38
- return mockAccount;
39
- };
40
- export default async function buildEmail(emailConfig, logger) {
41
- if (!emailConfig) {
42
- return handleMockAccount(emailConfig, logger);
43
- }
44
- if (hasTransport(emailConfig) && emailConfig.transport) {
45
- ensureConfigHasFrom(emailConfig);
46
- const email = {
47
- ...emailConfig
48
- };
49
- const { transport } = emailConfig;
50
- return handleTransport(transport, email, logger);
51
- }
52
- if (hasTransportOptions(emailConfig) && emailConfig.transportOptions) {
53
- ensureConfigHasFrom(emailConfig);
54
- const email = {
55
- ...emailConfig
56
- };
57
- const transport = nodemailer.createTransport(emailConfig.transportOptions);
58
- return handleTransport(transport, email, logger);
59
- }
60
- return handleMockAccount(emailConfig, logger);
61
- }
62
-
63
- //# sourceMappingURL=build.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/email/build.ts"],"sourcesContent":["import type { Transporter } from 'nodemailer'\nimport type { Logger } from 'pino'\n\nimport nodemailer from 'nodemailer'\n\nimport type { EmailOptions, EmailTransport } from '../config/types.js'\nimport type { BuildEmailResult, MockEmailHandler } from './types.js'\n\nimport { hasTransport, hasTransportOptions } from '../config/types.js'\nimport { InvalidConfiguration } from '../errors/index.js'\nimport mockHandler from './mockHandler.js'\n\nasync function handleTransport(\n transport: Transporter,\n email: EmailTransport,\n logger: Logger,\n): BuildEmailResult {\n try {\n await transport.verify()\n } catch (err) {\n logger.error(`There is an error with the email configuration you have provided. ${err}`)\n }\n\n return { ...email, transport }\n}\n\nconst ensureConfigHasFrom = (emailConfig: EmailOptions) => {\n if (!emailConfig?.fromName || !emailConfig?.fromAddress) {\n throw new InvalidConfiguration(\n 'Email fromName and fromAddress must be configured when transport is configured',\n )\n }\n}\n\nconst handleMockAccount = async (emailConfig: EmailOptions, logger: Logger) => {\n let mockAccount: MockEmailHandler\n try {\n mockAccount = await mockHandler(emailConfig)\n const {\n account: { pass, user, web },\n } = mockAccount\n if (emailConfig?.logMockCredentials) {\n logger.info('E-mail configured with mock configuration')\n logger.info(`Log into mock email provider at ${web}`)\n logger.info(`Mock email account username: ${user}`)\n logger.info(`Mock email account password: ${pass}`)\n }\n } catch (err) {\n logger.error({ err, msg: 'There was a problem setting up the mock email handler' })\n }\n return mockAccount\n}\n\nexport default async function buildEmail(\n emailConfig: EmailOptions | undefined,\n logger: Logger,\n): BuildEmailResult {\n if (!emailConfig) {\n return handleMockAccount(emailConfig, logger)\n }\n\n if (hasTransport(emailConfig) && emailConfig.transport) {\n ensureConfigHasFrom(emailConfig)\n const email = { ...emailConfig }\n const { transport }: { transport: Transporter } = emailConfig\n return handleTransport(transport, email, logger)\n }\n\n if (hasTransportOptions(emailConfig) && emailConfig.transportOptions) {\n ensureConfigHasFrom(emailConfig)\n const email = { ...emailConfig } as EmailTransport\n const transport = nodemailer.createTransport(emailConfig.transportOptions)\n return handleTransport(transport, email, logger)\n }\n\n return handleMockAccount(emailConfig, logger)\n}\n"],"names":["nodemailer","hasTransport","hasTransportOptions","InvalidConfiguration","mockHandler","handleTransport","transport","email","logger","verify","err","error","ensureConfigHasFrom","emailConfig","fromName","fromAddress","handleMockAccount","mockAccount","account","pass","user","web","logMockCredentials","info","msg","buildEmail","transportOptions","createTransport"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAGA,OAAOA,gBAAgB,aAAY;AAKnC,SAASC,YAAY,EAAEC,mBAAmB,QAAQ,qBAAoB;AACtE,SAASC,oBAAoB,QAAQ,qBAAoB;AACzD,OAAOC,iBAAiB,mBAAkB;AAE1C,eAAeC,gBACbC,SAAsB,EACtBC,KAAqB,EACrBC,MAAc;IAEd,IAAI;QACF,MAAMF,UAAUG,MAAM;IACxB,EAAE,OAAOC,KAAK;QACZF,OAAOG,KAAK,CAAC,CAAC,kEAAkE,EAAED,IAAI,CAAC;IACzF;IAEA,OAAO;QAAE,GAAGH,KAAK;QAAED;IAAU;AAC/B;AAEA,MAAMM,sBAAsB,CAACC;IAC3B,IAAI,CAACA,aAAaC,YAAY,CAACD,aAAaE,aAAa;QACvD,MAAM,IAAIZ,qBACR;IAEJ;AACF;AAEA,MAAMa,oBAAoB,OAAOH,aAA2BL;IAC1D,IAAIS;IACJ,IAAI;QACFA,cAAc,MAAMb,YAAYS;QAChC,MAAM,EACJK,SAAS,EAAEC,IAAI,EAAEC,IAAI,EAAEC,GAAG,EAAE,EAC7B,GAAGJ;QACJ,IAAIJ,aAAaS,oBAAoB;YACnCd,OAAOe,IAAI,CAAC;YACZf,OAAOe,IAAI,CAAC,CAAC,gCAAgC,EAAEF,IAAI,CAAC;YACpDb,OAAOe,IAAI,CAAC,CAAC,6BAA6B,EAAEH,KAAK,CAAC;YAClDZ,OAAOe,IAAI,CAAC,CAAC,6BAA6B,EAAEJ,KAAK,CAAC;QACpD;IACF,EAAE,OAAOT,KAAK;QACZF,OAAOG,KAAK,CAAC;YAAED;YAAKc,KAAK;QAAwD;IACnF;IACA,OAAOP;AACT;AAEA,eAAe,eAAeQ,WAC5BZ,WAAqC,EACrCL,MAAc;IAEd,IAAI,CAACK,aAAa;QAChB,OAAOG,kBAAkBH,aAAaL;IACxC;IAEA,IAAIP,aAAaY,gBAAgBA,YAAYP,SAAS,EAAE;QACtDM,oBAAoBC;QACpB,MAAMN,QAAQ;YAAE,GAAGM,WAAW;QAAC;QAC/B,MAAM,EAAEP,SAAS,EAAE,GAA+BO;QAClD,OAAOR,gBAAgBC,WAAWC,OAAOC;IAC3C;IAEA,IAAIN,oBAAoBW,gBAAgBA,YAAYa,gBAAgB,EAAE;QACpEd,oBAAoBC;QACpB,MAAMN,QAAQ;YAAE,GAAGM,WAAW;QAAC;QAC/B,MAAMP,YAAYN,WAAW2B,eAAe,CAACd,YAAYa,gBAAgB;QACzE,OAAOrB,gBAAgBC,WAAWC,OAAOC;IAC3C;IAEA,OAAOQ,kBAAkBH,aAAaL;AACxC"}
@@ -1,5 +0,0 @@
1
- import type { EmailOptions } from '../config/types.js';
2
- import type { MockEmailHandler } from './types.js';
3
- declare const mockEmailHandler: (emailConfig: EmailOptions) => Promise<MockEmailHandler>;
4
- export default mockEmailHandler;
5
- //# sourceMappingURL=mockHandler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mockHandler.d.ts","sourceRoot":"","sources":["../../src/email/mockHandler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAIlD,QAAA,MAAM,gBAAgB,gBAAuB,YAAY,KAAG,QAAQ,gBAAgB,CAoBnF,CAAA;AAED,eAAe,gBAAgB,CAAA"}
@@ -1,24 +0,0 @@
1
- import nodemailer from 'nodemailer';
2
- import { defaults as emailDefaults } from './defaults.js';
3
- const mockEmailHandler = async (emailConfig)=>{
4
- const testAccount = await nodemailer.createTestAccount();
5
- const smtpOptions = {
6
- ...emailConfig,
7
- auth: {
8
- pass: testAccount.pass,
9
- user: testAccount.user
10
- },
11
- fromAddress: emailConfig?.fromAddress || emailDefaults.fromAddress,
12
- fromName: emailConfig?.fromName || emailDefaults.fromName,
13
- host: 'smtp.ethereal.email',
14
- port: 587,
15
- secure: false
16
- };
17
- return {
18
- account: testAccount,
19
- transport: nodemailer.createTransport(smtpOptions)
20
- };
21
- };
22
- export default mockEmailHandler;
23
-
24
- //# sourceMappingURL=mockHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/email/mockHandler.ts"],"sourcesContent":["import nodemailer from 'nodemailer'\n\nimport type { EmailOptions } from '../config/types.js'\nimport type { MockEmailHandler } from './types.js'\n\nimport { defaults as emailDefaults } from './defaults.js'\n\nconst mockEmailHandler = async (emailConfig: EmailOptions): Promise<MockEmailHandler> => {\n const testAccount = await nodemailer.createTestAccount()\n\n const smtpOptions = {\n ...emailConfig,\n auth: {\n pass: testAccount.pass,\n user: testAccount.user,\n },\n fromAddress: emailConfig?.fromAddress || emailDefaults.fromAddress,\n fromName: emailConfig?.fromName || emailDefaults.fromName,\n host: 'smtp.ethereal.email',\n port: 587,\n secure: false,\n }\n\n return {\n account: testAccount,\n transport: nodemailer.createTransport(smtpOptions),\n }\n}\n\nexport default mockEmailHandler\n"],"names":["nodemailer","defaults","emailDefaults","mockEmailHandler","emailConfig","testAccount","createTestAccount","smtpOptions","auth","pass","user","fromAddress","fromName","host","port","secure","account","transport","createTransport"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,gBAAgB,aAAY;AAKnC,SAASC,YAAYC,aAAa,QAAQ,gBAAe;AAEzD,MAAMC,mBAAmB,OAAOC;IAC9B,MAAMC,cAAc,MAAML,WAAWM,iBAAiB;IAEtD,MAAMC,cAAc;QAClB,GAAGH,WAAW;QACdI,MAAM;YACJC,MAAMJ,YAAYI,IAAI;YACtBC,MAAML,YAAYK,IAAI;QACxB;QACAC,aAAaP,aAAaO,eAAeT,cAAcS,WAAW;QAClEC,UAAUR,aAAaQ,YAAYV,cAAcU,QAAQ;QACzDC,MAAM;QACNC,MAAM;QACNC,QAAQ;IACV;IAEA,OAAO;QACLC,SAASX;QACTY,WAAWjB,WAAWkB,eAAe,CAACX;IACxC;AACF;AAEA,eAAeJ,iBAAgB"}