@apistudio/apim-cli
Version:
CLI for API Management Products
57 lines (56 loc) • 2.08 kB
JavaScript
/**
* Copyright IBM Corp. 2024, 2025
*/
import { loadAll } from 'js-yaml';
import JSZip from 'jszip';
import { ModelFactory } from '../model-factories/model.factory.js';
import { LogWrapper } from '../service/log-wrapper.js';
import { uploadedFileModel } from '../model-factories/fileupload.factory.js';
const { loadAsync: loadAsyncZip } = JSZip;
export class ZipTestModelTransformer {
constructor() { }
async loadZipFiles(buffer) {
return loadAsyncZip(buffer);
}
parseContent(content, fileName) {
if (fileName.endsWith('.json')) {
return [JSON.parse(content)];
}
const result = loadAll(content);
return result;
}
/**
* Transforms a zip buffer into an array of Test objects.
*
* @param {Buffer} zipBuffer - The zip buffer containing YAML or JSON files.
* @returns {Promise<ModelFactory>} - A promise that resolves to an array of Test objects.
*
*/
async transform(zipBuffer) {
LogWrapper.logInfo('0003', 'Starting file processing.');
const zipFiles = await this.loadZipFiles(zipBuffer);
const model = new ModelFactory();
for (const [fileName, file] of Object.entries(zipFiles.files)) {
if (file.dir)
continue;
if (fileName.match(/\.(ya?ml|json)$/i)) {
const content = await file.async('string');
const parsedData = this.parseContent(content, fileName);
model.create(parsedData);
continue;
}
else {
/**
* The uploaded file is added to the model and transmitted using a FormData request.
* no need to kind check
*/
const content = await file.async('nodebuffer');
uploadedFileModel.create({ key: fileName, fileName, value: content });
continue;
}
}
model.resolveRefs();
LogWrapper.logInfo('0003', 'File processing completed.');
return model;
}
}