@forge/cli

12.23.0-next.7-experimental-44b7a1213.0.0-next.11
out/command-line/controller/module-list-controller.js
+out/command-line/controller/module-list-controller.jsNew file
+75
Index: package/out/command-line/controller/module-list-controller.js
===================================================================
--- package/out/command-line/controller/module-list-controller.js
+++ package/out/command-line/controller/module-list-controller.js
@@ -0,0 +1,75 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ModuleListController = void 0;
+const cli_shared_1 = require("@forge/cli-shared");
+const module_add_controller_1 = require("./module-add-controller");
+class ModuleListController {
+    moduleView;
+    moduleService;
+    constructor(moduleView, moduleService) {
+        this.moduleView = moduleView;
+        this.moduleService = moduleService;
+    }
+    async run(options) {
+        try {
+            await this.runModuleList(options);
+        }
+        finally {
+            this.moduleService.cleanup();
+        }
+    }
+    async runModuleList(options) {
+        const products = this.resolveProducts(options);
+        const moduleMaps = await Promise.all(products.map((product) => this.moduleService.getAvailableModules(product)));
+        const modules = moduleMaps.flatMap((moduleMap) => [...moduleMap.values()]);
+        const filteredModules = this.filterModules(modules, options);
+        const sortedModules = this.sortModules(filteredModules, products);
+        if (sortedModules.length === 0) {
+            this.moduleView.info(cli_shared_1.Text.module.list.empty);
+            return;
+        }
+        if (!options.nonInteractive) {
+            const selectedModule = sortedModules.length === 1
+                ? sortedModules[0]
+                : await this.moduleView.promptForModuleSelection(cli_shared_1.Text.module.list.promptSelectModule, sortedModules);
+            this.moduleView.renderModuleDetails(await this.moduleService.getModuleShowMeta(selectedModule));
+            return;
+        }
+        this.moduleView.renderModuleList(sortedModules);
+    }
+    resolveProducts(options) {
+        const product = options.product;
+        if (!product) {
+            return [...module_add_controller_1.MODULE_PRODUCTS];
+        }
+        if (!module_add_controller_1.MODULE_PRODUCTS.includes(product)) {
+            throw new Error(cli_shared_1.Text.module.add.errorInvalidProduct(product));
+        }
+        return [product];
+    }
+    filterModules(modules, options) {
+        const prefixQuery = options.prefix?.toLowerCase();
+        return modules.filter((module) => {
+            const matchesPrefix = !prefixQuery ? true : module.moduleKey.toLowerCase().startsWith(prefixQuery);
+            const matchesUiType = !options.uiType
+                ? true
+                : module.uiFramework === options.uiType || Boolean(module.variants?.[options.uiType]);
+            return matchesPrefix && matchesUiType;
+        });
+    }
+    sortModules(modules, products) {
+        return [...modules].sort((a, b) => {
+            const productDiff = products.indexOf(a.product) - products.indexOf(b.product);
+            if (productDiff !== 0) {
+                return productDiff;
+            }
+            const nameDiff = a.displayName.localeCompare(b.displayName);
+            if (nameDiff !== 0) {
+                return nameDiff;
+            }
+            return a.moduleKey.localeCompare(b.moduleKey);
+        });
+    }
+}
+exports.ModuleListController = ModuleListController;
+//# sourceMappingURL=module-list-controller.js.map
\ No newline at end of file