doc-detective 4.41.6 → 4.42.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 (155) hide show
  1. package/README.md +3 -4
  2. package/bin/doc-detective-lsp.js +2 -0
  3. package/dist/agents/adapters/claude-code.js +1 -1
  4. package/dist/agents/adapters/claude-code.js.map +1 -1
  5. package/dist/agents/adapters/copilot-cli.js +2 -2
  6. package/dist/agents/adapters/copilot-cli.js.map +1 -1
  7. package/dist/agents/adapters/gemini-cli.js +1 -1
  8. package/dist/agents/adapters/gemini-cli.js.map +1 -1
  9. package/dist/agents/adapters/qwen-code.js +1 -1
  10. package/dist/agents/adapters/qwen-code.js.map +1 -1
  11. package/dist/cli.js +27 -6
  12. package/dist/cli.js.map +1 -1
  13. package/dist/common/src/schemas/schemas.json +2 -2
  14. package/dist/common/src/schemas/schemasReferenced.json +448 -294
  15. package/dist/common/src/schemas/validators.cjs +140 -124
  16. package/dist/common/src/schemas/validatorsCheck.cjs +1 -1
  17. package/dist/common/src/types/generated/annotate_v3.d.ts +12 -12
  18. package/dist/common/src/types/generated/annotate_v3.d.ts.map +1 -1
  19. package/dist/common/src/types/generated/annotation_v3.d.ts +6 -6
  20. package/dist/common/src/types/generated/annotation_v3.d.ts.map +1 -1
  21. package/dist/common/src/types/generated/checkLink_v3.d.ts +4 -0
  22. package/dist/common/src/types/generated/checkLink_v3.d.ts.map +1 -1
  23. package/dist/common/src/types/generated/click_v3.d.ts +2 -2
  24. package/dist/common/src/types/generated/click_v3.d.ts.map +1 -1
  25. package/dist/common/src/types/generated/config_v3.d.ts +260 -108
  26. package/dist/common/src/types/generated/config_v3.d.ts.map +1 -1
  27. package/dist/common/src/types/generated/context_v3.d.ts +10 -2
  28. package/dist/common/src/types/generated/context_v3.d.ts.map +1 -1
  29. package/dist/common/src/types/generated/dragAndDrop_v3.d.ts +2 -2
  30. package/dist/common/src/types/generated/dragAndDrop_v3.d.ts.map +1 -1
  31. package/dist/common/src/types/generated/find_v3.d.ts +6 -6
  32. package/dist/common/src/types/generated/find_v3.d.ts.map +1 -1
  33. package/dist/common/src/types/generated/goTo_v3.d.ts +1 -1
  34. package/dist/common/src/types/generated/goTo_v3.d.ts.map +1 -1
  35. package/dist/common/src/types/generated/httpRequest_v3.d.ts +2 -2
  36. package/dist/common/src/types/generated/httpRequest_v3.d.ts.map +1 -1
  37. package/dist/common/src/types/generated/record_v3.d.ts +5 -5
  38. package/dist/common/src/types/generated/record_v3.d.ts.map +1 -1
  39. package/dist/common/src/types/generated/report_v3.d.ts +529 -207
  40. package/dist/common/src/types/generated/report_v3.d.ts.map +1 -1
  41. package/dist/common/src/types/generated/resolvedTests_v3.d.ts +754 -314
  42. package/dist/common/src/types/generated/resolvedTests_v3.d.ts.map +1 -1
  43. package/dist/common/src/types/generated/runCode_v3.d.ts +11 -2
  44. package/dist/common/src/types/generated/runCode_v3.d.ts.map +1 -1
  45. package/dist/common/src/types/generated/runShell_v3.d.ts +11 -2
  46. package/dist/common/src/types/generated/runShell_v3.d.ts.map +1 -1
  47. package/dist/common/src/types/generated/screenshot_v3.d.ts +12 -12
  48. package/dist/common/src/types/generated/screenshot_v3.d.ts.map +1 -1
  49. package/dist/common/src/types/generated/spec_v3.d.ts +494 -206
  50. package/dist/common/src/types/generated/spec_v3.d.ts.map +1 -1
  51. package/dist/common/src/types/generated/startSurface_v3.d.ts +24 -6
  52. package/dist/common/src/types/generated/startSurface_v3.d.ts.map +1 -1
  53. package/dist/common/src/types/generated/step_v3.d.ts +223 -100
  54. package/dist/common/src/types/generated/step_v3.d.ts.map +1 -1
  55. package/dist/common/src/types/generated/test_v3.d.ts +482 -202
  56. package/dist/common/src/types/generated/test_v3.d.ts.map +1 -1
  57. package/dist/common/src/types/generated/type_v3.d.ts +3 -3
  58. package/dist/common/src/types/generated/type_v3.d.ts.map +1 -1
  59. package/dist/common/src/types/generated/waitUntil_v3.d.ts +2 -2
  60. package/dist/common/src/types/generated/waitUntil_v3.d.ts.map +1 -1
  61. package/dist/common/src/types/generated/wait_v3.d.ts +2 -3
  62. package/dist/common/src/types/generated/wait_v3.d.ts.map +1 -1
  63. package/dist/core/config.d.ts.map +1 -1
  64. package/dist/core/config.js +6 -4
  65. package/dist/core/config.js.map +1 -1
  66. package/dist/core/files.d.ts +18 -3
  67. package/dist/core/files.d.ts.map +1 -1
  68. package/dist/core/files.js +58 -18
  69. package/dist/core/files.js.map +1 -1
  70. package/dist/core/index.d.ts.map +1 -1
  71. package/dist/core/index.js +16 -0
  72. package/dist/core/index.js.map +1 -1
  73. package/dist/core/integrations/index.d.ts +2 -1
  74. package/dist/core/integrations/index.d.ts.map +1 -1
  75. package/dist/core/integrations/index.js +15 -5
  76. package/dist/core/integrations/index.js.map +1 -1
  77. package/dist/core/openapi.d.ts.map +1 -1
  78. package/dist/core/openapi.js +122 -6
  79. package/dist/core/openapi.js.map +1 -1
  80. package/dist/core/ptyWatchdog.d.ts.map +1 -1
  81. package/dist/core/ptyWatchdog.js +6 -3
  82. package/dist/core/ptyWatchdog.js.map +1 -1
  83. package/dist/core/resolveTests.d.ts.map +1 -1
  84. package/dist/core/resolveTests.js +5 -3
  85. package/dist/core/resolveTests.js.map +1 -1
  86. package/dist/core/telem.d.ts.map +1 -1
  87. package/dist/core/telem.js +5 -7
  88. package/dist/core/telem.js.map +1 -1
  89. package/dist/core/tests/checkLink.d.ts.map +1 -1
  90. package/dist/core/tests/checkLink.js +12 -7
  91. package/dist/core/tests/checkLink.js.map +1 -1
  92. package/dist/core/tests/click.d.ts.map +1 -1
  93. package/dist/core/tests/click.js +7 -0
  94. package/dist/core/tests/click.js.map +1 -1
  95. package/dist/core/tests/findElement.d.ts.map +1 -1
  96. package/dist/core/tests/findElement.js +3 -2
  97. package/dist/core/tests/findElement.js.map +1 -1
  98. package/dist/core/tests/goTo.d.ts.map +1 -1
  99. package/dist/core/tests/goTo.js +2 -1
  100. package/dist/core/tests/goTo.js.map +1 -1
  101. package/dist/core/tests/httpRequest.d.ts.map +1 -1
  102. package/dist/core/tests/httpRequest.js +4 -5
  103. package/dist/core/tests/httpRequest.js.map +1 -1
  104. package/dist/core/tests/processSurface.d.ts +4 -1
  105. package/dist/core/tests/processSurface.d.ts.map +1 -1
  106. package/dist/core/tests/processSurface.js +3 -0
  107. package/dist/core/tests/processSurface.js.map +1 -1
  108. package/dist/core/tests/saveScreenshot.d.ts.map +1 -1
  109. package/dist/core/tests/saveScreenshot.js +8 -3
  110. package/dist/core/tests/saveScreenshot.js.map +1 -1
  111. package/dist/core/tests/startRecording.d.ts.map +1 -1
  112. package/dist/core/tests/startRecording.js +2 -1
  113. package/dist/core/tests/startRecording.js.map +1 -1
  114. package/dist/core/tests/stopRecording.d.ts.map +1 -1
  115. package/dist/core/tests/stopRecording.js +2 -1
  116. package/dist/core/tests/stopRecording.js.map +1 -1
  117. package/dist/core/tests/timing.d.ts +4 -0
  118. package/dist/core/tests/timing.d.ts.map +1 -0
  119. package/dist/core/tests/timing.js +8 -0
  120. package/dist/core/tests/timing.js.map +1 -0
  121. package/dist/core/tests.d.ts +15 -0
  122. package/dist/core/tests.d.ts.map +1 -1
  123. package/dist/core/tests.js +77 -30
  124. package/dist/core/tests.js.map +1 -1
  125. package/dist/core/utils.d.ts +42 -2
  126. package/dist/core/utils.d.ts.map +1 -1
  127. package/dist/core/utils.js +281 -89
  128. package/dist/core/utils.js.map +1 -1
  129. package/dist/debug/index.d.ts.map +1 -1
  130. package/dist/debug/index.js +8 -36
  131. package/dist/debug/index.js.map +1 -1
  132. package/dist/hints/hints.js +2 -2
  133. package/dist/hints/hints.js.map +1 -1
  134. package/dist/index.cjs +684 -235
  135. package/dist/reporters/htmlReporter.js +1 -1
  136. package/dist/runtime/cacheDir.d.ts.map +1 -1
  137. package/dist/runtime/cacheDir.js +6 -11
  138. package/dist/runtime/cacheDir.js.map +1 -1
  139. package/dist/runtime/heavyDeps.d.ts +12 -0
  140. package/dist/runtime/heavyDeps.d.ts.map +1 -1
  141. package/dist/runtime/heavyDeps.js +31 -7
  142. package/dist/runtime/heavyDeps.js.map +1 -1
  143. package/dist/runtime/selfUpdate.d.ts +3 -3
  144. package/dist/runtime/selfUpdate.d.ts.map +1 -1
  145. package/dist/runtime/selfUpdate.js +34 -5
  146. package/dist/runtime/selfUpdate.js.map +1 -1
  147. package/dist/upgradeNotice.d.ts +41 -0
  148. package/dist/upgradeNotice.d.ts.map +1 -0
  149. package/dist/upgradeNotice.js +356 -0
  150. package/dist/upgradeNotice.js.map +1 -0
  151. package/dist/utils.d.ts.map +1 -1
  152. package/dist/utils.js +17 -8
  153. package/dist/utils.js.map +1 -1
  154. package/package.json +2 -2
  155. package/scripts/postinstall.js +1 -1
