@empline/preflight 1.1.24 → 1.1.26
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/integrations/critical-fields-registry.d.ts +28 -0
- package/dist/checks/integrations/critical-fields-registry.d.ts.map +1 -0
- package/dist/checks/integrations/critical-fields-registry.js +221 -0
- package/dist/checks/integrations/critical-fields-registry.js.map +1 -0
- package/dist/checks/integrations/integration-field-coverage.d.ts +13 -0
- package/dist/checks/integrations/integration-field-coverage.d.ts.map +1 -0
- package/dist/checks/integrations/integration-field-coverage.js +601 -0
- package/dist/checks/integrations/integration-field-coverage.js.map +1 -0
- package/dist/checks/ui/ui-uniformity-polish.d.ts +97 -0
- package/dist/checks/ui/ui-uniformity-polish.d.ts.map +1 -0
- package/dist/checks/ui/ui-uniformity-polish.js +759 -0
- package/dist/checks/ui/ui-uniformity-polish.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,601 @@
|
|
|
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
|
+
* Integration Field Coverage Preflight (BLOCKING)
|
|
11
|
+
*
|
|
12
|
+
* Validates that ALL integration points properly extract ALL critical fields
|
|
13
|
+
* and don't use hardcoded fallback values that cause data loss.
|
|
14
|
+
*
|
|
15
|
+
* BACKGROUND:
|
|
16
|
+
* This preflight was created after the "all cards imported with card #1" bug
|
|
17
|
+
* where the WooCommerce import route checked for "cardNumber" but not "card_number"
|
|
18
|
+
* (underscore format), causing all imported cards to get the fallback value "1".
|
|
19
|
+
*
|
|
20
|
+
* INTEGRATION POINTS CHECKED:
|
|
21
|
+
* 1. WooCommerce import route (/api/store/integrations/woocommerce/import)
|
|
22
|
+
* 2. WooCommerce batch adapter (lib/integrations/batch-import/adapters)
|
|
23
|
+
* 3. Shopify import route (/api/store/integrations/shopify/import-products)
|
|
24
|
+
* 4. CSV import route (/api/listings/upload-csv)
|
|
25
|
+
* 5. Field mapping UI components
|
|
26
|
+
*
|
|
27
|
+
* CRITICAL FIELDS VALIDATED:
|
|
28
|
+
* - cardNumber: Must check card_number, cardNumber, number patterns
|
|
29
|
+
* - year: Must check year, card_year patterns
|
|
30
|
+
* - brand: Must check brand, manufacturer, card_brand patterns
|
|
31
|
+
* - featured/player: Must check player, featured, playerName, athlete patterns
|
|
32
|
+
* - series: Must check series, set, collection patterns
|
|
33
|
+
* - team: Must check team, nfl_team, mlb_team, nba_team, nhl_team patterns
|
|
34
|
+
*
|
|
35
|
+
* CRITICAL RULES:
|
|
36
|
+
* - NO hardcoded values like "", "1", "N/A", "Unknown" for card identity fields
|
|
37
|
+
* - All integrations must extract from source data
|
|
38
|
+
* - Field mappings must include common naming variations
|
|
39
|
+
*/
|
|
40
|
+
const fs_1 = __importDefault(require("fs"));
|
|
41
|
+
const path_1 = __importDefault(require("path"));
|
|
42
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
43
|
+
// METADATA - Required for plugin loader discovery
|
|
44
|
+
exports.id = "integrations/field-coverage";
|
|
45
|
+
exports.name = "Integration Field Coverage";
|
|
46
|
+
exports.description = "Validates ALL integrations extract ALL critical fields without hardcoded defaults";
|
|
47
|
+
exports.category = "integrations";
|
|
48
|
+
exports.blocking = true; // CRITICAL - prevents data loss
|
|
49
|
+
exports.tags = ["integrations", "woocommerce", "shopify", "csv", "field-mapping", "data-integrity", "critical"];
|
|
50
|
+
exports.requires = ["trading-card-system"];
|
|
51
|
+
/**
|
|
52
|
+
* ALL critical fields and their required naming pattern coverage
|
|
53
|
+
* Each field that identifies a card MUST have comprehensive pattern coverage
|
|
54
|
+
*/
|
|
55
|
+
const CRITICAL_FIELD_PATTERNS = {
|
|
56
|
+
// CRITICAL: Card identity fields - these uniquely identify a card
|
|
57
|
+
cardNumber: {
|
|
58
|
+
requiredPatterns: [
|
|
59
|
+
"card_number", // WordPress/WooCommerce standard (underscore)
|
|
60
|
+
"cardNumber", // JavaScript/camelCase standard
|
|
61
|
+
"number", // Generic short form
|
|
62
|
+
],
|
|
63
|
+
advisoryPatterns: [
|
|
64
|
+
"card_num", // Abbreviation
|
|
65
|
+
"cardnumber", // All lowercase
|
|
66
|
+
],
|
|
67
|
+
forbiddenDefaults: [
|
|
68
|
+
'cardNumber: ""',
|
|
69
|
+
"cardNumber: ''",
|
|
70
|
+
'cardNumber: "1"',
|
|
71
|
+
"cardNumber: '1'",
|
|
72
|
+
'cardNumber: "N/A"',
|
|
73
|
+
"cardNumber: 'N/A'",
|
|
74
|
+
],
|
|
75
|
+
severity: "critical",
|
|
76
|
+
description: "Card number uniquely identifies the card in a set",
|
|
77
|
+
},
|
|
78
|
+
year: {
|
|
79
|
+
requiredPatterns: [
|
|
80
|
+
"year",
|
|
81
|
+
"card_year",
|
|
82
|
+
],
|
|
83
|
+
advisoryPatterns: [
|
|
84
|
+
"yr",
|
|
85
|
+
"release_year",
|
|
86
|
+
],
|
|
87
|
+
forbiddenDefaults: [
|
|
88
|
+
'year: ""',
|
|
89
|
+
"year: ''",
|
|
90
|
+
'year: "0"',
|
|
91
|
+
'year: "1900"',
|
|
92
|
+
],
|
|
93
|
+
severity: "critical",
|
|
94
|
+
description: "Year is essential for card identification and value",
|
|
95
|
+
},
|
|
96
|
+
brand: {
|
|
97
|
+
requiredPatterns: [
|
|
98
|
+
"brand",
|
|
99
|
+
"manufacturer",
|
|
100
|
+
],
|
|
101
|
+
advisoryPatterns: [
|
|
102
|
+
"card_brand",
|
|
103
|
+
"maker",
|
|
104
|
+
"publisher",
|
|
105
|
+
],
|
|
106
|
+
forbiddenDefaults: [
|
|
107
|
+
'brand: ""',
|
|
108
|
+
"brand: ''",
|
|
109
|
+
'brand: "Unknown"',
|
|
110
|
+
'brand: "UNKNOWN"',
|
|
111
|
+
],
|
|
112
|
+
severity: "critical",
|
|
113
|
+
description: "Brand identifies the card manufacturer (Topps, Panini, etc.)",
|
|
114
|
+
},
|
|
115
|
+
// HIGH: Player/Featured - key for search and identification
|
|
116
|
+
featured: {
|
|
117
|
+
requiredPatterns: [
|
|
118
|
+
"featured",
|
|
119
|
+
"player",
|
|
120
|
+
"playerName",
|
|
121
|
+
],
|
|
122
|
+
advisoryPatterns: [
|
|
123
|
+
"player_name",
|
|
124
|
+
"athlete",
|
|
125
|
+
"character",
|
|
126
|
+
"subject",
|
|
127
|
+
],
|
|
128
|
+
forbiddenDefaults: [
|
|
129
|
+
'featured: ""',
|
|
130
|
+
"featured: ''",
|
|
131
|
+
'featured: "Unknown"',
|
|
132
|
+
'featured: "Unknown Player"',
|
|
133
|
+
'player: ""',
|
|
134
|
+
"player: ''",
|
|
135
|
+
],
|
|
136
|
+
severity: "high",
|
|
137
|
+
description: "Featured person/character is key for search and value",
|
|
138
|
+
},
|
|
139
|
+
// HIGH: Series/Set - important for cataloging
|
|
140
|
+
series: {
|
|
141
|
+
requiredPatterns: [
|
|
142
|
+
"series",
|
|
143
|
+
"set",
|
|
144
|
+
],
|
|
145
|
+
advisoryPatterns: [
|
|
146
|
+
"collection",
|
|
147
|
+
"set_name",
|
|
148
|
+
"setName",
|
|
149
|
+
],
|
|
150
|
+
forbiddenDefaults: [
|
|
151
|
+
'series: ""',
|
|
152
|
+
"series: ''",
|
|
153
|
+
],
|
|
154
|
+
severity: "high",
|
|
155
|
+
description: "Series/Set groups cards together for collectors",
|
|
156
|
+
},
|
|
157
|
+
// MEDIUM: Team - important for sports cards
|
|
158
|
+
team: {
|
|
159
|
+
requiredPatterns: [
|
|
160
|
+
"team",
|
|
161
|
+
],
|
|
162
|
+
advisoryPatterns: [
|
|
163
|
+
"nfl_team",
|
|
164
|
+
"mlb_team",
|
|
165
|
+
"nba_team",
|
|
166
|
+
"nhl_team",
|
|
167
|
+
"team_name",
|
|
168
|
+
],
|
|
169
|
+
forbiddenDefaults: [],
|
|
170
|
+
severity: "medium",
|
|
171
|
+
description: "Team is important for sports card categorization",
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* Integration files that MUST be checked
|
|
176
|
+
*/
|
|
177
|
+
const INTEGRATION_FILES = [
|
|
178
|
+
{
|
|
179
|
+
path: "app/api/store/integrations/woocommerce/import/route.ts",
|
|
180
|
+
name: "WooCommerce Import Route",
|
|
181
|
+
checks: ["all_extraction_patterns", "all_forbidden_defaults"],
|
|
182
|
+
// Which fields to check in this file
|
|
183
|
+
fieldsToCheck: ["cardNumber", "year", "brand", "featured", "series", "team"],
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
path: "lib/integrations/batch-import/adapters/woocommerce-adapter.ts",
|
|
187
|
+
name: "WooCommerce Batch Adapter",
|
|
188
|
+
checks: ["all_extraction_patterns"],
|
|
189
|
+
fieldsToCheck: ["cardNumber", "year", "brand", "team"],
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
path: "app/api/store/integrations/shopify/import-products/route.ts",
|
|
193
|
+
name: "Shopify Import Route",
|
|
194
|
+
checks: ["all_forbidden_defaults", "shopify_metafield_extraction"],
|
|
195
|
+
fieldsToCheck: ["cardNumber", "year", "series"],
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
path: "app/api/listings/upload-csv/route.ts",
|
|
199
|
+
name: "CSV Import Route",
|
|
200
|
+
checks: ["csv_header_aliases"],
|
|
201
|
+
fieldsToCheck: ["cardNumber", "year", "brand", "featured"],
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
path: "components/woocommerce/steps/FieldMappingStep.tsx",
|
|
205
|
+
name: "WooCommerce Field Mapping UI",
|
|
206
|
+
checks: ["field_mapping_sources"],
|
|
207
|
+
fieldsToCheck: ["cardNumber"],
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
path: "lib/woocommerce-mapping-generator.ts",
|
|
211
|
+
name: "WooCommerce Smart Mapping Generator",
|
|
212
|
+
checks: ["smart_mapping_priority"],
|
|
213
|
+
fieldsToCheck: ["cardNumber"],
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
/**
|
|
217
|
+
* Check if file content has extraction patterns for ALL critical fields
|
|
218
|
+
*/
|
|
219
|
+
function checkAllExtractionPatterns(content, filePath, fieldsToCheck) {
|
|
220
|
+
const issues = [];
|
|
221
|
+
const fileName = path_1.default.basename(filePath);
|
|
222
|
+
for (const fieldName of fieldsToCheck) {
|
|
223
|
+
const fieldConfig = CRITICAL_FIELD_PATTERNS[fieldName];
|
|
224
|
+
if (!fieldConfig)
|
|
225
|
+
continue;
|
|
226
|
+
// Check required patterns for this field
|
|
227
|
+
for (const pattern of fieldConfig.requiredPatterns) {
|
|
228
|
+
// Look for various ways the pattern might be checked
|
|
229
|
+
const patternChecks = [
|
|
230
|
+
new RegExp(`getMetaValue\\s*\\(\\s*["']${pattern}["']\\s*\\)`, "i"),
|
|
231
|
+
new RegExp(`\\.key\\s*===?\\s*["']${pattern}["']`, "i"),
|
|
232
|
+
new RegExp(`\\.key.*includes\\s*\\(\\s*["']${pattern}["']\\s*\\)`, "i"),
|
|
233
|
+
new RegExp(`["']${pattern}["']`, "i"), // Simple string presence as fallback
|
|
234
|
+
];
|
|
235
|
+
const hasPattern = patternChecks.some((check) => check.test(content));
|
|
236
|
+
if (!hasPattern) {
|
|
237
|
+
const issueType = fieldConfig.severity === "critical" ? "error" : "warning";
|
|
238
|
+
issues.push({
|
|
239
|
+
file: filePath,
|
|
240
|
+
fileName,
|
|
241
|
+
type: issueType,
|
|
242
|
+
field: fieldName,
|
|
243
|
+
message: `Missing ${fieldName} extraction pattern: "${pattern}"`,
|
|
244
|
+
details: `${fieldConfig.description}. The file does not check for "${pattern}".`,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Check advisory patterns (always warnings)
|
|
249
|
+
for (const pattern of fieldConfig.advisoryPatterns) {
|
|
250
|
+
const hasPattern = new RegExp(`["']${pattern}["']`, "i").test(content);
|
|
251
|
+
if (!hasPattern && fieldConfig.severity === "critical") {
|
|
252
|
+
issues.push({
|
|
253
|
+
file: filePath,
|
|
254
|
+
fileName,
|
|
255
|
+
type: "warning",
|
|
256
|
+
field: fieldName,
|
|
257
|
+
message: `Consider adding ${fieldName} pattern: "${pattern}"`,
|
|
258
|
+
details: `Adding "${pattern}" would improve compatibility with more data sources.`,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return issues;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Check for forbidden hardcoded default values across ALL fields
|
|
267
|
+
*/
|
|
268
|
+
function checkAllForbiddenDefaults(content, filePath, fieldsToCheck) {
|
|
269
|
+
const issues = [];
|
|
270
|
+
const fileName = path_1.default.basename(filePath);
|
|
271
|
+
for (const fieldName of fieldsToCheck) {
|
|
272
|
+
const fieldConfig = CRITICAL_FIELD_PATTERNS[fieldName];
|
|
273
|
+
if (!fieldConfig)
|
|
274
|
+
continue;
|
|
275
|
+
for (const forbidden of fieldConfig.forbiddenDefaults) {
|
|
276
|
+
if (content.includes(forbidden)) {
|
|
277
|
+
issues.push({
|
|
278
|
+
file: filePath,
|
|
279
|
+
fileName,
|
|
280
|
+
type: fieldConfig.severity === "critical" ? "error" : "warning",
|
|
281
|
+
field: fieldName,
|
|
282
|
+
message: `Hardcoded ${fieldName} default found: ${forbidden}`,
|
|
283
|
+
details: `${fieldConfig.description}. Extract from source data instead of hardcoding.`,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return issues;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Check Shopify metafield extraction covers all critical fields
|
|
292
|
+
*/
|
|
293
|
+
function checkShopifyMetafieldExtraction(content, filePath, fieldsToCheck) {
|
|
294
|
+
const issues = [];
|
|
295
|
+
const fileName = path_1.default.basename(filePath);
|
|
296
|
+
// First check: No empty cardNumber in catalog creation (legacy check)
|
|
297
|
+
const emptyCardNumberInCatalog = /findOrCreateCardCatalog\s*\(\s*\{[\s\S]*?cardNumber\s*:\s*["']["']/;
|
|
298
|
+
if (emptyCardNumberInCatalog.test(content)) {
|
|
299
|
+
issues.push({
|
|
300
|
+
file: filePath,
|
|
301
|
+
fileName,
|
|
302
|
+
type: "error",
|
|
303
|
+
field: "cardNumber",
|
|
304
|
+
message: "Shopify import uses empty cardNumber in catalog creation",
|
|
305
|
+
details: "The cardNumber should be extracted from Shopify metafields, not set to empty string.",
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
// Check for getMetafieldValue helper function
|
|
309
|
+
const hasMetafieldHelper = content.includes("getMetafieldValue");
|
|
310
|
+
if (!hasMetafieldHelper) {
|
|
311
|
+
issues.push({
|
|
312
|
+
file: filePath,
|
|
313
|
+
fileName,
|
|
314
|
+
type: "error",
|
|
315
|
+
field: "all",
|
|
316
|
+
message: "Shopify import missing metafield extraction helper",
|
|
317
|
+
details: "Should have a getMetafieldValue helper to extract card data from Shopify metafields.",
|
|
318
|
+
});
|
|
319
|
+
return issues;
|
|
320
|
+
}
|
|
321
|
+
// Check each field is being extracted
|
|
322
|
+
for (const fieldName of fieldsToCheck) {
|
|
323
|
+
const fieldConfig = CRITICAL_FIELD_PATTERNS[fieldName];
|
|
324
|
+
if (!fieldConfig)
|
|
325
|
+
continue;
|
|
326
|
+
// Check that the field patterns are being used in getMetafieldValue calls
|
|
327
|
+
let hasFieldExtraction = false;
|
|
328
|
+
for (const pattern of fieldConfig.requiredPatterns) {
|
|
329
|
+
if (content.includes(`"${pattern}"`) || content.includes(`'${pattern}'`)) {
|
|
330
|
+
hasFieldExtraction = true;
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (!hasFieldExtraction && fieldConfig.severity === "critical") {
|
|
335
|
+
issues.push({
|
|
336
|
+
file: filePath,
|
|
337
|
+
fileName,
|
|
338
|
+
type: "error",
|
|
339
|
+
field: fieldName,
|
|
340
|
+
message: `Shopify import not extracting ${fieldName} from metafields`,
|
|
341
|
+
details: `${fieldConfig.description}. Add extraction for patterns: ${fieldConfig.requiredPatterns.join(", ")}`,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return issues;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Check CSV import has header aliases for ALL critical field variations
|
|
349
|
+
*/
|
|
350
|
+
function checkCsvHeaderAliases(content, filePath, fieldsToCheck) {
|
|
351
|
+
const issues = [];
|
|
352
|
+
const fileName = path_1.default.basename(filePath);
|
|
353
|
+
// Check for HEADER_ALIASES constant
|
|
354
|
+
const hasAliasConst = content.includes("HEADER_ALIASES");
|
|
355
|
+
if (!hasAliasConst) {
|
|
356
|
+
issues.push({
|
|
357
|
+
file: filePath,
|
|
358
|
+
fileName,
|
|
359
|
+
type: "error",
|
|
360
|
+
field: "all",
|
|
361
|
+
message: "CSV import missing HEADER_ALIASES for column name normalization",
|
|
362
|
+
details: "Users may have different column names that need to be aliased to standard names.",
|
|
363
|
+
});
|
|
364
|
+
return issues;
|
|
365
|
+
}
|
|
366
|
+
// Check critical field aliases
|
|
367
|
+
const criticalAliases = {
|
|
368
|
+
cardNumber: ["card_number", "number"],
|
|
369
|
+
year: ["card_year"],
|
|
370
|
+
brand: ["manufacturer"],
|
|
371
|
+
featured: ["player", "player_name", "athlete"],
|
|
372
|
+
};
|
|
373
|
+
for (const fieldName of fieldsToCheck) {
|
|
374
|
+
const aliases = criticalAliases[fieldName];
|
|
375
|
+
if (!aliases)
|
|
376
|
+
continue;
|
|
377
|
+
for (const alias of aliases) {
|
|
378
|
+
// Check for alias mapping (e.g., "card_number": "cardnumber")
|
|
379
|
+
const hasAlias = content.toLowerCase().includes(`"${alias}"`) ||
|
|
380
|
+
content.toLowerCase().includes(`'${alias}'`);
|
|
381
|
+
if (!hasAlias) {
|
|
382
|
+
issues.push({
|
|
383
|
+
file: filePath,
|
|
384
|
+
fileName,
|
|
385
|
+
type: "warning",
|
|
386
|
+
field: fieldName,
|
|
387
|
+
message: `CSV import missing "${alias}" alias for ${fieldName}`,
|
|
388
|
+
details: `Users with a "${alias}" column header should have it mapped to ${fieldName}.`,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return issues;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Check field mapping UI has both underscore and camelCase sources for critical fields
|
|
397
|
+
*/
|
|
398
|
+
function checkFieldMappingSources(content, filePath) {
|
|
399
|
+
const issues = [];
|
|
400
|
+
const fileName = path_1.default.basename(filePath);
|
|
401
|
+
// Check cardNumber patterns
|
|
402
|
+
const hasUnderscoreCardNumber = content.includes("meta_data.card_number");
|
|
403
|
+
const hasCamelCaseCardNumber = content.includes("meta_data.cardNumber");
|
|
404
|
+
if (!hasUnderscoreCardNumber) {
|
|
405
|
+
issues.push({
|
|
406
|
+
file: filePath,
|
|
407
|
+
fileName,
|
|
408
|
+
type: "error",
|
|
409
|
+
field: "cardNumber",
|
|
410
|
+
message: "Missing meta_data.card_number in field mapping sources",
|
|
411
|
+
details: "Users need to be able to map from the underscore format (most common in WooCommerce).",
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
if (!hasCamelCaseCardNumber) {
|
|
415
|
+
issues.push({
|
|
416
|
+
file: filePath,
|
|
417
|
+
fileName,
|
|
418
|
+
type: "warning",
|
|
419
|
+
field: "cardNumber",
|
|
420
|
+
message: "Consider adding meta_data.cardNumber to field mapping sources",
|
|
421
|
+
details: "Some WooCommerce setups use camelCase for field names.",
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
// Check year patterns
|
|
425
|
+
const hasYear = content.includes("meta_data.year");
|
|
426
|
+
const hasCardYear = content.includes("meta_data.card_year");
|
|
427
|
+
if (!hasYear && !hasCardYear) {
|
|
428
|
+
issues.push({
|
|
429
|
+
file: filePath,
|
|
430
|
+
fileName,
|
|
431
|
+
type: "warning",
|
|
432
|
+
field: "year",
|
|
433
|
+
message: "Consider adding year field mapping sources",
|
|
434
|
+
details: "Year is critical for card identification. Add meta_data.year and meta_data.card_year.",
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
return issues;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Check smart mapping generator prioritizes correct formats for all fields
|
|
441
|
+
*/
|
|
442
|
+
function checkSmartMappingPriority(content, filePath) {
|
|
443
|
+
const issues = [];
|
|
444
|
+
const fileName = path_1.default.basename(filePath);
|
|
445
|
+
// Check cardNumber mapping
|
|
446
|
+
const usesUnderscoreCardNumber = /addMapping\s*\(\s*["']meta_data\.card_number["']/.test(content);
|
|
447
|
+
const usesCamelCaseCardNumber = /addMapping\s*\(\s*["']meta_data\.cardNumber["']/.test(content);
|
|
448
|
+
if (!usesUnderscoreCardNumber && usesCamelCaseCardNumber) {
|
|
449
|
+
issues.push({
|
|
450
|
+
file: filePath,
|
|
451
|
+
fileName,
|
|
452
|
+
type: "error",
|
|
453
|
+
field: "cardNumber",
|
|
454
|
+
message: "Smart mapping should use meta_data.card_number (underscore)",
|
|
455
|
+
details: "The underscore format is most common in WooCommerce. Change from cardNumber to card_number.",
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
if (!usesUnderscoreCardNumber && !usesCamelCaseCardNumber) {
|
|
459
|
+
issues.push({
|
|
460
|
+
file: filePath,
|
|
461
|
+
fileName,
|
|
462
|
+
type: "error",
|
|
463
|
+
field: "cardNumber",
|
|
464
|
+
message: "Smart mapping is missing cardNumber field mapping",
|
|
465
|
+
details: "The cardNumber field must be included in smart field mappings.",
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
// Check year mapping
|
|
469
|
+
const hasYearMapping = /addMapping\s*\(\s*["']meta_data\.year/.test(content);
|
|
470
|
+
if (!hasYearMapping) {
|
|
471
|
+
issues.push({
|
|
472
|
+
file: filePath,
|
|
473
|
+
fileName,
|
|
474
|
+
type: "warning",
|
|
475
|
+
field: "year",
|
|
476
|
+
message: "Smart mapping should include year field",
|
|
477
|
+
details: "Year is critical for card identification.",
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
// Check brand mapping
|
|
481
|
+
const hasBrandMapping = /addMapping\s*\(\s*["']meta_data\.brand/.test(content);
|
|
482
|
+
if (!hasBrandMapping) {
|
|
483
|
+
issues.push({
|
|
484
|
+
file: filePath,
|
|
485
|
+
fileName,
|
|
486
|
+
type: "warning",
|
|
487
|
+
field: "brand",
|
|
488
|
+
message: "Smart mapping should include brand field",
|
|
489
|
+
details: "Brand is critical for card identification.",
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
return issues;
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Main run function
|
|
496
|
+
*/
|
|
497
|
+
async function run() {
|
|
498
|
+
console.log((0, console_chars_1.createDivider)());
|
|
499
|
+
console.log(`${console_chars_1.emoji.search} Checking integration field coverage across ALL integration points...`);
|
|
500
|
+
console.log();
|
|
501
|
+
const allIssues = [];
|
|
502
|
+
for (const integration of INTEGRATION_FILES) {
|
|
503
|
+
if (!fs_1.default.existsSync(integration.path)) {
|
|
504
|
+
console.log(` ${console_chars_1.emoji.warning} File not found: ${integration.path}`);
|
|
505
|
+
continue;
|
|
506
|
+
}
|
|
507
|
+
const content = fs_1.default.readFileSync(integration.path, "utf-8");
|
|
508
|
+
const fieldsToCheck = integration.fieldsToCheck || ["cardNumber"];
|
|
509
|
+
console.log(` ${console_chars_1.emoji.search} Checking ${integration.name} (${fieldsToCheck.length} fields)...`);
|
|
510
|
+
for (const check of integration.checks) {
|
|
511
|
+
let issues = [];
|
|
512
|
+
switch (check) {
|
|
513
|
+
case "all_extraction_patterns":
|
|
514
|
+
issues = checkAllExtractionPatterns(content, integration.path, fieldsToCheck);
|
|
515
|
+
break;
|
|
516
|
+
case "all_forbidden_defaults":
|
|
517
|
+
issues = checkAllForbiddenDefaults(content, integration.path, fieldsToCheck);
|
|
518
|
+
break;
|
|
519
|
+
case "shopify_metafield_extraction":
|
|
520
|
+
issues = checkShopifyMetafieldExtraction(content, integration.path, fieldsToCheck);
|
|
521
|
+
break;
|
|
522
|
+
case "csv_header_aliases":
|
|
523
|
+
issues = checkCsvHeaderAliases(content, integration.path, fieldsToCheck);
|
|
524
|
+
break;
|
|
525
|
+
case "field_mapping_sources":
|
|
526
|
+
issues = checkFieldMappingSources(content, integration.path);
|
|
527
|
+
break;
|
|
528
|
+
case "smart_mapping_priority":
|
|
529
|
+
issues = checkSmartMappingPriority(content, integration.path);
|
|
530
|
+
break;
|
|
531
|
+
}
|
|
532
|
+
allIssues.push(...issues);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
console.log();
|
|
536
|
+
// Report results
|
|
537
|
+
const errors = allIssues.filter((i) => i.type === "error");
|
|
538
|
+
const warnings = allIssues.filter((i) => i.type === "warning");
|
|
539
|
+
if (allIssues.length === 0) {
|
|
540
|
+
console.log(`${console_chars_1.emoji.success} All integration field mappings have comprehensive coverage!`);
|
|
541
|
+
console.log();
|
|
542
|
+
console.log(" Verified:");
|
|
543
|
+
for (const integration of INTEGRATION_FILES) {
|
|
544
|
+
if (fs_1.default.existsSync(integration.path)) {
|
|
545
|
+
console.log(` ${console_chars_1.emoji.success} ${integration.name}`);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
console.log();
|
|
549
|
+
console.log(" Critical fields checked:");
|
|
550
|
+
for (const [fieldName, config] of Object.entries(CRITICAL_FIELD_PATTERNS)) {
|
|
551
|
+
console.log(` ${console_chars_1.emoji.success} ${fieldName} (${config.severity}): ${config.requiredPatterns.join(", ")}`);
|
|
552
|
+
}
|
|
553
|
+
process.exit(0);
|
|
554
|
+
}
|
|
555
|
+
// Group issues by field
|
|
556
|
+
const issuesByField = {};
|
|
557
|
+
for (const issue of allIssues) {
|
|
558
|
+
const field = issue.field || "general";
|
|
559
|
+
if (!issuesByField[field])
|
|
560
|
+
issuesByField[field] = [];
|
|
561
|
+
issuesByField[field].push(issue);
|
|
562
|
+
}
|
|
563
|
+
// Show errors
|
|
564
|
+
if (errors.length > 0) {
|
|
565
|
+
console.log(`${console_chars_1.emoji.error} CRITICAL: ${errors.length} error(s) will cause data loss during import!`);
|
|
566
|
+
console.log();
|
|
567
|
+
for (const issue of errors) {
|
|
568
|
+
console.log(` ${console_chars_1.emoji.error} [${issue.field || "general"}] ${issue.fileName}`);
|
|
569
|
+
console.log(` ${issue.message}`);
|
|
570
|
+
if (issue.details) {
|
|
571
|
+
console.log(` → ${issue.details}`);
|
|
572
|
+
}
|
|
573
|
+
console.log();
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
// Show warnings
|
|
577
|
+
if (warnings.length > 0) {
|
|
578
|
+
console.log(`${console_chars_1.emoji.warning} ${warnings.length} warning(s) (recommended improvements):`);
|
|
579
|
+
console.log();
|
|
580
|
+
for (const issue of warnings) {
|
|
581
|
+
console.log(` ${console_chars_1.emoji.warning} [${issue.field || "general"}] ${issue.fileName}: ${issue.message}`);
|
|
582
|
+
}
|
|
583
|
+
console.log();
|
|
584
|
+
}
|
|
585
|
+
console.log((0, console_chars_1.createDivider)());
|
|
586
|
+
console.log(`${console_chars_1.emoji.info} HOW TO FIX:`);
|
|
587
|
+
console.log(`${console_chars_1.emoji.info} 1. For extraction patterns: Add checks for all common field naming variations`);
|
|
588
|
+
console.log(`${console_chars_1.emoji.info} Example: getMetaValue("card_number") || getMetaValue("cardNumber") || getMetaValue("number")`);
|
|
589
|
+
console.log(`${console_chars_1.emoji.info} 2. For forbidden defaults: Extract from source data, don't use empty/hardcoded values`);
|
|
590
|
+
console.log(`${console_chars_1.emoji.info} 3. For all fields: Check CRITICAL_FIELD_PATTERNS for required naming patterns`);
|
|
591
|
+
console.log();
|
|
592
|
+
process.exit(errors.length > 0 ? 1 : 0);
|
|
593
|
+
}
|
|
594
|
+
// Allow direct execution
|
|
595
|
+
if (require.main === module) {
|
|
596
|
+
run().catch((error) => {
|
|
597
|
+
console.error("Preflight failed:", error);
|
|
598
|
+
process.exit(1);
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
//# sourceMappingURL=integration-field-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-field-coverage.js","sourceRoot":"","sources":["../../../src/checks/integrations/integration-field-coverage.ts"],"names":[],"mappings":"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"}
|