diff --git a/packages/mailers/core/README.md b/packages/mailers/core/README.md new file mode 100644 index 000000000..8843b0f14 --- /dev/null +++ b/packages/mailers/core/README.md @@ -0,0 +1,3 @@ +# Nodemailer - @kit/nodemailer + +This package provides a simple and easy to use mailer for sending emails using nodemailer. \ No newline at end of file diff --git a/packages/mailers/core/package.json b/packages/mailers/core/package.json new file mode 100644 index 000000000..da95768c7 --- /dev/null +++ b/packages/mailers/core/package.json @@ -0,0 +1,39 @@ +{ + "name": "@kit/mailers", + "private": true, + "version": "0.1.0", + "scripts": { + "clean": "git clean -xdf .turbo node_modules", + "format": "prettier --check \"**/*.{ts,tsx}\"", + "lint": "eslint .", + "typecheck": "tsc --noEmit" + }, + "prettier": "@kit/prettier-config", + "exports": { + ".": "./src/index.ts" + }, + "devDependencies": { + "@kit/eslint-config": "workspace:*", + "@kit/nodemailer": "workspace:^", + "@kit/prettier-config": "workspace:*", + "@kit/resend": "workspace:^", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@types/node": "^22.5.2", + "zod": "^3.23.8" + }, + "eslintConfig": { + "root": true, + "extends": [ + "@kit/eslint-config/base", + "@kit/eslint-config/react" + ] + }, + "typesVersions": { + "*": { + "*": [ + "src/*" + ] + } + } +} diff --git a/packages/mailers/src/index.ts b/packages/mailers/core/src/index.ts similarity index 70% rename from packages/mailers/src/index.ts rename to packages/mailers/core/src/index.ts index 1fba669a9..0a2ae46fe 100644 --- a/packages/mailers/src/index.ts +++ b/packages/mailers/core/src/index.ts @@ -13,8 +13,11 @@ export async function getMailer() { case 'nodemailer': return getNodemailer(); - case 'resend': - return getResendMailer(); + case 'resend': { + const { createResendMailer } = await import('@kit/resend'); + + return createResendMailer(); + } default: throw new Error(`Invalid mailer: ${MAILER_PROVIDER as string}`); @@ -23,18 +26,12 @@ export async function getMailer() { async function getNodemailer() { if (process.env.NEXT_RUNTIME === 'nodejs') { - const { Nodemailer } = await import('./impl/nodemailer'); + const { createNodemailerService } = await import('@kit/nodemailer'); - return new Nodemailer(); + return createNodemailerService(); } else { throw new Error( 'Nodemailer is not available on the edge runtime. Please use another mailer.', ); } -} - -async function getResendMailer() { - const { ResendMailer } = await import('./impl/resend'); - - return new ResendMailer(); -} +} \ No newline at end of file diff --git a/packages/mailers/tsconfig.json b/packages/mailers/core/tsconfig.json similarity index 100% rename from packages/mailers/tsconfig.json rename to packages/mailers/core/tsconfig.json diff --git a/packages/mailers/README.md b/packages/mailers/nodemailer/README.md similarity index 100% rename from packages/mailers/README.md rename to packages/mailers/nodemailer/README.md diff --git a/packages/mailers/package.json b/packages/mailers/nodemailer/package.json similarity index 88% rename from packages/mailers/package.json rename to packages/mailers/nodemailer/package.json index e7eef934c..7f2b975b5 100644 --- a/packages/mailers/package.json +++ b/packages/mailers/nodemailer/package.json @@ -1,5 +1,5 @@ { - "name": "@kit/mailers", + "name": "@kit/nodemailer", "private": true, "version": "0.1.0", "scripts": { @@ -13,11 +13,11 @@ ".": "./src/index.ts" }, "dependencies": { - "nodemailer": "^6.9.15", - "vercel-email": "0.0.6" + "nodemailer": "^6.9.15" }, "devDependencies": { "@kit/eslint-config": "workspace:*", + "@kit/mailers-shared": "workspace:^", "@kit/prettier-config": "workspace:*", "@kit/tailwind-config": "workspace:*", "@kit/tsconfig": "workspace:*", diff --git a/packages/mailers/src/impl/nodemailer/index.ts b/packages/mailers/nodemailer/src/index.ts similarity index 63% rename from packages/mailers/src/impl/nodemailer/index.ts rename to packages/mailers/nodemailer/src/index.ts index 7c957c905..7c20b127b 100644 --- a/packages/mailers/src/impl/nodemailer/index.ts +++ b/packages/mailers/nodemailer/src/index.ts @@ -2,17 +2,21 @@ import 'server-only'; import { z } from 'zod'; -import { Mailer } from '../../mailer'; -import type { MailerSchema } from '../../schema/mailer.schema'; -import { getSMTPConfiguration } from '../../smtp-configuration'; +import { Mailer, MailerSchema } from '@kit/mailers-shared'; + +import { getSMTPConfiguration } from './smtp-configuration'; type Config = z.infer; +export function createNodemailerService() { + return new Nodemailer(); +} + /** * A class representing a mailer using Nodemailer library. * @implements {Mailer} */ -export class Nodemailer implements Mailer { +class Nodemailer implements Mailer { async sendEmail(config: Config) { const { createTransport } = await import('nodemailer'); const transporter = createTransport(getSMTPConfiguration()); diff --git a/packages/mailers/src/smtp-configuration.ts b/packages/mailers/nodemailer/src/smtp-configuration.ts similarity index 87% rename from packages/mailers/src/smtp-configuration.ts rename to packages/mailers/nodemailer/src/smtp-configuration.ts index bc863604a..855b6231d 100644 --- a/packages/mailers/src/smtp-configuration.ts +++ b/packages/mailers/nodemailer/src/smtp-configuration.ts @@ -1,4 +1,4 @@ -import { SmtpConfigSchema } from './schema/smtp-config.schema'; +import { SmtpConfigSchema } from '@kit/mailers-shared'; export function getSMTPConfiguration() { const data = SmtpConfigSchema.parse({ diff --git a/packages/mailers/nodemailer/tsconfig.json b/packages/mailers/nodemailer/tsconfig.json new file mode 100644 index 000000000..c4697e934 --- /dev/null +++ b/packages/mailers/nodemailer/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@kit/tsconfig/base.json", + "compilerOptions": { + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" + }, + "include": ["*.ts", "src"], + "exclude": ["node_modules"] +} diff --git a/packages/mailers/resend/README.md b/packages/mailers/resend/README.md new file mode 100644 index 000000000..8843b0f14 --- /dev/null +++ b/packages/mailers/resend/README.md @@ -0,0 +1,3 @@ +# Nodemailer - @kit/nodemailer + +This package provides a simple and easy to use mailer for sending emails using nodemailer. \ No newline at end of file diff --git a/packages/mailers/resend/package.json b/packages/mailers/resend/package.json new file mode 100644 index 000000000..25952d016 --- /dev/null +++ b/packages/mailers/resend/package.json @@ -0,0 +1,38 @@ +{ + "name": "@kit/resend", + "private": true, + "version": "0.1.0", + "scripts": { + "clean": "git clean -xdf .turbo node_modules", + "format": "prettier --check \"**/*.{ts,tsx}\"", + "lint": "eslint .", + "typecheck": "tsc --noEmit" + }, + "prettier": "@kit/prettier-config", + "exports": { + ".": "./src/index.ts" + }, + "devDependencies": { + "@kit/eslint-config": "workspace:*", + "@kit/mailers-shared": "workspace:^", + "@kit/prettier-config": "workspace:*", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@types/node": "^22.5.2", + "zod": "^3.23.8" + }, + "eslintConfig": { + "root": true, + "extends": [ + "@kit/eslint-config/base", + "@kit/eslint-config/react" + ] + }, + "typesVersions": { + "*": { + "*": [ + "src/*" + ] + } + } +} diff --git a/packages/mailers/src/impl/resend/index.ts b/packages/mailers/resend/src/index.ts similarity index 86% rename from packages/mailers/src/impl/resend/index.ts rename to packages/mailers/resend/src/index.ts index 209c91ee3..8bd067fdf 100644 --- a/packages/mailers/src/impl/resend/index.ts +++ b/packages/mailers/resend/src/index.ts @@ -2,8 +2,7 @@ import 'server-only'; import { z } from 'zod'; -import { Mailer } from '../../mailer'; -import type { MailerSchema } from '../../schema/mailer.schema'; +import { Mailer, MailerSchema } from '@kit/mailers-shared'; type Config = z.infer; @@ -14,11 +13,15 @@ const RESEND_API_KEY = z }) .parse(process.env.RESEND_API_KEY); +export function createResendMailer() { + return new ResendMailer(); +} + /** * A class representing a mailer using the Resend HTTP API. * @implements {Mailer} */ -export class ResendMailer implements Mailer { +class ResendMailer implements Mailer { async sendEmail(config: Config) { const contentObject = 'text' in config diff --git a/packages/mailers/resend/tsconfig.json b/packages/mailers/resend/tsconfig.json new file mode 100644 index 000000000..c4697e934 --- /dev/null +++ b/packages/mailers/resend/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@kit/tsconfig/base.json", + "compilerOptions": { + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" + }, + "include": ["*.ts", "src"], + "exclude": ["node_modules"] +} diff --git a/packages/mailers/shared/README.md b/packages/mailers/shared/README.md new file mode 100644 index 000000000..f4c37b19c --- /dev/null +++ b/packages/mailers/shared/README.md @@ -0,0 +1,3 @@ +# Mailers Shared - @kit/mailers-shared + +This package provides shared utilities for mailers. \ No newline at end of file diff --git a/packages/mailers/shared/package.json b/packages/mailers/shared/package.json new file mode 100644 index 000000000..955b4b5df --- /dev/null +++ b/packages/mailers/shared/package.json @@ -0,0 +1,37 @@ +{ + "name": "@kit/mailers-shared", + "private": true, + "version": "0.1.0", + "scripts": { + "clean": "git clean -xdf .turbo node_modules", + "format": "prettier --check \"**/*.{ts,tsx}\"", + "lint": "eslint .", + "typecheck": "tsc --noEmit" + }, + "prettier": "@kit/prettier-config", + "exports": { + ".": "./src/index.ts" + }, + "dependencies": {}, + "devDependencies": { + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "zod": "^3.23.8" + }, + "eslintConfig": { + "root": true, + "extends": [ + "@kit/eslint-config/base", + "@kit/eslint-config/react" + ] + }, + "typesVersions": { + "*": { + "*": [ + "src/*" + ] + } + } +} diff --git a/packages/mailers/shared/src/index.ts b/packages/mailers/shared/src/index.ts new file mode 100644 index 000000000..bfdab0f6e --- /dev/null +++ b/packages/mailers/shared/src/index.ts @@ -0,0 +1,3 @@ +export * from './schema/mailer.schema'; +export * from './schema/smtp-config.schema'; +export * from './mailer'; \ No newline at end of file diff --git a/packages/mailers/src/mailer.ts b/packages/mailers/shared/src/mailer.ts similarity index 100% rename from packages/mailers/src/mailer.ts rename to packages/mailers/shared/src/mailer.ts diff --git a/packages/mailers/src/schema/mailer.schema.ts b/packages/mailers/shared/src/schema/mailer.schema.ts similarity index 100% rename from packages/mailers/src/schema/mailer.schema.ts rename to packages/mailers/shared/src/schema/mailer.schema.ts diff --git a/packages/mailers/src/schema/smtp-config.schema.ts b/packages/mailers/shared/src/schema/smtp-config.schema.ts similarity index 100% rename from packages/mailers/src/schema/smtp-config.schema.ts rename to packages/mailers/shared/src/schema/smtp-config.schema.ts diff --git a/packages/mailers/shared/tsconfig.json b/packages/mailers/shared/tsconfig.json new file mode 100644 index 000000000..c4697e934 --- /dev/null +++ b/packages/mailers/shared/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@kit/tsconfig/base.json", + "compilerOptions": { + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" + }, + "include": ["*.ts", "src"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1dbd27e7..a38848633 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,7 +86,7 @@ importers: version: link:../../packages/i18n '@kit/mailers': specifier: workspace:^ - version: link:../../packages/mailers + version: link:../../packages/mailers/core '@kit/monitoring': specifier: workspace:^ version: link:../../packages/monitoring/api @@ -602,7 +602,7 @@ importers: version: link:../../../tooling/eslint '@kit/mailers': specifier: workspace:^ - version: link:../../mailers + version: link:../../mailers/core '@kit/monitoring': specifier: workspace:^ version: link:../../monitoring/api @@ -861,7 +861,7 @@ importers: version: link:../../../tooling/eslint '@kit/mailers': specifier: workspace:^ - version: link:../../mailers + version: link:../../mailers/core '@kit/monitoring': specifier: workspace:* version: link:../../monitoring/api @@ -966,27 +966,54 @@ importers: specifier: ^15.0.1 version: 15.0.1(i18next@23.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - packages/mailers: + packages/mailers/core: + devDependencies: + '@kit/eslint-config': + specifier: workspace:* + version: link:../../../tooling/eslint + '@kit/nodemailer': + specifier: workspace:^ + version: link:../nodemailer + '@kit/prettier-config': + specifier: workspace:* + version: link:../../../tooling/prettier + '@kit/resend': + specifier: workspace:^ + version: link:../resend + '@kit/tailwind-config': + specifier: workspace:* + version: link:../../../tooling/tailwind + '@kit/tsconfig': + specifier: workspace:* + version: link:../../../tooling/typescript + '@types/node': + specifier: ^22.5.2 + version: 22.5.2 + zod: + specifier: ^3.23.8 + version: 3.23.8 + + packages/mailers/nodemailer: dependencies: nodemailer: specifier: ^6.9.15 version: 6.9.15 - vercel-email: - specifier: 0.0.6 - version: 0.0.6 devDependencies: '@kit/eslint-config': specifier: workspace:* - version: link:../../tooling/eslint + version: link:../../../tooling/eslint + '@kit/mailers-shared': + specifier: workspace:^ + version: link:../shared '@kit/prettier-config': specifier: workspace:* - version: link:../../tooling/prettier + version: link:../../../tooling/prettier '@kit/tailwind-config': specifier: workspace:* - version: link:../../tooling/tailwind + version: link:../../../tooling/tailwind '@kit/tsconfig': specifier: workspace:* - version: link:../../tooling/typescript + version: link:../../../tooling/typescript '@types/nodemailer': specifier: 6.4.15 version: 6.4.15 @@ -994,6 +1021,48 @@ importers: specifier: ^3.23.8 version: 3.23.8 + packages/mailers/resend: + devDependencies: + '@kit/eslint-config': + specifier: workspace:* + version: link:../../../tooling/eslint + '@kit/mailers-shared': + specifier: workspace:^ + version: link:../shared + '@kit/prettier-config': + specifier: workspace:* + version: link:../../../tooling/prettier + '@kit/tailwind-config': + specifier: workspace:* + version: link:../../../tooling/tailwind + '@kit/tsconfig': + specifier: workspace:* + version: link:../../../tooling/typescript + '@types/node': + specifier: ^22.5.2 + version: 22.5.2 + zod: + specifier: ^3.23.8 + version: 3.23.8 + + packages/mailers/shared: + devDependencies: + '@kit/eslint-config': + specifier: workspace:* + version: link:../../../tooling/eslint + '@kit/prettier-config': + specifier: workspace:* + version: link:../../../tooling/prettier + '@kit/tailwind-config': + specifier: workspace:* + version: link:../../../tooling/tailwind + '@kit/tsconfig': + specifier: workspace:* + version: link:../../../tooling/typescript + zod: + specifier: ^3.23.8 + version: 3.23.8 + packages/monitoring/api: devDependencies: '@kit/baselime': @@ -7655,9 +7724,6 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - vercel-email@0.0.6: - resolution: {integrity: sha512-lpELZ8/B6qyLMUOzmvZiU5evo1Hv5jfSpI/rrzny5UYfOAUKFYycraXNT+fT/cC6ewUKQVJDg8/v3LwyX3cCzA==} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -15544,8 +15610,6 @@ snapshots: validate-npm-package-name@5.0.1: {} - vercel-email@0.0.6: {} - vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2