From 98e95bcadedb04dfee2a7d48ca917b8932063d77 Mon Sep 17 00:00:00 2001
From: gabriel miranda
Date: Fri, 3 Oct 2025 09:54:31 -0300
Subject: [PATCH 1/3] use local version of vercel invite user for preview
server
---
.../src/utils/get-email-component.spec.ts | 2 +-
.../src/utils/testing/vercel-invite-user.tsx | 160 ++++++++++++++++++
2 files changed, 161 insertions(+), 1 deletion(-)
create mode 100644 packages/preview-server/src/utils/testing/vercel-invite-user.tsx
diff --git a/packages/preview-server/src/utils/get-email-component.spec.ts b/packages/preview-server/src/utils/get-email-component.spec.ts
index 233ee57b94..b6db748b21 100644
--- a/packages/preview-server/src/utils/get-email-component.spec.ts
+++ b/packages/preview-server/src/utils/get-email-component.spec.ts
@@ -19,7 +19,7 @@ describe('getEmailComponent()', () => {
const result = await getEmailComponent(
path.resolve(
__dirname,
- '../../../../apps/demo/emails/notifications/vercel-invite-user.tsx',
+ './testing/vercel-invite-user.tsx',
),
path.resolve(__dirname, '../../jsx-runtime'),
);
diff --git a/packages/preview-server/src/utils/testing/vercel-invite-user.tsx b/packages/preview-server/src/utils/testing/vercel-invite-user.tsx
new file mode 100644
index 0000000000..4e5877b5c6
--- /dev/null
+++ b/packages/preview-server/src/utils/testing/vercel-invite-user.tsx
@@ -0,0 +1,160 @@
+import {
+ Body,
+ Button,
+ Column,
+ Container,
+ Head,
+ Heading,
+ Hr,
+ Html,
+ Img,
+ Link,
+ Preview,
+ pixelBasedPreset,
+ Row,
+ Section,
+ Tailwind,
+ Text,
+} from '@react-email/components';
+
+interface VercelInviteUserEmailProps {
+ username?: string;
+ userImage?: string;
+ invitedByUsername?: string;
+ invitedByEmail?: string;
+ teamName?: string;
+ teamImage?: string;
+ inviteLink?: string;
+ inviteFromIp?: string;
+ inviteFromLocation?: string;
+}
+
+const baseUrl = process.env.VERCEL_URL
+ ? `https://${process.env.VERCEL_URL}`
+ : '';
+
+export const VercelInviteUserEmail = ({
+ username,
+ userImage,
+ invitedByUsername,
+ invitedByEmail,
+ teamName,
+ teamImage,
+ inviteLink,
+ inviteFromIp,
+ inviteFromLocation,
+}: VercelInviteUserEmailProps) => {
+ const previewText = `Join ${invitedByUsername} on Vercel`;
+
+ return (
+
+
+
+
+ {previewText}
+
+
+
+
+
+ Join {teamName} on Vercel
+
+
+ Hello {username},
+
+
+ {invitedByUsername} (
+
+ {invitedByEmail}
+
+ ) has invited you to the {teamName} team on{' '}
+ Vercel.
+
+
+
+
+ or copy and paste this URL into your browser:{' '}
+
+ {inviteLink}
+
+
+
+
+ This invitation was intended for{' '}
+ {username}. This invite was
+ sent from {inviteFromIp}{' '}
+ located in{' '}
+ {inviteFromLocation}. If you
+ were not expecting this invitation, you can ignore this email. If
+ you are concerned about your account's safety, please reply to
+ this email to get in touch with us.
+
+
+
+
+
+ );
+};
+
+VercelInviteUserEmail.PreviewProps = {
+ username: 'alanturing',
+ userImage: `${baseUrl}/static/vercel-user.png`,
+ invitedByUsername: 'Alan',
+ invitedByEmail: 'alan.turing@example.com',
+ teamName: 'Enigma',
+ teamImage: `${baseUrl}/static/vercel-team.png`,
+ inviteLink: 'https://vercel.com',
+ inviteFromIp: '204.13.186.218',
+ inviteFromLocation: 'São Paulo, Brazil',
+} as VercelInviteUserEmailProps;
+
+export default VercelInviteUserEmail;
From 65b6b38a5b5578ae0787139df51c1443502502f7 Mon Sep 17 00:00:00 2001
From: gabriel miranda
Date: Fri, 3 Oct 2025 09:56:41 -0300
Subject: [PATCH 2/3] use local copy to test export
---
.../testing/emails/vercel-invite-user.tsx | 160 ++++++++++++++++++
.../src/commands/testing/export.spec.ts | 7 +-
2 files changed, 162 insertions(+), 5 deletions(-)
create mode 100644 packages/react-email/src/commands/testing/emails/vercel-invite-user.tsx
diff --git a/packages/react-email/src/commands/testing/emails/vercel-invite-user.tsx b/packages/react-email/src/commands/testing/emails/vercel-invite-user.tsx
new file mode 100644
index 0000000000..4e5877b5c6
--- /dev/null
+++ b/packages/react-email/src/commands/testing/emails/vercel-invite-user.tsx
@@ -0,0 +1,160 @@
+import {
+ Body,
+ Button,
+ Column,
+ Container,
+ Head,
+ Heading,
+ Hr,
+ Html,
+ Img,
+ Link,
+ Preview,
+ pixelBasedPreset,
+ Row,
+ Section,
+ Tailwind,
+ Text,
+} from '@react-email/components';
+
+interface VercelInviteUserEmailProps {
+ username?: string;
+ userImage?: string;
+ invitedByUsername?: string;
+ invitedByEmail?: string;
+ teamName?: string;
+ teamImage?: string;
+ inviteLink?: string;
+ inviteFromIp?: string;
+ inviteFromLocation?: string;
+}
+
+const baseUrl = process.env.VERCEL_URL
+ ? `https://${process.env.VERCEL_URL}`
+ : '';
+
+export const VercelInviteUserEmail = ({
+ username,
+ userImage,
+ invitedByUsername,
+ invitedByEmail,
+ teamName,
+ teamImage,
+ inviteLink,
+ inviteFromIp,
+ inviteFromLocation,
+}: VercelInviteUserEmailProps) => {
+ const previewText = `Join ${invitedByUsername} on Vercel`;
+
+ return (
+
+
+
+
+ {previewText}
+
+
+
+
+
+ Join {teamName} on Vercel
+
+
+ Hello {username},
+
+
+ {invitedByUsername} (
+
+ {invitedByEmail}
+
+ ) has invited you to the {teamName} team on{' '}
+ Vercel.
+
+
+
+
+ or copy and paste this URL into your browser:{' '}
+
+ {inviteLink}
+
+
+
+
+ This invitation was intended for{' '}
+ {username}. This invite was
+ sent from {inviteFromIp}{' '}
+ located in{' '}
+ {inviteFromLocation}. If you
+ were not expecting this invitation, you can ignore this email. If
+ you are concerned about your account's safety, please reply to
+ this email to get in touch with us.
+
+
+
+
+
+ );
+};
+
+VercelInviteUserEmail.PreviewProps = {
+ username: 'alanturing',
+ userImage: `${baseUrl}/static/vercel-user.png`,
+ invitedByUsername: 'Alan',
+ invitedByEmail: 'alan.turing@example.com',
+ teamName: 'Enigma',
+ teamImage: `${baseUrl}/static/vercel-team.png`,
+ inviteLink: 'https://vercel.com',
+ inviteFromIp: '204.13.186.218',
+ inviteFromLocation: 'São Paulo, Brazil',
+} as VercelInviteUserEmailProps;
+
+export default VercelInviteUserEmail;
diff --git a/packages/react-email/src/commands/testing/export.spec.ts b/packages/react-email/src/commands/testing/export.spec.ts
index 98a2731696..0f688b30ab 100644
--- a/packages/react-email/src/commands/testing/export.spec.ts
+++ b/packages/react-email/src/commands/testing/export.spec.ts
@@ -3,10 +3,7 @@ import path from 'node:path';
import { exportTemplates } from '../export.js';
test('email export', { retry: 3 }, async () => {
- const pathToEmailsDirectory = path.resolve(
- __dirname,
- '../../../../../apps/demo/emails',
- );
+ const pathToEmailsDirectory = path.resolve(__dirname, './emails');
const pathToDumpMarkup = path.resolve(__dirname, './out');
await exportTemplates(pathToDumpMarkup, pathToEmailsDirectory, {
silent: true,
@@ -16,7 +13,7 @@ test('email export', { retry: 3 }, async () => {
expect(fs.existsSync(pathToDumpMarkup)).toBe(true);
expect(
await fs.promises.readFile(
- path.resolve(pathToDumpMarkup, './notifications/vercel-invite-user.html'),
+ path.resolve(pathToDumpMarkup, './vercel-invite-user.html'),
'utf8',
),
).toMatchSnapshot();
From 4b33f86e557b8d134f6bfda24ce140d4ef0b2349 Mon Sep 17 00:00:00 2001
From: gabriel miranda
Date: Fri, 3 Oct 2025 09:59:12 -0300
Subject: [PATCH 3/3] lint
---
.../preview-server/src/utils/get-email-component.spec.ts | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/packages/preview-server/src/utils/get-email-component.spec.ts b/packages/preview-server/src/utils/get-email-component.spec.ts
index b6db748b21..24e5e7af31 100644
--- a/packages/preview-server/src/utils/get-email-component.spec.ts
+++ b/packages/preview-server/src/utils/get-email-component.spec.ts
@@ -17,10 +17,7 @@ describe('getEmailComponent()', () => {
test('with a demo email template', async () => {
const result = await getEmailComponent(
- path.resolve(
- __dirname,
- './testing/vercel-invite-user.tsx',
- ),
+ path.resolve(__dirname, './testing/vercel-invite-user.tsx'),
path.resolve(__dirname, '../../jsx-runtime'),
);