doc-detective 4.29.0 → 4.30.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/bin/doc-detective-lsp.js +6 -0
  2. package/dist/cli.js +58 -35
  3. package/dist/cli.js.map +1 -1
  4. package/dist/common/src/schemas/schemas.json +56 -56
  5. package/dist/common/src/validate.d.ts +16 -1
  6. package/dist/common/src/validate.d.ts.map +1 -1
  7. package/dist/common/src/validate.js +113 -13
  8. package/dist/common/src/validate.js.map +1 -1
  9. package/dist/core/config.d.ts +66 -1
  10. package/dist/core/config.d.ts.map +1 -1
  11. package/dist/core/config.js +121 -68
  12. package/dist/core/config.js.map +1 -1
  13. package/dist/core/detectTests.d.ts.map +1 -1
  14. package/dist/core/detectTests.js +105 -23
  15. package/dist/core/detectTests.js.map +1 -1
  16. package/dist/core/index.d.ts.map +1 -1
  17. package/dist/core/index.js +53 -14
  18. package/dist/core/index.js.map +1 -1
  19. package/dist/core/openapi.d.ts.map +1 -1
  20. package/dist/core/openapi.js +22 -5
  21. package/dist/core/openapi.js.map +1 -1
  22. package/dist/core/resolveTests.d.ts.map +1 -1
  23. package/dist/core/resolveTests.js +33 -2
  24. package/dist/core/resolveTests.js.map +1 -1
  25. package/dist/core/tests/findStrategies.d.ts.map +1 -1
  26. package/dist/core/tests/findStrategies.js +83 -10
  27. package/dist/core/tests/findStrategies.js.map +1 -1
  28. package/dist/core/tests/saveScreenshot.d.ts.map +1 -1
  29. package/dist/core/tests/saveScreenshot.js +101 -59
  30. package/dist/core/tests/saveScreenshot.js.map +1 -1
  31. package/dist/core/utils.d.ts.map +1 -1
  32. package/dist/core/utils.js +13 -4
  33. package/dist/core/utils.js.map +1 -1
  34. package/dist/index.cjs +356 -196
  35. package/dist/lsp/command.d.ts +12 -0
  36. package/dist/lsp/command.d.ts.map +1 -0
  37. package/dist/lsp/command.js +24 -0
  38. package/dist/lsp/command.js.map +1 -0
  39. package/dist/lsp/completion.d.ts +27 -0
  40. package/dist/lsp/completion.d.ts.map +1 -0
  41. package/dist/lsp/completion.js +114 -0
  42. package/dist/lsp/completion.js.map +1 -0
  43. package/dist/lsp/diagnostics.d.ts +21 -0
  44. package/dist/lsp/diagnostics.d.ts.map +1 -0
  45. package/dist/lsp/diagnostics.js +137 -0
  46. package/dist/lsp/diagnostics.js.map +1 -0
  47. package/dist/lsp/gate.d.ts +30 -0
  48. package/dist/lsp/gate.d.ts.map +1 -0
  49. package/dist/lsp/gate.js +80 -0
  50. package/dist/lsp/gate.js.map +1 -0
  51. package/dist/lsp/hover.d.ts +9 -0
  52. package/dist/lsp/hover.d.ts.map +1 -0
  53. package/dist/lsp/hover.js +56 -0
  54. package/dist/lsp/hover.js.map +1 -0
  55. package/dist/lsp/inline.d.ts +25 -0
  56. package/dist/lsp/inline.d.ts.map +1 -0
  57. package/dist/lsp/inline.js +208 -0
  58. package/dist/lsp/inline.js.map +1 -0
  59. package/dist/lsp/json/positions.d.ts +51 -0
  60. package/dist/lsp/json/positions.d.ts.map +1 -0
  61. package/dist/lsp/json/positions.js +101 -0
  62. package/dist/lsp/json/positions.js.map +1 -0
  63. package/dist/lsp/messages.d.ts +27 -0
  64. package/dist/lsp/messages.d.ts.map +1 -0
  65. package/dist/lsp/messages.js +33 -0
  66. package/dist/lsp/messages.js.map +1 -0
  67. package/dist/lsp/model.d.ts +27 -0
  68. package/dist/lsp/model.d.ts.map +1 -0
  69. package/dist/lsp/model.js +49 -0
  70. package/dist/lsp/model.js.map +1 -0
  71. package/dist/lsp/registry.d.ts +61 -0
  72. package/dist/lsp/registry.d.ts.map +1 -0
  73. package/dist/lsp/registry.js +124 -0
  74. package/dist/lsp/registry.js.map +1 -0
  75. package/dist/lsp/server.d.ts +40 -0
  76. package/dist/lsp/server.d.ts.map +1 -0
  77. package/dist/lsp/server.js +64 -0
  78. package/dist/lsp/server.js.map +1 -0
  79. package/dist/lsp/yaml/positions.d.ts +32 -0
  80. package/dist/lsp/yaml/positions.d.ts.map +1 -0
  81. package/dist/lsp/yaml/positions.js +92 -0
  82. package/dist/lsp/yaml/positions.js.map +1 -0
  83. package/dist/utils.d.ts.map +1 -1
  84. package/dist/utils.js +30 -5
  85. package/dist/utils.js.map +1 -1
  86. package/package.json +6 -2
  87. package/scripts/postinstall.js +144 -1
