Watch package.json and load new packages

This commit is contained in:
Pavel Djundik 2019-12-13 20:17:14 +02:00
parent 059cedcf7a
commit 7fbba14b69

View file

@ -1,5 +1,6 @@
"use strict"; "use strict";
const _ = require("lodash");
const log = require("../../log"); const log = require("../../log");
const colors = require("chalk"); const colors = require("chalk");
const path = require("path"); const path = require("path");
@ -19,6 +20,8 @@ const cache = {
outdated: undefined, outdated: undefined,
}; };
let experimentalWarningPrinted = false;
module.exports = { module.exports = {
getFiles, getFiles,
getStylesheets, getStylesheets,
@ -66,68 +69,101 @@ function getPackage(name) {
return packageMap.get(name); return packageMap.get(name);
} }
function loadPackages() { function getEnabledPackages(packageJson) {
const packageJson = path.join(Helper.getPackagesPath(), "package.json"); try {
let packages; const json = JSON.parse(fs.readFileSync(packageJson, "utf-8"));
let anyPlugins = false; return Object.keys(json.dependencies);
} catch (e) {
//
}
return [];
}
function loadPackage(packageName) {
let packageInfo;
let packageFile;
try { try {
packages = Object.keys(require(packageJson).dependencies); const packagePath = Helper.getPackageModulePath(packageName);
packageInfo = JSON.parse(fs.readFileSync(path.join(packagePath, "package.json"), "utf-8"));
if (!packageInfo.thelounge) {
throw "'thelounge' is not present in package.json";
}
packageFile = require(packagePath);
} catch (e) { } catch (e) {
packages = []; log.error(`Package ${colors.bold(packageName)} could not be loaded: ${colors.red(e)}`);
log.debug(e.stack);
return;
} }
packages.forEach((packageName) => { const version = packageInfo.version;
let packageInfo; packageInfo = packageInfo.thelounge;
let packageFile; packageInfo.packageName = packageName;
packageInfo.version = version;
try { packageMap.set(packageName, packageFile);
const packagePath = Helper.getPackageModulePath(packageName);
packageInfo = require(path.join(packagePath, "package.json")); if (packageInfo.type === "theme") {
themes.addTheme(packageName, packageInfo);
if (!packageInfo.thelounge) { if (packageInfo.files) {
throw "'thelounge' is not present in package.json"; packageInfo.files.forEach((file) => addFile(packageName, file));
}
packageFile = require(packagePath);
} catch (e) {
log.error(`Package ${colors.bold(packageName)} could not be loaded: ${colors.red(e)}`);
log.debug(e.stack);
return;
} }
}
const version = packageInfo.version; if (packageFile.onServerStart) {
packageInfo = packageInfo.thelounge; packageFile.onServerStart(packageApis(packageInfo));
packageInfo.packageName = packageName; }
packageInfo.version = version;
packageMap.set(packageName, packageFile); log.info(`Package ${colors.bold(packageName)} ${colors.green("v" + version)} loaded`);
if (packageInfo.type === "theme") { if (packageInfo.type !== "theme" && !experimentalWarningPrinted) {
themes.addTheme(packageName, packageInfo); experimentalWarningPrinted = true;
if (packageInfo.files) {
packageInfo.files.forEach((file) => addFile(packageName, file));
}
} else {
anyPlugins = true;
}
if (packageFile.onServerStart) {
packageFile.onServerStart(packageApis(packageInfo));
}
log.info(`Package ${colors.bold(packageName)} ${colors.green("v" + version)} loaded`);
});
if (anyPlugins) {
log.info( log.info(
"There are packages using the experimental plugin API. Be aware that this API is not yet stable and may change in future The Lounge releases." "There are packages using the experimental plugin API. " +
"Be aware that this API is not yet stable and may change in future The Lounge releases."
); );
} }
} }
function loadPackages() {
const packageJson = path.join(Helper.getPackagesPath(), "package.json");
const packages = getEnabledPackages(packageJson);
packages.forEach(loadPackage);
watchPackages(packageJson);
}
function watchPackages(packageJson) {
fs.watch(
packageJson,
{
persistent: false,
},
_.debounce(
() => {
const updated = getEnabledPackages(packageJson);
for (const packageName of updated) {
if (packageMap.has(packageName)) {
continue;
}
loadPackage(packageName);
}
},
1000,
{maxWait: 10000}
)
);
}
async function outdated(cacheTimeout = TIME_TO_LIVE) { async function outdated(cacheTimeout = TIME_TO_LIVE) {
if (cache.outdated !== undefined) { if (cache.outdated !== undefined) {
return cache.outdated; return cache.outdated;