@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