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;