@empline/preflight 1.1.59 → 1.1.61
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/business/auto-approval-system-validation.d.ts +25 -0
- package/dist/checks/business/auto-approval-system-validation.d.ts.map +1 -0
- package/dist/checks/business/auto-approval-system-validation.js +458 -0
- package/dist/checks/business/auto-approval-system-validation.js.map +1 -0
- package/dist/checks/business/listing-submission-flow-validation.d.ts +21 -0
- package/dist/checks/business/listing-submission-flow-validation.d.ts.map +1 -0
- package/dist/checks/business/listing-submission-flow-validation.js +394 -0
- package/dist/checks/business/listing-submission-flow-validation.js.map +1 -0
- package/dist/checks/business/multi-user-sync-validation.d.ts +21 -0
- package/dist/checks/business/multi-user-sync-validation.d.ts.map +1 -0
- package/dist/checks/business/multi-user-sync-validation.js +383 -0
- package/dist/checks/business/multi-user-sync-validation.js.map +1 -0
- package/dist/checks/checkout/checkout-flow-validation.d.ts.map +1 -1
- package/dist/checks/checkout/checkout-flow-validation.js +2 -1
- package/dist/checks/checkout/checkout-flow-validation.js.map +1 -1
- package/dist/checks/code-hygiene/decorative-separators.d.ts.map +1 -1
- package/dist/checks/code-hygiene/decorative-separators.js +3 -0
- package/dist/checks/code-hygiene/decorative-separators.js.map +1 -1
- package/dist/checks/consolidated/ui-spacing-standards.js +59 -0
- package/dist/checks/consolidated/ui-spacing-standards.js.map +1 -1
- package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts +38 -0
- package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/catalog-image-protection-validation.js +368 -0
- package/dist/checks/data-integrity/catalog-image-protection-validation.js.map +1 -0
- package/dist/checks/data-integrity/image-url-validation.d.ts +22 -0
- package/dist/checks/data-integrity/image-url-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/image-url-validation.js +310 -0
- package/dist/checks/data-integrity/image-url-validation.js.map +1 -0
- package/dist/checks/database/enum-sync-validation.d.ts.map +1 -1
- package/dist/checks/database/enum-sync-validation.js +14 -6
- package/dist/checks/database/enum-sync-validation.js.map +1 -1
- package/dist/checks/observability/observability-validation.d.ts.map +1 -1
- package/dist/checks/observability/observability-validation.js +28 -5
- package/dist/checks/observability/observability-validation.js.map +1 -1
- package/dist/checks/performance/async-batch-concurrency.d.ts +10 -0
- package/dist/checks/performance/async-batch-concurrency.d.ts.map +1 -0
- package/dist/checks/performance/async-batch-concurrency.js +352 -0
- package/dist/checks/performance/async-batch-concurrency.js.map +1 -0
- package/dist/checks/react/clickable-cursor-styling.d.ts +25 -0
- package/dist/checks/react/clickable-cursor-styling.d.ts.map +1 -0
- package/dist/checks/react/clickable-cursor-styling.js +289 -0
- package/dist/checks/react/clickable-cursor-styling.js.map +1 -0
- package/dist/checks/react/react-patterns-validation.d.ts.map +1 -1
- package/dist/checks/react/react-patterns-validation.js +15 -2
- package/dist/checks/react/react-patterns-validation.js.map +1 -1
- package/dist/checks/security/deprecated-node-apis-validation.d.ts +31 -0
- package/dist/checks/security/deprecated-node-apis-validation.d.ts.map +1 -0
- package/dist/checks/security/deprecated-node-apis-validation.js +324 -0
- package/dist/checks/security/deprecated-node-apis-validation.js.map +1 -0
- package/dist/checks/ui/grid-section-margin.d.ts +32 -0
- package/dist/checks/ui/grid-section-margin.d.ts.map +1 -0
- package/dist/checks/ui/grid-section-margin.js +302 -0
- package/dist/checks/ui/grid-section-margin.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Grid Section Margin Preflight
|
|
5
|
+
*
|
|
6
|
+
* Detects grid containers (stat cards, KPI grids, metric grids) that lack
|
|
7
|
+
* margin-bottom spacing before subsequent content sections.
|
|
8
|
+
*
|
|
9
|
+
* PROBLEM:
|
|
10
|
+
* Dashboard layouts often have stat card grids or KPI grids that butt directly
|
|
11
|
+
* against the next section (like CardSection), causing no visual separation.
|
|
12
|
+
*
|
|
13
|
+
* PATTERNS DETECTED:
|
|
14
|
+
* - Grid containers (grid grid-cols-*) without mb-* before next sibling content
|
|
15
|
+
* - StatCardGrid, metric grids, KPI grids without margin-bottom
|
|
16
|
+
* - Box with grid layout followed by CardSection, Box, or other containers
|
|
17
|
+
*
|
|
18
|
+
* APPROVED PATTERNS:
|
|
19
|
+
* - mb-3, mb-4, mb-6 on the grid container
|
|
20
|
+
* - Parent container with gap-6 or higher (sufficient major section spacing)
|
|
21
|
+
* - Grid is the last child in its container
|
|
22
|
+
*
|
|
23
|
+
* Usage:
|
|
24
|
+
* npx preflight --name "Grid Section Margin"
|
|
25
|
+
*/
|
|
26
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
29
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
30
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
31
|
+
}
|
|
32
|
+
Object.defineProperty(o, k2, desc);
|
|
33
|
+
}) : (function(o, m, k, k2) {
|
|
34
|
+
if (k2 === undefined) k2 = k;
|
|
35
|
+
o[k2] = m[k];
|
|
36
|
+
}));
|
|
37
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
38
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
39
|
+
}) : function(o, v) {
|
|
40
|
+
o["default"] = v;
|
|
41
|
+
});
|
|
42
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
43
|
+
var ownKeys = function(o) {
|
|
44
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
45
|
+
var ar = [];
|
|
46
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
47
|
+
return ar;
|
|
48
|
+
};
|
|
49
|
+
return ownKeys(o);
|
|
50
|
+
};
|
|
51
|
+
return function (mod) {
|
|
52
|
+
if (mod && mod.__esModule) return mod;
|
|
53
|
+
var result = {};
|
|
54
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
55
|
+
__setModuleDefault(result, mod);
|
|
56
|
+
return result;
|
|
57
|
+
};
|
|
58
|
+
})();
|
|
59
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
60
|
+
exports.tags = exports.description = exports.blocking = exports.category = exports.name = exports.id = void 0;
|
|
61
|
+
exports.run = run;
|
|
62
|
+
const fs = __importStar(require("fs"));
|
|
63
|
+
const path = __importStar(require("path"));
|
|
64
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
65
|
+
const file_cache_1 = require("../../shared/file-cache");
|
|
66
|
+
const universal_progress_reporter_1 = require("../system/universal-progress-reporter");
|
|
67
|
+
// Check metadata
|
|
68
|
+
exports.id = "ui/grid-section-margin";
|
|
69
|
+
exports.name = "Grid Section Margin";
|
|
70
|
+
exports.category = "ui";
|
|
71
|
+
exports.blocking = true;
|
|
72
|
+
exports.description = "Detects grid containers (stat cards, KPIs) without margin-bottom before next content";
|
|
73
|
+
exports.tags = ["ui", "spacing", "dashboard", "grid"];
|
|
74
|
+
// Patterns that indicate a major grid container for stats/metrics/KPIs
|
|
75
|
+
// (excludes small inline grids like 2-column detail views)
|
|
76
|
+
const GRID_PATTERNS = [
|
|
77
|
+
/<StatCardGrid/, // Stat card grids are always major sections
|
|
78
|
+
/className="[^"]*grid\s+grid-cols-[34]\s[^"]*"/, // 3-4 column grids (dashboard metrics)
|
|
79
|
+
/className="[^"]*grid-cols-[34]\s[^"]*gap-6/, // Major grids with gap-6
|
|
80
|
+
/className="[^"]*md:grid-cols-[34]/, // Responsive 3-4 column grids
|
|
81
|
+
];
|
|
82
|
+
// Patterns that indicate the next sibling is a content section
|
|
83
|
+
const NEXT_SECTION_PATTERNS = [
|
|
84
|
+
/<CardSection/,
|
|
85
|
+
/<Box\s+className=/,
|
|
86
|
+
/<Card\s+className=/,
|
|
87
|
+
/<Stack\s+spacing=/,
|
|
88
|
+
/\{\/\*.*\*\/\}/, // JSX comments often precede new sections
|
|
89
|
+
];
|
|
90
|
+
// Patterns that indicate the grid already has margin-bottom
|
|
91
|
+
const HAS_MARGIN_BOTTOM = [
|
|
92
|
+
/className="[^"]*mb-[3-9]/,
|
|
93
|
+
/className="[^"]*mb-\d{2}/,
|
|
94
|
+
/style=\{[^}]*marginBottom/,
|
|
95
|
+
];
|
|
96
|
+
// Patterns that indicate sufficient parent spacing
|
|
97
|
+
const PARENT_HAS_SPACING = [
|
|
98
|
+
/className="[^"]*gap-6/,
|
|
99
|
+
/className="[^"]*gap-8/,
|
|
100
|
+
/className="[^"]*space-y-6/,
|
|
101
|
+
/className="[^"]*space-y-8/,
|
|
102
|
+
/spacing=\{6\}/,
|
|
103
|
+
/spacing=\{8\}/,
|
|
104
|
+
];
|
|
105
|
+
async function run() {
|
|
106
|
+
const reporter = (0, universal_progress_reporter_1.createUniversalProgressReporter)(exports.name);
|
|
107
|
+
const verbose = process.argv.includes("--verbose");
|
|
108
|
+
console.log(`\n${console_chars_1.emoji.search} Grid Section Margin Check\n`);
|
|
109
|
+
console.log("Detects grid containers without margin-bottom before next content section.\n");
|
|
110
|
+
console.log("This prevents stat card grids and KPIs from touching adjacent sections.\n");
|
|
111
|
+
// Focus on dashboard and admin pages where this pattern is common
|
|
112
|
+
const files = await file_cache_1.fileCache.getFiles("{app,components}/**/*.tsx", {
|
|
113
|
+
ignore: [
|
|
114
|
+
"**/node_modules/**",
|
|
115
|
+
"**/.next/**",
|
|
116
|
+
"**/dist/**",
|
|
117
|
+
"**/scripts/**",
|
|
118
|
+
"**/*.test.tsx",
|
|
119
|
+
"**/*.spec.tsx",
|
|
120
|
+
"**/stories/**",
|
|
121
|
+
],
|
|
122
|
+
});
|
|
123
|
+
const issues = [];
|
|
124
|
+
for (const file of files) {
|
|
125
|
+
const content = fs.readFileSync(file, "utf8");
|
|
126
|
+
const lines = content.split("\n");
|
|
127
|
+
// Quick check: does this file have grid patterns?
|
|
128
|
+
const hasGridPattern = GRID_PATTERNS.some((p) => p.test(content));
|
|
129
|
+
if (!hasGridPattern)
|
|
130
|
+
continue;
|
|
131
|
+
for (let i = 0; i < lines.length; i++) {
|
|
132
|
+
const line = lines[i];
|
|
133
|
+
const lineNum = i + 1;
|
|
134
|
+
// Skip comments and preflight-ignore
|
|
135
|
+
const trimmed = line.trim();
|
|
136
|
+
if (trimmed.startsWith("//") || trimmed.startsWith("/*") || trimmed.startsWith("*"))
|
|
137
|
+
continue;
|
|
138
|
+
if (line.includes("preflight-ignore"))
|
|
139
|
+
continue;
|
|
140
|
+
// Check if this line starts a grid container
|
|
141
|
+
const isGridContainer = GRID_PATTERNS.some((p) => p.test(line));
|
|
142
|
+
if (!isGridContainer)
|
|
143
|
+
continue;
|
|
144
|
+
// For multi-line components, gather all lines until the self-closing tag
|
|
145
|
+
// to check for className with margin-bottom
|
|
146
|
+
// Some components like StatCardGrid with inline stats can span 50+ lines
|
|
147
|
+
let componentLines = line;
|
|
148
|
+
// Only gather more lines if this line doesn't self-close
|
|
149
|
+
if (!line.trim().endsWith("/>") && !line.trim().endsWith(">")) {
|
|
150
|
+
for (let k = i + 1; k < Math.min(i + 80, lines.length); k++) {
|
|
151
|
+
componentLines += "\n" + lines[k];
|
|
152
|
+
// Stop when we find the self-closing tag for this component
|
|
153
|
+
// Must end with /> alone (not part of a child component)
|
|
154
|
+
const trimmedLine = lines[k].trim();
|
|
155
|
+
if (trimmedLine === "/>" || trimmedLine.endsWith('"/>'))
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Check if this grid already has margin-bottom (check entire component definition)
|
|
160
|
+
const hasMarginBottom = HAS_MARGIN_BOTTOM.some((p) => p.test(componentLines));
|
|
161
|
+
if (hasMarginBottom)
|
|
162
|
+
continue;
|
|
163
|
+
// Look ahead to find the closing tag and what comes after
|
|
164
|
+
let depth = 0;
|
|
165
|
+
let gridEndLine = -1;
|
|
166
|
+
let gridStartTag = line.match(/<(\w+)/)?.[1] || "Box";
|
|
167
|
+
// Find the end of this grid container
|
|
168
|
+
for (let j = i; j < Math.min(i + 100, lines.length); j++) {
|
|
169
|
+
const checkLine = lines[j];
|
|
170
|
+
// Count opening tags
|
|
171
|
+
const openingTags = (checkLine.match(/<[A-Z][^/>]*/g) || []).length;
|
|
172
|
+
// Count self-closing tags
|
|
173
|
+
const selfClosing = (checkLine.match(/<[A-Z][^>]*\/>/g) || []).length;
|
|
174
|
+
// Count closing tags
|
|
175
|
+
const closingTags = (checkLine.match(/<\/[A-Z][^>]*>/g) || []).length;
|
|
176
|
+
depth += openingTags - selfClosing - closingTags;
|
|
177
|
+
// Check for closing tag of the grid container
|
|
178
|
+
if (j === i && checkLine.includes("/>")) {
|
|
179
|
+
gridEndLine = j;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
if (depth <= 0 && checkLine.includes(`</${gridStartTag}>`)) {
|
|
183
|
+
gridEndLine = j;
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
if (depth <= 0 && j > i) {
|
|
187
|
+
gridEndLine = j;
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (gridEndLine === -1)
|
|
192
|
+
continue;
|
|
193
|
+
// Look at the next non-empty, non-comment line after the grid ends
|
|
194
|
+
let nextContentLine = -1;
|
|
195
|
+
for (let j = gridEndLine + 1; j < Math.min(gridEndLine + 10, lines.length); j++) {
|
|
196
|
+
const nextLine = lines[j].trim();
|
|
197
|
+
if (nextLine === "")
|
|
198
|
+
continue;
|
|
199
|
+
if (nextLine.startsWith("//") || nextLine.startsWith("/*") || nextLine.startsWith("*"))
|
|
200
|
+
continue;
|
|
201
|
+
if (nextLine.startsWith("{/*"))
|
|
202
|
+
continue; // JSX comment
|
|
203
|
+
// Found the next content line
|
|
204
|
+
nextContentLine = j;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
if (nextContentLine === -1)
|
|
208
|
+
continue;
|
|
209
|
+
const nextLine = lines[nextContentLine];
|
|
210
|
+
// Check if the next line starts a new section
|
|
211
|
+
const isNextSection = NEXT_SECTION_PATTERNS.some((p) => p.test(nextLine));
|
|
212
|
+
if (!isNextSection)
|
|
213
|
+
continue;
|
|
214
|
+
// Check if parent has sufficient gap spacing (look back up to 10 lines)
|
|
215
|
+
let parentHasSufficientSpacing = false;
|
|
216
|
+
for (let j = i - 1; j >= Math.max(0, i - 10); j--) {
|
|
217
|
+
if (PARENT_HAS_SPACING.some((p) => p.test(lines[j]))) {
|
|
218
|
+
parentHasSufficientSpacing = true;
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (parentHasSufficientSpacing)
|
|
223
|
+
continue;
|
|
224
|
+
// This is an issue - grid without margin-bottom before next section
|
|
225
|
+
const relPath = path.relative(process.cwd(), file);
|
|
226
|
+
issues.push({
|
|
227
|
+
file: relPath,
|
|
228
|
+
line: lineNum,
|
|
229
|
+
type: "error",
|
|
230
|
+
message: "Grid container lacks margin-bottom before next section",
|
|
231
|
+
context: trimmed.substring(0, 80),
|
|
232
|
+
suggestion: "Add mb-6 to the grid container className for section separation",
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Report
|
|
237
|
+
console.log((0, console_chars_1.createDivider)(60, "light"));
|
|
238
|
+
reporter.showSummary({
|
|
239
|
+
filesProcessed: files.length,
|
|
240
|
+
issuesFound: issues.length,
|
|
241
|
+
errors: issues.filter((i) => i.type === "error").length,
|
|
242
|
+
warnings: issues.filter((i) => i.type === "warning").length,
|
|
243
|
+
});
|
|
244
|
+
if (issues.length === 0) {
|
|
245
|
+
console.log(`\n${console_chars_1.emoji.success} No grid section margin issues found!\n`);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const errors = issues.filter((i) => i.type === "error");
|
|
249
|
+
const warnings = issues.filter((i) => i.type === "warning");
|
|
250
|
+
if (errors.length > 0) {
|
|
251
|
+
console.log(`\n${console_chars_1.emoji.error} ERRORS (${errors.length}):\n`);
|
|
252
|
+
if (verbose) {
|
|
253
|
+
errors.forEach((e) => {
|
|
254
|
+
console.log(` ${e.file}:${e.line}`);
|
|
255
|
+
console.log(` ${e.message}`);
|
|
256
|
+
console.log(` Context: ${e.context}...`);
|
|
257
|
+
if (e.suggestion) {
|
|
258
|
+
console.log(` ${console_chars_1.emoji.hint} ${e.suggestion}`);
|
|
259
|
+
}
|
|
260
|
+
console.log("");
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
// Show first 10 errors
|
|
265
|
+
errors.slice(0, 10).forEach((e) => {
|
|
266
|
+
console.log(` ${e.file}:${e.line} - ${e.message}`);
|
|
267
|
+
if (e.suggestion) {
|
|
268
|
+
console.log(` ${console_chars_1.emoji.hint} ${e.suggestion}`);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
if (errors.length > 10) {
|
|
272
|
+
console.log(` ... and ${errors.length - 10} more errors`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (warnings.length > 0) {
|
|
277
|
+
console.log(`\n${console_chars_1.emoji.warning} WARNINGS (${warnings.length}):\n`);
|
|
278
|
+
warnings.slice(0, 5).forEach((w) => {
|
|
279
|
+
console.log(` ${w.file}:${w.line} - ${w.message}`);
|
|
280
|
+
});
|
|
281
|
+
if (warnings.length > 5) {
|
|
282
|
+
console.log(` ... and ${warnings.length - 5} more warnings`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
console.log("\n" + (0, console_chars_1.createDivider)(60, "light"));
|
|
286
|
+
console.log(`\n${console_chars_1.emoji.chart} Summary:`);
|
|
287
|
+
console.log(` Errors: ${errors.length}`);
|
|
288
|
+
console.log(` Warnings: ${warnings.length}`);
|
|
289
|
+
if (errors.length > 0) {
|
|
290
|
+
console.log(`\n${console_chars_1.emoji.error} Grid section margin check FAILED\n`);
|
|
291
|
+
console.log(`\n${console_chars_1.emoji.hint} To fix: Add mb-6 to grid containers before CardSection or other content.\n`);
|
|
292
|
+
process.exit(1);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
console.log(`\n${console_chars_1.emoji.success} Grid section margin check passed (warnings only)\n`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// Allow direct execution
|
|
299
|
+
if (require.main === module) {
|
|
300
|
+
run().catch(console.error);
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=grid-section-margin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid-section-margin.js","sourceRoot":"","sources":["../../../src/checks/ui/grid-section-margin.ts"],"names":[],"mappings":"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"}
|