45 lines
1.6 KiB
TypeScript
45 lines
1.6 KiB
TypeScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import { dialog, app } from 'electron';
|
|
|
|
// The pnpm Force
|
|
// Watches for package-lock.json or yarn.lock and warns the user.
|
|
|
|
export function startEnforcement(projectPath: string) {
|
|
// We can use fs.watch, but strictly we might want to watch the specific directory
|
|
// where the user is working.
|
|
// For this app, maybe we watch the projects user adds?
|
|
// Or do we implement a global watcher? The PRD implies "actively monitor".
|
|
// Monitoring the entire filesystem is expensive.
|
|
// We'll assume we monitor specific "Active Projects" added to the app.
|
|
|
|
// Implementation note: This function would be called for each watched project.
|
|
|
|
const watcher = fs.watch(projectPath, (eventType, filename) => {
|
|
if (filename === 'package-lock.json' || filename === 'yarn.lock') {
|
|
const lockFile = path.join(projectPath, filename);
|
|
if (fs.existsSync(lockFile)) {
|
|
handleViolation(lockFile);
|
|
}
|
|
}
|
|
});
|
|
|
|
return watcher;
|
|
}
|
|
|
|
function handleViolation(lockFile: string) {
|
|
dialog.showMessageBox({
|
|
type: 'warning',
|
|
title: 'The pnpm Force',
|
|
message: `Illegal lockfile detected: ${path.basename(lockFile)}`,
|
|
detail: 'You must use pnpm! Do you want to convert now?',
|
|
buttons: ['Convert to pnpm', 'Delete Lockfile', 'Ignore'],
|
|
defaultId: 0
|
|
}).then(result => {
|
|
if (result.response === 0) {
|
|
// Run conversion
|
|
} else if (result.response === 1) {
|
|
fs.unlinkSync(lockFile);
|
|
}
|
|
});
|
|
}
|