vscode-extension-info
Version:
Command-line tool for managing and updating Visual Studio Code extensions and retrieving information about Visual Studio Code extensions installed on the user's machine.
393 lines (360 loc) • 13.2 kB
JavaScript
const fs = require("fs");
const os = require("os");
const path = require("path");
const { execSync } = require("child_process");
const packageJson = require("./package.json");
const args = process.argv.slice(2);
const getFileSize = (filePath) => {
const stats = fs.statSync(filePath);
const fileSizeInBytes = stats.size;
const fileSizeInKB = fileSizeInBytes / 1024;
const fileSizeInMB = fileSizeInKB / 1024;
const fileSizeInGB = fileSizeInMB / 1024;
if (fileSizeInGB >= 1) {
return fileSizeInGB.toFixed(2) + " GB";
} else if (fileSizeInMB >= 1) {
return fileSizeInMB.toFixed(2) + " MB";
} else {
return fileSizeInKB.toFixed(2) + " KB";
}
};
const extensionsFolder = path.join(os.homedir(), ".vscode", "extensions");
const getExtensionInfo = (folder) => {
let extensionFolder = path.join(extensionsFolder, folder);
const packageJsonPath = path.join(extensionFolder, "package.json");
const stat = fs.statSync(extensionFolder);
if (!stat.isDirectory()) {
return null; // Skip if it's not a directory
}
try {
const packageJsonData = fs.readFileSync(packageJsonPath, "utf8");
const packageJson = JSON.parse(packageJsonData);
const displayName = packageJson.displayName;
const version = packageJson.version;
const publisher = packageJson.publisher;
const description = packageJson.description;
const installationDate = fs.statSync(extensionFolder).ctime.toDateString();
const extensionID = packageJson.publisher + "." + packageJson.name;
const marketplaceURL = `https://marketplace.visualstudio.com/items?itemName=${extensionID}`;
const size = getFileSize(extensionFolder);
const repository = packageJson.repository && packageJson.repository.url;
const keywords = packageJson.keywords && packageJson.keywords.join(", ");
const license = packageJson.license;
const dependencies = packageJson.dependencies;
const engines = packageJson.engines;
const vscodeVersion = engines && engines.vscode;
const homepage = packageJson.homepage;
const bugs = packageJson.bugs && packageJson.bugs.url;
const author = packageJson.author;
return {
displayName,
version,
publisher,
description,
installationDate,
extensionID,
marketplaceURL,
size,
repository,
keywords,
license,
dependencies,
vscodeVersion,
homepage,
bugs,
author,
};
} catch (error) {
console.error(`Error reading package.json for ${extensionFolder}:`, error);
return null;
}
};
const showExtensionInfo = (extensionInfo, commands) => {
if (!commands.includes("--name")) {
console.log("Extension Name:", extensionInfo.displayName);
}
if (commands.includes("--name")) {
console.log("Extension Name:", extensionInfo.displayName);
}
if (commands.includes("--author")) {
console.log("Author Info:", JSON.stringify(extensionInfo.author, null, 2));
}
if (commands.includes("--ext-version")) {
console.log("Extension Version:", extensionInfo.version);
}
if (commands.includes("--description")) {
console.log("Description:", extensionInfo.description);
}
if (commands.includes("--date")) {
console.log("Installation Date:", extensionInfo.installationDate);
}
if (commands.includes("--id")) {
console.log("Extension ID:", extensionInfo.extensionID);
}
if (commands.includes("--url")) {
console.log("Marketplace URL:", extensionInfo.marketplaceURL);
}
if (commands.includes("--size")) {
console.log("Size:", extensionInfo.size);
}
if (commands.includes("--repo")) {
console.log("Repository:", extensionInfo.repository);
}
if (commands.includes("--keywords")) {
console.log("Keywords:", extensionInfo.keywords);
}
if (commands.includes("--license")) {
console.log("License:", extensionInfo.license);
}
if (commands.includes("--deps")) {
console.log(
"Dependencies:",
JSON.stringify(extensionInfo.dependencies, null, 2)
);
}
if (commands.includes("--vscode-ver")) {
console.log("VS Code Version:", extensionInfo.vscodeVersion);
}
if (commands.includes("--homepage")) {
console.log("Homepage:", extensionInfo.homepage);
}
if (commands.includes("--bugs")) {
console.log("Bugs:", extensionInfo.bugs);
}
if (commands.includes("--all")) {
console.log("Extension Version:", extensionInfo.version);
console.log("Publisher:", extensionInfo.publisher);
console.log("Description:", extensionInfo.description);
console.log("Installation Date:", extensionInfo.installationDate);
console.log("Extension ID:", extensionInfo.extensionID);
console.log("Marketplace URL:", extensionInfo.marketplaceURL);
console.log("Size:", extensionInfo.size);
console.log("Repository:", extensionInfo.repository);
console.log("Keywords:", extensionInfo.keywords);
console.log("License:", extensionInfo.license);
console.log(
"Dependencies:",
JSON.stringify(extensionInfo.dependencies, null, 2)
);
console.log("VS Code Version:", extensionInfo.vscodeVersion);
console.log("Homepage:", extensionInfo.homepage);
console.log("Bugs:", extensionInfo.bugs);
console.log("Author Info:", JSON.stringify(extensionInfo.author, null, 2));
}
};
const showAllExtensionInfo = (commands) => {
fs.readdir(extensionsFolder, (err, files) => {
if (err) {
console.error("Error reading extensions folder:", err);
return;
}
files.forEach((folder, i) => {
if (folder === "extensions.json") {
return; // Skip the extensions.json folder
}
const extensionInfo = getExtensionInfo(folder);
if (extensionInfo) {
showExtensionInfo(extensionInfo, commands);
if (i < files.length - 1) {
console.log("_______________________________ \n");
}
}
});
});
};
const showTargetExtensionInfo = (extID, commands) => {
let extensionID = extID.toLowerCase();
fs.readdir(extensionsFolder, (err, files) => {
if (err) {
console.error("Error reading extensions folder:", err);
return;
}
const matchingFolders = files.filter((folder) =>
folder.startsWith(extensionID)
);
if (matchingFolders.length === 0) {
console.log(`Extension with ID "${extensionID}" not found.`);
return;
}
matchingFolders.forEach((folder) => {
const extensionInfo = getExtensionInfo(folder);
if (extensionInfo) {
showExtensionInfo(extensionInfo, commands);
}
});
});
};
const updateExtension = (extID) => {
let command1;
if (extID) {
command1 = `code --install-extension ${extID} --force`;
try {
execSync(command1, { stdio: "inherit" });
console.log(`Extension "${extID}" updated successfully.`);
} catch (error) {
console.error(`Failed to update extension "${extID}".`);
}
} else {
fs.readdir(extensionsFolder, (err, files) => {
if (err) {
console.error("Error reading extensions folder:", err);
return;
}
files.forEach((folder, i) => {
if (folder === "extensions.json") {
return; // Skip the extensions.json folder
}
const extensionInfo = getExtensionInfo(folder);
if (extensionInfo) {
command1 = `code --install-extension ${extensionInfo.extensionID} --force`;
try {
execSync(command1, { stdio: "inherit" });
console.log(
`Extension "${extensionInfo.extensionID}" updated successfully.`
);
if (i < files.length - 1) {
console.log("_______________________________ \n");
}
} catch (error) {
console.error(`Failed to update extension "${extID}".`);
}
}
});
});
}
};
// Parse the command line arguments and execute corresponding functions
if (args.length === 0) {
showAllExtensionInfo(args);
} else if (
args.length === 1 &&
!args[0].startsWith("--") &&
!args[0].startsWith("-")
) {
const extensionID = args[0];
showTargetExtensionInfo(extensionID, args.slice(1));
} else {
const validCommands = [
"--name",
"--ext-version",
"--description",
"--date",
"--id",
"--url",
"--size",
"--repo",
"--keywords",
"--license",
"--deps",
"--vscode-ver",
"--homepage",
"--bugs",
"--all",
"--help",
"--author",
"--update",
];
const commands = args.filter((arg) => validCommands.includes(arg));
const extensionIDIndex = args.findIndex(
(arg) => arg[0] !== "-" && arg[1] !== "-"
);
const extensionID = args[extensionIDIndex];
const notCommands = args.filter(
(arg) => !validCommands.includes(arg) && arg !== extensionID
);
const showVersion = () => {
console.log(`vscode-extension-info version: ${packageJson.version}`);
};
if (args.includes("--version") || args.includes("-v")) {
showVersion();
return;
} else if (commands.includes("--update")) {
if (extensionID) {
updateExtension(extensionID);
} else {
updateExtension();
}
} else if (commands.includes("--help")) {
console.log(
"\nA Node.js package to retrieve information about Visual Studio Code extensions installed on the user's machine."
);
console.log(
"\n\"You can use the shorthand command 'vs-ext-i' instead of 'vscode-extension-info' for convenience.\"\n"
);
console.log(" Usage:");
console.log(
" • vs-ext-i <extension-id> [options] Search and display information for a specific extension."
);
console.log(
" • vs-ext-i [options] Search and display information for all extensions."
);
console.log("\n Options:");
console.log(" --name Display extension names");
console.log(" --ext-version Display extension versions");
console.log(" --description Display extension descriptions");
console.log(" --date Display installation dates");
console.log(" --id Display extension IDs");
console.log(" --url Display marketplace URLs");
console.log(" --size Display extension sizes");
console.log(" --repo Display extension repositories");
console.log(" --keywords Display extension keywords");
console.log(" --license Display extension licenses");
console.log(" --deps Display extension dependencies");
console.log(" --vscode-ver Display VS Code versions for extension");
console.log(" --homepage Display extension homepages");
console.log(" --bugs Display extension bug URLs");
console.log(" --author Display extension author info");
console.log(" --all Display all available data");
console.log(
"\n --update Update extension to the latest versions"
);
console.log(
"\n --version or -v Display vscode-extension-info current version"
);
} else if (commands.length === 0 || notCommands.length) {
console.log("Invalid command.");
console.log(" Usage:");
console.log(
" • vs-ext-i <extension-id> [options] Search and display information for a specific extension."
);
console.log(
" • vs-ext-i [options] Search and display information for all extensions."
);
console.log("\n Options:");
console.log(" --name Display extension names");
console.log(" --ext-version Display extension versions");
console.log(" --description Display extension descriptions");
console.log(" --date Display installation dates");
console.log(" --id Display extension IDs");
console.log(" --url Display marketplace URLs");
console.log(" --size Display extension sizes");
console.log(" --repo Display extension repositories");
console.log(" --keywords Display extension keywords");
console.log(" --license Display extension licenses");
console.log(" --deps Display extension dependencies");
console.log(" --vscode-ver Display VS Code versions for extension");
console.log(" --homepage Display extension homepages");
console.log(" --bugs Display extension bug URLs");
console.log(" --author Display extension author info");
console.log(" --all Display all available data");
console.log(
"\n --update Update extension to the latest versions"
);
console.log(
"\n --version or -v Display vscode-extension-info current version"
);
} else if (extensionID) {
showTargetExtensionInfo(extensionID, commands);
} else if (args[0].startsWith("vs-ext-i")) {
if (args.length === 1) {
showAllExtensionInfo(args);
} else {
const extensionID = args[1];
showTargetExtensionInfo(extensionID, args.slice(2));
}
} else {
console.log("\n");
showAllExtensionInfo(commands);
}
}