@apistudio/apim-cli
Version:
CLI for API Management Products
101 lines (100 loc) • 4.02 kB
JavaScript
/**
* 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;
}
}