doc-detective 4.6.0-next.6 → 4.6.0-postinstall-runtime-default.1
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/README.md +4 -2
- package/dist/core/tests/typeKeys.d.ts.map +1 -1
- package/dist/core/tests/typeKeys.js +95 -67
- package/dist/core/tests/typeKeys.js.map +1 -1
- package/dist/index.cjs +123 -72
- package/dist/runtime/installOutput.d.ts +3 -0
- package/dist/runtime/installOutput.d.ts.map +1 -0
- package/dist/runtime/installOutput.js +22 -0
- package/dist/runtime/installOutput.js.map +1 -0
- package/dist/runtime/loader.d.ts.map +1 -1
- package/dist/runtime/loader.js +29 -7
- package/dist/runtime/loader.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +144 -9
package/README.md
CHANGED
|
@@ -37,9 +37,11 @@ Doc Detective has multiple components to integrate with your workflows as you ne
|
|
|
37
37
|
|
|
38
38
|
### Lazy-installed runtime
|
|
39
39
|
|
|
40
|
-
`npm i doc-detective` installs
|
|
40
|
+
`npm i doc-detective` installs the CLI and then, at postinstall, pre-installs the heavy runtime assets — browsers (Chrome, Firefox), drivers (ChromeDriver, Geckodriver), ffmpeg, and the npm packages that drive them (webdriverio, appium, sharp, etc.) — into `<os.tmpdir()>/doc-detective/` (or `DOC_DETECTIVE_CACHE_DIR`). This keeps a fresh install — and any Docker image built `FROM` it — ready to run without a separate step. The pre-install runs in a child process whose output is captured, so npm's deprecation warnings from the heavy transitive trees never reach your terminal.
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
**Opt out of the heavy pre-install** by setting `DOC_DETECTIVE_INSTALL_RUNTIME=0` (also accepts `false`/`no`/`off`). The CLI install then stays small — no browser download, no heavy npm packages — and the heavy assets install lazily the first time a test needs them instead, or up front via `doc-detective install all`.
|
|
43
|
+
|
|
44
|
+
Either way, the heavy packages are never declared in `dependencies` or `optionalDependencies`, so npm itself never fetches them as part of the dependency tree. Their version constraints live in a custom `ddRuntimeDependencies` field that the resolver reads when it installs each dep into the cache — whether at postinstall or on first use.
|
|
43
45
|
|
|
44
46
|
- **Pre-install everything up front:**
|
|
45
47
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeKeys.d.ts","sourceRoot":"","sources":["../../../src/core/tests/typeKeys.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"typeKeys.d.ts","sourceRoot":"","sources":["../../../src/core/tests/typeKeys.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,CAAC;AAqFpB,iBAAe,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE;;;GA+IxF"}
|
|
@@ -1,66 +1,77 @@
|
|
|
1
1
|
import { validate } from "../../common/src/validate.js";
|
|
2
|
-
import { Key } from "webdriverio";
|
|
3
2
|
import { findElementByCriteria, } from "./findStrategies.js";
|
|
3
|
+
import { loadHeavyDep } from "../../runtime/loader.js";
|
|
4
4
|
export { typeKeys };
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
5
|
+
let _specialKeyMap = null;
|
|
6
|
+
async function getSpecialKeyMap(ctx = {}) {
|
|
7
|
+
if (_specialKeyMap)
|
|
8
|
+
return _specialKeyMap;
|
|
9
|
+
const wdio = await loadHeavyDep("webdriverio", { ctx });
|
|
10
|
+
const { Key } = wdio;
|
|
11
|
+
_specialKeyMap = {
|
|
12
|
+
$CTRL$: Key.Ctrl,
|
|
13
|
+
$NULL$: Key.NULL,
|
|
14
|
+
$CANCEL$: Key.Cancel,
|
|
15
|
+
$HELP$: Key.Help,
|
|
16
|
+
$BACKSPACE$: Key.Backspace,
|
|
17
|
+
$TAB$: Key.Tab,
|
|
18
|
+
$CLEAR$: Key.Clear,
|
|
19
|
+
$RETURN$: Key.Return,
|
|
20
|
+
$ENTER$: Key.Enter,
|
|
21
|
+
$SHIFT$: Key.Shift,
|
|
22
|
+
$CONTROL$: Key.Control,
|
|
23
|
+
$ALT$: Key.Alt,
|
|
24
|
+
$PAUSE$: Key.Pause,
|
|
25
|
+
$ESCAPE$: Key.Escape,
|
|
26
|
+
$SPACE$: Key.Space,
|
|
27
|
+
$PAGE_UP$: Key.PageUp,
|
|
28
|
+
$PAGE_DOWN$: Key.PageDown,
|
|
29
|
+
$END$: Key.End,
|
|
30
|
+
$HOME$: Key.Home,
|
|
31
|
+
$ARROW_LEFT$: Key.ArrowLeft,
|
|
32
|
+
$ARROW_UP$: Key.ArrowUp,
|
|
33
|
+
$ARROW_RIGHT$: Key.ArrowRight,
|
|
34
|
+
$ARROW_DOWN$: Key.ArrowDown,
|
|
35
|
+
$INSERT$: Key.Insert,
|
|
36
|
+
$DELETE$: Key.Delete,
|
|
37
|
+
$SEMICOLON$: Key.Semicolon,
|
|
38
|
+
$EQUALS$: Key.Equals,
|
|
39
|
+
$NUMPAD_0$: Key.Numpad0,
|
|
40
|
+
$NUMPAD_1$: Key.Numpad1,
|
|
41
|
+
$NUMPAD_2$: Key.Numpad2,
|
|
42
|
+
$NUMPAD_3$: Key.Numpad3,
|
|
43
|
+
$NUMPAD_4$: Key.Numpad4,
|
|
44
|
+
$NUMPAD_5$: Key.Numpad5,
|
|
45
|
+
$NUMPAD_6$: Key.Numpad6,
|
|
46
|
+
$NUMPAD_7$: Key.Numpad7,
|
|
47
|
+
$NUMPAD_8$: Key.Numpad8,
|
|
48
|
+
$NUMPAD_9$: Key.Numpad9,
|
|
49
|
+
$MULTIPLY$: Key.Multiply,
|
|
50
|
+
$ADD$: Key.Add,
|
|
51
|
+
$SEPARATOR$: Key.Separator,
|
|
52
|
+
// `$SUBSTRACT$` is a long-standing misspelling kept for backwards
|
|
53
|
+
// compatibility; `$SUBTRACT$` is the correctly-spelled alias.
|
|
54
|
+
$SUBSTRACT$: Key.Subtract,
|
|
55
|
+
$SUBTRACT$: Key.Subtract,
|
|
56
|
+
$DECIMAL$: Key.Decimal,
|
|
57
|
+
$DIVIDE$: Key.Divide,
|
|
58
|
+
$F1$: Key.F1,
|
|
59
|
+
$F2$: Key.F2,
|
|
60
|
+
$F3$: Key.F3,
|
|
61
|
+
$F4$: Key.F4,
|
|
62
|
+
$F5$: Key.F5,
|
|
63
|
+
$F6$: Key.F6,
|
|
64
|
+
$F7$: Key.F7,
|
|
65
|
+
$F8$: Key.F8,
|
|
66
|
+
$F9$: Key.F9,
|
|
67
|
+
$F10$: Key.F10,
|
|
68
|
+
$F11$: Key.F11,
|
|
69
|
+
$F12$: Key.F12,
|
|
70
|
+
$COMMAND$: Key.Command,
|
|
71
|
+
$ZANKAKU_HANDKAKU$: Key.ZenkakuHankaku,
|
|
72
|
+
};
|
|
73
|
+
return _specialKeyMap;
|
|
74
|
+
}
|
|
64
75
|
// Type a sequence of keys in the active element.
|
|
65
76
|
async function typeKeys({ config, step, driver }) {
|
|
66
77
|
let result = { status: "PASS", description: "Typed keys." };
|
|
@@ -148,14 +159,31 @@ async function typeKeys({ config, step, driver }) {
|
|
|
148
159
|
step.type.keys = keys;
|
|
149
160
|
}
|
|
150
161
|
// Substitute special keys
|
|
151
|
-
// 1. For each key, identify if it
|
|
152
|
-
// 2. If it does, replace it with the corresponding `Key`
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
162
|
+
// 1. For each key, identify if it follows the escape pattern of `$...$`.
|
|
163
|
+
// 2. If it does, replace it with the corresponding `Key` value from `specialKeyMap`.
|
|
164
|
+
// Only load the map (and thus webdriverio) when a sentinel token is actually
|
|
165
|
+
// present — plain-text typing must not pull in the heavy dep or risk a
|
|
166
|
+
// load-time FAIL. Loading webdriverio can throw (e.g. the runtime dep isn't
|
|
167
|
+
// installed yet); return a step-level FAIL rather than aborting the whole run,
|
|
168
|
+
// matching how other heavy-dep-backed steps behave.
|
|
169
|
+
const hasSpecialTokens = step.type.keys.some((key) => key.startsWith("$") && key.endsWith("$"));
|
|
170
|
+
if (hasSpecialTokens) {
|
|
171
|
+
let specialKeyMap;
|
|
172
|
+
try {
|
|
173
|
+
specialKeyMap = await getSpecialKeyMap({ cacheDir: config?.cacheDir });
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
result.status = "FAIL";
|
|
177
|
+
result.description = `Couldn't load key definitions: ${error.message}`;
|
|
178
|
+
return result;
|
|
156
179
|
}
|
|
157
|
-
|
|
158
|
-
|
|
180
|
+
step.type.keys = step.type.keys.map((key) => {
|
|
181
|
+
if (key.startsWith("$") && key.endsWith("$") && specialKeyMap[key]) {
|
|
182
|
+
return specialKeyMap[key];
|
|
183
|
+
}
|
|
184
|
+
return key;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
159
187
|
// Run action
|
|
160
188
|
try {
|
|
161
189
|
if (config.recording) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeKeys.js","sourceRoot":"","sources":["../../../src/core/tests/typeKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"typeKeys.js","sourceRoot":"","sources":["../../../src/core/tests/typeKeys.ts"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -130574,6 +130574,19 @@ var init_heavyDeps = __esm({
|
|
|
130574
130574
|
}
|
|
130575
130575
|
});
|
|
130576
130576
|
|
|
130577
|
+
// dist/runtime/installOutput.js
|
|
130578
|
+
function isNpmNoiseLine(line) {
|
|
130579
|
+
const l = line.trim();
|
|
130580
|
+
if (!l)
|
|
130581
|
+
return true;
|
|
130582
|
+
return /^npm warn deprecated/i.test(l) || /^npm notice/i.test(l) || /^npm fund/i.test(l) || /packages are looking for funding/i.test(l);
|
|
130583
|
+
}
|
|
130584
|
+
var init_installOutput = __esm({
|
|
130585
|
+
"dist/runtime/installOutput.js"() {
|
|
130586
|
+
"use strict";
|
|
130587
|
+
}
|
|
130588
|
+
});
|
|
130589
|
+
|
|
130577
130590
|
// dist/runtime/cacheDir.js
|
|
130578
130591
|
function emptyRecord() {
|
|
130579
130592
|
return { npmPackages: {}, browsers: {} };
|
|
@@ -130794,17 +130807,31 @@ async function ensureRuntimeInstalled(packages, options = {}) {
|
|
|
130794
130807
|
shell: process.platform === "win32",
|
|
130795
130808
|
stdio: ["ignore", "pipe", "pipe"]
|
|
130796
130809
|
});
|
|
130797
|
-
const
|
|
130810
|
+
const emitLine = (stream, line) => {
|
|
130811
|
+
if (line.length === 0)
|
|
130812
|
+
return;
|
|
130813
|
+
if (!RUNTIME_DEBUG && isNpmNoiseLine(line))
|
|
130814
|
+
return;
|
|
130815
|
+
logger(`npm[${stream}]: ${line}`, "debug");
|
|
130816
|
+
};
|
|
130817
|
+
const buffers = { stdout: "", stderr: "" };
|
|
130818
|
+
const onChunk = (stream, chunk) => {
|
|
130798
130819
|
const text = typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
130799
|
-
|
|
130800
|
-
|
|
130801
|
-
|
|
130802
|
-
|
|
130820
|
+
const parts = (buffers[stream] + text).split(/\r?\n/);
|
|
130821
|
+
buffers[stream] = parts.pop() ?? "";
|
|
130822
|
+
for (const line of parts)
|
|
130823
|
+
emitLine(stream, line);
|
|
130824
|
+
};
|
|
130825
|
+
const flushBuffers = () => {
|
|
130826
|
+
emitLine("stdout", buffers.stdout);
|
|
130827
|
+
emitLine("stderr", buffers.stderr);
|
|
130828
|
+
buffers.stdout = "";
|
|
130829
|
+
buffers.stderr = "";
|
|
130803
130830
|
};
|
|
130804
130831
|
if (child.stdout)
|
|
130805
|
-
child.stdout.on("data", (c) =>
|
|
130832
|
+
child.stdout.on("data", (c) => onChunk("stdout", c));
|
|
130806
130833
|
if (child.stderr)
|
|
130807
|
-
child.stderr.on("data", (c) =>
|
|
130834
|
+
child.stderr.on("data", (c) => onChunk("stderr", c));
|
|
130808
130835
|
let timer = null;
|
|
130809
130836
|
if (installTimeoutMs > 0) {
|
|
130810
130837
|
timer = setTimeout(() => {
|
|
@@ -130827,6 +130854,7 @@ async function ensureRuntimeInstalled(packages, options = {}) {
|
|
|
130827
130854
|
});
|
|
130828
130855
|
child.on("close", (code) => {
|
|
130829
130856
|
clearTimer();
|
|
130857
|
+
flushBuffers();
|
|
130830
130858
|
if (code === 0)
|
|
130831
130859
|
resolve();
|
|
130832
130860
|
else
|
|
@@ -130851,6 +130879,7 @@ var init_loader = __esm({
|
|
|
130851
130879
|
import_node_url3 = require("node:url");
|
|
130852
130880
|
import_node_module = require("node:module");
|
|
130853
130881
|
init_heavyDeps();
|
|
130882
|
+
init_installOutput();
|
|
130854
130883
|
init_cacheDir();
|
|
130855
130884
|
RUNTIME_DEBUG = process.env.DOC_DETECTIVE_RUNTIME_DEBUG === "1";
|
|
130856
130885
|
defaultLogger = (msg, level = "info") => {
|
|
@@ -135402,66 +135431,77 @@ async function findElementByCriteria({ selector, elementText, elementId, element
|
|
|
135402
135431
|
|
|
135403
135432
|
// dist/core/tests/typeKeys.js
|
|
135404
135433
|
init_validate();
|
|
135405
|
-
|
|
135406
|
-
var
|
|
135407
|
-
|
|
135408
|
-
|
|
135409
|
-
|
|
135410
|
-
|
|
135411
|
-
|
|
135412
|
-
|
|
135413
|
-
|
|
135414
|
-
|
|
135415
|
-
|
|
135416
|
-
|
|
135417
|
-
|
|
135418
|
-
|
|
135419
|
-
|
|
135420
|
-
|
|
135421
|
-
|
|
135422
|
-
|
|
135423
|
-
|
|
135424
|
-
|
|
135425
|
-
|
|
135426
|
-
|
|
135427
|
-
|
|
135428
|
-
|
|
135429
|
-
|
|
135430
|
-
|
|
135431
|
-
|
|
135432
|
-
|
|
135433
|
-
|
|
135434
|
-
|
|
135435
|
-
|
|
135436
|
-
|
|
135437
|
-
|
|
135438
|
-
|
|
135439
|
-
|
|
135440
|
-
|
|
135441
|
-
|
|
135442
|
-
|
|
135443
|
-
|
|
135444
|
-
|
|
135445
|
-
|
|
135446
|
-
|
|
135447
|
-
|
|
135448
|
-
|
|
135449
|
-
|
|
135450
|
-
|
|
135451
|
-
|
|
135452
|
-
|
|
135453
|
-
|
|
135454
|
-
|
|
135455
|
-
|
|
135456
|
-
|
|
135457
|
-
|
|
135458
|
-
|
|
135459
|
-
|
|
135460
|
-
|
|
135461
|
-
|
|
135462
|
-
|
|
135463
|
-
|
|
135464
|
-
|
|
135434
|
+
init_loader();
|
|
135435
|
+
var _specialKeyMap = null;
|
|
135436
|
+
async function getSpecialKeyMap(ctx = {}) {
|
|
135437
|
+
if (_specialKeyMap)
|
|
135438
|
+
return _specialKeyMap;
|
|
135439
|
+
const wdio = await loadHeavyDep("webdriverio", { ctx });
|
|
135440
|
+
const { Key } = wdio;
|
|
135441
|
+
_specialKeyMap = {
|
|
135442
|
+
$CTRL$: Key.Ctrl,
|
|
135443
|
+
$NULL$: Key.NULL,
|
|
135444
|
+
$CANCEL$: Key.Cancel,
|
|
135445
|
+
$HELP$: Key.Help,
|
|
135446
|
+
$BACKSPACE$: Key.Backspace,
|
|
135447
|
+
$TAB$: Key.Tab,
|
|
135448
|
+
$CLEAR$: Key.Clear,
|
|
135449
|
+
$RETURN$: Key.Return,
|
|
135450
|
+
$ENTER$: Key.Enter,
|
|
135451
|
+
$SHIFT$: Key.Shift,
|
|
135452
|
+
$CONTROL$: Key.Control,
|
|
135453
|
+
$ALT$: Key.Alt,
|
|
135454
|
+
$PAUSE$: Key.Pause,
|
|
135455
|
+
$ESCAPE$: Key.Escape,
|
|
135456
|
+
$SPACE$: Key.Space,
|
|
135457
|
+
$PAGE_UP$: Key.PageUp,
|
|
135458
|
+
$PAGE_DOWN$: Key.PageDown,
|
|
135459
|
+
$END$: Key.End,
|
|
135460
|
+
$HOME$: Key.Home,
|
|
135461
|
+
$ARROW_LEFT$: Key.ArrowLeft,
|
|
135462
|
+
$ARROW_UP$: Key.ArrowUp,
|
|
135463
|
+
$ARROW_RIGHT$: Key.ArrowRight,
|
|
135464
|
+
$ARROW_DOWN$: Key.ArrowDown,
|
|
135465
|
+
$INSERT$: Key.Insert,
|
|
135466
|
+
$DELETE$: Key.Delete,
|
|
135467
|
+
$SEMICOLON$: Key.Semicolon,
|
|
135468
|
+
$EQUALS$: Key.Equals,
|
|
135469
|
+
$NUMPAD_0$: Key.Numpad0,
|
|
135470
|
+
$NUMPAD_1$: Key.Numpad1,
|
|
135471
|
+
$NUMPAD_2$: Key.Numpad2,
|
|
135472
|
+
$NUMPAD_3$: Key.Numpad3,
|
|
135473
|
+
$NUMPAD_4$: Key.Numpad4,
|
|
135474
|
+
$NUMPAD_5$: Key.Numpad5,
|
|
135475
|
+
$NUMPAD_6$: Key.Numpad6,
|
|
135476
|
+
$NUMPAD_7$: Key.Numpad7,
|
|
135477
|
+
$NUMPAD_8$: Key.Numpad8,
|
|
135478
|
+
$NUMPAD_9$: Key.Numpad9,
|
|
135479
|
+
$MULTIPLY$: Key.Multiply,
|
|
135480
|
+
$ADD$: Key.Add,
|
|
135481
|
+
$SEPARATOR$: Key.Separator,
|
|
135482
|
+
// `$SUBSTRACT$` is a long-standing misspelling kept for backwards
|
|
135483
|
+
// compatibility; `$SUBTRACT$` is the correctly-spelled alias.
|
|
135484
|
+
$SUBSTRACT$: Key.Subtract,
|
|
135485
|
+
$SUBTRACT$: Key.Subtract,
|
|
135486
|
+
$DECIMAL$: Key.Decimal,
|
|
135487
|
+
$DIVIDE$: Key.Divide,
|
|
135488
|
+
$F1$: Key.F1,
|
|
135489
|
+
$F2$: Key.F2,
|
|
135490
|
+
$F3$: Key.F3,
|
|
135491
|
+
$F4$: Key.F4,
|
|
135492
|
+
$F5$: Key.F5,
|
|
135493
|
+
$F6$: Key.F6,
|
|
135494
|
+
$F7$: Key.F7,
|
|
135495
|
+
$F8$: Key.F8,
|
|
135496
|
+
$F9$: Key.F9,
|
|
135497
|
+
$F10$: Key.F10,
|
|
135498
|
+
$F11$: Key.F11,
|
|
135499
|
+
$F12$: Key.F12,
|
|
135500
|
+
$COMMAND$: Key.Command,
|
|
135501
|
+
$ZANKAKU_HANDKAKU$: Key.ZenkakuHankaku
|
|
135502
|
+
};
|
|
135503
|
+
return _specialKeyMap;
|
|
135504
|
+
}
|
|
135465
135505
|
async function typeKeys({ config, step, driver }) {
|
|
135466
135506
|
let result = { status: "PASS", description: "Typed keys." };
|
|
135467
135507
|
const isValidStep = validate({ schemaKey: "step_v3", object: step });
|
|
@@ -135530,12 +135570,23 @@ async function typeKeys({ config, step, driver }) {
|
|
|
135530
135570
|
});
|
|
135531
135571
|
step.type.keys = keys;
|
|
135532
135572
|
}
|
|
135533
|
-
|
|
135534
|
-
|
|
135535
|
-
|
|
135573
|
+
const hasSpecialTokens = step.type.keys.some((key) => key.startsWith("$") && key.endsWith("$"));
|
|
135574
|
+
if (hasSpecialTokens) {
|
|
135575
|
+
let specialKeyMap;
|
|
135576
|
+
try {
|
|
135577
|
+
specialKeyMap = await getSpecialKeyMap({ cacheDir: config?.cacheDir });
|
|
135578
|
+
} catch (error) {
|
|
135579
|
+
result.status = "FAIL";
|
|
135580
|
+
result.description = `Couldn't load key definitions: ${error.message}`;
|
|
135581
|
+
return result;
|
|
135536
135582
|
}
|
|
135537
|
-
|
|
135538
|
-
|
|
135583
|
+
step.type.keys = step.type.keys.map((key) => {
|
|
135584
|
+
if (key.startsWith("$") && key.endsWith("$") && specialKeyMap[key]) {
|
|
135585
|
+
return specialKeyMap[key];
|
|
135586
|
+
}
|
|
135587
|
+
return key;
|
|
135588
|
+
});
|
|
135589
|
+
}
|
|
135539
135590
|
try {
|
|
135540
135591
|
if (config.recording) {
|
|
135541
135592
|
for (let i = 0; i < step.type.keys.length; i++) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installOutput.d.ts","sourceRoot":"","sources":["../../src/runtime/installOutput.ts"],"names":[],"mappings":"AAYA,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASpD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Shared classifier for npm's noisy, non-actionable output. Deprecation,
|
|
2
|
+
// funding, and notice lines (e.g. `npm warn deprecated glob@10.5.0: …`,
|
|
3
|
+
// `npm warn deprecated whatwg-encoding@3.1.1: …`) are about transitive
|
|
4
|
+
// dependencies the user can't change, and they alarm users out of context.
|
|
5
|
+
// We drop them from all user-facing install output — `install all`,
|
|
6
|
+
// lazy-install on first use, and the postinstall pre-warm — so a noisy
|
|
7
|
+
// transitive tree never produces scary terminal output.
|
|
8
|
+
//
|
|
9
|
+
// NOTE: scripts/postinstall.js keeps a parallel copy of this predicate because
|
|
10
|
+
// it is a plain Node script that runs before/without the compiled `dist/`. Keep
|
|
11
|
+
// the two in sync.
|
|
12
|
+
/** True for npm deprecation / funding / notice noise (and blank lines). */
|
|
13
|
+
export function isNpmNoiseLine(line) {
|
|
14
|
+
const l = line.trim();
|
|
15
|
+
if (!l)
|
|
16
|
+
return true;
|
|
17
|
+
return (/^npm warn deprecated/i.test(l) ||
|
|
18
|
+
/^npm notice/i.test(l) ||
|
|
19
|
+
/^npm fund/i.test(l) ||
|
|
20
|
+
/packages are looking for funding/i.test(l));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=installOutput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installOutput.js","sourceRoot":"","sources":["../../src/runtime/installOutput.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wEAAwE;AACxE,uEAAuE;AACvE,2EAA2E;AAC3E,oEAAoE;AACpE,uEAAuE;AACvE,wDAAwD;AACxD,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAChF,mBAAmB;AAEnB,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,CACL,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACtB,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACpB,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5C,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/runtime/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/runtime/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK9F,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;AAe7D,MAAM,MAAM,OAAO,GAAG,CACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,YAAY,KAClB,YAAY,CAAC;AAElB,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AA8BD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,eAAoB,GACxB,MAAM,GAAG,IAAI,CAEf;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED,MAAM,WAAW,6BAA6B;IAC5C,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAuCD;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CA2Jf"}
|
package/dist/runtime/loader.js
CHANGED
|
@@ -4,6 +4,7 @@ import { spawn as nodeSpawn } from "node:child_process";
|
|
|
4
4
|
import { pathToFileURL } from "node:url";
|
|
5
5
|
import { createRequire } from "node:module";
|
|
6
6
|
import { getDeclaredVersion, satisfiesRange, withPeerCompanions } from "./heavyDeps.js";
|
|
7
|
+
import { isNpmNoiseLine } from "./installOutput.js";
|
|
7
8
|
import { assertSafeRuntimePath, getRuntimeDir, readInstalledRecord, writeInstalledRecord, } from "./cacheDir.js";
|
|
8
9
|
// The default logger gates `debug` output OFF so call sites that omit a
|
|
9
10
|
// logger (the JIT pre-flight, the CLI startup self-update check) don't
|
|
@@ -190,17 +191,37 @@ export async function ensureRuntimeInstalled(packages, options = {}) {
|
|
|
190
191
|
shell: process.platform === "win32",
|
|
191
192
|
stdio: ["ignore", "pipe", "pipe"],
|
|
192
193
|
});
|
|
193
|
-
const
|
|
194
|
+
const emitLine = (stream, line) => {
|
|
195
|
+
if (line.length === 0)
|
|
196
|
+
return;
|
|
197
|
+
// Drop npm's deprecation/funding/notice noise (about transitive deps
|
|
198
|
+
// the user can't fix) so even `--verbose` install output stays calm.
|
|
199
|
+
// DOC_DETECTIVE_RUNTIME_DEBUG=1 shows everything raw for diagnostics.
|
|
200
|
+
if (!RUNTIME_DEBUG && isNpmNoiseLine(line))
|
|
201
|
+
return;
|
|
202
|
+
logger(`npm[${stream}]: ${line}`, "debug");
|
|
203
|
+
};
|
|
204
|
+
// Buffer each stream so a line split across `data` chunks is reassembled
|
|
205
|
+
// before isNpmNoiseLine classifies it — otherwise a fragmented
|
|
206
|
+
// `npm warn deprecated …` line could slip past the filter.
|
|
207
|
+
const buffers = { stdout: "", stderr: "" };
|
|
208
|
+
const onChunk = (stream, chunk) => {
|
|
194
209
|
const text = typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
210
|
+
const parts = (buffers[stream] + text).split(/\r?\n/);
|
|
211
|
+
buffers[stream] = parts.pop() ?? ""; // trailing partial line
|
|
212
|
+
for (const line of parts)
|
|
213
|
+
emitLine(stream, line);
|
|
214
|
+
};
|
|
215
|
+
const flushBuffers = () => {
|
|
216
|
+
emitLine("stdout", buffers.stdout);
|
|
217
|
+
emitLine("stderr", buffers.stderr);
|
|
218
|
+
buffers.stdout = "";
|
|
219
|
+
buffers.stderr = "";
|
|
199
220
|
};
|
|
200
221
|
if (child.stdout)
|
|
201
|
-
child.stdout.on("data", (c) =>
|
|
222
|
+
child.stdout.on("data", (c) => onChunk("stdout", c));
|
|
202
223
|
if (child.stderr)
|
|
203
|
-
child.stderr.on("data", (c) =>
|
|
224
|
+
child.stderr.on("data", (c) => onChunk("stderr", c));
|
|
204
225
|
// Wall-clock cap so a stalled npm never freezes the first run. 0 opts
|
|
205
226
|
// out (callers that explicitly want to wait forever, or unit tests
|
|
206
227
|
// with a synchronously-resolving fake spawner).
|
|
@@ -229,6 +250,7 @@ export async function ensureRuntimeInstalled(packages, options = {}) {
|
|
|
229
250
|
});
|
|
230
251
|
child.on("close", (code) => {
|
|
231
252
|
clearTimer();
|
|
253
|
+
flushBuffers();
|
|
232
254
|
if (code === 0)
|
|
233
255
|
resolve();
|
|
234
256
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/runtime/loader.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/runtime/loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/scripts/postinstall.js
CHANGED
|
@@ -1,21 +1,157 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
1
2
|
import path from "node:path";
|
|
2
3
|
import { spawn } from "node:child_process";
|
|
3
4
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
5
|
|
|
5
6
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
6
7
|
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
// first use into <cacheDir>/ (default <os.tmpdir()>/doc-detective/), or
|
|
10
|
-
// up-front via `doc-detective install all`. This postinstall script
|
|
11
|
-
// keeps only the optional agent-tools install prompt — it's lightweight
|
|
12
|
-
// (TTY-gated, time-bounded, skipped in CI) and unrelated to the runtime.
|
|
8
|
+
// Resolved path to the compiled CLI, shared by both install steps below.
|
|
9
|
+
const CLI_PATH = path.join(__dirname, "..", "bin", "doc-detective.js");
|
|
13
10
|
|
|
11
|
+
// Two steps run at `npm install` time:
|
|
12
|
+
// 1. maybeInstallRuntime(): eagerly install the heavy runtime assets
|
|
13
|
+
// (webdriverio/appium/sharp + browsers) via `doc-detective install all`,
|
|
14
|
+
// so a fresh install — and any Docker image built `FROM` it — is ready to
|
|
15
|
+
// run without a separate install step. On by default; opt out with
|
|
16
|
+
// DOC_DETECTIVE_INSTALL_RUNTIME=0.
|
|
17
|
+
// 2. maybePromptInstallAgents(): the optional agent-tools install prompt —
|
|
18
|
+
// lightweight (TTY-gated, time-bounded, skipped in CI).
|
|
14
19
|
async function main() {
|
|
20
|
+
await maybeInstallRuntime();
|
|
15
21
|
await maybePromptInstallAgents();
|
|
16
22
|
}
|
|
17
23
|
|
|
18
|
-
|
|
24
|
+
// Only run the install steps when executed as the npm lifecycle script, not
|
|
25
|
+
// when a test imports this module for the exported pure helpers below.
|
|
26
|
+
function isInvokedDirectly() {
|
|
27
|
+
try {
|
|
28
|
+
if (!process.argv[1]) return false;
|
|
29
|
+
return (
|
|
30
|
+
fs.realpathSync(process.argv[1]) ===
|
|
31
|
+
fs.realpathSync(fileURLToPath(import.meta.url))
|
|
32
|
+
);
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Swallow any unexpected rejection: a postinstall script must always exit 0,
|
|
38
|
+
// otherwise it fails the user's `npm install`.
|
|
39
|
+
if (isInvokedDirectly()) main().catch(() => {});
|
|
40
|
+
|
|
41
|
+
// --- Runtime + browsers auto-install ----------------------------------------
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* True when the user has opted out of the postinstall heavy install via
|
|
45
|
+
* DOC_DETECTIVE_INSTALL_RUNTIME (0/false/no/off, case-insensitive). Default
|
|
46
|
+
* (unset or any other value) installs. Exported for tests.
|
|
47
|
+
*/
|
|
48
|
+
export function isRuntimeInstallOptedOut(env = process.env) {
|
|
49
|
+
const v = String(env.DOC_DETECTIVE_INSTALL_RUNTIME ?? "").trim().toLowerCase();
|
|
50
|
+
return v === "0" || v === "false" || v === "no" || v === "off";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A line we surface to the user: the installer's own clean progress output
|
|
55
|
+
* (`Installing runtime…`, ` [npm] webdriverio — installed`, …). Everything
|
|
56
|
+
* else from the child — npm deprecation/funding noise, blank lines — is
|
|
57
|
+
* suppressed on the success path. Exported for tests.
|
|
58
|
+
*/
|
|
59
|
+
export function isProgressLine(line) {
|
|
60
|
+
return /^\s*Installing\b/.test(line) || /^\s*\[(npm|browser)\]/.test(line);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Pure npm noise (deprecation/funding/notice). Dropped from the captured
|
|
65
|
+
* buffer when surfacing a failure tail so the dump stays readable — genuine
|
|
66
|
+
* warnings/errors (e.g. EBADENGINE) are kept. Exported for tests.
|
|
67
|
+
*
|
|
68
|
+
* Kept in sync with src/runtime/installOutput.ts#isNpmNoiseLine (this is a
|
|
69
|
+
* plain Node script that can't import the compiled TS module reliably).
|
|
70
|
+
*/
|
|
71
|
+
export function isNpmNoiseLine(line) {
|
|
72
|
+
const l = line.trim();
|
|
73
|
+
if (!l) return true;
|
|
74
|
+
return (
|
|
75
|
+
/^npm warn deprecated/i.test(l) ||
|
|
76
|
+
/^npm notice/i.test(l) ||
|
|
77
|
+
/^npm fund/i.test(l) ||
|
|
78
|
+
/packages are looking for funding/i.test(l)
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Install the heavy runtime assets in a CHILD PROCESS whose stdout/stderr we
|
|
83
|
+
// capture (pipe) rather than inherit, so npm's deprecated-transitive-dependency
|
|
84
|
+
// warnings (glob, whatwg-encoding, …) never reach the user's terminal. We
|
|
85
|
+
// forward only the installer's own progress lines; on failure we surface a
|
|
86
|
+
// curated tail. This never fails the npm install — the assets also lazy-install
|
|
87
|
+
// on first use, so a failure here just forfeits the pre-warm.
|
|
88
|
+
async function maybeInstallRuntime() {
|
|
89
|
+
if (isRuntimeInstallOptedOut()) return;
|
|
90
|
+
|
|
91
|
+
const distDir = path.join(__dirname, "..", "dist");
|
|
92
|
+
// Dev checkout / partial install without a build: the CLI can't run yet.
|
|
93
|
+
// Skip silently — postinstall must never fail.
|
|
94
|
+
if (!fs.existsSync(CLI_PATH) || !fs.existsSync(distDir)) return;
|
|
95
|
+
|
|
96
|
+
console.log(
|
|
97
|
+
"doc-detective: installing runtime + browsers " +
|
|
98
|
+
"(set DOC_DETECTIVE_INSTALL_RUNTIME=0 to skip)…"
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
const captured = [];
|
|
102
|
+
const handleLine = (raw, forward) => {
|
|
103
|
+
if (!raw.trim()) return;
|
|
104
|
+
captured.push(raw);
|
|
105
|
+
if (forward && isProgressLine(raw)) console.log(" " + raw.trim());
|
|
106
|
+
};
|
|
107
|
+
// Buffer per stream so a line split across data chunks is reassembled before
|
|
108
|
+
// the allow-list filter sees it. Returns the new buffer remainder.
|
|
109
|
+
const consume = (buf, chunk, forward) => {
|
|
110
|
+
const parts = (buf + chunk.toString()).split(/\r?\n/);
|
|
111
|
+
const remainder = parts.pop(); // trailing partial line (no newline yet)
|
|
112
|
+
for (const line of parts) handleLine(line, forward);
|
|
113
|
+
return remainder;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const { code, signal, errored } = await new Promise((resolve) => {
|
|
117
|
+
let child;
|
|
118
|
+
try {
|
|
119
|
+
child = spawn(
|
|
120
|
+
process.execPath,
|
|
121
|
+
[CLI_PATH, "install", "all", "--yes"],
|
|
122
|
+
{ stdio: ["ignore", "pipe", "pipe"], env: process.env }
|
|
123
|
+
);
|
|
124
|
+
} catch {
|
|
125
|
+
resolve({ code: 1, signal: null, errored: true });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
let outBuf = "";
|
|
129
|
+
let errBuf = "";
|
|
130
|
+
child.stdout?.on("data", (chunk) => (outBuf = consume(outBuf, chunk, true)));
|
|
131
|
+
// stderr is captured for a possible failure dump but never forwarded live.
|
|
132
|
+
child.stderr?.on("data", (chunk) => (errBuf = consume(errBuf, chunk, false)));
|
|
133
|
+
child.on("close", (exitCode, exitSignal) => {
|
|
134
|
+
// Flush any trailing partial lines left without a final newline.
|
|
135
|
+
handleLine(outBuf, true);
|
|
136
|
+
handleLine(errBuf, false);
|
|
137
|
+
resolve({ code: exitCode, signal: exitSignal, errored: false });
|
|
138
|
+
});
|
|
139
|
+
child.on("error", () => resolve({ code: 1, signal: null, errored: true }));
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
if (!errored && !signal && code === 0) {
|
|
143
|
+
console.log("doc-detective: runtime + browsers ready.");
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const tail = captured.filter((l) => !isNpmNoiseLine(l)).slice(-20);
|
|
148
|
+
console.error(
|
|
149
|
+
"doc-detective: runtime install did not complete " +
|
|
150
|
+
(signal ? `(signal ${signal})` : `(exit ${code})`) +
|
|
151
|
+
". Assets will install on first use, or run `doc-detective install all`."
|
|
152
|
+
);
|
|
153
|
+
if (tail.length) console.error(tail.map((l) => " " + l).join("\n"));
|
|
154
|
+
}
|
|
19
155
|
|
|
20
156
|
async function maybePromptInstallAgents() {
|
|
21
157
|
// Don't prompt in non-interactive contexts. npm sets many of these during
|
|
@@ -187,7 +323,6 @@ async function maybePromptInstallAgents() {
|
|
|
187
323
|
|
|
188
324
|
// Pre-fill --agent so the CLI doesn't re-prompt for the picker. Scope stays
|
|
189
325
|
// interactive on purpose — project vs global is a per-user decision.
|
|
190
|
-
const cliPath = path.join(__dirname, "..", "bin", "doc-detective.js");
|
|
191
326
|
const cliArgs = ["install-agents"];
|
|
192
327
|
for (const a of adaptersNeedingInstall) {
|
|
193
328
|
cliArgs.push("--agent", a.id);
|
|
@@ -197,7 +332,7 @@ async function maybePromptInstallAgents() {
|
|
|
197
332
|
// `node_modules/.bin` during the install step either.
|
|
198
333
|
const childEnv = { ...process.env, [pathKey]: sanitizedPath };
|
|
199
334
|
const { code, signal } = await new Promise((resolve) => {
|
|
200
|
-
const child = spawn(process.execPath, [
|
|
335
|
+
const child = spawn(process.execPath, [CLI_PATH, ...cliArgs], {
|
|
201
336
|
stdio: "inherit",
|
|
202
337
|
cwd: targetCwd,
|
|
203
338
|
env: childEnv,
|