@empline/preflight 1.1.51 → 1.1.54

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 (32) hide show
  1. package/dist/checks/data-integrity/internal-link-validation.d.ts +10 -0
  2. package/dist/checks/data-integrity/internal-link-validation.d.ts.map +1 -0
  3. package/dist/checks/data-integrity/internal-link-validation.js +279 -0
  4. package/dist/checks/data-integrity/internal-link-validation.js.map +1 -0
  5. package/dist/checks/data-integrity/scan-billing-enforcement.d.ts +10 -0
  6. package/dist/checks/data-integrity/scan-billing-enforcement.d.ts.map +1 -0
  7. package/dist/checks/data-integrity/scan-billing-enforcement.js +596 -0
  8. package/dist/checks/data-integrity/scan-billing-enforcement.js.map +1 -0
  9. package/dist/checks/performance/barrel-import-detection.d.ts +10 -0
  10. package/dist/checks/performance/barrel-import-detection.d.ts.map +1 -0
  11. package/dist/checks/performance/barrel-import-detection.js +245 -0
  12. package/dist/checks/performance/barrel-import-detection.js.map +1 -0
  13. package/dist/checks/react/session-provider-usage.d.ts +11 -0
  14. package/dist/checks/react/session-provider-usage.d.ts.map +1 -0
  15. package/dist/checks/react/session-provider-usage.js +263 -0
  16. package/dist/checks/react/session-provider-usage.js.map +1 -0
  17. package/dist/checks/react/state-update-during-render.d.ts.map +1 -1
  18. package/dist/checks/react/state-update-during-render.js +1 -0
  19. package/dist/checks/react/state-update-during-render.js.map +1 -1
  20. package/dist/checks/store/team-member-access-consistency.d.ts +10 -0
  21. package/dist/checks/store/team-member-access-consistency.d.ts.map +1 -0
  22. package/dist/checks/store/team-member-access-consistency.js +199 -0
  23. package/dist/checks/store/team-member-access-consistency.js.map +1 -0
  24. package/dist/checks/ui/floating-element-zindex.d.ts +10 -0
  25. package/dist/checks/ui/floating-element-zindex.d.ts.map +1 -0
  26. package/dist/checks/ui/floating-element-zindex.js +292 -0
  27. package/dist/checks/ui/floating-element-zindex.js.map +1 -0
  28. package/dist/checks/ui/missing-page-layout.d.ts +10 -0
  29. package/dist/checks/ui/missing-page-layout.d.ts.map +1 -0
  30. package/dist/checks/ui/missing-page-layout.js +350 -0
  31. package/dist/checks/ui/missing-page-layout.js.map +1 -0
  32. package/package.json +1 -1
