doc-detective 4.25.1 → 4.26.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.
Files changed (87) hide show
  1. package/dist/common/src/schemas/schemas.json +15966 -4090
  2. package/dist/common/src/types/generated/closeSurface_v3.d.ts +2 -2
  3. package/dist/common/src/types/generated/dragAndDrop_v3.d.ts +1 -1
  4. package/dist/common/src/types/generated/goTo_v3.d.ts +1 -1
  5. package/dist/common/src/types/generated/record_v3.d.ts +1 -1
  6. package/dist/common/src/types/generated/runBrowserScript_v3.d.ts +1 -1
  7. package/dist/common/src/types/generated/screenshot_v3.d.ts +1 -1
  8. package/dist/common/src/types/generated/startSurface_v3.d.ts +317 -3
  9. package/dist/common/src/types/generated/startSurface_v3.d.ts.map +1 -1
  10. package/dist/common/src/types/generated/step_v3.d.ts +329 -15
  11. package/dist/common/src/types/generated/step_v3.d.ts.map +1 -1
  12. package/dist/common/src/types/generated/surface_v3.d.ts +1 -1
  13. package/dist/common/src/types/generated/swipe_v3.d.ts +2 -2
  14. package/dist/common/src/types/generated/test_v3.d.ts +669 -41
  15. package/dist/common/src/types/generated/test_v3.d.ts.map +1 -1
  16. package/dist/common/src/types/generated/type_v3.d.ts +1 -1
  17. package/dist/core/resolveTests.d.ts.map +1 -1
  18. package/dist/core/resolveTests.js +8 -1
  19. package/dist/core/resolveTests.js.map +1 -1
  20. package/dist/core/tests/appGestures.d.ts +7 -1
  21. package/dist/core/tests/appGestures.d.ts.map +1 -1
  22. package/dist/core/tests/appGestures.js +24 -4
  23. package/dist/core/tests/appGestures.js.map +1 -1
  24. package/dist/core/tests/appSurface.d.ts +13 -1
  25. package/dist/core/tests/appSurface.d.ts.map +1 -1
  26. package/dist/core/tests/appSurface.js +42 -10
  27. package/dist/core/tests/appSurface.js.map +1 -1
  28. package/dist/core/tests/appWindows.d.ts +45 -0
  29. package/dist/core/tests/appWindows.d.ts.map +1 -0
  30. package/dist/core/tests/appWindows.js +638 -0
  31. package/dist/core/tests/appWindows.js.map +1 -0
  32. package/dist/core/tests/browserSessions.d.ts +25 -3
  33. package/dist/core/tests/browserSessions.d.ts.map +1 -1
  34. package/dist/core/tests/browserSessions.js +63 -27
  35. package/dist/core/tests/browserSessions.js.map +1 -1
  36. package/dist/core/tests/browserSurface.d.ts.map +1 -1
  37. package/dist/core/tests/browserSurface.js +5 -2
  38. package/dist/core/tests/browserSurface.js.map +1 -1
  39. package/dist/core/tests/closeSurface.d.ts.map +1 -1
  40. package/dist/core/tests/closeSurface.js +25 -3
  41. package/dist/core/tests/closeSurface.js.map +1 -1
  42. package/dist/core/tests/ffmpegRecorder.d.ts +1 -7
  43. package/dist/core/tests/ffmpegRecorder.d.ts.map +1 -1
  44. package/dist/core/tests/ffmpegRecorder.js +5 -22
  45. package/dist/core/tests/ffmpegRecorder.js.map +1 -1
  46. package/dist/core/tests/findElement.d.ts.map +1 -1
  47. package/dist/core/tests/findElement.js +27 -5
  48. package/dist/core/tests/findElement.js.map +1 -1
  49. package/dist/core/tests/processSurface.d.ts +22 -0
  50. package/dist/core/tests/processSurface.d.ts.map +1 -0
  51. package/dist/core/tests/processSurface.js +105 -0
  52. package/dist/core/tests/processSurface.js.map +1 -0
  53. package/dist/core/tests/runShell.d.ts.map +1 -1
  54. package/dist/core/tests/runShell.js +23 -94
  55. package/dist/core/tests/runShell.js.map +1 -1
  56. package/dist/core/tests/saveScreenshot.d.ts.map +1 -1
  57. package/dist/core/tests/saveScreenshot.js +27 -6
  58. package/dist/core/tests/saveScreenshot.js.map +1 -1
  59. package/dist/core/tests/startRecording.d.ts.map +1 -1
  60. package/dist/core/tests/startRecording.js +29 -14
  61. package/dist/core/tests/startRecording.js.map +1 -1
  62. package/dist/core/tests/startSurface.d.ts +17 -0
  63. package/dist/core/tests/startSurface.d.ts.map +1 -0
  64. package/dist/core/tests/startSurface.js +275 -0
  65. package/dist/core/tests/startSurface.js.map +1 -0
  66. package/dist/core/tests/swipe.d.ts.map +1 -1
  67. package/dist/core/tests/swipe.js +30 -5
  68. package/dist/core/tests/swipe.js.map +1 -1
  69. package/dist/core/tests/typeKeys.d.ts.map +1 -1
  70. package/dist/core/tests/typeKeys.js +22 -0
  71. package/dist/core/tests/typeKeys.js.map +1 -1
  72. package/dist/core/tests.d.ts +1 -0
  73. package/dist/core/tests.d.ts.map +1 -1
  74. package/dist/core/tests.js +61 -32
  75. package/dist/core/tests.js.map +1 -1
  76. package/dist/core/utils.d.ts.map +1 -1
  77. package/dist/core/utils.js +10 -5
  78. package/dist/core/utils.js.map +1 -1
  79. package/dist/index.cjs +17493 -4755
  80. package/dist/runtime/browserStepKeys.d.ts +22 -0
  81. package/dist/runtime/browserStepKeys.d.ts.map +1 -1
  82. package/dist/runtime/browserStepKeys.js +31 -0
  83. package/dist/runtime/browserStepKeys.js.map +1 -1
  84. package/dist/runtime/inferRuntimeNeeds.d.ts.map +1 -1
  85. package/dist/runtime/inferRuntimeNeeds.js +23 -3
  86. package/dist/runtime/inferRuntimeNeeds.js.map +1 -1
  87. package/package.json +1 -1
