@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.
Files changed (25) hide show
  1. package/dist/checks/accessibility/accessibility-validation.d.ts +10 -0
  2. package/dist/checks/accessibility/accessibility-validation.d.ts.map +1 -0
  3. package/dist/checks/accessibility/accessibility-validation.js +538 -0
  4. package/dist/checks/accessibility/accessibility-validation.js.map +1 -0
  5. package/dist/checks/checkout/checkout-flow-validation.d.ts +10 -0
  6. package/dist/checks/checkout/checkout-flow-validation.d.ts.map +1 -0
  7. package/dist/checks/checkout/checkout-flow-validation.js +473 -0
  8. package/dist/checks/checkout/checkout-flow-validation.js.map +1 -0
  9. package/dist/checks/database/enum-sync-validation.d.ts +10 -0
  10. package/dist/checks/database/enum-sync-validation.d.ts.map +1 -0
  11. package/dist/checks/database/enum-sync-validation.js +409 -0
  12. package/dist/checks/database/enum-sync-validation.js.map +1 -0
  13. package/dist/checks/email/email-validation.d.ts +10 -0
  14. package/dist/checks/email/email-validation.d.ts.map +1 -0
  15. package/dist/checks/email/email-validation.js +456 -0
  16. package/dist/checks/email/email-validation.js.map +1 -0
  17. package/dist/checks/observability/observability-validation.d.ts +10 -0
  18. package/dist/checks/observability/observability-validation.d.ts.map +1 -0
  19. package/dist/checks/observability/observability-validation.js +448 -0
  20. package/dist/checks/observability/observability-validation.js.map +1 -0
  21. package/dist/checks/seo/seo-validation.d.ts +10 -0
  22. package/dist/checks/seo/seo-validation.d.ts.map +1 -0
  23. package/dist/checks/seo/seo-validation.js +497 -0
  24. package/dist/checks/seo/seo-validation.js.map +1 -0
  25. 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"}