@@ -19,7 +19,9 @@ function getRandomUUID() {
19
19
  return v.toString(16);
20
20
  });
21
21
  }
22
- // Configure base Ajv
22
+ // Configure base Ajv. This is the MUTATING validator: `useDefaults` fills in
23
+ // schema defaults and `coerceTypes` rewrites values in place. Both mutate the
24
+ // data they validate, which is why every validation runs against a clone.
23
25
  // @ts-expect-error - CJS/ESM interop: Ajv constructor is callable at runtime
24
26
  const ajv = new Ajv({
25
27
  strictSchema: false,
@@ -28,6 +30,29 @@ const ajv = new Ajv({
28
30
  allowUnionTypes: true,
29
31
  coerceTypes: true,
30
32
  });
33
+ // A second, NON-mutating Ajv used only to *probe* which compatible schema an
34
+ // object matches. It has `useDefaults`/`coerceTypes` OFF, so it never touches
35
+ // the data — that lets us try every candidate schema against the caller's
36
+ // object directly, with no per-candidate clone. The winning schema is then
37
+ // re-run through the mutating `ajv` on a single clone to reproduce the exact
38
+ // defaults/coercions the old code produced. Schemas compile lazily on first
39
+ // use, so this instance only pays for the candidates actually probed.
40
+ //
41
+ // It deliberately omits the `dynamicDefaultsDef`/`useDefaults` machinery below.
42
+ // A consequence: any compatible schema whose VALIDITY depends on a default —
43
+ // whether a static `useDefaults` scalar (e.g. config_v2's required
44
+ // `telemetry.send`) OR a dynamic default (e.g. a required uuid field) — will not
45
+ // match this probe and instead falls to the mutating-probe fallback in
46
+ // `validate()`. That fallback replays the exact old behavior, so this is a
47
+ // correctness-preserving performance split, not a gap.
48
+ // @ts-expect-error - CJS/ESM interop: Ajv constructor is callable at runtime
49
+ const ajvCheck = new Ajv({
50
+ strictSchema: false,
51
+ useDefaults: false,
52
+ allErrors: true,
53
+ allowUnionTypes: true,
54
+ coerceTypes: false,
55
+ });
31
56
  // Enable `uuid` dynamic default
32
57
  // @ts-expect-error - CJS/ESM interop: dynamicDefaultsDef.DEFAULTS exists at runtime
33
58
  dynamicDefaultsDef.DEFAULTS.uuid = (_args) => getRandomUUID;
@@ -38,9 +63,37 @@ addFormats(ajv);
38
63
  addKeywords(ajv);
39
64
  // @ts-expect-error - CJS/ESM interop: ajv plugin functions are callable at runtime
40
65
  addErrors(ajv);
41
- // Add all schemas from `schema` object.
66
+ // The probe instance needs the same formats/keywords/error handling so a
67
+ // candidate's validity result is identical to the mutating validator's (minus
68
+ // the default/coercion effects, which don't decide the compatible v2 schemas).
69
+ // @ts-expect-error - CJS/ESM interop: ajv plugin functions are callable at runtime
70
+ addFormats(ajvCheck);
71
+ // @ts-expect-error - CJS/ESM interop: ajv plugin functions are callable at runtime
72
+ addKeywords(ajvCheck);
73
+ // @ts-expect-error - CJS/ESM interop: ajv plugin functions are callable at runtime
74
+ addErrors(ajvCheck);
75
+ // Add all schemas from `schema` object to both instances.
42
76
  for (const [key, value] of Object.entries(schemas)) {
43
77
  ajv.addSchema(value, key);
78
+ ajvCheck.addSchema(value, key);
79
+ }
80
+ /**
81
+ * Deep-clone a value before validation so the mutating validator can apply
82
+ * defaults/coercions without touching the caller's object.
83
+ *
84
+ * Deliberately a `JSON.parse(JSON.stringify(...))` round-trip rather than
85
+ * `structuredClone`: the JSON round-trip's *normalization* is load-bearing here.
86
+ * `transformToSchemaKey` feeds `validate()` objects that carry `NaN`
87
+ * (`undefined / 100` for an absent `maxVariation`) and `undefined`-valued
88
+ * properties; the JSON clone maps `NaN`→`null` and drops `undefined` keys, and
89
+ * the established validity/coercion results depend on that. `structuredClone`
90
+ * preserves `NaN`/`undefined` verbatim, which flips those results (see ADR
91
+ * 01065). The Phase 3.2 win comes from cloning *once* for the winning pass and
92
+ * probing candidates with a non-mutating validator, not from the clone
93
+ * primitive. Centralized so the clone contract lives in one place.
94
+ */
95
+ function cloneForValidation(object) {
96
+ return JSON.parse(JSON.stringify(object));
44
97
  }
45
98
  // Define the specific schemas that have compatibility mappings
46
99
  const compatibleSchemas = {
@@ -64,6 +117,14 @@ const compatibleSchemas = {
64
117
  ],
65
118
  test_v3: ["test_v2"],
66
119
  };
120
+ /**
121
+ * Shallow-clone AJV errors so a later validation on the shared instance can't
122
+ * mutate the snapshot handed back to the caller. Only ever called inside an
123
+ * `if (check.errors)` guard, so the input is always a non-null error array.
124
+ */
125
+ function snapshotErrors(errors) {
126
+ return errors.map((error) => ({ ...error }));
127
+ }
67
128
  /**
68
129
  * Escapes special characters in a string for safe use in a regular expression pattern.
69
130
  *
@@ -86,7 +147,7 @@ function escapeRegExp(string) {
86
147
  *
87
148
  * @throws {Error} If {@link schemaKey} or {@link object} is missing.
88
149
  */
89
- export function validate({ schemaKey, object, addDefaults = true, }) {
150
+ export function validate({ schemaKey, object, addDefaults = true, structuredErrors = false, }) {
90
151
  if (!schemaKey) {
91
152
  throw new Error("Schema key is required.");
92
153
  }
@@ -98,6 +159,9 @@ export function validate({ schemaKey, object, addDefaults = true, }) {
98
159
  errors: "",
99
160
  object: object,
100
161
  };
162
+ if (structuredErrors) {
163
+ result.errorObjects = [];
164
+ }
101
165
  let validationObject;
102
166
  let check = ajv.getSchema(schemaKey);
103
167
  if (!check) {
@@ -106,37 +170,73 @@ export function validate({ schemaKey, object, addDefaults = true, }) {
106
170
  result.object = object;
107
171
  return result;
108
172
  }
109
- // Clone the object to avoid modifying the original object
110
- validationObject = JSON.parse(JSON.stringify(object));
111
- // Check if the object is compatible with the schema
173
+ // Clone the object to avoid modifying the original object. The mutating
174
+ // validator applies defaults/coercions to this clone, never the caller's.
175
+ validationObject = cloneForValidation(object);
176
+ // Check if the object is compatible with the schema (mutating pass).
112
177
  result.valid = check(validationObject);
113
178
  result.errors = "";
114
179
  if (check.errors) {
180
+ // Preserve the target-schema errors: the compatible-schema probing below
181
+ // uses a separate validator, so `check.errors` stays the target's errors
182
+ // for the no-match message.
183
+ const targetErrors = check.errors;
115
184
  // Check if the object is compatible with another schema
116
185
  const compatibleSchemasList = compatibleSchemas[schemaKey];
117
186
  if (!compatibleSchemasList) {
118
- result.errors = check.errors
187
+ result.errors = targetErrors
119
188
  .map((error) => `${error.instancePath} ${error.message} (${JSON.stringify(error.params)})`)
120
189
  .join(", ");
190
+ if (structuredErrors) {
191
+ result.errorObjects = snapshotErrors(targetErrors);
192
+ }
121
193
  result.object = object;
122
194
  result.valid = false;
123
195
  return result;
124
196
  }
125
- const matchedSchemaKey = compatibleSchemasList.find((key) => {
126
- validationObject = JSON.parse(JSON.stringify(object));
127
- const check = ajv.getSchema(key);
128
- if (check && check(validationObject))
129
- return key;
197
+ // Probe each candidate with the NON-mutating validator, run directly on the
198
+ // caller's object — no per-candidate clone. Order is preserved, so the first
199
+ // match wins exactly as the old clone-per-candidate loop did. Because
200
+ // useDefaults/coerceTypes only make Ajv MORE permissive, a non-mutating match
201
+ // is always a mutating match too, so this fast path is exact for any
202
+ // candidate whose validity doesn't depend on a default/coercion.
203
+ let matchedSchemaKey = compatibleSchemasList.find((key) => {
204
+ // Every compatible key is registered on ajvCheck (see the addSchema loop
205
+ // above), so getSchema is always defined — assert it, matching the
206
+ // `matchedCheck!` non-null assertion below.
207
+ const probe = ajvCheck.getSchema(key);
208
+ return probe(object);
130
209
  });
131
210
  if (!matchedSchemaKey) {
132
- result.errors = check.errors
211
+ // Fallback for the candidates the fast probe can miss: a schema whose
212
+ // validity DEPENDS on a default or coercion (e.g. config_v2's required
213
+ // `telemetry.send`, which carries a default). Replay the original
214
+ // clone-per-candidate MUTATING probe before declaring no match, so no input
215
+ // that validated under the old code is newly rejected. Runs only on the
216
+ // rare no-fast-match path, so the common case keeps its single-clone win.
217
+ matchedSchemaKey = compatibleSchemasList.find((key) => {
218
+ const mutatingCheck = ajv.getSchema(key);
219
+ return mutatingCheck(cloneForValidation(object));
220
+ });
221
+ }
222
+ if (!matchedSchemaKey) {
223
+ result.errors = targetErrors
133
224
  .map((error) => `${error.instancePath} ${error.message} (${JSON.stringify(error.params)})`)
134
225
  .join(", ");
226
+ if (structuredErrors) {
227
+ result.errorObjects = snapshotErrors(targetErrors);
228
+ }
135
229
  result.object = object;
136
230
  result.valid = false;
137
231
  return result;
138
232
  }
139
233
  else {
234
+ // Reproduce the old transform input: a single fresh clone run through the
235
+ // MUTATING validator for the matched schema, so its defaults/coercions are
236
+ // applied exactly as before, then transform.
237
+ validationObject = cloneForValidation(object);
238
+ const matchedCheck = ajv.getSchema(matchedSchemaKey);
239
+ matchedCheck(validationObject);
140
240
  const transformedObject = transformToSchemaKey({
141
241
  currentSchema: matchedSchemaKey,
142
242
  targetSchema: schemaKey,
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/common/src/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/common/src/validate.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export { setConfig, getAvailableApps, getBrowserDiagnostics, getEnvironment, resolveConcurrentRunners, clearAppCache, verifyAppDrivers };
1
+ export { setConfig, getAvailableApps, getBrowserDiagnostics, getEnvironment, resolveConcurrentRunners, clearAppCache, patchAppCache, verifyAppDrivers, detectInstalledBrowserDrivers };
2
2
  /**
3
3
  * A candidate browser app plus the driver binary that must be functional for
4
4
  * it to be offered. `driverPath`/`driverName` may be absent when the binary
@@ -49,6 +49,71 @@ declare function setConfig({ config }: any): Promise<any>;
49
49
  declare function resolveConcurrentRunners(config: any): number;
50
50
  declare function getEnvironment(): any;
51
51
  declare function clearAppCache(config?: any): void;
52
+ /**
53
+ * A browser the JIT preflight just installed, described by the paths/versions
54
+ * `ensureBrowserInstalled` already resolved. Enough to rebuild the same app
55
+ * descriptor `getAvailableApps` would, without re-scanning the browsers cache.
56
+ */
57
+ interface InstalledBrowserDescriptor {
58
+ name: string;
59
+ version?: string;
60
+ path?: string;
61
+ driverPath?: string;
62
+ }
63
+ /**
64
+ * Patch the module-level available-apps cache for `config`'s cache dir with the
65
+ * browsers a JIT preflight just installed, so the *next* `getAvailableApps`
66
+ * call is a cache HIT and skips a full re-probe (browser scan + driver-presence
67
+ * + `verifyDriverBinary`) — replacing the previous `clearAppCache` +
68
+ * lazy-re-probe.
69
+ *
70
+ * Correctness: driver *presence* discovery (which appium-*-driver packages are
71
+ * on disk) did not change across the install — only the browser binary arrived
72
+ * — so each descriptor is rebuilt from the install results and gated on the
73
+ * SAME two checks `getAvailableApps` uses: the matching appium-*-driver package
74
+ * present (presence) AND `verifyDriverBinary` (Layer 2, functional). A browser
75
+ * that fails either gate is left out — matching `getAvailableApps`, which would
76
+ * also exclude it — so a later cache hit reports exactly what a fresh probe
77
+ * would.
78
+ *
79
+ * Fail-open: on any error, or when there is nothing to add, we DELETE the cache
80
+ * entry so the next `getAvailableApps` re-probes from scratch — never a stale
81
+ * or partial hit. `verify`/`detectDrivers` are injectable for hermetic tests.
82
+ */
83
+ declare function patchAppCache(config: any, installed: InstalledBrowserDescriptor[], deps?: {
84
+ verify?: (driverName: string, driverPath: string) => Promise<{
85
+ ok: boolean;
86
+ error?: string;
87
+ }>;
88
+ detectDrivers?: (config: any) => {
89
+ chromium: boolean;
90
+ gecko: boolean;
91
+ safari: boolean;
92
+ };
93
+ }): Promise<void>;
94
+ /**
95
+ * Which managed Appium browser drivers are present on disk, by package name.
96
+ *
97
+ * Presence discovery is a filesystem question — the same `resolveHeavyDepPath`
98
+ * check `getBrowserDiagnostics` (and `ensureRuntimeInstalled`) already use — so
99
+ * we no longer spawn `node <appium> driver list` (~17s by its own comment) to
100
+ * learn what a package lookup answers instantly. Each key maps to exactly the
101
+ * driver the old `appium driver list` table-regex recognized:
102
+ * chromium → appium-chromium-driver (was /chromium.*installed \(npm\)/)
103
+ * gecko → appium-geckodriver (was /gecko.*installed \(npm\)/)
104
+ * safari → appium-safari-driver (was /safari.*installed \(npm\)/)
105
+ *
106
+ * IMPORTANT: presence (package on disk) is necessary but NOT sufficient. The
107
+ * functional Layer 2 gate (`verifyDriverBinary`, run inside `verifyAppDrivers`)
108
+ * still executes each driver's binary before a browser is reported available —
109
+ * only the *presence-discovery* mechanism changed here, never the functional
110
+ * check. `isInstalled` is injectable so this maps hermetically in unit tests.
111
+ */
112
+ declare function detectInstalledBrowserDrivers(config: any, isInstalled?: (name: string) => boolean): {
113
+ chromium: boolean;
114
+ gecko: boolean;
115
+ safari: boolean;
116
+ };
52
117
  declare function getAvailableApps({ config }: any): Promise<any[]>;
53
118
  interface BrowserComponent {
54
119
  label: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,wBAAwB,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AAEzI;;;;;GAKG;AACH,UAAU,mBAAmB;IAC3B,GAAG,EAAE,GAAG,CAAC;IACT,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,iBAAe,gBAAgB,CAC7B,WAAW,EAAE,mBAAmB,EAAE,EAClC,EACE,MAAM,EACN,MAAM,GACP,EAAE;IACD,MAAM,EAAE,CACN,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,KACf,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD,GACA,OAAO,CAAC,GAAG,EAAE,CAAC,CAsBhB;AA2TD;;;;;;GAMG;AACH,iBAAe,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,gBAgMvC;AAED;;;;;;;;;;;GAWG;AACH,iBAAS,wBAAwB,CAAC,MAAM,EAAE,GAAG,UAU5C;AAyCD,iBAAS,cAAc,QAOtB;AAoBD,iBAAS,aAAa,CAAC,MAAM,CAAC,EAAE,GAAG,QAMlC;AA6HD,iBAAe,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,kBAiH9C;AA0BD,UAAU,gBAAgB;IAGxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAEtC,SAAS,EAAE,OAAO,CAAC;IAGnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA4DD,iBAAe,qBAAqB,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC;IAC7D,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC,CAiGD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ import { setAppiumHome } from "./appium.js";
11
11
  import { loadDescription } from "./openapi.js";
12
12
  import { fileURLToPath } from "node:url";
13
13
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
- export { setConfig, getAvailableApps, getBrowserDiagnostics, getEnvironment, resolveConcurrentRunners, clearAppCache, verifyAppDrivers };
14
+ export { setConfig, getAvailableApps, getBrowserDiagnostics, getEnvironment, resolveConcurrentRunners, clearAppCache, patchAppCache, verifyAppDrivers, detectInstalledBrowserDrivers };
15
15
  /**
16
16
  * Layer 2 of the driver-resilience strategy: gate each candidate browser on
17
17
  * its driver *executing*, not merely existing on disk. A present-but-broken
@@ -506,9 +506,9 @@ async function setConfig({ config }) {
506
506
  // the runner paths in tests.ts re-discover apps themselves via
507
507
  // getAvailableApps rather than reading this field back — so skipping the
508
508
  // detection on a dry run avoids the @puppeteer/browsers load, the
509
- // browser-cache scan, and the unbounded `appium driver list` spawn (the work
510
- // that pushes dryRun.test.js past its mocha timeout on a starved
511
- // windows+node22 runner) with no effect on resolved output or execution.
509
+ // browser-cache scan, and the driver-presence probing (the work that pushes
510
+ // dryRun.test.js past its mocha timeout on a starved windows+node22 runner)
511
+ // with no effect on resolved output or execution.
512
512
  config.environment.apps = config.dryRun ? [] : await getAvailableApps({ config });
513
513
  // Resolve concurrent runners configuration
514
514
  config.concurrentRunners = resolveConcurrentRunners(config);
@@ -584,9 +584,10 @@ function getEnvironment() {
584
584
  // config.cacheDir or DOC_DETECTIVE_CACHE_DIR), and lazy-install can
585
585
  // materialize new browsers between calls — so a single process-global
586
586
  // slot would (a) cross-contaminate different cacheDir values and (b)
587
- // return stale "no browsers" results after a JIT pre-flight install.
588
- // Avoids redundant `appium driver list` calls (~17s each) and browser
589
- // scanning for repeat lookups against the same cache dir.
587
+ // return stale "no browsers" results after a JIT pre-flight install (which now
588
+ // patches this cache in place see patchAppCache rather than clearing it).
589
+ // Avoids redundant browser-cache scans and driver-presence probing for repeat
590
+ // lookups against the same cache dir.
590
591
  const cachedAppsByDir = new Map();
591
592
  function cacheKeyFor(config) {
592
593
  // Reuse `getBrowsersDir` so the key respects every override the rest
@@ -601,14 +602,108 @@ function clearAppCache(config) {
601
602
  }
602
603
  cachedAppsByDir.delete(cacheKeyFor(config));
603
604
  }
605
+ /**
606
+ * Patch the module-level available-apps cache for `config`'s cache dir with the
607
+ * browsers a JIT preflight just installed, so the *next* `getAvailableApps`
608
+ * call is a cache HIT and skips a full re-probe (browser scan + driver-presence
609
+ * + `verifyDriverBinary`) — replacing the previous `clearAppCache` +
610
+ * lazy-re-probe.
611
+ *
612
+ * Correctness: driver *presence* discovery (which appium-*-driver packages are
613
+ * on disk) did not change across the install — only the browser binary arrived
614
+ * — so each descriptor is rebuilt from the install results and gated on the
615
+ * SAME two checks `getAvailableApps` uses: the matching appium-*-driver package
616
+ * present (presence) AND `verifyDriverBinary` (Layer 2, functional). A browser
617
+ * that fails either gate is left out — matching `getAvailableApps`, which would
618
+ * also exclude it — so a later cache hit reports exactly what a fresh probe
619
+ * would.
620
+ *
621
+ * Fail-open: on any error, or when there is nothing to add, we DELETE the cache
622
+ * entry so the next `getAvailableApps` re-probes from scratch — never a stale
623
+ * or partial hit. `verify`/`detectDrivers` are injectable for hermetic tests.
624
+ */
625
+ async function patchAppCache(config, installed, deps = {}) {
626
+ const key = cacheKeyFor(config);
627
+ try {
628
+ const verify = deps.verify ?? verifyDriverBinary;
629
+ const drivers = (deps.detectDrivers ?? detectInstalledBrowserDrivers)(config);
630
+ const descriptors = [];
631
+ for (const b of installed ?? []) {
632
+ if (b.name === "chrome" && b.path && b.driverPath && drivers.chromium) {
633
+ descriptors.push({
634
+ app: {
635
+ name: "chrome",
636
+ version: b.version,
637
+ path: b.path,
638
+ driver: b.driverPath,
639
+ },
640
+ driverName: "chromedriver",
641
+ driverPath: b.driverPath,
642
+ });
643
+ }
644
+ else if (b.name === "firefox" && b.path && drivers.gecko) {
645
+ // Mirror getAvailableApps: firefox passes through even without a
646
+ // resolvable driver path (Layer 4 runtime fallback), but verifies it
647
+ // when present.
648
+ descriptors.push({
649
+ app: { name: "firefox", version: b.version, path: b.path },
650
+ driverName: b.driverPath ? "geckodriver" : undefined,
651
+ driverPath: b.driverPath,
652
+ });
653
+ }
654
+ }
655
+ if (descriptors.length === 0) {
656
+ // Nothing rebuildable — invalidate so the next call re-probes.
657
+ cachedAppsByDir.delete(key);
658
+ return;
659
+ }
660
+ const verifiedApps = await verifyAppDrivers(descriptors, {
661
+ verify: (driverName, driverPath) => verify(driverName, driverPath),
662
+ logger: (msg, level) => log(config, level ?? "warning", msg),
663
+ });
664
+ const existing = cachedAppsByDir.get(key) ?? [];
665
+ const existingNames = new Set(existing.map((a) => a?.name));
666
+ const additions = verifiedApps.filter((a) => !existingNames.has(a?.name));
667
+ cachedAppsByDir.set(key, [...existing, ...additions]);
668
+ }
669
+ catch {
670
+ // Fail-open: never leave a stale/incorrect hit behind.
671
+ cachedAppsByDir.delete(key);
672
+ }
673
+ }
674
+ /**
675
+ * Which managed Appium browser drivers are present on disk, by package name.
676
+ *
677
+ * Presence discovery is a filesystem question — the same `resolveHeavyDepPath`
678
+ * check `getBrowserDiagnostics` (and `ensureRuntimeInstalled`) already use — so
679
+ * we no longer spawn `node <appium> driver list` (~17s by its own comment) to
680
+ * learn what a package lookup answers instantly. Each key maps to exactly the
681
+ * driver the old `appium driver list` table-regex recognized:
682
+ * chromium → appium-chromium-driver (was /chromium.*installed \(npm\)/)
683
+ * gecko → appium-geckodriver (was /gecko.*installed \(npm\)/)
684
+ * safari → appium-safari-driver (was /safari.*installed \(npm\)/)
685
+ *
686
+ * IMPORTANT: presence (package on disk) is necessary but NOT sufficient. The
687
+ * functional Layer 2 gate (`verifyDriverBinary`, run inside `verifyAppDrivers`)
688
+ * still executes each driver's binary before a browser is reported available —
689
+ * only the *presence-discovery* mechanism changed here, never the functional
690
+ * check. `isInstalled` is injectable so this maps hermetically in unit tests.
691
+ */
692
+ function detectInstalledBrowserDrivers(config, isInstalled = (name) => Boolean(resolveHeavyDepPath(name, { cacheDir: config?.cacheDir }))) {
693
+ return {
694
+ chromium: isInstalled("appium-chromium-driver"),
695
+ gecko: isInstalled("appium-geckodriver"),
696
+ safari: isInstalled("appium-safari-driver"),
697
+ };
698
+ }
604
699
  // Live browser/driver probing for `getAvailableApps` — the runtime gate
605
700
  // that decides whether a real run can launch a browser right now.
606
701
  //
607
- // Returns the raw `@puppeteer/browsers` install list and the combined
608
- // `appium driver list` output, plus a `browserDetectionFailed` flag set
609
- // only on an *unexpected* failure (the dep is present but fails to
610
- // load/scan) so callers can skip caching. A simply-absent dep (lean
611
- // install) is the normal "nothing installed" case, not a failure.
702
+ // Returns the raw `@puppeteer/browsers` install list and the set of managed
703
+ // Appium browser drivers present on disk (chromium/gecko/safari), plus a
704
+ // `browserDetectionFailed` flag set only on an *unexpected* failure (the dep is
705
+ // present but fails to load/scan) so callers can skip caching. A simply-absent
706
+ // dep (lean install) is the normal "nothing installed" case, not a failure.
612
707
  //
613
708
  // Note: the diagnostic dump uses `getBrowserDiagnostics` instead, which
614
709
  // reads doc-detective's `installed.json` record so it reports the same
@@ -619,7 +714,7 @@ async function probeBrowserEnvironment({ config, browsersDir, }) {
619
714
  process.chdir(path.join(__dirname, "../.."));
620
715
  let installedBrowsers = [];
621
716
  let browserDetectionFailed = false;
622
- let appiumDriverOutput = "";
717
+ let installedDrivers = { chromium: false, gecko: false, safari: false };
623
718
  try {
624
719
  // Detect installed browsers read-only: autoInstall=false so config
625
720
  // resolution never triggers a heavy @puppeteer/browsers install (which
@@ -649,60 +744,17 @@ async function probeBrowserEnvironment({ config, browsersDir, }) {
649
744
  installedBrowsers = [];
650
745
  }
651
746
  }
652
- // Resolve appium's JS entry directly (shim first, then cache)
653
- // and spawn `node <entry> driver list`. Bypasses `.cmd` shims,
654
- // `npm exec`, and shell:true the same pattern as the Appium
655
- // spawns in src/core/tests.ts.
656
- const appiumEntry = resolveHeavyDepPath("appium", {
657
- cacheDir: config?.cacheDir,
658
- });
659
- const installedAppiumDrivers = await new Promise((resolve) => {
660
- if (!appiumEntry) {
661
- resolve({
662
- stdout: "",
663
- stderr: "appium is not installed; driver list unavailable",
664
- exitCode: 1,
665
- });
666
- return;
667
- }
668
- const child = spawnChild(process.execPath, [appiumEntry, "driver", "list"], { env: process.env });
669
- let stdout = "";
670
- let stderr = "";
671
- child.stdout?.on("data", (c) => {
672
- stdout += typeof c === "string" ? c : c.toString("utf8");
673
- });
674
- child.stderr?.on("data", (c) => {
675
- stderr += typeof c === "string" ? c : c.toString("utf8");
676
- });
677
- // Treat a spawn error (ENOENT, EACCES) as exitCode 1 with the
678
- // message in stderr so the downstream driver-presence regex
679
- // checks degrade to "no drivers detected" rather than aborting
680
- // the run.
681
- child.on("error", (err) => {
682
- resolve({
683
- stdout: stdout.replace(/\n$/, ""),
684
- stderr: (stderr + String(err)).replace(/\n$/, ""),
685
- exitCode: 1,
686
- });
687
- });
688
- child.on("close", (code) => {
689
- resolve({
690
- stdout: stdout.replace(/\n$/, ""),
691
- stderr: stderr.replace(/\n$/, ""),
692
- exitCode: code ?? 1,
693
- });
694
- });
695
- });
696
- // `appium driver list` writes its formatted table to stdout; combine both
697
- // streams so detection works regardless of which version uses which stream.
698
- appiumDriverOutput =
699
- installedAppiumDrivers.stdout + "\n" + installedAppiumDrivers.stderr;
747
+ // Managed Appium browser-driver presence, resolved directly from disk
748
+ // (no child process). This replaces the old `node <appium> driver list`
749
+ // spawn + table-regex parse: the drivers are npm packages, so a
750
+ // `resolveHeavyDepPath` lookup answers "installed?" instantly and offline.
751
+ installedDrivers = detectInstalledBrowserDrivers(config);
700
752
  }
701
753
  finally {
702
754
  // Always restore the original working directory
703
755
  process.chdir(cwd);
704
756
  }
705
- return { installedBrowsers, appiumDriverOutput, browserDetectionFailed };
757
+ return { installedBrowsers, installedDrivers, browserDetectionFailed };
706
758
  }
707
759
  async function getAvailableApps({ config }) {
708
760
  // Resolve the browsers cache dir *before* chdir-ing. `getBrowsersDir`'s
@@ -717,20 +769,21 @@ async function getAvailableApps({ config }) {
717
769
  const hit = cachedAppsByDir.get(key);
718
770
  if (hit)
719
771
  return hit;
720
- const { installedBrowsers, appiumDriverOutput, browserDetectionFailed } = await probeBrowserEnvironment({ config, browsersDir });
772
+ const { installedBrowsers, installedDrivers, browserDetectionFailed } = await probeBrowserEnvironment({ config, browsersDir });
721
773
  // Note: Edge/Microsoft Edge detection is intentionally excluded
722
774
  // Only Chrome, Firefox, and Safari are supported browsers.
723
775
  //
724
776
  // Build candidate apps with the driver binary each needs, then gate them on
725
777
  // the driver actually executing (Layer 2). Presence in `installed.json` /
726
- // `appium driver list` is necessary but not sufficient — a partially
727
- // downloaded driver passes presence checks yet can't start a session.
778
+ // the appium-*-driver package on disk is necessary but not sufficient — a
779
+ // partially downloaded driver passes presence checks yet can't start a
780
+ // session.
728
781
  const descriptors = [];
729
782
  // Detect Chrome
730
783
  const chrome = installedBrowsers.find((browser) => browser.browser === "chrome");
731
784
  const chromeVersion = chrome?.buildId;
732
785
  const chromedriver = installedBrowsers.find((browser) => browser.browser === "chromedriver");
733
- const appiumChromium = appiumDriverOutput.match(/\n.*chromium.*installed \(npm\).*\n/);
786
+ const appiumChromium = installedDrivers.chromium;
734
787
  if (chrome && chromedriver && appiumChromium) {
735
788
  descriptors.push({
736
789
  app: {
@@ -745,7 +798,7 @@ async function getAvailableApps({ config }) {
745
798
  }
746
799
  // Detect Firefox
747
800
  const firefox = installedBrowsers.find((browser) => browser.browser === "firefox");
748
- const appiumFirefox = appiumDriverOutput.match(/\n.*gecko.*installed \(npm\).*\n/);
801
+ const appiumFirefox = installedDrivers.gecko;
749
802
  if (firefox && appiumFirefox) {
750
803
  // Resolve the geckodriver binary so Layer 2 can execute it. Best-effort:
751
804
  // if it can't be located cheaply, the descriptor carries no driverPath
@@ -767,7 +820,7 @@ async function getAvailableApps({ config }) {
767
820
  const currentPlatform = config?.environment?.platform ?? getEnvironment().platform;
768
821
  if (currentPlatform === "mac") {
769
822
  const safariVersion = await spawnCommand("defaults read /Applications/Safari.app/Contents/Info.plist CFBundleShortVersionString");
770
- const appiumSafari = appiumDriverOutput.match(/\n.*safari.*installed \(npm\).*\n/);
823
+ const appiumSafari = installedDrivers.safari;
771
824
  if (safariVersion.exitCode === 0 && appiumSafari) {
772
825
  // safaridriver ships with macOS at a fixed path; verifying it executes
773
826
  // confirms the binary runs. Note this does NOT prove "Allow Remote