npm package diff

Package: @forge/cli

Versions: 10.13.4 - 10.13.5-next.0-experimental-4d5d98e

File: package/out/service/version-service.js

Index: package/out/service/version-service.js
===================================================================
--- package/out/service/version-service.js
+++ package/out/service/version-service.js
@@ -0,0 +1,136 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.VersionService = void 0;
+const cli_shared_1 = require("@forge/cli-shared");
+const manifest_1 = require("@forge/manifest");
+const arn_1 = require("@sandfox/arn");
+class VersionService {
+    getAppConfig;
+    versionDetailsClient;
+    constructor(getAppConfig, versionDetailsClient) {
+        this.getAppConfig = getAppConfig;
+        this.versionDetailsClient = versionDetailsClient;
+    }
+    getMajorVersion(version) {
+        return parseInt(version.split('.')[0]);
+    }
+    async getAppVersionDetails(environmentKey, majorVersion) {
+        const { id: appId } = await this.getAppConfig();
+        const data = await this.versionDetailsClient.getVersionDetails(appId, environmentKey, majorVersion);
+        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);
+        return {
+            requiresLicense: data.requiresLicense,
+            egresses: data.permissions?.[0].egress
+                ?.filter((entry) => entry !== undefined && entry !== null)
+                .filter((entry) => {
+                if (entry.type === 'FETCH_BACKEND_SIDE') {
+                    entry.addresses = entry.addresses?.filter((address) => !remoteModules?.map((remote) => remote?.extensionData.baseUrl).includes(address));
+                }
+                return entry;
+            })
+                .filter((entry) => entry?.addresses?.length !== 0)
+                .map((entry) => ({
+                type: this.getTypeFromPermissionType(entry?.type),
+                addresses: entry.addresses
+            })) || [],
+            scopes: data.permissions?.[0].scopes.map((scope) => scope.key).sort() || [],
+            policies: data.permissions?.[0].securityPolicies
+                ?.filter((entry) => entry.type !== undefined && entry.type !== null)
+                .map((entry) => ({
+                type: this.getTypeFromPermissionType(entry?.type),
+                policies: entry.policies
+            })) || [],
+            connectKeys: data.migrationKeys
+                ? Object.keys(data.migrationKeys).map((key) => ({
+                    product: key,
+                    key: data.migrationKeys[key]
+                }))
+                : undefined,
+            appVersion: this.getMajorVersion(data.appVersion),
+            deploymentDateTime: data.deploymentDateTime,
+            environmentType: data.environmentType,
+            functions: functionModules?.map((entry) => ({
+                key: entry?.key || 'N/A',
+                runtimeName: (entry?.extensionData.functions?.[Object.keys(entry?.extensionData.functions || {})[0]]?.runtime
+                    ?.identifier ||
+                    entry?.extensionData.runtime?.identifier ||
+                    'sandbox')
+                    .replace('provided.al2', 'sandbox')
+                    .replace('provided', 'sandbox'),
+                regions: entry?.extensionData.functions
+                    ? Object.keys(entry?.extensionData.functions)
+                    : [(0, arn_1.parse)(entry?.extensionData.functionName).region],
+                handler: entry?.extensionData.handler
+            })) || [],
+            modules: Object.keys(allModules)
+                .filter((type) => !['function', 'remote'].includes(type))
+                .map((type) => ({ type, items: allModules[type] })) || [],
+            remotes: remoteModules?.map((entry) => ({
+                key: entry?.key || 'N/A',
+                baseUrl: entry?.extensionData.baseUrl,
+                operations: entry?.extensionData.operations || []
+            })) || []
+        };
+    }
+    getTypeFromPermissionType(permissionType) {
+        switch (permissionType) {
+            case cli_shared_1.AppNetworkPermissionType.FetchBackendSide:
+                return 'fetch.backend';
+            case cli_shared_1.AppNetworkPermissionType.FetchClientSide:
+                return 'fetch.client';
+            default:
+                return permissionType?.toLowerCase().replaceAll('_', '.');
+        }
+    }
+    getModulesGroupedByTypes(modules) {
+        const rawModules = modules
+            ?.filter((mod) => manifest_1.SUPPORTED_MODULES.includes(mod?.extensionData.type))
+            ?.filter((mod) => ![manifest_1.AllModuleTypes.CoreFunction, manifest_1.AllModuleTypes.CoreRemote].includes(mod?.extensionData.type))
+            .map((entry) => ({
+            key: entry?.key || 'N/A',
+            type: entry?.extensionData.type,
+            properties: {
+                ...this.removeInternalPropertiesFromObject(entry?.extensionData)
+            }
+        })) || [];
+        return rawModules.reduce((acc, entry) => {
+            const type = (0, manifest_1.cleanKey)(entry.type);
+            if (acc[type] === undefined) {
+                acc[type] = [];
+            }
+            acc[type].push(entry);
+            return acc;
+        }, {});
+    }
+    removeInternalPropertiesFromObject(obj) {
+        const { type, functions, outboundAuthContainerId, resourceUploadId, key, ...rest } = obj || {};
+        return rest;
+    }
+    async getAppVersions(environmentKey) {
+        const { id: appId } = await this.getAppConfig();
+        return await this.versionDetailsClient.getVersionList(appId, environmentKey);
+    }
+    async getAppVersionOverviewList(environmentKey) {
+        const versions = await this.getAppVersions(environmentKey);
+        const majorVersions = versions
+            .map((version) => this.getMajorVersion(version))
+            .filter((majorVersion) => majorVersion > 0);
+        const versionDetails = await Promise.all(majorVersions.map(async (version) => await this.getAppVersionDetails(environmentKey, version)));
+        return versionDetails.map((entry) => ({
+            version: entry.appVersion,
+            deploymentDateTime: entry.deploymentDateTime,
+            environmentType: entry.environmentType,
+            egresses: entry.egresses.map((egress) => ({ type: egress.type, count: egress.addresses.length })),
+            policies: entry.policies.map((policy) => ({ type: policy.type, count: policy.policies.length })),
+            scopes: (entry.scopes.length || 0).toString(),
+            connectKeys: (entry.connectKeys?.length || 0).toString(),
+            functions: (entry.functions?.length || 0).toString(),
+            remotes: (entry.remotes?.length || 0).toString(),
+            modules: entry.modules.map((module) => ({ type: module.type, count: module.items.length })),
+            requiresLicense: entry.requiresLicense
+        }));
+    }
+}
+exports.VersionService = VersionService;