cucumber-html-report-generator
Version:
Generate beautiful cucumberjs html reports for multiple instances (browsers / devices)
215 lines • 10.7 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateResources = exports.updateResourcesTemplates = exports.deleteOldDependencies = exports.getResourceInformation = exports.getDatatablesResourceInformation = exports.getCdnjsResourceInformation = exports.downloadResources = exports.downloadResource = exports.downloadFile = void 0;
const CommonFunctions = __importStar(require("../lib/common-functions/common-functions"));
const fse = __importStar(require("fs-extra"));
const https = __importStar(require("https"));
const path = __importStar(require("path"));
const axios_1 = __importDefault(require("axios"));
const semver_1 = __importDefault(require("semver"));
const ssri_1 = __importDefault(require("ssri"));
const downloadFile = async (url, filePath) => new Promise((resolve, reject) => {
https.get(url, response => {
const statusCode = response.statusCode;
if (statusCode !== 200) {
reject(new Error('Download error!'));
return;
}
const writeStream = fse.createWriteStream(filePath);
response.pipe(writeStream);
writeStream.on('error', () => {
reject(new Error('Error writing to file!'));
});
writeStream.on('finish', () => {
writeStream.close();
resolve(true);
});
});
}).catch(err => {
if (err.message.includes('Download error!')) {
console.log(`error downloading file ${url}`);
}
else {
console.log(err.message);
}
return false;
});
exports.downloadFile = downloadFile;
const downloadResource = async (destinationPath, url) => {
if (!fse.existsSync(destinationPath)) {
fse.mkdirSync(path.dirname(destinationPath), { recursive: true });
const downloadResult = await (0, exports.downloadFile)(url, destinationPath);
return downloadResult;
}
return false;
};
exports.downloadResource = downloadResource;
const downloadResources = async (dependency) => {
try {
await Promise.all(dependency.files.map(async (file) => {
await (0, exports.downloadResource)(file.path, file.url ?? '');
}));
}
catch (error) {
console.log(`error ${error.message} in function downloadResources with file ${dependency.name} `);
}
};
exports.downloadResources = downloadResources;
const getCdnjsResourceInformation = async (dependency, resourcesFolder) => {
const resourceUrl = `https://api.cdnjs.com/libraries/${dependency.name}?fields=name,version,repository,assets,latest,name,filename`;
let response = {};
try {
response = (await axios_1.default.get(resourceUrl)).data;
}
catch (error) {
console.log(`error ${error.message} in function getCdnjsResourceInformation with dependency ${dependency.name}`);
}
let filePropertiesArray = [];
if (semver_1.default.gt(response.version, dependency.version)) {
try {
filePropertiesArray = dependency.files.map(file => {
const destinationPath = path.join(resourcesFolder, `${dependency.name}-${response.version}`, file.name);
const url = response.latest.replace(response.filename, file.name);
return {
name: file.name,
path: destinationPath,
url
};
});
}
catch (error) {
console.log(`error ${error.message} in function getCdnjsResourceInformation with dependency ${dependency.name}`);
}
}
return {
name: dependency.name,
files: filePropertiesArray,
version: response.version
};
};
exports.getCdnjsResourceInformation = getCdnjsResourceInformation;
const getDatatablesResourceInformation = async (dependency, resourcesFolder) => {
const resourceUrl = 'https://datatables.net/feeds/versions';
let response = {};
try {
response = (await axios_1.default.get(resourceUrl)).data;
}
catch (error) {
console.log(`error ${error.message} in function getDatatablesResourceInformation with dependency ${dependency.name}`);
}
let filePropertiesArray = [];
try {
filePropertiesArray = dependency.files.map(file => {
const destinationPath = path.join(resourcesFolder, `${dependency.name}-${response[dependency.name].release.version}`, file.name);
const url = file.url?.replace(dependency.version, response[dependency.name].release.version);
return {
name: file.name,
path: destinationPath,
url
};
});
}
catch (error) {
console.log(`error ${error.message} in function getDatatablesResourceInformation with dependency ${dependency.name}`);
}
return {
name: dependency.name,
files: filePropertiesArray,
version: response[dependency.name].release.version
};
};
exports.getDatatablesResourceInformation = getDatatablesResourceInformation;
const getResourceInformation = async (dependency, resourcesFolder) => {
return dependency.cdn === 'cdnjs' ?
(0, exports.getCdnjsResourceInformation)(dependency, resourcesFolder) :
(0, exports.getDatatablesResourceInformation)(dependency, resourcesFolder);
};
exports.getResourceInformation = getResourceInformation;
const deleteOldDependencies = async (resourceProperties, resourcesFolder) => {
await Promise.all(resourceProperties.files.map(async (file) => {
await fse.remove(`${resourcesFolder}/${resourceProperties.name}-${resourceProperties.version}/${file.name}`);
console.log(`file: ${resourcesFolder}/${resourceProperties.name}-${resourceProperties.version}/${file.name}, removed`);
}));
await fse.remove(`${resourcesFolder}/${resourceProperties.name}-${resourceProperties.version}`);
console.log(`folder: ${resourcesFolder}/${resourceProperties.name}-${resourceProperties.version}, removed`);
};
exports.deleteOldDependencies = deleteOldDependencies;
const updateResourcesTemplates = async (resourceInformation, templateFiles) => {
await Promise.all(templateFiles.map(async (templateFile) => {
let templateFileContent = await fse.readFile(templateFile, { encoding: 'utf8' });
resourceInformation.files.forEach(resourceFile => {
let regex = RegExp(`href.*${resourceFile.name}" integrity="[^"]+"`, 'u');
const newFile = resourceInformation.files.filter(file => file.name === resourceFile.name)[0];
const sriValue = ssri_1.default.fromData(fse.readFileSync(newFile.path)).toString();
let newUrl = `href="${newFile.url}" integrity="${sriValue}"`;
templateFileContent = templateFileContent.replace(regex, newUrl);
regex = RegExp(`src.*${resourceFile.name}" integrity="[^"]+"`, 'u');
newUrl = `src="${newFile.url}" integrity="${sriValue}"`;
templateFileContent = templateFileContent.replace(regex, newUrl);
regex = RegExp(`resources.*${resourceFile.name}`, 'u');
newUrl = `resources/${resourceInformation.name}-${resourceInformation.version}/${resourceFile.name}`;
templateFileContent = templateFileContent.replace(regex, newUrl);
});
await fse.writeFile(templateFile, templateFileContent, { encoding: 'utf8' }).catch(error => {
console.log(error.message);
});
}));
};
exports.updateResourcesTemplates = updateResourcesTemplates;
const updateResourcesPropertiesConfigurationJson = async (configurationData, configurationFile) => {
await CommonFunctions.saveJsonFile(path.dirname(configurationFile), path.basename(configurationFile), configurationData);
};
const updateResources = async (configurationFile, resourcesFolder, templates) => {
const originalConfigurationData = (await CommonFunctions.readJsonFile(configurationFile));
const newConfigurationData = (await CommonFunctions.readJsonFile(configurationFile));
await Promise.all(newConfigurationData.map(async (localResourceConf) => {
const remoteResourceConf = await (0, exports.getResourceInformation)(localResourceConf, resourcesFolder);
if (remoteResourceConf.version && remoteResourceConf.files.length && semver_1.default.gt(remoteResourceConf.version, localResourceConf.version)) {
await (0, exports.downloadResources)(remoteResourceConf);
await (0, exports.updateResourcesTemplates)(remoteResourceConf, templates);
await (0, exports.deleteOldDependencies)(localResourceConf, resourcesFolder);
console.log(`Resource ${localResourceConf.name} updated to version ${remoteResourceConf.version}`);
localResourceConf.files.map(file => {
file.url = file.url?.replace(localResourceConf.version, remoteResourceConf.version);
file.path = file.path.replace(localResourceConf.version, remoteResourceConf.version);
return file;
});
localResourceConf.version = remoteResourceConf.version;
}
return localResourceConf;
}));
if (JSON.stringify(originalConfigurationData) === JSON.stringify(newConfigurationData)) {
console.log('All the resources are in the latest version');
}
else {
await updateResourcesPropertiesConfigurationJson(newConfigurationData, configurationFile);
}
};
exports.updateResources = updateResources;
//# sourceMappingURL=dependency-modification-functions.js.map