@@ -0,0 +1,596 @@
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
+ * Scan Billing Enforcement Preflight
41
+ *
42
+ * Validates that card recognition billing is properly enforced:
43
+ * - Store scans check `checkStoreScanAllowance` before AI recognition
44
+ * - Collection scans check `checkAiScanAllowance` before AI recognition
45
+ * - Usage is incremented after successful recognition
46
+ * - HTTP 429 responses are returned when limits exceeded
47
+ * - Plan limits are consistent across billing constants and usage tracking
48
+ *
49
+ * This prevents:
50
+ * - Users bypassing scan limits
51
+ * - Billing not being tracked for AI usage
52
+ * - Inconsistent plan definitions causing billing errors
53
+ */
54
+ const fs = __importStar(require("node:fs"));
55
+ const path = __importStar(require("node:path"));
56
+ const console_chars_1 = require("../../utils/console-chars");
57
+ exports.id = "data-integrity/scan-billing-enforcement";
58
+ exports.name = "Scan Billing Enforcement Validation";
59
+ exports.description = "Ensures card recognition properly checks and tracks billing for AI scans";
60
+ exports.category = "data-integrity";
61
+ exports.blocking = true;
62
+ exports.tags = ["billing", "scans", "recognition", "store", "collection", "limits"];
63
+ function readFile(relativePath) {
64
+ const fullPath = path.join(process.cwd(), relativePath);
65
+ if (!fs.existsSync(fullPath)) {
66
+ return null;
67
+ }
68
+ return fs.readFileSync(fullPath, "utf-8");
69
+ }
70
+ function findLineNumber(content, pattern) {
71
+ const lines = content.split("\n");
72
+ for (let i = 0; i < lines.length; i++) {
73
+ if (pattern.test(lines[i])) {
74
+ return i + 1;
75
+ }
76
+ }
77
+ return undefined;
78
+ }
79
+ const BILLING_CHECKS = [
80
+ // Check 1: Store scan allowance check exists in card identify API
81
+ {
82
+ name: "Store scan allowance check",
83
+ description: "Verifies checkStoreScanAllowance is called before AI recognition",
84
+ validate: () => {
85
+ const file = "lib/api/cards/identify/index.ts";
86
+ const content = readFile(file);
87
+ if (!content) {
88
+ return { passed: false, message: `File not found: ${file}`, file };
89
+ }
90
+ const hasCheck = /checkStoreScanAllowance\s*\(\s*effectiveStoreId\s*\)/.test(content);
91
+ // Support both static and dynamic imports
92
+ const hasImport = /import.*checkStoreScanAllowance.*from.*store-scan-usage/.test(content) ||
93
+ /await\s+import\s*\(\s*["']@\/lib\/store-scan-usage["']\s*\)/.test(content);
94
+ const has429Response = /status:\s*429/.test(content) && /SELLER_SCAN_LIMIT_REACHED/.test(content);
95
+ if (!hasCheck) {
96
+ return {
97
+ passed: false,
98
+ message: "checkStoreScanAllowance not called before AI recognition",
99
+ file,
100
+ line: findLineNumber(content, /recognizeWithGPTVision/),
101
+ };
102
+ }
103
+ if (!hasImport) {
104
+ return {
105
+ passed: false,
106
+ message: "checkStoreScanAllowance not imported from store-scan-usage",
107
+ file,
108
+ };
109
+ }
110
+ if (!has429Response) {
111
+ return {
112
+ passed: false,
113
+ message: "HTTP 429 response not returned for SELLER_SCAN_LIMIT_REACHED",
114
+ file,
115
+ };
116
+ }
117
+ return {
118
+ passed: true,
119
+ message: "Store scan allowance properly checked with 429 response",
120
+ file,
121
+ line: findLineNumber(content, /checkStoreScanAllowance/),
122
+ };
123
+ },
124
+ },
125
+ // Check 2: Collection scan allowance check exists
126
+ {
127
+ name: "Collection scan allowance check",
128
+ description: "Verifies checkAiScanAllowance is called for non-seller scans",
129
+ validate: () => {
130
+ const file = "lib/api/cards/identify/index.ts";
131
+ const content = readFile(file);
132
+ if (!content) {
133
+ return { passed: false, message: `File not found: ${file}`, file };
134
+ }
135
+ const hasCheck = /checkAiScanAllowance\s*\(\s*userId\s*\)/.test(content);
136
+ // Support both static and dynamic imports
137
+ const hasImport = /import.*checkAiScanAllowance.*from.*ai-scan-usage/.test(content) ||
138
+ /await\s+import\s*\(\s*["']@\/lib\/ai-scan-usage["']\s*\)/.test(content);
139
+ const has429Response = /status:\s*429/.test(content) && /AI_SCAN_LIMIT_REACHED/.test(content);
140
+ if (!hasCheck) {
141
+ return {
142
+ passed: false,
143
+ message: "checkAiScanAllowance not called for collection scans",
144
+ file,
145
+ line: findLineNumber(content, /recognizeWithGPTVision/),
146
+ };
147
+ }
148
+ if (!hasImport) {
149
+ return {
150
+ passed: false,
151
+ message: "checkAiScanAllowance not imported from ai-scan-usage",
152
+ file,
153
+ };
154
+ }
155
+ if (!has429Response) {
156
+ return {
157
+ passed: false,
158
+ message: "HTTP 429 response not returned for AI_SCAN_LIMIT_REACHED",
159
+ file,
160
+ };
161
+ }
162
+ return {
163
+ passed: true,
164
+ message: "Collection scan allowance properly checked with 429 response",
165
+ file,
166
+ line: findLineNumber(content, /checkAiScanAllowance/),
167
+ };
168
+ },
169
+ },
170
+ // Check 3: Store scan usage increment after successful recognition
171
+ {
172
+ name: "Store scan usage increment",
173
+ description: "Verifies incrementStoreScanUsage is called after successful AI recognition",
174
+ validate: () => {
175
+ const file = "lib/api/cards/identify/index.ts";
176
+ const content = readFile(file);
177
+ if (!content) {
178
+ return { passed: false, message: `File not found: ${file}`, file };
179
+ }
180
+ const hasIncrement = /incrementStoreScanUsage\s*\(\s*effectiveStoreId\s*\)/.test(content);
181
+ // Support both static and dynamic imports
182
+ const hasImport = /import.*incrementStoreScanUsage.*from.*store-scan-usage/.test(content) ||
183
+ /await\s+import\s*\(\s*["']@\/lib\/store-scan-usage["']\s*\)/.test(content);
184
+ const afterSuccess = /recognitionResult\.success.*incrementStoreScanUsage/s.test(content);
185
+ if (!hasIncrement) {
186
+ return {
187
+ passed: false,
188
+ message: "incrementStoreScanUsage not called after recognition",
189
+ file,
190
+ };
191
+ }
192
+ if (!hasImport) {
193
+ return {
194
+ passed: false,
195
+ message: "incrementStoreScanUsage not imported from store-scan-usage",
196
+ file,
197
+ };
198
+ }
199
+ if (!afterSuccess) {
200
+ return {
201
+ passed: false,
202
+ message: "incrementStoreScanUsage should be called after recognitionResult.success check",
203
+ file,
204
+ };
205
+ }
206
+ return {
207
+ passed: true,
208
+ message: "Store scan usage properly incremented after successful recognition",
209
+ file,
210
+ line: findLineNumber(content, /incrementStoreScanUsage/),
211
+ };
212
+ },
213
+ },
214
+ // Check 4: Collection scan usage increment after successful recognition
215
+ {
216
+ name: "Collection scan usage increment",
217
+ description: "Verifies incrementAiScanUsage is called after successful AI recognition",
218
+ validate: () => {
219
+ const file = "lib/api/cards/identify/index.ts";
220
+ const content = readFile(file);
221
+ if (!content) {
222
+ return { passed: false, message: `File not found: ${file}`, file };
223
+ }
224
+ const hasIncrement = /incrementAiScanUsage\s*\(\s*userId\s*\)/.test(content);
225
+ // Support both static and dynamic imports
226
+ const hasImport = /import.*incrementAiScanUsage.*from.*ai-scan-usage/.test(content) ||
227
+ /await\s+import\s*\(\s*["']@\/lib\/ai-scan-usage["']\s*\)/.test(content);
228
+ const afterSuccess = /recognitionResult\.success.*incrementAiScanUsage/s.test(content);
229
+ if (!hasIncrement) {
230
+ return {
231
+ passed: false,
232
+ message: "incrementAiScanUsage not called after recognition",
233
+ file,
234
+ };
235
+ }
236
+ if (!hasImport) {
237
+ return {
238
+ passed: false,
239
+ message: "incrementAiScanUsage not imported from ai-scan-usage",
240
+ file,
241
+ };
242
+ }
243
+ if (!afterSuccess) {
244
+ return {
245
+ passed: false,
246
+ message: "incrementAiScanUsage should be called after recognitionResult.success check",
247
+ file,
248
+ };
249
+ }
250
+ return {
251
+ passed: true,
252
+ message: "Collection scan usage properly incremented after successful recognition",
253
+ file,
254
+ line: findLineNumber(content, /incrementAiScanUsage/),
255
+ };
256
+ },
257
+ },
258
+ // Check 5: Store plans have includedScans defined
259
+ {
260
+ name: "Store plan scan limits defined",
261
+ description: "Verifies all store subscription plans have includedScans defined",
262
+ validate: () => {
263
+ const file = "lib/billing-constants.ts";
264
+ const content = readFile(file);
265
+ if (!content) {
266
+ return { passed: false, message: `File not found: ${file}`, file };
267
+ }
268
+ // Check that SUBSCRIPTION_PLANS array exists and all plans have includedScans
269
+ const hasIncludedScansField = /includedScans:\s*number/.test(content);
270
+ const starterScans = /id:\s*["']STARTER["'][\s\S]*?includedScans:\s*(\d+)/.exec(content);
271
+ const proScans = /id:\s*["']PRO["'][\s\S]*?includedScans:\s*(\d+)/.exec(content);
272
+ const enterpriseScans = /id:\s*["']ENTERPRISE["'][\s\S]*?includedScans:\s*(\d+)/.exec(content);
273
+ if (!hasIncludedScansField) {
274
+ return {
275
+ passed: false,
276
+ message: "SubscriptionPlan interface missing includedScans field",
277
+ file,
278
+ };
279
+ }
280
+ if (!starterScans || !proScans || !enterpriseScans) {
281
+ return {
282
+ passed: false,
283
+ message: "Not all store plans have includedScans defined",
284
+ file,
285
+ };
286
+ }
287
+ const limits = {
288
+ STARTER: parseInt(starterScans[1], 10),
289
+ PRO: parseInt(proScans[1], 10),
290
+ ENTERPRISE: parseInt(enterpriseScans[1], 10),
291
+ };
292
+ // Verify limits are reasonable (STARTER < PRO < ENTERPRISE)
293
+ if (limits.STARTER >= limits.PRO || limits.PRO >= limits.ENTERPRISE) {
294
+ return {
295
+ passed: false,
296
+ message: `Store plan scan limits not in ascending order: STARTER(${limits.STARTER}) < PRO(${limits.PRO}) < ENTERPRISE(${limits.ENTERPRISE})`,
297
+ file,
298
+ };
299
+ }
300
+ return {
301
+ passed: true,
302
+ message: `Store plans: STARTER(${limits.STARTER}), PRO(${limits.PRO}), ENTERPRISE(${limits.ENTERPRISE}) scans`,
303
+ file,
304
+ };
305
+ },
306
+ },
307
+ // Check 6: Collection plans have aiScansLimit defined
308
+ {
309
+ name: "Collection plan scan limits defined",
310
+ description: "Verifies all collection plans have aiScansLimit defined",
311
+ validate: () => {
312
+ const file = "lib/collection-billing-constants.ts";
313
+ const content = readFile(file);
314
+ if (!content) {
315
+ return { passed: false, message: `File not found: ${file}`, file };
316
+ }
317
+ // Check that COLLECTION_PLANS array exists and all plans have aiScansLimit
318
+ const hasAiScansLimitField = /aiScansLimit:\s*number/.test(content);
319
+ // Extract constants for limits
320
+ const freeConst = /COLLECTOR_FREE_AI_SCANS_LIMIT\s*=\s*(\d+)/.exec(content);
321
+ const plusConst = /COLLECTOR_PLUS_AI_SCANS_LIMIT\s*=\s*(\d+)/.exec(content);
322
+ const proConst = /COLLECTOR_PRO_AI_SCANS_LIMIT\s*=\s*(\d+)/.exec(content);
323
+ // Check plans reference aiScansLimit (either with constant or direct number)
324
+ const freeHasLimit = /id:\s*["']COLLECTOR_FREE["'][\s\S]*?aiScansLimit:/.test(content);
325
+ const plusHasLimit = /id:\s*["']COLLECTOR_PLUS["'][\s\S]*?aiScansLimit:/.test(content);
326
+ const proHasLimit = /id:\s*["']COLLECTOR_PRO["'][\s\S]*?aiScansLimit:/.test(content);
327
+ if (!hasAiScansLimitField) {
328
+ return {
329
+ passed: false,
330
+ message: "CollectionPlan interface missing aiScansLimit field",
331
+ file,
332
+ };
333
+ }
334
+ if (!freeHasLimit || !plusHasLimit || !proHasLimit) {
335
+ return {
336
+ passed: false,
337
+ message: "Not all collection plans have aiScansLimit defined",
338
+ file,
339
+ };
340
+ }
341
+ // Get actual limit values from constants
342
+ const limits = {
343
+ FREE: freeConst ? parseInt(freeConst[1], 10) : 0,
344
+ PLUS: plusConst ? parseInt(plusConst[1], 10) : 0,
345
+ PRO: proConst ? parseInt(proConst[1], 10) : 0,
346
+ };
347
+ if (!freeConst || !plusConst || !proConst) {
348
+ return {
349
+ passed: false,
350
+ message: "Collection plan limit constants not found (COLLECTOR_*_AI_SCANS_LIMIT)",
351
+ file,
352
+ };
353
+ }
354
+ // Verify limits are reasonable (FREE < PLUS < PRO)
355
+ if (limits.FREE >= limits.PLUS || limits.PLUS >= limits.PRO) {
356
+ return {
357
+ passed: false,
358
+ message: `Collection plan scan limits not in ascending order: FREE(${limits.FREE}) < PLUS(${limits.PLUS}) < PRO(${limits.PRO})`,
359
+ file,
360
+ };
361
+ }
362
+ return {
363
+ passed: true,
364
+ message: `Collection plans: FREE(${limits.FREE}), PLUS(${limits.PLUS}), PRO(${limits.PRO}) scans`,
365
+ file,
366
+ };
367
+ },
368
+ },
369
+ // Check 7: Store scan usage functions use SUBSCRIPTION_PLANS
370
+ {
371
+ name: "Store scan usage references billing constants",
372
+ description: "Verifies store scan usage functions reference SUBSCRIPTION_PLANS",
373
+ validate: () => {
374
+ const file = "lib/store-scan-usage.ts";
375
+ const content = readFile(file);
376
+ if (!content) {
377
+ return { passed: false, message: `File not found: ${file}`, file };
378
+ }
379
+ const importsConstants = /import.*SUBSCRIPTION_PLANS.*from.*billing-constants/.test(content);
380
+ const usesPlans = /SUBSCRIPTION_PLANS\.find/.test(content);
381
+ if (!importsConstants) {
382
+ return {
383
+ passed: false,
384
+ message: "SUBSCRIPTION_PLANS not imported from billing-constants",
385
+ file,
386
+ };
387
+ }
388
+ if (!usesPlans) {
389
+ return {
390
+ passed: false,
391
+ message: "SUBSCRIPTION_PLANS.find not used to look up plan limits",
392
+ file,
393
+ };
394
+ }
395
+ return {
396
+ passed: true,
397
+ message: "Store scan usage properly references SUBSCRIPTION_PLANS",
398
+ file,
399
+ };
400
+ },
401
+ },
402
+ // Check 8: Collection scan usage functions use COLLECTION_PLANS
403
+ {
404
+ name: "Collection scan usage references billing constants",
405
+ description: "Verifies collection scan usage functions reference COLLECTION_PLANS",
406
+ validate: () => {
407
+ const file = "lib/ai-scan-usage.ts";
408
+ const content = readFile(file);
409
+ if (!content) {
410
+ return { passed: false, message: `File not found: ${file}`, file };
411
+ }
412
+ const importsConstants = /import.*COLLECTION_PLANS.*from.*collection-billing-constants/.test(content);
413
+ const usesPlans = /COLLECTION_PLANS\.find/.test(content);
414
+ if (!importsConstants) {
415
+ return {
416
+ passed: false,
417
+ message: "COLLECTION_PLANS not imported from collection-billing-constants",
418
+ file,
419
+ };
420
+ }
421
+ if (!usesPlans) {
422
+ return {
423
+ passed: false,
424
+ message: "COLLECTION_PLANS.find not used to look up plan limits",
425
+ file,
426
+ };
427
+ }
428
+ return {
429
+ passed: true,
430
+ message: "Collection scan usage properly references COLLECTION_PLANS",
431
+ file,
432
+ };
433
+ },
434
+ },
435
+ // Check 9: Free plan blocks at limit (no overage)
436
+ {
437
+ name: "Free plan blocks at limit",
438
+ description: "Verifies FREE plan returns allowed=false when limit reached (no overage)",
439
+ validate: () => {
440
+ const storeFile = "lib/store-scan-usage.ts";
441
+ const collectionFile = "lib/ai-scan-usage.ts";
442
+ const storeContent = readFile(storeFile);
443
+ const collectionContent = readFile(collectionFile);
444
+ if (!storeContent) {
445
+ return { passed: false, message: `File not found: ${storeFile}`, file: storeFile };
446
+ }
447
+ if (!collectionContent) {
448
+ return { passed: false, message: `File not found: ${collectionFile}`, file: collectionFile };
449
+ }
450
+ // Check store FREE plan blocks
451
+ const storeFreePlanCheck = /isFreePlan.*allowed:\s*false/s.test(storeContent);
452
+ // Check collection FREE plan blocks
453
+ const collectionFreePlanCheck = /isFreePlan.*allowed:\s*false/s.test(collectionContent);
454
+ if (!storeFreePlanCheck) {
455
+ return {
456
+ passed: false,
457
+ message: "Store FREE plan should return allowed: false when limit reached",
458
+ file: storeFile,
459
+ };
460
+ }
461
+ if (!collectionFreePlanCheck) {
462
+ return {
463
+ passed: false,
464
+ message: "Collection COLLECTOR_FREE plan should return allowed: false when limit reached",
465
+ file: collectionFile,
466
+ };
467
+ }
468
+ return {
469
+ passed: true,
470
+ message: "Free plans correctly block at limit (no overage allowed)",
471
+ };
472
+ },
473
+ },
474
+ // Check 10: Paid plans allow overage
475
+ {
476
+ name: "Paid plans allow overage",
477
+ description: "Verifies paid plans return allowed=true with isOverage=true when over limit",
478
+ validate: () => {
479
+ const storeFile = "lib/store-scan-usage.ts";
480
+ const collectionFile = "lib/ai-scan-usage.ts";
481
+ const storeContent = readFile(storeFile);
482
+ const collectionContent = readFile(collectionFile);
483
+ if (!storeContent) {
484
+ return { passed: false, message: `File not found: ${storeFile}`, file: storeFile };
485
+ }
486
+ if (!collectionContent) {
487
+ return { passed: false, message: `File not found: ${collectionFile}`, file: collectionFile };
488
+ }
489
+ // Check paid plans allow overage (after checking isOverage, return allowed: true)
490
+ const storePaidOverage = /PAID PLANS.*allowed:\s*true.*isOverage:\s*true/s.test(storeContent);
491
+ const collectionPaidOverage = /PAID PLANS.*allowed:\s*true/s.test(collectionContent);
492
+ if (!storePaidOverage) {
493
+ return {
494
+ passed: false,
495
+ message: "Store paid plans should allow overage (allowed: true, isOverage: true)",
496
+ file: storeFile,
497
+ };
498
+ }
499
+ if (!collectionPaidOverage) {
500
+ return {
501
+ passed: false,
502
+ message: "Collection paid plans should allow overage",
503
+ file: collectionFile,
504
+ };
505
+ }
506
+ return {
507
+ passed: true,
508
+ message: "Paid plans correctly allow overage with isOverage flag",
509
+ };
510
+ },
511
+ },
512
+ ];
513
+ async function run() {
514
+ const startTime = Date.now();
515
+ const findings = [];
516
+ let passedCount = 0;
517
+ let failedCount = 0;
518
+ for (const check of BILLING_CHECKS) {
519
+ const result = check.validate();
520
+ if (result.passed) {
521
+ passedCount++;
522
+ }
523
+ else {
524
+ failedCount++;
525
+ findings.push({
526
+ level: "error",
527
+ message: `${check.name}: ${result.message}`,
528
+ file: result.file,
529
+ startLine: result.line,
530
+ ruleId: "billing-enforcement",
531
+ suggestion: check.description,
532
+ });
533
+ }
534
+ }
535
+ return {
536
+ passed: failedCount === 0,
537
+ findings,
538
+ duration: Date.now() - startTime,
539
+ metadata: {
540
+ totalChecks: BILLING_CHECKS.length,
541
+ passedChecks: passedCount,
542
+ failedChecks: failedCount,
543
+ },
544
+ };
545
+ }
546
+ async function main() {
547
+ console.log(`\n${console_chars_1.emoji.lock} SCAN BILLING ENFORCEMENT VALIDATION`);
548
+ console.log((0, console_chars_1.createDivider)(70, "heavy"));
549
+ console.log(`\n${console_chars_1.emoji.info} Validating card recognition billing enforcement...`);
550
+ console.log(` This ensures AI scans are properly tracked against user/store plans.\n`);
551
+ const results = [];
552
+ for (const check of BILLING_CHECKS) {
553
+ const result = check.validate();
554
+ results.push({ check, result });
555
+ if (result.passed) {
556
+ console.log(`${console_chars_1.emoji.success} ${check.name}`);
557
+ console.log(` ${result.message}`);
558
+ if (result.file) {
559
+ console.log(` ${console_chars_1.emoji.file} ${result.file}${result.line ? `:${result.line}` : ""}`);
560
+ }
561
+ }
562
+ else {
563
+ console.log(`${console_chars_1.emoji.error} ${check.name}`);
564
+ console.log(` ${result.message}`);
565
+ if (result.file) {
566
+ console.log(` ${console_chars_1.emoji.file} ${result.file}${result.line ? `:${result.line}` : ""}`);
567
+ }
568
+ }
569
+ console.log();
570
+ }
571
+ const passedCount = results.filter(r => r.result.passed).length;
572
+ const failedCount = results.filter(r => !r.result.passed).length;
573
+ console.log((0, console_chars_1.createDivider)(70, "light"));
574
+ console.log(`\n${console_chars_1.emoji.chart} Summary: ${passedCount} passed, ${failedCount} failed\n`);
575
+ if (failedCount > 0) {
576
+ console.log(`${console_chars_1.emoji.warning} BILLING ENFORCEMENT FAILURES DETECTED`);
577
+ console.log(`\n${console_chars_1.emoji.info} To fix billing enforcement issues:`);
578
+ console.log(` 1. Ensure checkStoreScanAllowance is called before AI recognition for seller scans`);
579
+ console.log(` 2. Ensure checkAiScanAllowance is called before AI recognition for collection scans`);
580
+ console.log(` 3. Ensure incrementStoreScanUsage/incrementAiScanUsage are called after success`);
581
+ console.log(` 4. Ensure HTTP 429 responses are returned when limits are exceeded`);
582
+ console.log(` 5. Verify plan limits are defined in billing-constants.ts and collection-billing-constants.ts`);
583
+ console.log(`\n${console_chars_1.emoji.error} SCAN BILLING ENFORCEMENT VALIDATION FAILED`);
584
+ process.exit(1);
585
+ }
586
+ console.log(`${console_chars_1.emoji.success} SCAN BILLING ENFORCEMENT VALIDATION PASSED`);
587
+ console.log(`\nAll billing checks are properly enforced for card recognition.`);
588
+ process.exit(0);
589
+ }
590
+ if (require.main === module) {
591
+ main().catch((err) => {
592
+ console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
593
+ process.exit(1);
594
+ });
595
+ }
596
+ //# sourceMappingURL=scan-billing-enforcement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-billing-enforcement.js","sourceRoot":"","sources":["../../../src/checks/data-integrity/scan-billing-enforcement.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8iBA,kBAkCC;AA/kBD;;;;;;;;;;;;;;GAcG;AACH,4CAA8B;AAC9B,gDAAkC;AAElC,6DAAiE;AAEpD,QAAA,EAAE,GAAG,yCAAyC,CAAC;AAC/C,QAAA,IAAI,GAAG,qCAAqC,CAAC;AAC7C,QAAA,WAAW,GAAG,0EAA0E,CAAC;AACzF,QAAA,QAAQ,GAAG,gBAAgB,CAAC;AAC5B,QAAA,QAAQ,GAAG,IAAI,CAAC;AAChB,QAAA,IAAI,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAezF,SAAS,QAAQ,CAAC,YAAoB;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,OAAe;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,cAAc,GAAmB;IACrC,kEAAkE;IAClE;QACE,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,kEAAkE;QAC/E,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,iCAAiC,CAAC;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACrE,CAAC;YAED,MAAM,QAAQ,GAAG,sDAAsD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtF,0CAA0C;YAC1C,MAAM,SAAS,GAAG,yDAAyD,CAAC,IAAI,CAAC,OAAO,CAAC;gBACvE,6DAA6D,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9F,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAElG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,0DAA0D;oBACnE,IAAI;oBACJ,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,wBAAwB,CAAC;iBACxD,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,4DAA4D;oBACrE,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,8DAA8D;oBACvE,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,yDAAyD;gBAClE,IAAI;gBACJ,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,yBAAyB,CAAC;aACzD,CAAC;QACJ,CAAC;KACF;IAED,kDAAkD;IAClD;QACE,IAAI,EAAE,iCAAiC;QACvC,WAAW,EAAE,8DAA8D;QAC3E,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,iCAAiC,CAAC;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACrE,CAAC;YAED,MAAM,QAAQ,GAAG,yCAAyC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzE,0CAA0C;YAC1C,MAAM,SAAS,GAAG,mDAAmD,CAAC,IAAI,CAAC,OAAO,CAAC;gBACjE,0DAA0D,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3F,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE9F,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,sDAAsD;oBAC/D,IAAI;oBACJ,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,wBAAwB,CAAC;iBACxD,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,sDAAsD;oBAC/D,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,0DAA0D;oBACnE,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,8DAA8D;gBACvE,IAAI;gBACJ,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,sBAAsB,CAAC;aACtD,CAAC;QACJ,CAAC;KACF;IAED,mEAAmE;IACnE;QACE,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,4EAA4E;QACzF,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,iCAAiC,CAAC;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACrE,CAAC;YAED,MAAM,YAAY,GAAG,sDAAsD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1F,0CAA0C;YAC1C,MAAM,SAAS,GAAG,yDAAyD,CAAC,IAAI,CAAC,OAAO,CAAC;gBACvE,6DAA6D,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9F,MAAM,YAAY,GAAG,sDAAsD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1F,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,sDAAsD;oBAC/D,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,4DAA4D;oBACrE,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,gFAAgF;oBACzF,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,oEAAoE;gBAC7E,IAAI;gBACJ,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,yBAAyB,CAAC;aACzD,CAAC;QACJ,CAAC;KACF;IAED,wEAAwE;IACxE;QACE,IAAI,EAAE,iCAAiC;QACvC,WAAW,EAAE,yEAAyE;QACtF,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,iCAAiC,CAAC;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACrE,CAAC;YAED,MAAM,YAAY,GAAG,yCAAyC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7E,0CAA0C;YAC1C,MAAM,SAAS,GAAG,mDAAmD,CAAC,IAAI,CAAC,OAAO,CAAC;gBACjE,0DAA0D,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3F,MAAM,YAAY,GAAG,mDAAmD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEvF,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,mDAAmD;oBAC5D,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,sDAAsD;oBAC/D,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,6EAA6E;oBACtF,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,yEAAyE;gBAClF,IAAI;gBACJ,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,sBAAsB,CAAC;aACtD,CAAC;QACJ,CAAC;KACF;IAED,kDAAkD;IAClD;QACE,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,kEAAkE;QAC/E,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,0BAA0B,CAAC;YACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACrE,CAAC;YAED,8EAA8E;YAC9E,MAAM,qBAAqB,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,YAAY,GAAG,qDAAqD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzF,MAAM,QAAQ,GAAG,iDAAiD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjF,MAAM,eAAe,GAAG,wDAAwD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE/F,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC3B,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,wDAAwD;oBACjE,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnD,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,gDAAgD;oBACzD,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG;gBACb,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACtC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC9B,UAAU,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aAC7C,CAAC;YAEF,4DAA4D;YAC5D,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpE,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,0DAA0D,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC,GAAG,kBAAkB,MAAM,CAAC,UAAU,GAAG;oBAC5I,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,wBAAwB,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,GAAG,iBAAiB,MAAM,CAAC,UAAU,SAAS;gBAC9G,IAAI;aACL,CAAC;QACJ,CAAC;KACF;IAED,sDAAsD;IACtD;QACE,IAAI,EAAE,qCAAqC;QAC3C,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,qCAAqC,CAAC;YACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACrE,CAAC;YAED,2EAA2E;YAC3E,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEpE,+BAA+B;YAC/B,MAAM,SAAS,GAAG,2CAA2C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5E,MAAM,SAAS,GAAG,2CAA2C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1E,6EAA6E;YAC7E,MAAM,YAAY,GAAG,mDAAmD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvF,MAAM,YAAY,GAAG,mDAAmD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvF,MAAM,WAAW,GAAG,kDAAkD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErF,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,qDAAqD;oBAC9D,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnD,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,oDAAoD;oBAC7D,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,yCAAyC;YACzC,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aAC9C,CAAC;YAEF,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1C,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,wEAAwE;oBACjF,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,mDAAmD;YACnD,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBAC5D,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,4DAA4D,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,GAAG,GAAG;oBAC/H,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,0BAA0B,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,GAAG,SAAS;gBACjG,IAAI;aACL,CAAC;QACJ,CAAC;KACF;IAED,6DAA6D;IAC7D;QACE,IAAI,EAAE,+CAA+C;QACrD,WAAW,EAAE,kEAAkE;QAC/E,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,yBAAyB,CAAC;YACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACrE,CAAC;YAED,MAAM,gBAAgB,GAAG,qDAAqD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7F,MAAM,SAAS,GAAG,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE3D,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,wDAAwD;oBACjE,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,yDAAyD;oBAClE,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,yDAAyD;gBAClE,IAAI;aACL,CAAC;QACJ,CAAC;KACF;IAED,gEAAgE;IAChE;QACE,IAAI,EAAE,oDAAoD;QAC1D,WAAW,EAAE,qEAAqE;QAClF,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,sBAAsB,CAAC;YACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;YACrE,CAAC;YAED,MAAM,gBAAgB,GAAG,8DAA8D,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtG,MAAM,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEzD,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,iEAAiE;oBAC1E,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,uDAAuD;oBAChE,IAAI;iBACL,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,4DAA4D;gBACrE,IAAI;aACL,CAAC;QACJ,CAAC;KACF;IAED,kDAAkD;IAClD;QACE,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,0EAA0E;QACvF,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,SAAS,GAAG,yBAAyB,CAAC;YAC5C,MAAM,cAAc,GAAG,sBAAsB,CAAC;YAE9C,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;YAEnD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACrF,CAAC;YACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,cAAc,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;YAC/F,CAAC;YAED,+BAA+B;YAC/B,MAAM,kBAAkB,GAAG,+BAA+B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9E,oCAAoC;YACpC,MAAM,uBAAuB,GAAG,+BAA+B,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAExF,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,iEAAiE;oBAC1E,IAAI,EAAE,SAAS;iBAChB,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC7B,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,gFAAgF;oBACzF,IAAI,EAAE,cAAc;iBACrB,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,0DAA0D;aACpE,CAAC;QACJ,CAAC;KACF;IAED,qCAAqC;IACrC;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,6EAA6E;QAC1F,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,SAAS,GAAG,yBAAyB,CAAC;YAC5C,MAAM,cAAc,GAAG,sBAAsB,CAAC;YAE9C,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;YAEnD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACrF,CAAC;YACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,cAAc,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;YAC/F,CAAC;YAED,kFAAkF;YAClF,MAAM,gBAAgB,GAAG,iDAAiD,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9F,MAAM,qBAAqB,GAAG,8BAA8B,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAErF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,wEAAwE;oBACjF,IAAI,EAAE,SAAS;iBAChB,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC3B,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,4CAA4C;oBACrD,IAAI,EAAE,cAAc;iBACrB,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,wDAAwD;aAClE,CAAC;QACJ,CAAC;KACF;CACF,CAAC;AAEK,KAAK,UAAU,GAAG;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEhC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,WAAW,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE;gBAC3C,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,MAAM,CAAC,IAAI;gBACtB,MAAM,EAAE,qBAAqB;gBAC7B,UAAU,EAAE,KAAK,CAAC,WAAW;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,WAAW,KAAK,CAAC;QACzB,QAAQ;QACR,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;QAChC,QAAQ,EAAE;YACR,WAAW,EAAE,cAAc,CAAC,MAAM;YAClC,YAAY,EAAE,WAAW;YACzB,YAAY,EAAE,WAAW;SAC1B;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,IAAI,sCAAsC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,IAAA,6BAAa,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,IAAI,qDAAqD,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IAEzF,MAAM,OAAO,GAAwD,EAAE,CAAC;IAExE,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEhC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,GAAG,qBAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,MAAM,qBAAK,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,qBAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,MAAM,qBAAK,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,IAAA,6BAAa,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,aAAa,WAAW,YAAY,WAAW,WAAW,CAAC,CAAC;IAExF,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,GAAG,qBAAK,CAAC,OAAO,wCAAwC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,IAAI,qCAAqC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC;QACrG,OAAO,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,kGAAkG,CAAC,CAAC;QAEhH,OAAO,CAAC,GAAG,CAAC,KAAK,qBAAK,CAAC,KAAK,6CAA6C,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,qBAAK,CAAC,OAAO,6CAA6C,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;QAC1B,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;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { PreflightCheckResult } from "../../core/types";
3
+ export declare const id = "performance/barrel-import-detection";
4
+ export declare const name = "Barrel Import Detection";
5
+ export declare const description = "Detects imports from large barrel files that impact bundle size";
6
+ export declare const category = "performance";
7
+ export declare const blocking = false;
8
+ export declare const tags: string[];
9
+ export declare function run(): Promise<PreflightCheckResult>;
10
+ //# sourceMappingURL=barrel-import-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barrel-import-detection.d.ts","sourceRoot":"","sources":["../../../src/checks/performance/barrel-import-detection.ts"],"names":[],"mappings":";AAwBA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAI1E,eAAO,MAAM,EAAE,wCAAwC,CAAC;AACxD,eAAO,MAAM,IAAI,4BAA4B,CAAC;AAC9C,eAAO,MAAM,WAAW,oEAAoE,CAAC;AAC7F,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AACtC,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,IAAI,UAAuD,CAAC;AA8EzE,wBAAsB,GAAG,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAkFzD"}