UNPKG

fnspm

Version:

A unified command-line interface for managing packages across multiple package managers (npm, yarn, pnpm, bun, and deno) with macOS optimization for iCloud sync and automatic package manager detection.

229 lines (228 loc) 10.4 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AddToGitIgnore = exports.findPackageManagerLockFile = exports.loadConfig = void 0; exports.shouldCreateSymlink = shouldCreateSymlink; exports.createSymlink = createSymlink; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const factory_1 = require("../packages/factory"); const fnspm_config_1 = require("../config/fnspm.config"); const CONFIG_FILE_NAMES = [ 'fnspm.config.js', 'fnspm.config.mjs', 'fnspm.config.cjs', ]; const loadConfig = async () => { let config = fnspm_config_1.defaultConfig; // Găsește primul fișier de configurare valid const configFile = CONFIG_FILE_NAMES .map(name => path_1.default.join(process.cwd(), name)) .find(file => fs_1.default.existsSync(file)); if (configFile) { try { let userConfig; if (configFile.endsWith('.mjs')) { // ES Module userConfig = await Promise.resolve(`${configFile}`).then(s => __importStar(require(s))).then(m => m.default || m); } else { // CommonJS or .js try { // Try ESM first userConfig = await Promise.resolve(`${configFile}`).then(s => __importStar(require(s))).then(m => m.default || m); } catch { // If it fails, use require for CommonJS userConfig = require(configFile); } } config = MergeConfigurations(fnspm_config_1.defaultConfig, userConfig); } catch (error) { console.warn(`Could not load config from ${configFile}:`, error); } } validateConfig(config); return config; }; exports.loadConfig = loadConfig; const MergeConfigurations = (defaultConfig, userConfig) => { return { ...defaultConfig, ...userConfig, packageManager: { ...defaultConfig.packageManager, ...userConfig.packageManager }, symlink: { ...defaultConfig.symlink, ...userConfig.symlink }, debug: { ...defaultConfig.debug, ...userConfig.debug } }; }; function validateConfig(config) { if (!factory_1.VALID_PACKAGE_MANAGERS.includes(config.packageManager.default)) { throw new Error(`Invalid default package manager: ${config.packageManager.default}`); } if (['auto', 'default'].includes(config.packageManager.detection) && !factory_1.VALID_PACKAGE_MANAGERS.includes(config.packageManager.default)) { throw new Error(`Default package manager is required if detection mode is ${config.packageManager.detection}`); } if (!['auto', 'default', ...factory_1.VALID_PACKAGE_MANAGERS].includes(config.packageManager.detection)) { throw new Error(`Invalid detection mode: ${config.packageManager.detection}`); } if (config.symlink.enabled && !config.symlink.nosyncName) { throw new Error(`Invalid symlink config: nosyncName is required`); } if (config.symlink.enabled && !config.symlink.enabled) { throw new Error(`Invalid symlink config: enabled is required`); } if (config.debug.verbose && typeof config.debug.verbose !== 'boolean') { throw new Error(`Invalid debug config: verbose must be a boolean`); } if (config.debug.verbose && typeof config.debug.verbose !== 'boolean') { throw new Error(`Invalid debug config: verbose must be a boolean`); } if (config.symlink.enabled && !config.symlink.enabled) { throw new Error(`Invalid symlink config: enabled is required`); } } const findPackageManagerLockFile = async () => { const config = await (0, exports.loadConfig)(); const defaultPm = config.packageManager.default; const detection = config.packageManager.detection; const { LOCK_FILE_TO_PM_MAP } = await Promise.resolve().then(() => __importStar(require('../utils/package-managers'))); if (config.debug.verbose) { console.info(`Detection Mode: ${detection}`); console.info(`Default Package Manager: ${defaultPm}`); } if (detection === 'auto') { for (const [lockFile, pmType] of Object.entries(LOCK_FILE_TO_PM_MAP)) { if (fs_1.default.existsSync(path_1.default.join(process.cwd(), lockFile))) { console.info(`No package manager specified, using "${pmType}" based on lock file`); return pmType; } } console.info(`No lock file found, using default package manager "${defaultPm}"`); return defaultPm; } if (detection === 'default') { console.info(`Using default package manager "${defaultPm}" from config`); return defaultPm; } console.info(`Using configured package manager "${detection}" from config`); return detection; }; exports.findPackageManagerLockFile = findPackageManagerLockFile; async function shouldCreateSymlink() { const config = await (0, exports.loadConfig)(); if (config.symlink.enabled) { const nodeModulesPath = path_1.default.join(process.cwd(), 'node_modules'); const nodeModulesNoSyncPath = path_1.default.join(process.cwd(), config.symlink.nosyncName); const targetAbsolutePath = path_1.default.resolve(nodeModulesNoSyncPath); if (!fs_1.default.existsSync(nodeModulesPath)) { return false; } const stats = fs_1.default.lstatSync(nodeModulesPath); if (stats.isSymbolicLink()) { const currentTarget = fs_1.default.readlinkSync(nodeModulesPath); const currentTargetAbsolute = path_1.default.resolve(path_1.default.dirname(nodeModulesPath), currentTarget); return currentTargetAbsolute !== targetAbsolutePath; } return true; } return false; } async function createSymlink() { const config = await (0, exports.loadConfig)(); const nosyncName = config.symlink.nosyncName; return new Promise((resolve, reject) => { try { const nodeModulesPath = path_1.default.join(process.cwd(), 'node_modules'); const nodeModulesNoSyncPath = path_1.default.join(process.cwd(), nosyncName); const isWindows = process.platform === 'win32'; const symlinkType = isWindows ? 'junction' : 'dir'; const targetAbsolutePath = path_1.default.resolve(nodeModulesNoSyncPath); if (fs_1.default.existsSync(nodeModulesPath)) { const stats = fs_1.default.lstatSync(nodeModulesPath); if (stats.isSymbolicLink()) { const currentTarget = fs_1.default.readlinkSync(nodeModulesPath); const currentTargetAbsolute = path_1.default.resolve(path_1.default.dirname(nodeModulesPath), currentTarget); if (currentTargetAbsolute !== targetAbsolutePath) { fs_1.default.unlinkSync(nodeModulesPath); if (fs_1.default.existsSync(currentTargetAbsolute)) { if (fs_1.default.existsSync(nodeModulesNoSyncPath)) { fs_1.default.rmSync(nodeModulesNoSyncPath, { recursive: true, force: true }); } fs_1.default.renameSync(currentTargetAbsolute, nodeModulesNoSyncPath); } fs_1.default.symlinkSync(targetAbsolutePath, nodeModulesPath, symlinkType); } } else if (stats.isDirectory()) { if (fs_1.default.existsSync(nodeModulesNoSyncPath)) { fs_1.default.rmSync(nodeModulesNoSyncPath, { recursive: true, force: true }); } fs_1.default.renameSync(nodeModulesPath, nodeModulesNoSyncPath); fs_1.default.symlinkSync(targetAbsolutePath, nodeModulesPath, symlinkType); } } resolve(); } catch (fsError) { console.error('Error handling node_modules:', fsError); resolve(); } }); } const AddToGitIgnore = async () => { const config = await (0, exports.loadConfig)(); const gitIgnorePath = path_1.default.join(process.cwd(), '.gitignore'); const gitIgnoreContent = fs_1.default.readFileSync(gitIgnorePath, 'utf8'); const gitIgnoreContentArray = gitIgnoreContent.split('\n'); if (!gitIgnoreContentArray.some((value) => value === "node_modules")) { fs_1.default.appendFileSync(gitIgnorePath, '\n# Symlink is not a directory'); fs_1.default.appendFileSync(gitIgnorePath, '\nnode_modules'); fs_1.default.appendFileSync(gitIgnorePath, `\n${config.symlink.nosyncName}/`); } }; exports.AddToGitIgnore = AddToGitIgnore;