@vforsh/argus 0.1.3 → 0.1.5
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 +6 -4
- package/dist/.tsbuildinfo +1 -1
- package/dist/argus.js +16381 -0
- package/dist/bin.d.ts +1 -1
- package/dist/bin.js +47 -759
- package/dist/bin.js.map +1 -1
- package/dist/cdp/resolveCdpEndpoint.js +2 -2
- package/dist/cdp/resolveCdpEndpoint.js.map +1 -1
- package/dist/cli/parse.d.ts +11 -0
- package/dist/cli/parse.d.ts.map +1 -0
- package/dist/cli/parse.js +48 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/cli/program.d.ts +3 -0
- package/dist/cli/program.d.ts.map +1 -0
- package/dist/cli/program.js +22 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/register/registerChrome.d.ts +3 -0
- package/dist/cli/register/registerChrome.d.ts.map +1 -0
- package/dist/cli/register/registerChrome.js +79 -0
- package/dist/cli/register/registerChrome.js.map +1 -0
- package/dist/cli/register/registerClick.d.ts +3 -0
- package/dist/cli/register/registerClick.d.ts.map +1 -0
- package/dist/cli/register/registerClick.js +23 -0
- package/dist/cli/register/registerClick.js.map +1 -0
- package/dist/cli/register/registerConfig.d.ts +3 -0
- package/dist/cli/register/registerConfig.d.ts.map +1 -0
- package/dist/cli/register/registerConfig.js +14 -0
- package/dist/cli/register/registerConfig.js.map +1 -0
- package/dist/cli/register/registerDom.d.ts +3 -0
- package/dist/cli/register/registerDom.d.ts.map +1 -0
- package/dist/cli/register/registerDom.js +261 -0
- package/dist/cli/register/registerDom.js.map +1 -0
- package/dist/cli/register/registerEval.d.ts +3 -0
- package/dist/cli/register/registerEval.d.ts.map +1 -0
- package/dist/cli/register/registerEval.js +129 -0
- package/dist/cli/register/registerEval.js.map +1 -0
- package/dist/cli/register/registerExtension.d.ts +3 -0
- package/dist/cli/register/registerExtension.d.ts.map +1 -0
- package/dist/cli/register/registerExtension.js +46 -0
- package/dist/cli/register/registerExtension.js.map +1 -0
- package/dist/cli/register/registerFill.d.ts +3 -0
- package/dist/cli/register/registerFill.d.ts.map +1 -0
- package/dist/cli/register/registerFill.js +30 -0
- package/dist/cli/register/registerFill.js.map +1 -0
- package/dist/cli/register/registerHover.d.ts +3 -0
- package/dist/cli/register/registerHover.d.ts.map +1 -0
- package/dist/cli/register/registerHover.js +20 -0
- package/dist/cli/register/registerHover.js.map +1 -0
- package/dist/cli/register/registerKeydown.d.ts +3 -0
- package/dist/cli/register/registerKeydown.d.ts.map +1 -0
- package/dist/cli/register/registerKeydown.js +20 -0
- package/dist/cli/register/registerKeydown.js.map +1 -0
- package/dist/cli/register/registerLogs.d.ts +3 -0
- package/dist/cli/register/registerLogs.d.ts.map +1 -0
- package/dist/cli/register/registerLogs.js +64 -0
- package/dist/cli/register/registerLogs.js.map +1 -0
- package/dist/cli/register/registerNet.d.ts +3 -0
- package/dist/cli/register/registerNet.d.ts.map +1 -0
- package/dist/cli/register/registerNet.js +32 -0
- package/dist/cli/register/registerNet.js.map +1 -0
- package/dist/cli/register/registerPage.d.ts +3 -0
- package/dist/cli/register/registerPage.d.ts.map +1 -0
- package/dist/cli/register/registerPage.js +106 -0
- package/dist/cli/register/registerPage.js.map +1 -0
- package/dist/cli/register/registerQuickAccess.d.ts +3 -0
- package/dist/cli/register/registerQuickAccess.d.ts.map +1 -0
- package/dist/cli/register/registerQuickAccess.js +82 -0
- package/dist/cli/register/registerQuickAccess.js.map +1 -0
- package/dist/cli/register/registerScrollTo.d.ts +3 -0
- package/dist/cli/register/registerScrollTo.d.ts.map +1 -0
- package/dist/cli/register/registerScrollTo.js +22 -0
- package/dist/cli/register/registerScrollTo.js.map +1 -0
- package/dist/cli/register/registerSnapshot.d.ts +3 -0
- package/dist/cli/register/registerSnapshot.d.ts.map +1 -0
- package/dist/cli/register/registerSnapshot.js +37 -0
- package/dist/cli/register/registerSnapshot.js.map +1 -0
- package/dist/cli/register/registerStorage.d.ts +3 -0
- package/dist/cli/register/registerStorage.d.ts.map +1 -0
- package/dist/cli/register/registerStorage.js +56 -0
- package/dist/cli/register/registerStorage.js.map +1 -0
- package/dist/cli/register/registerThrottle.d.ts +3 -0
- package/dist/cli/register/registerThrottle.d.ts.map +1 -0
- package/dist/cli/register/registerThrottle.js +33 -0
- package/dist/cli/register/registerThrottle.js.map +1 -0
- package/dist/cli/register/registerTrace.d.ts +3 -0
- package/dist/cli/register/registerTrace.d.ts.map +1 -0
- package/dist/cli/register/registerTrace.js +39 -0
- package/dist/cli/register/registerTrace.js.map +1 -0
- package/dist/cli/register/registerWatcher.d.ts +3 -0
- package/dist/cli/register/registerWatcher.d.ts.map +1 -0
- package/dist/cli/register/registerWatcher.js +115 -0
- package/dist/cli/register/registerWatcher.js.map +1 -0
- package/dist/cli/validation.d.ts +10 -0
- package/dist/cli/validation.d.ts.map +1 -0
- package/dist/cli/validation.js +24 -0
- package/dist/cli/validation.js.map +1 -0
- package/dist/commands/chrome.d.ts +23 -0
- package/dist/commands/chrome.d.ts.map +1 -1
- package/dist/commands/chrome.js +120 -0
- package/dist/commands/chrome.js.map +1 -1
- package/dist/commands/chromeStart.d.ts +24 -0
- package/dist/commands/chromeStart.d.ts.map +1 -1
- package/dist/commands/chromeStart.js +175 -105
- package/dist/commands/chromeStart.js.map +1 -1
- package/dist/commands/configInit.d.ts.map +1 -1
- package/dist/commands/configInit.js +27 -13
- package/dist/commands/configInit.js.map +1 -1
- package/dist/commands/domAdd.d.ts.map +1 -1
- package/dist/commands/domAdd.js +25 -47
- package/dist/commands/domAdd.js.map +1 -1
- package/dist/commands/domAddScript.d.ts +14 -0
- package/dist/commands/domAddScript.d.ts.map +1 -0
- package/dist/commands/domAddScript.js +172 -0
- package/dist/commands/domAddScript.js.map +1 -0
- package/dist/commands/domClick.d.ts +5 -1
- package/dist/commands/domClick.d.ts.map +1 -1
- package/dist/commands/domClick.js +74 -36
- package/dist/commands/domClick.js.map +1 -1
- package/dist/commands/domFill.d.ts +14 -0
- package/dist/commands/domFill.d.ts.map +1 -0
- package/dist/commands/domFill.js +129 -0
- package/dist/commands/domFill.js.map +1 -0
- package/dist/commands/domFocus.d.ts +10 -0
- package/dist/commands/domFocus.d.ts.map +1 -0
- package/dist/commands/domFocus.js +52 -0
- package/dist/commands/domFocus.js.map +1 -0
- package/dist/commands/domHover.d.ts +1 -0
- package/dist/commands/domHover.d.ts.map +1 -1
- package/dist/commands/domHover.js +17 -40
- package/dist/commands/domHover.js.map +1 -1
- package/dist/commands/domInfo.d.ts +1 -0
- package/dist/commands/domInfo.d.ts.map +1 -1
- package/dist/commands/domInfo.js +19 -51
- package/dist/commands/domInfo.js.map +1 -1
- package/dist/commands/domKeydown.d.ts +10 -0
- package/dist/commands/domKeydown.d.ts.map +1 -0
- package/dist/commands/domKeydown.js +46 -0
- package/dist/commands/domKeydown.js.map +1 -0
- package/dist/commands/domModify.d.ts +1 -0
- package/dist/commands/domModify.d.ts.map +1 -1
- package/dist/commands/domModify.js +14 -40
- package/dist/commands/domModify.js.map +1 -1
- package/dist/commands/domRemove.d.ts +1 -0
- package/dist/commands/domRemove.d.ts.map +1 -1
- package/dist/commands/domRemove.js +17 -40
- package/dist/commands/domRemove.js.map +1 -1
- package/dist/commands/domScroll.d.ts +12 -0
- package/dist/commands/domScroll.d.ts.map +1 -0
- package/dist/commands/domScroll.js +105 -0
- package/dist/commands/domScroll.js.map +1 -0
- package/dist/commands/domScrollTo.d.ts +12 -0
- package/dist/commands/domScrollTo.d.ts.map +1 -0
- package/dist/commands/domScrollTo.js +107 -0
- package/dist/commands/domScrollTo.js.map +1 -0
- package/dist/commands/domSetFile.d.ts +12 -0
- package/dist/commands/domSetFile.d.ts.map +1 -0
- package/dist/commands/domSetFile.js +87 -0
- package/dist/commands/domSetFile.js.map +1 -0
- package/dist/commands/domTree.d.ts +1 -0
- package/dist/commands/domTree.d.ts.map +1 -1
- package/dist/commands/domTree.js +20 -52
- package/dist/commands/domTree.js.map +1 -1
- package/dist/commands/eval.d.ts +5 -1
- package/dist/commands/eval.d.ts.map +1 -1
- package/dist/commands/eval.js +8 -148
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/evalShared.d.ts +64 -0
- package/dist/commands/evalShared.d.ts.map +1 -0
- package/dist/commands/evalShared.js +205 -0
- package/dist/commands/evalShared.js.map +1 -0
- package/dist/commands/evalUntil.d.ts +27 -0
- package/dist/commands/evalUntil.d.ts.map +1 -0
- package/dist/commands/evalUntil.js +128 -0
- package/dist/commands/evalUntil.js.map +1 -0
- package/dist/commands/extension/doctor.d.ts +5 -0
- package/dist/commands/extension/doctor.d.ts.map +1 -0
- package/dist/commands/extension/doctor.js +262 -0
- package/dist/commands/extension/doctor.js.map +1 -0
- package/dist/commands/extension/id.d.ts +9 -0
- package/dist/commands/extension/id.d.ts.map +1 -0
- package/dist/commands/extension/id.js +122 -0
- package/dist/commands/extension/id.js.map +1 -0
- package/dist/commands/extension/list.d.ts +8 -0
- package/dist/commands/extension/list.d.ts.map +1 -0
- package/dist/commands/extension/list.js +194 -0
- package/dist/commands/extension/list.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +36 -25
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +14 -55
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/net.d.ts.map +1 -1
- package/dist/commands/net.js +12 -53
- package/dist/commands/net.js.map +1 -1
- package/dist/commands/netTail.d.ts.map +1 -1
- package/dist/commands/netTail.js +4 -40
- package/dist/commands/netTail.js.map +1 -1
- package/dist/commands/page.d.ts +0 -1
- package/dist/commands/page.d.ts.map +1 -1
- package/dist/commands/page.js +3 -13
- package/dist/commands/page.js.map +1 -1
- package/dist/commands/pageEmulation.d.ts +20 -0
- package/dist/commands/pageEmulation.d.ts.map +1 -0
- package/dist/commands/pageEmulation.js +215 -0
- package/dist/commands/pageEmulation.js.map +1 -0
- package/dist/commands/reload.d.ts.map +1 -1
- package/dist/commands/reload.js +12 -39
- package/dist/commands/reload.js.map +1 -1
- package/dist/commands/resolveTestId.d.ts +10 -0
- package/dist/commands/resolveTestId.d.ts.map +1 -0
- package/dist/commands/resolveTestId.js +16 -0
- package/dist/commands/resolveTestId.js.map +1 -0
- package/dist/commands/screenshot.d.ts.map +1 -1
- package/dist/commands/screenshot.js +16 -41
- package/dist/commands/screenshot.js.map +1 -1
- package/dist/commands/snapshot.d.ts +10 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +54 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/start.d.ts +20 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +191 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/storageLocal.d.ts.map +1 -1
- package/dist/commands/storageLocal.js +16 -43
- package/dist/commands/storageLocal.js.map +1 -1
- package/dist/commands/tail.d.ts.map +1 -1
- package/dist/commands/tail.js +4 -40
- package/dist/commands/tail.js.map +1 -1
- package/dist/commands/throttle.d.ts +13 -0
- package/dist/commands/throttle.d.ts.map +1 -0
- package/dist/commands/throttle.js +124 -0
- package/dist/commands/throttle.js.map +1 -0
- package/dist/commands/trace.d.ts.map +1 -1
- package/dist/commands/trace.js +8 -38
- package/dist/commands/trace.js.map +1 -1
- package/dist/commands/watcherPrune.d.ts.map +1 -1
- package/dist/commands/watcherPrune.js +3 -4
- package/dist/commands/watcherPrune.js.map +1 -1
- package/dist/commands/watcherStart.d.ts +3 -0
- package/dist/commands/watcherStart.d.ts.map +1 -1
- package/dist/commands/watcherStart.js +28 -8
- package/dist/commands/watcherStart.js.map +1 -1
- package/dist/commands/watcherStatus.d.ts.map +1 -1
- package/dist/commands/watcherStatus.js +10 -32
- package/dist/commands/watcherStatus.js.map +1 -1
- package/dist/commands/watcherStop.d.ts.map +1 -1
- package/dist/commands/watcherStop.js +7 -14
- package/dist/commands/watcherStop.js.map +1 -1
- package/dist/config/argusConfig.d.ts +8 -10
- package/dist/config/argusConfig.d.ts.map +1 -1
- package/dist/config/argusConfig.js +49 -56
- package/dist/config/argusConfig.js.map +1 -1
- package/dist/emulation/devices.d.ts +15 -0
- package/dist/emulation/devices.d.ts.map +1 -0
- package/dist/emulation/devices.js +54 -0
- package/dist/emulation/devices.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/output/accessibility.d.ts +16 -0
- package/dist/output/accessibility.d.ts.map +1 -0
- package/dist/output/accessibility.js +61 -0
- package/dist/output/accessibility.js.map +1 -0
- package/dist/registry.d.ts +6 -6
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +20 -21
- package/dist/registry.js.map +1 -1
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +8 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/watchers/requestWatcher.d.ts +42 -0
- package/dist/watchers/requestWatcher.d.ts.map +1 -0
- package/dist/watchers/requestWatcher.js +77 -0
- package/dist/watchers/requestWatcher.js.map +1 -0
- package/dist/watchers/resolveWatcher.js +2 -2
- package/dist/watchers/resolveWatcher.js.map +1 -1
- package/package.json +10 -15
- package/schemas/argus.config.schema.json +16 -0
- package/dist/commands/contexts.d.ts +0 -7
- package/dist/commands/contexts.d.ts.map +0 -1
- package/dist/commands/contexts.js +0 -54
- package/dist/commands/contexts.js.map +0 -1
- package/dist/commands/domDiff.d.ts +0 -43
- package/dist/commands/domDiff.d.ts.map +0 -1
- package/dist/commands/domDiff.js +0 -279
- package/dist/commands/domDiff.js.map +0 -1
- package/dist/commands/extension/attach.d.ts +0 -8
- package/dist/commands/extension/attach.d.ts.map +0 -1
- package/dist/commands/extension/attach.js +0 -171
- package/dist/commands/extension/attach.js.map +0 -1
- package/dist/commands/extension/detach.d.ts +0 -6
- package/dist/commands/extension/detach.d.ts.map +0 -1
- package/dist/commands/extension/detach.js +0 -132
- package/dist/commands/extension/detach.js.map +0 -1
- package/dist/commands/extension/targets.d.ts +0 -13
- package/dist/commands/extension/targets.d.ts.map +0 -1
- package/dist/commands/extension/targets.js +0 -77
- package/dist/commands/extension/targets.js.map +0 -1
- package/dist/commands/frames.d.ts +0 -7
- package/dist/commands/frames.d.ts.map +0 -1
- package/dist/commands/frames.js +0 -90
- package/dist/commands/frames.js.map +0 -1
- package/dist/frame/frameSelector.d.ts +0 -14
- package/dist/frame/frameSelector.d.ts.map +0 -1
- package/dist/frame/frameSelector.js +0 -31
- package/dist/frame/frameSelector.js.map +0 -1
- package/dist/output/domDiff.d.ts +0 -14
- package/dist/output/domDiff.d.ts.map +0 -1
- package/dist/output/domDiff.js +0 -151
- package/dist/output/domDiff.js.map +0 -1
- package/dist/plugins/argusApi.d.ts +0 -22
- package/dist/plugins/argusApi.d.ts.map +0 -1
- package/dist/plugins/argusApi.js +0 -92
- package/dist/plugins/argusApi.js.map +0 -1
- package/dist/plugins/loader.d.ts +0 -12
- package/dist/plugins/loader.d.ts.map +0 -1
- package/dist/plugins/loader.js +0 -92
- package/dist/plugins/loader.js.map +0 -1
- package/dist/plugins/registry.d.ts +0 -17
- package/dist/plugins/registry.d.ts.map +0 -1
- package/dist/plugins/registry.js +0 -44
- package/dist/plugins/registry.js.map +0 -1
- package/dist/plugins/resolver.d.ts +0 -6
- package/dist/plugins/resolver.d.ts.map +0 -1
- package/dist/plugins/resolver.js +0 -86
- package/dist/plugins/resolver.js.map +0 -1
package/dist/commands/eval.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import { previewStringify } from '@vforsh/argus-core';
|
|
2
1
|
import { evalWithRetries } from '../eval/evalClient.js';
|
|
3
2
|
import { createOutput } from '../output/io.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { resolveWatcher } from '../watchers/resolveWatcher.js';
|
|
3
|
+
import { resolveWatcherOrExit } from '../watchers/requestWatcher.js';
|
|
4
|
+
import { formatError, parseCount, parseIntervalMs, parseNumber, parseRetryCount, printError, printSuccess, resolveExpression, sleep, wrapForIframeEval, } from './evalShared.js';
|
|
7
5
|
/** Execute the eval command for a watcher id. */
|
|
8
|
-
export const runEval = async (id,
|
|
6
|
+
export const runEval = async (id, rawExpression, options) => {
|
|
9
7
|
const output = createOutput(options);
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const resolvedExpression = await resolveExpression(rawExpression, options, output);
|
|
9
|
+
if (resolvedExpression == null) {
|
|
12
10
|
process.exitCode = 2;
|
|
13
11
|
return;
|
|
14
12
|
}
|
|
13
|
+
let expression = resolvedExpression;
|
|
15
14
|
// Wrap expression for iframe eval if --iframe is provided
|
|
16
15
|
if (options.iframe) {
|
|
17
16
|
const iframeTimeoutMs = parseNumber(options.iframeTimeout) ?? 5000;
|
|
@@ -55,16 +54,9 @@ export const runEval = async (id, expression, options) => {
|
|
|
55
54
|
process.exitCode = 2;
|
|
56
55
|
return;
|
|
57
56
|
}
|
|
58
|
-
const resolved = await
|
|
59
|
-
if (!resolved
|
|
60
|
-
output.writeWarn(resolved.error);
|
|
61
|
-
if (resolved.candidates && resolved.candidates.length > 0) {
|
|
62
|
-
writeWatcherCandidates(resolved.candidates, output);
|
|
63
|
-
output.writeWarn('Hint: run `argus list` to see all watchers.');
|
|
64
|
-
}
|
|
65
|
-
process.exitCode = resolved.exitCode;
|
|
57
|
+
const resolved = await resolveWatcherOrExit({ id }, output);
|
|
58
|
+
if (!resolved)
|
|
66
59
|
return;
|
|
67
|
-
}
|
|
68
60
|
const { watcher } = resolved;
|
|
69
61
|
const timeoutMs = parseNumber(options.timeout);
|
|
70
62
|
if (intervalMs.value == null) {
|
|
@@ -131,56 +123,6 @@ export const runEval = async (id, expression, options) => {
|
|
|
131
123
|
await sleep(intervalMs.value);
|
|
132
124
|
}
|
|
133
125
|
};
|
|
134
|
-
const parseNumber = (value) => {
|
|
135
|
-
if (!value) {
|
|
136
|
-
return undefined;
|
|
137
|
-
}
|
|
138
|
-
const parsed = Number(value);
|
|
139
|
-
if (!Number.isFinite(parsed)) {
|
|
140
|
-
return undefined;
|
|
141
|
-
}
|
|
142
|
-
return parsed;
|
|
143
|
-
};
|
|
144
|
-
const parseRetryCount = (value) => {
|
|
145
|
-
if (value == null) {
|
|
146
|
-
return { value: 0 };
|
|
147
|
-
}
|
|
148
|
-
const parsed = Number(value);
|
|
149
|
-
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
150
|
-
return { value: 0, error: 'Invalid --retry value: expected a non-negative integer.' };
|
|
151
|
-
}
|
|
152
|
-
return { value: parsed };
|
|
153
|
-
};
|
|
154
|
-
const parseIntervalMs = (value) => {
|
|
155
|
-
if (value == null) {
|
|
156
|
-
return {};
|
|
157
|
-
}
|
|
158
|
-
const trimmed = value.trim();
|
|
159
|
-
if (!trimmed) {
|
|
160
|
-
return { error: 'Invalid --interval value: empty duration.' };
|
|
161
|
-
}
|
|
162
|
-
let parsed;
|
|
163
|
-
if (/^[0-9]+$/.test(trimmed)) {
|
|
164
|
-
parsed = Number(trimmed);
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
parsed = parseDurationMs(trimmed);
|
|
168
|
-
}
|
|
169
|
-
if (parsed == null || !Number.isFinite(parsed) || parsed <= 0) {
|
|
170
|
-
return { error: 'Invalid --interval value: expected milliseconds or a duration like 250ms, 3s, 2m.' };
|
|
171
|
-
}
|
|
172
|
-
return { value: parsed };
|
|
173
|
-
};
|
|
174
|
-
const parseCount = (value) => {
|
|
175
|
-
if (value == null) {
|
|
176
|
-
return {};
|
|
177
|
-
}
|
|
178
|
-
const parsed = Number(value);
|
|
179
|
-
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
180
|
-
return { error: 'Invalid --count value: expected a positive integer.' };
|
|
181
|
-
}
|
|
182
|
-
return { value: parsed };
|
|
183
|
-
};
|
|
184
126
|
const compileUntil = (condition) => {
|
|
185
127
|
if (condition == null) {
|
|
186
128
|
return {};
|
|
@@ -207,86 +149,4 @@ const compileUntil = (condition) => {
|
|
|
207
149
|
},
|
|
208
150
|
};
|
|
209
151
|
};
|
|
210
|
-
const printSuccess = (response, options, output, streaming) => {
|
|
211
|
-
if (options.silent) {
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
if (options.json) {
|
|
215
|
-
if (streaming) {
|
|
216
|
-
output.writeJsonLine(response);
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
output.writeJson(response);
|
|
220
|
-
}
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
if (response.exception) {
|
|
224
|
-
output.writeHuman(formatException(response));
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
output.writeHuman(previewStringify(response.result));
|
|
228
|
-
};
|
|
229
|
-
const printError = (error, options, output) => {
|
|
230
|
-
if (options.json && 'response' in error && error.response) {
|
|
231
|
-
output.writeJsonLine(error.response);
|
|
232
|
-
}
|
|
233
|
-
if (error.kind === 'exception' && 'response' in error && error.response?.exception) {
|
|
234
|
-
output.writeWarn(formatException(error.response));
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
output.writeWarn(error.error);
|
|
238
|
-
};
|
|
239
|
-
const formatException = (response) => {
|
|
240
|
-
if (!response.exception) {
|
|
241
|
-
return '';
|
|
242
|
-
}
|
|
243
|
-
if (response.exception.details) {
|
|
244
|
-
return `Exception: ${response.exception.text}\n${previewStringify(response.exception.details)}`;
|
|
245
|
-
}
|
|
246
|
-
return `Exception: ${response.exception.text}`;
|
|
247
|
-
};
|
|
248
|
-
const sleep = async (durationMs) => {
|
|
249
|
-
await new Promise((resolve) => setTimeout(resolve, durationMs));
|
|
250
|
-
};
|
|
251
|
-
const formatError = (error) => {
|
|
252
|
-
if (!error) {
|
|
253
|
-
return 'unknown error';
|
|
254
|
-
}
|
|
255
|
-
if (error instanceof Error) {
|
|
256
|
-
return error.message;
|
|
257
|
-
}
|
|
258
|
-
return String(error);
|
|
259
|
-
};
|
|
260
|
-
/**
|
|
261
|
-
* Wrap an expression to eval it in an iframe via postMessage.
|
|
262
|
-
* The iframe must have the argus helper script loaded.
|
|
263
|
-
*/
|
|
264
|
-
const wrapForIframeEval = (code, config) => {
|
|
265
|
-
const { selector, namespace, timeoutMs } = config;
|
|
266
|
-
const evalType = `${namespace}:eval`;
|
|
267
|
-
const resultType = `${namespace}:eval-result`;
|
|
268
|
-
// Escape the code for embedding in a string
|
|
269
|
-
const escapedCode = JSON.stringify(code);
|
|
270
|
-
return `(async () => {
|
|
271
|
-
const iframe = document.querySelector(${JSON.stringify(selector)});
|
|
272
|
-
if (!iframe) throw new Error('Iframe not found: ${selector.replace(/'/g, "\\'")}');
|
|
273
|
-
if (!iframe.contentWindow) throw new Error('Iframe has no contentWindow');
|
|
274
|
-
const id = crypto.randomUUID();
|
|
275
|
-
return new Promise((resolve, reject) => {
|
|
276
|
-
const timeout = setTimeout(() => {
|
|
277
|
-
window.removeEventListener('message', handler);
|
|
278
|
-
reject(new Error('Iframe eval timeout after ${timeoutMs}ms'));
|
|
279
|
-
}, ${timeoutMs});
|
|
280
|
-
const handler = (e) => {
|
|
281
|
-
if (e.data?.type !== '${resultType}' || e.data.id !== id) return;
|
|
282
|
-
clearTimeout(timeout);
|
|
283
|
-
window.removeEventListener('message', handler);
|
|
284
|
-
if (e.data.ok) resolve(e.data.result);
|
|
285
|
-
else reject(new Error(e.data.error));
|
|
286
|
-
};
|
|
287
|
-
window.addEventListener('message', handler);
|
|
288
|
-
iframe.contentWindow.postMessage({ type: '${evalType}', id, code: ${escapedCode} }, '*');
|
|
289
|
-
});
|
|
290
|
-
})()`;
|
|
291
|
-
};
|
|
292
152
|
//# sourceMappingURL=eval.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { EvalResponse } from '@vforsh/argus-core';
|
|
2
|
+
import type { Output } from '../output/io.js';
|
|
3
|
+
export { formatError, parseNumber } from '../cli/parse.js';
|
|
4
|
+
type ExpressionSourceOptions = {
|
|
5
|
+
file?: string;
|
|
6
|
+
stdin?: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the JS expression from inline argument, --file, or --stdin.
|
|
10
|
+
* Returns `null` (and writes a warning) when the input is invalid.
|
|
11
|
+
*/
|
|
12
|
+
export declare const resolveExpression: (inline: string | undefined, options: ExpressionSourceOptions, output: Output) => Promise<string | null>;
|
|
13
|
+
/** Read all of stdin into a string. */
|
|
14
|
+
export declare const readStdin: () => Promise<string>;
|
|
15
|
+
/** Parse `--retry` flag into a non-negative integer. */
|
|
16
|
+
export declare const parseRetryCount: (value?: string) => {
|
|
17
|
+
value: number;
|
|
18
|
+
error?: string;
|
|
19
|
+
};
|
|
20
|
+
/** Parse `--interval` flag into milliseconds. Accepts bare numbers or durations (250ms, 3s, 2m). */
|
|
21
|
+
export declare const parseIntervalMs: (value?: string) => {
|
|
22
|
+
value?: number;
|
|
23
|
+
error?: string;
|
|
24
|
+
};
|
|
25
|
+
/** Parse `--count` flag into a positive integer. */
|
|
26
|
+
export declare const parseCount: (value?: string) => {
|
|
27
|
+
value?: number;
|
|
28
|
+
error?: string;
|
|
29
|
+
};
|
|
30
|
+
/** Sleep for `durationMs` milliseconds. */
|
|
31
|
+
export declare const sleep: (durationMs: number) => Promise<void>;
|
|
32
|
+
/** Format an exception response into a human-readable string. */
|
|
33
|
+
export declare const formatException: (response: EvalResponse) => string;
|
|
34
|
+
/** Failure shape used by `printError`. */
|
|
35
|
+
export type EvalAttemptFailure = {
|
|
36
|
+
ok: false;
|
|
37
|
+
kind: 'transport' | 'exception';
|
|
38
|
+
error: string;
|
|
39
|
+
response?: EvalResponse;
|
|
40
|
+
attempt: number;
|
|
41
|
+
};
|
|
42
|
+
type PrintableEvalOptions = {
|
|
43
|
+
json?: boolean;
|
|
44
|
+
silent?: boolean;
|
|
45
|
+
};
|
|
46
|
+
/** Print a successful eval response. */
|
|
47
|
+
export declare const printSuccess: (response: EvalResponse, options: PrintableEvalOptions, output: Output, streaming: boolean) => void;
|
|
48
|
+
/** Print an eval error (transport, exception, or until-condition failure). */
|
|
49
|
+
export declare const printError: (error: EvalAttemptFailure | {
|
|
50
|
+
kind: "until";
|
|
51
|
+
error: string;
|
|
52
|
+
}, options: PrintableEvalOptions, output: Output) => void;
|
|
53
|
+
/** Configuration for wrapping an expression for iframe eval via postMessage. */
|
|
54
|
+
export type IframeWrapConfig = {
|
|
55
|
+
selector: string;
|
|
56
|
+
namespace: string;
|
|
57
|
+
timeoutMs: number;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Wrap an expression to eval it in an iframe via postMessage.
|
|
61
|
+
* The iframe must have the argus helper script loaded.
|
|
62
|
+
*/
|
|
63
|
+
export declare const wrapForIframeEval: (code: string, config: IframeWrapConfig) => string;
|
|
64
|
+
//# sourceMappingURL=evalShared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evalShared.d.ts","sourceRoot":"","sources":["../../src/commands/evalShared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAItD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAI7C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAM1D,KAAK,uBAAuB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CACf,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,QAAQ,MAAM,GAAG,SAAS,EAAE,SAAS,uBAAuB,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CA0D3I,CAAA;AAED,uCAAuC;AACvC,eAAO,MAAM,SAAS,QAAa,OAAO,CAAC,MAAM,CAU9C,CAAA;AAMH,wDAAwD;AACxD,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,KAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAW/E,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,KAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAsBhF,CAAA;AAED,oDAAoD;AACpD,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,KAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAW3E,CAAA;AAMD,2CAA2C;AAC3C,eAAO,MAAM,KAAK,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CAE5D,CAAA;AAMD,iEAAiE;AACjE,eAAO,MAAM,eAAe,GAAI,UAAU,YAAY,KAAG,MAQxD,CAAA;AAMD,0CAA0C;AAC1C,MAAM,MAAM,kBAAkB,GAAG;IAChC,EAAE,EAAE,KAAK,CAAA;IACT,IAAI,EAAE,WAAW,GAAG,WAAW,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;CACf,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,wCAAwC;AACxC,eAAO,MAAM,YAAY,GAAI,UAAU,YAAY,EAAE,SAAS,oBAAoB,EAAE,QAAQ,MAAM,EAAE,WAAW,OAAO,KAAG,IAoBxH,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,UAAU,GAAI,OAAO,kBAAkB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,SAAS,oBAAoB,EAAE,QAAQ,MAAM,KAAG,IAWxI,CAAA;AAMD,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,QAAQ,gBAAgB,KAAG,MA6B1E,CAAA"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { previewStringify } from '@vforsh/argus-core';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { formatError, parseNumber } from '../cli/parse.js';
|
|
4
|
+
import { parseDurationMs } from '../time.js';
|
|
5
|
+
// Re-export shared parsers so existing eval imports keep working
|
|
6
|
+
export { formatError, parseNumber } from '../cli/parse.js';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the JS expression from inline argument, --file, or --stdin.
|
|
9
|
+
* Returns `null` (and writes a warning) when the input is invalid.
|
|
10
|
+
*/
|
|
11
|
+
export const resolveExpression = async (inline, options, output) => {
|
|
12
|
+
const wantsStdin = options.stdin === true || inline === '-';
|
|
13
|
+
const hasInline = inline != null && inline !== '-';
|
|
14
|
+
const hasFile = options.file != null;
|
|
15
|
+
if (hasInline && hasFile) {
|
|
16
|
+
output.writeWarn('Cannot combine an inline expression with --file');
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
if (hasInline && wantsStdin) {
|
|
20
|
+
output.writeWarn('Cannot combine an inline expression with --stdin');
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
if (hasFile && wantsStdin) {
|
|
24
|
+
output.writeWarn('Cannot combine --file with stdin input');
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
if (hasFile) {
|
|
28
|
+
try {
|
|
29
|
+
const content = await readFile(options.file ?? '', 'utf8');
|
|
30
|
+
if (!content.trim()) {
|
|
31
|
+
output.writeWarn(`File is empty: ${options.file}`);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return content;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
output.writeWarn(`Failed to read --file: ${formatError(error)}`);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (wantsStdin) {
|
|
42
|
+
try {
|
|
43
|
+
const content = await readStdin();
|
|
44
|
+
if (!content.trim()) {
|
|
45
|
+
output.writeWarn('Stdin input is empty');
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return content;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
output.writeWarn(`Failed to read stdin: ${formatError(error)}`);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (hasInline) {
|
|
56
|
+
if (!inline.trim()) {
|
|
57
|
+
output.writeWarn('Expression is empty');
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return inline;
|
|
61
|
+
}
|
|
62
|
+
output.writeWarn('Expression is required. Provide an inline expression, --file, or --stdin (or pass - as expression).');
|
|
63
|
+
return null;
|
|
64
|
+
};
|
|
65
|
+
/** Read all of stdin into a string. */
|
|
66
|
+
export const readStdin = async () => new Promise((resolve, reject) => {
|
|
67
|
+
let data = '';
|
|
68
|
+
process.stdin.setEncoding('utf8');
|
|
69
|
+
process.stdin.on('data', (chunk) => {
|
|
70
|
+
data += chunk;
|
|
71
|
+
});
|
|
72
|
+
process.stdin.on('end', () => resolve(data));
|
|
73
|
+
process.stdin.on('error', (error) => reject(error));
|
|
74
|
+
process.stdin.resume();
|
|
75
|
+
});
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Parsing helpers
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
/** Parse `--retry` flag into a non-negative integer. */
|
|
80
|
+
export const parseRetryCount = (value) => {
|
|
81
|
+
if (value == null) {
|
|
82
|
+
return { value: 0 };
|
|
83
|
+
}
|
|
84
|
+
const parsed = Number(value);
|
|
85
|
+
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
86
|
+
return { value: 0, error: 'Invalid --retry value: expected a non-negative integer.' };
|
|
87
|
+
}
|
|
88
|
+
return { value: parsed };
|
|
89
|
+
};
|
|
90
|
+
/** Parse `--interval` flag into milliseconds. Accepts bare numbers or durations (250ms, 3s, 2m). */
|
|
91
|
+
export const parseIntervalMs = (value) => {
|
|
92
|
+
if (value == null) {
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
const trimmed = value.trim();
|
|
96
|
+
if (!trimmed) {
|
|
97
|
+
return { error: 'Invalid --interval value: empty duration.' };
|
|
98
|
+
}
|
|
99
|
+
let parsed;
|
|
100
|
+
if (/^[0-9]+$/.test(trimmed)) {
|
|
101
|
+
parsed = Number(trimmed);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
parsed = parseDurationMs(trimmed);
|
|
105
|
+
}
|
|
106
|
+
if (parsed == null || !Number.isFinite(parsed) || parsed <= 0) {
|
|
107
|
+
return { error: 'Invalid --interval value: expected milliseconds or a duration like 250ms, 3s, 2m.' };
|
|
108
|
+
}
|
|
109
|
+
return { value: parsed };
|
|
110
|
+
};
|
|
111
|
+
/** Parse `--count` flag into a positive integer. */
|
|
112
|
+
export const parseCount = (value) => {
|
|
113
|
+
if (value == null) {
|
|
114
|
+
return {};
|
|
115
|
+
}
|
|
116
|
+
const parsed = Number(value);
|
|
117
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
118
|
+
return { error: 'Invalid --count value: expected a positive integer.' };
|
|
119
|
+
}
|
|
120
|
+
return { value: parsed };
|
|
121
|
+
};
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// Timing
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
/** Sleep for `durationMs` milliseconds. */
|
|
126
|
+
export const sleep = async (durationMs) => {
|
|
127
|
+
await new Promise((resolve) => setTimeout(resolve, durationMs));
|
|
128
|
+
};
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// Formatting
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
/** Format an exception response into a human-readable string. */
|
|
133
|
+
export const formatException = (response) => {
|
|
134
|
+
if (!response.exception) {
|
|
135
|
+
return '';
|
|
136
|
+
}
|
|
137
|
+
if (response.exception.details) {
|
|
138
|
+
return `Exception: ${response.exception.text}\n${previewStringify(response.exception.details)}`;
|
|
139
|
+
}
|
|
140
|
+
return `Exception: ${response.exception.text}`;
|
|
141
|
+
};
|
|
142
|
+
/** Print a successful eval response. */
|
|
143
|
+
export const printSuccess = (response, options, output, streaming) => {
|
|
144
|
+
if (options.silent) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (options.json) {
|
|
148
|
+
if (streaming) {
|
|
149
|
+
output.writeJsonLine(response);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
output.writeJson(response);
|
|
153
|
+
}
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (response.exception) {
|
|
157
|
+
output.writeHuman(formatException(response));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
output.writeHuman(previewStringify(response.result));
|
|
161
|
+
};
|
|
162
|
+
/** Print an eval error (transport, exception, or until-condition failure). */
|
|
163
|
+
export const printError = (error, options, output) => {
|
|
164
|
+
if (options.json && 'response' in error && error.response) {
|
|
165
|
+
output.writeJsonLine(error.response);
|
|
166
|
+
}
|
|
167
|
+
if (error.kind === 'exception' && 'response' in error && error.response?.exception) {
|
|
168
|
+
output.writeWarn(formatException(error.response));
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
output.writeWarn(error.error);
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Wrap an expression to eval it in an iframe via postMessage.
|
|
175
|
+
* The iframe must have the argus helper script loaded.
|
|
176
|
+
*/
|
|
177
|
+
export const wrapForIframeEval = (code, config) => {
|
|
178
|
+
const { selector, namespace, timeoutMs } = config;
|
|
179
|
+
const evalType = `${namespace}:eval`;
|
|
180
|
+
const resultType = `${namespace}:eval-result`;
|
|
181
|
+
// Escape the code for embedding in a string
|
|
182
|
+
const escapedCode = JSON.stringify(code);
|
|
183
|
+
return `(async () => {
|
|
184
|
+
const iframe = document.querySelector(${JSON.stringify(selector)});
|
|
185
|
+
if (!iframe) throw new Error('Iframe not found: ${selector.replace(/'/g, "\\'")}');
|
|
186
|
+
if (!iframe.contentWindow) throw new Error('Iframe has no contentWindow');
|
|
187
|
+
const id = crypto.randomUUID();
|
|
188
|
+
return new Promise((resolve, reject) => {
|
|
189
|
+
const timeout = setTimeout(() => {
|
|
190
|
+
window.removeEventListener('message', handler);
|
|
191
|
+
reject(new Error('Iframe eval timeout after ${timeoutMs}ms'));
|
|
192
|
+
}, ${timeoutMs});
|
|
193
|
+
const handler = (e) => {
|
|
194
|
+
if (e.data?.type !== '${resultType}' || e.data.id !== id) return;
|
|
195
|
+
clearTimeout(timeout);
|
|
196
|
+
window.removeEventListener('message', handler);
|
|
197
|
+
if (e.data.ok) resolve(e.data.result);
|
|
198
|
+
else reject(new Error(e.data.error));
|
|
199
|
+
};
|
|
200
|
+
window.addEventListener('message', handler);
|
|
201
|
+
iframe.contentWindow.postMessage({ type: '${evalType}', id, code: ${escapedCode} }, '*');
|
|
202
|
+
});
|
|
203
|
+
})()`;
|
|
204
|
+
};
|
|
205
|
+
//# sourceMappingURL=evalShared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evalShared.js","sourceRoot":"","sources":["../../src/commands/evalShared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Options for the eval-until command. */
|
|
2
|
+
export type EvalUntilOptions = {
|
|
3
|
+
json?: boolean;
|
|
4
|
+
await?: boolean;
|
|
5
|
+
timeout?: string;
|
|
6
|
+
returnByValue?: boolean;
|
|
7
|
+
failOnException?: boolean;
|
|
8
|
+
retry?: string;
|
|
9
|
+
silent?: boolean;
|
|
10
|
+
interval?: string;
|
|
11
|
+
count?: string;
|
|
12
|
+
totalTimeout?: string;
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
/** Read expression from a file path. */
|
|
15
|
+
file?: string;
|
|
16
|
+
/** Read expression from stdin. Also activated when expression is `-`. */
|
|
17
|
+
stdin?: boolean;
|
|
18
|
+
/** CSS selector for iframe to eval in via postMessage (extension mode). */
|
|
19
|
+
iframe?: string;
|
|
20
|
+
/** Message type prefix for iframe eval (default: argus). */
|
|
21
|
+
iframeNamespace?: string;
|
|
22
|
+
/** Timeout for iframe postMessage response in ms (default: 5000). */
|
|
23
|
+
iframeTimeout?: string;
|
|
24
|
+
};
|
|
25
|
+
/** Execute the eval-until command: poll until the expression returns a truthy value. */
|
|
26
|
+
export declare const runEvalUntil: (id: string | undefined, rawExpression: string | undefined, options: EvalUntilOptions) => Promise<void>;
|
|
27
|
+
//# sourceMappingURL=evalUntil.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evalUntil.d.ts","sourceRoot":"","sources":["../../src/commands/evalUntil.ts"],"names":[],"mappings":"AAgBA,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wFAAwF;AACxF,eAAO,MAAM,YAAY,GAAU,IAAI,MAAM,GAAG,SAAS,EAAE,eAAe,MAAM,GAAG,SAAS,EAAE,SAAS,gBAAgB,KAAG,OAAO,CAAC,IAAI,CAyHrI,CAAA"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { evalWithRetries } from '../eval/evalClient.js';
|
|
2
|
+
import { createOutput } from '../output/io.js';
|
|
3
|
+
import { parseDurationMs } from '../time.js';
|
|
4
|
+
import { resolveWatcherOrExit } from '../watchers/requestWatcher.js';
|
|
5
|
+
import { parseCount, parseIntervalMs, parseNumber, parseRetryCount, printError, printSuccess, resolveExpression, sleep, wrapForIframeEval, } from './evalShared.js';
|
|
6
|
+
/** Execute the eval-until command: poll until the expression returns a truthy value. */
|
|
7
|
+
export const runEvalUntil = async (id, rawExpression, options) => {
|
|
8
|
+
const output = createOutput(options);
|
|
9
|
+
const resolvedExpression = await resolveExpression(rawExpression, options, output);
|
|
10
|
+
if (resolvedExpression == null) {
|
|
11
|
+
process.exitCode = 2;
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
let expression = resolvedExpression;
|
|
15
|
+
if (options.iframe) {
|
|
16
|
+
const iframeTimeoutMs = parseNumber(options.iframeTimeout) ?? 5000;
|
|
17
|
+
expression = wrapForIframeEval(expression, {
|
|
18
|
+
selector: options.iframe,
|
|
19
|
+
namespace: options.iframeNamespace ?? 'argus',
|
|
20
|
+
timeoutMs: iframeTimeoutMs,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const retryCount = parseRetryCount(options.retry);
|
|
24
|
+
if (retryCount.error) {
|
|
25
|
+
output.writeWarn(retryCount.error);
|
|
26
|
+
process.exitCode = 2;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const intervalMs = parseIntervalMs(options.interval);
|
|
30
|
+
if (intervalMs.error) {
|
|
31
|
+
output.writeWarn(intervalMs.error);
|
|
32
|
+
process.exitCode = 2;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const pollIntervalMs = intervalMs.value ?? 250;
|
|
36
|
+
const countValue = parseCount(options.count);
|
|
37
|
+
if (countValue.error) {
|
|
38
|
+
output.writeWarn(countValue.error);
|
|
39
|
+
process.exitCode = 2;
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const totalTimeoutMs = parseTotalTimeout(options.totalTimeout);
|
|
43
|
+
if (totalTimeoutMs.error) {
|
|
44
|
+
output.writeWarn(totalTimeoutMs.error);
|
|
45
|
+
process.exitCode = 2;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const resolved = await resolveWatcherOrExit({ id }, output);
|
|
49
|
+
if (!resolved)
|
|
50
|
+
return;
|
|
51
|
+
const { watcher } = resolved;
|
|
52
|
+
const timeoutMs = parseNumber(options.timeout);
|
|
53
|
+
let running = true;
|
|
54
|
+
let interrupted = false;
|
|
55
|
+
const stop = () => {
|
|
56
|
+
running = false;
|
|
57
|
+
interrupted = true;
|
|
58
|
+
};
|
|
59
|
+
process.on('SIGINT', stop);
|
|
60
|
+
process.on('SIGTERM', stop);
|
|
61
|
+
const startTime = Date.now();
|
|
62
|
+
let iteration = 0;
|
|
63
|
+
while (running) {
|
|
64
|
+
// Check total timeout before evaluating
|
|
65
|
+
if (totalTimeoutMs.value != null) {
|
|
66
|
+
const elapsed = Date.now() - startTime;
|
|
67
|
+
if (elapsed >= totalTimeoutMs.value) {
|
|
68
|
+
output.writeWarn(`Total timeout exceeded (${options.totalTimeout})`);
|
|
69
|
+
process.exitCode = 1;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
iteration += 1;
|
|
74
|
+
const iterationResult = await evalWithRetries({
|
|
75
|
+
watcher,
|
|
76
|
+
expression,
|
|
77
|
+
awaitPromise: options.await ?? true,
|
|
78
|
+
returnByValue: options.returnByValue ?? true,
|
|
79
|
+
timeoutMs,
|
|
80
|
+
failOnException: options.failOnException ?? true,
|
|
81
|
+
retryCount: retryCount.value,
|
|
82
|
+
});
|
|
83
|
+
if (!iterationResult.ok) {
|
|
84
|
+
printError(iterationResult, options, output);
|
|
85
|
+
process.exitCode = 1;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const isTruthy = Boolean(iterationResult.response.result);
|
|
89
|
+
if (isTruthy) {
|
|
90
|
+
printSuccess(iterationResult.response, options, output, false);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (options.verbose) {
|
|
94
|
+
printSuccess(iterationResult.response, options, output, true);
|
|
95
|
+
}
|
|
96
|
+
// Check count limit after evaluating
|
|
97
|
+
if (countValue.value != null && iteration >= countValue.value) {
|
|
98
|
+
output.writeWarn(`Exhausted after ${iteration} iterations without a truthy result`);
|
|
99
|
+
process.exitCode = 1;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
await sleep(pollIntervalMs);
|
|
103
|
+
}
|
|
104
|
+
if (interrupted) {
|
|
105
|
+
process.exitCode = 130;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const parseTotalTimeout = (value) => {
|
|
109
|
+
if (value == null) {
|
|
110
|
+
return {};
|
|
111
|
+
}
|
|
112
|
+
const trimmed = value.trim();
|
|
113
|
+
if (!trimmed) {
|
|
114
|
+
return { error: 'Invalid --total-timeout value: empty duration.' };
|
|
115
|
+
}
|
|
116
|
+
let parsed;
|
|
117
|
+
if (/^[0-9]+$/.test(trimmed)) {
|
|
118
|
+
parsed = Number(trimmed);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
parsed = parseDurationMs(trimmed);
|
|
122
|
+
}
|
|
123
|
+
if (parsed == null || !Number.isFinite(parsed) || parsed <= 0) {
|
|
124
|
+
return { error: 'Invalid --total-timeout value: expected milliseconds or a duration like 30s, 2m, 1h.' };
|
|
125
|
+
}
|
|
126
|
+
return { value: parsed };
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=evalUntil.js.map
|