@@ -0,0 +1,356 @@
1
+ // Warnings on 4.x about what 5.0 changes or removes (ADR 01147). They go to
2
+ // stderr, so stdout stays clean for --dry-run JSON and LSP traffic. Keep this
3
+ // module free of heavy imports: the bare bins load it too.
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
+ const UPGRADE_GUIDE_URL = "https://docs.doc-detective.com/docs/ci/upgrade-to-v5";
7
+ const REMOVED_BINS = {
8
+ "doc-detective-lsp": "Use `doc-detective lsp --stdio`, which works today.",
9
+ };
10
+ // Each exact message prints once per process. Spec rows name their file, so a
11
+ // later `runTests` call in the same process still warns about a new file, but
12
+ // not about the same issue in a file it already warned about. Every caller
13
+ // shares this set, including programmatic `runTests` calls.
14
+ const warned = new Set();
15
+ // The Action's legacy path runs v4 on purpose and has its own notice.
16
+ function isAction() {
17
+ try {
18
+ return JSON.parse(process.env.DOC_DETECTIVE_META || "{}").dist_interface === "github-actions";
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ export function warnUpgrade(messages, logLevel) {
25
+ if (logLevel === "silent" || isAction())
26
+ return;
27
+ for (const message of messages) {
28
+ if (warned.has(message))
29
+ continue;
30
+ warned.add(message);
31
+ console.error(`Warning: ${message} See ${UPGRADE_GUIDE_URL}`);
32
+ }
33
+ }
34
+ export function warnRemovedBin(bin) {
35
+ warnUpgrade([`\`${bin}\` is removed in Doc Detective 5.0. ${REMOVED_BINS[bin]}`]);
36
+ }
37
+ /**
38
+ * Warnings for a command line. `commands` is yargs' parsed `_`; `rawArgs` is the
39
+ * unparsed argv, because yargs fills in both `-a` and `--agent` and can't tell
40
+ * which one the user typed.
41
+ */
42
+ export function commandWarnings(commands, rawArgs) {
43
+ const messages = [];
44
+ const installAgents = commands[0] === "install-agents";
45
+ if (installAgents) {
46
+ messages.push("`install-agents` is removed in Doc Detective 5.0. Use `install agents`, which works today.");
47
+ }
48
+ if ((installAgents || (commands[0] === "install" && commands[1] === "agents")) &&
49
+ rawArgs.some((arg) => /^-[^-]*[as]/.test(arg))) {
50
+ messages.push("`-a` and `-s` are removed in Doc Detective 5.0. Use `--agent` and `--scope`, which work today.");
51
+ }
52
+ if (commands[0] === "install" && rawArgs.some((arg) => arg === "--silent" || arg.startsWith("--silent="))) {
53
+ messages.push("`install --silent` is removed in Doc Detective 5.0. Use `--quiet`, which works today.");
54
+ }
55
+ return messages;
56
+ }
57
+ /**
58
+ * Whether an `output` setting names a folder. 4.x treats any path without a
59
+ * file extension as a folder and creates it. `raw` is the value as written,
60
+ * since resolving it strips a trailing slash. Unset means the default, which
61
+ * the user didn't choose.
62
+ */
63
+ export function namesFolder(raw, resolved) {
64
+ if (typeof raw !== "string" || raw.length === 0)
65
+ return false;
66
+ if (/[\\/]$/.test(raw) || !path.extname(resolved))
67
+ return true;
68
+ try {
69
+ return fs.statSync(resolved).isDirectory();
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ export function outputWarnings(raw, resolved) {
76
+ return namesFolder(raw, resolved)
77
+ ? [
78
+ `In Doc Detective 5.0, \`--output\` and \`output\` name the results file. Use \`--output-dir\` for a folder when you upgrade. Your output path ('${raw}') names a folder, and 4.x treats a path without a file extension as a folder.`,
79
+ ]
80
+ : [];
81
+ }
82
+ export function concurrentRunnersWarnings(value) {
83
+ return value === ""
84
+ ? [
85
+ "`--concurrent-runners` with no value is removed in Doc Detective 5.0. Use `--concurrent-runners true`, which works today.",
86
+ ]
87
+ : [];
88
+ }
89
+ /** `-r` with several values, and repeated `-t` or `-s`, from yargs' parsed args. */
90
+ export function flagWarnings(args) {
91
+ const messages = [];
92
+ // `reporters` is declared with `array: true` in buildYargs (src/utils.ts), so
93
+ // both `-r a b` and `-r a -r b` arrive as an array of several values.
94
+ if (Array.isArray(args.reporters) && args.reporters.length > 1) {
95
+ // 4.x reads `-r terminal,html` as one unknown reporter, so that form has to wait.
96
+ messages.push("`--reporters` takes one comma-separated value in Doc Detective 5.0, like `-r terminal,html`, which 4.x doesn't read. Switch when you upgrade, or set `reporters` in your config file, which works on both.");
97
+ }
98
+ for (const flag of ["test", "spec"]) {
99
+ const values = args[flag];
100
+ // Relies on yargs collecting a repeated `type: "string"` option (`-t a -t b`) into an
101
+ // array; the "setup rows prints them from the CLI" test guards that.
102
+ if (Array.isArray(values) && values.length > 1) {
103
+ messages.push(`\`--${flag}\` is given more than once, so 4.x ignores it and Doc Detective 5.0 exits with a usage error. Give one comma-separated value, \`--${flag} ${values.join(",")}\`, which works today.`);
104
+ }
105
+ }
106
+ return messages;
107
+ }
108
+ // How 4.x reads each boolean env var. 5.0 reads them all as on for
109
+ // 1/true/yes/on and off for 0/false/no/off. `on` and `off` are the settings
110
+ // that mean the same on both.
111
+ const BOOLEAN_ENV = {
112
+ DOC_DETECTIVE_DEBUG: { v4: (v) => /^(1|true|yes)$/i.test(v.trim()) },
113
+ DOC_DETECTIVE_SKIP_AUTO_UPDATE: { v4: Boolean },
114
+ DOC_DETECTIVE_SKIP_AGENT_PROMPT: { v4: Boolean },
115
+ DOC_DETECTIVE_RUNTIME_DEBUG: { v4: (v) => v === "1" },
116
+ DOC_DETECTIVE_NO_ANDROID_AUTOINSTALL: { v4: (v) => v === "1" },
117
+ DOC_DETECTIVE_REUSE_APPIUM: { v4: (v) => v === "true" || v === "1" },
118
+ DOC_DETECTIVE_ALLOW_LOCAL_URLS: { v4: (v) => v === "true", on: "true" },
119
+ DOC_DETECTIVE_AUTOINSTALL: {
120
+ v4: (v) => !["0", "false", "no", "off"].includes(v.trim().toLowerCase()),
121
+ off: "`0`",
122
+ },
123
+ };
124
+ function readsAs5(value) {
125
+ const v = value.trim().toLowerCase();
126
+ if (["1", "true", "yes", "on"].includes(v))
127
+ return true;
128
+ if (["", "0", "false", "no", "off"].includes(v))
129
+ return false;
130
+ return undefined;
131
+ }
132
+ /** The legacy `DOC_DETECTIVE` env var as an object, or `{}` when it's unset or not JSON. */
133
+ export function legacyEnv(env) {
134
+ try {
135
+ const parsed = JSON.parse(env.DOC_DETECTIVE || "{}");
136
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
137
+ }
138
+ catch {
139
+ return {};
140
+ }
141
+ }
142
+ /** The legacy `DOC_DETECTIVE` env var, and boolean env vars 5.0 reads differently. */
143
+ export function envWarnings(env, config) {
144
+ const messages = [];
145
+ const legacy = legacyEnv(env);
146
+ if (legacy.config && typeof legacy.config === "object") {
147
+ messages.push("`DOC_DETECTIVE` is deprecated in Doc Detective 5.0, and its `config` object merges below `DOC_DETECTIVE_CONFIG` and flags instead of above them. Move it to `DOC_DETECTIVE_CONFIG`, which works today.");
148
+ }
149
+ // The official images set this value themselves, and their 5.0 builds allow
150
+ // unsafe steps in config, so only other images need to act.
151
+ const officialImage = /^docdetective\/docdetective:/.test(String(legacy.container));
152
+ // Deliberately strict: an explicit `false` has already opted out, so it needs no migration.
153
+ if (legacy.container && !officialImage && config.allowUnsafeSteps === undefined) {
154
+ messages.push("`DOC_DETECTIVE` has a `container` key, which allows unsafe steps today but not in Doc Detective 5.0. To keep running them, set `allowUnsafeSteps: true` in your config, which works today.");
155
+ }
156
+ for (const [name, { v4, on = "1", off = "unset it" }] of Object.entries(BOOLEAN_ENV)) {
157
+ const value = env[name];
158
+ // An empty value still counts: DOC_DETECTIVE_AUTOINSTALL reads it as on today.
159
+ if (value === undefined)
160
+ continue;
161
+ const today = v4(value);
162
+ const next = readsAs5(value);
163
+ if (next === today)
164
+ continue;
165
+ const reads = next === undefined
166
+ ? "Doc Detective 5.0 doesn't accept"
167
+ : `turns it ${today ? "on" : "off"} today and ${next ? "on" : "off"} in Doc Detective 5.0`;
168
+ messages.push(`\`${name}\` is '${value}', which ${reads}. Set it to \`${on}\` for on, or ${off} for off, which works today.`);
169
+ }
170
+ return messages;
171
+ }
172
+ /** Browsers loading from a legacy `browser-snapshots` folder, which 5.0 ignores. */
173
+ export function browsersDirWarnings(dir) {
174
+ return path.basename(dir) === "browser-snapshots"
175
+ ? [
176
+ `Doc Detective uses browsers from '${dir}'. Doc Detective 5.0 ignores \`browser-snapshots\` folders and installs browsers into \`<cacheDir>/browsers\`. To switch now, delete the folder or set \`cacheDir\`.`,
177
+ ]
178
+ : [];
179
+ }
180
+ const REPORTERS = ["terminal", "json", "html", "runFolder", "junit", "markdown"];
181
+ /** Config values 5.0 validates more strictly. */
182
+ export function configWarnings(config) {
183
+ const messages = [];
184
+ // `-r terminal,html` arrives comma-joined, and 5.0 splits it.
185
+ const names = (Array.isArray(config.reporters) ? config.reporters : [])
186
+ .flatMap((name) => (typeof name === "string" ? name.split(",").map((part) => part.trim()) : []))
187
+ .filter(Boolean);
188
+ for (const name of names) {
189
+ if (!REPORTERS.includes(name)) {
190
+ messages.push(`\`reporters\` has '${name}'. Doc Detective 5.0 exits 2 unless each name is exactly \`terminal\`, \`json\`, \`html\`, \`runFolder\`, \`junit\`, or \`markdown\`, which work today.`);
191
+ }
192
+ }
193
+ return messages;
194
+ }
195
+ const ROUTING = ["onPass", "onFail", "onWarning", "onSkip"];
196
+ const LOCATORS = ["selector", "elementText", "elementId", "elementTestId", "elementClass", "elementAttribute", "elementAria"];
197
+ const REJECTS = "Doc Detective 5.0 rejects with exit 2";
198
+ const EXIT_2 = `which ${REJECTS}`;
199
+ function routes(owner) {
200
+ return ROUTING.flatMap((key) => (Array.isArray(owner[key]) ? owner[key] : []));
201
+ }
202
+ function testWarnings(test, where) {
203
+ return routes(test).flatMap((route) => [
204
+ ...(route.stop === "run"
205
+ ? [`A test in ${where} has \`stop: "run"\` in its routing, ${EXIT_2}. Use \`stop: "spec"\`, which is what 4.x does.`]
206
+ : []),
207
+ ...["retry", "goToStep"]
208
+ .filter((key) => key in route)
209
+ .map((key) => `A test in ${where} has \`${key}\` in its routing, which 4.x ignores and ${REJECTS}. Remove it, or move it to a step.`),
210
+ ]);
211
+ }
212
+ // Subtrees that hold the user's own data, where a `timeout` key isn't one of ours.
213
+ // Keep this in sync with the schemas' free-form boundaries.
214
+ const FREE_FORM = new Set([
215
+ "request",
216
+ "response",
217
+ "headers",
218
+ "body",
219
+ "params",
220
+ "parameters",
221
+ "elementAttribute",
222
+ "variables",
223
+ "outputs",
224
+ "env",
225
+ "driverOptions",
226
+ "openApi",
227
+ ]);
228
+ // Negative `wait`, `*timeout`, `*duration`, and `*delay` numbers in a step,
229
+ // which 5.0 rejects anywhere. It walks authored steps: shallow, parsed JSON/YAML
230
+ // with no cycles, so the recursion needs no depth limit or cycle guard.
231
+ function negatives(value, found = new Set()) {
232
+ if (value && typeof value === "object") {
233
+ for (const [key, child] of Object.entries(value)) {
234
+ if (FREE_FORM.has(key))
235
+ continue;
236
+ if (typeof child === "number" && child < 0 && (key === "wait" || /(timeout|duration|delay)$/i.test(key)))
237
+ found.add(key);
238
+ negatives(child, found);
239
+ }
240
+ }
241
+ return found;
242
+ }
243
+ function offend(offenders, row, value, message) {
244
+ if (!offenders.has(row))
245
+ offenders.set(row, { values: new Set(), message });
246
+ offenders.get(row).values.add(value);
247
+ }
248
+ function stepWarnings(step, where, offenders) {
249
+ const messages = [];
250
+ for (const route of routes(step)) {
251
+ if (route.stop === "spec" || route.stop === "run") {
252
+ messages.push(`A step in ${where} has \`stop: "${route.stop}"\` in its routing, ${EXIT_2}. Use \`stop: "test"\` on the step and \`stop: "spec"\` on the test, which works today.`);
253
+ }
254
+ if ("goToTest" in route) {
255
+ messages.push(`A step in ${where} has \`goToTest\` in its routing, which 4.x ignores and ${REJECTS}. Move it to the test's routing, which works today.`);
256
+ }
257
+ }
258
+ if (typeof step.click === "boolean") {
259
+ messages.push(`A \`click\` step in ${where} is \`${step.click}\`, which 4.x reads as text to click and ${REJECTS}. To click an element whose text is '${step.click}', quote it as \`"click": "${step.click}"\`, which works today. If you don't want a click, remove the step.`);
260
+ }
261
+ const objects = (value) => [value].flat().filter((s) => s && typeof s === "object");
262
+ if (objects(step.startSurface).concat(objects(step.closeSurface)).some((s) => s.browser === "edge")) {
263
+ messages.push(`A surface in ${where} uses \`browser: "edge"\`, which Doc Detective 5.0 removes. Use another \`browser\`, such as \`chrome\`, which works today.`);
264
+ }
265
+ const starts = objects(step.startSurface);
266
+ for (const surface of starts) {
267
+ // A string device names a device, so only an object can hold these keys.
268
+ const device = surface.device && typeof surface.device === "object" ? surface.device : {};
269
+ const removed = ["orientation", "udid", "provider"].filter((key) => key in device);
270
+ if (removed.length) {
271
+ messages.push(`A \`startSurface\` device in ${where} sets ${removed.map((key) => `\`${key}\``).join(", ")}, which Doc Detective 5.0 removes. Remove ${removed.length > 1 ? "them" : "it"}, which works today.`);
272
+ }
273
+ if (surface.app != null && surface.workingDirectory === ".") {
274
+ messages.push(`An app in ${where} sets \`workingDirectory: "."\`, which 4.x tolerates and Doc Detective 5.0 fails. Remove it, which works today.`);
275
+ }
276
+ }
277
+ const zeroTimeouts = [
278
+ ...["runShell", "runCode", "goTo", "httpRequest"].filter((action) => step[action]?.timeout === 0),
279
+ ...(starts.some((s) => s.timeout === 0) ? ["startSurface"] : []),
280
+ ];
281
+ for (const action of zeroTimeouts) {
282
+ messages.push(`A \`${action}\` step in ${where} sets \`timeout: 0\`, ${EXIT_2} on \`runShell\`, \`runCode\`, \`goTo\`, \`httpRequest\`, and \`startSurface\` processes and apps. Remove \`timeout\` for the default, or set it to 1 or more, which works today. Locator and wait timeouts can still be 0.`);
283
+ }
284
+ for (const key of negatives(step)) {
285
+ messages.push(`A step in ${where} has a negative \`${key}\`, ${EXIT_2}. Use a positive value, which works today.`);
286
+ }
287
+ if (step.screenshot === false) {
288
+ messages.push(`A \`screenshot: false\` step in ${where} takes a screenshot today, and Doc Detective 5.0 skips it. To keep the screenshot, use \`screenshot: true\`, which works today.`);
289
+ }
290
+ const find = step.find && typeof step.find === "object" ? step.find : {};
291
+ const click = find.click;
292
+ if ((typeof click === "string" && !["left", "right", "middle"].includes(click)) ||
293
+ (click && typeof click === "object" && Object.keys(click).some((key) => key !== "button" && key !== "duration"))) {
294
+ messages.push(`A \`find.click\` in ${where} isn't \`true\`, \`false\`, a button, or \`{button, duration}\`, ${EXIT_2}. Use \`click: true\` to click the found element, or a separate \`click\` step, which works today.`);
295
+ }
296
+ if (find.type && typeof find.type === "object" && LOCATORS.some((key) => key in find.type)) {
297
+ messages.push(`A \`find.type\` in ${where} sets its own locator, ${EXIT_2}. Move it to a separate \`type\` step, which works today.`);
298
+ }
299
+ for (const action of ["goTo", "httpRequest"]) {
300
+ const url = typeof step[action] === "string" ? step[action] : step[action]?.url;
301
+ if (typeof url === "string" && !/^(https?:\/\/|\/)/.test(url) && !/^\$[A-Za-z0-9_]+$/.test(url)) {
302
+ offend(offenders, `${action} URL`, url, (first) => `A \`${action}\` URL in ${where} (${first}) doesn't start with \`http://\`, \`https://\`, or \`/\`, and isn't a whole \`$VAR\`, ${EXIT_2}. Put the whole URL in one variable, which works today.`);
303
+ }
304
+ }
305
+ for (const action of ["saveCookie", "loadCookie"]) {
306
+ const value = step[action];
307
+ if (typeof value === "string" && value.includes("/") && !value.endsWith(".txt")) {
308
+ offend(offenders, action, value, (first) => `A \`${action}\` in ${where} (${first}) has a \`/\` but doesn't end in \`.txt\`, ${EXIT_2}. End a file path in \`.txt\`, which works today.`);
309
+ }
310
+ }
311
+ return messages;
312
+ }
313
+ /** Spec content 5.0 rejects or reads differently, from resolved tests. */
314
+ export function specWarnings(resolvedTests) {
315
+ const messages = [];
316
+ for (const spec of resolvedTests?.specs ?? []) {
317
+ const file = spec.contentPath;
318
+ const where = typeof file === "string" ? `'${path.isAbsolute(file) ? path.relative(process.cwd(), file) : file}'` : "a spec";
319
+ const offenders = new Map();
320
+ for (const test of spec.tests ?? []) {
321
+ messages.push(...testWarnings(test, where));
322
+ for (const context of test.contexts ?? []) {
323
+ for (const step of context.steps ?? [])
324
+ messages.push(...stepWarnings(step, where, offenders));
325
+ }
326
+ }
327
+ for (const { values, message } of offenders.values()) {
328
+ const [first] = values;
329
+ messages.push(message(values.size > 1 ? `\`${first}\` and ${values.size - 1} more` : `\`${first}\``));
330
+ }
331
+ }
332
+ return [...new Set(messages)];
333
+ }
334
+ /**
335
+ * Warnings for a finished run. `exitOnFail` is the raw config value: undefined
336
+ * means the user didn't choose, and false is already the 5.0 way to keep exit 0.
337
+ */
338
+ export function runResultWarnings(exitOnFail, failed, results) {
339
+ if (exitOnFail === false)
340
+ return [];
341
+ const specs = results?.summary?.specs;
342
+ const testedNothing = !results || (!!specs && [specs.pass, specs.fail, specs.warning, specs.skipped].every((n) => !n));
343
+ if (testedNothing) {
344
+ const fix = exitOnFail === true
345
+ ? "Make sure your inputs always find tests."
346
+ : "To allow empty runs, set `--no-exit-on-fail`, which also stops failed tests from failing the run. Otherwise, make sure your inputs always find tests.";
347
+ return [`This run tested nothing. Doc Detective 5.0 will exit 2 instead of 0. ${fix}`];
348
+ }
349
+ if (failed && exitOnFail === undefined) {
350
+ return [
351
+ "This run has failed specs. Doc Detective 5.0 will exit 1 instead of 0. To keep exit 0, set `--no-exit-on-fail`.",
352
+ ];
353
+ }
354
+ return [];
355
+ }
356
+ //# sourceMappingURL=upgradeNotice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgradeNotice.js","sourceRoot":"","sources":["../src/upgradeNotice.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,UAAU,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,GAAG,EACH,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,CAAC;AASF,iBAAS,gBAAgB,IAAI,OAAO,CAKnC;AAQD,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAQ,GAAG,OAAO,CAMjE;AAED,iBAAS,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,GAAE,MAAe,EAAE,MAAM,GAAE,GAAQ,QASlE;AAMD,iBAAS,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CA4GlC;AAGD,iBAAS,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAG/B;AAGD,iBAAe,uBAAuB,CAAC,MAAM,GAAE,GAAQ;;;UAyEtD;AA8CD,iBAAe,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;IAAE,UAAU,CAAC,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,gBA2N7E;AAuCD,QAAA,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CA2mBzG,CAAC;AAGF,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,WAM5D;AAED,iBAAe,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IAAE,SAAS,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,iBA4DpF;AAED,iBAAe,aAAa,CAAC,MAAM,EAAE,GAAG,YAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAE,GAAQ,kBA8E9F;AAGD,iBAAe,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE;;;;GAwCvD;AAED,iBAAS,OAAO,SAuBf;AAGD,iBAAS,cAAc,QA+GtB"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,UAAU,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,GAAG,EACH,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,CAAC;AASF,iBAAS,gBAAgB,IAAI,OAAO,CAKnC;AAQD,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAQ,GAAG,OAAO,CAMjE;AAED,iBAAS,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,GAAE,MAAe,EAAE,MAAM,GAAE,GAAQ,QASlE;AAMD,iBAAS,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CA4GlC;AAGD,iBAAS,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAG/B;AAGD,iBAAe,uBAAuB,CAAC,MAAM,GAAE,GAAQ;;;UAyEtD;AA8CD,iBAAe,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;IAAE,UAAU,CAAC,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,gBA0O7E;AAuCD,QAAA,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CA2mBzG,CAAC;AAGF,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,WAM5D;AAED,iBAAe,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IAAE,SAAS,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,iBA4DpF;AAED,iBAAe,aAAa,CAAC,MAAM,EAAE,GAAG,YAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAE,GAAQ,kBA8E9F;AAGD,iBAAe,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE;;;;GAwCvD;AAED,iBAAS,OAAO,SAsBf;AAGD,iBAAS,cAAc,QA8GtB"}
package/dist/utils.js CHANGED
@@ -3,12 +3,13 @@ import { hideBin } from "yargs/helpers";
3
3
  import { validate } from "./common/src/validate.js";
4
4
  import { resolvePaths, readFile } from "./core/index.js";
5
5
  import { getRunOutputDir, loadAxios } from "./core/utils.js";
6
+ import { browsersDirWarnings, concurrentRunnersWarnings, configWarnings, envWarnings, flagWarnings, outputWarnings, warnUpgrade, } from "./upgradeNotice.js";
7
+ import { getBrowsersDir } from "./runtime/cacheDir.js";
6
8
  import path from "node:path";
7
9
  import fs from "node:fs";
8
10
  import { spawn } from "node:child_process";
9
11
  import os from "node:os";
10
- import { createRequire } from "node:module";
11
- const require = createRequire(import.meta.url);
12
+ import { ownVersion, readShimPackageJson } from "./runtime/heavyDeps.js";
12
13
  export { buildYargs, setArgs, setConfig, outputResults, spawnCommand, setMeta, getVersionData, log, logLevelEnabled, getResolvedTestsFromEnv, reportResults, reporters, registerReporter, isDebugRequested, };
13
14
  // True when `DOC_DETECTIVE_DEBUG` env var is set to a truthy value.
14
15
  // Used by `runTestsHandler` in cli.ts to decide whether to catch
@@ -123,7 +124,7 @@ function buildYargs(args) {
123
124
  type: "string",
124
125
  })
125
126
  .option("concurrent-runners", {
126
- description: "Number of test contexts to run concurrently (default 1). Pass a number (for example, --concurrent-runners 4), or pass the flag with no value to use the CPU core count (capped at 4). With more than 1 runner, log lines from different contexts interleave and cross-context variable dependencies are unsupported.",
127
+ description: "Number of test contexts to run concurrently (default 1). Pass a number (for example, --concurrent-runners 4), or pass true to use the CPU core count (capped at 4). With more than 1 runner, log lines from different contexts interleave and cross-context variable dependencies are unsupported.",
127
128
  type: "string",
128
129
  })
129
130
  .option("browser-fallback", {
@@ -139,7 +140,7 @@ function buildYargs(args) {
139
140
  description: "Exit with a non-zero code (1) when any spec's result is FAIL, so a documentation-testing job fails the build like a broken unit test. Off by default: the CLI otherwise exits 0 on test failures (non-zero only on a crash or invalid config). WARNING results are non-fatal. Use --no-exit-on-fail to override a config file that enables it.",
140
141
  type: "boolean",
141
142
  })
142
- .version(require("../package.json").version)
143
+ .version(ownVersion() ?? "unknown")
143
144
  .help()
144
145
  .alias("help", "h");
145
146
  }
@@ -264,6 +265,8 @@ async function setConfig({ configPath, args }) {
264
265
  // Merge with file config, preferring environment variable config (use raw envConfig, not validated with defaults)
265
266
  config = { ...config, ...envConfig };
266
267
  }
268
+ // Read before validation fills in the default, which the user didn't choose.
269
+ const outputSetting = args.output || config.output;
267
270
  // Validate config
268
271
  const validation = validate({
269
272
  schemaKey: "config_v3",
@@ -431,6 +434,14 @@ async function setConfig({ configPath, args }) {
431
434
  nested: false,
432
435
  objectType: "config",
433
436
  });
437
+ warnUpgrade([
438
+ ...outputWarnings(outputSetting, String(config.output)),
439
+ ...concurrentRunnersWarnings(args.concurrentRunners),
440
+ ...flagWarnings(args),
441
+ ...envWarnings(process.env, config),
442
+ ...configWarnings(config),
443
+ ...browsersDirWarnings(getBrowsersDir({ cacheDir: config.cacheDir })),
444
+ ], config.logLevel);
434
445
  return config;
435
446
  }
436
447
  // Resolve the directory the runFolder reporter's `.doc-detective/` archive
@@ -1159,9 +1170,8 @@ function setMeta() {
1159
1170
  const meta = process.env["DOC_DETECTIVE_META"] !== undefined
1160
1171
  ? JSON.parse(process.env["DOC_DETECTIVE_META"])
1161
1172
  : {};
1162
- const pkg = require("../package.json");
1163
1173
  meta.distribution = "doc-detective";
1164
- meta.dist_version = pkg.version;
1174
+ meta.dist_version = ownVersion();
1165
1175
  meta.dist_platform = platformMap[os.platform()] || os.platform();
1166
1176
  meta.dist_platform_version = os.release();
1167
1177
  meta.dist_platform_arch = os.arch();
@@ -1174,8 +1184,7 @@ function setMeta() {
1174
1184
  // Get version data programmatically (no console output)
1175
1185
  function getVersionData() {
1176
1186
  try {
1177
- // Get main package version
1178
- const mainPackage = require("../package.json");
1187
+ const mainPackage = readShimPackageJson();
1179
1188
  const versionData = {
1180
1189
  main: {
1181
1190
  "doc-detective": {