@empline/preflight 1.1.31 → 1.1.32

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 (29) hide show
  1. package/dist/checks/framework/prisma-version-bugs.d.ts +47 -0
  2. package/dist/checks/framework/prisma-version-bugs.d.ts.map +1 -0
  3. package/dist/checks/framework/prisma-version-bugs.js +232 -0
  4. package/dist/checks/framework/prisma-version-bugs.js.map +1 -0
  5. package/dist/checks/framework/turbopack-prisma-external.d.ts +37 -0
  6. package/dist/checks/framework/turbopack-prisma-external.d.ts.map +1 -0
  7. package/dist/checks/framework/turbopack-prisma-external.js +144 -0
  8. package/dist/checks/framework/turbopack-prisma-external.js.map +1 -0
  9. package/dist/checks/listing-approval/image-processing-validation.d.ts +14 -0
  10. package/dist/checks/listing-approval/image-processing-validation.d.ts.map +1 -0
  11. package/dist/checks/listing-approval/image-processing-validation.js +198 -0
  12. package/dist/checks/listing-approval/image-processing-validation.js.map +1 -0
  13. package/dist/checks/listing-approval/r2-metadata-application.d.ts +14 -0
  14. package/dist/checks/listing-approval/r2-metadata-application.d.ts.map +1 -0
  15. package/dist/checks/listing-approval/r2-metadata-application.js +261 -0
  16. package/dist/checks/listing-approval/r2-metadata-application.js.map +1 -0
  17. package/dist/checks/listing-approval/seo-metadata-consistency.d.ts +14 -0
  18. package/dist/checks/listing-approval/seo-metadata-consistency.d.ts.map +1 -0
  19. package/dist/checks/listing-approval/seo-metadata-consistency.js +408 -0
  20. package/dist/checks/listing-approval/seo-metadata-consistency.js.map +1 -0
  21. package/dist/checks/ui/batch-progress-consistency.d.ts +13 -0
  22. package/dist/checks/ui/batch-progress-consistency.d.ts.map +1 -0
  23. package/dist/checks/ui/batch-progress-consistency.js +200 -0
  24. package/dist/checks/ui/batch-progress-consistency.js.map +1 -0
  25. package/dist/checks/ui/bulk-action-progress-feedback.d.ts +13 -0
  26. package/dist/checks/ui/bulk-action-progress-feedback.d.ts.map +1 -0
  27. package/dist/checks/ui/bulk-action-progress-feedback.js +273 -0
  28. package/dist/checks/ui/bulk-action-progress-feedback.js.map +1 -0
  29. package/package.json +1 -1
