smartui-migration-tool
Version:
Enterprise-grade CLI tool for migrating visual testing platforms to LambdaTest SmartUI
270 lines • 10.4 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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.CsprojTransformer = void 0;
const fs = __importStar(require("fs/promises"));
const fast_xml_parser_1 = require("fast-xml-parser");
const Logger_1 = require("../utils/Logger");
class CsprojTransformer {
constructor(verbose = false) {
this.verbose = verbose;
}
/**
* Transform .csproj file dependencies
*/
async transformCsprojFile(filePath, platform, framework) {
try {
const content = await fs.readFile(filePath, 'utf-8');
const changes = [];
const errors = [];
if (this.verbose)
Logger_1.logger.debug(`Transforming .csproj file: ${filePath}`);
// Parse XML content
const parser = new fast_xml_parser_1.XMLParser({
ignoreAttributes: false,
attributeNamePrefix: '@_',
preserveOrder: true
});
const csprojXml = parser.parse(content);
// Transform package references
await this.transformPackageReferences(csprojXml, platform, framework, changes, errors);
// Transform properties
await this.transformProperties(csprojXml, platform, framework, changes, errors);
if (changes.length > 0) {
// Build XML back
const builder = new fast_xml_parser_1.XMLBuilder({
ignoreAttributes: false,
attributeNamePrefix: '@_',
preserveOrder: true,
format: true,
indentBy: ' '
});
const transformedContent = builder.build(csprojXml);
await fs.writeFile(filePath, transformedContent, 'utf-8');
if (this.verbose)
Logger_1.logger.debug(`Applied ${changes.length} changes to ${filePath}`);
}
return {
success: errors.length === 0,
changes,
errors
};
}
catch (error) {
return {
success: false,
changes: [],
errors: [error instanceof Error ? error.message : 'Unknown error']
};
}
}
/**
* Transform package references based on platform
*/
async transformPackageReferences(csprojXml, platform, framework, changes, errors) {
const packageMappings = this.getPackageMappings(platform, framework);
// Find all ItemGroup elements
const itemGroups = this.findItemGroups(csprojXml);
for (const itemGroup of itemGroups) {
if (itemGroup.PackageReference) {
const packageRefs = Array.isArray(itemGroup.PackageReference)
? itemGroup.PackageReference
: [itemGroup.PackageReference];
for (const packageRef of packageRefs) {
if (packageRef.include) {
const oldInclude = packageRef.include;
// Check if this package needs to be replaced
for (const [oldPackage, newPackage] of Object.entries(packageMappings)) {
if (oldInclude.includes(oldPackage)) {
packageRef.include = newPackage;
packageRef.version = this.getSmartUIVersion(framework);
changes.push({
type: 'package_reference',
oldValue: oldInclude,
newValue: newPackage,
description: `Replace ${oldPackage} with SmartUI package`
});
if (this.verbose)
Logger_1.logger.debug(`Replaced package: ${oldInclude} -> ${newPackage}`);
break;
}
}
}
}
}
}
}
/**
* Transform project properties
*/
async transformProperties(csprojXml, platform, framework, changes, errors) {
// Add SmartUI specific properties if needed
const project = csprojXml.Project;
if (project && project.PropertyGroup) {
const propertyGroups = Array.isArray(project.PropertyGroup)
? project.PropertyGroup
: [project.PropertyGroup];
for (const propertyGroup of propertyGroups) {
// Add SmartUI configuration properties
if (!propertyGroup.SmartUIConfig) {
propertyGroup.SmartUIConfig = 'true';
changes.push({
type: 'property',
oldValue: '',
newValue: 'SmartUIConfig',
description: 'Add SmartUI configuration property'
});
}
}
}
}
/**
* Find all ItemGroup elements in the project
*/
findItemGroups(csprojXml) {
const itemGroups = [];
if (csprojXml.Project && csprojXml.Project.ItemGroup) {
const groups = Array.isArray(csprojXml.Project.ItemGroup)
? csprojXml.Project.ItemGroup
: [csprojXml.Project.ItemGroup];
itemGroups.push(...groups);
}
return itemGroups;
}
/**
* Get package mappings for different platforms
*/
getPackageMappings(platform, framework) {
const mappings = {};
switch (platform) {
case 'Applitools':
mappings['Applitools.Eyes'] = 'LambdaTest.SmartUI';
mappings['Applitools.Selenium'] = 'LambdaTest.SmartUI';
mappings['Applitools.Playwright'] = 'LambdaTest.SmartUI';
mappings['Applitools'] = 'LambdaTest.SmartUI';
break;
case 'Percy':
mappings['Percy'] = 'LambdaTest.SmartUI';
mappings['percy'] = 'LambdaTest.SmartUI';
break;
case 'Sauce Labs':
mappings['SauceLabs'] = 'LambdaTest.SmartUI';
mappings['Sauce'] = 'LambdaTest.SmartUI';
break;
}
return mappings;
}
/**
* Get SmartUI package version based on framework
*/
getSmartUIVersion(framework) {
switch (framework) {
case 'Playwright':
return '1.0.0';
case 'Selenium':
return '1.0.0';
default:
return '1.0.0';
}
}
/**
* Get dependency mappings for C# projects
*/
getDependencyMappings(platform, framework) {
const mappings = {};
switch (platform) {
case 'Applitools':
mappings['Applitools.Eyes'] = 'LambdaTest.SmartUI';
mappings['Applitools.Selenium'] = 'LambdaTest.SmartUI';
mappings['Applitools.Playwright'] = 'LambdaTest.SmartUI';
break;
case 'Percy':
mappings['Percy'] = 'LambdaTest.SmartUI';
break;
case 'Sauce Labs':
mappings['SauceLabs'] = 'LambdaTest.SmartUI';
break;
}
return mappings;
}
/**
* Get environment variable mappings for C# projects
*/
getEnvironmentMappings(platform) {
const mappings = {};
switch (platform) {
case 'Applitools':
mappings['APPLITOOLS_API_KEY'] = 'LT_ACCESS_KEY';
mappings['APPLITOOLS_SERVER_URL'] = 'LT_SMARTUI_ENDPOINT';
break;
case 'Percy':
mappings['PERCY_TOKEN'] = 'LT_ACCESS_KEY';
break;
case 'Sauce Labs':
mappings['SAUCE_USERNAME'] = 'LT_USERNAME';
mappings['SAUCE_ACCESS_KEY'] = 'LT_ACCESS_KEY';
break;
}
return mappings;
}
/**
* Generate SmartUI configuration for C# projects
*/
generateSmartUIConfig(platform, framework) {
return {
project: {
name: 'csharp-project',
type: 'web',
framework: framework,
language: 'C#'
},
browsers: ['chrome', 'firefox', 'safari', 'edge'],
devices: ['desktop', 'tablet', 'mobile'],
settings: {
screenshotTimeout: 30000,
comparisonThreshold: 0.1,
fullPageScreenshot: true
},
environments: {
development: {
baseUrl: 'http://localhost:3000',
envVars: this.getEnvironmentMappings(platform)
}
}
};
}
}
exports.CsprojTransformer = CsprojTransformer;
//# sourceMappingURL=CsprojTransformer.js.map
;