@empline/preflight 1.1.56 → 1.1.58
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/dist/checks/accessibility/accessibility-validation.d.ts +10 -0
- package/dist/checks/accessibility/accessibility-validation.d.ts.map +1 -0
- package/dist/checks/accessibility/accessibility-validation.js +538 -0
- package/dist/checks/accessibility/accessibility-validation.js.map +1 -0
- package/dist/checks/checkout/checkout-flow-validation.d.ts +10 -0
- package/dist/checks/checkout/checkout-flow-validation.d.ts.map +1 -0
- package/dist/checks/checkout/checkout-flow-validation.js +473 -0
- package/dist/checks/checkout/checkout-flow-validation.js.map +1 -0
- package/dist/checks/database/enum-sync-validation.d.ts +10 -0
- package/dist/checks/database/enum-sync-validation.d.ts.map +1 -0
- package/dist/checks/database/enum-sync-validation.js +409 -0
- package/dist/checks/database/enum-sync-validation.js.map +1 -0
- package/dist/checks/email/email-validation.d.ts +10 -0
- package/dist/checks/email/email-validation.d.ts.map +1 -0
- package/dist/checks/email/email-validation.js +456 -0
- package/dist/checks/email/email-validation.js.map +1 -0
- package/dist/checks/observability/observability-validation.d.ts +10 -0
- package/dist/checks/observability/observability-validation.d.ts.map +1 -0
- package/dist/checks/observability/observability-validation.js +448 -0
- package/dist/checks/observability/observability-validation.js.map +1 -0
- package/dist/checks/seo/seo-validation.d.ts +10 -0
- package/dist/checks/seo/seo-validation.d.ts.map +1 -0
- package/dist/checks/seo/seo-validation.js +497 -0
- package/dist/checks/seo/seo-validation.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
|
|
38
|
+
exports.run = run;
|
|
39
|
+
/**
|
|
40
|
+
* Email Validation Preflight (BLOCKING)
|
|
41
|
+
*
|
|
42
|
+
* Validates email implementation best practices:
|
|
43
|
+
*
|
|
44
|
+
* 1. Template Validation:
|
|
45
|
+
* - Email templates have required variables defined
|
|
46
|
+
* - Templates use consistent branding
|
|
47
|
+
* - Plain text alternatives exist
|
|
48
|
+
*
|
|
49
|
+
* 2. Send Operation Safety:
|
|
50
|
+
* - Email sending has error handling
|
|
51
|
+
* - Rate limiting considerations
|
|
52
|
+
* - Retry logic for transient failures
|
|
53
|
+
*
|
|
54
|
+
* 3. Content Security:
|
|
55
|
+
* - No sensitive data in email bodies
|
|
56
|
+
* - Unsubscribe links in marketing emails
|
|
57
|
+
* - Reply-to addresses configured
|
|
58
|
+
*
|
|
59
|
+
* 4. Delivery Tracking:
|
|
60
|
+
* - Delivery status tracking for critical emails
|
|
61
|
+
* - Bounce handling
|
|
62
|
+
* - Open/click tracking where appropriate
|
|
63
|
+
*
|
|
64
|
+
* 5. Template Variables:
|
|
65
|
+
* - All template variables are properly typed
|
|
66
|
+
* - Required variables are validated before send
|
|
67
|
+
*/
|
|
68
|
+
const fs = __importStar(require("node:fs"));
|
|
69
|
+
const path = __importStar(require("node:path"));
|
|
70
|
+
const glob_1 = require("glob");
|
|
71
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
72
|
+
exports.id = "email/email-validation";
|
|
73
|
+
exports.name = "Email Validation";
|
|
74
|
+
exports.description = "Validates email templates, sending logic, and best practices";
|
|
75
|
+
exports.category = "email";
|
|
76
|
+
exports.blocking = true;
|
|
77
|
+
exports.tags = ["email", "templates", "notifications", "transactional"];
|
|
78
|
+
function getLineNumber(content, index) {
|
|
79
|
+
return content.substring(0, index).split("\n").length;
|
|
80
|
+
}
|
|
81
|
+
async function checkEmailTemplates() {
|
|
82
|
+
const issues = [];
|
|
83
|
+
// Find email template files
|
|
84
|
+
const templateFiles = await (0, glob_1.glob)([
|
|
85
|
+
"emails/**/*.tsx",
|
|
86
|
+
"emails/**/*.ts",
|
|
87
|
+
"lib/emails/**/*.tsx",
|
|
88
|
+
"lib/email/**/*.tsx",
|
|
89
|
+
"components/emails/**/*.tsx",
|
|
90
|
+
"app/api/email/**/*.ts",
|
|
91
|
+
], {
|
|
92
|
+
cwd: process.cwd(),
|
|
93
|
+
absolute: true,
|
|
94
|
+
});
|
|
95
|
+
if (templateFiles.length === 0) {
|
|
96
|
+
// Check if there's any email functionality
|
|
97
|
+
const hasEmailPackage = fs.existsSync(path.join(process.cwd(), "node_modules", "resend")) ||
|
|
98
|
+
fs.existsSync(path.join(process.cwd(), "node_modules", "@sendgrid")) ||
|
|
99
|
+
fs.existsSync(path.join(process.cwd(), "node_modules", "nodemailer")) ||
|
|
100
|
+
fs.existsSync(path.join(process.cwd(), "node_modules", "@react-email"));
|
|
101
|
+
if (!hasEmailPackage) {
|
|
102
|
+
// No email functionality
|
|
103
|
+
return issues;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const file of templateFiles) {
|
|
107
|
+
if (!fs.existsSync(file))
|
|
108
|
+
continue;
|
|
109
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
110
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
111
|
+
// Check for React Email templates
|
|
112
|
+
if (file.endsWith(".tsx") && content.includes("@react-email")) {
|
|
113
|
+
// Check for preview text
|
|
114
|
+
const hasPreview = content.includes("Preview") || content.includes("previewText");
|
|
115
|
+
if (!hasPreview) {
|
|
116
|
+
issues.push({
|
|
117
|
+
rule: "email-preview-text",
|
|
118
|
+
message: "Email template missing preview text",
|
|
119
|
+
file: relativePath,
|
|
120
|
+
severity: "warning",
|
|
121
|
+
suggestion: "Add Preview component for email preview text",
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Check for unsubscribe link (for marketing-type emails)
|
|
125
|
+
const isMarketingEmail = /newsletter|promo|marketing|campaign/i.test(relativePath) ||
|
|
126
|
+
/newsletter|promo|marketing|campaign/i.test(content);
|
|
127
|
+
if (isMarketingEmail) {
|
|
128
|
+
const hasUnsubscribe = /unsubscribe/i.test(content);
|
|
129
|
+
if (!hasUnsubscribe) {
|
|
130
|
+
issues.push({
|
|
131
|
+
rule: "email-unsubscribe-link",
|
|
132
|
+
message: "Marketing email template missing unsubscribe link",
|
|
133
|
+
file: relativePath,
|
|
134
|
+
severity: "error",
|
|
135
|
+
suggestion: "Add unsubscribe link for CAN-SPAM compliance",
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Check for proper typing of props
|
|
140
|
+
const hasTypedProps = /interface\s+\w+Props|type\s+\w+Props|Props\s*=/.test(content);
|
|
141
|
+
if (!hasTypedProps) {
|
|
142
|
+
issues.push({
|
|
143
|
+
rule: "email-typed-props",
|
|
144
|
+
message: "Email template props may not be typed",
|
|
145
|
+
file: relativePath,
|
|
146
|
+
severity: "warning",
|
|
147
|
+
suggestion: "Define TypeScript interface for email template props",
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return issues;
|
|
153
|
+
}
|
|
154
|
+
async function checkEmailSending() {
|
|
155
|
+
const issues = [];
|
|
156
|
+
// Find email sending code
|
|
157
|
+
const sendFiles = await (0, glob_1.glob)([
|
|
158
|
+
"lib/**/send*.ts",
|
|
159
|
+
"lib/**/email*.ts",
|
|
160
|
+
"app/api/**/email/**/*.ts",
|
|
161
|
+
"app/api/**/send/**/*.ts",
|
|
162
|
+
], {
|
|
163
|
+
cwd: process.cwd(),
|
|
164
|
+
absolute: true,
|
|
165
|
+
});
|
|
166
|
+
for (const file of sendFiles) {
|
|
167
|
+
if (!fs.existsSync(file))
|
|
168
|
+
continue;
|
|
169
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
170
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
171
|
+
// Check for email sending patterns
|
|
172
|
+
const hasSendEmail = /\.send\(|sendEmail|resend\.emails\.send|sendMail|transporter\.sendMail/i.test(content);
|
|
173
|
+
if (!hasSendEmail)
|
|
174
|
+
continue;
|
|
175
|
+
// Check for error handling
|
|
176
|
+
const hasTryCatch = /try\s*\{[\s\S]*?sendEmail[\s\S]*?\}\s*catch/i.test(content) ||
|
|
177
|
+
/try\s*\{[\s\S]*?\.send\([\s\S]*?\}\s*catch/i.test(content);
|
|
178
|
+
const hasAwaitWithCatch = /await\s+.*send.*\.catch/i.test(content);
|
|
179
|
+
if (!hasTryCatch && !hasAwaitWithCatch) {
|
|
180
|
+
issues.push({
|
|
181
|
+
rule: "email-error-handling",
|
|
182
|
+
message: "Email sending may not have proper error handling",
|
|
183
|
+
file: relativePath,
|
|
184
|
+
severity: "warning",
|
|
185
|
+
suggestion: "Wrap email sending in try/catch for error handling",
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
// Check for from address configuration
|
|
189
|
+
const hasFromAddress = /from\s*:|"from"|'from'|FROM/i.test(content);
|
|
190
|
+
if (!hasFromAddress) {
|
|
191
|
+
issues.push({
|
|
192
|
+
rule: "email-from-address",
|
|
193
|
+
message: "Email sending may not specify from address",
|
|
194
|
+
file: relativePath,
|
|
195
|
+
severity: "warning",
|
|
196
|
+
suggestion: "Always specify a from address for emails",
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// Check for reply-to (good practice)
|
|
200
|
+
const hasReplyTo = /reply_?to|replyTo/i.test(content);
|
|
201
|
+
if (!hasReplyTo) {
|
|
202
|
+
issues.push({
|
|
203
|
+
rule: "email-reply-to",
|
|
204
|
+
message: "Email sending doesn't specify reply-to address",
|
|
205
|
+
file: relativePath,
|
|
206
|
+
severity: "info",
|
|
207
|
+
suggestion: "Consider adding reply-to address for customer emails",
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return issues;
|
|
212
|
+
}
|
|
213
|
+
async function checkEmailSecurity() {
|
|
214
|
+
const issues = [];
|
|
215
|
+
// Find all email-related files
|
|
216
|
+
const emailFiles = await (0, glob_1.glob)([
|
|
217
|
+
"lib/**/email*.ts",
|
|
218
|
+
"emails/**/*.tsx",
|
|
219
|
+
"app/api/**/email/**/*.ts",
|
|
220
|
+
], {
|
|
221
|
+
cwd: process.cwd(),
|
|
222
|
+
absolute: true,
|
|
223
|
+
});
|
|
224
|
+
for (const file of emailFiles) {
|
|
225
|
+
if (!fs.existsSync(file))
|
|
226
|
+
continue;
|
|
227
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
228
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
229
|
+
// Check for sensitive data in email content
|
|
230
|
+
const sensitivePatterns = [
|
|
231
|
+
/password\s*:\s*[^,}]+/i,
|
|
232
|
+
/creditCard|cardNumber/i,
|
|
233
|
+
/ssn|socialSecurity/i,
|
|
234
|
+
/\bpin\b\s*:\s*[^,}]+/i,
|
|
235
|
+
];
|
|
236
|
+
for (const pattern of sensitivePatterns) {
|
|
237
|
+
if (pattern.test(content)) {
|
|
238
|
+
const match = content.match(pattern);
|
|
239
|
+
if (match) {
|
|
240
|
+
// Check if it's just a variable name or actual content
|
|
241
|
+
const lineStart = content.lastIndexOf("\n", match.index || 0) + 1;
|
|
242
|
+
const line = content.substring(lineStart, content.indexOf("\n", match.index || 0));
|
|
243
|
+
// Skip if it's in an import, type definition, or comment
|
|
244
|
+
if (!/import|type\s|interface\s|\/\//.test(line)) {
|
|
245
|
+
issues.push({
|
|
246
|
+
rule: "email-sensitive-data",
|
|
247
|
+
message: "Email may contain sensitive data",
|
|
248
|
+
file: relativePath,
|
|
249
|
+
line: getLineNumber(content, match.index || 0),
|
|
250
|
+
severity: "error",
|
|
251
|
+
suggestion: "Never include passwords, credit cards, SSN, or PINs in emails",
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Check for hardcoded email addresses (potential issues)
|
|
259
|
+
const hardcodedEmailRegex = /["'][a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}["']/g;
|
|
260
|
+
let match;
|
|
261
|
+
let hardcodedCount = 0;
|
|
262
|
+
while ((match = hardcodedEmailRegex.exec(content)) !== null) {
|
|
263
|
+
hardcodedCount++;
|
|
264
|
+
}
|
|
265
|
+
if (hardcodedCount > 3) {
|
|
266
|
+
issues.push({
|
|
267
|
+
rule: "email-hardcoded-addresses",
|
|
268
|
+
message: `Found ${hardcodedCount} hardcoded email addresses`,
|
|
269
|
+
file: relativePath,
|
|
270
|
+
severity: "warning",
|
|
271
|
+
suggestion: "Consider using environment variables or configuration for email addresses",
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return issues;
|
|
276
|
+
}
|
|
277
|
+
async function checkDeliveryTracking() {
|
|
278
|
+
const issues = [];
|
|
279
|
+
// Find webhook handlers for email services
|
|
280
|
+
const webhookFiles = await (0, glob_1.glob)([
|
|
281
|
+
"app/api/webhooks/**/*.ts",
|
|
282
|
+
"app/api/**/webhook/**/*.ts",
|
|
283
|
+
], {
|
|
284
|
+
cwd: process.cwd(),
|
|
285
|
+
absolute: true,
|
|
286
|
+
});
|
|
287
|
+
let hasEmailWebhook = false;
|
|
288
|
+
for (const file of webhookFiles) {
|
|
289
|
+
if (!fs.existsSync(file))
|
|
290
|
+
continue;
|
|
291
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
292
|
+
// Check for email service webhooks
|
|
293
|
+
if (/resend|sendgrid|mailgun|postmark|ses/i.test(content)) {
|
|
294
|
+
hasEmailWebhook = true;
|
|
295
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
296
|
+
// Check for bounce handling
|
|
297
|
+
const handlesBounces = /bounce|hard_bounce|soft_bounce/i.test(content);
|
|
298
|
+
if (!handlesBounces) {
|
|
299
|
+
issues.push({
|
|
300
|
+
rule: "email-bounce-handling",
|
|
301
|
+
message: "Email webhook may not handle bounces",
|
|
302
|
+
file: relativePath,
|
|
303
|
+
severity: "info",
|
|
304
|
+
suggestion: "Handle bounce events to maintain list hygiene",
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
// Check for complaint handling
|
|
308
|
+
const handlesComplaints = /complaint|spam|abuse/i.test(content);
|
|
309
|
+
if (!handlesComplaints) {
|
|
310
|
+
issues.push({
|
|
311
|
+
rule: "email-complaint-handling",
|
|
312
|
+
message: "Email webhook may not handle spam complaints",
|
|
313
|
+
file: relativePath,
|
|
314
|
+
severity: "info",
|
|
315
|
+
suggestion: "Handle spam complaints to maintain sender reputation",
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Check if email functionality exists but no webhooks
|
|
321
|
+
const emailFiles = await (0, glob_1.glob)("lib/**/email*.ts", { cwd: process.cwd() });
|
|
322
|
+
if (emailFiles.length > 0 && !hasEmailWebhook) {
|
|
323
|
+
issues.push({
|
|
324
|
+
rule: "email-delivery-webhooks",
|
|
325
|
+
message: "No email delivery webhooks found",
|
|
326
|
+
file: "app/api/webhooks/",
|
|
327
|
+
severity: "info",
|
|
328
|
+
suggestion: "Consider implementing webhooks for delivery tracking",
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
return issues;
|
|
332
|
+
}
|
|
333
|
+
async function checkEnvironmentConfig() {
|
|
334
|
+
const issues = [];
|
|
335
|
+
// Check for email-related environment variables
|
|
336
|
+
const envExample = path.join(process.cwd(), ".env.example");
|
|
337
|
+
const envLocal = path.join(process.cwd(), ".env.local");
|
|
338
|
+
let envContent = "";
|
|
339
|
+
if (fs.existsSync(envExample)) {
|
|
340
|
+
envContent = fs.readFileSync(envExample, "utf-8");
|
|
341
|
+
}
|
|
342
|
+
else if (fs.existsSync(envLocal)) {
|
|
343
|
+
envContent = fs.readFileSync(envLocal, "utf-8");
|
|
344
|
+
}
|
|
345
|
+
// Check if email config exists
|
|
346
|
+
const hasEmailConfig = /RESEND|SENDGRID|SMTP|MAIL|EMAIL/i.test(envContent);
|
|
347
|
+
if (hasEmailConfig) {
|
|
348
|
+
// Check for from email configuration
|
|
349
|
+
const hasFromEmail = /FROM_EMAIL|EMAIL_FROM|SENDER/i.test(envContent);
|
|
350
|
+
if (!hasFromEmail) {
|
|
351
|
+
issues.push({
|
|
352
|
+
rule: "email-from-env",
|
|
353
|
+
message: "No FROM email address in environment configuration",
|
|
354
|
+
file: ".env.example",
|
|
355
|
+
severity: "warning",
|
|
356
|
+
suggestion: "Add EMAIL_FROM or similar env variable for sender address",
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return issues;
|
|
361
|
+
}
|
|
362
|
+
async function run() {
|
|
363
|
+
const startTime = Date.now();
|
|
364
|
+
const allIssues = [];
|
|
365
|
+
// Run all checks
|
|
366
|
+
allIssues.push(...await checkEmailTemplates());
|
|
367
|
+
allIssues.push(...await checkEmailSending());
|
|
368
|
+
allIssues.push(...await checkEmailSecurity());
|
|
369
|
+
allIssues.push(...await checkDeliveryTracking());
|
|
370
|
+
allIssues.push(...await checkEnvironmentConfig());
|
|
371
|
+
// Convert to findings
|
|
372
|
+
const findings = allIssues.map(issue => ({
|
|
373
|
+
level: issue.severity,
|
|
374
|
+
message: issue.message,
|
|
375
|
+
file: issue.file,
|
|
376
|
+
startLine: issue.line,
|
|
377
|
+
ruleId: issue.rule,
|
|
378
|
+
suggestion: issue.suggestion,
|
|
379
|
+
}));
|
|
380
|
+
const errors = findings.filter(f => f.level === "error");
|
|
381
|
+
const warnings = findings.filter(f => f.level === "warning");
|
|
382
|
+
const infos = findings.filter(f => f.level === "info");
|
|
383
|
+
return {
|
|
384
|
+
passed: errors.length === 0,
|
|
385
|
+
findings,
|
|
386
|
+
duration: Date.now() - startTime,
|
|
387
|
+
metadata: {
|
|
388
|
+
errors: errors.length,
|
|
389
|
+
warnings: warnings.length,
|
|
390
|
+
infos: infos.length,
|
|
391
|
+
},
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
async function main() {
|
|
395
|
+
console.log(`\n${console_chars_1.emoji.memo} EMAIL VALIDATION`);
|
|
396
|
+
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
397
|
+
const result = await run();
|
|
398
|
+
const { errors, warnings, infos } = result.metadata || {};
|
|
399
|
+
console.log(`\n${console_chars_1.emoji.search} Checking email implementation...`);
|
|
400
|
+
console.log(`\n${console_chars_1.emoji.chart} Summary:`);
|
|
401
|
+
console.log(` Errors: ${errors}`);
|
|
402
|
+
console.log(` Warnings: ${warnings}`);
|
|
403
|
+
console.log(` Info: ${infos}`);
|
|
404
|
+
if (result.findings.length === 0) {
|
|
405
|
+
console.log(`\n${console_chars_1.emoji.info} No email-related code found to validate`);
|
|
406
|
+
process.exit(0);
|
|
407
|
+
}
|
|
408
|
+
if (result.passed && warnings === 0) {
|
|
409
|
+
console.log(`\n${console_chars_1.emoji.success} EMAIL VALIDATION PASSED`);
|
|
410
|
+
console.log(`\nAll email best practices are followed.`);
|
|
411
|
+
process.exit(0);
|
|
412
|
+
}
|
|
413
|
+
// Print errors
|
|
414
|
+
const errorFindings = result.findings.filter(f => f.level === "error");
|
|
415
|
+
if (errorFindings.length > 0) {
|
|
416
|
+
console.log(`\n${console_chars_1.emoji.error} Errors (blocking):`);
|
|
417
|
+
for (const finding of errorFindings) {
|
|
418
|
+
console.log(`\n ${finding.file}${finding.startLine ? `:${finding.startLine}` : ""}`);
|
|
419
|
+
console.log(` ${finding.message}`);
|
|
420
|
+
if (finding.suggestion) {
|
|
421
|
+
console.log(` ${console_chars_1.emoji.hint} ${finding.suggestion}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// Print warnings
|
|
426
|
+
const warningFindings = result.findings.filter(f => f.level === "warning");
|
|
427
|
+
if (warningFindings.length > 0) {
|
|
428
|
+
console.log(`\n${console_chars_1.emoji.warning} Warnings:`);
|
|
429
|
+
for (const finding of warningFindings.slice(0, 10)) {
|
|
430
|
+
console.log(`\n ${finding.file}`);
|
|
431
|
+
console.log(` ${finding.message}`);
|
|
432
|
+
}
|
|
433
|
+
if (warningFindings.length > 10) {
|
|
434
|
+
console.log(`\n ... and ${warningFindings.length - 10} more warnings`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
console.log(`\n${console_chars_1.emoji.info} Email Best Practices:`);
|
|
438
|
+
console.log(` - Type email template props`);
|
|
439
|
+
console.log(` - Handle sending errors gracefully`);
|
|
440
|
+
console.log(` - Include unsubscribe links in marketing emails`);
|
|
441
|
+
console.log(` - Never include sensitive data in emails`);
|
|
442
|
+
console.log(` - Implement delivery webhooks for tracking`);
|
|
443
|
+
if (!result.passed) {
|
|
444
|
+
console.log(`\n${console_chars_1.emoji.error} EMAIL VALIDATION FAILED`);
|
|
445
|
+
process.exit(1);
|
|
446
|
+
}
|
|
447
|
+
console.log(`\n${console_chars_1.emoji.success} EMAIL VALIDATION PASSED`);
|
|
448
|
+
process.exit(0);
|
|
449
|
+
}
|
|
450
|
+
if (require.main === module) {
|
|
451
|
+
main().catch((err) => {
|
|
452
|
+
console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
|
|
453
|
+
process.exit(1);
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
//# sourceMappingURL=email-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-validation.js","sourceRoot":"","sources":["../../../src/checks/email/email-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { PreflightCheckResult } from "../../core/types";
|
|
3
|
+
export declare const id = "observability/observability-validation";
|
|
4
|
+
export declare const name = "Observability Validation";
|
|
5
|
+
export declare const description = "Validates error handling, logging, and monitoring best practices";
|
|
6
|
+
export declare const category = "observability";
|
|
7
|
+
export declare const blocking = true;
|
|
8
|
+
export declare const tags: string[];
|
|
9
|
+
export declare function run(): Promise<PreflightCheckResult>;
|
|
10
|
+
//# sourceMappingURL=observability-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/observability/observability-validation.ts"],"names":[],"mappings":";AAiCA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAG1E,eAAO,MAAM,EAAE,2CAA2C,CAAC;AAC3D,eAAO,MAAM,IAAI,6BAA6B,CAAC;AAC/C,eAAO,MAAM,WAAW,qEAAqE,CAAC;AAC9F,eAAO,MAAM,QAAQ,kBAAkB,CAAC;AACxC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAsE,CAAC;AA2TxF,wBAAsB,GAAG,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAmCzD"}
|