import { readFileSync } from 'node:fs'; import { programCsAzureMonitorMigration } from '../src/migrations/program-cs-azure-monitor-migration.js'; const migration = programCsAzureMonitorMigration.migrations[0]; function runFixture(label: string, content: string) { console.log(`\n${'='.repeat(70)}`); console.log(`Fixture: ${label}`); console.log('='.repeat(70)); const detected = migration.detect(content, ''); console.log(`detect() → ${detected}`); if (!detected) { console.log('(no transformation)'); return content; } const out = migration.transform(content, ''); const lines = out.split('\n'); console.log('--- USINGS (first 12 lines) ---'); console.log(lines.slice(0, 12).join('\n')); console.log('--- AROUND AddSmartStack ---'); const idxAdd = lines.findIndex((l) => l.includes('builder.Services.AddSmartStack(')); console.log(lines.slice(Math.max(0, idxAdd - 8), idxAdd + 5).join('\n')); console.log('--- AROUND UseSmartStack ---'); const idxUse = lines.findIndex((l) => l.includes('app.UseSmartStack(')); console.log(lines.slice(idxUse, idxUse + 6).join('\n')); return out; } const polluted = readFileSync('D:/_test/cli/Gesa/src/Gesa.Api/Program.cs', 'utf-8'); const pollutedOut = runFixture('Polluted Program.cs (Claude Code AddHangfire injection)', polluted); const pristine = `using Serilog; using Serilog.Events; using Microsoft.EntityFrameworkCore; using SmartStack.Api.Extensions; using MyApp.Infrastructure; using MyApp.Infrastructure.Persistence; using MyApp.Application; try { var builder = WebApplication.CreateBuilder(args); builder.Host.UseSmartStackSerilog(); // Application Insights SDK (must be added before Serilog runs) var aiConnectionString = builder.Configuration["Logging:Sinks:ApplicationInsights:ConnectionString"]; var aiEnabled = builder.Configuration.GetValue("Logging:Sinks:ApplicationInsights:Enabled"); if (!string.IsNullOrEmpty(aiConnectionString) && aiEnabled) { builder.Services.AddApplicationInsightsTelemetry(options => { options.ConnectionString = aiConnectionString; }); } // =================================================================== // 1. Add SmartStack Core services (from NuGet package) // =================================================================== builder.Services.AddSmartStack(builder.Configuration, options => { options.EnableDevSeeding = builder.Environment.IsDevelopment(); }); var app = builder.Build(); await app.InitializeSmartStackAsync(); app.UseSmartStackSwagger(); app.UseSmartStack(); app.MapSmartStack(); app.Run(); } catch (Exception ex) { Log.Fatal(ex, "Application terminated unexpectedly"); } `; runFixture('Pristine old Program.cs (v4 generation)', pristine); console.log(`\n${'='.repeat(70)}`); console.log('Idempotency check (transform twice = transform once?)'); console.log('='.repeat(70)); const once = migration.transform(polluted, ''); const twice = migration.transform(once, ''); console.log(`once === twice : ${once === twice}`); if (once !== twice) { console.log('--- DIFF ---'); const linesOnce = once.split('\n'); const linesTwice = twice.split('\n'); for (let i = 0; i < Math.max(linesOnce.length, linesTwice.length); i++) { if (linesOnce[i] !== linesTwice[i]) { console.log(`L${i}: once=${JSON.stringify(linesOnce[i])} twice=${JSON.stringify(linesTwice[i])}`); } } }