@empline/preflight 1.1.32 → 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/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/package.json +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export declare const id = "cart/cart-guest-merge";
|
|
3
|
+
export declare const name = "Cart Guest/Auth Handling";
|
|
4
|
+
export declare const description = "Validates cart authentication requirements and guest handling";
|
|
5
|
+
export declare const category = "cart";
|
|
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=cart-guest-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cart-guest-merge.d.ts","sourceRoot":"","sources":["../../../src/checks/cart/cart-guest-merge.ts"],"names":[],"mappings":";AAqBA,eAAO,MAAM,EAAE,0BAA0B,CAAC;AAC1C,eAAO,MAAM,IAAI,6BAA6B,CAAC;AAC/C,eAAO,MAAM,WAAW,kEAAkE,CAAC;AAC3F,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAoD,CAAC;AACtE,eAAO,MAAM,QAAQ,UAA0B,CAAC;AAiFhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA2H3F"}
|
|
@@ -0,0 +1,217 @@
|
|
|
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 Guest Merge Preflight
|
|
11
|
+
*
|
|
12
|
+
* Validates that cart operations properly handle authentication requirements
|
|
13
|
+
* and guest cart scenarios:
|
|
14
|
+
* 1. Cart operations require authentication
|
|
15
|
+
* 2. Guest users cannot add items to cart (auth required)
|
|
16
|
+
* 3. If guest cart exists, it should merge on login
|
|
17
|
+
* 4. Session validation before cart mutations
|
|
18
|
+
*
|
|
19
|
+
* Current implementation requires auth for all cart operations.
|
|
20
|
+
* This preflight ensures that pattern is maintained.
|
|
21
|
+
*/
|
|
22
|
+
const fs_1 = __importDefault(require("fs"));
|
|
23
|
+
const path_1 = __importDefault(require("path"));
|
|
24
|
+
const glob_1 = require("glob");
|
|
25
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
26
|
+
// METADATA - Required for plugin loader discovery
|
|
27
|
+
exports.id = "cart/cart-guest-merge";
|
|
28
|
+
exports.name = "Cart Guest/Auth Handling";
|
|
29
|
+
exports.description = "Validates cart authentication requirements and guest handling";
|
|
30
|
+
exports.category = "cart";
|
|
31
|
+
exports.blocking = true;
|
|
32
|
+
exports.tags = ["cart", "auth", "guest", "session", "ecommerce"];
|
|
33
|
+
exports.requires = ["trading-card-system"];
|
|
34
|
+
/**
|
|
35
|
+
* Files to check
|
|
36
|
+
*/
|
|
37
|
+
const CART_FILES = [
|
|
38
|
+
"app/actions/cart.ts",
|
|
39
|
+
"app/api/cart/**/route.ts",
|
|
40
|
+
"lib/cart*.ts",
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* Required patterns for auth handling
|
|
44
|
+
*/
|
|
45
|
+
const REQUIRED_PATTERNS = {
|
|
46
|
+
// Session check before cart operations
|
|
47
|
+
sessionCheck: {
|
|
48
|
+
pattern: /session\s*=\s*await\s+(?:getServerSession|auth)\s*\(|const\s*\{\s*session\s*\}|requireAuth/,
|
|
49
|
+
description: "Session/auth check before cart operations",
|
|
50
|
+
critical: true,
|
|
51
|
+
},
|
|
52
|
+
// User ID extraction from session
|
|
53
|
+
userIdFromSession: {
|
|
54
|
+
pattern: /session\.user\.id|session\?\.user\?\.id|userId\s*=\s*session/,
|
|
55
|
+
description: "User ID extracted from session",
|
|
56
|
+
critical: true,
|
|
57
|
+
},
|
|
58
|
+
// Auth required error/redirect
|
|
59
|
+
authRequiredHandling: {
|
|
60
|
+
pattern: /if\s*\(\s*!session|!session\.user|throw.*auth|redirect.*login|unauthorized|401/i,
|
|
61
|
+
description: "Handle unauthenticated requests",
|
|
62
|
+
critical: true,
|
|
63
|
+
},
|
|
64
|
+
// Cart scoped to user
|
|
65
|
+
cartScopedToUser: {
|
|
66
|
+
pattern: /where:\s*\{[^}]*userId|userId:\s*session\.user\.id|findMany.*userId/,
|
|
67
|
+
description: "Cart queries scoped to authenticated user",
|
|
68
|
+
critical: true,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Optional patterns for guest cart merge (if implemented)
|
|
73
|
+
*/
|
|
74
|
+
const OPTIONAL_PATTERNS = {
|
|
75
|
+
// Guest cart storage
|
|
76
|
+
guestCartStorage: {
|
|
77
|
+
pattern: /guestCart|localStorage.*cart|sessionStorage.*cart|cookie.*cart/i,
|
|
78
|
+
description: "Guest cart storage mechanism",
|
|
79
|
+
},
|
|
80
|
+
// Cart merge on login
|
|
81
|
+
cartMergeOnLogin: {
|
|
82
|
+
pattern: /mergeCart|mergGuestCart|combineCart|transferCart/i,
|
|
83
|
+
description: "Cart merge functionality on login",
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Anti-patterns
|
|
88
|
+
*/
|
|
89
|
+
const ANTI_PATTERNS = {
|
|
90
|
+
// Cart operations without auth check
|
|
91
|
+
cartWithoutAuth: {
|
|
92
|
+
pattern: /(?:addToCart|updateCart|removeFromCart)\s*\([^)]*\)\s*\{(?:(?!session|auth|userId).){0,200}\}/s,
|
|
93
|
+
description: "Cart mutation without authentication check",
|
|
94
|
+
},
|
|
95
|
+
// Hardcoded user ID
|
|
96
|
+
hardcodedUserId: {
|
|
97
|
+
pattern: /userId:\s*['"][a-zA-Z0-9-]+['"]/,
|
|
98
|
+
description: "Hardcoded user ID instead of session",
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
async function run() {
|
|
102
|
+
console.log(`\n${console_chars_1.emoji.lock} CART GUEST/AUTH HANDLING CHECK`);
|
|
103
|
+
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
104
|
+
const issues = [];
|
|
105
|
+
const filesChecked = [];
|
|
106
|
+
// Find cart files
|
|
107
|
+
const allFiles = [];
|
|
108
|
+
for (const pattern of CART_FILES) {
|
|
109
|
+
const matches = await (0, glob_1.glob)(pattern, { cwd: process.cwd() });
|
|
110
|
+
allFiles.push(...matches);
|
|
111
|
+
}
|
|
112
|
+
const uniqueFiles = [...new Set(allFiles)];
|
|
113
|
+
console.log(`\n${console_chars_1.emoji.search} Scanning ${uniqueFiles.length} cart files...`);
|
|
114
|
+
if (uniqueFiles.length === 0) {
|
|
115
|
+
console.log(`\n${console_chars_1.emoji.warning} No cart files found - skipping check`);
|
|
116
|
+
return { success: true, errors: 0, warnings: 1 };
|
|
117
|
+
}
|
|
118
|
+
// Combine content
|
|
119
|
+
let combinedContent = "";
|
|
120
|
+
for (const relativePath of uniqueFiles) {
|
|
121
|
+
const filePath = path_1.default.join(process.cwd(), relativePath);
|
|
122
|
+
if (!fs_1.default.existsSync(filePath))
|
|
123
|
+
continue;
|
|
124
|
+
filesChecked.push(relativePath);
|
|
125
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
126
|
+
combinedContent += content + "\n";
|
|
127
|
+
console.log(` ${console_chars_1.emoji.file} ${relativePath}`);
|
|
128
|
+
}
|
|
129
|
+
// Check required patterns
|
|
130
|
+
console.log(`\n${console_chars_1.emoji.search} Checking authentication patterns...`);
|
|
131
|
+
for (const [name, check] of Object.entries(REQUIRED_PATTERNS)) {
|
|
132
|
+
const hasPattern = check.pattern.test(combinedContent);
|
|
133
|
+
if (!hasPattern) {
|
|
134
|
+
issues.push({
|
|
135
|
+
file: "cart files",
|
|
136
|
+
type: "missing-pattern",
|
|
137
|
+
pattern: name,
|
|
138
|
+
description: check.description,
|
|
139
|
+
critical: check.critical,
|
|
140
|
+
});
|
|
141
|
+
const icon = check.critical ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
|
|
142
|
+
console.log(` ${icon} Missing: ${check.description}`);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
console.log(` ${console_chars_1.emoji.success} Found: ${check.description}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Check optional patterns (info only)
|
|
149
|
+
console.log(`\n${console_chars_1.emoji.search} Checking optional guest cart patterns...`);
|
|
150
|
+
for (const [name, check] of Object.entries(OPTIONAL_PATTERNS)) {
|
|
151
|
+
const hasPattern = check.pattern.test(combinedContent);
|
|
152
|
+
if (hasPattern) {
|
|
153
|
+
console.log(` ${console_chars_1.emoji.info} Found: ${check.description}`);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
console.log(` ${console_chars_1.emoji.info} Not found: ${check.description} (optional)`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Check anti-patterns
|
|
160
|
+
console.log(`\n${console_chars_1.emoji.search} Checking for anti-patterns...`);
|
|
161
|
+
for (const relativePath of filesChecked) {
|
|
162
|
+
const filePath = path_1.default.join(process.cwd(), relativePath);
|
|
163
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
164
|
+
for (const [name, check] of Object.entries(ANTI_PATTERNS)) {
|
|
165
|
+
if (check.pattern.test(content)) {
|
|
166
|
+
issues.push({
|
|
167
|
+
file: relativePath,
|
|
168
|
+
type: "anti-pattern",
|
|
169
|
+
pattern: name,
|
|
170
|
+
description: check.description,
|
|
171
|
+
critical: true,
|
|
172
|
+
});
|
|
173
|
+
console.log(` ${console_chars_1.emoji.error} ${relativePath}: ${check.description}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Summary
|
|
178
|
+
const criticalIssues = issues.filter((i) => i.critical);
|
|
179
|
+
const warningIssues = issues.filter((i) => !i.critical);
|
|
180
|
+
console.log(`\n${console_chars_1.emoji.chart} Summary:`);
|
|
181
|
+
console.log(` Files checked: ${filesChecked.length}`);
|
|
182
|
+
console.log(` Critical issues: ${criticalIssues.length}`);
|
|
183
|
+
console.log(` Warning issues: ${warningIssues.length}`);
|
|
184
|
+
if (issues.length === 0) {
|
|
185
|
+
console.log(`\n${console_chars_1.emoji.success} CART GUEST/AUTH HANDLING CHECK PASSED`);
|
|
186
|
+
return { success: true, errors: 0, warnings: 0 };
|
|
187
|
+
}
|
|
188
|
+
if (criticalIssues.length > 0) {
|
|
189
|
+
console.log(`\n${console_chars_1.emoji.error} Critical issues:`);
|
|
190
|
+
for (const issue of criticalIssues) {
|
|
191
|
+
console.log(` ${issue.file}: ${issue.description}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
console.log(`\n${console_chars_1.emoji.info} Cart auth requirements:`);
|
|
195
|
+
console.log(` 1. All cart operations require authentication`);
|
|
196
|
+
console.log(` 2. User ID must come from session, not hardcoded`);
|
|
197
|
+
console.log(` 3. Cart queries must be scoped to authenticated user`);
|
|
198
|
+
console.log(` 4. Unauthenticated requests must be rejected`);
|
|
199
|
+
if (criticalIssues.length > 0) {
|
|
200
|
+
console.log(`\n${console_chars_1.emoji.error} CART GUEST/AUTH HANDLING CHECK FAILED`);
|
|
201
|
+
return { success: false, errors: criticalIssues.length, warnings: warningIssues.length };
|
|
202
|
+
}
|
|
203
|
+
console.log(`\n${console_chars_1.emoji.warning} CART GUEST/AUTH HANDLING CHECK PASSED WITH WARNINGS`);
|
|
204
|
+
return { success: true, errors: 0, warnings: warningIssues.length };
|
|
205
|
+
}
|
|
206
|
+
// Allow direct execution
|
|
207
|
+
if (require.main === module) {
|
|
208
|
+
run()
|
|
209
|
+
.then((result) => {
|
|
210
|
+
process.exit(result.success ? 0 : 1);
|
|
211
|
+
})
|
|
212
|
+
.catch((err) => {
|
|
213
|
+
console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
|
|
214
|
+
process.exit(1);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=cart-guest-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cart-guest-merge.js","sourceRoot":"","sources":["../../../src/checks/cart/cart-guest-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export declare const id = "cart/cart-quantity-validation";
|
|
3
|
+
export declare const name = "Cart Quantity Validation";
|
|
4
|
+
export declare const description = "Validates cart quantity constraints and uniqueness";
|
|
5
|
+
export declare const category = "cart";
|
|
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=cart-quantity-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cart-quantity-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/cart/cart-quantity-validation.ts"],"names":[],"mappings":";AAuBA,eAAO,MAAM,EAAE,kCAAkC,CAAC;AAClD,eAAO,MAAM,IAAI,6BAA6B,CAAC;AAC/C,eAAO,MAAM,WAAW,uDAAuD,CAAC;AAChF,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAAiE,CAAC;AACnF,eAAO,MAAM,QAAQ,UAA0B,CAAC;AA2EhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAyH3F"}
|
|
@@ -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 Quantity Validation Preflight
|
|
11
|
+
*
|
|
12
|
+
* Validates that cart operations properly enforce quantity constraints:
|
|
13
|
+
* 1. Unique constraint: userId + listingId (one cart item per user per listing)
|
|
14
|
+
* 2. Quantity must be positive (> 0)
|
|
15
|
+
* 3. Quantity cannot exceed available stock
|
|
16
|
+
* 4. Quantity updates should increment/decrement, not blindly set
|
|
17
|
+
* 5. Zero quantity should trigger item removal
|
|
18
|
+
*
|
|
19
|
+
* Prevents:
|
|
20
|
+
* - Duplicate cart items for same listing
|
|
21
|
+
* - Invalid quantities (0, negative)
|
|
22
|
+
* - Overselling via cart manipulation
|
|
23
|
+
*/
|
|
24
|
+
const fs_1 = __importDefault(require("fs"));
|
|
25
|
+
const path_1 = __importDefault(require("path"));
|
|
26
|
+
const glob_1 = require("glob");
|
|
27
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
28
|
+
// METADATA - Required for plugin loader discovery
|
|
29
|
+
exports.id = "cart/cart-quantity-validation";
|
|
30
|
+
exports.name = "Cart Quantity Validation";
|
|
31
|
+
exports.description = "Validates cart quantity constraints and uniqueness";
|
|
32
|
+
exports.category = "cart";
|
|
33
|
+
exports.blocking = true;
|
|
34
|
+
exports.tags = ["cart", "quantity", "validation", "constraints", "ecommerce"];
|
|
35
|
+
exports.requires = ["trading-card-system"];
|
|
36
|
+
/**
|
|
37
|
+
* Files to check
|
|
38
|
+
*/
|
|
39
|
+
const CART_FILES = [
|
|
40
|
+
"app/actions/cart.ts",
|
|
41
|
+
"app/api/cart/**/route.ts",
|
|
42
|
+
"lib/cart*.ts",
|
|
43
|
+
];
|
|
44
|
+
const SCHEMA_FILES = [
|
|
45
|
+
"prisma/schema.prisma",
|
|
46
|
+
];
|
|
47
|
+
/**
|
|
48
|
+
* Required patterns for quantity validation
|
|
49
|
+
*/
|
|
50
|
+
const REQUIRED_PATTERNS = {
|
|
51
|
+
// Unique constraint in schema or code
|
|
52
|
+
uniqueConstraint: {
|
|
53
|
+
pattern: /@@unique\s*\(\s*\[.*userId.*listingId.*\]\s*\)|@@unique\s*\(\s*\[.*listingId.*userId.*\]\s*\)|userId_listingId|findFirst.*userId.*listingId/,
|
|
54
|
+
description: "Unique constraint on userId + listingId",
|
|
55
|
+
critical: true,
|
|
56
|
+
},
|
|
57
|
+
// Positive quantity check
|
|
58
|
+
positiveQuantityCheck: {
|
|
59
|
+
pattern: /quantity\s*(?:>|>=)\s*(?:0|1)|quantity\s*<=\s*0|quantity\s*<\s*1/,
|
|
60
|
+
description: "Check for positive quantity values",
|
|
61
|
+
critical: true,
|
|
62
|
+
},
|
|
63
|
+
// Upsert or increment pattern for cart add
|
|
64
|
+
upsertOrIncrement: {
|
|
65
|
+
pattern: /upsert|increment|decrement|\+=\s*quantity|quantity\s*\+\s*\d|quantity:\s*\{.*increment/,
|
|
66
|
+
description: "Upsert or increment pattern for adding to cart",
|
|
67
|
+
critical: true,
|
|
68
|
+
},
|
|
69
|
+
// Remove on zero quantity
|
|
70
|
+
removeOnZero: {
|
|
71
|
+
pattern: /quantity\s*<=\s*0.*delete|if\s*\(\s*quantity\s*<=?\s*0|deleteMany|removeFromCart/,
|
|
72
|
+
description: "Remove item when quantity is zero or less",
|
|
73
|
+
critical: true,
|
|
74
|
+
},
|
|
75
|
+
// Quantity vs available comparison
|
|
76
|
+
quantityVsAvailable: {
|
|
77
|
+
pattern: /quantity\s*>\s*quantityAvailable|quantityAvailable\s*<\s*quantity|exceeds.*available/i,
|
|
78
|
+
description: "Prevent quantity from exceeding available stock",
|
|
79
|
+
critical: true,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Anti-patterns
|
|
84
|
+
*/
|
|
85
|
+
const ANTI_PATTERNS = {
|
|
86
|
+
// Direct quantity set without validation
|
|
87
|
+
blindQuantitySet: {
|
|
88
|
+
pattern: /update\s*\(\s*\{[^}]*data:\s*\{[^}]*quantity:\s*(?!.*increment)[^}]*\}\s*\}/s,
|
|
89
|
+
description: "Direct quantity set without using increment/validation",
|
|
90
|
+
},
|
|
91
|
+
// Negative quantity allowed
|
|
92
|
+
negativeQuantityAllowed: {
|
|
93
|
+
pattern: /quantity:\s*-\d|quantity\s*=\s*-/,
|
|
94
|
+
description: "Negative quantity value allowed",
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
async function run() {
|
|
98
|
+
console.log(`\n${console_chars_1.emoji.chart} CART QUANTITY VALIDATION CHECK`);
|
|
99
|
+
console.log((0, console_chars_1.createDivider)(65, "heavy"));
|
|
100
|
+
const issues = [];
|
|
101
|
+
const filesChecked = [];
|
|
102
|
+
// Find cart files
|
|
103
|
+
const cartFiles = [];
|
|
104
|
+
for (const pattern of CART_FILES) {
|
|
105
|
+
const matches = await (0, glob_1.glob)(pattern, { cwd: process.cwd() });
|
|
106
|
+
cartFiles.push(...matches);
|
|
107
|
+
}
|
|
108
|
+
// Find schema files
|
|
109
|
+
const schemaFiles = [];
|
|
110
|
+
for (const pattern of SCHEMA_FILES) {
|
|
111
|
+
const matches = await (0, glob_1.glob)(pattern, { cwd: process.cwd() });
|
|
112
|
+
schemaFiles.push(...matches);
|
|
113
|
+
}
|
|
114
|
+
const allFiles = [...new Set([...cartFiles, ...schemaFiles])];
|
|
115
|
+
console.log(`\n${console_chars_1.emoji.search} Scanning ${allFiles.length} files...`);
|
|
116
|
+
if (allFiles.length === 0) {
|
|
117
|
+
console.log(`\n${console_chars_1.emoji.warning} No cart/schema files found - skipping check`);
|
|
118
|
+
return { success: true, errors: 0, warnings: 1 };
|
|
119
|
+
}
|
|
120
|
+
// Combine content
|
|
121
|
+
let combinedContent = "";
|
|
122
|
+
for (const relativePath of allFiles) {
|
|
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 quantity validation 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: "cart/schema 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 in cart files only
|
|
151
|
+
console.log(`\n${console_chars_1.emoji.search} Checking for anti-patterns...`);
|
|
152
|
+
for (const relativePath of cartFiles) {
|
|
153
|
+
const filePath = path_1.default.join(process.cwd(), relativePath);
|
|
154
|
+
if (!fs_1.default.existsSync(filePath))
|
|
155
|
+
continue;
|
|
156
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
157
|
+
for (const [name, check] of Object.entries(ANTI_PATTERNS)) {
|
|
158
|
+
if (check.pattern.test(content)) {
|
|
159
|
+
issues.push({
|
|
160
|
+
file: relativePath,
|
|
161
|
+
type: "anti-pattern",
|
|
162
|
+
pattern: name,
|
|
163
|
+
description: check.description,
|
|
164
|
+
critical: true,
|
|
165
|
+
});
|
|
166
|
+
console.log(` ${console_chars_1.emoji.error} ${relativePath}: ${check.description}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Summary
|
|
171
|
+
const criticalIssues = issues.filter((i) => i.critical);
|
|
172
|
+
const warningIssues = issues.filter((i) => !i.critical);
|
|
173
|
+
console.log(`\n${console_chars_1.emoji.chart} Summary:`);
|
|
174
|
+
console.log(` Files checked: ${filesChecked.length}`);
|
|
175
|
+
console.log(` Critical issues: ${criticalIssues.length}`);
|
|
176
|
+
console.log(` Warning issues: ${warningIssues.length}`);
|
|
177
|
+
if (issues.length === 0) {
|
|
178
|
+
console.log(`\n${console_chars_1.emoji.success} CART QUANTITY VALIDATION CHECK PASSED`);
|
|
179
|
+
return { success: true, errors: 0, warnings: 0 };
|
|
180
|
+
}
|
|
181
|
+
if (criticalIssues.length > 0) {
|
|
182
|
+
console.log(`\n${console_chars_1.emoji.error} Critical issues:`);
|
|
183
|
+
for (const issue of criticalIssues) {
|
|
184
|
+
console.log(` ${issue.file}: ${issue.description}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
console.log(`\n${console_chars_1.emoji.info} Cart quantity requirements:`);
|
|
188
|
+
console.log(` 1. Unique constraint: userId + listingId`);
|
|
189
|
+
console.log(` 2. Quantity must be positive (> 0)`);
|
|
190
|
+
console.log(` 3. Use upsert/increment for cart add`);
|
|
191
|
+
console.log(` 4. Remove item when quantity <= 0`);
|
|
192
|
+
console.log(` 5. Prevent quantity > available stock`);
|
|
193
|
+
if (criticalIssues.length > 0) {
|
|
194
|
+
console.log(`\n${console_chars_1.emoji.error} CART QUANTITY VALIDATION CHECK FAILED`);
|
|
195
|
+
return { success: false, errors: criticalIssues.length, warnings: warningIssues.length };
|
|
196
|
+
}
|
|
197
|
+
console.log(`\n${console_chars_1.emoji.warning} CART QUANTITY 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-quantity-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cart-quantity-validation.js","sourceRoot":"","sources":["../../../src/checks/cart/cart-quantity-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export declare const id = "cart/cart-stock-validation";
|
|
3
|
+
export declare const name = "Cart Stock Validation";
|
|
4
|
+
export declare const description = "Validates cart operations check stock availability";
|
|
5
|
+
export declare const category = "cart";
|
|
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=cart-stock-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cart-stock-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/cart/cart-stock-validation.ts"],"names":[],"mappings":";AA0BA,eAAO,MAAM,EAAE,+BAA+B,CAAC;AAC/C,eAAO,MAAM,IAAI,0BAA0B,CAAC;AAC5C,eAAO,MAAM,WAAW,uDAAuD,CAAC;AAChF,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA4D,CAAC;AAC9E,eAAO,MAAM,QAAQ,UAA0B,CAAC;AAwEhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAwH3F"}
|