react-native-app-starter
Version:
A React Native Template.
250 lines • 9.47 kB
JavaScript
;
/**
* Package manager installation and management service
*/
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;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const os = __importStar(require("os"));
const shell = __importStar(require("shelljs"));
class PackageManagerService {
/**
* Checks if a package manager is installed
* @param packageManager - Package manager to check
* @returns True if package manager is installed
*/
static isInstalled(packageManager) {
console.log(`Checking if ${packageManager} is installed...`);
const checkResult = shell.exec(`${packageManager} --version`, {
silent: true,
});
if (checkResult.code === 0) {
console.log(`${packageManager} is already installed (version: ${checkResult.stdout.trim()})`);
return true;
}
return false;
}
/**
* Installs a package manager
* @param packageManager - Package manager to install
* @returns True if installation was successful
*/
static async install(packageManager) {
console.log(`${packageManager} is not installed. Installing ${packageManager}...`);
const platform = os.platform();
switch (packageManager) {
case "bun":
// Install Bun without asking permission
return this._installBun(platform);
case "yarn":
// Ask permission for Yarn
const installYarn = await this._askPermissionToInstall("Yarn");
if (!installYarn)
return false;
return this._installYarn(platform);
case "npm":
// npm should come with Node.js, if it's missing something is wrong
console.error("npm is missing. Please install Node.js from https://nodejs.org/");
return false;
default:
console.error(`Unsupported package manager: ${packageManager}`);
return false;
}
}
/**
* Ensures a package manager is available for use
* @param packageManager - Package manager to ensure
* @returns True if package manager is available
*/
static async ensureAvailable(packageManager) {
if (this.isInstalled(packageManager)) {
return true;
}
const installed = await this.install(packageManager);
if (!installed) {
console.warn(`Continuing without ${packageManager}. Some features may not work as expected.`);
}
return installed;
}
/**
* Gets the appropriate command for the package manager
* @param packageManager - Package manager
* @param action - Action to perform (install, add, remove, etc.)
* @returns Command string
*/
static getCommand(packageManager, action) {
switch (packageManager) {
case "npm":
if (action === "add")
return "npm install";
if (action === "add-dev")
return "npm install --save-dev";
if (action === "remove")
return "npm uninstall";
return `npm ${action}`;
case "yarn":
if (action === "add-dev")
return "yarn add --dev";
return `yarn ${action}`;
case "bun":
if (action === "add-dev")
return "bun add --dev";
return `bun ${action}`;
default:
return action;
}
}
/**
* Installs Bun (without asking permission)
* @param platform - Current platform
* @returns True if installation was successful
* @private
*/
static _installBun(platform) {
let installResult;
if (platform === "win32") {
console.log("Detected Windows. Installing Bun using PowerShell...");
installResult = shell.exec('powershell -c "irm bun.sh/install.ps1 | iex"', {
silent: false,
});
}
else {
console.log("Detected Unix-like system. Installing Bun using curl and bash...");
installResult = shell.exec("curl -fsSL https://bun.sh/install | bash", {
silent: false,
});
}
if (installResult.code === 0) {
console.log("Bun installed successfully!");
return (this._addToPath(platform, "bun") &&
this._verifyInstallation("bun", platform));
}
else {
console.error(`Failed to install Bun on ${platform}`);
if (platform === "win32") {
console.error("For Windows, you can also try: npm install -g bun");
}
return false;
}
}
/**
* Installs Yarn
* @param platform - Current platform
* @returns True if installation was successful
* @private
*/
static _installYarn(platform) {
console.log("Installing Yarn via npm...");
const installResult = shell.exec("npm install -g yarn", { silent: false });
if (installResult.code === 0) {
console.log("Yarn installed successfully!");
return this._verifyInstallation("yarn", platform);
}
else {
console.error("Failed to install Yarn");
return false;
}
}
/**
* Asks user permission to install a package manager
* @param packageManagerName - Display name of package manager
* @returns True if user gave permission
* @private
*/
static async _askPermissionToInstall(packageManagerName) {
console.log(`Do you want to install ${packageManagerName}?`);
try {
const cliSelect = (await Promise.resolve().then(() => __importStar(require("cli-select")))).default;
const result = await cliSelect({
values: ["Yes", "No"],
});
return result.value === "Yes";
}
catch (error) {
// Fallback if cli-select fails
return false;
}
}
/**
* Adds package manager to the current session's PATH
* @param platform - Current platform
* @param packageManager - Package manager name
* @returns True if successfully added to PATH
* @private
*/
static _addToPath(platform, packageManager) {
try {
const homeDir = os.homedir();
let packagePath;
if (platform === "win32") {
packagePath = `${homeDir}\\.${packageManager}\\bin`;
process.env.PATH = `${packagePath};${process.env.PATH}`;
}
else {
packagePath = `${homeDir}/.${packageManager}/bin`;
process.env.PATH = `${packagePath}:${process.env.PATH}`;
}
return true;
}
catch (error) {
console.error(`Error adding ${packageManager} to PATH:`, error.message);
return false;
}
}
/**
* Verifies that package manager installation was successful
* @param packageManager - Package manager to verify
* @param platform - Current platform
* @returns True if verification successful
* @private
*/
static _verifyInstallation(packageManager, platform) {
const verifyResult = shell.exec(`${packageManager} --version`, {
silent: true,
});
if (verifyResult.code === 0) {
console.log(`${packageManager} verification successful (version: ${verifyResult.stdout.trim()})`);
return true;
}
else {
console.warn(`${packageManager} was installed but verification failed. You may need to restart your terminal or reload your shell profile.`);
if (platform === "win32") {
console.warn("On Windows, you might need to restart your command prompt or PowerShell session.");
}
return false;
}
}
}
exports.default = PackageManagerService;
//# sourceMappingURL=PackageManagerService.js.map