@tracked/emails 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/dist/emails/bodyweight-goal-reached.d.ts +14 -0
- package/dist/emails/bodyweight-goal-reached.d.ts.map +1 -0
- package/dist/emails/bodyweight-goal-reached.js +177 -0
- package/dist/emails/bodyweight-goal-reached.js.map +1 -0
- package/dist/emails/client-accepted-invitation.d.ts +10 -0
- package/dist/emails/client-accepted-invitation.d.ts.map +1 -0
- package/dist/emails/client-accepted-invitation.js +99 -0
- package/dist/emails/client-accepted-invitation.js.map +1 -0
- package/dist/emails/coach-invite.d.ts +10 -0
- package/dist/emails/coach-invite.d.ts.map +1 -0
- package/dist/emails/coach-invite.js +126 -0
- package/dist/emails/coach-invite.js.map +1 -0
- package/dist/emails/coach-removed-client.d.ts +8 -0
- package/dist/emails/coach-removed-client.d.ts.map +1 -0
- package/dist/emails/coach-removed-client.js +80 -0
- package/dist/emails/coach-removed-client.js.map +1 -0
- package/dist/emails/direct-message.d.ts +11 -0
- package/dist/emails/direct-message.d.ts.map +1 -0
- package/dist/emails/direct-message.js +103 -0
- package/dist/emails/direct-message.js.map +1 -0
- package/dist/emails/feature-discovery.d.ts +11 -0
- package/dist/emails/feature-discovery.d.ts.map +1 -0
- package/dist/emails/feature-discovery.js +121 -0
- package/dist/emails/feature-discovery.js.map +1 -0
- package/dist/emails/first-workout-assigned.d.ts +10 -0
- package/dist/emails/first-workout-assigned.d.ts.map +1 -0
- package/dist/emails/first-workout-assigned.js +98 -0
- package/dist/emails/first-workout-assigned.js.map +1 -0
- package/dist/emails/first-workout-completed.d.ts +11 -0
- package/dist/emails/first-workout-completed.d.ts.map +1 -0
- package/dist/emails/first-workout-completed.js +129 -0
- package/dist/emails/first-workout-completed.js.map +1 -0
- package/dist/emails/index.d.ts +7 -0
- package/dist/emails/index.d.ts.map +1 -0
- package/dist/emails/index.js +7 -0
- package/dist/emails/index.js.map +1 -0
- package/dist/emails/new-follower.d.ts +11 -0
- package/dist/emails/new-follower.d.ts.map +1 -0
- package/dist/emails/new-follower.js +98 -0
- package/dist/emails/new-follower.js.map +1 -0
- package/dist/emails/subscription-canceled.d.ts +10 -0
- package/dist/emails/subscription-canceled.d.ts.map +1 -0
- package/dist/emails/subscription-canceled.js +131 -0
- package/dist/emails/subscription-canceled.js.map +1 -0
- package/dist/emails/support-email.d.ts +8 -0
- package/dist/emails/support-email.d.ts.map +1 -0
- package/dist/emails/support-email.js +40 -0
- package/dist/emails/support-email.js.map +1 -0
- package/dist/emails/team-invite.d.ts +11 -0
- package/dist/emails/team-invite.d.ts.map +1 -0
- package/dist/emails/team-invite.js +100 -0
- package/dist/emails/team-invite.js.map +1 -0
- package/dist/emails/team-member-removed-email.d.ts +8 -0
- package/dist/emails/team-member-removed-email.d.ts.map +1 -0
- package/dist/emails/team-member-removed-email.js +97 -0
- package/dist/emails/team-member-removed-email.js.map +1 -0
- package/dist/emails/tracked-magic-link-activate.d.ts +7 -0
- package/dist/emails/tracked-magic-link-activate.d.ts.map +1 -0
- package/dist/emails/tracked-magic-link-activate.js +93 -0
- package/dist/emails/tracked-magic-link-activate.js.map +1 -0
- package/dist/emails/tracked-magic-link.d.ts +7 -0
- package/dist/emails/tracked-magic-link.d.ts.map +1 -0
- package/dist/emails/tracked-magic-link.js +101 -0
- package/dist/emails/tracked-magic-link.js.map +1 -0
- package/dist/emails/week-one-checkin.d.ts +10 -0
- package/dist/emails/week-one-checkin.d.ts.map +1 -0
- package/dist/emails/week-one-checkin.js +141 -0
- package/dist/emails/week-one-checkin.js.map +1 -0
- package/dist/emails/welcome.d.ts +8 -0
- package/dist/emails/welcome.d.ts.map +1 -0
- package/dist/emails/welcome.js +146 -0
- package/dist/emails/welcome.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/email-validation.d.ts +48 -0
- package/dist/utils/email-validation.d.ts.map +1 -0
- package/dist/utils/email-validation.js +72 -0
- package/dist/utils/email-validation.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/username-validation.d.ts +54 -0
- package/dist/utils/username-validation.d.ts.map +1 -0
- package/dist/utils/username-validation.js +76 -0
- package/dist/utils/username-validation.js.map +1 -0
- package/package.json +78 -0
- package/src/emails/bodyweight-goal-reached.tsx +396 -0
- package/src/emails/client-accepted-invitation.tsx +258 -0
- package/src/emails/coach-invite.tsx +270 -0
- package/src/emails/coach-removed-client.tsx +212 -0
- package/src/emails/direct-message.tsx +249 -0
- package/src/emails/feature-discovery.tsx +289 -0
- package/src/emails/first-workout-assigned.tsx +255 -0
- package/src/emails/first-workout-completed.tsx +312 -0
- package/src/emails/index.tsx +6 -0
- package/src/emails/new-follower.tsx +260 -0
- package/src/emails/subscription-canceled.tsx +311 -0
- package/src/emails/support-email.tsx +80 -0
- package/src/emails/team-invite.tsx +262 -0
- package/src/emails/team-member-removed-email.tsx +240 -0
- package/src/emails/tracked-magic-link-activate.tsx +252 -0
- package/src/emails/tracked-magic-link.tsx +264 -0
- package/src/emails/week-one-checkin.tsx +353 -0
- package/src/emails/welcome.tsx +341 -0
- package/src/index.ts +57 -0
- package/src/utils/email-validation.test.ts +78 -0
- package/src/utils/email-validation.ts +80 -0
- package/src/utils/index.ts +13 -0
- package/src/utils/username-validation.test.ts +118 -0
- package/src/utils/username-validation.ts +89 -0
- package/static/tracked-logo.png +0 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Body, Column, Container, Head, Hr, Html, Img, Link, Preview, Row, Section, Text, } from "@react-email/components";
|
|
3
|
+
const baseUrl = "https://tracked.gg/android-chrome-192x192.png";
|
|
4
|
+
export const WeekOneCheckinEmail = ({ userName, workoutsCompleted, appUrl, supportUrl, websiteUrl = "https://tracked.gg", }) => {
|
|
5
|
+
const isActive = workoutsCompleted > 0;
|
|
6
|
+
return (_jsxs(Html, { children: [_jsxs(Head, { children: [_jsx("meta", { name: "color-scheme", content: "light only" }), _jsx("meta", { name: "supported-color-schemes", content: "light only" })] }), _jsx(Preview, { children: "How's your first week on Tracked going?" }), _jsx(Body, { style: main, children: _jsx(Container, { style: container, children: _jsxs(Section, { style: box, children: [_jsxs(Row, { style: { marginBottom: "8px" }, children: [_jsx(Column, { style: { width: "auto", verticalAlign: "middle" }, children: _jsx(Img, { src: `${baseUrl}`, width: "28", height: "28", alt: "Tracked" }) }), _jsx(Column, { style: {
|
|
7
|
+
width: "auto",
|
|
8
|
+
verticalAlign: "middle",
|
|
9
|
+
paddingLeft: "4px",
|
|
10
|
+
}, children: _jsx(Text, { style: {
|
|
11
|
+
fontSize: "28px",
|
|
12
|
+
fontWeight: "900",
|
|
13
|
+
fontFamily: "Raleway, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
|
|
14
|
+
color: "#020617",
|
|
15
|
+
margin: "0",
|
|
16
|
+
lineHeight: "32px",
|
|
17
|
+
letterSpacing: "0.5px",
|
|
18
|
+
}, children: "TRACKED" }) })] }), _jsx(Hr, { style: hr }), _jsx(Text, { style: heading, children: "Week One Check-In" }), isActive ? (_jsxs(_Fragment, { children: [_jsxs(Text, { style: paragraph, children: ["Hi ", userName, ", you've been on Tracked for a week now and we wanted to check in!"] }), _jsxs(Section, { style: statsBox, children: [_jsx(Text, { style: statsHeading, children: "Your First Week:" }), _jsxs(Text, { style: statsText, children: [_jsx("strong", { children: "Workouts Logged:" }), " ", workoutsCompleted] }), _jsx(Text, { style: { ...statsText, marginTop: "8px" }, children: workoutsCompleted >= 3
|
|
19
|
+
? "🔥 Great start! You're building strong habits."
|
|
20
|
+
: "💪 Good progress! Try to aim for 3-4 workouts per week." })] }), _jsx(Text, { style: paragraph, children: "Consistency is the key to reaching your fitness goals. Keep up the momentum and remember - every workout counts!" })] })) : (_jsxs(_Fragment, { children: [_jsxs(Text, { style: paragraph, children: ["Hi ", userName, ", you joined Tracked a week ago, and we noticed you haven't logged your first workout yet."] }), _jsxs(Section, { style: encouragementBox, children: [_jsx(Text, { style: encouragementHeading, children: "Getting Started is Easy:" }), _jsxs("ul", { style: featureList, children: [_jsx("li", { style: featureItem, children: "Open the app and tap the \"+\" button" }), _jsx("li", { style: featureItem, children: "Select your exercises or create a custom workout" }), _jsx("li", { style: featureItem, children: "Track your sets, reps, and weight as you go" }), _jsx("li", { style: featureItem, children: "Complete your workout and see your progress!" })] })] }), _jsx(Text, { style: paragraph, children: "The hardest part is getting started. Once you log that first workout, you'll be on your way to building lasting fitness habits." })] })), _jsx("div", { style: {
|
|
21
|
+
marginTop: "24px",
|
|
22
|
+
marginBottom: "24px",
|
|
23
|
+
textAlign: "left",
|
|
24
|
+
}, children: _jsx("a", { href: appUrl, style: {
|
|
25
|
+
backgroundColor: "#0f172a",
|
|
26
|
+
borderRadius: "8px",
|
|
27
|
+
fontSize: "16px",
|
|
28
|
+
fontWeight: "bold",
|
|
29
|
+
textDecoration: "none",
|
|
30
|
+
padding: "12px 32px",
|
|
31
|
+
display: "inline-block",
|
|
32
|
+
}, children: _jsx("span", { style: { color: "#ffffff", textDecoration: "none" }, children: isActive ? "Continue Your Journey" : "Log Your First Workout" }) }) }), _jsxs(Section, { style: tipBox, children: [_jsx(Text, { style: tipHeading, children: "Need Help?" }), _jsxs(Text, { style: tipText, children: ["Our support team is here to help you get the most out of Tracked.", supportUrl && (_jsxs(_Fragment, { children: [" ", _jsx(Link, { href: supportUrl, style: { color: "#4ade80", textDecoration: "underline" }, children: "Contact us" }), " ", "anytime with questions."] }))] })] }), _jsx("div", { style: {
|
|
33
|
+
textAlign: "left",
|
|
34
|
+
margin: "24px 0",
|
|
35
|
+
}, children: _jsx("a", { href: "https://www.discord.gg/trackedgg", style: {
|
|
36
|
+
backgroundColor: "#5865F2",
|
|
37
|
+
borderRadius: "8px",
|
|
38
|
+
fontSize: "16px",
|
|
39
|
+
fontWeight: "bold",
|
|
40
|
+
textDecoration: "none",
|
|
41
|
+
padding: "12px 32px",
|
|
42
|
+
display: "inline-block",
|
|
43
|
+
}, children: _jsx("span", { style: { color: "#ffffff", textDecoration: "none" }, children: "Join our Discord Community" }) }) }), _jsx(Hr, { style: hr }), _jsxs(Text, { style: footer, children: ["Copyright \u00A9 Tracked Training Platform Inc. ", _jsx("br", {}), " 9101 Horne Street, Vancouver, BC"] }), _jsxs(Container, { children: [_jsx(Link, { href: `${websiteUrl}/terms`, style: { ...footer, paddingRight: 10 }, children: "Terms" }), _jsx(Link, { style: { ...footer, paddingRight: 10 }, children: " | " }), _jsx(Link, { href: `${websiteUrl}/privacy`, style: { ...footer, paddingRight: 10 }, children: "Privacy" }), _jsx(Link, { style: { ...footer, paddingRight: 10 }, children: " | " }), _jsx(Link, { href: `${websiteUrl}/support`, style: { ...footer, paddingRight: 10 }, children: "Support" })] }), _jsx(Text, { style: footer, children: "This is a service notification by the Tracked Training Platform." })] }) }) })] }));
|
|
44
|
+
};
|
|
45
|
+
const main = {
|
|
46
|
+
backgroundColor: "#020617", // slate-950
|
|
47
|
+
fontFamily: '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Ubuntu,sans-serif',
|
|
48
|
+
};
|
|
49
|
+
const container = {
|
|
50
|
+
backgroundColor: "#020617", // slate-950
|
|
51
|
+
margin: "0 auto",
|
|
52
|
+
padding: "20px 0 48px",
|
|
53
|
+
marginBottom: "64px",
|
|
54
|
+
borderRadius: "8px",
|
|
55
|
+
};
|
|
56
|
+
const box = {
|
|
57
|
+
padding: "0 24px",
|
|
58
|
+
};
|
|
59
|
+
const hr = {
|
|
60
|
+
borderColor: "#4ade80", // green-400
|
|
61
|
+
margin: "24px 0",
|
|
62
|
+
borderWidth: "1px",
|
|
63
|
+
};
|
|
64
|
+
const paragraph = {
|
|
65
|
+
color: "#ffffff", // white
|
|
66
|
+
fontSize: "16px",
|
|
67
|
+
lineHeight: "24px",
|
|
68
|
+
textAlign: "left",
|
|
69
|
+
};
|
|
70
|
+
const heading = {
|
|
71
|
+
color: "#ffffff", // white
|
|
72
|
+
fontSize: "24px",
|
|
73
|
+
lineHeight: "32px",
|
|
74
|
+
fontWeight: "bold",
|
|
75
|
+
marginBottom: "16px",
|
|
76
|
+
};
|
|
77
|
+
const statsBox = {
|
|
78
|
+
backgroundColor: "#1e293b",
|
|
79
|
+
padding: "16px 24px",
|
|
80
|
+
borderRadius: "8px",
|
|
81
|
+
margin: "24px 0",
|
|
82
|
+
borderLeft: "4px solid #4ade80",
|
|
83
|
+
};
|
|
84
|
+
const statsHeading = {
|
|
85
|
+
color: "#4ade80",
|
|
86
|
+
fontSize: "16px",
|
|
87
|
+
fontWeight: "bold",
|
|
88
|
+
marginBottom: "12px",
|
|
89
|
+
};
|
|
90
|
+
const statsText = {
|
|
91
|
+
color: "#e2e8f0",
|
|
92
|
+
fontSize: "14px",
|
|
93
|
+
lineHeight: "24px",
|
|
94
|
+
marginBottom: "4px",
|
|
95
|
+
};
|
|
96
|
+
const encouragementBox = {
|
|
97
|
+
backgroundColor: "#1e293b",
|
|
98
|
+
padding: "16px 24px",
|
|
99
|
+
borderRadius: "8px",
|
|
100
|
+
margin: "24px 0",
|
|
101
|
+
};
|
|
102
|
+
const encouragementHeading = {
|
|
103
|
+
color: "#ffffff",
|
|
104
|
+
fontSize: "16px",
|
|
105
|
+
fontWeight: "bold",
|
|
106
|
+
marginBottom: "12px",
|
|
107
|
+
};
|
|
108
|
+
const featureList = {
|
|
109
|
+
margin: "0",
|
|
110
|
+
paddingLeft: "20px",
|
|
111
|
+
};
|
|
112
|
+
const featureItem = {
|
|
113
|
+
color: "#e2e8f0",
|
|
114
|
+
fontSize: "14px",
|
|
115
|
+
lineHeight: "24px",
|
|
116
|
+
marginBottom: "8px",
|
|
117
|
+
};
|
|
118
|
+
const tipBox = {
|
|
119
|
+
backgroundColor: "#1e293b",
|
|
120
|
+
padding: "16px 24px",
|
|
121
|
+
borderRadius: "8px",
|
|
122
|
+
margin: "24px 0",
|
|
123
|
+
};
|
|
124
|
+
const tipHeading = {
|
|
125
|
+
color: "#4ade80",
|
|
126
|
+
fontSize: "14px",
|
|
127
|
+
fontWeight: "bold",
|
|
128
|
+
marginBottom: "8px",
|
|
129
|
+
};
|
|
130
|
+
const tipText = {
|
|
131
|
+
color: "#e2e8f0",
|
|
132
|
+
fontSize: "14px",
|
|
133
|
+
lineHeight: "20px",
|
|
134
|
+
};
|
|
135
|
+
const footer = {
|
|
136
|
+
color: "#94a3b8", // slate-400 for subtle footer text
|
|
137
|
+
fontSize: "12px",
|
|
138
|
+
lineHeight: "16px",
|
|
139
|
+
};
|
|
140
|
+
export default WeekOneCheckinEmail;
|
|
141
|
+
//# sourceMappingURL=week-one-checkin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"week-one-checkin.js","sourceRoot":"","sources":["../../src/emails/week-one-checkin.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface WelcomeEmailProps {
|
|
2
|
+
userName: string;
|
|
3
|
+
appUrl: string;
|
|
4
|
+
websiteUrl: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const WelcomeEmail: ({ userName, appUrl, websiteUrl, }: WelcomeEmailProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default WelcomeEmail;
|
|
8
|
+
//# sourceMappingURL=welcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/emails/welcome.tsx"],"names":[],"mappings":"AAiBA,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,eAAO,MAAM,YAAY,GAAI,mCAI1B,iBAAiB,4CA2LnB,CAAC;AA4HF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Body, Button, Column, Container, Head, Hr, Html, Img, Link, Preview, Row, Section, Text, } from "@react-email/components";
|
|
3
|
+
const baseUrl = "https://tracked.gg/android-chrome-192x192.png";
|
|
4
|
+
export const WelcomeEmail = ({ userName, appUrl, websiteUrl = "https://tracked.gg", }) => {
|
|
5
|
+
return (_jsxs(Html, { children: [_jsxs(Head, { children: [_jsx("meta", { name: "color-scheme", content: "light only" }), _jsx("meta", { name: "supported-color-schemes", content: "light only" })] }), _jsx(Preview, { children: "Welcome to Tracked - Let's start your fitness journey!" }), _jsx(Body, { style: main, children: _jsx(Container, { style: container, children: _jsxs(Section, { style: box, children: [_jsxs(Row, { style: { marginBottom: "8px" }, children: [_jsx(Column, { style: { width: "auto", verticalAlign: "middle" }, children: _jsx(Img, { src: `${baseUrl}`, width: "28", height: "28", alt: "Tracked" }) }), _jsx(Column, { style: {
|
|
6
|
+
width: "auto",
|
|
7
|
+
verticalAlign: "middle",
|
|
8
|
+
paddingLeft: "4px",
|
|
9
|
+
}, children: _jsx(Text, { style: {
|
|
10
|
+
fontSize: "28px",
|
|
11
|
+
fontWeight: "900",
|
|
12
|
+
fontFamily: "Raleway, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
|
|
13
|
+
color: "#020617",
|
|
14
|
+
margin: "0",
|
|
15
|
+
lineHeight: "32px",
|
|
16
|
+
letterSpacing: "0.5px",
|
|
17
|
+
}, children: "TRACKED" }) })] }), _jsx(Hr, { style: hr }), _jsx(Text, { style: heading, children: "Welcome to Tracked!" }), _jsxs(Text, { style: paragraph, children: ["Hi ", userName, ", we're excited to have you join our community. Tracked is here to help you achieve your training goals with powerful tracking tools."] }), _jsxs(Section, { style: featureBox, children: [_jsx(Text, { style: featureHeading, children: "What you can do with Tracked:" }), _jsxs("ul", { style: featureList, children: [_jsxs("li", { style: featureItem, children: [_jsx("strong", { children: "Track Workouts:" }), " Log your exercises, sets, and reps with the best tracking tools on the market."] }), _jsxs("li", { style: featureItem, children: [_jsx("strong", { children: "Monitor Progress:" }), " Visualize your strength gains and workout history"] }), _jsxs("li", { style: featureItem, children: [_jsx("strong", { children: "Stay Accountable:" }), " Share your journey with the community"] })] })] }), _jsx("div", { style: {
|
|
18
|
+
marginTop: "24px",
|
|
19
|
+
marginBottom: "24px",
|
|
20
|
+
textAlign: "left",
|
|
21
|
+
}, children: _jsx("a", { href: appUrl, style: {
|
|
22
|
+
backgroundColor: "#0f172a",
|
|
23
|
+
borderRadius: "8px",
|
|
24
|
+
fontSize: "16px",
|
|
25
|
+
fontWeight: "bold",
|
|
26
|
+
textDecoration: "none",
|
|
27
|
+
padding: "12px 32px",
|
|
28
|
+
display: "inline-block",
|
|
29
|
+
}, children: _jsx("span", { style: { color: "#ffffff", textDecoration: "none" }, children: "Open the App" }) }) }), _jsxs(Section, { style: tipBox, children: [_jsx(Text, { style: tipHeading, children: "Tip:" }), _jsx(Text, { style: tipText, children: "Consistency is key to seeing results, and we make it easy to track your progress every step of the way. Try your best to STAY IN THE GREEN!" })] }), _jsxs(Row, { style: row, children: [_jsx(Column, { style: column, children: _jsx(Button, { style: appButton, href: "https://apps.apple.com/app/tracked-training/id6450913418", children: _jsx(Img, { src: "https://cdn.trckd.ca/assets/app-store-black.png", alt: "Download on the App Store", style: img }) }) }), _jsx(Column, { style: column, children: _jsx(Button, { style: appButton, href: "https://play.google.com/store/apps/details?id=com.tracked.mobile", children: _jsx(Img, { src: "https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png", alt: "Google Play", style: img }) }) })] }), _jsx("div", { style: {
|
|
30
|
+
textAlign: "left",
|
|
31
|
+
margin: "24px 0",
|
|
32
|
+
}, children: _jsx("a", { href: "https://www.discord.gg/trackedgg", style: {
|
|
33
|
+
backgroundColor: "#5865F2",
|
|
34
|
+
borderRadius: "8px",
|
|
35
|
+
fontSize: "16px",
|
|
36
|
+
fontWeight: "bold",
|
|
37
|
+
textDecoration: "none",
|
|
38
|
+
padding: "12px 32px",
|
|
39
|
+
display: "inline-block",
|
|
40
|
+
}, children: _jsx("span", { style: { color: "#ffffff", textDecoration: "none" }, children: "Join our Discord Community" }) }) }), _jsx(Hr, { style: hr }), _jsxs(Text, { style: footer, children: ["Copyright \u00A9 Tracked Training Platform Inc. ", _jsx("br", {}), " 9101 Horne Street, Vancouver, BC"] }), _jsxs(Container, { children: [_jsx(Link, { href: `${websiteUrl}/terms`, style: { ...footer, paddingRight: 10 }, children: "Terms" }), _jsx(Link, { style: { ...footer, paddingRight: 10 }, children: " | " }), _jsx(Link, { href: `${websiteUrl}/privacy`, style: { ...footer, paddingRight: 10 }, children: "Privacy" }), _jsx(Link, { style: { ...footer, paddingRight: 10 }, children: " | " }), _jsx(Link, { href: `${websiteUrl}/support`, style: { ...footer, paddingRight: 10 }, children: "Support" })] }), _jsx(Text, { style: footer, children: "This is a service notification by the Tracked Training Platform." })] }) }) })] }));
|
|
41
|
+
};
|
|
42
|
+
const main = {
|
|
43
|
+
backgroundColor: "#020617", // slate-950
|
|
44
|
+
fontFamily: '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Ubuntu,sans-serif',
|
|
45
|
+
};
|
|
46
|
+
const container = {
|
|
47
|
+
backgroundColor: "#020617", // slate-950
|
|
48
|
+
margin: "0 auto",
|
|
49
|
+
padding: "20px 0 48px",
|
|
50
|
+
marginBottom: "64px",
|
|
51
|
+
borderRadius: "8px",
|
|
52
|
+
};
|
|
53
|
+
const box = {
|
|
54
|
+
padding: "0 24px",
|
|
55
|
+
};
|
|
56
|
+
const hr = {
|
|
57
|
+
borderColor: "#4ade80", // green-400
|
|
58
|
+
margin: "24px 0",
|
|
59
|
+
borderWidth: "1px",
|
|
60
|
+
};
|
|
61
|
+
const paragraph = {
|
|
62
|
+
color: "#ffffff", // white
|
|
63
|
+
fontSize: "16px",
|
|
64
|
+
lineHeight: "24px",
|
|
65
|
+
textAlign: "left",
|
|
66
|
+
};
|
|
67
|
+
const heading = {
|
|
68
|
+
color: "#ffffff", // white
|
|
69
|
+
fontSize: "24px",
|
|
70
|
+
lineHeight: "32px",
|
|
71
|
+
fontWeight: "bold",
|
|
72
|
+
marginBottom: "16px",
|
|
73
|
+
};
|
|
74
|
+
const featureBox = {
|
|
75
|
+
backgroundColor: "#1e293b",
|
|
76
|
+
padding: "16px 24px",
|
|
77
|
+
borderRadius: "8px",
|
|
78
|
+
margin: "24px 0",
|
|
79
|
+
};
|
|
80
|
+
const featureHeading = {
|
|
81
|
+
color: "#ffffff",
|
|
82
|
+
fontSize: "16px",
|
|
83
|
+
fontWeight: "bold",
|
|
84
|
+
marginBottom: "12px",
|
|
85
|
+
};
|
|
86
|
+
const featureList = {
|
|
87
|
+
margin: "0",
|
|
88
|
+
paddingLeft: "20px",
|
|
89
|
+
};
|
|
90
|
+
const featureItem = {
|
|
91
|
+
color: "#e2e8f0",
|
|
92
|
+
fontSize: "14px",
|
|
93
|
+
lineHeight: "24px",
|
|
94
|
+
marginBottom: "8px",
|
|
95
|
+
};
|
|
96
|
+
const tipBox = {
|
|
97
|
+
backgroundColor: "#1e293b",
|
|
98
|
+
padding: "16px 24px",
|
|
99
|
+
borderRadius: "8px",
|
|
100
|
+
margin: "24px 0",
|
|
101
|
+
borderLeft: "4px solid #4ade80",
|
|
102
|
+
};
|
|
103
|
+
const tipHeading = {
|
|
104
|
+
color: "#4ade80",
|
|
105
|
+
fontSize: "14px",
|
|
106
|
+
fontWeight: "bold",
|
|
107
|
+
};
|
|
108
|
+
const tipText = {
|
|
109
|
+
color: "#e2e8f0",
|
|
110
|
+
fontSize: "14px",
|
|
111
|
+
lineHeight: "20px",
|
|
112
|
+
};
|
|
113
|
+
const row = {
|
|
114
|
+
display: "flex",
|
|
115
|
+
flexDirection: "row",
|
|
116
|
+
};
|
|
117
|
+
const column = {
|
|
118
|
+
flex: "0 0 48%",
|
|
119
|
+
"@media (maxWidth: 600px)": {
|
|
120
|
+
flex: "0 0 100%",
|
|
121
|
+
marginBottom: "10px",
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
const img = {
|
|
125
|
+
maxWidth: "100%",
|
|
126
|
+
height: "auto",
|
|
127
|
+
};
|
|
128
|
+
const appButton = {
|
|
129
|
+
backgroundColor: "transparent",
|
|
130
|
+
borderRadius: "8px",
|
|
131
|
+
color: "#ffffff", // white
|
|
132
|
+
fontSize: "16px",
|
|
133
|
+
fontWeight: "bold",
|
|
134
|
+
textDecoration: "none",
|
|
135
|
+
textAlign: "center",
|
|
136
|
+
display: "block",
|
|
137
|
+
width: "100%",
|
|
138
|
+
maxWidth: "150px",
|
|
139
|
+
};
|
|
140
|
+
const footer = {
|
|
141
|
+
color: "#94a3b8", // slate-400 for subtle footer text
|
|
142
|
+
fontSize: "12px",
|
|
143
|
+
lineHeight: "16px",
|
|
144
|
+
};
|
|
145
|
+
export default WelcomeEmail;
|
|
146
|
+
//# sourceMappingURL=welcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/emails/welcome.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BodyweightGoalReachedEmail } from "./emails/bodyweight-goal-reached.js";
|
|
2
|
+
import { ClientAcceptedInvitationEmail } from "./emails/client-accepted-invitation.js";
|
|
3
|
+
import { CoachInviteEmail } from "./emails/coach-invite.js";
|
|
4
|
+
import { CoachRemovedClientEmail } from "./emails/coach-removed-client.js";
|
|
5
|
+
import { DirectMessageEmail } from "./emails/direct-message.js";
|
|
6
|
+
import { FeatureDiscoveryEmail } from "./emails/feature-discovery.js";
|
|
7
|
+
import { FirstWorkoutAssignedEmail } from "./emails/first-workout-assigned.js";
|
|
8
|
+
import { FirstWorkoutCompletedEmail } from "./emails/first-workout-completed.js";
|
|
9
|
+
import { NewFollowerEmail } from "./emails/new-follower.js";
|
|
10
|
+
import { SubscriptionCanceledEmail } from "./emails/subscription-canceled.js";
|
|
11
|
+
import { SupportEmail } from "./emails/support-email.js";
|
|
12
|
+
import { TeamInviteEmail } from "./emails/team-invite.js";
|
|
13
|
+
import { TeamMemberRemovedEmail } from "./emails/team-member-removed-email.js";
|
|
14
|
+
import { TrackedMagicLink } from "./emails/tracked-magic-link.js";
|
|
15
|
+
import { TrackedMagicLinkActivate } from "./emails/tracked-magic-link-activate.js";
|
|
16
|
+
import { WeekOneCheckinEmail } from "./emails/week-one-checkin.js";
|
|
17
|
+
import { WelcomeEmail } from "./emails/welcome.js";
|
|
18
|
+
import { isPrivateRelayEmail, isValidEmailFormat, shouldSendEmailTo } from "./utils/email-validation.js";
|
|
19
|
+
import { isAnonymousUsername, getSafeDisplayName } from "./utils/username-validation.js";
|
|
20
|
+
export { BodyweightGoalReachedEmail, ClientAcceptedInvitationEmail, CoachInviteEmail, CoachRemovedClientEmail, DirectMessageEmail, FeatureDiscoveryEmail, FirstWorkoutAssignedEmail, FirstWorkoutCompletedEmail, NewFollowerEmail, SubscriptionCanceledEmail, SupportEmail, TeamInviteEmail, TeamMemberRemovedEmail, TrackedMagicLink, TrackedMagicLinkActivate, WeekOneCheckinEmail, WelcomeEmail, };
|
|
21
|
+
export { isPrivateRelayEmail, isValidEmailFormat, shouldSendEmailTo, isAnonymousUsername, getSafeDisplayName, };
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,yBAAyB,EACzB,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,GACb,CAAC;AAGF,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BodyweightGoalReachedEmail } from "./emails/bodyweight-goal-reached.js";
|
|
2
|
+
import { ClientAcceptedInvitationEmail } from "./emails/client-accepted-invitation.js";
|
|
3
|
+
import { CoachInviteEmail } from "./emails/coach-invite.js";
|
|
4
|
+
import { CoachRemovedClientEmail } from "./emails/coach-removed-client.js";
|
|
5
|
+
import { DirectMessageEmail } from "./emails/direct-message.js";
|
|
6
|
+
import { FeatureDiscoveryEmail } from "./emails/feature-discovery.js";
|
|
7
|
+
import { FirstWorkoutAssignedEmail } from "./emails/first-workout-assigned.js";
|
|
8
|
+
import { FirstWorkoutCompletedEmail } from "./emails/first-workout-completed.js";
|
|
9
|
+
import { NewFollowerEmail } from "./emails/new-follower.js";
|
|
10
|
+
import { SubscriptionCanceledEmail } from "./emails/subscription-canceled.js";
|
|
11
|
+
import { SupportEmail } from "./emails/support-email.js";
|
|
12
|
+
import { TeamInviteEmail } from "./emails/team-invite.js";
|
|
13
|
+
import { TeamMemberRemovedEmail } from "./emails/team-member-removed-email.js";
|
|
14
|
+
import { TrackedMagicLink } from "./emails/tracked-magic-link.js";
|
|
15
|
+
import { TrackedMagicLinkActivate } from "./emails/tracked-magic-link-activate.js";
|
|
16
|
+
import { WeekOneCheckinEmail } from "./emails/week-one-checkin.js";
|
|
17
|
+
import { WelcomeEmail } from "./emails/welcome.js";
|
|
18
|
+
// Import validation utilities
|
|
19
|
+
import { isPrivateRelayEmail, isValidEmailFormat, shouldSendEmailTo, } from "./utils/email-validation.js";
|
|
20
|
+
import { isAnonymousUsername, getSafeDisplayName, } from "./utils/username-validation.js";
|
|
21
|
+
export { BodyweightGoalReachedEmail, ClientAcceptedInvitationEmail, CoachInviteEmail, CoachRemovedClientEmail, DirectMessageEmail, FeatureDiscoveryEmail, FirstWorkoutAssignedEmail, FirstWorkoutCompletedEmail, NewFollowerEmail, SubscriptionCanceledEmail, SupportEmail, TeamInviteEmail, TeamMemberRemovedEmail, TrackedMagicLink, TrackedMagicLinkActivate, WeekOneCheckinEmail, WelcomeEmail, };
|
|
22
|
+
// Export validation utilities
|
|
23
|
+
export { isPrivateRelayEmail, isValidEmailFormat, shouldSendEmailTo, isAnonymousUsername, getSafeDisplayName, };
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,8BAA8B;AAC9B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,yBAAyB,EACzB,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,GACb,CAAC;AAEF,8BAA8B;AAC9B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles validation for email addresses to determine if we should send emails.
|
|
5
|
+
* This includes filtering out private relay emails and validating email formats.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if email is from a private relay service
|
|
9
|
+
*
|
|
10
|
+
* Apple's "Hide My Email" feature creates forwarding addresses like:
|
|
11
|
+
* - 6g65mj8rd5@privaterelay.appleid.com
|
|
12
|
+
* - user@icloud.com (when using Hide My Email)
|
|
13
|
+
*
|
|
14
|
+
* Note: These emails ARE technically deliverable (Apple forwards them),
|
|
15
|
+
* but we may want to skip them for privacy/marketing reasons.
|
|
16
|
+
*
|
|
17
|
+
* @param email - The email address to check
|
|
18
|
+
* @returns true if the email is from a private relay service
|
|
19
|
+
*/
|
|
20
|
+
export declare function isPrivateRelayEmail(email: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Validate basic email format
|
|
23
|
+
*
|
|
24
|
+
* @param email - The email address to validate
|
|
25
|
+
* @returns true if the email has a valid format
|
|
26
|
+
*/
|
|
27
|
+
export declare function isValidEmailFormat(email: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Determine if we should send emails to this address
|
|
30
|
+
*
|
|
31
|
+
* This is the main function to use when deciding whether to send an email.
|
|
32
|
+
* It checks for:
|
|
33
|
+
* - Null/undefined emails
|
|
34
|
+
* - Private relay emails (Apple Hide My Email)
|
|
35
|
+
* - Invalid email formats
|
|
36
|
+
*
|
|
37
|
+
* @param email - The email address to check
|
|
38
|
+
* @returns true if we should send emails to this address
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* if (shouldSendEmailTo(user.email)) {
|
|
43
|
+
* await sendWelcomeEmail(user.email);
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function shouldSendEmailTo(email: string | null | undefined): boolean;
|
|
48
|
+
//# sourceMappingURL=email-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-validation.d.ts","sourceRoot":"","sources":["../../src/utils/email-validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAS1D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAiB3E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles validation for email addresses to determine if we should send emails.
|
|
5
|
+
* This includes filtering out private relay emails and validating email formats.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if email is from a private relay service
|
|
9
|
+
*
|
|
10
|
+
* Apple's "Hide My Email" feature creates forwarding addresses like:
|
|
11
|
+
* - 6g65mj8rd5@privaterelay.appleid.com
|
|
12
|
+
* - user@icloud.com (when using Hide My Email)
|
|
13
|
+
*
|
|
14
|
+
* Note: These emails ARE technically deliverable (Apple forwards them),
|
|
15
|
+
* but we may want to skip them for privacy/marketing reasons.
|
|
16
|
+
*
|
|
17
|
+
* @param email - The email address to check
|
|
18
|
+
* @returns true if the email is from a private relay service
|
|
19
|
+
*/
|
|
20
|
+
export function isPrivateRelayEmail(email) {
|
|
21
|
+
const privateRelayPatterns = [
|
|
22
|
+
"@privaterelay.appleid.com",
|
|
23
|
+
// Note: @icloud.com can be real emails, only filter if it's clearly a relay
|
|
24
|
+
];
|
|
25
|
+
return privateRelayPatterns.some((pattern) => email.toLowerCase().includes(pattern));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Validate basic email format
|
|
29
|
+
*
|
|
30
|
+
* @param email - The email address to validate
|
|
31
|
+
* @returns true if the email has a valid format
|
|
32
|
+
*/
|
|
33
|
+
export function isValidEmailFormat(email) {
|
|
34
|
+
// Basic email regex: something@something.something
|
|
35
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
36
|
+
return emailRegex.test(email);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Determine if we should send emails to this address
|
|
40
|
+
*
|
|
41
|
+
* This is the main function to use when deciding whether to send an email.
|
|
42
|
+
* It checks for:
|
|
43
|
+
* - Null/undefined emails
|
|
44
|
+
* - Private relay emails (Apple Hide My Email)
|
|
45
|
+
* - Invalid email formats
|
|
46
|
+
*
|
|
47
|
+
* @param email - The email address to check
|
|
48
|
+
* @returns true if we should send emails to this address
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* if (shouldSendEmailTo(user.email)) {
|
|
53
|
+
* await sendWelcomeEmail(user.email);
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export function shouldSendEmailTo(email) {
|
|
58
|
+
// No email provided
|
|
59
|
+
if (!email) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
// Skip private relay emails
|
|
63
|
+
if (isPrivateRelayEmail(email)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
// Validate email format
|
|
67
|
+
if (!isValidEmailFormat(email)) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=email-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-validation.js","sourceRoot":"","sources":["../../src/utils/email-validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,oBAAoB,GAAG;QAC3B,2BAA2B;QAC3B,4EAA4E;KAC7E,CAAC;IAEF,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC3C,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CACtC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,mDAAmD;IACnD,MAAM,UAAU,GAAG,4BAA4B,CAAC;IAChD,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAgC;IAChE,oBAAoB;IACpB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4BAA4B;IAC5B,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email and Username Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Export all validation utilities for use across the application.
|
|
5
|
+
*/
|
|
6
|
+
export { isPrivateRelayEmail, isValidEmailFormat, shouldSendEmailTo, } from "./email-validation";
|
|
7
|
+
export { isAnonymousUsername, getSafeDisplayName } from "./username-validation";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email and Username Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Export all validation utilities for use across the application.
|
|
5
|
+
*/
|
|
6
|
+
export { isPrivateRelayEmail, isValidEmailFormat, shouldSendEmailTo, } from "./email-validation";
|
|
7
|
+
export { isAnonymousUsername, getSafeDisplayName } from "./username-validation";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Username Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles validation for usernames to determine if they're user-chosen or
|
|
5
|
+
* auto-generated UUIDs. Auto-generated usernames should not be displayed in emails.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if username is a generated UUID (not user-chosen)
|
|
9
|
+
*
|
|
10
|
+
* The database schema uses UUIDv7 as the default for usernames when users
|
|
11
|
+
* don't provide one. Format: 01944f9e-8e64-7a78-9e1e-3daba7b13e9f
|
|
12
|
+
*
|
|
13
|
+
* UUIDv7/v4 pattern: 8-4-4-4-12 hex characters separated by hyphens
|
|
14
|
+
*
|
|
15
|
+
* @param username - The username to check
|
|
16
|
+
* @returns true if the username is an auto-generated UUID
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* isAnonymousUsername("01944f9e-8e64-7a78-9e1e-3daba7b13e9f") // true
|
|
21
|
+
* isAnonymousUsername("john_doe") // false
|
|
22
|
+
* isAnonymousUsername(null) // true
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function isAnonymousUsername(username: string | null | undefined): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get safe display name for emails with intelligent fallback
|
|
28
|
+
*
|
|
29
|
+
* Tries to find a user-friendly display name by checking multiple sources
|
|
30
|
+
* in order of preference:
|
|
31
|
+
* 1. Real username (non-UUID)
|
|
32
|
+
* 2. Given name / First name
|
|
33
|
+
* 3. Full name
|
|
34
|
+
* 4. Generic fallback ("there")
|
|
35
|
+
*
|
|
36
|
+
* This ensures we never show auto-generated UUIDs in emails.
|
|
37
|
+
*
|
|
38
|
+
* @param username - The user's username (may be UUID)
|
|
39
|
+
* @param givenName - The user's first/given name
|
|
40
|
+
* @param name - The user's full name
|
|
41
|
+
* @param fallback - Default fallback if no good name is found (default: "there")
|
|
42
|
+
* @returns A safe, user-friendly display name
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* getSafeDisplayName("john_doe", "John", "John Doe") // "john_doe"
|
|
47
|
+
* getSafeDisplayName("01944f9e...", "John", "John Doe") // "John"
|
|
48
|
+
* getSafeDisplayName("01944f9e...", null, "John Doe") // "John Doe"
|
|
49
|
+
* getSafeDisplayName("01944f9e...", null, null) // "there"
|
|
50
|
+
* getSafeDisplayName(null, null, null, "friend") // "friend"
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function getSafeDisplayName(username: string | null | undefined, givenName: string | null | undefined, name: string | null | undefined, fallback?: string): string;
|
|
54
|
+
//# sourceMappingURL=username-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"username-validation.d.ts","sourceRoot":"","sources":["../../src/utils/username-validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,OAAO,CAST;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,QAAQ,GAAE,MAAgB,GACzB,MAAM,CAkBR"}
|