{"version":3,"file":"index.mjs","sources":["../../server/src/bootstrap.ts","../../server/src/services/email.ts","../../server/src/services/index.ts","../../server/src/routes/admin.ts","../../server/src/routes/content-api.ts","../../server/src/routes/index.ts","../../server/src/controllers/email.ts","../../server/src/controllers/index.ts","../../server/src/config.ts","../../server/src/index.ts"],"sourcesContent":["import type { Strapi } from '@strapi/types';\nimport type { EmailConfig, SendOptions } from './types';\n\ninterface EmailProvider {\n  send: (options: SendOptions) => Promise<any>;\n}\n\ninterface EmailProviderModule {\n  init: (\n    options: EmailConfig['providerOptions'],\n    settings: EmailConfig['settings']\n  ) => EmailProvider;\n  name?: string;\n  provider?: string;\n}\n\nconst createProvider = (emailConfig: EmailConfig) => {\n  const providerName = emailConfig.provider.toLowerCase();\n  let provider: EmailProviderModule;\n\n  let modulePath: string;\n  try {\n    modulePath = require.resolve(`@strapi/provider-email-${providerName}`);\n  } catch (error) {\n    if (\n      error !== null &&\n      typeof error === 'object' &&\n      'code' in error &&\n      error.code === 'MODULE_NOT_FOUND'\n    ) {\n      modulePath = providerName;\n    } else {\n      throw error;\n    }\n  }\n\n  try {\n    provider = require(modulePath);\n  } catch (err) {\n    throw new Error(`Could not load email provider \"${providerName}\".`);\n  }\n\n  return provider.init(emailConfig.providerOptions, emailConfig.settings);\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Strapi }) => {\n  const emailConfig: EmailConfig = strapi.config.get('plugin.email');\n  strapi.plugin('email').provider = createProvider(emailConfig);\n\n  // Add permissions\n  const actions = [\n    {\n      section: 'settings',\n      category: 'email',\n      displayName: 'Access the Email Settings page',\n      uid: 'settings.read',\n      pluginName: 'email',\n    },\n  ];\n\n  await strapi.admin!.services.permission.actionProvider.registerMany(actions);\n};\n","import * as _ from 'lodash';\nimport { keysDeep, template } from '@strapi/utils';\n\nimport type {\n  EmailConfig,\n  EmailOptions,\n  EmailTemplate,\n  EmailTemplateData,\n  SendOptions,\n} from '../types';\n\nconst { createStrictInterpolationRegExp } = template;\n\nconst getProviderSettings = (): EmailConfig => strapi.config.get('plugin.email');\n\nconst send = async (options: SendOptions) => strapi.plugin('email').provider.send(options);\n\n/**\n * fill subject, text and html using lodash template\n * @param {object} emailOptions - to, from and replyto...\n * @param {object} emailTemplate - object containing attributes to fill\n * @param {object} data - data used to fill the template\n * @returns {{ subject, text, subject }}\n */\nconst sendTemplatedEmail = (\n  emailOptions: EmailOptions,\n  emailTemplate: EmailTemplate,\n  data: EmailTemplateData\n) => {\n  const attributes = ['subject', 'text', 'html'];\n  const missingAttributes = _.difference(attributes, Object.keys(emailTemplate));\n\n  if (missingAttributes.length > 0) {\n    throw new Error(\n      `Following attributes are missing from your email template : ${missingAttributes.join(', ')}`\n    );\n  }\n\n  const allowedInterpolationVariables = keysDeep(data);\n  const interpolate = createStrictInterpolationRegExp(allowedInterpolationVariables, 'g');\n\n  const templatedAttributes = attributes.reduce(\n    (compiled, attribute) =>\n      emailTemplate[attribute]\n        ? Object.assign(compiled, {\n            [attribute]: _.template(emailTemplate[attribute], {\n              interpolate,\n            })(data),\n          })\n        : compiled,\n    {}\n  );\n\n  return strapi.plugin('email').provider.send({ ...emailOptions, ...templatedAttributes });\n};\n\nconst emailService = () => ({\n  getProviderSettings,\n  send,\n  sendTemplatedEmail,\n});\n\nexport default emailService;\n","import email from './email';\n\nexport const services = { email };\n","export default {\n  type: 'admin',\n  routes: [\n    {\n      method: 'POST',\n      path: '/',\n      handler: 'email.send',\n      config: {\n        policies: ['admin::isAuthenticatedAdmin'],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/test',\n      handler: 'email.test',\n      config: {\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          { name: 'admin::hasPermissions', config: { actions: ['plugin::email.settings.read'] } },\n        ],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/settings',\n      handler: 'email.getSettings',\n      config: {\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          { name: 'admin::hasPermissions', config: { actions: ['plugin::email.settings.read'] } },\n        ],\n      },\n    },\n  ],\n};\n","export default {\n  type: 'content-api',\n  routes: [\n    {\n      method: 'POST',\n      path: '/',\n      handler: 'email.send',\n    },\n  ],\n};\n","import admin from './admin';\nimport contentApi from './content-api';\n\nexport const routes = {\n  admin,\n  'content-api': contentApi,\n};\n","import { pick } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\n\nimport type Koa from 'koa';\nimport type { EmailConfig, SendOptions } from '../types';\n\nconst { ApplicationError } = errors;\n\n/**\n * Email.js controller\n *\n * @description: A set of functions called \"actions\" of the `email` plugin.\n */\nconst emailController = {\n  async send(ctx: Koa.Context) {\n    const options: SendOptions = ctx.request.body;\n\n    try {\n      await strapi.plugin('email').service('email').send(options);\n    } catch (error) {\n      if (error instanceof Error) {\n        if ('statusCode' in error && error.statusCode === 400) {\n          throw new ApplicationError(error.message);\n        } else {\n          throw new Error(`Couldn't send email: ${error.message}.`);\n        }\n      }\n    }\n\n    // Send 200 `ok`\n    ctx.send({});\n  },\n\n  async test(ctx: Koa.Context) {\n    const { to } = ctx.request.body;\n\n    if (!to) {\n      throw new ApplicationError('No recipient(s) are given');\n    }\n\n    const email: SendOptions = {\n      to,\n      subject: `Strapi test mail to: ${to}`,\n      text: `Great! You have correctly configured the Strapi email plugin with the ${strapi.config.get(\n        'plugin.email.provider'\n      )} provider. \\r\\nFor documentation on how to use the email plugin checkout: https://docs.strapi.io/developer-docs/latest/plugins/email.html`,\n    };\n\n    try {\n      await strapi.plugin('email').service('email').send(email);\n    } catch (error) {\n      if (error instanceof Error) {\n        if ('statusCode' in error && error.statusCode === 400) {\n          throw new ApplicationError(error.message);\n        } else {\n          throw new Error(`Couldn't send test email: ${error.message}.`);\n        }\n      }\n    }\n\n    // Send 200 `ok`\n    ctx.send({});\n  },\n\n  async getSettings(ctx: Koa.Context) {\n    const config: EmailConfig = strapi.plugin('email').service('email').getProviderSettings();\n\n    ctx.send({\n      config: pick(\n        ['provider', 'settings.defaultFrom', 'settings.defaultReplyTo', 'settings.testAddress'],\n        config\n      ),\n    });\n  },\n};\n\nexport default emailController;\n","import email from './email';\n\nexport const controllers = { email };\n","import type { StrapiConfig } from './types';\n\nexport const config: StrapiConfig = {\n  default: {\n    provider: 'sendmail',\n    providerOptions: {},\n    settings: {\n      defaultFrom: 'Strapi <no-reply@strapi.io>',\n    },\n  },\n  validator() {},\n};\n","import { bootstrap } from './bootstrap';\nimport { services } from './services';\nimport { routes } from './routes';\nimport { controllers } from './controllers';\nimport { config } from './config';\n\nexport default {\n  bootstrap,\n  services,\n  routes,\n  controllers,\n  config,\n};\n"],"names":["strapi","email","config"],"mappings":"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"}