@empline/preflight 1.1.1 → 1.1.3

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.
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Preflight Sync Check CLI
4
+ *
5
+ * Detects duplicate preflight IDs between the core @empline/preflight package
6
+ * and app-specific preflights to prevent running the same check twice.
7
+ *
8
+ * Usage:
9
+ * npx preflight-sync-check # Check for duplicates
10
+ * npx preflight-sync-check --verbose # Show all check IDs
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=sync-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-check.d.ts","sourceRoot":"","sources":["../../src/bin/sync-check.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
@@ -0,0 +1,209 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Preflight Sync Check CLI
5
+ *
6
+ * Detects duplicate preflight IDs between the core @empline/preflight package
7
+ * and app-specific preflights to prevent running the same check twice.
8
+ *
9
+ * Usage:
10
+ * npx preflight-sync-check # Check for duplicates
11
+ * npx preflight-sync-check --verbose # Show all check IDs
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ const fs = __importStar(require("node:fs"));
48
+ const path = __importStar(require("node:path"));
49
+ const glob_1 = require("glob");
50
+ const args = process.argv.slice(2);
51
+ const verbose = args.includes("--verbose") || args.includes("-v");
52
+ // ANSI colors
53
+ const c = {
54
+ red: "\x1b[31m",
55
+ green: "\x1b[32m",
56
+ yellow: "\x1b[33m",
57
+ cyan: "\x1b[36m",
58
+ reset: "\x1b[0m",
59
+ bold: "\x1b[1m",
60
+ dim: "\x1b[2m",
61
+ };
62
+ /**
63
+ * Extract check ID from a preflight file
64
+ * Handles both TypeScript (export const id = "...") and compiled JS (exports.id = "...")
65
+ */
66
+ function extractCheckId(filePath) {
67
+ try {
68
+ const content = fs.readFileSync(filePath, "utf-8");
69
+ // Look for TypeScript: export const id = "..."
70
+ // Or compiled JS: exports.id = "..."
71
+ const idMatch = content.match(/(?:export\s+const\s+id|exports\.id)\s*=\s*["']([^"']+)["']/);
72
+ if (!idMatch)
73
+ return null;
74
+ // Optional: extract name (both formats)
75
+ const nameMatch = content.match(/(?:export\s+const\s+name|exports\.name)\s*=\s*["']([^"']+)["']/);
76
+ return {
77
+ id: idMatch[1],
78
+ file: filePath,
79
+ name: nameMatch?.[1],
80
+ };
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ /**
87
+ * Find all core package check IDs
88
+ */
89
+ async function getCoreCheckIds() {
90
+ const checksMap = new Map();
91
+ // Find the core package checks directory
92
+ // When installed as a package, it's in node_modules/@empline/preflight/dist/checks
93
+ // When running from the package itself, it's in src/checks
94
+ const possiblePaths = [
95
+ path.join(__dirname, "..", "checks"), // dist/checks (when installed)
96
+ path.join(__dirname, "..", "..", "src", "checks"), // src/checks (when running locally)
97
+ ];
98
+ let checksDir = "";
99
+ for (const p of possiblePaths) {
100
+ if (fs.existsSync(p)) {
101
+ checksDir = p;
102
+ break;
103
+ }
104
+ }
105
+ if (!checksDir) {
106
+ console.error(`${c.red}Error: Could not find core checks directory${c.reset}`);
107
+ return checksMap;
108
+ }
109
+ // Find all .ts or .js files in checks directory
110
+ const pattern = path.join(checksDir, "**/*.{ts,js}").replace(/\\/g, "/");
111
+ const files = await (0, glob_1.glob)(pattern, {
112
+ ignore: ["**/*.d.ts", "**/*.map", "**/index.ts", "**/index.js"],
113
+ });
114
+ for (const file of files) {
115
+ const info = extractCheckId(file);
116
+ if (info) {
117
+ checksMap.set(info.id, info);
118
+ }
119
+ }
120
+ return checksMap;
121
+ }
122
+ /**
123
+ * Find all app-specific check IDs
124
+ */
125
+ async function getAppCheckIds() {
126
+ const checksMap = new Map();
127
+ // Look for common preflight directories
128
+ const possibleDirs = [
129
+ "scripts/preflights",
130
+ "preflights",
131
+ ".preflights",
132
+ ];
133
+ let preflightDir = "";
134
+ for (const dir of possibleDirs) {
135
+ if (fs.existsSync(dir)) {
136
+ preflightDir = dir;
137
+ break;
138
+ }
139
+ }
140
+ if (!preflightDir) {
141
+ return checksMap; // No app preflights, that's fine
142
+ }
143
+ const pattern = path.join(preflightDir, "**/*.ts").replace(/\\/g, "/");
144
+ const files = await (0, glob_1.glob)(pattern, {
145
+ ignore: ["**/node_modules/**"],
146
+ });
147
+ for (const file of files) {
148
+ const info = extractCheckId(file);
149
+ if (info) {
150
+ checksMap.set(info.id, info);
151
+ }
152
+ }
153
+ return checksMap;
154
+ }
155
+ async function main() {
156
+ console.log(`\n${c.cyan}${c.bold}🔄 Preflight Sync Check${c.reset}\n`);
157
+ console.log("Checking for duplicate check IDs between core package and app...\n");
158
+ const [coreChecks, appChecks] = await Promise.all([
159
+ getCoreCheckIds(),
160
+ getAppCheckIds(),
161
+ ]);
162
+ console.log(`${c.dim}Core package checks: ${coreChecks.size}${c.reset}`);
163
+ console.log(`${c.dim}App-specific checks: ${appChecks.size}${c.reset}\n`);
164
+ // Find duplicates
165
+ const duplicates = [];
166
+ for (const [id, appInfo] of appChecks) {
167
+ const coreInfo = coreChecks.get(id);
168
+ if (coreInfo) {
169
+ duplicates.push({
170
+ id,
171
+ coreFile: coreInfo.file,
172
+ appFile: appInfo.file,
173
+ });
174
+ }
175
+ }
176
+ if (duplicates.length > 0) {
177
+ console.log(`${c.red}${c.bold}⚠️ DUPLICATE CHECK IDs FOUND (${duplicates.length})${c.reset}\n`);
178
+ console.log("These checks exist in both the core package and your app:");
179
+ console.log("They will run TWICE during preflight execution.\n");
180
+ for (const dup of duplicates) {
181
+ console.log(` ${c.yellow}• ${dup.id}${c.reset}`);
182
+ console.log(` Core: ${c.dim}${path.relative(process.cwd(), dup.coreFile)}${c.reset}`);
183
+ console.log(` App: ${c.dim}${path.relative(process.cwd(), dup.appFile)}${c.reset}`);
184
+ console.log("");
185
+ }
186
+ console.log(`${c.bold}Resolution:${c.reset}`);
187
+ console.log(" 1. Remove app versions if they're identical to core");
188
+ console.log(" 2. Rename app versions with unique IDs if they have custom logic");
189
+ console.log(" 3. Run: npx preflight-drift --update after removing duplicates\n");
190
+ process.exit(1);
191
+ }
192
+ console.log(`${c.green}${c.bold}✅ No duplicate check IDs found${c.reset}\n`);
193
+ if (verbose) {
194
+ console.log(`${c.cyan}App-specific checks:${c.reset}`);
195
+ for (const [id, info] of appChecks) {
196
+ console.log(` • ${id}`);
197
+ if (info.name)
198
+ console.log(` ${c.dim}${info.name}${c.reset}`);
199
+ }
200
+ console.log("");
201
+ }
202
+ console.log(`${c.dim}Tip: Run with --verbose to see all app check IDs${c.reset}\n`);
203
+ process.exit(0);
204
+ }
205
+ main().catch((error) => {
206
+ console.error(`${c.red}Error: ${error.message}${c.reset}`);
207
+ process.exit(1);
208
+ });
209
+ //# sourceMappingURL=sync-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-check.js","sourceRoot":"","sources":["../../src/bin/sync-check.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.1",
3
+ "version": "1.1.3",
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",
@@ -14,7 +14,8 @@
14
14
  "preflight-watch": "dist/bin/watch.js",
15
15
  "preflight-drift": "dist/checks/system/preflight-drift-detector.js",
16
16
  "preflight-install-hooks": "dist/bin/install-hooks.js",
17
- "preflight-review-drift": "dist/bin/review-drift.js"
17
+ "preflight-review-drift": "dist/bin/review-drift.js",
18
+ "preflight-sync-check": "dist/bin/sync-check.js"
18
19
  },
19
20
  "scripts": {
20
21
  "build": "tsc",