mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-04 09:13:08 +00:00
refactor(platform): address code review feedback for node-finder
- Extract VERSION_DIR_PATTERN regex to named constant - Pass logger to findNodeViaShell for consistent debug logging - Fix buildEnhancedPath to not add trailing delimiter for empty currentPath 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,9 @@ import fs from 'fs';
|
|||||||
import path from 'path';
|
import path from 'path';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
|
|
||||||
|
/** Pattern to match version directories (e.g., "v18.17.0", "18.17.0") */
|
||||||
|
const VERSION_DIR_PATTERN = /^v?\d+/;
|
||||||
|
|
||||||
/** Result of finding Node.js executable */
|
/** Result of finding Node.js executable */
|
||||||
export interface NodeFinderResult {
|
export interface NodeFinderResult {
|
||||||
/** Path to the Node.js executable */
|
/** Path to the Node.js executable */
|
||||||
@@ -50,7 +53,7 @@ function findNodeFromVersionManager(
|
|||||||
try {
|
try {
|
||||||
const versions = fs
|
const versions = fs
|
||||||
.readdirSync(basePath)
|
.readdirSync(basePath)
|
||||||
.filter((v) => /^v?\d+/.test(v))
|
.filter((v) => VERSION_DIR_PATTERN.test(v))
|
||||||
// Semantic version sort - newest first using localeCompare with numeric option
|
// Semantic version sort - newest first using localeCompare with numeric option
|
||||||
.sort((a, b) => b.localeCompare(a, undefined, { numeric: true, sensitivity: 'base' }));
|
.sort((a, b) => b.localeCompare(a, undefined, { numeric: true, sensitivity: 'base' }));
|
||||||
|
|
||||||
@@ -219,7 +222,10 @@ function findNodeWindows(homeDir: string): NodeFinderResult | null {
|
|||||||
/**
|
/**
|
||||||
* Try to find Node.js using shell commands (which/where)
|
* Try to find Node.js using shell commands (which/where)
|
||||||
*/
|
*/
|
||||||
function findNodeViaShell(platform: NodeJS.Platform): NodeFinderResult | null {
|
function findNodeViaShell(
|
||||||
|
platform: NodeJS.Platform,
|
||||||
|
logger: (message: string) => void = () => {}
|
||||||
|
): NodeFinderResult | null {
|
||||||
try {
|
try {
|
||||||
const command = platform === 'win32' ? 'where node' : 'which node';
|
const command = platform === 'win32' ? 'where node' : 'which node';
|
||||||
const result = execSync(command, {
|
const result = execSync(command, {
|
||||||
@@ -238,6 +244,7 @@ function findNodeViaShell(platform: NodeJS.Platform): NodeFinderResult | null {
|
|||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
// Shell command failed (likely when launched from desktop without PATH)
|
// Shell command failed (likely when launched from desktop without PATH)
|
||||||
|
logger('Shell command failed to find Node.js (expected when launched from desktop)');
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@@ -293,7 +300,7 @@ export function findNodeExecutable(options: NodeFinderOptions = {}): NodeFinderR
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fallback - try shell resolution (works when launched from terminal)
|
// Fallback - try shell resolution (works when launched from terminal)
|
||||||
result = findNodeViaShell(platform);
|
result = findNodeViaShell(platform, logger);
|
||||||
if (result) {
|
if (result) {
|
||||||
logger(`Found Node.js via ${result.source} at: ${result.nodePath}`);
|
logger(`Found Node.js via ${result.source} at: ${result.nodePath}`);
|
||||||
return result;
|
return result;
|
||||||
@@ -342,5 +349,9 @@ export function buildEnhancedPath(nodePath: string, currentPath: string = ''): s
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use platform-appropriate path separator
|
// Use platform-appropriate path separator
|
||||||
|
// Handle empty currentPath without adding trailing delimiter
|
||||||
|
if (!currentPath) {
|
||||||
|
return nodeDir;
|
||||||
|
}
|
||||||
return `${nodeDir}${path.delimiter}${currentPath}`;
|
return `${nodeDir}${path.delimiter}${currentPath}`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,12 +87,12 @@ describe('node-finder', () => {
|
|||||||
expect(result).toBe(currentPath);
|
expect(result).toBe(currentPath);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle empty currentPath', () => {
|
it('should handle empty currentPath without trailing delimiter', () => {
|
||||||
const nodePath = '/opt/homebrew/bin/node';
|
const nodePath = '/opt/homebrew/bin/node';
|
||||||
|
|
||||||
const result = buildEnhancedPath(nodePath, '');
|
const result = buildEnhancedPath(nodePath, '');
|
||||||
|
|
||||||
expect(result).toBe(`/opt/homebrew/bin${delimiter}`);
|
expect(result).toBe('/opt/homebrew/bin');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle Windows-style paths', () => {
|
it('should handle Windows-style paths', () => {
|
||||||
@@ -118,7 +118,7 @@ describe('node-finder', () => {
|
|||||||
|
|
||||||
const result = buildEnhancedPath(nodePath);
|
const result = buildEnhancedPath(nodePath);
|
||||||
|
|
||||||
expect(result).toBe(`/usr/local/bin${delimiter}`);
|
expect(result).toBe('/usr/local/bin');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user