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,25 +69,25 @@ function getPackage(name) {
return packageMap.get(name); return packageMap.get(name);
} }
function loadPackages() { function getEnabledPackages(packageJson) {
const packageJson = path.join(Helper.getPackagesPath(), "package.json");
let packages;
let anyPlugins = false;
try { try {
packages = Object.keys(require(packageJson).dependencies); const json = JSON.parse(fs.readFileSync(packageJson, "utf-8"));
return Object.keys(json.dependencies);
} catch (e) { } catch (e) {
packages = []; //
} }
packages.forEach((packageName) => { return [];
}
function loadPackage(packageName) {
let packageInfo; let packageInfo;
let packageFile; let packageFile;
try { try {
const packagePath = Helper.getPackageModulePath(packageName); const packagePath = Helper.getPackageModulePath(packageName);
packageInfo = require(path.join(packagePath, "package.json")); packageInfo = JSON.parse(fs.readFileSync(path.join(packagePath, "package.json"), "utf-8"));
if (!packageInfo.thelounge) { if (!packageInfo.thelounge) {
throw "'thelounge' is not present in package.json"; throw "'thelounge' is not present in package.json";
@ -110,8 +113,6 @@ function loadPackages() {
if (packageInfo.files) { if (packageInfo.files) {
packageInfo.files.forEach((file) => addFile(packageName, file)); packageInfo.files.forEach((file) => addFile(packageName, file));
} }
} else {
anyPlugins = true;
} }
if (packageFile.onServerStart) { if (packageFile.onServerStart) {
@ -119,15 +120,50 @@ function loadPackages() {
} }
log.info(`Package ${colors.bold(packageName)} ${colors.green("v" + version)} loaded`); log.info(`Package ${colors.bold(packageName)} ${colors.green("v" + version)} loaded`);
});
if (anyPlugins) { if (packageInfo.type !== "theme" && !experimentalWarningPrinted) {
experimentalWarningPrinted = true;
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;