@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.
- package/dist/checks/framework/prisma-version-bugs.d.ts +47 -0
- package/dist/checks/framework/prisma-version-bugs.d.ts.map +1 -0
- package/dist/checks/framework/prisma-version-bugs.js +232 -0
- package/dist/checks/framework/prisma-version-bugs.js.map +1 -0
- package/dist/checks/framework/turbopack-prisma-external.d.ts +37 -0
- package/dist/checks/framework/turbopack-prisma-external.d.ts.map +1 -0
- package/dist/checks/framework/turbopack-prisma-external.js +144 -0
- package/dist/checks/framework/turbopack-prisma-external.js.map +1 -0
- package/dist/checks/listing-approval/image-processing-validation.d.ts +14 -0
- package/dist/checks/listing-approval/image-processing-validation.d.ts.map +1 -0
- package/dist/checks/listing-approval/image-processing-validation.js +198 -0
- package/dist/checks/listing-approval/image-processing-validation.js.map +1 -0
- package/dist/checks/listing-approval/r2-metadata-application.d.ts +14 -0
- package/dist/checks/listing-approval/r2-metadata-application.d.ts.map +1 -0
- package/dist/checks/listing-approval/r2-metadata-application.js +261 -0
- package/dist/checks/listing-approval/r2-metadata-application.js.map +1 -0
- package/dist/checks/listing-approval/seo-metadata-consistency.d.ts +14 -0
- package/dist/checks/listing-approval/seo-metadata-consistency.d.ts.map +1 -0
- package/dist/checks/listing-approval/seo-metadata-consistency.js +408 -0
- package/dist/checks/listing-approval/seo-metadata-consistency.js.map +1 -0
- package/dist/checks/ui/batch-progress-consistency.d.ts +13 -0
- package/dist/checks/ui/batch-progress-consistency.d.ts.map +1 -0
- package/dist/checks/ui/batch-progress-consistency.js +200 -0
- package/dist/checks/ui/batch-progress-consistency.js.map +1 -0
- package/dist/checks/ui/bulk-action-progress-feedback.d.ts +13 -0
- package/dist/checks/ui/bulk-action-progress-feedback.d.ts.map +1 -0
- package/dist/checks/ui/bulk-action-progress-feedback.js +273 -0
- package/dist/checks/ui/bulk-action-progress-feedback.js.map +1 -0
- 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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"}
|