@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.
Files changed (33) hide show
  1. package/dist/checks/cart/cart-guest-merge.d.ts +14 -0
  2. package/dist/checks/cart/cart-guest-merge.d.ts.map +1 -0
  3. package/dist/checks/cart/cart-guest-merge.js +217 -0
  4. package/dist/checks/cart/cart-guest-merge.js.map +1 -0
  5. package/dist/checks/cart/cart-quantity-validation.d.ts +14 -0
  6. package/dist/checks/cart/cart-quantity-validation.d.ts.map +1 -0
  7. package/dist/checks/cart/cart-quantity-validation.js +211 -0
  8. package/dist/checks/cart/cart-quantity-validation.js.map +1 -0
  9. package/dist/checks/cart/cart-stock-validation.d.ts +14 -0
  10. package/dist/checks/cart/cart-stock-validation.d.ts.map +1 -0
  11. package/dist/checks/cart/cart-stock-validation.js +211 -0
  12. package/dist/checks/cart/cart-stock-validation.js.map +1 -0
  13. package/dist/checks/checkout/checkout-multi-store.d.ts +14 -0
  14. package/dist/checks/checkout/checkout-multi-store.d.ts.map +1 -0
  15. package/dist/checks/checkout/checkout-multi-store.js +209 -0
  16. package/dist/checks/checkout/checkout-multi-store.js.map +1 -0
  17. package/dist/checks/checkout/checkout-tax-consistency.d.ts +14 -0
  18. package/dist/checks/checkout/checkout-tax-consistency.d.ts.map +1 -0
  19. package/dist/checks/checkout/checkout-tax-consistency.js +212 -0
  20. package/dist/checks/checkout/checkout-tax-consistency.js.map +1 -0
  21. package/dist/checks/order/order-inventory-guard.d.ts +14 -0
  22. package/dist/checks/order/order-inventory-guard.d.ts.map +1 -0
  23. package/dist/checks/order/order-inventory-guard.js +212 -0
  24. package/dist/checks/order/order-inventory-guard.js.map +1 -0
  25. package/dist/checks/order/order-status-validation.d.ts +14 -0
  26. package/dist/checks/order/order-status-validation.d.ts.map +1 -0
  27. package/dist/checks/order/order-status-validation.js +218 -0
  28. package/dist/checks/order/order-status-validation.js.map +1 -0
  29. package/dist/checks/order/shipping-address-validation.d.ts +14 -0
  30. package/dist/checks/order/shipping-address-validation.d.ts.map +1 -0
  31. package/dist/checks/order/shipping-address-validation.js +213 -0
  32. package/dist/checks/order/shipping-address-validation.js.map +1 -0
  33. 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":";;;;;;;AA4GA,kBA2HC;AAtOD;;;;;;;;;;;;GAYG;AACH,4CAAoB;AACpB,gDAAwB;AACxB,+BAA4B;AAE5B,6DAAiE;AAEjE,kDAAkD;AACrC,QAAA,EAAE,GAAG,uBAAuB,CAAC;AAC7B,QAAA,IAAI,GAAG,0BAA0B,CAAC;AAClC,QAAA,WAAW,GAAG,+DAA+D,CAAC;AAC9E,QAAA,QAAQ,GAAG,MAAM,CAAC;AAClB,QAAA,QAAQ,GAAG,IAAI,CAAC;AAChB,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AACzD,QAAA,QAAQ,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,GAAG;IACjB,qBAAqB;IACrB,0BAA0B;IAC1B,cAAc;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,uCAAuC;IACvC,YAAY,EAAE;QACZ,OAAO,EAAE,4FAA4F;QACrG,WAAW,EAAE,2CAA2C;QACxD,QAAQ,EAAE,IAAI;KACf;IACD,kCAAkC;IAClC,iBAAiB,EAAE;QACjB,OAAO,EAAE,8DAA8D;QACvE,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,IAAI;KACf;IACD,+BAA+B;IAC/B,oBAAoB,EAAE;QACpB,OAAO,EAAE,iFAAiF;QAC1F,WAAW,EAAE,iCAAiC;QAC9C,QAAQ,EAAE,IAAI;KACf;IACD,sBAAsB;IACtB,gBAAgB,EAAE;QAChB,OAAO,EAAE,qEAAqE;QAC9E,WAAW,EAAE,2CAA2C;QACxD,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,qBAAqB;IACrB,gBAAgB,EAAE;QAChB,OAAO,EAAE,iEAAiE;QAC1E,WAAW,EAAE,8BAA8B;KAC5C;IACD,sBAAsB;IACtB,gBAAgB,EAAE;QAChB,OAAO,EAAE,mDAAmD;QAC5D,WAAW,EAAE,mCAAmC;KACjD;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,aAAa,GAAG;IACpB,qCAAqC;IACrC,eAAe,EAAE;QACf,OAAO,EAAE,gGAAgG;QACzG,WAAW,EAAE,4CAA4C;KAC1D;IACD,oBAAoB;IACpB,eAAe,EAAE;QACf,OAAO,EAAE,iCAAiC;QAC1C,WAAW,EAAE,sCAAsC;KACpD;CACF,CAAC;AAUK,KAAK,UAAU,GAAG;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,IAAI,iCAAiC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,IAAA,6BAAa,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAExC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,kBAAkB;IAClB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,IAAA,WAAI,EAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,MAAM,aAAa,WAAW,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAE9E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,OAAO,uCAAuC,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,kBAAkB;IAClB,IAAI,eAAe,GAAG,EAAE,CAAC;IAEzB,KAAK,MAAM,YAAY,IAAI,WAAW,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QAExD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEvC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,eAAe,IAAI,OAAO,GAAG,IAAI,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,MAAM,qBAAK,CAAC,IAAI,IAAI,YAAY,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,MAAM,sCAAsC,CAAC,CAAC;IAErE,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC9D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAK,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAK,CAAC,OAAO,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,aAAa,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,MAAM,qBAAK,CAAC,OAAO,WAAW,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,MAAM,2CAA2C,CAAC,CAAC;IAE1E,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC9D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,MAAM,qBAAK,CAAC,IAAI,WAAW,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,MAAM,qBAAK,CAAC,IAAI,eAAe,KAAK,CAAC,WAAW,aAAa,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,MAAM,gCAAgC,CAAC,CAAC;IAE/D,KAAK,MAAM,YAAY,IAAI,YAAY,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,IAAI;oBACb,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,MAAM,qBAAK,CAAC,KAAK,IAAI,YAAY,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU;IACV,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAExD,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,WAAW,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,uBAAuB,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,OAAO,wCAAwC,CAAC,CAAC;QACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,mBAAmB,CAAC,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,IAAI,0BAA0B,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAE/D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,wCAAwC,CAAC,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC;IAC3F,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,OAAO,sDAAsD,CAAC,CAAC;IACtF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC;AACtE,CAAC;AAED,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,GAAG,EAAE;SACF,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,GAAG,qBAAK,CAAC,KAAK,oBAAoB,EAAE,GAAG,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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"}