"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 };