@@ -11,7 +11,7 @@ import fs from "node:fs";
11
11
  import { loadHeavyDep, resolveHeavyDepPath } from "../runtime/loader.js";
12
12
  import { requiredBrowserAssets, ensureBrowserInstalled, } from "../runtime/browsers.js";
13
13
  // Single source of truth for browser/driver-requiring step keys.
14
- import { BROWSER_STEP_KEYS as driverActions } from "../runtime/browserStepKeys.js";
14
+ import { BROWSER_STEP_KEYS as driverActions, startSurfaceDescriptors, stepOpensBrowserSurface, } from "../runtime/browserStepKeys.js";
15
15
  import os from "node:os";
16
16
  import { log, replaceEnvs, selectSpecsForRun, findFreePort, runConcurrent, runResourceAware, createResourceRegistry, rollUpResults, createAppiumPool, getRunOutputDir, runArchivesArtifacts, sanitizeFilesystemName, evaluateContextRequirements, isRetryableSessionError, } from "./utils.js";
17
17
  import axios from "axios";
@@ -34,7 +34,8 @@ import { httpRequest } from "./tests/httpRequest.js";
34
34
  import { clickElement } from "./tests/click.js";
35
35
  import { runCode } from "./tests/runCode.js";
36
36
  import { closeSurface } from "./tests/closeSurface.js";
37
- import { createAppSessionState, appSurfacePreflight, isAppDriverRequired, stepTargetsAppSurface, startAppSurface, teardownAppSession, } from "./tests/appSurface.js";
37
+ import { createAppSessionState, appSurfacePreflight, isAppDriverRequired, stepTargetsAppSurface, teardownAppSession, } from "./tests/appSurface.js";
38
+ import { startSurfaceStep } from "./tests/startSurface.js";
38
39
  import { isMobileTargetPlatform } from "./tests/mobilePlatform.js";
39
40
  import { mobileBrowserGate, buildMobileBrowserCapabilities, } from "./tests/mobileBrowser.js";
40
41
  import { getCacheDir } from "../runtime/cacheDir.js";
@@ -300,6 +301,10 @@ function isDriverRequired({ test }) {
300
301
  if (typeof step[action] !== "undefined")
301
302
  driverRequired = true;
302
303
  });
304
+ // A startSurface browser descriptor opens a WebDriver session (Phase 6);
305
+ // app/process descriptors provision their own runtimes and don't count.
306
+ if (stepOpensBrowserSurface(step))
307
+ driverRequired = true;
303
308
  });
304
309
  return driverRequired;
305
310
  }
@@ -446,8 +451,11 @@ function isBrowserRequired({ test }) {
446
451
  if (!Array.isArray(test?.steps))
447
452
  return false;
448
453
  return test.steps.some((step) => !step?.__autoRecord &&
449
- driverActions.some((action) => typeof step[action] !== "undefined") &&
450
- !stepTargetsAppSurface(step));
454
+ ((driverActions.some((action) => typeof step[action] !== "undefined") &&
455
+ !stepTargetsAppSurface(step)) ||
456
+ // Phase 6: `startSurface: { browser: … }` opens a browser session
457
+ // (the goTo-opener sibling); app/process descriptors don't.
458
+ stepOpensBrowserSurface(step)));
451
459
  }
452
460
  // Size the browser Appium server pool: the number of concurrent runner jobs
453
461
  // that will actually create a BROWSER session. App-only jobs are excluded —
@@ -478,14 +486,19 @@ function contextRequirementsSkipMessage({ context, deps, }) {
478
486
  return null;
479
487
  return `Skipping context on '${context.platform}': unmet requirements — ${missing.join(", ")}.`;
480
488
  }
