UNPKG

microfox

Version:

Universal CLI tool for creating modern TypeScript packages with npm availability checking

1 lines 17.2 kB
{"version":3,"sources":["../src/commands/install.ts","../src/utils/experimental-installer.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { runExperimentalInstall } from '../utils/experimental-installer';\n\nexport const installCommand = new Command('install')\n .description('Install packages for local development.')\n .argument('[packages...]', 'Specific packages to install')\n .option('--experimental', 'Enable experimental features')\n .option('--target <name>', 'Specify the target source directory name', 'Microfox')\n .action(async (packages, options) => {\n if (options.experimental) {\n await runExperimentalInstall(packages, options.target);\n } else {\n console.log('This command is only available with the --experimental flag.');\n process.exit(1);\n }\n }); ","import fs from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\n\nconst CWD_PACKAGE_JSON = path.join(process.cwd(), 'package.json');\nconst CWD_NODE_MODULES = path.join(process.cwd(), 'node_modules');\nlet MICROFOX_NODE_MODULES: string;\n\nfunction log(message: string, isError = false, isWarning = false) {\n const timestamp = new Date().toLocaleTimeString();\n let prefix;\n\n if (isError) {\n prefix = chalk.red(`❌ [install-microfox ${timestamp}]`);\n } else if (isWarning) {\n prefix = chalk.yellow(`⚠️ [install-microfox ${timestamp}]`);\n } else {\n prefix = chalk.blue(`ℹ️ [install-microfox ${timestamp}]`);\n }\n\n console.log(`${prefix} ${message}`);\n}\n\nfunction logSuccess(message: string) {\n const timestamp = new Date().toLocaleTimeString();\n console.log(chalk.green(`✅ [install-microfox ${timestamp}] ${message}`));\n}\n\nfunction logSection(title: string) {\n console.log('\\n' + '='.repeat(60));\n console.log(` ${title}`);\n console.log('='.repeat(60));\n}\n\nfunction findSourceDir(targetDirName: string): string | null {\n let currentDir = process.cwd();\n for (let i = 0; i < 10; i++) {\n const gitDir = path.join(currentDir, '.git');\n if (fs.existsSync(gitDir)) {\n const parentDir = path.dirname(currentDir);\n const microfoxDir = path.join(parentDir, targetDirName);\n if (fs.existsSync(microfoxDir)) {\n return microfoxDir;\n }\n }\n const parent = path.dirname(currentDir);\n if (parent === currentDir) {\n break;\n }\n currentDir = parent;\n }\n return null;\n}\n\nfunction copyDirectory(src: string, dest: string): boolean {\n try {\n const normalizedSrc = path.resolve(src);\n const normalizedDest = path.resolve(dest);\n\n log(`Copying from: ${normalizedSrc}`);\n log(`Copying to: ${normalizedDest}`);\n\n if (!fs.existsSync(normalizedDest)) {\n fs.mkdirSync(normalizedDest, { recursive: true });\n }\n\n const isWindows = process.platform === 'win32';\n\n if (isWindows) {\n try {\n execSync(`robocopy \"${normalizedSrc}\" \"${normalizedDest}\" /E /NFL /NDL /NJH /NJS /nc /ns /np`, { stdio: 'pipe' });\n } catch (error: any) {\n if (error.status !== 1 && error.status !== 0) {\n throw error;\n }\n }\n } else {\n execSync(`cp -r \"${normalizedSrc}/.\" \"${normalizedDest}\"`, { stdio: 'pipe' });\n }\n\n if (fs.existsSync(normalizedDest) && fs.readdirSync(normalizedDest).length > 0) {\n log(`✅ Copied ${normalizedSrc} -> ${normalizedDest}`);\n return true;\n } else {\n log(`❌ Copy verification failed: destination is empty`);\n return false;\n }\n } catch (error: any) {\n log(`❌ Failed to copy ${src} -> ${dest}: ${error.message}`);\n return false;\n }\n}\n\nfunction updatePackageJson(packageName: string): boolean {\n try {\n log(`Updating package.json to add ${packageName} with \"*\" version...`);\n\n if (!fs.existsSync(CWD_PACKAGE_JSON)) {\n log(`Package.json file not found at: ${CWD_PACKAGE_JSON}`, true);\n return false;\n }\n\n const packageJson = JSON.parse(fs.readFileSync(CWD_PACKAGE_JSON, 'utf8'));\n\n const existingVersion = packageJson.dependencies?.[packageName] || packageJson.devDependencies?.[packageName];\n if (existingVersion && existingVersion !== '*') {\n log(`Package ${packageName} already exists with version: ${existingVersion}`, false, true);\n log(`Updating to \"*\" for local development...`, false, true);\n }\n\n if (!packageJson.dependencies) {\n packageJson.dependencies = {};\n }\n\n packageJson.dependencies[packageName] = '*';\n\n if (packageJson.devDependencies?.[packageName]) {\n delete packageJson.devDependencies[packageName];\n log(`Moved ${packageName} from devDependencies to dependencies`);\n }\n\n fs.writeFileSync(CWD_PACKAGE_JSON, JSON.stringify(packageJson, null, 2) + '\\n');\n\n logSuccess(`Added ${packageName}: \"*\" to package.json`);\n return true;\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n log(`Package.json file not found at: ${CWD_PACKAGE_JSON}`, true);\n } else if (error instanceof SyntaxError) {\n log(`Invalid JSON in package.json: ${error.message}`, true);\n } else if (error.code === 'EACCES') {\n log(`Permission denied writing to package.json`, true);\n } else {\n log(`Failed to update package.json: ${error.message}`, true);\n }\n return false;\n }\n}\n\nfunction installSpecificPackage(packageName: string) {\n logSection(`Installing Specific Package: ${packageName}`);\n\n if (!packageName || typeof packageName !== 'string' || !packageName.startsWith('@microfox/')) {\n log(`Invalid package name format: \"${packageName}\". Must start with \"@microfox/\"`, true);\n process.exit(1);\n }\n\n const packageShortName = packageName.replace('@microfox/', '');\n if (!packageShortName || packageShortName.trim() === '') {\n log(`Invalid package name: \"${packageName}\"`, true);\n process.exit(1);\n }\n\n const microfoxDir = path.join(MICROFOX_NODE_MODULES, '@microfox');\n const srcDir = path.join(microfoxDir, packageShortName);\n\n log(`Searching for package: ${packageName}`);\n log(`Source directory: ${srcDir}`);\n\n if (!fs.existsSync(microfoxDir)) {\n log(`Microfox packages directory not found at: ${microfoxDir}`, true);\n process.exit(1);\n }\n\n if (!fs.existsSync(srcDir)) {\n log(`Package \"${packageName}\" not found in source packages`, true);\n log(`Searched in: ${srcDir}`, true);\n process.exit(1);\n }\n\n if (!updatePackageJson(packageName)) {\n process.exit(1);\n }\n\n const microfoxScopeDir = path.join(CWD_NODE_MODULES, '@microfox');\n if (!fs.existsSync(microfoxScopeDir)) {\n fs.mkdirSync(microfoxScopeDir, { recursive: true });\n }\n\n const destDir = path.join(CWD_NODE_MODULES, '@microfox', packageShortName);\n\n log(`Copying package files...`);\n if (copyDirectory(srcDir, destDir)) {\n logSection(`✅ SUCCESS`);\n logSuccess(`Package ${packageName} installed for local development!`);\n log(`Package location: ${destDir}`);\n } else {\n log(`Failed to copy package files`, true);\n process.exit(1);\n }\n}\n\nfunction installAllPackages() {\n log('Installing all @microfox/* packages with \"*\" version from package.json...');\n\n const packageJson = JSON.parse(fs.readFileSync(CWD_PACKAGE_JSON, 'utf8'));\n const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies };\n\n const microfoxPackages = Object.entries(dependencies)\n .filter(([name, version]) => name.startsWith('@microfox/') && version === '*')\n .map(([name]) => name);\n\n if (microfoxPackages.length === 0) {\n log('ℹ️ No @microfox/* packages with \"*\" version found in package.json');\n return;\n }\n\n log(`Found ${microfoxPackages.length} @microfox/* packages to install:`);\n microfoxPackages.forEach(pkg => log(` - ${pkg}`));\n\n const microfoxScopeDir = path.join(CWD_NODE_MODULES, '@microfox');\n if (!fs.existsSync(microfoxScopeDir)) {\n fs.mkdirSync(microfoxScopeDir, { recursive: true });\n }\n\n let successCount = 0;\n let failureCount = 0;\n\n for (const packageName of microfoxPackages) {\n const packageShortName = packageName.replace('@microfox/', '');\n const srcDir = path.join(MICROFOX_NODE_MODULES, '@microfox', packageShortName);\n const destDir = path.join(CWD_NODE_MODULES, '@microfox', packageShortName);\n\n if (!fs.existsSync(srcDir)) {\n log(`⚠️ Package ${packageName} not found in source node_modules, skipping...`);\n failureCount++;\n continue;\n }\n\n if (copyDirectory(srcDir, destDir)) {\n successCount++;\n } else {\n failureCount++;\n }\n }\n\n log(`\\n📊 Installation Summary:`);\n log(` ✅ Successfully installed: ${successCount} packages`);\n if (failureCount > 0) {\n log(` ❌ Failed to install: ${failureCount} packages`);\n }\n}\n\nexport async function runExperimentalInstall(packages: string[], targetDirName: string) {\n try {\n logSection('Microfox Local Package Installer (Experimental)');\n log(`Started at: ${new Date().toLocaleString()}`);\n log(`Working directory: ${process.cwd()}`);\n\n const sourceDir = findSourceDir(targetDirName);\n if (!sourceDir) {\n log(`Could not find source directory '${targetDirName}' in any parent of a .git directory.`, true)\n log(`Searched up to 10 levels from ${process.cwd()}`, true)\n process.exit(1);\n }\n log(`Found source directory at: ${sourceDir}`);\n MICROFOX_NODE_MODULES = path.join(sourceDir, 'node_modules');\n\n if (!fs.existsSync(MICROFOX_NODE_MODULES)) {\n log(`Source node_modules directory not found at: ${MICROFOX_NODE_MODULES}`, true);\n log(`Please run 'npm install' or 'pnpm install' in ${sourceDir}`, true);\n process.exit(1);\n }\n\n if (!fs.existsSync(CWD_PACKAGE_JSON)) {\n log(`package.json not found in current directory: ${CWD_PACKAGE_JSON}`, true);\n process.exit(1);\n }\n\n if (packages.length > 0) {\n log(`Installing ${packages.length} specific package(s)...`);\n for (let i = 0; i < packages.length; i++) {\n const packageName = packages[i];\n log(`\\n[${i + 1}/${packages.length}] Processing: ${packageName}`);\n installSpecificPackage(packageName);\n }\n logSection('🎉 All Specified Packages Installed Successfully');\n } else {\n installAllPackages();\n }\n } catch (error: any) {\n log('', true);\n log(`Unexpected error occurred: ${error.message}`, true);\n if (error.stack) {\n log(`Stack trace: ${error.stack}`, true);\n }\n process.exit(1);\n }\n} "],"mappings":"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","names":[]}