@empline/preflight 1.1.30 → 1.1.31

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.
@@ -1 +1 @@
1
- {"version":3,"file":"integration-schema-consistency.d.ts","sourceRoot":"","sources":["../../../src/checks/api/integration-schema-consistency.ts"],"names":[],"mappings":";AAkBA,eAAO,MAAM,EAAE,uCAAuC,CAAC;AACvD,eAAO,MAAM,IAAI,mCAAmC,CAAC;AACrD,eAAO,MAAM,WAAW,wDAAwD,CAAC;AACjF,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA4C,CAAC;AAC9D,eAAO,MAAM,QAAQ,UAA0B,CAAC;AA+ChD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAoG3F"}
1
+ {"version":3,"file":"integration-schema-consistency.d.ts","sourceRoot":"","sources":["../../../src/checks/api/integration-schema-consistency.ts"],"names":[],"mappings":";AAoBA,eAAO,MAAM,EAAE,uCAAuC,CAAC;AACvD,eAAO,MAAM,IAAI,mCAAmC,CAAC;AACrD,eAAO,MAAM,WAAW,wDAAwD,CAAC;AACjF,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,IAAI,UAA4C,CAAC;AAC9D,eAAO,MAAM,QAAQ,UAA0B,CAAC;AA6FhD,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA4I3F"}
@@ -14,6 +14,8 @@ exports.run = run;
14
14
  * - Field name mismatches (e.g., UI uses `wooField` but API expects `sourceField`)
15
15
  * - Feature flag mismatches (e.g., UI uses `linkProducts` but API expects `exportListings`)
16
16
  * - Missing fields in API schemas that UI depends on
17
+ * - Zod transform() calls that drop fields needed by import APIs or UI
18
+ * - Inconsistency between save endpoint schema and import endpoint schema
17
19
  *
18
20
  * This helps prevent silent data loss where UI sends fields that get stripped by validation.
19
21
  */
@@ -36,15 +38,19 @@ const INTEGRATION_CHECKS = [
36
38
  name: "WooCommerce",
37
39
  uiTypePath: "components/woocommerce/types.ts",
38
40
  apiRoutePath: "app/api/store/integrations/woocommerce/route.ts",
41
+ importRoutePath: "app/api/store/integrations/woocommerce/import/route.ts",
39
42
  fieldMappings: [
40
- { uiField: "wooField", apiField: "sourceField" },
41
- { uiField: "supercatchField", apiField: "targetField" },
43
+ { uiField: "wooField", apiField: "wooField" },
44
+ { uiField: "supercatchField", apiField: "supercatchField" },
45
+ { uiField: "required", apiField: "required" },
42
46
  { uiField: "linkProducts", apiField: "linkProducts" },
43
47
  { uiField: "importProducts", apiField: "importProducts" },
44
48
  { uiField: "syncInventory", apiField: "syncInventory" },
45
49
  { uiField: "syncPrices", apiField: "syncPrices" },
46
50
  { uiField: "syncOrders", apiField: "syncOrders" },
47
51
  ],
52
+ // These fields must be preserved in any Zod transform, not dropped
53
+ requiredPreservedFields: ["wooField", "supercatchField", "required", "id", "transform"],
48
54
  },
49
55
  {
50
56
  name: "Shopify",
@@ -57,6 +63,39 @@ const INTEGRATION_CHECKS = [
57
63
  ],
58
64
  },
59
65
  ];
