UNPKG

@apistudio/apim-cli

Version:

CLI for API Management Products

101 lines (100 loc) 4.02 kB
/** * Copyright Super iPaaS Integration LLC, an IBM Company 2024 */ import JSZip from 'jszip'; import yaml from 'js-yaml'; import { TypeConvertor } from '../converter/type.converter.js'; import { LogWrapper } from '../service/log-wrapper.js'; export class AssetParser { constructor() { this.obj = new TypeConvertor(); } async createAssetReferenceMap(buffer) { const zip = new JSZip(); const refMap = new Map(); const zipContent = await zip.loadAsync(buffer); for (const [fileName, file] of Object.entries(zipContent.files)) { if (fileName.endsWith('.yaml') || fileName.endsWith('.yml')) { const content = await file.async('string'); try { const yamlContents = yaml.loadAll(content); for (const yamlContent of yamlContents) { if (yamlContent.kind.toLowerCase() === 'test') { this.extractRefs(yamlContent, refMap); } this.updateMapWithMetadata(yamlContent, refMap); } } catch (err) { LogWrapper.logError('0013', `parsing YAML in file ${fileName}`, err.message); } } } return refMap; } updateMapWithMetadata(yamlContent, refMap) { const metadata = yamlContent.metadata; const keyParts = []; if (metadata.namespace) { keyParts.push(metadata.namespace); } if (metadata.name) { keyParts.push(metadata.name); } const version = this.obj.toString(metadata.version); keyParts.push(version); const key = keyParts.join(':'); refMap.set(key, true); LogWrapper.logDebug('0003', `Metadata key added to refMap: ${key}`); } async updateMapWithGatewayEndpoints(data, refMap) { const zip = new JSZip(); const zipContent = await zip.loadAsync(data); for (const [fileName, file] of Object.entries(zipContent.files)) { if (fileName.includes('api-gatewayEndpoints.json')) { const content = await file.async('string'); const endpoints = JSON.parse(content); Object.keys(endpoints).forEach((key) => { refMap.set(key, true); LogWrapper.logInfo('0003', `Gateway endpoint added to refMap: ${key}`); }); } } } extractRefs(yamlContent, refMap) { const extractRef = (obj) => { for (const key in obj) { const value = obj[key]; if (key === '$ref' && typeof value === 'string') { const metadataWithUpdatedVersion = this.replaceVersionInString(value); if (!refMap.has(metadataWithUpdatedVersion)) { LogWrapper.logDebug('0003', `Reference found and added to refMap: ${value}`); refMap.set(metadataWithUpdatedVersion, false); } } else if (typeof value === 'object' && value !== null) { extractRef(value); } } }; const specOb = JSON.stringify(yamlContent.spec); extractRef(yaml.load(specOb)); } replaceVersionInString(input) { const parts = input.split(':'); const version = parts[parts.length - 1]; const numberPattern = /^-?\d+(\.\d+)?$/; // Matches integers and decimals if (numberPattern.test(version)) { const numberVersion = parseFloat(version); if (!isNaN(numberVersion)) { parts[parts.length - 1] = this.obj.toString(numberVersion); return parts.join(':'); } } else { parts[parts.length - 1] = this.obj.toString(version); return parts.join(':'); } return input; } }