@forge/cli

14.1.0-next.21-experimental-554d41714.1.0-next.19-experimental-fd0ebbc
out/service/version-service.js
~out/service/version-service.jsModified
+17−13
Index: package/out/service/version-service.js
===================================================================
--- package/out/service/version-service.js
+++ package/out/service/version-service.js
@@ -79,9 +79,9 @@
     filterOutEmpty(array) {
         return array?.filter((entry) => entry !== null) || [];
     }
     getEgresses(egresses, remoteModules) {
-        const remoteModuleUrls = this.filterOutEmpty(remoteModules).map((remote) => remote?.extensionData.baseUrl);
+        const remoteModuleUrls = this.filterOutEmpty(remoteModules).map((remote) => remote?.extensionData?.baseUrl);
         const egressesWithoutRemoteModules = this.filterOutEmpty(egresses).map((entry) => {
             if (entry.type === 'FETCH_BACKEND_SIDE') {
                 return {
                     ...entry,
@@ -116,11 +116,11 @@
     getConnectedKeys(migrationKeys) {
         if (!migrationKeys) {
             return [];
         }
-        return Object.keys(migrationKeys).map((key) => ({
-            product: key,
-            key: migrationKeys[key] || ''
+        return Object.entries(migrationKeys).map(([product, key]) => ({
+            product,
+            key: key || ''
         }));
     }
     getFunctions(functionModules) {
         const isOldFunctionsExtension = (extensionData) => {
@@ -131,8 +131,11 @@
         };
         const getRuntimeName = (identifier) => (identifier || 'sandbox').replace('provided.al2', 'sandbox').replace('provided', 'sandbox');
         return this.filterOutEmpty(functionModules).map((entry) => {
             const { key, extensionData } = entry;
+            if (!extensionData) {
+                throw new Error('Unknown function extension data format');
+            }
             if (isOldFunctionsExtension(extensionData)) {
                 return {
                     key,
                     runtimeName: getRuntimeName(extensionData.runtime?.identifier),
@@ -164,17 +167,18 @@
     }
     async getAppVersionDetails(environmentKey, majorVersion) {
         const { id: appId } = await this.getAppConfig();
         const data = await this.versionDetailsClient.getVersionDetails(appId, environmentKey, majorVersion);
+        const permission = data.permissions?.[0];
         const functionModules = data.modules?.filter((mod) => mod?.extensionData?.type === manifest_1.AllModuleTypes.CoreFunction);
         const remoteModules = data.modules?.filter((mod) => mod?.extensionData?.type === manifest_1.AllModuleTypes.CoreRemote);
         const allModules = this.getModulesGroupedByTypes(data.modules);
         const appDetails = {
             requiresLicense: data.requiresLicense,
-            egresses: this.getEgresses(data.permissions?.[0].egress, remoteModules),
-            analytics: this.getAnalytics(data.permissions?.[0].egress),
-            scopes: data.permissions?.[0].scopes.map((scope) => scope.key).sort() || [],
-            policies: this.getPolicies(data.permissions?.[0].securityPolicies),
+            egresses: this.getEgresses(permission?.egress, remoteModules),
+            analytics: this.getAnalytics(permission?.egress),
+            scopes: permission?.scopes.map((scope) => scope.key).sort() || [],
+            policies: this.getPolicies(permission?.securityPolicies),
             connectKeys: this.getConnectedKeys(data.migrationKeys),
             appVersion: (0, semver_1.major)(data.appVersion),
             deploymentDateTime: data.deploymentDateTime,
             environmentType: data.environmentType,
@@ -183,10 +187,10 @@
                 .filter((type) => !['function', 'remote', 'service'].includes(type))
                 .map((type) => ({ type, items: allModules[type] })),
             remotes: this.filterOutEmpty(remoteModules).map((entry) => ({
                 key: entry.key || 'N/A',
-                baseUrl: entry.extensionData.baseUrl,
-                operations: entry.extensionData.operations || []
+                baseUrl: entry.extensionData?.baseUrl ?? 'N/A',
+                operations: entry.extensionData?.operations || []
             })),
             services: this.getServices(data.modules),
             environment: (0, cli_shared_1.environmentToOption)(environmentKey)
         };
@@ -205,14 +209,14 @@
     }
     getModulesGroupedByTypes(modules) {
         const rawModules = this.filterOutEmpty(modules)
             .filter((mod) => mod.extensionData && manifest_1.SUPPORTED_MODULES.includes(mod.extensionData.type))
-            .filter((mod) => ![manifest_1.AllModuleTypes.CoreFunction, manifest_1.AllModuleTypes.CoreRemote, manifest_1.AllModuleTypes.CoreService].includes(mod.extensionData.type))
+            .filter((mod) => ![manifest_1.AllModuleTypes.CoreFunction, manifest_1.AllModuleTypes.CoreRemote, manifest_1.AllModuleTypes.CoreService].includes(mod.extensionData?.type))
             .map((entry) => ({
             key: entry.key,
-            type: entry.extensionData.type,
+            type: entry.extensionData?.type,
             properties: {
-                ...this.removeInternalPropertiesFromObject(entry.extensionData)
+                ...this.removeInternalPropertiesFromObject(entry.extensionData ?? {})
             }
         }));
         return rawModules.reduce((acc, entry) => {
             const type = (0, manifest_1.cleanKey)(entry.type);