@empline/preflight 1.1.57 → 1.1.59
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.map +1 -1
- package/dist/checks/accessibility/accessibility-validation.js +217 -34
- package/dist/checks/accessibility/accessibility-validation.js.map +1 -1
- package/dist/checks/accessibility/wcag-advanced-validation.d.ts +10 -0
- package/dist/checks/accessibility/wcag-advanced-validation.d.ts.map +1 -0
- package/dist/checks/accessibility/wcag-advanced-validation.js +622 -0
- package/dist/checks/accessibility/wcag-advanced-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/database/query-performance-validation.d.ts +10 -0
- package/dist/checks/database/query-performance-validation.d.ts.map +1 -0
- package/dist/checks/database/query-performance-validation.js +544 -0
- package/dist/checks/database/query-performance-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/react/react-patterns-validation.d.ts +10 -0
- package/dist/checks/react/react-patterns-validation.d.ts.map +1 -0
- package/dist/checks/react/react-patterns-validation.js +559 -0
- package/dist/checks/react/react-patterns-validation.js.map +1 -0
- package/dist/checks/security/security-headers-validation.d.ts +10 -0
- package/dist/checks/security/security-headers-validation.d.ts.map +1 -0
- package/dist/checks/security/security-headers-validation.js +594 -0
- package/dist/checks/security/security-headers-validation.js.map +1 -0
- package/dist/reporters/github-reporter.d.ts +35 -0
- package/dist/reporters/github-reporter.d.ts.map +1 -0
- package/dist/reporters/github-reporter.js +397 -0
- package/dist/reporters/github-reporter.js.map +1 -0
- package/dist/reporters/html-report.d.ts +12 -0
- package/dist/reporters/html-report.d.ts.map +1 -0
- package/dist/reporters/html-report.js +469 -0
- package/dist/reporters/html-report.js.map +1 -0
- package/dist/reporters/index.d.ts +8 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +18 -0
- package/dist/reporters/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,473 @@
|
|
|
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
|
+
* Checkout Flow Validation Preflight (BLOCKING)
|
|
41
|
+
*
|
|
42
|
+
* Validates checkout flow best practices for e-commerce applications:
|
|
43
|
+
*
|
|
44
|
+
* 1. Cart Operations:
|
|
45
|
+
* - Add to cart validates stock availability
|
|
46
|
+
* - Cart updates handle concurrent modifications
|
|
47
|
+
* - Cart expiration/cleanup handling
|
|
48
|
+
*
|
|
49
|
+
* 2. Checkout Security:
|
|
50
|
+
* - Price validation on server (no client-side pricing)
|
|
51
|
+
* - Stock re-validation before payment
|
|
52
|
+
* - CSRF protection on checkout endpoints
|
|
53
|
+
*
|
|
54
|
+
* 3. Payment Integration:
|
|
55
|
+
* - Payment intent creation validates cart state
|
|
56
|
+
* - Webhook handlers for payment events
|
|
57
|
+
* - Idempotency for payment operations
|
|
58
|
+
*
|
|
59
|
+
* 4. Order Creation:
|
|
60
|
+
* - Transaction-safe order creation
|
|
61
|
+
* - Inventory decrement on order confirmation
|
|
62
|
+
* - Order confirmation emails triggered
|
|
63
|
+
*
|
|
64
|
+
* 5. Error Handling:
|
|
65
|
+
* - Payment failure handling
|
|
66
|
+
* - Stock unavailable handling
|
|
67
|
+
* - Network error recovery
|
|
68
|
+
*/
|
|
69
|
+
const fs = __importStar(require("node:fs"));
|
|
70
|
+
const path = __importStar(require("node:path"));
|
|
71
|
+
const glob_1 = require("glob");
|
|
72
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
73
|
+
exports.id = "checkout/checkout-flow-validation";
|
|
74
|
+
exports.name = "Checkout Flow Validation";
|
|
75
|
+
exports.description = "Validates checkout flow security and best practices";
|
|
76
|
+
exports.category = "checkout";
|
|
77
|
+
exports.blocking = true;
|
|
78
|
+
exports.tags = ["checkout", "cart", "payment", "order", "e-commerce"];
|
|
79
|
+
function getLineNumber(content, index) {
|
|
80
|
+
return content.substring(0, index).split("\n").length;
|
|
81
|
+
}
|
|
82
|
+
async function checkCartOperations() {
|
|
83
|
+
const issues = [];
|
|
84
|
+
// Find cart-related API routes
|
|
85
|
+
const cartFiles = await (0, glob_1.glob)([
|
|
86
|
+
"app/api/cart/**/*.ts",
|
|
87
|
+
"app/api/*/cart/**/*.ts",
|
|
88
|
+
"lib/**/cart*.ts",
|
|
89
|
+
], {
|
|
90
|
+
cwd: process.cwd(),
|
|
91
|
+
absolute: true,
|
|
92
|
+
});
|
|
93
|
+
if (cartFiles.length === 0) {
|
|
94
|
+
// No cart functionality - skip
|
|
95
|
+
return issues;
|
|
96
|
+
}
|
|
97
|
+
for (const file of cartFiles) {
|
|
98
|
+
if (!fs.existsSync(file))
|
|
99
|
+
continue;
|
|
100
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
101
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
102
|
+
// Check for stock validation on add to cart
|
|
103
|
+
if (relativePath.includes("add") || content.includes("addToCart") || content.includes("add-item")) {
|
|
104
|
+
const hasStockCheck = /stock|inventory|quantity|available/i.test(content);
|
|
105
|
+
if (!hasStockCheck) {
|
|
106
|
+
issues.push({
|
|
107
|
+
rule: "cart-stock-validation",
|
|
108
|
+
message: "Cart add operation may not validate stock availability",
|
|
109
|
+
file: relativePath,
|
|
110
|
+
severity: "warning",
|
|
111
|
+
suggestion: "Validate stock/inventory before adding items to cart",
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Check for optimistic update patterns without server validation
|
|
116
|
+
if (content.includes("optimistic") && !content.includes("revalidate")) {
|
|
117
|
+
issues.push({
|
|
118
|
+
rule: "cart-optimistic-sync",
|
|
119
|
+
message: "Optimistic cart updates should sync with server",
|
|
120
|
+
file: relativePath,
|
|
121
|
+
severity: "warning",
|
|
122
|
+
suggestion: "Ensure optimistic updates are reconciled with server state",
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return issues;
|
|
127
|
+
}
|
|
128
|
+
async function checkCheckoutSecurity() {
|
|
129
|
+
const issues = [];
|
|
130
|
+
// Find checkout-related API routes
|
|
131
|
+
const checkoutFiles = await (0, glob_1.glob)([
|
|
132
|
+
"app/api/checkout/**/*.ts",
|
|
133
|
+
"app/api/*/checkout/**/*.ts",
|
|
134
|
+
"app/api/order/**/*.ts",
|
|
135
|
+
"app/api/*/order/**/*.ts",
|
|
136
|
+
"lib/**/checkout*.ts",
|
|
137
|
+
], {
|
|
138
|
+
cwd: process.cwd(),
|
|
139
|
+
absolute: true,
|
|
140
|
+
});
|
|
141
|
+
for (const file of checkoutFiles) {
|
|
142
|
+
if (!fs.existsSync(file))
|
|
143
|
+
continue;
|
|
144
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
145
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
146
|
+
// Check for server-side price calculation
|
|
147
|
+
const hasClientPrice = /body\.price|body\.total|req\.body\.amount/i.test(content);
|
|
148
|
+
if (hasClientPrice) {
|
|
149
|
+
issues.push({
|
|
150
|
+
rule: "checkout-server-pricing",
|
|
151
|
+
message: "Checkout may be using client-provided prices",
|
|
152
|
+
file: relativePath,
|
|
153
|
+
severity: "error",
|
|
154
|
+
suggestion: "Always calculate prices on the server, never trust client-provided prices",
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// Check for stock re-validation before order
|
|
158
|
+
if (content.includes("order") || content.includes("createOrder") || content.includes("placeOrder")) {
|
|
159
|
+
const hasStockRecheck = /stock|inventory|checkAvailability|validateStock/i.test(content);
|
|
160
|
+
if (!hasStockRecheck) {
|
|
161
|
+
issues.push({
|
|
162
|
+
rule: "checkout-stock-revalidation",
|
|
163
|
+
message: "Order creation may not re-validate stock availability",
|
|
164
|
+
file: relativePath,
|
|
165
|
+
severity: "warning",
|
|
166
|
+
suggestion: "Re-validate stock availability at order creation time",
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Check for transaction usage in order creation
|
|
171
|
+
if (content.includes("createOrder") || content.includes("placeOrder")) {
|
|
172
|
+
const hasTransaction = /\$transaction|transaction\(|BEGIN|COMMIT/i.test(content);
|
|
173
|
+
if (!hasTransaction) {
|
|
174
|
+
issues.push({
|
|
175
|
+
rule: "checkout-transaction",
|
|
176
|
+
message: "Order creation may not use database transactions",
|
|
177
|
+
file: relativePath,
|
|
178
|
+
severity: "warning",
|
|
179
|
+
suggestion: "Use database transactions for order creation to ensure data consistency",
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return issues;
|
|
185
|
+
}
|
|
186
|
+
async function checkPaymentIntegration() {
|
|
187
|
+
const issues = [];
|
|
188
|
+
// Find payment-related files
|
|
189
|
+
const paymentFiles = await (0, glob_1.glob)([
|
|
190
|
+
"app/api/payment/**/*.ts",
|
|
191
|
+
"app/api/*/payment/**/*.ts",
|
|
192
|
+
"app/api/stripe/**/*.ts",
|
|
193
|
+
"app/api/paypal/**/*.ts",
|
|
194
|
+
"app/api/webhooks/**/*.ts",
|
|
195
|
+
"lib/**/payment*.ts",
|
|
196
|
+
"lib/**/stripe*.ts",
|
|
197
|
+
], {
|
|
198
|
+
cwd: process.cwd(),
|
|
199
|
+
absolute: true,
|
|
200
|
+
});
|
|
201
|
+
if (paymentFiles.length === 0) {
|
|
202
|
+
// Check if there's any payment integration
|
|
203
|
+
const allFiles = await (0, glob_1.glob)("**/*.ts", { cwd: process.cwd(), ignore: ["**/node_modules/**"] });
|
|
204
|
+
let hasPaymentMention = false;
|
|
205
|
+
for (const f of allFiles.slice(0, 100)) {
|
|
206
|
+
const content = fs.readFileSync(path.join(process.cwd(), f), "utf-8");
|
|
207
|
+
if (/stripe|paypal|payment|checkout/i.test(content)) {
|
|
208
|
+
hasPaymentMention = true;
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (!hasPaymentMention) {
|
|
213
|
+
// No payment functionality
|
|
214
|
+
return issues;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
let hasWebhookHandler = false;
|
|
218
|
+
let hasIdempotency = false;
|
|
219
|
+
for (const file of paymentFiles) {
|
|
220
|
+
if (!fs.existsSync(file))
|
|
221
|
+
continue;
|
|
222
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
223
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
224
|
+
// Check for webhook handlers
|
|
225
|
+
if (relativePath.includes("webhook") || content.includes("constructEvent") || content.includes("verifyWebhook")) {
|
|
226
|
+
hasWebhookHandler = true;
|
|
227
|
+
// Check webhook signature verification
|
|
228
|
+
const hasSignatureVerification = /constructEvent|verifySignature|stripe\.webhooks|rawBody/i.test(content);
|
|
229
|
+
if (!hasSignatureVerification) {
|
|
230
|
+
issues.push({
|
|
231
|
+
rule: "payment-webhook-verification",
|
|
232
|
+
message: "Payment webhook may not verify signatures",
|
|
233
|
+
file: relativePath,
|
|
234
|
+
severity: "error",
|
|
235
|
+
suggestion: "Always verify webhook signatures to prevent forgery",
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Check for idempotency
|
|
240
|
+
if (content.includes("idempotency") || content.includes("Idempotency-Key") || content.includes("idempotentKey")) {
|
|
241
|
+
hasIdempotency = true;
|
|
242
|
+
}
|
|
243
|
+
// Check for payment intent validation
|
|
244
|
+
if (content.includes("paymentIntent") || content.includes("createPayment")) {
|
|
245
|
+
const validatesCart = /cart|order|items|validateCart/i.test(content);
|
|
246
|
+
if (!validatesCart) {
|
|
247
|
+
issues.push({
|
|
248
|
+
rule: "payment-cart-validation",
|
|
249
|
+
message: "Payment creation may not validate cart state",
|
|
250
|
+
file: relativePath,
|
|
251
|
+
severity: "warning",
|
|
252
|
+
suggestion: "Validate cart contents before creating payment intent",
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Check for webhook handler existence
|
|
258
|
+
if (!hasWebhookHandler && paymentFiles.length > 0) {
|
|
259
|
+
issues.push({
|
|
260
|
+
rule: "payment-webhook-handler",
|
|
261
|
+
message: "No payment webhook handler found",
|
|
262
|
+
file: "app/api/webhooks/",
|
|
263
|
+
severity: "warning",
|
|
264
|
+
suggestion: "Implement webhook handlers for payment events (success, failure, refund)",
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// Check for idempotency
|
|
268
|
+
if (!hasIdempotency && paymentFiles.length > 0) {
|
|
269
|
+
issues.push({
|
|
270
|
+
rule: "payment-idempotency",
|
|
271
|
+
message: "Payment operations may not use idempotency keys",
|
|
272
|
+
file: "lib/payment",
|
|
273
|
+
severity: "info",
|
|
274
|
+
suggestion: "Use idempotency keys to prevent duplicate charges",
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
return issues;
|
|
278
|
+
}
|
|
279
|
+
async function checkOrderCreation() {
|
|
280
|
+
const issues = [];
|
|
281
|
+
const orderFiles = await (0, glob_1.glob)([
|
|
282
|
+
"app/api/order/**/*.ts",
|
|
283
|
+
"app/api/*/order/**/*.ts",
|
|
284
|
+
"lib/**/order*.ts",
|
|
285
|
+
], {
|
|
286
|
+
cwd: process.cwd(),
|
|
287
|
+
absolute: true,
|
|
288
|
+
});
|
|
289
|
+
for (const file of orderFiles) {
|
|
290
|
+
if (!fs.existsSync(file))
|
|
291
|
+
continue;
|
|
292
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
293
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
294
|
+
// Check for inventory update on order
|
|
295
|
+
if (content.includes("create") && relativePath.includes("order")) {
|
|
296
|
+
const updatesInventory = /inventory|stock|decrement|quantity/i.test(content);
|
|
297
|
+
if (!updatesInventory) {
|
|
298
|
+
issues.push({
|
|
299
|
+
rule: "order-inventory-update",
|
|
300
|
+
message: "Order creation may not update inventory",
|
|
301
|
+
file: relativePath,
|
|
302
|
+
severity: "warning",
|
|
303
|
+
suggestion: "Decrement inventory when order is confirmed",
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Check for confirmation email
|
|
308
|
+
if (content.includes("createOrder") || content.includes("confirmOrder")) {
|
|
309
|
+
const sendsEmail = /email|sendEmail|mail|notification|notify/i.test(content);
|
|
310
|
+
if (!sendsEmail) {
|
|
311
|
+
issues.push({
|
|
312
|
+
rule: "order-confirmation-email",
|
|
313
|
+
message: "Order creation may not trigger confirmation email",
|
|
314
|
+
file: relativePath,
|
|
315
|
+
severity: "info",
|
|
316
|
+
suggestion: "Send order confirmation email to customer",
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return issues;
|
|
322
|
+
}
|
|
323
|
+
async function checkErrorRecovery() {
|
|
324
|
+
const issues = [];
|
|
325
|
+
// Find checkout-related frontend components
|
|
326
|
+
const checkoutComponents = await (0, glob_1.glob)([
|
|
327
|
+
"app/**/checkout/**/*.tsx",
|
|
328
|
+
"components/**/checkout/**/*.tsx",
|
|
329
|
+
"components/**/cart/**/*.tsx",
|
|
330
|
+
], {
|
|
331
|
+
cwd: process.cwd(),
|
|
332
|
+
absolute: true,
|
|
333
|
+
});
|
|
334
|
+
for (const file of checkoutComponents) {
|
|
335
|
+
if (!fs.existsSync(file))
|
|
336
|
+
continue;
|
|
337
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
338
|
+
const relativePath = path.relative(process.cwd(), file);
|
|
339
|
+
// Check for error state handling
|
|
340
|
+
const hasErrorHandling = /error|Error|catch|onError|isError/i.test(content);
|
|
341
|
+
const hasErrorDisplay = /error\s*&&|error\s*\?|{error}|showError|errorMessage/i.test(content);
|
|
342
|
+
if (hasErrorHandling && !hasErrorDisplay) {
|
|
343
|
+
issues.push({
|
|
344
|
+
rule: "checkout-error-display",
|
|
345
|
+
message: "Checkout component handles errors but may not display them",
|
|
346
|
+
file: relativePath,
|
|
347
|
+
severity: "warning",
|
|
348
|
+
suggestion: "Display user-friendly error messages for checkout failures",
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
// Check for loading states
|
|
352
|
+
const hasLoadingState = /loading|isLoading|pending|submitting/i.test(content);
|
|
353
|
+
if (!hasLoadingState) {
|
|
354
|
+
issues.push({
|
|
355
|
+
rule: "checkout-loading-state",
|
|
356
|
+
message: "Checkout component may not show loading state",
|
|
357
|
+
file: relativePath,
|
|
358
|
+
severity: "info",
|
|
359
|
+
suggestion: "Show loading indicator during checkout submission",
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
// Check for retry capability
|
|
363
|
+
if (content.includes("payment") || content.includes("submit")) {
|
|
364
|
+
const hasRetry = /retry|try again|resubmit/i.test(content);
|
|
365
|
+
if (!hasRetry) {
|
|
366
|
+
issues.push({
|
|
367
|
+
rule: "checkout-retry-capability",
|
|
368
|
+
message: "Checkout may not allow retry on failure",
|
|
369
|
+
file: relativePath,
|
|
370
|
+
severity: "info",
|
|
371
|
+
suggestion: "Allow users to retry failed checkout attempts",
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return issues;
|
|
377
|
+
}
|
|
378
|
+
async function run() {
|
|
379
|
+
const startTime = Date.now();
|
|
380
|
+
const allIssues = [];
|
|
381
|
+
// Run all checks
|
|
382
|
+
allIssues.push(...await checkCartOperations());
|
|
383
|
+
allIssues.push(...await checkCheckoutSecurity());
|
|
384
|
+
allIssues.push(...await checkPaymentIntegration());
|
|
385
|
+
allIssues.push(...await checkOrderCreation());
|
|
386
|
+
allIssues.push(...await checkErrorRecovery());
|
|
387
|
+
// Convert to findings
|
|
388
|
+
const findings = allIssues.map(issue => ({
|
|
389
|
+
level: issue.severity,
|
|
390
|
+
message: issue.message,
|
|
391
|
+
file: issue.file,
|
|
392
|
+
startLine: issue.line,
|
|
393
|
+
ruleId: issue.rule,
|
|
394
|
+
suggestion: issue.suggestion,
|
|
395
|
+
}));
|
|
396
|
+
const errors = findings.filter(f => f.level === "error");
|
|
397
|
+
const warnings = findings.filter(f => f.level === "warning");
|
|
398
|
+
const infos = findings.filter(f => f.level === "info");
|
|
399
|
+
return {
|
|
400
|
+
passed: errors.length === 0,
|
|
401
|
+
findings,
|
|
402
|
+
duration: Date.now() - startTime,
|
|
403
|
+
metadata: {
|
|
404
|
+
errors: errors.length,
|
|
405
|
+
warnings: warnings.length,
|
|
406
|
+
infos: infos.length,
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
async function main() {
|
|
411
|
+
console.log(`\n${console_chars_1.emoji.store} CHECKOUT FLOW VALIDATION`);
|
|
412
|
+
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
413
|
+
const result = await run();
|
|
414
|
+
const { errors, warnings, infos } = result.metadata || {};
|
|
415
|
+
console.log(`\n${console_chars_1.emoji.search} Checking checkout flow...`);
|
|
416
|
+
console.log(`\n${console_chars_1.emoji.chart} Summary:`);
|
|
417
|
+
console.log(` Errors: ${errors}`);
|
|
418
|
+
console.log(` Warnings: ${warnings}`);
|
|
419
|
+
console.log(` Info: ${infos}`);
|
|
420
|
+
if (result.findings.length === 0) {
|
|
421
|
+
console.log(`\n${console_chars_1.emoji.info} No checkout-related code found to validate`);
|
|
422
|
+
process.exit(0);
|
|
423
|
+
}
|
|
424
|
+
if (result.passed && warnings === 0) {
|
|
425
|
+
console.log(`\n${console_chars_1.emoji.success} CHECKOUT FLOW VALIDATION PASSED`);
|
|
426
|
+
console.log(`\nAll checkout best practices are followed.`);
|
|
427
|
+
process.exit(0);
|
|
428
|
+
}
|
|
429
|
+
// Print errors
|
|
430
|
+
const errorFindings = result.findings.filter(f => f.level === "error");
|
|
431
|
+
if (errorFindings.length > 0) {
|
|
432
|
+
console.log(`\n${console_chars_1.emoji.error} Errors (blocking):`);
|
|
433
|
+
for (const finding of errorFindings) {
|
|
434
|
+
console.log(`\n ${finding.file}`);
|
|
435
|
+
console.log(` ${finding.message}`);
|
|
436
|
+
if (finding.suggestion) {
|
|
437
|
+
console.log(` ${console_chars_1.emoji.hint} ${finding.suggestion}`);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
// Print warnings
|
|
442
|
+
const warningFindings = result.findings.filter(f => f.level === "warning");
|
|
443
|
+
if (warningFindings.length > 0) {
|
|
444
|
+
console.log(`\n${console_chars_1.emoji.warning} Warnings:`);
|
|
445
|
+
for (const finding of warningFindings.slice(0, 10)) {
|
|
446
|
+
console.log(`\n ${finding.file}`);
|
|
447
|
+
console.log(` ${finding.message}`);
|
|
448
|
+
}
|
|
449
|
+
if (warningFindings.length > 10) {
|
|
450
|
+
console.log(`\n ... and ${warningFindings.length - 10} more warnings`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
console.log(`\n${console_chars_1.emoji.info} Checkout Security Best Practices:`);
|
|
454
|
+
console.log(` - Validate stock before adding to cart`);
|
|
455
|
+
console.log(` - Calculate prices on server, never trust client`);
|
|
456
|
+
console.log(` - Re-validate stock at order creation`);
|
|
457
|
+
console.log(` - Use database transactions for orders`);
|
|
458
|
+
console.log(` - Verify webhook signatures`);
|
|
459
|
+
console.log(` - Handle payment failures gracefully`);
|
|
460
|
+
if (!result.passed) {
|
|
461
|
+
console.log(`\n${console_chars_1.emoji.error} CHECKOUT FLOW VALIDATION FAILED`);
|
|
462
|
+
process.exit(1);
|
|
463
|
+
}
|
|
464
|
+
console.log(`\n${console_chars_1.emoji.success} CHECKOUT FLOW VALIDATION PASSED`);
|
|
465
|
+
process.exit(0);
|
|
466
|
+
}
|
|
467
|
+
if (require.main === module) {
|
|
468
|
+
main().catch((err) => {
|
|
469
|
+
console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
|
|
470
|
+
process.exit(1);
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=checkout-flow-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout-flow-validation.js","sourceRoot":"","sources":["../../../src/checks/checkout/checkout-flow-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 = "database/enum-sync-validation";
|
|
4
|
+
export declare const name = "Enum Sync Validation";
|
|
5
|
+
export declare const description = "Validates enum consistency between Prisma schema and TypeScript";
|
|
6
|
+
export declare const category = "database";
|
|
7
|
+
export declare const blocking = true;
|
|
8
|
+
export declare const tags: string[];
|
|
9
|
+
export declare function run(): Promise<PreflightCheckResult>;
|
|
10
|
+
//# sourceMappingURL=enum-sync-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum-sync-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/database/enum-sync-validation.ts"],"names":[],"mappings":";AA0BA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAG1E,eAAO,MAAM,EAAE,kCAAkC,CAAC;AAClD,eAAO,MAAM,IAAI,yBAAyB,CAAC;AAC3C,eAAO,MAAM,WAAW,oEAAoE,CAAC;AAC7F,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAwD,CAAC;AA+R1E,wBAAsB,GAAG,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAqEzD"}
|