@decocms/parity 0.17.6 → 0.17.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +22 -10
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -44514,7 +44514,7 @@ function purchaseJourneyFlow(ctx) {
|
|
|
44514
44514
|
data: { totalSteps: 0, failedSteps: 0, asymmetricSkips: 0 }
|
|
44515
44515
|
};
|
|
44516
44516
|
}
|
|
44517
|
-
const single = ctx.prodFlows.length === 0 && ctx.candFlows.
|
|
44517
|
+
const single = ctx.prodFlows.length === 0 && ctx.candFlows.some((f) => f.flow === "purchase-journey");
|
|
44518
44518
|
for (const viewport of ctx.viewports) {
|
|
44519
44519
|
const prodFlow = findFlow2(ctx.prodFlows, viewport);
|
|
44520
44520
|
const candFlow = findFlow2(ctx.candFlows, viewport);
|
|
@@ -54936,13 +54936,12 @@ async function runLiveSelectorValidation(discovered, ctx) {
|
|
|
54936
54936
|
if (ctx.pdpUrl)
|
|
54937
54937
|
await runOn(ctx.pdpUrl, PDP_VALIDATION_KEYS);
|
|
54938
54938
|
await context.close();
|
|
54939
|
-
return { validated, failed: Array.from(failed) };
|
|
54939
|
+
return { validated, failed: Array.from(failed), browser };
|
|
54940
54940
|
} catch (err) {
|
|
54941
54941
|
console.warn(`[selectors] live-validation falhou (não-fatal): ${err.message}`);
|
|
54942
|
-
return null;
|
|
54943
|
-
} finally {
|
|
54944
54942
|
if (browser)
|
|
54945
54943
|
await browser.close().catch(() => {});
|
|
54944
|
+
return null;
|
|
54946
54945
|
}
|
|
54947
54946
|
}
|
|
54948
54947
|
async function runSelectorDiscoveryPass(opts) {
|
|
@@ -54954,11 +54953,12 @@ async function runSelectorDiscoveryPass(opts) {
|
|
|
54954
54953
|
else
|
|
54955
54954
|
console.warn(`[selectors] ${msg}`);
|
|
54956
54955
|
};
|
|
54956
|
+
let reusableBrowser = null;
|
|
54957
54957
|
try {
|
|
54958
54958
|
const html3 = opts.homeHtml ?? await fetchHomeHtml(url, viewport);
|
|
54959
54959
|
if (!html3) {
|
|
54960
54960
|
warn("Falha ao baixar HTML da home; usando defaults");
|
|
54961
|
-
return;
|
|
54961
|
+
return null;
|
|
54962
54962
|
}
|
|
54963
54963
|
let plpUrl;
|
|
54964
54964
|
let plpHtml;
|
|
@@ -54983,7 +54983,10 @@ async function runSelectorDiscoveryPass(opts) {
|
|
|
54983
54983
|
const discovered = await discoverSelectors({ home: url, plp: plpUrl, pdp: pdpUrl }, { home: html3, plp: plpHtml, pdp: pdpHtml }, { noCache: opts.refreshSelectors === true });
|
|
54984
54984
|
if (!discovered) {
|
|
54985
54985
|
warn("LLM não retornou seletores; usando defaults");
|
|
54986
|
-
return;
|
|
54986
|
+
return null;
|
|
54987
|
+
}
|
|
54988
|
+
if (opts.rc.plpUrlHint) {
|
|
54989
|
+
discovered.categoryLink = undefined;
|
|
54987
54990
|
}
|
|
54988
54991
|
const added = Object.entries(discovered).filter(([k, v]) => k !== "lowConfidenceKeys" && v).length;
|
|
54989
54992
|
if (spinner)
|
|
@@ -54995,6 +54998,7 @@ async function runSelectorDiscoveryPass(opts) {
|
|
|
54995
54998
|
viewport
|
|
54996
54999
|
});
|
|
54997
55000
|
if (validation) {
|
|
55001
|
+
reusableBrowser = validation.browser;
|
|
54998
55002
|
persistSelectorValidation(url, validation.validated);
|
|
54999
55003
|
for (const key of validation.failed) {
|
|
55000
55004
|
console.warn(`[selectors] descartando "${key}" — falhou na validação ao vivo (0 elementos na página onde deveria estar)`);
|
|
@@ -55020,7 +55024,12 @@ async function runSelectorDiscoveryPass(opts) {
|
|
|
55020
55024
|
spinner.succeed(`${added} seletor(es) inferido(s) pelo LLM (${validatedCount} validado(s) ao vivo)`);
|
|
55021
55025
|
} catch (err) {
|
|
55022
55026
|
warn(`Discovery falhou: ${err.message}`);
|
|
55027
|
+
if (reusableBrowser) {
|
|
55028
|
+
await reusableBrowser.close().catch(() => {});
|
|
55029
|
+
reusableBrowser = null;
|
|
55030
|
+
}
|
|
55023
55031
|
}
|
|
55032
|
+
return reusableBrowser;
|
|
55024
55033
|
}
|
|
55025
55034
|
|
|
55026
55035
|
// src/learned/platform.ts
|
|
@@ -55228,8 +55237,9 @@ async function e2eCommand(opts) {
|
|
|
55228
55237
|
}
|
|
55229
55238
|
}
|
|
55230
55239
|
const wantsAutoSelectors = opts.autoSelectors !== false && isLlmAvailable();
|
|
55240
|
+
let discoveryBrowser = null;
|
|
55231
55241
|
if (wantsAutoSelectors) {
|
|
55232
|
-
await runSelectorDiscoveryPass({
|
|
55242
|
+
discoveryBrowser = await runSelectorDiscoveryPass({
|
|
55233
55243
|
url: opts.url,
|
|
55234
55244
|
viewport: primaryViewport,
|
|
55235
55245
|
rc,
|
|
@@ -55254,12 +55264,14 @@ async function e2eCommand(opts) {
|
|
|
55254
55264
|
};
|
|
55255
55265
|
process.once("SIGINT", onSignal);
|
|
55256
55266
|
process.once("SIGTERM", onSignal);
|
|
55257
|
-
const spinner = opts.json ? null : ora4("Lançando browser…").start();
|
|
55258
|
-
let browser =
|
|
55267
|
+
const spinner = opts.json ? null : discoveryBrowser ? ora4("Iniciando fluxos…").start() : ora4("Lançando browser…").start();
|
|
55268
|
+
let browser = discoveryBrowser;
|
|
55259
55269
|
const allFlows = [];
|
|
55260
55270
|
const allPages = [];
|
|
55261
55271
|
try {
|
|
55262
|
-
browser
|
|
55272
|
+
if (!browser) {
|
|
55273
|
+
browser = await launchBrowser({ headless: true });
|
|
55274
|
+
}
|
|
55263
55275
|
for (const viewport of viewports) {
|
|
55264
55276
|
const ctx = await newContext(browser, { viewport });
|
|
55265
55277
|
await installVitalsCollector(ctx);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decocms/parity",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.8",
|
|
4
4
|
"description": "E2E parity validator for site migrations. Compares prod vs cand and reports UI, functional, SEO, visual, and Web Vitals deltas with an LLM-ranked HTML report.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|