66
+ /**
67
+ * Check if a Zod schema transform preserves a field
68
+ * Looks for patterns like `.transform((data) => ({ fieldName: ... }))`
69
+ */
70
+ function checkTransformPreservesField(content, fieldName) {
71
+ // Look for transform output that includes the field
72
+ // Pattern: transform((data) => ({ ... fieldName: ... }))
73
+ const transformPattern = /\.transform\s*\(\s*\([^)]*\)\s*=>\s*\(\{([\s\S]*?)\}\)\s*\)/g;
74
+ let match;
75
+ while ((match = transformPattern.exec(content)) !== null) {
76
+ const transformBody = match[1];
77
+ // Check if field is in the transform output
78
+ const fieldPattern = new RegExp(`\\b${fieldName}\\s*:`);
79
+ if (fieldPattern.test(transformBody || "")) {
80
+ return true;
81
+ }
82
+ }
83
+ // If no transform found, assume field is preserved (passthrough)
84
+ if (!content.includes(".transform(")) {
85
+ return true;
86
+ }
87
+ // Check if the field is at least accepted in the schema input
88
+ const acceptsField = new RegExp(`\\b${fieldName}\\s*:`).test(content);
89
+ return acceptsField;
90
+ }
91
+ /**
92
+ * Check if import route expects a field
93
+ */
94
+ function importRouteExpectsField(importContent, fieldName) {
95
+ // Look for fieldName in Zod schema definitions
96
+ const schemaPattern = new RegExp(`\\b${fieldName}\\s*:\\s*z\\.`);
97
+ return schemaPattern.test(importContent);
98
+ }
60
99
  async function run() {
61
100
  console.log(`\n${console_chars_1.emoji.check} INTEGRATION SCHEMA CONSISTENCY`);
62
101
  console.log((0, console_chars_1.createDivider)(65, "heavy"));
@@ -64,6 +103,7 @@ async function run() {
64
103
  for (const check of INTEGRATION_CHECKS) {
65
104
  const uiPath = path_1.default.join(process.cwd(), check.uiTypePath);
66
105
  const apiPath = path_1.default.join(process.cwd(), check.apiRoutePath);
106
+ const importPath = check.importRoutePath ? path_1.default.join(process.cwd(), check.importRoutePath) : null;
67
107
  // Check if files exist
68
108
  if (!fs_1.default.existsSync(uiPath)) {
69
109
  console.log(` Skipping ${check.name}: UI types file not found`);
@@ -75,6 +115,9 @@ async function run() {
75
115
  }
76
116
  const uiContent = fs_1.default.readFileSync(uiPath, "utf-8");
77
117
  const apiContent = fs_1.default.readFileSync(apiPath, "utf-8");
118
+ const importContent = importPath && fs_1.default.existsSync(importPath)
119
+ ? fs_1.default.readFileSync(importPath, "utf-8")
120
+ : null;
78
121
  console.log(`\n Checking ${check.name}...`);
79
122
  // Check field mappings
80
123
  for (const mapping of check.fieldMappings) {
@@ -117,6 +160,37 @@ async function run() {
117
160
  description: `UI uses 'linkProducts' but API schema uses 'exportListings' - data will be silently dropped`,
118
161
  });
119
162
  }
163
+ // Check if required fields are preserved in Zod transforms
164
+ if (check.requiredPreservedFields) {
165
+ for (const field of check.requiredPreservedFields) {
166
+ const uiDefinesField = new RegExp(`\\b${field}\\s*[:\\?]`).test(uiContent);
167
+ if (uiDefinesField && !checkTransformPreservesField(apiContent, field)) {
168
+ issues.push({
169
+ integration: check.name,
170
+ type: "field_dropped_by_transform",
171
+ uiField: field,
172
+ apiField: field,
173
+ description: `Field '${field}' is defined in UI types but may be dropped by Zod transform() in API schema`,
174
+ });
175
+ }
176
+ }
177
+ }
178
+ // Check consistency between save endpoint and import endpoint
179
+ if (importContent && check.requiredPreservedFields) {
180
+ for (const field of check.requiredPreservedFields) {
181
+ const importExpects = importRouteExpectsField(importContent, field);
182
+ const apiPreserves = checkTransformPreservesField(apiContent, field);
183
+ if (importExpects && !apiPreserves) {
184
+ issues.push({
185
+ integration: check.name,
186
+ type: "import_api_mismatch",
187
+ uiField: field,
188
+ apiField: field,
189
+ description: `Import API expects '${field}' but save endpoint may drop it - data saved won't work when imported`,
190
+ });
191
+ }
192
+ }
193
+ }
120
194
  }
121
195
  // Summary
122
196
  console.log(`\n${console_chars_1.emoji.chart} Summary:`);
@@ -136,8 +210,9 @@ async function run() {
136
210
  }
137
211
  console.log(`\n${console_chars_1.emoji.info} To fix schema mismatches:`);
138
212
  console.log(` 1. Ensure API schema accepts the field names UI sends`);
139
- console.log(` 2. Use Zod transform() to normalize field names if needed`);
140
- console.log(` 3. Update UI types to match API expectations`);
213
+ console.log(` 2. When using Zod transform(), preserve ALL fields needed by UI and import APIs`);
214
+ console.log(` 3. Check that save endpoint schema output matches import endpoint schema input`);
215
+ console.log(` 4. Update UI types to match API expectations`);
141
216
  console.log(`\n${console_chars_1.emoji.error} INTEGRATION SCHEMA CONSISTENCY FAILED`);
142
217
  return { success: false, errors: issues.length, warnings: 0 };
143
218
  }
@@ -1 +1 @@
1
- {"version":3,"file":"integration-schema-consistency.js","sourceRoot":"","sources":["../../../src/checks/api/integration-schema-consistency.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integration-schema-consistency.js","sourceRoot":"","sources":["../../../src/checks/api/integration-schema-consistency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ export declare const id = "ui/consistent-section-spacing";
3
+ export declare const name = "Consistent Section Spacing";
4
+ export declare const description = "Detects excessive margin/spacing values between UI sections";
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=consistent-section-spacing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consistent-section-spacing.d.ts","sourceRoot":"","sources":["../../../src/checks/ui/consistent-section-spacing.ts"],"names":[],"mappings":";AAmCA,eAAO,MAAM,EAAE,kCAAkC,CAAC;AAClD,eAAO,MAAM,IAAI,+BAA+B,CAAC;AACjD,eAAO,MAAM,WAAW,gEAAgE,CAAC;AACzF,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,IAAI,UAAqD,CAAC;AAqHvE,wBAAsB,GAAG,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAmH3F"}
@@ -0,0 +1,246 @@
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
+ * Consistent Section Spacing Preflight
11
+ *
12
+ * Detects excessive margin/spacing values between UI sections that can cause
13
+ * visual gaps. This enforces consistent spacing standards across the codebase.
14
+ *
15
+ * Common problematic patterns:
16
+ * ```tsx
17
+ * <Card className="mb-6"> // Too large - should be mb-3 or mb-4
18
+ * <Tabs>...</Tabs>
19
+ * </Card>
20
+ * <CardSection>...</CardSection>
21
+ * ```
22
+ *
23
+ * Correct pattern:
24
+ * ```tsx
25
+ * <Card className="mb-3"> // Consistent with design system
26
+ * <Tabs>...</Tabs>
27
+ * </Card>
28
+ * <CardSection>...</CardSection>
29
+ * ```
30
+ *
31
+ * Rules:
32
+ * - Tab navigation containers should use mb-3 or mb-4 max
33
+ * - Cards followed by CardSection should use mb-3 or smaller
34
+ * - space-y-* containers should use space-y-3 or space-y-4 max
35
+ */
36
+ const fs_1 = __importDefault(require("fs"));
37
+ const path_1 = __importDefault(require("path"));
38
+ const glob_1 = require("glob");
39
+ const console_chars_1 = require("../../utils/console-chars");
40
+ // METADATA - Required for plugin loader discovery
41
+ exports.id = "ui/consistent-section-spacing";
42
+ exports.name = "Consistent Section Spacing";
43
+ exports.description = "Detects excessive margin/spacing values between UI sections";
44
+ exports.category = "ui";
45
+ exports.blocking = false; // Warning level - requires review
46
+ exports.tags = ["ui", "spacing", "tailwind", "layout", "margins"];
47
+ /**
48
+ * File patterns to check
49
+ */
50
+ const FILE_PATTERNS = [
51
+ "app/**/*.tsx",
52
+ "components/**/*.tsx",
53
+ ];
54
+ /**
55
+ * Files/directories to exclude
56
+ */
57
+ const EXCLUDE_PATTERNS = [
58
+ "node_modules/**",
59
+ "**/*.test.tsx",
60
+ "**/*.spec.tsx",
61
+ "**/*.stories.tsx",
62
+ ".storybook/**",
63
+ ];
64
+ /**
65
+ * Patterns that indicate excessive spacing
66
+ * [pattern, description, suggestion, context-check]
67
+ */
68
+ const EXCESSIVE_SPACING_PATTERNS = [
69
+ {
70
+ // Card with mb-6 or larger followed by content
71
+ pattern: /<Card\s+className="[^"]*\bmb-[6-9]\b[^"]*"/g,
72
+ description: "Card with mb-6 or larger margin - may cause excessive gap",
73
+ suggestion: "Consider using mb-3 or mb-4 for tighter section spacing",
74
+ contextCheck: (content, position) => {
75
+ // Check if this Card contains Tabs (common pattern)
76
+ const after = content.substring(position, Math.min(content.length, position + 300));
77
+ return /<Tabs\b/.test(after);
78
+ },
79
+ },
80
+ {
81
+ // Box/div with mb-6 or larger
82
+ pattern: /<(?:Box|div)\s+className="[^"]*\bmb-[6-9]\b[^"]*">/g,
83
+ description: "Container with mb-6 or larger margin",
84
+ suggestion: "Consider using mb-3 or mb-4 for consistent section spacing",
85
+ },
86
+ {
87
+ // space-y-6 or larger on admin pages
88
+ pattern: /className="[^"]*\bspace-y-[6-9]\b[^"]*"/g,
89
+ description: "Container with space-y-6 or larger - may cause gaps between children",
90
+ suggestion: "Consider using space-y-3 or space-y-4 for tighter layout",
91
+ contextCheck: (content, _position) => {
92
+ // Only flag if it's in an admin page or component
93
+ return /\/admin\//.test(content) || /Admin/.test(content);
94
+ },
95
+ },
96
+ {
97
+ // mb-10 or larger (almost always too much)
98
+ pattern: /<[A-Z][a-zA-Z]*\s+className="[^"]*\bmb-(?:10|11|12|14|16|20)\b[^"]*"/g,
99
+ description: "Component with very large bottom margin (mb-10+)",
100
+ suggestion: "Large margins are usually a sign of layout issues - consider restructuring",
101
+ },
102
+ {
103
+ // gap-6 or larger in flex/grid containers
104
+ pattern: /className="[^"]*\b(?:flex|grid)[^"]*\bgap-[6-9]\b[^"]*"/g,
105
+ description: "Flex/grid container with gap-6 or larger",
106
+ suggestion: "Consider using gap-3 or gap-4 for tighter element spacing",
107
+ },
108
+ ];
109
+ /**
110
+ * Patterns that indicate this is NOT a spacing issue
111
+ */
112
+ const FALSE_POSITIVE_PATTERNS = [
113
+ // Page-level wrappers (spacing might be intentional)
114
+ /PageLayout|Layout>/,
115
+ // Main content areas with intentional large spacing
116
+ /main\s+className/,
117
+ // Full page containers
118
+ /className="[^"]*min-h-screen[^"]*"/,
119
+ // Modal/dialog content (often needs more spacing)
120
+ /Modal|Dialog|Sheet/,
121
+ // Hero sections (intentional large spacing)
122
+ /Hero|hero/,
123
+ // Footer areas
124
+ /footer|Footer/,
125
+ ];
126
+ /**
127
+ * Extract line number from content and position
128
+ */
129
+ function getLineNumber(content, position) {
130
+ return content.substring(0, position).split("\n").length;
131
+ }
132
+ /**
133
+ * Get surrounding code context
134
+ */
135
+ function getCodeContext(content, position, lines = 2) {
136
+ const allLines = content.split("\n");
137
+ const lineNum = getLineNumber(content, position);
138
+ const start = Math.max(0, lineNum - 1);
139
+ const end = Math.min(allLines.length, lineNum + lines);
140
+ return allLines.slice(start, end).join("\n").trim();
141
+ }
142
+ async function run() {
143
+ console.log(`\n${console_chars_1.emoji.ruler} CONSISTENT SECTION SPACING CHECK`);
144
+ console.log((0, console_chars_1.createDivider)(65, "heavy"));
145
+ const issues = [];
146
+ // Find all TSX files
147
+ const allFiles = [];
148
+ for (const pattern of FILE_PATTERNS) {
149
+ const matches = await (0, glob_1.glob)(pattern, {
150
+ cwd: process.cwd(),
151
+ ignore: EXCLUDE_PATTERNS,
152
+ });
153
+ allFiles.push(...matches);
154
+ }
155
+ const uniqueFiles = [...new Set(allFiles)];
156
+ console.log(`\n${console_chars_1.emoji.search} Scanning ${uniqueFiles.length} TSX files...`);
157
+ for (const relativePath of uniqueFiles) {
158
+ const filePath = path_1.default.join(process.cwd(), relativePath);
159
+ if (!fs_1.default.existsSync(filePath))
160
+ continue;
161
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
162
+ // Check each excessive spacing pattern
163
+ for (const { pattern, description, suggestion, contextCheck } of EXCESSIVE_SPACING_PATTERNS) {
164
+ let match;
165
+ // Reset regex lastIndex
166
+ pattern.lastIndex = 0;
167
+ while ((match = pattern.exec(content)) !== null) {
168
+ const position = match.index;
169
+ const lineNum = getLineNumber(content, position);
170
+ // Check for preflight-ignore comment
171
+ const nearbyContent = content.substring(Math.max(0, position - 150), position + 50);
172
+ if (/preflight-ignore/.test(nearbyContent)) {
173
+ continue;
174
+ }
175
+ // Check for false positive patterns
176
+ const contextArea = content.substring(Math.max(0, position - 200), Math.min(content.length, position + 200));
177
+ const isFalsePositive = FALSE_POSITIVE_PATTERNS.some((fp) => fp.test(contextArea));
178
+ if (isFalsePositive) {
179
+ continue;
180
+ }
181
+ // Check context-specific conditions
182
+ if (contextCheck && !contextCheck(content, position)) {
183
+ continue;
184
+ }
185
+ issues.push({
186
+ file: relativePath,
187
+ line: lineNum,
188
+ description,
189
+ code: getCodeContext(content, position),
190
+ suggestion,
191
+ severity: "warning",
192
+ });
193
+ }
194
+ }
195
+ }
196
+ // Summary
197
+ console.log(`\n${console_chars_1.emoji.chart} Summary:`);
198
+ console.log(` Files scanned: ${uniqueFiles.length}`);
199
+ console.log(` Spacing issues found: ${issues.length}`);
200
+ if (issues.length === 0) {
201
+ console.log(`\n${console_chars_1.emoji.success} CONSISTENT SECTION SPACING CHECK PASSED`);
202
+ console.log(`\nNo excessive spacing issues detected.`);
203
+ return { success: true, errors: 0, warnings: 0 };
204
+ }
205
+ // Group issues by file
206
+ const issuesByFile = new Map();
207
+ for (const issue of issues) {
208
+ const fileIssues = issuesByFile.get(issue.file) || [];
209
+ fileIssues.push(issue);
210
+ issuesByFile.set(issue.file, fileIssues);
211
+ }
212
+ console.log(`\n${console_chars_1.emoji.warning} Spacing issues found:`);
213
+ for (const [file, fileIssues] of issuesByFile) {
214
+ console.log(`\n ${file}:`);
215
+ for (const issue of fileIssues) {
216
+ console.log(` Line ${issue.line}: ${issue.description}`);
217
+ console.log(` Suggestion: ${issue.suggestion}`);
218
+ console.log(` ${"-".repeat(50)}`);
219
+ const indentedCode = issue.code
220
+ .split("\n")
221
+ .map((line) => ` ${line}`)
222
+ .join("\n");
223
+ console.log(indentedCode);
224
+ }
225
+ }
226
+ console.log(`\n${console_chars_1.emoji.info} Spacing guidelines:`);
227
+ console.log(` - Tab navigation containers: use mb-3 or mb-4`);
228
+ console.log(` - Between Card and CardSection: use mb-3`);
229
+ console.log(` - Parent containers: use space-y-3 or space-y-4`);
230
+ console.log(` - Flex/grid gaps: use gap-3 or gap-4`);
231
+ console.log(` - Add /* preflight-ignore */ comment if large spacing is intentional`);
232
+ console.log(`\n${console_chars_1.emoji.warning} CONSISTENT SECTION SPACING CHECK COMPLETED WITH WARNINGS`);
233
+ return { success: true, errors: 0, warnings: issues.length }; // Non-blocking - requires review
234
+ }
235
+ // Allow direct execution
236
+ if (require.main === module) {
237
+ run()
238
+ .then((result) => {
239
+ process.exit(result.success ? 0 : 1);
240
+ })
241
+ .catch((err) => {
242
+ console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
243
+ process.exit(1);
244
+ });
245
+ }
246
+ //# sourceMappingURL=consistent-section-spacing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consistent-section-spacing.js","sourceRoot":"","sources":["../../../src/checks/ui/consistent-section-spacing.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empline/preflight",
3
- "version": "1.1.30",
3
+ "version": "1.1.31",
4
4
  "description": "Distributable preflight validation system with app-specific plugin support",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",