73 lines
2.3 KiB
JavaScript
73 lines
2.3 KiB
JavaScript
"use strict";
|
|
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const skillsRoot = require("./skills-root");
|
|
const scanner = require("./menu-entry-scanner");
|
|
const providers = require("./menu-providers");
|
|
|
|
function isDirectory(p) {
|
|
try {
|
|
return fs.statSync(p).isDirectory();
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function expandSubmenuChildren(entries, root, opts) {
|
|
(entries || []).forEach(function (e) {
|
|
if (!e || e.type !== "submenu") return;
|
|
|
|
if (e.children && e.children.length) return;
|
|
if (!e.childrenDir) return;
|
|
|
|
let dir = e.childrenDir;
|
|
if (typeof dir !== "string" || dir.trim().length === 0) return;
|
|
dir = dir.trim();
|
|
|
|
const resolved = (dir.charAt(0) === "/") ? dir : path.join(root, dir);
|
|
if (!isDirectory(resolved)) {
|
|
if (opts && opts.log) opts.log("submenu childrenDir not a directory", e.id, resolved);
|
|
e.children = [];
|
|
return;
|
|
}
|
|
|
|
if (opts && opts.log) opts.log("submenu childrenDir scan", e.id, resolved);
|
|
e.children = scanner.scanSubmenuChildren(resolved, { log: opts && opts.log, defaultIcon: opts && opts.defaultIcon, defaultColor: opts && opts.defaultColor, defaultOrder: opts && opts.defaultOrder });
|
|
});
|
|
}
|
|
|
|
function getMenuEntries(opts) {
|
|
opts = opts || {};
|
|
const root = skillsRoot.resolveSkillsRoot(opts.skillsRoot);
|
|
const providerDir = opts.providersDir || skillsRoot.providersDirForRoot(root);
|
|
|
|
const scanned = scanner.scanAllMenuEntries(root, {
|
|
log: opts.log,
|
|
defaultIcon: opts.defaultIcon,
|
|
defaultColor: opts.defaultColor,
|
|
defaultOrder: opts.defaultOrder
|
|
});
|
|
|
|
const provided = providers.loadProviderEntries(providerDir, { log: opts.log, skillsRoot: root, providersDir: providerDir });
|
|
const merged = providers.mergeById(scanned, provided);
|
|
|
|
// Allow provider-defined submenus to be backed by an arbitrary directory.
|
|
// Example: { type: "submenu", id: "fun", childrenDir: "FunStuff" }
|
|
expandSubmenuChildren(merged, root, opts);
|
|
|
|
const dynamicIds = scanner.collectDynamicSkillIds(merged);
|
|
|
|
return {
|
|
skillsRoot: root,
|
|
providersDir: providerDir,
|
|
entries: merged,
|
|
dynamicSkillIds: dynamicIds
|
|
};
|
|
}
|
|
|
|
module.exports = {
|
|
getMenuEntries: getMenuEntries
|
|
};
|