create-zhx-monorepo 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/README.md +34 -0
- package/bin/index.js +65 -0
- package/package.json +18 -0
- package/templates/monorepo-starter/.vscode/settings.json +3 -0
- package/templates/monorepo-starter/README.md +42 -0
- package/templates/monorepo-starter/apps/web/components.json +20 -0
- package/templates/monorepo-starter/apps/web/eslint.config.mjs +4 -0
- package/templates/monorepo-starter/apps/web/next-env.d.ts +6 -0
- package/templates/monorepo-starter/apps/web/next.config.mjs +6 -0
- package/templates/monorepo-starter/apps/web/package.json +31 -0
- package/templates/monorepo-starter/apps/web/postcss.config.mjs +1 -0
- package/templates/monorepo-starter/apps/web/public/.gitkeep +0 -0
- package/templates/monorepo-starter/apps/web/sitemap.config.cjs +6 -0
- package/templates/monorepo-starter/apps/web/src/app/(auth)/layout.tsx +7 -0
- package/templates/monorepo-starter/apps/web/src/app/(root)/layout.tsx +15 -0
- package/templates/monorepo-starter/apps/web/src/app/(root)/page.tsx +14 -0
- package/templates/monorepo-starter/apps/web/src/app/globals.css +1 -0
- package/templates/monorepo-starter/apps/web/src/app/layout.tsx +24 -0
- package/templates/monorepo-starter/apps/web/src/components/Footer.tsx +9 -0
- package/templates/monorepo-starter/apps/web/src/components/Header.tsx +11 -0
- package/templates/monorepo-starter/apps/web/src/components/ThemeSwitch.tsx +34 -0
- package/templates/monorepo-starter/apps/web/src/hooks/.gitkeep +0 -0
- package/templates/monorepo-starter/apps/web/src/lib/.gitkeep +0 -0
- package/templates/monorepo-starter/apps/web/src/providers/index.tsx +10 -0
- package/templates/monorepo-starter/apps/web/src/providers/theme.tsx +19 -0
- package/templates/monorepo-starter/apps/web/src/types/index.d.ts +16 -0
- package/templates/monorepo-starter/apps/web/tsconfig.json +20 -0
- package/templates/monorepo-starter/eslint.config.mjs +12 -0
- package/templates/monorepo-starter/package.json +23 -0
- package/templates/monorepo-starter/packages/config/eslint/base.js +31 -0
- package/templates/monorepo-starter/packages/config/eslint/nest.js +26 -0
- package/templates/monorepo-starter/packages/config/eslint/next.js +39 -0
- package/templates/monorepo-starter/packages/config/eslint/react.js +30 -0
- package/templates/monorepo-starter/packages/config/package.json +32 -0
- package/templates/monorepo-starter/packages/config/typescript/base.json +31 -0
- package/templates/monorepo-starter/packages/config/typescript/nest.json +14 -0
- package/templates/monorepo-starter/packages/config/typescript/next.json +10 -0
- package/templates/monorepo-starter/packages/config/typescript/react.json +9 -0
- package/templates/monorepo-starter/packages/ui/components.json +20 -0
- package/templates/monorepo-starter/packages/ui/eslint.config.mjs +4 -0
- package/templates/monorepo-starter/packages/ui/package.json +38 -0
- package/templates/monorepo-starter/packages/ui/postcss.config.mjs +6 -0
- package/templates/monorepo-starter/packages/ui/src/components/button.tsx +71 -0
- package/templates/monorepo-starter/packages/ui/src/hooks/.gitkeep +0 -0
- package/templates/monorepo-starter/packages/ui/src/lib/utils.ts +6 -0
- package/templates/monorepo-starter/packages/ui/src/styles/globals.css +182 -0
- package/templates/monorepo-starter/packages/ui/tsconfig.json +13 -0
- package/templates/monorepo-starter/packages/ui/tsconfig.lint.json +8 -0
- package/templates/monorepo-starter/pnpm-lock.yaml +12441 -0
- package/templates/monorepo-starter/pnpm-workspace.yaml +17 -0
- package/templates/monorepo-starter/server/.env.example +64 -0
- package/templates/monorepo-starter/server/README.md +63 -0
- package/templates/monorepo-starter/server/eslint.config.mjs +4 -0
- package/templates/monorepo-starter/server/nest-cli.json +12 -0
- package/templates/monorepo-starter/server/package.json +97 -0
- package/templates/monorepo-starter/server/prisma/generated/browser.ts +54 -0
- package/templates/monorepo-starter/server/prisma/generated/client.ts +76 -0
- package/templates/monorepo-starter/server/prisma/generated/commonInputTypes.ts +577 -0
- package/templates/monorepo-starter/server/prisma/generated/enums.ts +68 -0
- package/templates/monorepo-starter/server/prisma/generated/internal/class.ts +250 -0
- package/templates/monorepo-starter/server/prisma/generated/internal/prismaNamespace.ts +1436 -0
- package/templates/monorepo-starter/server/prisma/generated/internal/prismaNamespaceBrowser.ts +227 -0
- package/templates/monorepo-starter/server/prisma/generated/models/BackupCode.ts +1375 -0
- package/templates/monorepo-starter/server/prisma/generated/models/Notification.ts +1587 -0
- package/templates/monorepo-starter/server/prisma/generated/models/Otp.ts +1488 -0
- package/templates/monorepo-starter/server/prisma/generated/models/RefreshToken.ts +1515 -0
- package/templates/monorepo-starter/server/prisma/generated/models/RoleAssignment.ts +1385 -0
- package/templates/monorepo-starter/server/prisma/generated/models/SecuritySetting.ts +1422 -0
- package/templates/monorepo-starter/server/prisma/generated/models/User.ts +2498 -0
- package/templates/monorepo-starter/server/prisma/generated/models.ts +18 -0
- package/templates/monorepo-starter/server/prisma/migrations/20251218164821_init/migration.sql +210 -0
- package/templates/monorepo-starter/server/prisma/migrations/migration_lock.toml +3 -0
- package/templates/monorepo-starter/server/prisma/schema.prisma +193 -0
- package/templates/monorepo-starter/server/prisma.config.ts +13 -0
- package/templates/monorepo-starter/server/scripts/generate.sh +14 -0
- package/templates/monorepo-starter/server/src/app.module.ts +49 -0
- package/templates/monorepo-starter/server/src/lib/decorators/logger.decorator.ts +20 -0
- package/templates/monorepo-starter/server/src/lib/decorators/public.decorator.ts +4 -0
- package/templates/monorepo-starter/server/src/lib/decorators/roles.decorator.ts +5 -0
- package/templates/monorepo-starter/server/src/lib/dto/auth.dto.ts +64 -0
- package/templates/monorepo-starter/server/src/lib/dto/security-setting.dto.ts +21 -0
- package/templates/monorepo-starter/server/src/lib/filters/exceptions.filter.ts +62 -0
- package/templates/monorepo-starter/server/src/lib/guards/auth.guard.ts +104 -0
- package/templates/monorepo-starter/server/src/lib/interceptors/response.interceptor.ts +33 -0
- package/templates/monorepo-starter/server/src/lib/pipes/validation.pipe.ts +7 -0
- package/templates/monorepo-starter/server/src/lib/schemas/env.schema.ts +99 -0
- package/templates/monorepo-starter/server/src/lib/utils/cookie.util.ts +23 -0
- package/templates/monorepo-starter/server/src/lib/utils/general.util.ts +24 -0
- package/templates/monorepo-starter/server/src/main.ts +41 -0
- package/templates/monorepo-starter/server/src/modules/auth/auth.controller.ts +74 -0
- package/templates/monorepo-starter/server/src/modules/auth/auth.module.ts +16 -0
- package/templates/monorepo-starter/server/src/modules/auth/auth.service.ts +525 -0
- package/templates/monorepo-starter/server/src/modules/auth/oauth.controller.ts +58 -0
- package/templates/monorepo-starter/server/src/modules/auth/oauth.service.ts +165 -0
- package/templates/monorepo-starter/server/src/modules/auth/otp.service.ts +133 -0
- package/templates/monorepo-starter/server/src/modules/auth/role.service.ts +99 -0
- package/templates/monorepo-starter/server/src/modules/auth/security-setting.service.ts +102 -0
- package/templates/monorepo-starter/server/src/modules/env/env.module.ts +9 -0
- package/templates/monorepo-starter/server/src/modules/env/env.service.ts +22 -0
- package/templates/monorepo-starter/server/src/modules/logger/logger.module.ts +12 -0
- package/templates/monorepo-starter/server/src/modules/logger/logger.service.ts +37 -0
- package/templates/monorepo-starter/server/src/modules/logger/winston.config.ts +32 -0
- package/templates/monorepo-starter/server/src/modules/notification/notification.module.ts +11 -0
- package/templates/monorepo-starter/server/src/modules/notification/notification.service.ts +118 -0
- package/templates/monorepo-starter/server/src/modules/prisma/prisma.extension.ts +72 -0
- package/templates/monorepo-starter/server/src/modules/prisma/prisma.module.ts +9 -0
- package/templates/monorepo-starter/server/src/modules/prisma/prisma.service.ts +49 -0
- package/templates/monorepo-starter/server/src/modules/public/public.controller.ts +21 -0
- package/templates/monorepo-starter/server/src/modules/public/public.module.ts +9 -0
- package/templates/monorepo-starter/server/src/modules/public/public.service.ts +30 -0
- package/templates/monorepo-starter/server/src/modules/scheduler/cleanup.service.ts +33 -0
- package/templates/monorepo-starter/server/src/modules/scheduler/scheduler.module.ts +7 -0
- package/templates/monorepo-starter/server/src/modules/template/template.module.ts +8 -0
- package/templates/monorepo-starter/server/src/modules/template/template.service.ts +33 -0
- package/templates/monorepo-starter/server/src/modules/token/token.module.ts +11 -0
- package/templates/monorepo-starter/server/src/modules/token/token.service.ts +131 -0
- package/templates/monorepo-starter/server/src/types/express.d.ts +10 -0
- package/templates/monorepo-starter/server/src/types/index.d.ts +13 -0
- package/templates/monorepo-starter/server/templates/notification.templates.ts +243 -0
- package/templates/monorepo-starter/server/test/app.e2e-spec.ts +25 -0
- package/templates/monorepo-starter/server/test/jest-e2e.json +9 -0
- package/templates/monorepo-starter/server/tsconfig.json +23 -0
- package/templates/monorepo-starter/server/tsup.config.ts +14 -0
- package/templates/monorepo-starter/tsconfig.json +3 -0
- package/templates/monorepo-starter/turbo.json +21 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import type { EnvService } from "@modules/env/env.service";
|
|
2
|
+
import type { Otp, User } from "@generated/prisma";
|
|
3
|
+
|
|
4
|
+
const baseStyles = `
|
|
5
|
+
font-family: Arial, sans-serif;
|
|
6
|
+
color: #222;
|
|
7
|
+
line-height: 1.6;
|
|
8
|
+
`;
|
|
9
|
+
|
|
10
|
+
const buttonStyles = `
|
|
11
|
+
display:inline-block;
|
|
12
|
+
padding:12px 20px;
|
|
13
|
+
background-color:#000;
|
|
14
|
+
color:#fff;
|
|
15
|
+
text-decoration:none;
|
|
16
|
+
border-radius:6px;
|
|
17
|
+
font-weight:bold;
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
const appName = "Evorii";
|
|
21
|
+
|
|
22
|
+
export interface TemplateProps {
|
|
23
|
+
user: User;
|
|
24
|
+
otp?: Otp;
|
|
25
|
+
identifier?: string;
|
|
26
|
+
newIdentifier?: string;
|
|
27
|
+
env?: EnvService;
|
|
28
|
+
message?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const signupTemplate = ({ user }: TemplateProps) => ({
|
|
32
|
+
subject: `🎉 Welcome to ${appName}, ${user.displayName}!`,
|
|
33
|
+
html: `
|
|
34
|
+
<div style="${baseStyles}">
|
|
35
|
+
<h1>Welcome to ${appName}, ${user.displayName}!</h1>
|
|
36
|
+
<p>We’re thrilled to have you join our creative community. Explore thoughtful, customizable gifts designed to express what truly matters.</p>
|
|
37
|
+
<p>If you ever need assistance, our support team is just an email away.</p>
|
|
38
|
+
<p>— The ${appName} Team</p>
|
|
39
|
+
</div>
|
|
40
|
+
`,
|
|
41
|
+
text: `Welcome to ${appName}, ${user.displayName}! Let's create something meaningful together.`,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export const signinTemplate = ({ user }: TemplateProps) => ({
|
|
45
|
+
subject: `🔐 Login Successful — ${appName}`,
|
|
46
|
+
html: `
|
|
47
|
+
<div style="${baseStyles}">
|
|
48
|
+
<h2>Hi ${user.displayName},</h2>
|
|
49
|
+
<p>You’ve successfully signed in to your ${appName} account.</p>
|
|
50
|
+
<p>If this wasn’t you, please <strong>reset your password</strong> immediately from your account settings.</p>
|
|
51
|
+
<p>Stay secure,<br/>The ${appName} Team</p>
|
|
52
|
+
</div>
|
|
53
|
+
`,
|
|
54
|
+
text: `Hi ${user.displayName}, you’ve logged in to ${appName}. If this wasn’t you, reset your password right away.`,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
export const setPasswordTemplate = ({
|
|
58
|
+
user,
|
|
59
|
+
otp,
|
|
60
|
+
identifier,
|
|
61
|
+
env,
|
|
62
|
+
}: TemplateProps) => {
|
|
63
|
+
const link = `${env?.get("CLIENT_ENDPOINT")}/set-password?identifier=${identifier}&purpose=${otp?.purpose}&secret=${otp?.secret}&type=${otp?.type}`;
|
|
64
|
+
return {
|
|
65
|
+
subject: `🔐 Set Up Your ${appName} Password`,
|
|
66
|
+
html: `
|
|
67
|
+
<div style="${baseStyles}">
|
|
68
|
+
<h2>Welcome, ${user.displayName}!</h2>
|
|
69
|
+
<p>Let’s get you set up. Click the button below to create your password and complete your account setup.</p>
|
|
70
|
+
<a href="${link}" style="${buttonStyles}">Set Password</a>
|
|
71
|
+
<p>If you didn’t request this, you can safely ignore this email.</p>
|
|
72
|
+
</div>
|
|
73
|
+
`,
|
|
74
|
+
text: `Hi ${user.displayName}, set your ${appName} password here: ${link}`,
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const resetPasswordTemplate = ({
|
|
79
|
+
user,
|
|
80
|
+
otp,
|
|
81
|
+
identifier,
|
|
82
|
+
env,
|
|
83
|
+
}: TemplateProps) => {
|
|
84
|
+
const link = `${env?.get("CLIENT_ENDPOINT")}/reset-password?identifier=${identifier}&purpose=${otp?.purpose}&secret=${otp?.secret}&type=${otp?.type}`;
|
|
85
|
+
return {
|
|
86
|
+
subject: `🔁 Reset Your ${appName} Password`,
|
|
87
|
+
html: `
|
|
88
|
+
<div style="${baseStyles}">
|
|
89
|
+
<h2>Hi ${user.displayName},</h2>
|
|
90
|
+
<p>We received a request to reset your ${appName} password for <strong>${identifier}</strong>.</p>
|
|
91
|
+
<p>Your one-time code: <strong>${otp?.secret}</strong></p>
|
|
92
|
+
<a href="${link}" style="${buttonStyles}">Reset Password</a>
|
|
93
|
+
<p>If you didn’t request this change, please ignore this message.</p>
|
|
94
|
+
</div>
|
|
95
|
+
`,
|
|
96
|
+
text: `Hi ${user.displayName}, your OTP: ${otp?.secret}. Reset your password here: ${link}`,
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export const verifyIdentifierTemplate = ({
|
|
101
|
+
user,
|
|
102
|
+
otp,
|
|
103
|
+
identifier,
|
|
104
|
+
env,
|
|
105
|
+
}: TemplateProps) => {
|
|
106
|
+
const link = `${env?.get("CLIENT_ENDPOINT")}/verify?identifier=${identifier}&purpose=${otp?.purpose}&secret=${otp?.secret}&type=${otp?.type}`;
|
|
107
|
+
return {
|
|
108
|
+
subject: `📧 Verify Your ${appName} Account`,
|
|
109
|
+
html: `
|
|
110
|
+
<div style="${baseStyles}">
|
|
111
|
+
<h2>Hi ${user.displayName},</h2>
|
|
112
|
+
<p>Welcome! Please verify your ${identifier?.includes("@") ? "email address" : "phone number"} to activate your ${appName} account.</p>
|
|
113
|
+
<p>Your verification code: <strong>${otp?.secret}</strong></p>
|
|
114
|
+
<a href="${link}" style="${buttonStyles}">Verify Now</a>
|
|
115
|
+
</div>
|
|
116
|
+
`,
|
|
117
|
+
text: `Hi ${user.displayName}, your OTP is ${otp?.secret}. Verify here: ${link}`,
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export const changeIdentifierTemplate = ({
|
|
122
|
+
user,
|
|
123
|
+
otp,
|
|
124
|
+
identifier,
|
|
125
|
+
newIdentifier,
|
|
126
|
+
env,
|
|
127
|
+
}: TemplateProps) => {
|
|
128
|
+
if (otp) {
|
|
129
|
+
// OTP exists → request confirmation phase
|
|
130
|
+
const link = `${env?.get("CLIENT_ENDPOINT")}/confirm-change?identifier=${newIdentifier}&purpose=${otp.purpose}&secret=${otp.secret}&type=${otp.type}`;
|
|
131
|
+
return {
|
|
132
|
+
subject: `📨 Confirm Change Request — ${appName}`,
|
|
133
|
+
html: `
|
|
134
|
+
<div style="${baseStyles}">
|
|
135
|
+
<h2>Hi ${user.displayName},</h2>
|
|
136
|
+
<p>We received a request to change your ${identifier?.includes("@") ? "email address" : "phone number"}.</p>
|
|
137
|
+
<p>Your one-time code: <strong>${otp.secret}</strong></p>
|
|
138
|
+
<a href="${link}" style="${buttonStyles}">Confirm Change</a>
|
|
139
|
+
<p>If you didn’t make this request, please secure your account immediately.</p>
|
|
140
|
+
</div>
|
|
141
|
+
`,
|
|
142
|
+
text: `Hi ${user.displayName}, OTP: ${otp.secret}. Confirm your change here: ${link}`,
|
|
143
|
+
};
|
|
144
|
+
} else {
|
|
145
|
+
// No OTP → confirmation phase
|
|
146
|
+
return {
|
|
147
|
+
subject: `✅ ${identifier?.includes("@") ? "Email" : "Phone"} Changed Successfully — ${appName}`,
|
|
148
|
+
html: `
|
|
149
|
+
<div style="${baseStyles}">
|
|
150
|
+
<h2>Hi ${user.displayName},</h2>
|
|
151
|
+
<p>Your ${identifier?.includes("@") ? "email address" : "phone number"} has been successfully updated to <strong>${newIdentifier}</strong>.</p>
|
|
152
|
+
<p>If this wasn’t you, please update your credentials immediately.</p>
|
|
153
|
+
</div>
|
|
154
|
+
`,
|
|
155
|
+
text: `Hi ${user.displayName}, your ${identifier?.includes("@") ? "email" : "phone"} has been updated to ${newIdentifier}.`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export const verifyMfaTemplate = ({ user, otp }: TemplateProps) => ({
|
|
161
|
+
subject: `📲 Your ${appName} 2FA Code`,
|
|
162
|
+
html: `
|
|
163
|
+
<div style="${baseStyles}">
|
|
164
|
+
<h2>Hi ${user.displayName},</h2>
|
|
165
|
+
<p>Your ${appName} two-factor authentication code is:</p>
|
|
166
|
+
<h3>${otp?.secret}</h3>
|
|
167
|
+
<p>This code expires shortly — do not share it with anyone.</p>
|
|
168
|
+
</div>
|
|
169
|
+
`,
|
|
170
|
+
text: `Hi ${user.displayName}, your 2FA code is ${otp?.secret}.`,
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
export const enableMfaTemplate = ({ user, otp }: TemplateProps) => {
|
|
174
|
+
if (otp) {
|
|
175
|
+
// OTP exists → request confirmation
|
|
176
|
+
return {
|
|
177
|
+
subject: `🔑 Enable 2FA — OTP Required (${appName})`,
|
|
178
|
+
html: `
|
|
179
|
+
<div style="${baseStyles}">
|
|
180
|
+
<h2>Hi ${user.displayName},</h2>
|
|
181
|
+
<p>Use the following code to enable 2FA for your ${appName} account:</p>
|
|
182
|
+
<h3>${otp.secret}</h3>
|
|
183
|
+
<p>It expires soon. Do not share this code.</p>
|
|
184
|
+
</div>
|
|
185
|
+
`,
|
|
186
|
+
text: `Hi ${user.displayName}, use OTP ${otp.secret} to enable 2FA.`,
|
|
187
|
+
};
|
|
188
|
+
} else {
|
|
189
|
+
// No OTP → success message
|
|
190
|
+
return {
|
|
191
|
+
subject: `✅ 2FA Enabled — ${appName}`,
|
|
192
|
+
html: `
|
|
193
|
+
<div style="${baseStyles}">
|
|
194
|
+
<h2>Hi ${user.displayName},</h2>
|
|
195
|
+
<p>You’ve successfully enabled two-factor authentication on your ${appName} account. Great job strengthening your security!</p>
|
|
196
|
+
</div>
|
|
197
|
+
`,
|
|
198
|
+
text: `Hi ${user.displayName}, 2FA has been enabled on your account.`,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
export const disableMfaTemplate = ({ user, otp }: TemplateProps) => {
|
|
204
|
+
if (otp) {
|
|
205
|
+
// OTP exists → confirmation needed
|
|
206
|
+
return {
|
|
207
|
+
subject: `🔑 Disable 2FA — OTP Required (${appName})`,
|
|
208
|
+
html: `
|
|
209
|
+
<div style="${baseStyles}">
|
|
210
|
+
<h2>Hi ${user.displayName},</h2>
|
|
211
|
+
<p>Use this code to disable 2FA on your ${appName} account:</p>
|
|
212
|
+
<h3>${otp.secret}</h3>
|
|
213
|
+
<p>If this wasn’t you, secure your account immediately.</p>
|
|
214
|
+
</div>
|
|
215
|
+
`,
|
|
216
|
+
text: `Hi ${user.displayName}, your OTP to disable 2FA is ${otp.secret}.`,
|
|
217
|
+
};
|
|
218
|
+
} else {
|
|
219
|
+
// No OTP → confirmation
|
|
220
|
+
return {
|
|
221
|
+
subject: `⚠️ 2FA Disabled — ${appName}`,
|
|
222
|
+
html: `
|
|
223
|
+
<div style="${baseStyles}">
|
|
224
|
+
<h2>Hi ${user.displayName},</h2>
|
|
225
|
+
<p>Two-factor authentication has been disabled on your ${appName} account. If this wasn’t you, please re-enable it immediately.</p>
|
|
226
|
+
</div>
|
|
227
|
+
`,
|
|
228
|
+
text: `Hi ${user.displayName}, 2FA has been disabled. If this wasn’t you, secure your account.`,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
export const securityAlertTemplate = ({ user, message }: TemplateProps) => ({
|
|
234
|
+
subject: `⚠️ Security Alert — ${appName}`,
|
|
235
|
+
html: `
|
|
236
|
+
<div style="${baseStyles}">
|
|
237
|
+
<h2>Hi ${user.displayName},</h2>
|
|
238
|
+
<p>${message}</p>
|
|
239
|
+
<p>If you suspect any suspicious activity, please change your password immediately.</p>
|
|
240
|
+
</div>
|
|
241
|
+
`,
|
|
242
|
+
text: `Hi ${user.displayName}, ${message}`,
|
|
243
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
+
import type{ INestApplication } from '@nestjs/common';
|
|
3
|
+
import request from 'supertest';
|
|
4
|
+
import type { App } from 'supertest/types';
|
|
5
|
+
import { AppModule } from '@/app.module';
|
|
6
|
+
|
|
7
|
+
describe('AppController (e2e)', () => {
|
|
8
|
+
let app: INestApplication<App>;
|
|
9
|
+
|
|
10
|
+
beforeEach(async () => {
|
|
11
|
+
const moduleFixture: TestingModule = await Test.createTestingModule({
|
|
12
|
+
imports: [AppModule],
|
|
13
|
+
}).compile();
|
|
14
|
+
|
|
15
|
+
app = moduleFixture.createNestApplication();
|
|
16
|
+
await app.init();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('/ (GET)', () => {
|
|
20
|
+
return request(app.getHttpServer())
|
|
21
|
+
.get('/')
|
|
22
|
+
.expect(200)
|
|
23
|
+
.expect('Hello World!');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "@workspace/config/typescript/nest",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"baseUrl": ".",
|
|
5
|
+
"outDir": "dist",
|
|
6
|
+
"paths": {
|
|
7
|
+
"@/*": ["src/*"],
|
|
8
|
+
"@modules/*" : ["src/modules/*"],
|
|
9
|
+
"@decorators/*": ["src/lib/decorators/*"],
|
|
10
|
+
"@dto/*": ["src/lib/dto/*"],
|
|
11
|
+
"@filters/*": ["src/lib/filters/*"],
|
|
12
|
+
"@guards/*": ["src/lib/guards/*"],
|
|
13
|
+
"@interceptors/*": ["src/lib/interceptors/*"],
|
|
14
|
+
"@pipes/*": ["src/lib/pipes/*"],
|
|
15
|
+
"@schemas/*": ["src/lib/schemas/*"],
|
|
16
|
+
"@templates/*": ["templates/*"],
|
|
17
|
+
"@utils/*": ["src/lib/utils/*"],
|
|
18
|
+
"@generated/prisma": ["./prisma/generated/client"]
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"include": ["**/*.ts"],
|
|
22
|
+
"exclude": ["node_modules", "dist"]
|
|
23
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineConfig } from "tsup";
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
entry: ["src/main.ts"],
|
|
5
|
+
outDir: "dist",
|
|
6
|
+
target: "es2022",
|
|
7
|
+
format: ["esm"],
|
|
8
|
+
splitting: false,
|
|
9
|
+
sourcemap: true,
|
|
10
|
+
clean: true,
|
|
11
|
+
dts: true,
|
|
12
|
+
minify: false,
|
|
13
|
+
onSuccess: "node dist/main.js",
|
|
14
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://turbo.build/schema.json",
|
|
3
|
+
"ui": "tui",
|
|
4
|
+
"tasks": {
|
|
5
|
+
"build": {
|
|
6
|
+
"dependsOn": ["^build"],
|
|
7
|
+
"inputs": ["$TURBO_DEFAULT$", ".env*"],
|
|
8
|
+
"outputs": [".next/**", "!.next/cache/**"]
|
|
9
|
+
},
|
|
10
|
+
"lint": {
|
|
11
|
+
"dependsOn": ["^lint"]
|
|
12
|
+
},
|
|
13
|
+
"check-types": {
|
|
14
|
+
"dependsOn": ["^check-types"]
|
|
15
|
+
},
|
|
16
|
+
"dev": {
|
|
17
|
+
"cache": false,
|
|
18
|
+
"persistent": true
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|