doc-detective 4.30.0 → 4.32.0

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/index.cjs CHANGED
@@ -634107,6 +634107,49 @@ function logLevelEnabled(config, level) {
634107
634107
  return true;
634108
634108
  return false;
634109
634109
  }
634110
+ function viewportMismatchWarning(requested, actual, tolerance = 0) {
634111
+ const parts = [];
634112
+ for (const dim of ["width", "height"]) {
634113
+ const req = Number(requested?.[dim]);
634114
+ if (!(req > 0))
634115
+ continue;
634116
+ const act = Number(actual?.[dim]);
634117
+ if (!Number.isFinite(act)) {
634118
+ parts.push(`${dim} requested ${req}px, rendered unknown`);
634119
+ } else if (Math.abs(act - req) > tolerance) {
634120
+ parts.push(`${dim} requested ${req}px, rendered ${act}px`);
634121
+ }
634122
+ }
634123
+ if (parts.length === 0)
634124
+ return null;
634125
+ return `Requested viewport not fully realized \u2014 the browser or OS enforces a minimum window size: ${parts.join("; ")}. Screenshots and measurements reflect the rendered size, not the requested size.`;
634126
+ }
634127
+ function resolveViewportTarget(requested, current) {
634128
+ const w = Number(requested?.width);
634129
+ const h = Number(requested?.height);
634130
+ return {
634131
+ width: w > 0 ? w : Number(current?.width),
634132
+ height: h > 0 ? h : Number(current?.height)
634133
+ };
634134
+ }
634135
+ async function readViewport(driver) {
634136
+ const v = await driver.execute("return { width: window.innerWidth, height: window.innerHeight }", []);
634137
+ return { width: Number(v?.width), height: Number(v?.height) };
634138
+ }
634139
+ async function realizeViewport(driver, requested, config = {}, label) {
634140
+ const current = await readViewport(driver);
634141
+ const target = resolveViewportTarget(requested, current);
634142
+ const windowSize = await driver.getWindowSize();
634143
+ const deltaWidth = Number.isFinite(current.width) && Number.isFinite(target.width) ? target.width - current.width : 0;
634144
+ const deltaHeight = Number.isFinite(current.height) && Number.isFinite(target.height) ? target.height - current.height : 0;
634145
+ await driver.setWindowSize(Math.round(windowSize.width + deltaWidth), Math.round(windowSize.height + deltaHeight));
634146
+ const actual = await readViewport(driver);
634147
+ const warning = viewportMismatchWarning(requested, actual, VIEWPORT_TOLERANCE_PX);
634148
+ if (warning) {
634149
+ await log(config, "warning", label ? `${label}: ${warning}` : warning);
634150
+ }
634151
+ return actual;
634152
+ }
634110
634153
  async function log(config, level, message) {
634111
634154
  if (message === void 0) {
634112
634155
  message = config;
@@ -634441,7 +634484,7 @@ function llevenshteinDistance(s, t) {
634441
634484
  }
634442
634485
  return arr[t.length][s.length];
634443
634486
  }
634444
- var import_node_fs7, import_node_os2, import_node_path5, import_node_crypto2, import_promises, import_node_net, import_axios, import_node_child_process4, BACKGROUND_BUFFER_LIMIT, PTY_PACKAGE, READY_POLL_INTERVAL_MS, TRANSIENT_SESSION_ERROR, SESSION_TIMEOUT_ABORT, TRANSIENT_PROCESS_INIT_EXIT_CODES, SETTLE_CEILING_MAX_MS, PRESERVED_TEMP_ENTRIES, FETCH_BINARY_DEFAULTS, ENV_VAR_REGEX, posixBashProbe;
634487
+ var import_node_fs7, import_node_os2, import_node_path5, import_node_crypto2, import_promises, import_node_net, import_axios, import_node_child_process4, BACKGROUND_BUFFER_LIMIT, PTY_PACKAGE, READY_POLL_INTERVAL_MS, TRANSIENT_SESSION_ERROR, SESSION_TIMEOUT_ABORT, TRANSIENT_PROCESS_INIT_EXIT_CODES, SETTLE_CEILING_MAX_MS, PRESERVED_TEMP_ENTRIES, FETCH_BINARY_DEFAULTS, VIEWPORT_TOLERANCE_PX, ENV_VAR_REGEX, posixBashProbe;
634445
634488
  var init_utils = __esm({
634446
634489
  "dist/core/utils.js"() {
634447
634490
  "use strict";
@@ -634483,6 +634526,7 @@ var init_utils = __esm({
634483
634526
  maxBodyLength: 50 * 1024 * 1024,
634484
634527
  maxRedirects: 5
634485
634528
  };
634529
+ VIEWPORT_TOLERANCE_PX = 16;
634486
634530
  ENV_VAR_REGEX = /\$[a-zA-Z0-9_]+(?![a-zA-Z0-9_$])/g;
634487
634531
  }
634488
634532
  });
@@ -643416,6 +643460,69 @@ function parseCaptureFrameSize(stderr) {
643416
643460
  return null;
643417
643461
  return { w: Number(m[1]), h: Number(m[2]) };
643418
643462
  }
643463
+ function parseMediaProbeStderr(stderr) {
643464
+ const meta = {};
643465
+ const text = stderr ?? "";
643466
+ const duration = /\bDuration:\s*(\d+):(\d{2}):(\d{2}(?:\.\d+)?)/.exec(text);
643467
+ if (duration) {
643468
+ meta.duration = Number(duration[1]) * 3600 + Number(duration[2]) * 60 + Number(duration[3]);
643469
+ }
643470
+ const videoLine = /Stream #\d+:\d+.*?Video:.*/.exec(text)?.[0];
643471
+ if (videoLine) {
643472
+ const size = /\b(\d{2,5})x(\d{2,5})\b/.exec(videoLine);
643473
+ if (size) {
643474
+ meta.width = Number(size[1]);
643475
+ meta.height = Number(size[2]);
643476
+ }
643477
+ const fps = /([\d.]+)\s+fps\b/.exec(videoLine) ?? /([\d.]+)\s+tbr\b/.exec(videoLine);
643478
+ if (fps && Number.isFinite(Number(fps[1]))) {
643479
+ meta.fps = Number(fps[1]);
643480
+ }
643481
+ }
643482
+ return meta;
643483
+ }
643484
+ async function probeVideoMetadata({ cacheDir, filePath }) {
643485
+ try {
643486
+ const ffmpegPath = await getFfmpegPath({ cacheDir, autoInstall: false });
643487
+ const stderr = await new Promise((resolve) => {
643488
+ let head = "";
643489
+ let settled = false;
643490
+ let proc = null;
643491
+ let timer;
643492
+ const done = (v) => {
643493
+ if (settled)
643494
+ return;
643495
+ settled = true;
643496
+ clearTimeout(timer);
643497
+ try {
643498
+ proc?.kill();
643499
+ } catch {
643500
+ }
643501
+ resolve(v);
643502
+ };
643503
+ try {
643504
+ proc = (0, import_node_child_process11.spawn)(ffmpegPath, ["-hide_banner", "-i", filePath], {
643505
+ stdio: ["ignore", "ignore", "pipe"]
643506
+ });
643507
+ proc.stderr?.on("data", (chunk) => {
643508
+ if (head.length < 4e3) {
643509
+ head = (head + chunk.toString()).slice(0, 4e3);
643510
+ }
643511
+ });
643512
+ proc.on("error", () => done(null));
643513
+ proc.on("close", () => done(head));
643514
+ timer = setTimeout(() => done(head.length > 0 ? head : null), 5e3);
643515
+ } catch {
643516
+ done(null);
643517
+ }
643518
+ });
643519
+ if (stderr === null)
643520
+ return null;
643521
+ return parseMediaProbeStderr(stderr);
643522
+ } catch {
643523
+ return null;
643524
+ }
643525
+ }
643419
643526
  function deriveCropScale({ platform, frameSize, displayPointSize }) {
643420
643527
  if (platform !== "darwin")
643421
643528
  return 1;
@@ -643549,8 +643656,11 @@ function jobExclusiveResources(job, { allowOverlappingCaptures = false }) {
643549
643656
  return [];
643550
643657
  return ["display"];
643551
643658
  }
643552
- async function getFfmpegPath(ctx = {}) {
643553
- const mod = await loadHeavyDep("@ffmpeg-installer/ffmpeg", { ctx });
643659
+ async function getFfmpegPath({ cacheDir, autoInstall = true } = {}) {
643660
+ const mod = await loadHeavyDep("@ffmpeg-installer/ffmpeg", {
643661
+ ctx: { cacheDir },
643662
+ autoInstall
643663
+ });
643554
643664
  const candidate = mod && (mod.path ?? mod.default?.path);
643555
643665
  if (typeof candidate !== "string" || candidate.length === 0) {
643556
643666
  throw new Error("ffmpeg binary path is missing or malformed in the installed @ffmpeg-installer/ffmpeg package. Try `doc-detective install runtime --force` to reinstall.");
@@ -646563,6 +646673,14 @@ async function saveScreenshot({ config, step, driver, appSession }) {
646563
646673
  return result;
646564
646674
  }
646565
646675
  }
646676
+ try {
646677
+ const savedMeta = await sharp(finalBuffer).metadata();
646678
+ if (savedMeta.width && savedMeta.height) {
646679
+ result.outputs.width = savedMeta.width;
646680
+ result.outputs.height = savedMeta.height;
646681
+ }
646682
+ } catch {
646683
+ }
646566
646684
  const writeFinalPng = (destination) => {
646567
646685
  try {
646568
646686
  import_node_fs20.default.writeFileSync(destination, finalBuffer);
@@ -647311,6 +647429,25 @@ async function stopRecording({ config, step, driver, deps = {} }) {
647311
647429
  dropHandle();
647312
647430
  return result;
647313
647431
  }
647432
+ result.outputs = {
647433
+ recordingPath: import_node_path19.default.resolve(recording.targetPath),
647434
+ format: import_node_path19.default.extname(recording.targetPath).slice(1)
647435
+ };
647436
+ const meta = await probeVideoMetadata({
647437
+ cacheDir: config?.cacheDir,
647438
+ filePath: recording.targetPath
647439
+ });
647440
+ if (meta?.duration !== void 0)
647441
+ result.outputs.duration = meta.duration;
647442
+ if (meta?.width !== void 0)
647443
+ result.outputs.width = meta.width;
647444
+ if (meta?.height !== void 0)
647445
+ result.outputs.height = meta.height;
647446
+ if (meta?.fps !== void 0)
647447
+ result.outputs.fps = meta.fps;
647448
+ if (!meta || Object.keys(meta).length === 0) {
647449
+ log(config, "debug", `Couldn't probe recording metadata for ${recording.targetPath}.`);
647450
+ }
647314
647451
  return result;
647315
647452
  }
647316
647453
  async function transcode({ config, sourcePath, targetPath, deleteSource, crop }) {
@@ -648764,20 +648901,31 @@ async function startSurfaceStep({ config, step, platform, driver, processRegistr
648764
648901
  }
648765
648902
  const vw = Number(d.viewport?.width);
648766
648903
  const vh = Number(d.viewport?.height);
648904
+ let viewportOutput;
648767
648905
  if (vw > 0 || vh > 0) {
648906
+ const requested = {
648907
+ ...vw > 0 ? { width: vw } : {},
648908
+ ...vh > 0 ? { height: vh } : {}
648909
+ };
648910
+ let rendered;
648768
648911
  try {
648769
- await applyViewport(opened.driver, d.viewport);
648912
+ rendered = await realizeViewport(opened.driver, requested, config, `startSurface "${opened.name}"`);
648770
648913
  } catch (error) {
648771
648914
  return {
648772
648915
  status: "FAIL",
648773
648916
  description: `Opened browser surface "${opened.name}" but couldn't apply the viewport: ${error?.message ?? error}`
648774
648917
  };
648775
648918
  }
648919
+ viewportOutput = { requested, actual: rendered };
648776
648920
  }
648777
648921
  return {
648778
648922
  status: "PASS",
648779
648923
  description: `Opened browser surface "${opened.name}" (${engine}).`,
648780
- outputs: { name: opened.name, engine }
648924
+ outputs: {
648925
+ name: opened.name,
648926
+ engine,
648927
+ ...viewportOutput ? { viewport: viewportOutput } : {}
648928
+ }
648781
648929
  };
648782
648930
  };
648783
648931
  const runProcessDescriptor = async (d) => {
@@ -648892,13 +649040,6 @@ async function startSurfaceStep({ config, step, platform, driver, processRegistr
648892
649040
  outputs: { surfaces: results }
648893
649041
  };
648894
649042
  }
648895
- async function applyViewport(driver, viewport) {
648896
- const viewportSize = await driver.execute("return { width: window.innerWidth, height: window.innerHeight }", []);
648897
- const windowSize = await driver.getWindowSize();
648898
- const deltaWidth = (viewport.width || viewportSize.width) - viewportSize.width;
648899
- const deltaHeight = (viewport.height || viewportSize.height) - viewportSize.height;
648900
- await driver.setWindowSize(windowSize.width + deltaWidth, windowSize.height + deltaHeight);
648901
- }
648902
649043
 
648903
649044
  // dist/core/tests/mobileBrowser.js
648904
649045
  var import_node_path24 = __toESM(require("node:path"), 1);
@@ -650108,6 +650249,10 @@ function getDriverCapabilities({ runnerDetails, name, options }) {
650108
650249
  // 10 minutes
650109
650250
  "appium:executable": chromium.driver,
650110
650251
  browserName: "chrome",
650252
+ // Classic WebDriver, no BiDi socket. Enabling `webSocketUrl` for
650253
+ // viewport emulation (driver.setViewport) crashed headed recording
650254
+ // contexts with a stack overflow and can't be gated off recording
650255
+ // (viewport+recording is a supported combo) — see ADR 01072 (rejected).
650111
650256
  "wdio:enforceWebDriverClassic": true,
650112
650257
  // Disable BiDi, use classic mode
650113
650258
  "goog:chromeOptions": {
@@ -650465,14 +650610,18 @@ function driverSkipDiagnostic({ requestedName, platform, platformMatches, attemp
650465
650610
  msg += ` A present-but-broken driver (for example a partially downloaded ${driverHint}) can cause this; reinstall the driver or its browser.`;
650466
650611
  return msg;
650467
650612
  }
650468
- async function setViewportSize(context, driver) {
650469
- if (context.browser?.viewport?.width || context.browser?.viewport?.height) {
650470
- const viewportSize = await driver.execute("return { width: window.innerWidth, height: window.innerHeight }", []);
650471
- const windowSize = await driver.getWindowSize();
650472
- const deltaWidth = (context.browser?.viewport?.width || viewportSize.width) - viewportSize.width;
650473
- const deltaHeight = (context.browser?.viewport?.height || viewportSize.height) - viewportSize.height;
650474
- await driver.setWindowSize(windowSize.width + deltaWidth, windowSize.height + deltaHeight);
650613
+ async function setViewportSize(context, driver, config = {}) {
650614
+ const vw = Number(context.browser?.viewport?.width);
650615
+ const vh = Number(context.browser?.viewport?.height);
650616
+ if (vw > 0 || vh > 0) {
650617
+ const requested = {
650618
+ ...vw > 0 ? { width: vw } : {},
650619
+ ...vh > 0 ? { height: vh } : {}
650620
+ };
650621
+ const label = `viewport for ${context.browser?.name ?? "browser"} on ${context.platform ?? "host"}`;
650622
+ return realizeViewport(driver, requested, config, label);
650475
650623
  }
650624
+ return void 0;
650476
650625
  }
650477
650626
  async function allowUnsafeSteps({ config }) {
650478
650627
  if (config.allowUnsafeSteps === true)
@@ -652191,8 +652340,10 @@ ${JSON.stringify(context, null, 2)}`);
652191
652340
  driver
652192
652341
  });
652193
652342
  }
652194
- if (context.browser?.viewport?.width || context.browser?.viewport?.height) {
652195
- await setViewportSize(context, driver);
652343
+ const viewportW = Number(context.browser?.viewport?.width);
652344
+ const viewportH = Number(context.browser?.viewport?.height);
652345
+ if (viewportW > 0 || viewportH > 0) {
652346
+ await setViewportSize(context, driver, config);
652196
652347
  } else if (context.browser?.window?.width || context.browser?.window?.height) {
652197
652348
  const windowSize = await driver.getWindowSize();
652198
652349
  await driver.setWindowSize(context.browser?.window?.width || windowSize.width, context.browser?.window?.height || windowSize.height);
@@ -1040,7 +1040,9 @@ function collectMedia(step) {
1040
1040
  if (step.record && (step.record.path || outs.recordingPath)) {
1041
1041
  media.push({ kind: "video", path: outs.recordingPath || step.record.path });
1042
1042
  }
1043
- if (step.stopRecord && outs.recordingPath) {
1043
+ // Match the runner's dispatch (presence, not truthiness): stopRecord null
1044
+ // is a valid untargeted stop that still saves a video.
1045
+ if (typeof step.stopRecord !== "undefined" && outs.recordingPath) {
1044
1046
  media.push({ kind: "video", path: outs.recordingPath });
1045
1047
  }
1046
1048
  return media;
@@ -1 +1 @@
1
- {"version":3,"file":"htmlReporter.js","sourceRoot":"","sources":["../../src/reporters/htmlReporter.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmwBnB,CAAC;AAEF,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAquBlB,CAAC"}
1
+ {"version":3,"file":"htmlReporter.js","sourceRoot":"","sources":["../../src/reporters/htmlReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAc,EAAE,EAChB,UAAe,EACf,OAAY,EACZ,UAAe,EAAE;IAEjB,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE3C,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEtC,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,UAAU,GAAG,uBAAuB,CAAC;IACzC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,OAAO,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YACtC,UAAU,GAAG,iBAAiB,CAAC;QACjC,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC1C,UAAU,GAAG,aAAa,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC7D,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,UAAU,GAAG,UAAU,CAAC;QACxB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;gBACjD,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,UAAU,GAAG,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,UAAU,CAAC;QACvB,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,IAAI,CAAC,CAAC;QAClD,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,UAAU,KAAK,GAAG,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAY;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;SAChD,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEjC,OAAO;;;;;;;EAOP,WAAW;;;;;sDAKyC,UAAU;;;;;EAK9D,UAAU;;;QAGJ,CAAC;AACT,CAAC;AAED,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmwBnB,CAAC;AAEF,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuuBlB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "doc-detective",
3
- "version": "4.30.0",
3
+ "version": "4.32.0",
4
4
  "description": "Treat doc content as testable assertions to validate doc accuracy and product UX.",
5
5
  "bin": {
6
6
  "doc-detective": "bin/doc-detective.js",