@empline/preflight 1.1.31 → 1.1.33
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/cart/cart-guest-merge.d.ts +14 -0
- package/dist/checks/cart/cart-guest-merge.d.ts.map +1 -0
- package/dist/checks/cart/cart-guest-merge.js +217 -0
- package/dist/checks/cart/cart-guest-merge.js.map +1 -0
- package/dist/checks/cart/cart-quantity-validation.d.ts +14 -0
- package/dist/checks/cart/cart-quantity-validation.d.ts.map +1 -0
- package/dist/checks/cart/cart-quantity-validation.js +211 -0
- package/dist/checks/cart/cart-quantity-validation.js.map +1 -0
- package/dist/checks/cart/cart-stock-validation.d.ts +14 -0
- package/dist/checks/cart/cart-stock-validation.d.ts.map +1 -0
- package/dist/checks/cart/cart-stock-validation.js +211 -0
- package/dist/checks/cart/cart-stock-validation.js.map +1 -0
- package/dist/checks/checkout/checkout-multi-store.d.ts +14 -0
- package/dist/checks/checkout/checkout-multi-store.d.ts.map +1 -0
- package/dist/checks/checkout/checkout-multi-store.js +209 -0
- package/dist/checks/checkout/checkout-multi-store.js.map +1 -0
- package/dist/checks/checkout/checkout-tax-consistency.d.ts +14 -0
- package/dist/checks/checkout/checkout-tax-consistency.d.ts.map +1 -0
- package/dist/checks/checkout/checkout-tax-consistency.js +212 -0
- package/dist/checks/checkout/checkout-tax-consistency.js.map +1 -0
- package/dist/checks/framework/prisma-version-bugs.d.ts +47 -0
- package/dist/checks/framework/prisma-version-bugs.d.ts.map +1 -0
- package/dist/checks/framework/prisma-version-bugs.js +232 -0
- package/dist/checks/framework/prisma-version-bugs.js.map +1 -0
- package/dist/checks/framework/turbopack-prisma-external.d.ts +37 -0
- package/dist/checks/framework/turbopack-prisma-external.d.ts.map +1 -0
- package/dist/checks/framework/turbopack-prisma-external.js +144 -0
- package/dist/checks/framework/turbopack-prisma-external.js.map +1 -0
- package/dist/checks/listing-approval/image-processing-validation.d.ts +14 -0
- package/dist/checks/listing-approval/image-processing-validation.d.ts.map +1 -0
- package/dist/checks/listing-approval/image-processing-validation.js +198 -0
- package/dist/checks/listing-approval/image-processing-validation.js.map +1 -0
- package/dist/checks/listing-approval/r2-metadata-application.d.ts +14 -0
- package/dist/checks/listing-approval/r2-metadata-application.d.ts.map +1 -0
- package/dist/checks/listing-approval/r2-metadata-application.js +261 -0
- package/dist/checks/listing-approval/r2-metadata-application.js.map +1 -0
- package/dist/checks/listing-approval/seo-metadata-consistency.d.ts +14 -0
- package/dist/checks/listing-approval/seo-metadata-consistency.d.ts.map +1 -0
- package/dist/checks/listing-approval/seo-metadata-consistency.js +408 -0
- package/dist/checks/listing-approval/seo-metadata-consistency.js.map +1 -0
- package/dist/checks/order/order-inventory-guard.d.ts +14 -0
- package/dist/checks/order/order-inventory-guard.d.ts.map +1 -0
- package/dist/checks/order/order-inventory-guard.js +212 -0
- package/dist/checks/order/order-inventory-guard.js.map +1 -0
- package/dist/checks/order/order-status-validation.d.ts +14 -0
- package/dist/checks/order/order-status-validation.d.ts.map +1 -0
- package/dist/checks/order/order-status-validation.js +218 -0
- package/dist/checks/order/order-status-validation.js.map +1 -0
- package/dist/checks/order/shipping-address-validation.d.ts +14 -0
- package/dist/checks/order/shipping-address-validation.d.ts.map +1 -0
- package/dist/checks/order/shipping-address-validation.js +213 -0
- package/dist/checks/order/shipping-address-validation.js.map +1 -0
- package/dist/checks/ui/batch-progress-consistency.d.ts +13 -0
- package/dist/checks/ui/batch-progress-consistency.d.ts.map +1 -0
- package/dist/checks/ui/batch-progress-consistency.js +200 -0
- package/dist/checks/ui/batch-progress-consistency.js.map +1 -0
- package/dist/checks/ui/bulk-action-progress-feedback.d.ts +13 -0
- package/dist/checks/ui/bulk-action-progress-feedback.d.ts.map +1 -0
- package/dist/checks/ui/bulk-action-progress-feedback.js +273 -0
- package/dist/checks/ui/bulk-action-progress-feedback.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.requires = exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
|
|
8
|
+
exports.run = run;
|
|
9
|
+
/**
|
|
10
|
+
* Cart Stock Validation Preflight
|
|
11
|
+
*
|
|
12
|
+
* Validates that cart operations properly check stock availability before
|
|
13
|
+
* allowing items to be added or quantities to be updated.
|
|
14
|
+
*
|
|
15
|
+
* Critical patterns to validate:
|
|
16
|
+
* 1. Cart validate API checks listing.listingStatus === 'ACTIVE'
|
|
17
|
+
* 2. Cart validate API checks listing.quantityAvailable > 0
|
|
18
|
+
* 3. Cart validate API checks requested quantity <= available
|
|
19
|
+
* 4. Cart items cannot reference deleted listings (deletedAt check)
|
|
20
|
+
* 5. Stock validation happens before checkout proceeds
|
|
21
|
+
*
|
|
22
|
+
* Prevents:
|
|
23
|
+
* - Adding out-of-stock items to cart
|
|
24
|
+
* - Purchasing unavailable products
|
|
25
|
+
* - Cart containing inactive/deleted listings
|
|
26
|
+
*/
|
|
27
|
+
const fs_1 = __importDefault(require("fs"));
|
|
28
|
+
const path_1 = __importDefault(require("path"));
|
|
29
|
+
const glob_1 = require("glob");
|
|
30
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
31
|
+
// METADATA - Required for plugin loader discovery
|
|
32
|
+
exports.id = "cart/cart-stock-validation";
|
|
33
|
+
exports.name = "Cart Stock Validation";
|
|
34
|
+
exports.description = "Validates cart operations check stock availability";
|
|
35
|
+
exports.category = "cart";
|
|
36
|
+
exports.blocking = true;
|
|
37
|
+
exports.tags = ["cart", "stock", "inventory", "validation", "ecommerce"];
|
|
38
|
+
exports.requires = ["trading-card-system"];
|
|
39
|
+
/**
|
|
40
|
+
* Files to check for cart validation patterns
|
|
41
|
+
*/
|
|
42
|
+
const CART_FILES = [
|
|
43
|
+
"app/api/cart/validate/route.ts",
|
|
44
|
+
"app/api/cart/validate-item/route.ts",
|
|
45
|
+
"app/actions/cart.ts",
|
|
46
|
+
"lib/cart*.ts",
|
|
47
|
+
];
|
|
48
|
+
/**
|
|
49
|
+
* Required patterns for stock validation
|
|
50
|
+
*/
|
|
51
|
+
const REQUIRED_PATTERNS = {
|
|
52
|
+
// Must check listing status is ACTIVE
|
|
53
|
+
activeStatusCheck: {
|
|
54
|
+
pattern: /listingStatus\s*(?:===|!==|==|!=)\s*['"]ACTIVE['"]|status\s*(?:===|!==)\s*['"]ACTIVE['"]/,
|
|
55
|
+
description: "Check that listing status is ACTIVE",
|
|
56
|
+
critical: true,
|
|
57
|
+
},
|
|
58
|
+
// Must check quantity available > 0
|
|
59
|
+
stockAvailabilityCheck: {
|
|
60
|
+
pattern: /quantityAvailable\s*(?:>|>=|<=|<)\s*\d|quantityAvailable\s*(?:===|!==)\s*0/,
|
|
61
|
+
description: "Check that quantityAvailable is sufficient",
|
|
62
|
+
critical: true,
|
|
63
|
+
},
|
|
64
|
+
// Must compare requested vs available quantity
|
|
65
|
+
quantityComparison: {
|
|
66
|
+
pattern: /quantity\s*(?:>|<=)\s*(?:listing\.)?quantityAvailable|quantityAvailable\s*(?:<|>=)\s*quantity/,
|
|
67
|
+
description: "Compare requested quantity against available",
|
|
68
|
+
critical: true,
|
|
69
|
+
},
|
|
70
|
+
// Must check for deleted listings
|
|
71
|
+
deletedCheck: {
|
|
72
|
+
pattern: /deletedAt\s*(?:===|!==|==|!=)\s*null|NOT\s+deletedAt|deletedAt:\s*null/i,
|
|
73
|
+
description: "Check that listing is not deleted",
|
|
74
|
+
critical: true,
|
|
75
|
+
},
|
|
76
|
+
// Must return validation result structure
|
|
77
|
+
validationResult: {
|
|
78
|
+
pattern: /validItems|removedItems|updatedItems|isValid|errors/,
|
|
79
|
+
description: "Return structured validation result",
|
|
80
|
+
critical: false,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Anti-patterns that indicate missing validation
|
|
85
|
+
*/
|
|
86
|
+
const ANTI_PATTERNS = {
|
|
87
|
+
// Adding to cart without any validation
|
|
88
|
+
addWithoutValidation: {
|
|
89
|
+
pattern: /addToCart\s*\([^)]*\)\s*\{(?:(?!quantityAvailable|listingStatus|ACTIVE).)*\}/s,
|
|
90
|
+
description: "addToCart function without stock validation",
|
|
91
|
+
},
|
|
92
|
+
// Direct cart item creation without stock check
|
|
93
|
+
directCartCreate: {
|
|
94
|
+
pattern: /create\s*\(\s*\{[^}]*data:\s*\{[^}]*listingId(?:(?!quantityAvailable).)*\}\s*\)/s,
|
|
95
|
+
description: "Direct cart item creation without stock check",
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
async function run() {
|
|
99
|
+
console.log(`\n${console_chars_1.emoji.package} CART STOCK VALIDATION CHECK`);
|
|
100
|
+
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
101
|
+
const issues = [];
|
|
102
|
+
const filesChecked = [];
|
|
103
|
+
// Find all cart-related files
|
|
104
|
+
const allFiles = [];
|
|
105
|
+
for (const pattern of CART_FILES) {
|
|
106
|
+
const matches = await (0, glob_1.glob)(pattern, { cwd: process.cwd() });
|
|
107
|
+
allFiles.push(...matches);
|
|
108
|
+
}
|
|
109
|
+
const uniqueFiles = [...new Set(allFiles)];
|
|
110
|
+
console.log(`\n${console_chars_1.emoji.search} Scanning ${uniqueFiles.length} cart files...`);
|
|
111
|
+
if (uniqueFiles.length === 0) {
|
|
112
|
+
console.log(`\n${console_chars_1.emoji.warning} No cart files found - skipping check`);
|
|
113
|
+
return { success: true, errors: 0, warnings: 1 };
|
|
114
|
+
}
|
|
115
|
+
// Combine all file contents for pattern checking
|
|
116
|
+
let combinedContent = "";
|
|
117
|
+
for (const relativePath of uniqueFiles) {
|
|
118
|
+
const filePath = path_1.default.join(process.cwd(), relativePath);
|
|
119
|
+
if (!fs_1.default.existsSync(filePath))
|
|
120
|
+
continue;
|
|
121
|
+
filesChecked.push(relativePath);
|
|
122
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
123
|
+
combinedContent += content + "\n";
|
|
124
|
+
console.log(` ${console_chars_1.emoji.file} ${relativePath}`);
|
|
125
|
+
}
|
|
126
|
+
// Check required patterns across all cart files
|
|
127
|
+
console.log(`\n${console_chars_1.emoji.search} Checking required validation patterns...`);
|
|
128
|
+
for (const [name, check] of Object.entries(REQUIRED_PATTERNS)) {
|
|
129
|
+
const hasPattern = check.pattern.test(combinedContent);
|
|
130
|
+
if (!hasPattern) {
|
|
131
|
+
issues.push({
|
|
132
|
+
file: "cart files",
|
|
133
|
+
type: "missing-pattern",
|
|
134
|
+
pattern: name,
|
|
135
|
+
description: check.description,
|
|
136
|
+
critical: check.critical,
|
|
137
|
+
});
|
|
138
|
+
const icon = check.critical ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
|
|
139
|
+
console.log(` ${icon} Missing: ${check.description}`);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.log(` ${console_chars_1.emoji.success} Found: ${check.description}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Check for anti-patterns in individual files
|
|
146
|
+
console.log(`\n${console_chars_1.emoji.search} Checking for anti-patterns...`);
|
|
147
|
+
for (const relativePath of filesChecked) {
|
|
148
|
+
const filePath = path_1.default.join(process.cwd(), relativePath);
|
|
149
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
150
|
+
for (const [name, check] of Object.entries(ANTI_PATTERNS)) {
|
|
151
|
+
if (check.pattern.test(content)) {
|
|
152
|
+
issues.push({
|
|
153
|
+
file: relativePath,
|
|
154
|
+
type: "anti-pattern",
|
|
155
|
+
pattern: name,
|
|
156
|
+
description: check.description,
|
|
157
|
+
critical: true,
|
|
158
|
+
});
|
|
159
|
+
console.log(` ${console_chars_1.emoji.error} ${relativePath}: ${check.description}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Summary
|
|
164
|
+
const criticalIssues = issues.filter((i) => i.critical);
|
|
165
|
+
const warningIssues = issues.filter((i) => !i.critical);
|
|
166
|
+
console.log(`\n${console_chars_1.emoji.chart} Summary:`);
|
|
167
|
+
console.log(` Files checked: ${filesChecked.length}`);
|
|
168
|
+
console.log(` Critical issues: ${criticalIssues.length}`);
|
|
169
|
+
console.log(` Warning issues: ${warningIssues.length}`);
|
|
170
|
+
if (issues.length === 0) {
|
|
171
|
+
console.log(`\n${console_chars_1.emoji.success} CART STOCK VALIDATION CHECK PASSED`);
|
|
172
|
+
console.log(`\nAll cart operations properly validate stock availability.`);
|
|
173
|
+
return { success: true, errors: 0, warnings: 0 };
|
|
174
|
+
}
|
|
175
|
+
if (criticalIssues.length > 0) {
|
|
176
|
+
console.log(`\n${console_chars_1.emoji.error} Critical issues:`);
|
|
177
|
+
for (const issue of criticalIssues) {
|
|
178
|
+
console.log(` ${issue.file}: ${issue.description}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (warningIssues.length > 0) {
|
|
182
|
+
console.log(`\n${console_chars_1.emoji.warning} Warning issues:`);
|
|
183
|
+
for (const issue of warningIssues) {
|
|
184
|
+
console.log(` ${issue.file}: ${issue.description}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
console.log(`\n${console_chars_1.emoji.info} Cart stock validation requirements:`);
|
|
188
|
+
console.log(` 1. Check listing.listingStatus === 'ACTIVE'`);
|
|
189
|
+
console.log(` 2. Check listing.quantityAvailable > 0`);
|
|
190
|
+
console.log(` 3. Check requested quantity <= available`);
|
|
191
|
+
console.log(` 4. Check listing.deletedAt === null`);
|
|
192
|
+
console.log(` 5. Return structured validation result`);
|
|
193
|
+
if (criticalIssues.length > 0) {
|
|
194
|
+
console.log(`\n${console_chars_1.emoji.error} CART STOCK VALIDATION CHECK FAILED`);
|
|
195
|
+
return { success: false, errors: criticalIssues.length, warnings: warningIssues.length };
|
|
196
|
+
}
|
|
197
|
+
console.log(`\n${console_chars_1.emoji.warning} CART STOCK VALIDATION CHECK PASSED WITH WARNINGS`);
|
|
198
|
+
return { success: true, errors: 0, warnings: warningIssues.length };
|
|
199
|
+
}
|
|
200
|
+
// Allow direct execution
|
|
201
|
+
if (require.main === module) {
|
|
202
|
+
run()
|
|
203
|
+
.then((result) => {
|
|
204
|
+
process.exit(result.success ? 0 : 1);
|
|
205
|
+
})
|
|
206
|
+
.catch((err) => {
|
|
207
|
+
console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
|
|
208
|
+
process.exit(1);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=cart-stock-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cart-stock-validation.js","sourceRoot":"","sources":["../../../src/checks/cart/cart-stock-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export declare const id = "checkout/checkout-multi-store";
|
|
3
|
+
export declare const name = "Checkout Multi-Store Handling";
|
|
4
|
+
export declare const description = "Validates multi-seller checkout handling";
|
|
5
|
+
export declare const category = "checkout";
|
|
6
|
+
export declare const blocking = true;
|
|
7
|
+
export declare const tags: string[];
|
|
8
|
+
export declare const requires: string[];
|
|
9
|
+
export declare function run(): Promise<{
|
|
10
|
+
success: boolean;
|
|
11
|
+
errors: number;
|
|
12
|
+
warnings: number;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=checkout-multi-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout-multi-store.d.ts","sourceRoot":"","sources":["../../../src/checks/checkout/checkout-multi-store.ts"],"names":[],"mappings":";AAwBA,eAAO,MAAM,EAAE,kCAAkC,CAAC;AAClD,eAAO,MAAM,IAAI,kCAAkC,CAAC;AACpD,eAAO,MAAM,WAAW,6CAA6C,CAAC;AACtE,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAoE,CAAC;AACtF,eAAO,MAAM,QAAQ,UAA0B,CAAC;AA+EhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAiH3F"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.requires = exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
|
|
8
|
+
exports.run = run;
|
|
9
|
+
/**
|
|
10
|
+
* Checkout Multi-Store Preflight
|
|
11
|
+
*
|
|
12
|
+
* Validates that checkout properly handles orders containing items from
|
|
13
|
+
* multiple stores/sellers:
|
|
14
|
+
* 1. Orders track storeId for seller association
|
|
15
|
+
* 2. Order items reference listings with storeId
|
|
16
|
+
* 3. Seller notifications sent for each store's items
|
|
17
|
+
* 4. Items grouped by seller in order processing
|
|
18
|
+
* 5. Seller earnings calculated per store (with platform fee)
|
|
19
|
+
*
|
|
20
|
+
* Prevents:
|
|
21
|
+
* - Orders without store association
|
|
22
|
+
* - Missing seller notifications
|
|
23
|
+
* - Incorrect earnings calculations
|
|
24
|
+
*/
|
|
25
|
+
const fs_1 = __importDefault(require("fs"));
|
|
26
|
+
const path_1 = __importDefault(require("path"));
|
|
27
|
+
const glob_1 = require("glob");
|
|
28
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
29
|
+
// METADATA - Required for plugin loader discovery
|
|
30
|
+
exports.id = "checkout/checkout-multi-store";
|
|
31
|
+
exports.name = "Checkout Multi-Store Handling";
|
|
32
|
+
exports.description = "Validates multi-seller checkout handling";
|
|
33
|
+
exports.category = "checkout";
|
|
34
|
+
exports.blocking = true;
|
|
35
|
+
exports.tags = ["checkout", "multi-store", "seller", "marketplace", "ecommerce"];
|
|
36
|
+
exports.requires = ["trading-card-system"];
|
|
37
|
+
/**
|
|
38
|
+
* Files to check
|
|
39
|
+
*/
|
|
40
|
+
const CHECKOUT_FILES = [
|
|
41
|
+
"app/api/orders/create/route.ts",
|
|
42
|
+
"app/api/orders/capture/route.ts",
|
|
43
|
+
"app/api/orders/process/route.ts",
|
|
44
|
+
"lib/order-service.ts",
|
|
45
|
+
"lib/order*.ts",
|
|
46
|
+
];
|
|
47
|
+
const NOTIFICATION_FILES = [
|
|
48
|
+
"lib/notifications*.ts",
|
|
49
|
+
"lib/email*.ts",
|
|
50
|
+
"app/api/**/notify/route.ts",
|
|
51
|
+
];
|
|
52
|
+
/**
|
|
53
|
+
* Required patterns for multi-store handling
|
|
54
|
+
*/
|
|
55
|
+
const REQUIRED_PATTERNS = {
|
|
56
|
+
// Store ID on orders
|
|
57
|
+
storeIdOnOrder: {
|
|
58
|
+
pattern: /storeId:\s*(?:listing\.storeId|item\.storeId|storeId)|coreOrders.*storeId/,
|
|
59
|
+
description: "Store ID associated with orders",
|
|
60
|
+
critical: true,
|
|
61
|
+
},
|
|
62
|
+
// Listings have store reference
|
|
63
|
+
listingStoreReference: {
|
|
64
|
+
pattern: /listing\.storeId|include:\s*\{[^}]*store|storeId.*listing/,
|
|
65
|
+
description: "Listings reference their store",
|
|
66
|
+
critical: true,
|
|
67
|
+
},
|
|
68
|
+
// Group items by store/seller
|
|
69
|
+
groupByStore: {
|
|
70
|
+
pattern: /groupBy.*store|byStore|storeGroups|itemsByStore|sellerItems|Map.*storeId/i,
|
|
71
|
+
description: "Items grouped by store/seller",
|
|
72
|
+
critical: true,
|
|
73
|
+
},
|
|
74
|
+
// Seller notification
|
|
75
|
+
sellerNotification: {
|
|
76
|
+
pattern: /ORDER_RECEIVED|notifySeller|sendToSeller|seller.*notification|sellerEmail/i,
|
|
77
|
+
description: "Seller notification for orders",
|
|
78
|
+
critical: true,
|
|
79
|
+
},
|
|
80
|
+
// Platform fee calculation
|
|
81
|
+
platformFeeCalculation: {
|
|
82
|
+
pattern: /platformFee|commission|sellerEarnings|earnings.*fee|0\.1|10\s*%/i,
|
|
83
|
+
description: "Platform fee/commission calculation",
|
|
84
|
+
critical: false,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Anti-patterns
|
|
89
|
+
*/
|
|
90
|
+
const ANTI_PATTERNS = {
|
|
91
|
+
// Order creation without storeId
|
|
92
|
+
orderWithoutStore: {
|
|
93
|
+
pattern: /create\s*\(\s*\{[^}]*data:\s*\{(?:(?!storeId).)*orderId/s,
|
|
94
|
+
description: "Order created without storeId",
|
|
95
|
+
},
|
|
96
|
+
// Single seller assumption
|
|
97
|
+
singleSellerAssumption: {
|
|
98
|
+
pattern: /\/\/\s*assume.*single.*seller|seller\s*=\s*orders?\[0\]/i,
|
|
99
|
+
description: "Code assumes single seller per order",
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
async function run() {
|
|
103
|
+
console.log(`\n${console_chars_1.emoji.globe} CHECKOUT MULTI-STORE HANDLING CHECK`);
|
|
104
|
+
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
105
|
+
const issues = [];
|
|
106
|
+
const filesChecked = [];
|
|
107
|
+
// Find all relevant files
|
|
108
|
+
const allPatterns = [...CHECKOUT_FILES, ...NOTIFICATION_FILES];
|
|
109
|
+
const allFiles = [];
|
|
110
|
+
for (const pattern of allPatterns) {
|
|
111
|
+
const matches = await (0, glob_1.glob)(pattern, { cwd: process.cwd() });
|
|
112
|
+
allFiles.push(...matches);
|
|
113
|
+
}
|
|
114
|
+
const uniqueFiles = [...new Set(allFiles)];
|
|
115
|
+
console.log(`\n${console_chars_1.emoji.search} Scanning ${uniqueFiles.length} checkout/notification files...`);
|
|
116
|
+
if (uniqueFiles.length === 0) {
|
|
117
|
+
console.log(`\n${console_chars_1.emoji.warning} No checkout files found - skipping check`);
|
|
118
|
+
return { success: true, errors: 0, warnings: 1 };
|
|
119
|
+
}
|
|
120
|
+
// Combine content
|
|
121
|
+
let combinedContent = "";
|
|
122
|
+
for (const relativePath of uniqueFiles) {
|
|
123
|
+
const filePath = path_1.default.join(process.cwd(), relativePath);
|
|
124
|
+
if (!fs_1.default.existsSync(filePath))
|
|
125
|
+
continue;
|
|
126
|
+
filesChecked.push(relativePath);
|
|
127
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
128
|
+
combinedContent += content + "\n";
|
|
129
|
+
console.log(` ${console_chars_1.emoji.file} ${relativePath}`);
|
|
130
|
+
}
|
|
131
|
+
// Check required patterns
|
|
132
|
+
console.log(`\n${console_chars_1.emoji.search} Checking multi-store patterns...`);
|
|
133
|
+
for (const [name, check] of Object.entries(REQUIRED_PATTERNS)) {
|
|
134
|
+
const hasPattern = check.pattern.test(combinedContent);
|
|
135
|
+
if (!hasPattern) {
|
|
136
|
+
issues.push({
|
|
137
|
+
file: "checkout files",
|
|
138
|
+
type: "missing-pattern",
|
|
139
|
+
pattern: name,
|
|
140
|
+
description: check.description,
|
|
141
|
+
critical: check.critical,
|
|
142
|
+
});
|
|
143
|
+
const icon = check.critical ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
|
|
144
|
+
console.log(` ${icon} Missing: ${check.description}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.log(` ${console_chars_1.emoji.success} Found: ${check.description}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Check anti-patterns
|
|
151
|
+
console.log(`\n${console_chars_1.emoji.search} Checking for anti-patterns...`);
|
|
152
|
+
for (const relativePath of filesChecked) {
|
|
153
|
+
const filePath = path_1.default.join(process.cwd(), relativePath);
|
|
154
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
155
|
+
for (const [name, check] of Object.entries(ANTI_PATTERNS)) {
|
|
156
|
+
if (check.pattern.test(content)) {
|
|
157
|
+
issues.push({
|
|
158
|
+
file: relativePath,
|
|
159
|
+
type: "anti-pattern",
|
|
160
|
+
pattern: name,
|
|
161
|
+
description: check.description,
|
|
162
|
+
critical: true,
|
|
163
|
+
});
|
|
164
|
+
console.log(` ${console_chars_1.emoji.error} ${relativePath}: ${check.description}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Summary
|
|
169
|
+
const criticalIssues = issues.filter((i) => i.critical);
|
|
170
|
+
const warningIssues = issues.filter((i) => !i.critical);
|
|
171
|
+
console.log(`\n${console_chars_1.emoji.chart} Summary:`);
|
|
172
|
+
console.log(` Files checked: ${filesChecked.length}`);
|
|
173
|
+
console.log(` Critical issues: ${criticalIssues.length}`);
|
|
174
|
+
console.log(` Warning issues: ${warningIssues.length}`);
|
|
175
|
+
if (issues.length === 0) {
|
|
176
|
+
console.log(`\n${console_chars_1.emoji.success} CHECKOUT MULTI-STORE CHECK PASSED`);
|
|
177
|
+
return { success: true, errors: 0, warnings: 0 };
|
|
178
|
+
}
|
|
179
|
+
if (criticalIssues.length > 0) {
|
|
180
|
+
console.log(`\n${console_chars_1.emoji.error} Critical issues:`);
|
|
181
|
+
for (const issue of criticalIssues) {
|
|
182
|
+
console.log(` ${issue.file}: ${issue.description}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
console.log(`\n${console_chars_1.emoji.info} Multi-store checkout requirements:`);
|
|
186
|
+
console.log(` 1. Orders must have storeId for seller association`);
|
|
187
|
+
console.log(` 2. Listings must reference their store`);
|
|
188
|
+
console.log(` 3. Items should be grouped by store/seller`);
|
|
189
|
+
console.log(` 4. Each seller must receive notification`);
|
|
190
|
+
console.log(` 5. Seller earnings calculated with platform fee`);
|
|
191
|
+
if (criticalIssues.length > 0) {
|
|
192
|
+
console.log(`\n${console_chars_1.emoji.error} CHECKOUT MULTI-STORE CHECK FAILED`);
|
|
193
|
+
return { success: false, errors: criticalIssues.length, warnings: warningIssues.length };
|
|
194
|
+
}
|
|
195
|
+
console.log(`\n${console_chars_1.emoji.warning} CHECKOUT MULTI-STORE CHECK PASSED WITH WARNINGS`);
|
|
196
|
+
return { success: true, errors: 0, warnings: warningIssues.length };
|
|
197
|
+
}
|
|
198
|
+
// Allow direct execution
|
|
199
|
+
if (require.main === module) {
|
|
200
|
+
run()
|
|
201
|
+
.then((result) => {
|
|
202
|
+
process.exit(result.success ? 0 : 1);
|
|
203
|
+
})
|
|
204
|
+
.catch((err) => {
|
|
205
|
+
console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
|
|
206
|
+
process.exit(1);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=checkout-multi-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout-multi-store.js","sourceRoot":"","sources":["../../../src/checks/checkout/checkout-multi-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export declare const id = "checkout/checkout-tax-consistency";
|
|
3
|
+
export declare const name = "Checkout Tax Consistency";
|
|
4
|
+
export declare const description = "Validates tax calculations are consistent and server-side";
|
|
5
|
+
export declare const category = "checkout";
|
|
6
|
+
export declare const blocking = true;
|
|
7
|
+
export declare const tags: string[];
|
|
8
|
+
export declare const requires: string[];
|
|
9
|
+
export declare function run(): Promise<{
|
|
10
|
+
success: boolean;
|
|
11
|
+
errors: number;
|
|
12
|
+
warnings: number;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=checkout-tax-consistency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout-tax-consistency.d.ts","sourceRoot":"","sources":["../../../src/checks/checkout/checkout-tax-consistency.ts"],"names":[],"mappings":";AAuBA,eAAO,MAAM,EAAE,sCAAsC,CAAC;AACtD,eAAO,MAAM,IAAI,6BAA6B,CAAC;AAC/C,eAAO,MAAM,WAAW,8DAA8D,CAAC;AACvF,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA4D,CAAC;AAC9E,eAAO,MAAM,QAAQ,UAA0B,CAAC;AAmFhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAiH3F"}
|