UNPKG

smartui-migration-tool

Version:

Enterprise-grade CLI tool for migrating visual testing platforms to LambdaTest SmartUI

270 lines 10.4 kB
"use strict"; 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