UNPKG

@apistudio/apim-cli

Version:

CLI for API Management Products

97 lines (96 loc) 4.67 kB
import { CoreTransformOrchestrator, ConfigLoader } from "@apic/smith-transformer"; import { WMGWRuntimeInventory } from "@apic/wmgw-smith-inventory"; import { getParentDir } from "./path.util.js"; import yaml from 'js-yaml'; /** * WMGW implementation of the Transform Orchestrator * Specifically for transforming to WMGW gateway */ export class WmgwTransformerOrchestrator extends CoreTransformOrchestrator { /** * Create a new WMGW transform orchestrator * @param configRegistry Configuration registry * @param transformerRegistry Transformer registry */ constructor(configRegistry, transformerRegistry, configLoader) { super(configRegistry, transformerRegistry, configLoader, '12.0.0'); this.inventory = new WMGWRuntimeInventory(); } /** * Post-transformation hook that organizes assets into execute, catch, and finally sections * @param transformedAssets Array of transformed assets * @param resources Resources extracted from the ZIP file * @param apiName Name of the API being processed * @param apiMetadata Metadata of the API * @returns Organized assets in assembly structure */ processOriginalYamlFile(multiYamlFile, transformedAssetsByApi, assetsByApi) { const validApiNames = Object.keys(transformedAssetsByApi); let validAssets = this.filterAssets(multiYamlFile.assets.filter(asset => asset.kind.toLowerCase() !== 'freeflowpolicysequence')); const allApiNames = Object.keys(assetsByApi); const invalidApiNames = allApiNames.filter(apiName => (!validApiNames.includes(apiName))); for (const apiName of invalidApiNames) { if (assetsByApi[apiName]) { const apiAsset = assetsByApi[apiName].api; const relatedAssets = assetsByApi[apiName].relatedAssets; const apiAssetKey = `${apiAsset.kind}:${apiAsset.metadata.namespace || 'default'}:${apiAsset.metadata.name}:${apiAsset.metadata.version || '1.0'}`; const relatedAssetKeys = new Set(relatedAssets.map(asset => { return `${asset.kind}:${asset.metadata.namespace || 'default'}:${asset.metadata.name}:${asset.metadata.version || '1.0'}`; })); validAssets = validAssets.filter(asset => { const assetKey = `${asset.kind}:${asset.metadata.namespace || 'default'}:${asset.metadata.name}:${asset.metadata.version || '1.0'}`; return assetKey !== apiAssetKey && !relatedAssetKeys.has(assetKey); }); } } for (const apiName of validApiNames) { if (assetsByApi[apiName]) { validAssets.push(assetsByApi[apiName].api); validAssets.push(...assetsByApi[apiName].relatedAssets); } } const uniqueAssetsMap = new Map(); for (const asset of validAssets) { const key = `${asset.kind}:${asset.metadata.namespace || 'default'}:${asset.metadata.name}:${asset.metadata.version || '1.0'}`; uniqueAssetsMap.set(key, asset); } const assetsInThisFile = Array.from(uniqueAssetsMap.values()).filter(asset => { return multiYamlFile.assets.some(fileAsset => fileAsset.metadata.name === asset.metadata.name && fileAsset.kind === asset.kind && (fileAsset.metadata.namespace || 'default') === (asset.metadata.namespace || 'default') && (fileAsset.metadata.version || '1.0') === (asset.metadata.version || '1.0')); }); return assetsInThisFile .map(asset => yaml.dump(asset)) .join('\n---\n'); } isApiValid(api, relatedAssets) { for (const asset of relatedAssets) { if (asset.kind.toLowerCase() === 'freeflowpolicysequence') { return false; } if (asset.kind.toLowerCase() === 'datapowerassembly') { return false; } } return true; } } /** * Factory function to create a WMGW transform orchestrator with default registries * @returns A new WMGW transform orchestrator */ export async function createWmgwOrchestrator() { const configLoader = new ConfigLoader(await getParentDir()); const configRegistry = { getConfigPath: (_sourceVersion, _targetVersion, _kind) => { return './configs/skip-transform.json'; } }; const transformerRegistry = { getTransformer: (_name) => { return undefined; } }; return new WmgwTransformerOrchestrator(configRegistry, transformerRegistry, configLoader); }