@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.
- package/dist/checks/data-integrity/internal-link-validation.d.ts +10 -0
- package/dist/checks/data-integrity/internal-link-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/internal-link-validation.js +279 -0
- package/dist/checks/data-integrity/internal-link-validation.js.map +1 -0
- package/dist/checks/data-integrity/scan-billing-enforcement.d.ts +10 -0
- package/dist/checks/data-integrity/scan-billing-enforcement.d.ts.map +1 -0
- package/dist/checks/data-integrity/scan-billing-enforcement.js +596 -0
- package/dist/checks/data-integrity/scan-billing-enforcement.js.map +1 -0
- package/dist/checks/performance/barrel-import-detection.d.ts +10 -0
- package/dist/checks/performance/barrel-import-detection.d.ts.map +1 -0
- package/dist/checks/performance/barrel-import-detection.js +245 -0
- package/dist/checks/performance/barrel-import-detection.js.map +1 -0
- package/dist/checks/react/session-provider-usage.d.ts +11 -0
- package/dist/checks/react/session-provider-usage.d.ts.map +1 -0
- package/dist/checks/react/session-provider-usage.js +263 -0
- package/dist/checks/react/session-provider-usage.js.map +1 -0
- package/dist/checks/react/state-update-during-render.d.ts.map +1 -1
- package/dist/checks/react/state-update-during-render.js +1 -0
- package/dist/checks/react/state-update-during-render.js.map +1 -1
- package/dist/checks/store/team-member-access-consistency.d.ts +10 -0
- package/dist/checks/store/team-member-access-consistency.d.ts.map +1 -0
- package/dist/checks/store/team-member-access-consistency.js +199 -0
- package/dist/checks/store/team-member-access-consistency.js.map +1 -0
- package/dist/checks/ui/floating-element-zindex.d.ts +10 -0
- package/dist/checks/ui/floating-element-zindex.d.ts.map +1 -0
- package/dist/checks/ui/floating-element-zindex.js +292 -0
- package/dist/checks/ui/floating-element-zindex.js.map +1 -0
- package/dist/checks/ui/missing-page-layout.d.ts +10 -0
- package/dist/checks/ui/missing-page-layout.d.ts.map +1 -0
- package/dist/checks/ui/missing-page-layout.js +350 -0
- package/dist/checks/ui/missing-page-layout.js.map +1 -0
- 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"}
|