@@ -0,0 +1,408 @@
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
+ * SEO Metadata Consistency Preflight
11
+ *
12
+ * Validates that SEO metadata is consistently generated and stored
13
+ * during the listing approval process. This ensures:
14
+ * 1. SEO-friendly filenames are generated with product attributes
15
+ * 2. Alt text, titles, descriptions, and captions are created
16
+ * 3. SEO fields are stored in the listing database record
17
+ * 4. Responsive image URLs are generated for all sizes
18
+ * 5. Blur placeholders are generated for progressive loading
19
+ *
20
+ * Critical for:
21
+ * - Google Image Search ranking
22
+ * - Social media sharing previews
23
+ * - Accessibility (screen readers)
24
+ * - Core Web Vitals (progressive loading)
25
+ */
26
+ const fs_1 = __importDefault(require("fs"));
27
+ const path_1 = __importDefault(require("path"));
28
+ const console_chars_1 = require("../../utils/console-chars");
29
+ // METADATA - Required for plugin loader discovery
30
+ exports.id = "listing-approval/seo-metadata-consistency";
31
+ exports.name = "SEO Metadata Consistency";
32
+ exports.description = "Validates SEO metadata generation and storage during approval";
33
+ exports.category = "listing-approval";
34
+ exports.blocking = true; // Critical for SEO
35
+ exports.tags = ["listing", "approval", "seo", "filename", "responsive", "blur"];
36
+ exports.requires = ["trading-card-system"];
37
+ /**
38
+ * Files to validate for SEO metadata
39
+ */
40
+ const FILES_TO_CHECK = {
41
+ imageManagement: "lib/image-management.ts",
42
+ approvalRoute: "app/api/admin/listings/approve/route.ts",
43
+ bulkApprovalRoute: "app/api/admin/listings/bulk-approve/route.ts",
44
+ };
45
+ /**
46
+ * Required patterns for SEO filename generation
47
+ */
48
+ const FILENAME_PATTERNS = {
49
+ // Must have filename generation function
50
+ filenameGenerator: {
51
+ pattern: /generateCardFilename|generate\w*Filename/,
52
+ description: "SEO filename generator function",
53
+ critical: true,
54
+ files: ["imageManagement"],
55
+ },
56
+ // Must include year in filename
57
+ yearInFilename: {
58
+ pattern: /cardData\.year|data\.year|year,?\s*$/m,
59
+ description: "Year included in filename generation",
60
+ critical: true,
61
+ files: ["imageManagement"],
62
+ },
63
+ // Must include brand in filename
64
+ brandInFilename: {
65
+ pattern: /cardData\.brand|formatBrandName/,
66
+ description: "Brand included in filename generation",
67
+ critical: true,
68
+ files: ["imageManagement"],
69
+ },
70
+ // Must include player/featured in filename
71
+ featuredInFilename: {
72
+ pattern: /cardData\.featured|data\.featured|featured/,
73
+ description: "Featured player/name included in filename",
74
+ critical: true,
75
+ files: ["imageManagement"],
76
+ },
77
+ // Must include unique suffix (listing ID)
78
+ uniqueSuffix: {
79
+ pattern: /getListingIdSuffix|listingId\.slice|listing.*suffix/i,
80
+ description: "Unique listing ID suffix for filename uniqueness",
81
+ critical: true,
82
+ files: ["imageManagement"],
83
+ },
84
+ // Must sanitize filename
85
+ filenameSanitization: {
86
+ pattern: /sanitizeForFilename|sanitize.*filename/i,
87
+ description: "Filename sanitization for safe URLs",
88
+ critical: true,
89
+ files: ["imageManagement"],
90
+ },
91
+ };
92
+ /**
93
+ * Required patterns for SEO text generation
94
+ */
95
+ const SEO_TEXT_PATTERNS = {
96
+ // Must generate alt text
97
+ altTextGeneration: {
98
+ pattern: /altText|alt_text|generateAltText|seoMetadata\.altText/i,
99
+ description: "Alt text generation for accessibility",
100
+ critical: true,
101
+ files: ["imageManagement"],
102
+ },
103
+ // Must generate title
104
+ titleGeneration: {
105
+ pattern: /seoMetadata\.title|imageTitle|generateTitle/i,
106
+ description: "SEO title generation for images",
107
+ critical: true,
108
+ files: ["imageManagement"],
109
+ },
110
+ // Must generate description
111
+ descriptionGeneration: {
112
+ pattern: /seoMetadata\.description|imageDescription|generateDescription/i,
113
+ description: "SEO description generation",
114
+ critical: true,
115
+ files: ["imageManagement"],
116
+ },
117
+ // Must generate caption
118
+ captionGeneration: {
119
+ pattern: /seoMetadata\.caption|imageCaption|generateCaption/i,
120
+ description: "Image caption generation",
121
+ critical: false,
122
+ files: ["imageManagement"],
123
+ },
124
+ // Must generate keywords
125
+ keywordsGeneration: {
126
+ pattern: /seoMetadata\.keywords|imageKeywords|generateKeywords/i,
127
+ description: "SEO keywords generation",
128
+ critical: false,
129
+ files: ["imageManagement"],
130
+ },
131
+ };
132
+ /**
133
+ * Required patterns for database storage
134
+ */
135
+ const DATABASE_PATTERNS = {
136
+ // Must store alt texts
137
+ storeAltTexts: {
138
+ pattern: /imageAltTexts[,:\s]/,
139
+ description: "Alt texts stored in listing record",
140
+ critical: true,
141
+ files: ["approvalRoute", "bulkApprovalRoute"],
142
+ },
143
+ // Must store titles
144
+ storeTitles: {
145
+ pattern: /imageTitles[,:\s]/,
146
+ description: "Image titles stored in listing record",
147
+ critical: true,
148
+ files: ["approvalRoute", "bulkApprovalRoute"],
149
+ },
150
+ // Must store descriptions
151
+ storeDescriptions: {
152
+ pattern: /imageDescriptions[,:\s]/,
153
+ description: "Image descriptions stored in listing record",
154
+ critical: true,
155
+ files: ["approvalRoute", "bulkApprovalRoute"],
156
+ },
157
+ // Must store captions
158
+ storeCaptions: {
159
+ pattern: /imageCaptions[,:\s]/,
160
+ description: "Image captions stored in listing record",
161
+ critical: false,
162
+ files: ["approvalRoute"],
163
+ },
164
+ };
165
+ /**
166
+ * Required patterns for responsive images
167
+ */
168
+ const RESPONSIVE_PATTERNS = {
169
+ // Must generate multiple sizes
170
+ multipleSizes: {
171
+ pattern: /original|large|medium|thumbnail|small/i,
172
+ description: "Multiple image sizes generated",
173
+ critical: true,
174
+ files: ["imageManagement"],
175
+ },
176
+ // Must return responsive URLs
177
+ responsiveUrls: {
178
+ pattern: /responsiveUrls|responsive.*urls/i,
179
+ description: "Responsive URLs returned from processing",
180
+ critical: true,
181
+ files: ["imageManagement", "approvalRoute"],
182
+ },
183
+ // Should generate WebP format
184
+ webpGeneration: {
185
+ pattern: /webp|\.webp/i,
186
+ description: "WebP format for modern browsers",
187
+ critical: false,
188
+ files: ["imageManagement"],
189
+ },
190
+ };
191
+ /**
192
+ * Required patterns for blur placeholders
193
+ */
194
+ const BLUR_PATTERNS = {
195
+ // Must generate blur placeholder
196
+ blurGeneration: {
197
+ pattern: /blurPlaceholder|blur.*placeholder|generateBlur/i,
198
+ description: "Blur placeholder for progressive loading",
199
+ critical: false,
200
+ files: ["approvalRoute"],
201
+ },
202
+ // Must store blur data
203
+ blurStorage: {
204
+ pattern: /blurPlaceholder:\s*blurPlaceholderData|blurPlaceholder\s*}/i,
205
+ description: "Blur placeholder stored in listing metadata",
206
+ critical: false,
207
+ files: ["approvalRoute"],
208
+ },
209
+ };
210
+ async function run() {
211
+ console.log(`\n${console_chars_1.emoji.ruler} SEO METADATA CONSISTENCY VALIDATION`);
212
+ console.log((0, console_chars_1.createDivider)(65, "heavy"));
213
+ const issues = [];
214
+ const fileContents = {};
215
+ // Load all files
216
+ for (const [key, relativePath] of Object.entries(FILES_TO_CHECK)) {
217
+ const filePath = path_1.default.join(process.cwd(), relativePath);
218
+ if (!fs_1.default.existsSync(filePath)) {
219
+ issues.push({
220
+ file: relativePath,
221
+ type: "file-missing",
222
+ pattern: "N/A",
223
+ description: `Required file not found: ${relativePath}`,
224
+ critical: true,
225
+ });
226
+ continue;
227
+ }
228
+ fileContents[key] = fs_1.default.readFileSync(filePath, "utf-8");
229
+ }
230
+ // Check filename patterns
231
+ console.log(`\n${console_chars_1.emoji.search} Checking SEO filename generation...`);
232
+ for (const [name, check] of Object.entries(FILENAME_PATTERNS)) {
233
+ let found = false;
234
+ for (const fileKey of check.files) {
235
+ if (fileContents[fileKey] && check.pattern.test(fileContents[fileKey])) {
236
+ found = true;
237
+ break;
238
+ }
239
+ }
240
+ if (!found) {
241
+ const fileNames = check.files.map((k) => FILES_TO_CHECK[k]).join(", ");
242
+ issues.push({
243
+ file: fileNames,
244
+ type: "missing",
245
+ pattern: name,
246
+ description: check.description,
247
+ critical: check.critical,
248
+ });
249
+ const icon = check.critical ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
250
+ console.log(` ${icon} Missing: ${check.description}`);
251
+ }
252
+ else {
253
+ console.log(` ${console_chars_1.emoji.success} Found: ${check.description}`);
254
+ }
255
+ }
256
+ // Check SEO text patterns
257
+ console.log(`\n${console_chars_1.emoji.search} Checking SEO text generation...`);
258
+ for (const [name, check] of Object.entries(SEO_TEXT_PATTERNS)) {
259
+ let found = false;
260
+ for (const fileKey of check.files) {
261
+ if (fileContents[fileKey] && check.pattern.test(fileContents[fileKey])) {
262
+ found = true;
263
+ break;
264
+ }
265
+ }
266
+ if (!found) {
267
+ const fileNames = check.files.map((k) => FILES_TO_CHECK[k]).join(", ");
268
+ issues.push({
269
+ file: fileNames,
270
+ type: "missing",
271
+ pattern: name,
272
+ description: check.description,
273
+ critical: check.critical,
274
+ });
275
+ const icon = check.critical ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
276
+ console.log(` ${icon} Missing: ${check.description}`);
277
+ }
278
+ else {
279
+ console.log(` ${console_chars_1.emoji.success} Found: ${check.description}`);
280
+ }
281
+ }
282
+ // Check database storage patterns
283
+ console.log(`\n${console_chars_1.emoji.search} Checking database storage...`);
284
+ for (const [name, check] of Object.entries(DATABASE_PATTERNS)) {
285
+ let found = false;
286
+ for (const fileKey of check.files) {
287
+ if (fileContents[fileKey] && check.pattern.test(fileContents[fileKey])) {
288
+ found = true;
289
+ break;
290
+ }
291
+ }
292
+ if (!found) {
293
+ const fileNames = check.files.map((k) => FILES_TO_CHECK[k]).join(", ");
294
+ issues.push({
295
+ file: fileNames,
296
+ type: "missing",
297
+ pattern: name,
298
+ description: check.description,
299
+ critical: check.critical,
300
+ });
301
+ const icon = check.critical ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
302
+ console.log(` ${icon} Missing: ${check.description}`);
303
+ }
304
+ else {
305
+ console.log(` ${console_chars_1.emoji.success} Found: ${check.description}`);
306
+ }
307
+ }
308
+ // Check responsive image patterns
309
+ console.log(`\n${console_chars_1.emoji.search} Checking responsive images...`);
310
+ for (const [name, check] of Object.entries(RESPONSIVE_PATTERNS)) {
311
+ let found = false;
312
+ for (const fileKey of check.files) {
313
+ if (fileContents[fileKey] && check.pattern.test(fileContents[fileKey])) {
314
+ found = true;
315
+ break;
316
+ }
317
+ }
318
+ if (!found) {
319
+ const fileNames = check.files.map((k) => FILES_TO_CHECK[k]).join(", ");
320
+ issues.push({
321
+ file: fileNames,
322
+ type: "missing",
323
+ pattern: name,
324
+ description: check.description,
325
+ critical: check.critical,
326
+ });
327
+ const icon = check.critical ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
328
+ console.log(` ${icon} Missing: ${check.description}`);
329
+ }
330
+ else {
331
+ console.log(` ${console_chars_1.emoji.success} Found: ${check.description}`);
332
+ }
333
+ }
334
+ // Check blur placeholder patterns
335
+ console.log(`\n${console_chars_1.emoji.search} Checking blur placeholders...`);
336
+ for (const [name, check] of Object.entries(BLUR_PATTERNS)) {
337
+ let found = false;
338
+ for (const fileKey of check.files) {
339
+ if (fileContents[fileKey] && check.pattern.test(fileContents[fileKey])) {
340
+ found = true;
341
+ break;
342
+ }
343
+ }
344
+ if (!found) {
345
+ const fileNames = check.files.map((k) => FILES_TO_CHECK[k]).join(", ");
346
+ issues.push({
347
+ file: fileNames,
348
+ type: "missing",
349
+ pattern: name,
350
+ description: check.description,
351
+ critical: check.critical,
352
+ });
353
+ const icon = check.critical ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
354
+ console.log(` ${icon} Missing: ${check.description}`);
355
+ }
356
+ else {
357
+ console.log(` ${console_chars_1.emoji.success} Found: ${check.description}`);
358
+ }
359
+ }
360
+ // Summary
361
+ const criticalIssues = issues.filter((i) => i.critical);
362
+ const warningIssues = issues.filter((i) => !i.critical);
363
+ console.log(`\n${console_chars_1.emoji.chart} Summary:`);
364
+ console.log(` Critical issues: ${criticalIssues.length}`);
365
+ console.log(` Warning issues: ${warningIssues.length}`);
366
+ if (issues.length === 0) {
367
+ console.log(`\n${console_chars_1.emoji.success} SEO METADATA CONSISTENCY VALIDATION PASSED`);
368
+ console.log(`\nAll SEO metadata is correctly generated and stored.`);
369
+ return { success: true, errors: 0, warnings: 0 };
370
+ }
371
+ if (criticalIssues.length > 0) {
372
+ console.log(`\n${console_chars_1.emoji.error} Critical issues:`);
373
+ for (const issue of criticalIssues) {
374
+ console.log(` ${issue.file}: ${issue.description}`);
375
+ }
376
+ }
377
+ if (warningIssues.length > 0) {
378
+ console.log(`\n${console_chars_1.emoji.warning} Warning issues:`);
379
+ for (const issue of warningIssues) {
380
+ console.log(` ${issue.file}: ${issue.description}`);
381
+ }
382
+ }
383
+ console.log(`\n${console_chars_1.emoji.info} SEO metadata requirements:`);
384
+ console.log(` Filenames: year-brand-player-cardnumber-grade-sport-side-uniqueid.jpg`);
385
+ console.log(` Alt Text: Descriptive text for screen readers and Google`);
386
+ console.log(` Titles: SEO-friendly image titles`);
387
+ console.log(` Descriptions: Detailed product description`);
388
+ console.log(` Responsive: original, large, medium, thumbnail sizes`);
389
+ console.log(` Blur: Base64 placeholder for progressive loading`);
390
+ if (criticalIssues.length > 0) {
391
+ console.log(`\n${console_chars_1.emoji.error} SEO METADATA CONSISTENCY VALIDATION FAILED`);
392
+ return { success: false, errors: criticalIssues.length, warnings: warningIssues.length };
393
+ }
394
+ console.log(`\n${console_chars_1.emoji.warning} SEO METADATA CONSISTENCY VALIDATION PASSED WITH WARNINGS`);
395
+ return { success: true, errors: 0, warnings: warningIssues.length };
396
+ }
397
+ // Allow direct execution
398
+ if (require.main === module) {
399
+ run()
400
+ .then((result) => {
401
+ process.exit(result.success ? 0 : 1);
402
+ })
403
+ .catch((err) => {
404
+ console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
405
+ process.exit(1);
406
+ });
407
+ }
408
+ //# sourceMappingURL=seo-metadata-consistency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-metadata-consistency.js","sourceRoot":"","sources":["../../../src/checks/listing-approval/seo-metadata-consistency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ export declare const id = "ui/batch-progress-consistency";
3
+ export declare const name = "Batch Progress Consistency";
4
+ export declare const description = "Validates integration batch operations show proper progress feedback";
5
+ export declare const category = "ui";
6
+ export declare const blocking = false;
7
+ export declare const tags: string[];
8
+ export declare function run(): Promise<{
9
+ success: boolean;
10
+ errors: number;
11
+ warnings: number;
12
+ }>;
13
+ //# sourceMappingURL=batch-progress-consistency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-progress-consistency.d.ts","sourceRoot":"","sources":["../../../src/checks/ui/batch-progress-consistency.ts"],"names":[],"mappings":";AAwBA,eAAO,MAAM,EAAE,kCAAkC,CAAC;AAClD,eAAO,MAAM,IAAI,+BAA+B,CAAC;AACjD,eAAO,MAAM,WAAW,yEAAyE,CAAC;AAClG,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,IAAI,UAAoD,CAAC;AA0EtE,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA0G3F"}
@@ -0,0 +1,200 @@
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.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
8
+ exports.run = run;
9
+ /**
10
+ * Batch Progress Consistency Preflight
11
+ *
12
+ * Validates that integration components with batch operations show
13
+ * proper progress feedback to users during long-running operations.
14
+ *
15
+ * Requirements for batch operations:
16
+ * 1. Must use a BatchLoadingState interface with progress tracking fields
17
+ * 2. Must update progress during batch operations (not just at start/end)
18
+ * 3. Must show LinearProgress for visual feedback
19
+ * 4. Must show StatusChip components for loaded/remaining counts
20
+ * 5. Must show current operation being processed
21
+ *
22
+ * This prevents the poor UX of showing a loading spinner with no progress
23
+ * indication while potentially thousands of items are being loaded.
24
+ */
25
+ const fs_1 = __importDefault(require("fs"));
26
+ const path_1 = __importDefault(require("path"));
27
+ const glob_1 = require("glob");
28
+ const console_chars_1 = require("../../utils/console-chars");
29
+ // METADATA - Required for plugin loader discovery
30
+ exports.id = "ui/batch-progress-consistency";
31
+ exports.name = "Batch Progress Consistency";
32
+ exports.description = "Validates integration batch operations show proper progress feedback";
33
+ exports.category = "ui";
34
+ exports.blocking = false; // Warning level - doesn't block build
35
+ exports.tags = ["ui", "ux", "integrations", "progress", "batch"];
36
+ /**
37
+ * File patterns to check for batch operations
38
+ */
39
+ const INTEGRATION_PATTERNS = [
40
+ "components/**/steps/*.tsx",
41
+ "app/store/integrations/**/*.tsx",
42
+ ];
43
+ /**
44
+ * Patterns that indicate a batch operation exists
45
+ */
46
+ const BATCH_OPERATION_INDICATORS = [
47
+ /fetchAllProducts|fetchAllForBatch|selectAllIn|batchSelect|loadAll/i,
48
+ /loadingAllForBatch|batchLoading|isLoadingBatch/i,
49
+ ];
50
+ /**
51
+ * Required patterns when batch operations are present
52
+ */
53
+ const REQUIRED_BATCH_PATTERNS = {
54
+ // Progress state interface
55
+ progressState: {
56
+ pattern: /interface\s+\w*(?:Batch|Loading)\w*State\s*\{[\s\S]*?(?:loadedCount|processedCount|currentItem|currentCategory)[\s\S]*?\}/,
57
+ description: "BatchLoadingState interface with progress tracking fields",
58
+ },
59
+ // Progress updates during operation
60
+ progressUpdates: {
61
+ pattern: /setBatch(?:Loading)?State\s*\(\s*(?:\(prev\)|prev)\s*=>/,
62
+ description: "Progress updates during batch operation (using setState updater)",
63
+ },
64
+ // LinearProgress for visual feedback
65
+ linearProgress: {
66
+ pattern: /<LinearProgress[\s\S]*?variant="determinate"/,
67
+ description: "LinearProgress with determinate variant for visual progress",
68
+ },
69
+ // StatusChip for counts
70
+ statusChips: {
71
+ pattern: /<StatusChip[\s\S]*?(?:Loaded|Processed|Remaining|Failed)/,
72
+ description: "StatusChip components showing loaded/processed counts",
73
+ },
74
+ // Current item/category being processed
75
+ currentProcessing: {
76
+ pattern: /Processing:\s*\{|currentCategory|currentProduct|currentBatch/,
77
+ description: "Display of current item/category being processed",
78
+ },
79
+ };
80
+ /**
81
+ * Anti-patterns that suggest poor batch UX
82
+ */
83
+ const BATCH_ANTI_PATTERNS = {
84
+ // Simple boolean loading state without progress
85
+ simpleBooleanLoading: {
86
+ pattern: /const\s*\[\s*loading(?:AllForBatch|Batch)\s*,\s*setLoading(?:AllForBatch|Batch)\s*\]\s*=\s*useState\s*<?\s*boolean\s*>?\s*\(\s*false\s*\)/,
87
+ description: "Simple boolean loading state (should use BatchLoadingState with progress)",
88
+ severity: "warning",
89
+ },
90
+ // Setting loading at start/end only
91
+ loadingOnlyStartEnd: {
92
+ pattern: /setLoading(?:AllForBatch|Batch)\s*\(\s*true\s*\)[\s\S]*?finally\s*\{[\s\S]*?setLoading(?:AllForBatch|Batch)\s*\(\s*false\s*\)/,
93
+ description: "Loading state only set at start/end (no progress updates during operation)",
94
+ severity: "warning",
95
+ },
96
+ };
97
+ async function run() {
98
+ console.log(`\n${console_chars_1.emoji.ruler} BATCH PROGRESS CONSISTENCY VALIDATION`);
99
+ console.log((0, console_chars_1.createDivider)(65, "heavy"));
100
+ const issues = [];
101
+ const filesWithBatchOps = [];
102
+ // Find all integration files
103
+ const allFiles = [];
104
+ for (const pattern of INTEGRATION_PATTERNS) {
105
+ const matches = await (0, glob_1.glob)(pattern, { cwd: process.cwd() });
106
+ allFiles.push(...matches);
107
+ }
108
+ const uniqueFiles = [...new Set(allFiles)];
109
+ console.log(`\n${console_chars_1.emoji.search} Scanning ${uniqueFiles.length} integration files...`);
110
+ // Check each file
111
+ for (const relativePath of uniqueFiles) {
112
+ const filePath = path_1.default.join(process.cwd(), relativePath);
113
+ if (!fs_1.default.existsSync(filePath))
114
+ continue;
115
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
116
+ // Check if file has batch operations
117
+ const hasBatchOps = BATCH_OPERATION_INDICATORS.some((pattern) => pattern.test(content));
118
+ if (!hasBatchOps)
119
+ continue;
120
+ filesWithBatchOps.push(relativePath);
121
+ console.log(` ${console_chars_1.emoji.file} ${relativePath} (has batch operations)`);
122
+ // Check for anti-patterns first
123
+ for (const [name, check] of Object.entries(BATCH_ANTI_PATTERNS)) {
124
+ if (check.pattern.test(content)) {
125
+ // Check if they also have the good patterns (upgraded from simple loading)
126
+ const hasProgressState = REQUIRED_BATCH_PATTERNS.progressState.pattern.test(content);
127
+ if (!hasProgressState) {
128
+ issues.push({
129
+ file: relativePath,
130
+ type: "anti-pattern",
131
+ description: `${name}: ${check.description}`,
132
+ severity: check.severity,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ // Check for required patterns
138
+ for (const [name, check] of Object.entries(REQUIRED_BATCH_PATTERNS)) {
139
+ if (!check.pattern.test(content)) {
140
+ issues.push({
141
+ file: relativePath,
142
+ type: "missing",
143
+ description: `Missing ${name}: ${check.description}`,
144
+ severity: "warning",
145
+ });
146
+ }
147
+ }
148
+ }
149
+ // Summary
150
+ console.log(`\n${console_chars_1.emoji.chart} Summary:`);
151
+ console.log(` Files with batch operations: ${filesWithBatchOps.length}`);
152
+ console.log(` Issues found: ${issues.length}`);
153
+ if (issues.length === 0) {
154
+ console.log(`\n${console_chars_1.emoji.success} BATCH PROGRESS CONSISTENCY VALIDATION PASSED`);
155
+ console.log(`\nAll integration batch operations have proper progress feedback.`);
156
+ return { success: true, errors: 0, warnings: 0 };
157
+ }
158
+ // Group issues by file
159
+ const issuesByFile = new Map();
160
+ for (const issue of issues) {
161
+ const fileIssues = issuesByFile.get(issue.file) || [];
162
+ fileIssues.push(issue);
163
+ issuesByFile.set(issue.file, fileIssues);
164
+ }
165
+ console.log(`\n${console_chars_1.emoji.warning} Issues found:`);
166
+ for (const [file, fileIssues] of issuesByFile) {
167
+ console.log(`\n ${file}:`);
168
+ for (const issue of fileIssues) {
169
+ const icon = issue.severity === "error" ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
170
+ console.log(` ${icon} ${issue.description}`);
171
+ }
172
+ }
173
+ console.log(`\n${console_chars_1.emoji.info} To fix batch progress issues:`);
174
+ console.log(` 1. Add a BatchLoadingState interface with these fields:`);
175
+ console.log(` - isLoading: boolean`);
176
+ console.log(` - loadedCount: number`);
177
+ console.log(` - totalEstimate: number`);
178
+ console.log(` - currentCategory/currentItem: string`);
179
+ console.log(` - errors: string[]`);
180
+ console.log(` 2. Update progress DURING the batch loop, not just at start/end`);
181
+ console.log(` 3. Show LinearProgress with determinate variant`);
182
+ console.log(` 4. Show StatusChip components for loaded/remaining counts`);
183
+ console.log(` 5. Show which item/category is currently being processed`);
184
+ console.log(`\n See components/woocommerce/steps/ProductSelectionStep.tsx for example.`);
185
+ // Exit with warning (non-blocking)
186
+ console.log(`\n${console_chars_1.emoji.warning} BATCH PROGRESS CONSISTENCY VALIDATION COMPLETED WITH WARNINGS`);
187
+ return { success: true, errors: 0, warnings: issues.length }; // Non-blocking - just warnings
188
+ }
189
+ // Allow direct execution
190
+ if (require.main === module) {
191
+ run()
192
+ .then((result) => {
193
+ process.exit(result.success ? 0 : 1);
194
+ })
195
+ .catch((err) => {
196
+ console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
197
+ process.exit(1);
198
+ });
199
+ }
200
+ //# sourceMappingURL=batch-progress-consistency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-progress-consistency.js","sourceRoot":"","sources":["../../../src/checks/ui/batch-progress-consistency.ts"],"names":[],"mappings":"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"}