UNPKG

luna-manager

Version:
189 lines (188 loc) 8.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const fs = require("fs"); const request = require("request"); const extract_zip = require("extract-zip"); exports.baseUrl = "https://raw.githubusercontent.com/XyronLabs/Luna-extensions/master/"; exports.extensionFolder = "/res/lua/extensions/"; function newProject(path, printfn) { checkForUpdates(path, printfn, true); } exports.newProject = newProject; function checkForUpdates(path, printfn, force) { printfn("Luna is checking for updates, please wait..."); let currentVersion = checkCurrentBinariesVersion(path); checkRemoteBinariesVersion((remoteVersion) => { printfn("Current version: " + currentVersion); printfn("Remote version: " + remoteVersion); if (!remoteVersion) { printfn("Error fetching the latest version!"); return; } if (!currentVersion || currentVersion < remoteVersion || force) updateBinaries(path, printfn, remoteVersion); else printfn('Luna is up to date!\n'); }); } exports.checkForUpdates = checkForUpdates; function checkCurrentBinariesVersion(path) { if (fs.existsSync(path + '/luna.json')) { return require(path + '/luna.json').version; } else { return undefined; } } exports.checkCurrentBinariesVersion = checkCurrentBinariesVersion; function checkRemoteBinariesVersion(_callback) { request.get({ url: 'https://raw.githubusercontent.com/XyronLabs/Luna/master/resources/build/vscode_version' }, (err, response, body) => { _callback(body); }); } exports.checkRemoteBinariesVersion = checkRemoteBinariesVersion; function updateBinaries(path, printfn, remoteVersion) { printfn("Installing Luna " + remoteVersion + " to this folder: " + path); printfn("Please wait until this process is finished..."); let url = 'https://github.com/XyronLabs/Luna/releases/download/' + remoteVersion + '/luna-' + remoteVersion + '_standalone_' + process.platform + '.zip'; request.get({ url: url, encoding: 'binary' }, (err, response, body) => { if (err) { printfn(err); } else { fs.writeFileSync(path + "/luna.zip", body, 'binary'); extract_zip(path + "/luna.zip", { dir: path + "" }, (err) => { if (err) { printfn("Could not update Luna to version " + remoteVersion + "\n"); } else { fs.unlinkSync(path + "/luna.zip"); printfn("Luna was successfully updated!\n"); if (fs.existsSync(path + '/luna.json')) { let l = require(path + '/luna.json'); l.version = remoteVersion; fs.writeFileSync(path + '/luna.json', JSON.stringify(l)); } else { fs.appendFileSync(path + '/luna.json', JSON.stringify({ version: remoteVersion })); } } }); } }); } exports.updateBinaries = updateBinaries; function updateExtension(path, printfn, packageName) { request.get({ url: exports.baseUrl + packageName + "/extension.json" }, (err, response, body) => { if (err) { printfn("Couldn't get extension data"); return; } let obj = JSON.parse(body); if (!obj.files) obj.files = []; obj.files.push("init.lua"); obj.files.push("extension.json"); if (obj.dependencies) { for (let d of obj.dependencies) { updateExtension(path, printfn, d); } } let directoryTree = ""; for (let currDir of packageName.split('/')) { directoryTree += currDir + "/"; if (!fs.existsSync(path + exports.extensionFolder + directoryTree)) fs.mkdirSync(path + exports.extensionFolder + directoryTree); } printfn("Installing " + obj.name + " " + obj.version); for (let f of obj.files) { request.get({ url: exports.baseUrl + packageName + "/" + f }, (err, response, body) => { if (err) { printfn("Couldn't download file: " + f); return; } fs.writeFileSync(path + exports.extensionFolder + packageName + "/" + f, body); }); } printfn("Installed " + obj.name + " " + obj.version + " successfully!"); }); } exports.updateExtension = updateExtension; function checkInstalledExtensions(path, printfn, force) { printfn("Checking for extension updates"); let extensions = checkFolderForExtensions(path); extensions.forEach(e => { let extensionData = require(getExtensionData(path, e)); request.get({ url: exports.baseUrl + e + "/extension.json" }, (err, response, body) => { let remoteData = JSON.parse(body); printfn(`Extension: ${extensionData.name}, local version = ${extensionData.version}, remote version = ${remoteData.version}`); if (extensionData.version < remoteData.version || force) { updateExtension(path, printfn, e); } }); }); } exports.checkInstalledExtensions = checkInstalledExtensions; function checkFolderForExtensions(path, folder = "", extensionList = []) { if (!fs.existsSync(path + exports.extensionFolder + folder)) return []; let folders = fs.readdirSync(path + exports.extensionFolder + folder); folders.forEach(f => { if (fs.existsSync(getExtensionData(path, folder + "/" + f))) { extensionList.push(folder + "/" + f); } else { return checkFolderForExtensions(path, folder + "/" + f, extensionList); } }); return extensionList; } exports.checkFolderForExtensions = checkFolderForExtensions; function getExtensionData(path, packageName) { return path + exports.extensionFolder + packageName + "/extension.json"; } exports.getExtensionData = getExtensionData; function removeExtension(path, printfn, selected, extensionsData, errCallback) { let packageName = selected.path; // Check if an installed extension depends on this one let ableToRemove = true; extensionsData.forEach(element => { if (element.dependencies) { element.dependencies.forEach(d => { if (d == packageName) { errCallback(`Can't remove ${selected.name} [${selected.version}] extension, ${element.name} [${element.version}] depends on this extension`); ableToRemove = false; return; } }); } }); if (ableToRemove) { for (let file of fs.readdirSync(path + exports.extensionFolder + packageName)) fs.unlinkSync(path + exports.extensionFolder + packageName + "/" + file); fs.rmdirSync(path + exports.extensionFolder + packageName); printfn("Removed extension: " + packageName); let f = packageName.split('/'); if (f.length > 2) { let rootFolder = fs.readdirSync(path + exports.extensionFolder + f[1]); if (rootFolder.length == 0) fs.rmdirSync(path + exports.extensionFolder + f[1]); } } } exports.removeExtension = removeExtension; function getRemoteAvaliableExtensions(_callback) { let extensionsData = []; request.get({ url: exports.baseUrl + 'luna_extensions.json' }, (err, res, body) => { let extensionPaths = JSON.parse(body); extensionPaths.forEach(path => { request.get({ url: exports.baseUrl + path + "/extension.json" }, (err, res, body) => { extensionsData.push(JSON.parse(body)); if (extensionsData.length == extensionPaths.length) { _callback(extensionsData); } }); }); }); } exports.getRemoteAvaliableExtensions = getRemoteAvaliableExtensions;