481
- // The device descriptors a test needs: each startSurface's `device` (undefined
482
- // when it omits one — the context default / auto device). At least one entry so
483
- // a test with no explicit device still validates the default device.
484
- function collectDeviceDescriptors(context) {
489
+ // The device descriptors a test needs: each APP startSurface descriptor's
490
+ // `device` (undefined when it omits one — the context default / auto device),
491
+ // across both the object form and the Phase 6 parallel array form. Browser /
492
+ // process descriptors boot no device and contribute nothing. At least one
493
+ // entry so a test with no explicit device still validates the default device.
494
+ // Exported for a focused unit test.
495
+ export function collectDeviceDescriptors(context) {
485
496
  const out = [];
486
497
  for (const step of context?.steps ?? []) {
487
- if (step?.startSurface)
488
- out.push(step.startSurface.device);
498
+ for (const d of startSurfaceDescriptors(step)) {
499
+ if (d && typeof d === "object" && typeof d.app === "string")
500
+ out.push(d.device);
501
+ }
489
502
  }
490
503
  return out.length ? out : [undefined];
491
504
  }
@@ -2956,18 +2969,34 @@ async function runContext({ config, spec, test, context, runnerDetails, appiumPo
2956
2969
  downloadDir: browserDownloadDir(context.contextId),
2957
2970
  };
2958
2971
  // Start a session for one engine, headed first then (on failure) headless.
2959
- const startDriverForBrowser = async (browserName) => {
2960
- const wantHeadless = context.browser?.headless !== false;
2961
- const buildCaps = (headless) => getDriverCapabilities({
2962
- runnerDetails,
2963
- name: browserName,
2964
- options: {
2965
- width: context.browser?.window?.width || 1200,
2966
- height: context.browser?.window?.height || 800,
2967
- headless,
2968
- ...recordOptions,
2969
- },
2970
- });
2972
+ // `overrides` carries a startSurface browser descriptor's launch knobs
2973
+ // (Phase 6): explicit headless wins over the context setting, `size`
2974
+ // wins over the context window dimensions, and `driverOptions` merges
2975
+ // into the computed capabilities last (the app branch's escape-hatch
2976
+ // precedent).
2977
+ const startDriverForBrowser = async (browserName, overrides) => {
2978
+ const wantHeadless = overrides?.headless !== undefined
2979
+ ? overrides.headless
2980
+ : context.browser?.headless !== false;
2981
+ const buildCaps = (headless) => {
2982
+ const caps = getDriverCapabilities({
2983
+ runnerDetails,
2984
+ name: browserName,
2985
+ options: {
2986
+ width: overrides?.size?.width ||
2987
+ context.browser?.window?.width ||
2988
+ 1200,
2989
+ height: overrides?.size?.height ||
2990
+ context.browser?.window?.height ||
2991
+ 800,
2992
+ headless,
2993
+ ...recordOptions,
2994
+ },
2995
+ });
2996
+ if (overrides?.driverOptions)
2997
+ Object.assign(caps, overrides.driverOptions);
2998
+ return caps;
2999
+ };
2971
3000
  const startFailure = () => {
2972
3001
  let error = `Failed to start context '${browserName}' on '${platform}'.`;
2973
3002
  if (browserName === "safari" || browserName === "webkit") {
@@ -3102,8 +3131,8 @@ async function runContext({ config, spec, test, context, runnerDetails, appiumPo
3102
3131
  // stamps driver.state.engine and back-links driver.state.sessionRegistry.
3103
3132
  if (driver) {
3104
3133
  browserSessions = createSessionRegistry({
3105
- open: async (engine) => {
3106
- const res = await startDriverForBrowser(engine);
3134
+ open: async (engine, overrides) => {
3135
+ const res = await startDriverForBrowser(engine, overrides);
3107
3136
  if (!res.ok)
3108
3137
  throw new Error(res.error);
3109
3138
  return res.driver;
@@ -3781,17 +3810,17 @@ async function runStep({ config = {}, context = {}, step, driver, metaValues = {
3781
3810
  actionResult = await closeSurface({ config: config, step: step, driver, processRegistry, appSession });
3782
3811
  }
3783
3812
  else if (typeof step.startSurface !== "undefined") {
3784
- if (!appSession) {
3785
- actionResult = {
3786
- status: "FAIL",
3787
- description: "startSurface ran without an app session; this is a runner bug (runContext must preflight app-driver tests).",
3788
- };
3789
- }
3790
- else {
3791
- actionResult = await startAppSurface({
3813
+ {
3814
+ // Multi-surface Phase 6: startSurfaceStep dispatches app / browser /
3815
+ // process descriptors (and the parallel array form). The app lane
3816
+ // FAILs per descriptor when no app session was preflighted; browser
3817
+ // descriptors ride the context's session registry via `driver`.
3818
+ actionResult = await startSurfaceStep({
3792
3819
  config: config,
3793
3820
  step: step,
3794
3821
  appSession,
3822
+ driver,
3823
+ processRegistry,
3795
3824
  platform: context?.platform ?? "",
3796
3825
  serverDeps: {
3797
3826
  startServer: async (appiumEntry, appiumHome) => {