@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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +211 -0
  3. package/dist/emails/bodyweight-goal-reached.d.ts +14 -0
  4. package/dist/emails/bodyweight-goal-reached.d.ts.map +1 -0
  5. package/dist/emails/bodyweight-goal-reached.js +177 -0
  6. package/dist/emails/bodyweight-goal-reached.js.map +1 -0
  7. package/dist/emails/client-accepted-invitation.d.ts +10 -0
  8. package/dist/emails/client-accepted-invitation.d.ts.map +1 -0
  9. package/dist/emails/client-accepted-invitation.js +99 -0
  10. package/dist/emails/client-accepted-invitation.js.map +1 -0
  11. package/dist/emails/coach-invite.d.ts +10 -0
  12. package/dist/emails/coach-invite.d.ts.map +1 -0
  13. package/dist/emails/coach-invite.js +126 -0
  14. package/dist/emails/coach-invite.js.map +1 -0
  15. package/dist/emails/coach-removed-client.d.ts +8 -0
  16. package/dist/emails/coach-removed-client.d.ts.map +1 -0
  17. package/dist/emails/coach-removed-client.js +80 -0
  18. package/dist/emails/coach-removed-client.js.map +1 -0
  19. package/dist/emails/direct-message.d.ts +11 -0
  20. package/dist/emails/direct-message.d.ts.map +1 -0
  21. package/dist/emails/direct-message.js +103 -0
  22. package/dist/emails/direct-message.js.map +1 -0
  23. package/dist/emails/feature-discovery.d.ts +11 -0
  24. package/dist/emails/feature-discovery.d.ts.map +1 -0
  25. package/dist/emails/feature-discovery.js +121 -0
  26. package/dist/emails/feature-discovery.js.map +1 -0
  27. package/dist/emails/first-workout-assigned.d.ts +10 -0
  28. package/dist/emails/first-workout-assigned.d.ts.map +1 -0
  29. package/dist/emails/first-workout-assigned.js +98 -0
  30. package/dist/emails/first-workout-assigned.js.map +1 -0
  31. package/dist/emails/first-workout-completed.d.ts +11 -0
  32. package/dist/emails/first-workout-completed.d.ts.map +1 -0
  33. package/dist/emails/first-workout-completed.js +129 -0
  34. package/dist/emails/first-workout-completed.js.map +1 -0
  35. package/dist/emails/index.d.ts +7 -0
  36. package/dist/emails/index.d.ts.map +1 -0
  37. package/dist/emails/index.js +7 -0
  38. package/dist/emails/index.js.map +1 -0
  39. package/dist/emails/new-follower.d.ts +11 -0
  40. package/dist/emails/new-follower.d.ts.map +1 -0
  41. package/dist/emails/new-follower.js +98 -0
  42. package/dist/emails/new-follower.js.map +1 -0
  43. package/dist/emails/subscription-canceled.d.ts +10 -0
  44. package/dist/emails/subscription-canceled.d.ts.map +1 -0
  45. package/dist/emails/subscription-canceled.js +131 -0
  46. package/dist/emails/subscription-canceled.js.map +1 -0
  47. package/dist/emails/support-email.d.ts +8 -0
  48. package/dist/emails/support-email.d.ts.map +1 -0
  49. package/dist/emails/support-email.js +40 -0
  50. package/dist/emails/support-email.js.map +1 -0
  51. package/dist/emails/team-invite.d.ts +11 -0
  52. package/dist/emails/team-invite.d.ts.map +1 -0
  53. package/dist/emails/team-invite.js +100 -0
  54. package/dist/emails/team-invite.js.map +1 -0
  55. package/dist/emails/team-member-removed-email.d.ts +8 -0
  56. package/dist/emails/team-member-removed-email.d.ts.map +1 -0
  57. package/dist/emails/team-member-removed-email.js +97 -0
  58. package/dist/emails/team-member-removed-email.js.map +1 -0
  59. package/dist/emails/tracked-magic-link-activate.d.ts +7 -0
  60. package/dist/emails/tracked-magic-link-activate.d.ts.map +1 -0
  61. package/dist/emails/tracked-magic-link-activate.js +93 -0
  62. package/dist/emails/tracked-magic-link-activate.js.map +1 -0
  63. package/dist/emails/tracked-magic-link.d.ts +7 -0
  64. package/dist/emails/tracked-magic-link.d.ts.map +1 -0
  65. package/dist/emails/tracked-magic-link.js +101 -0
  66. package/dist/emails/tracked-magic-link.js.map +1 -0
  67. package/dist/emails/week-one-checkin.d.ts +10 -0
  68. package/dist/emails/week-one-checkin.d.ts.map +1 -0
  69. package/dist/emails/week-one-checkin.js +141 -0
  70. package/dist/emails/week-one-checkin.js.map +1 -0
  71. package/dist/emails/welcome.d.ts +8 -0
  72. package/dist/emails/welcome.d.ts.map +1 -0
  73. package/dist/emails/welcome.js +146 -0
  74. package/dist/emails/welcome.js.map +1 -0
  75. package/dist/index.d.ts +22 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +24 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/utils/email-validation.d.ts +48 -0
  80. package/dist/utils/email-validation.d.ts.map +1 -0
  81. package/dist/utils/email-validation.js +72 -0
  82. package/dist/utils/email-validation.js.map +1 -0
  83. package/dist/utils/index.d.ts +8 -0
  84. package/dist/utils/index.d.ts.map +1 -0
  85. package/dist/utils/index.js +8 -0
  86. package/dist/utils/index.js.map +1 -0
  87. package/dist/utils/username-validation.d.ts +54 -0
  88. package/dist/utils/username-validation.d.ts.map +1 -0
  89. package/dist/utils/username-validation.js +76 -0
  90. package/dist/utils/username-validation.js.map +1 -0
  91. package/package.json +78 -0
  92. package/src/emails/bodyweight-goal-reached.tsx +396 -0
  93. package/src/emails/client-accepted-invitation.tsx +258 -0
  94. package/src/emails/coach-invite.tsx +270 -0
  95. package/src/emails/coach-removed-client.tsx +212 -0
  96. package/src/emails/direct-message.tsx +249 -0
  97. package/src/emails/feature-discovery.tsx +289 -0
  98. package/src/emails/first-workout-assigned.tsx +255 -0
  99. package/src/emails/first-workout-completed.tsx +312 -0
  100. package/src/emails/index.tsx +6 -0
  101. package/src/emails/new-follower.tsx +260 -0
  102. package/src/emails/subscription-canceled.tsx +311 -0
  103. package/src/emails/support-email.tsx +80 -0
  104. package/src/emails/team-invite.tsx +262 -0
  105. package/src/emails/team-member-removed-email.tsx +240 -0
  106. package/src/emails/tracked-magic-link-activate.tsx +252 -0
  107. package/src/emails/tracked-magic-link.tsx +264 -0
  108. package/src/emails/week-one-checkin.tsx +353 -0
  109. package/src/emails/welcome.tsx +341 -0
  110. package/src/index.ts +57 -0
  111. package/src/utils/email-validation.test.ts +78 -0
  112. package/src/utils/email-validation.ts +80 -0
  113. package/src/utils/index.ts +13 -0
  114. package/src/utils/username-validation.test.ts +118 -0
  115. package/src/utils/username-validation.ts +89 -0
  116. 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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"}
@@ -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"}