@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.
Files changed (2) hide show
  1. package/dist/cli.js +22 -10
  2. 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.length > 0;
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 = null;
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 = await launchBrowser({ headless: true });
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.6",
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",