callman-core 1.0.6 → 1.2.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.
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/script/errors.d.ts +3 -0
- package/dist/script/errors.d.ts.map +1 -0
- package/dist/script/errors.js +68 -0
- package/dist/script/errors.js.map +1 -0
- package/dist/script/executor.d.ts +5 -0
- package/dist/script/executor.d.ts.map +1 -0
- package/dist/script/executor.js +301 -0
- package/dist/script/executor.js.map +1 -0
- package/dist/script/features/assertions.d.ts +46 -0
- package/dist/script/features/assertions.d.ts.map +1 -0
- package/dist/script/features/assertions.js +264 -0
- package/dist/script/features/assertions.js.map +1 -0
- package/dist/script/features/counter.d.ts +11 -0
- package/dist/script/features/counter.d.ts.map +1 -0
- package/dist/script/features/counter.js +43 -0
- package/dist/script/features/counter.js.map +1 -0
- package/dist/script/features/cryptojs.d.ts +13 -0
- package/dist/script/features/cryptojs.d.ts.map +1 -0
- package/dist/script/features/cryptojs.js +63 -0
- package/dist/script/features/cryptojs.js.map +1 -0
- package/dist/script/features/db.d.ts +36 -0
- package/dist/script/features/db.d.ts.map +1 -0
- package/dist/script/features/db.js +165 -0
- package/dist/script/features/db.js.map +1 -0
- package/dist/script/features/environment.d.ts +11 -0
- package/dist/script/features/environment.d.ts.map +1 -0
- package/dist/script/features/environment.js +61 -0
- package/dist/script/features/environment.js.map +1 -0
- package/dist/script/features/feature-policy.d.ts +8 -0
- package/dist/script/features/feature-policy.d.ts.map +1 -0
- package/dist/script/features/feature-policy.js +88 -0
- package/dist/script/features/feature-policy.js.map +1 -0
- package/dist/script/features/kafka.d.ts +11 -0
- package/dist/script/features/kafka.d.ts.map +1 -0
- package/dist/script/features/kafka.js +71 -0
- package/dist/script/features/kafka.js.map +1 -0
- package/dist/script/features/log.d.ts +15 -0
- package/dist/script/features/log.d.ts.map +1 -0
- package/dist/script/features/log.js +59 -0
- package/dist/script/features/log.js.map +1 -0
- package/dist/script/features/node.d.ts +14 -0
- package/dist/script/features/node.d.ts.map +1 -0
- package/dist/script/features/node.js +82 -0
- package/dist/script/features/node.js.map +1 -0
- package/dist/script/features/random.d.ts +13 -0
- package/dist/script/features/random.d.ts.map +1 -0
- package/dist/script/features/random.js +111 -0
- package/dist/script/features/random.js.map +1 -0
- package/dist/script/features/redis.d.ts +10 -0
- package/dist/script/features/redis.d.ts.map +1 -0
- package/dist/script/features/redis.js +22 -0
- package/dist/script/features/redis.js.map +1 -0
- package/dist/script/features/request.d.ts +23 -0
- package/dist/script/features/request.d.ts.map +1 -0
- package/dist/script/features/request.js +105 -0
- package/dist/script/features/request.js.map +1 -0
- package/dist/script/features/response.d.ts +25 -0
- package/dist/script/features/response.d.ts.map +1 -0
- package/dist/script/features/response.js +43 -0
- package/dist/script/features/response.js.map +1 -0
- package/dist/script/features/tests.d.ts +15 -0
- package/dist/script/features/tests.d.ts.map +1 -0
- package/dist/script/features/tests.js +147 -0
- package/dist/script/features/tests.js.map +1 -0
- package/dist/script/features/variables.d.ts +6 -0
- package/dist/script/features/variables.d.ts.map +1 -0
- package/dist/script/features/variables.js +25 -0
- package/dist/script/features/variables.js.map +1 -0
- package/dist/script/legacy.d.ts +4 -0
- package/dist/script/legacy.d.ts.map +1 -0
- package/dist/script/legacy.js +128 -0
- package/dist/script/legacy.js.map +1 -0
- package/dist/script/sandbox.d.ts +16 -0
- package/dist/script/sandbox.d.ts.map +1 -0
- package/dist/script/sandbox.js +51 -0
- package/dist/script/sandbox.js.map +1 -0
- package/dist/script/scope.d.ts +23 -0
- package/dist/script/scope.d.ts.map +1 -0
- package/dist/script/scope.js +172 -0
- package/dist/script/scope.js.map +1 -0
- package/dist/script/scriptEngine.d.ts +2 -2
- package/dist/script/scriptEngine.d.ts.map +1 -1
- package/dist/script/scriptEngine.js +7 -105
- package/dist/script/scriptEngine.js.map +1 -1
- package/dist/script/timeout.d.ts +3 -0
- package/dist/script/timeout.d.ts.map +1 -0
- package/dist/script/timeout.js +38 -0
- package/dist/script/timeout.js.map +1 -0
- package/dist/script/types.d.ts +167 -0
- package/dist/script/types.d.ts.map +1 -0
- package/dist/script/types.js +7 -0
- package/dist/script/types.js.map +1 -0
- package/dist-cjs/contract/contractValidator.js +236 -0
- package/dist-cjs/contract/contractValidator.js.map +1 -0
- package/dist-cjs/index.js +47 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/package.json +1 -0
- package/dist-cjs/request/executeRequest.js +33 -0
- package/dist-cjs/request/executeRequest.js.map +1 -0
- package/dist-cjs/runner/requestRunner.js +102 -0
- package/dist-cjs/runner/requestRunner.js.map +1 -0
- package/dist-cjs/runner/runCollection.js +53 -0
- package/dist-cjs/runner/runCollection.js.map +1 -0
- package/dist-cjs/scenario-runner/condition.js +1735 -0
- package/dist-cjs/scenario-runner/condition.js.map +1 -0
- package/dist-cjs/scenario-runner/conditionTypes.js +3 -0
- package/dist-cjs/scenario-runner/conditionTypes.js.map +1 -0
- package/dist-cjs/scenario-runner/executionPolicyRunner.js +53 -0
- package/dist-cjs/scenario-runner/executionPolicyRunner.js.map +1 -0
- package/dist-cjs/scenario-runner/graphTraversal.js +27 -0
- package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -0
- package/dist-cjs/scenario-runner/index.js +39 -0
- package/dist-cjs/scenario-runner/index.js.map +1 -0
- package/dist-cjs/scenario-runner/nodePolicy.js +127 -0
- package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -0
- package/dist-cjs/scenario-runner/notification/index.js +18 -0
- package/dist-cjs/scenario-runner/notification/index.js.map +1 -0
- package/dist-cjs/scenario-runner/notification/providers/provider.interface.js +3 -0
- package/dist-cjs/scenario-runner/notification/providers/provider.interface.js.map +1 -0
- package/dist-cjs/scenario-runner/notification/providers/slack.provider.js +88 -0
- package/dist-cjs/scenario-runner/notification/providers/slack.provider.js.map +1 -0
- package/dist-cjs/scenario-runner/notification/template.js +13 -0
- package/dist-cjs/scenario-runner/notification/template.js.map +1 -0
- package/dist-cjs/scenario-runner/retryExecutor.js +57 -0
- package/dist-cjs/scenario-runner/retryExecutor.js.map +1 -0
- package/dist-cjs/scenario-runner/runScenario.js +1545 -0
- package/dist-cjs/scenario-runner/runScenario.js.map +1 -0
- package/dist-cjs/scenario-runner/templateResolver.js +468 -0
- package/dist-cjs/scenario-runner/templateResolver.js.map +1 -0
- package/dist-cjs/scenario-runner/types.js +3 -0
- package/dist-cjs/scenario-runner/types.js.map +1 -0
- package/dist-cjs/scenario-runner/waitNodeExecutor.js +71 -0
- package/dist-cjs/scenario-runner/waitNodeExecutor.js.map +1 -0
- package/dist-cjs/script/errors.js +72 -0
- package/dist-cjs/script/errors.js.map +1 -0
- package/dist-cjs/script/executor.js +306 -0
- package/dist-cjs/script/executor.js.map +1 -0
- package/dist-cjs/script/features/assertions.js +269 -0
- package/dist-cjs/script/features/assertions.js.map +1 -0
- package/dist-cjs/script/features/counter.js +47 -0
- package/dist-cjs/script/features/counter.js.map +1 -0
- package/dist-cjs/script/features/cryptojs.js +67 -0
- package/dist-cjs/script/features/cryptojs.js.map +1 -0
- package/dist-cjs/script/features/db.js +169 -0
- package/dist-cjs/script/features/db.js.map +1 -0
- package/dist-cjs/script/features/environment.js +65 -0
- package/dist-cjs/script/features/environment.js.map +1 -0
- package/dist-cjs/script/features/feature-policy.js +94 -0
- package/dist-cjs/script/features/feature-policy.js.map +1 -0
- package/dist-cjs/script/features/kafka.js +77 -0
- package/dist-cjs/script/features/kafka.js.map +1 -0
- package/dist-cjs/script/features/log.js +64 -0
- package/dist-cjs/script/features/log.js.map +1 -0
- package/dist-cjs/script/features/node.js +89 -0
- package/dist-cjs/script/features/node.js.map +1 -0
- package/dist-cjs/script/features/random.js +115 -0
- package/dist-cjs/script/features/random.js.map +1 -0
- package/dist-cjs/script/features/redis.js +26 -0
- package/dist-cjs/script/features/redis.js.map +1 -0
- package/dist-cjs/script/features/request.js +109 -0
- package/dist-cjs/script/features/request.js.map +1 -0
- package/dist-cjs/script/features/response.js +47 -0
- package/dist-cjs/script/features/response.js.map +1 -0
- package/dist-cjs/script/features/tests.js +151 -0
- package/dist-cjs/script/features/tests.js.map +1 -0
- package/dist-cjs/script/features/variables.js +29 -0
- package/dist-cjs/script/features/variables.js.map +1 -0
- package/dist-cjs/script/legacy.js +132 -0
- package/dist-cjs/script/legacy.js.map +1 -0
- package/dist-cjs/script/pmApi.js +353 -0
- package/dist-cjs/script/pmApi.js.map +1 -0
- package/dist-cjs/script/sandbox.js +91 -0
- package/dist-cjs/script/sandbox.js.map +1 -0
- package/dist-cjs/script/scope.js +177 -0
- package/dist-cjs/script/scope.js.map +1 -0
- package/dist-cjs/script/scriptEngine.js +12 -0
- package/dist-cjs/script/scriptEngine.js.map +1 -0
- package/dist-cjs/script/timeout.js +43 -0
- package/dist-cjs/script/timeout.js.map +1 -0
- package/dist-cjs/script/types.js +8 -0
- package/dist-cjs/script/types.js.map +1 -0
- package/dist-cjs/types/index.js +3 -0
- package/dist-cjs/types/index.js.map +1 -0
- package/dist-cjs/utils/get.js +52 -0
- package/dist-cjs/utils/get.js.map +1 -0
- package/dist-cjs/utils/random.js +87 -0
- package/dist-cjs/utils/random.js.map +1 -0
- package/dist-cjs/variables/envStore.js +24 -0
- package/dist-cjs/variables/envStore.js.map +1 -0
- package/dist-cjs/variables/resolver.js +95 -0
- package/dist-cjs/variables/resolver.js.map +1 -0
- package/package.json +19 -3
- package/samples/runSample.mjs +0 -128
- package/tests/waitNode.test.mjs +0 -311
- package/tsconfig.json +0 -18
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// vm-based sandbox for the canonical script executor.
|
|
2
|
+
//
|
|
3
|
+
// Compiles the user's script wrapped in an async IIFE + `with(scope)` block,
|
|
4
|
+
// then runs it inside a vm.createContext with codeGeneration disabled to
|
|
5
|
+
// neutralize `eval` / `new Function(...)` attempts. NOTE: Node's `vm` module
|
|
6
|
+
// is explicitly *not* a security boundary — this provides isolation against
|
|
7
|
+
// accidental cross-contamination, not against hostile scripts. A future
|
|
8
|
+
// `isolated-vm` migration should be tracked separately.
|
|
9
|
+
import * as vm from "node:vm";
|
|
10
|
+
import { buildScopeTarget, createScopeProxy } from "./scope.js";
|
|
11
|
+
export const SCRIPT_LINE_OFFSET = -2;
|
|
12
|
+
export const wrapScriptSource = (script) => [
|
|
13
|
+
"(async function () {",
|
|
14
|
+
"with (scope) {",
|
|
15
|
+
script,
|
|
16
|
+
"}",
|
|
17
|
+
"}).call(context)",
|
|
18
|
+
].join("\n");
|
|
19
|
+
export const compileScript = (script, filename) => new vm.Script(wrapScriptSource(script), {
|
|
20
|
+
filename,
|
|
21
|
+
lineOffset: SCRIPT_LINE_OFFSET,
|
|
22
|
+
});
|
|
23
|
+
export const createSandbox = (bindings, filename) => {
|
|
24
|
+
const scopeTarget = buildScopeTarget(bindings);
|
|
25
|
+
const scope = createScopeProxy(scopeTarget);
|
|
26
|
+
// NOTE: We deliberately omit `microtaskMode: "afterEvaluate"` here. With
|
|
27
|
+
// that mode, microtasks scheduled inside the vm context are drained once
|
|
28
|
+
// (right after the synchronous portion of the script completes) but not
|
|
29
|
+
// again. That breaks fire-and-forget `pm.test(async () => {...})` because
|
|
30
|
+
// the host-side `tests.flush()` then awaits a Promise whose continuation
|
|
31
|
+
// is parked on a microtask queue that no one is draining. Backend and
|
|
32
|
+
// electron sandboxes both used afterEvaluate and would have hit the same
|
|
33
|
+
// bug; keeping it off here is the right canonical default.
|
|
34
|
+
const vmContext = vm.createContext({
|
|
35
|
+
scope,
|
|
36
|
+
context: Object.create(null),
|
|
37
|
+
}, {
|
|
38
|
+
name: filename,
|
|
39
|
+
codeGeneration: {
|
|
40
|
+
strings: false,
|
|
41
|
+
wasm: false,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
return { scope, vmContext };
|
|
45
|
+
};
|
|
46
|
+
export const compileAndPrepare = (script, bindings, filename) => {
|
|
47
|
+
const { scope, vmContext } = createSandbox(bindings, filename);
|
|
48
|
+
const vmScript = compileScript(script, filename);
|
|
49
|
+
return { vmScript, scope, vmContext };
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/script/sandbox.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,6EAA6E;AAC7E,4EAA4E;AAC5E,wEAAwE;AACxE,wDAAwD;AAExD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,CAAC;AAErC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAU,EAAE,CACzD;IACE,sBAAsB;IACtB,gBAAgB;IAChB,MAAM;IACN,GAAG;IACH,kBAAkB;CACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAQf,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAa,EAAE,CAC3E,IAAI,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE;IACtC,QAAQ;IACR,UAAU,EAAE,kBAAkB;CAC/B,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,QAAuB,EACvB,QAAgB,EAC2C,EAAE;IAC7D,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC5C,yEAAyE;IACzE,yEAAyE;IACzE,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,sEAAsE;IACtE,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,SAAS,GAAG,EAAE,CAAC,aAAa,CAChC;QACE,KAAK;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;KAC7B,EACD;QACE,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE;YACd,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,KAAK;SACZ;KACF,CACF,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAc,EACd,QAAuB,EACvB,QAAgB,EACO,EAAE;IACzB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const RESERVED_LABEL_NAMES: Set<string>;
|
|
2
|
+
export declare const VALID_LABEL_IDENTIFIER_PATTERN: RegExp;
|
|
3
|
+
export interface ScopeBindings {
|
|
4
|
+
pm: Record<string, unknown>;
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
environment?: unknown;
|
|
7
|
+
request?: unknown;
|
|
8
|
+
response?: unknown;
|
|
9
|
+
test?: unknown;
|
|
10
|
+
expect?: unknown;
|
|
11
|
+
console?: Record<string, (...args: unknown[]) => void>;
|
|
12
|
+
db?: unknown;
|
|
13
|
+
kafka?: unknown;
|
|
14
|
+
redis?: unknown;
|
|
15
|
+
random?: unknown;
|
|
16
|
+
counter?: unknown;
|
|
17
|
+
variables?: unknown;
|
|
18
|
+
CryptoJS?: unknown;
|
|
19
|
+
labelGlobals?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
export declare const buildScopeTarget: (bindings: ScopeBindings) => Record<string, unknown>;
|
|
22
|
+
export declare const createScopeProxy: (target: Record<string, unknown>) => Record<string, unknown>;
|
|
23
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/script/scope.ts"],"names":[],"mappings":"AAiFA,eAAO,MAAM,oBAAoB,aAgB/B,CAAC;AAEH,eAAO,MAAM,8BAA8B,QAAuB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAE5B,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAM5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;IAIvD,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,gBAAgB,GAAI,UAAU,aAAa,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA4DhF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAiBrF,CAAC"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// Reserved globals + scope target builder for the canonical sandbox.
|
|
2
|
+
//
|
|
3
|
+
// The "allowed" list is intentionally larger than callman-core's legacy
|
|
4
|
+
// scriptEngine — it adopts the union seen in the backend/electron sandboxes
|
|
5
|
+
// (Error subclasses, Map/Set, Symbol, BigInt, TextEncoder/Decoder). This
|
|
6
|
+
// is documented as an intentional behavior change for callers that came
|
|
7
|
+
// from the older A path.
|
|
8
|
+
//
|
|
9
|
+
// The "blocked" set is the safety floor: these names are always undefined
|
|
10
|
+
// in user scripts, regardless of what the caller passes in `bindings`.
|
|
11
|
+
const ALLOWED_GLOBALS = {
|
|
12
|
+
JSON,
|
|
13
|
+
Math,
|
|
14
|
+
Number,
|
|
15
|
+
String,
|
|
16
|
+
Boolean,
|
|
17
|
+
Array,
|
|
18
|
+
Object,
|
|
19
|
+
Date,
|
|
20
|
+
RegExp,
|
|
21
|
+
Promise,
|
|
22
|
+
Error,
|
|
23
|
+
TypeError,
|
|
24
|
+
ReferenceError,
|
|
25
|
+
SyntaxError,
|
|
26
|
+
RangeError,
|
|
27
|
+
EvalError,
|
|
28
|
+
URIError,
|
|
29
|
+
AggregateError,
|
|
30
|
+
Map,
|
|
31
|
+
Set,
|
|
32
|
+
WeakMap,
|
|
33
|
+
WeakSet,
|
|
34
|
+
Symbol,
|
|
35
|
+
BigInt,
|
|
36
|
+
URL,
|
|
37
|
+
URLSearchParams,
|
|
38
|
+
TextEncoder,
|
|
39
|
+
TextDecoder,
|
|
40
|
+
parseInt,
|
|
41
|
+
parseFloat,
|
|
42
|
+
encodeURIComponent,
|
|
43
|
+
decodeURIComponent,
|
|
44
|
+
isFinite,
|
|
45
|
+
isNaN,
|
|
46
|
+
// Sentinel values — these are not constructors but are safe to expose
|
|
47
|
+
undefined,
|
|
48
|
+
NaN,
|
|
49
|
+
Infinity,
|
|
50
|
+
};
|
|
51
|
+
const BLOCKED_GLOBALS = [
|
|
52
|
+
"eval",
|
|
53
|
+
"Function",
|
|
54
|
+
"Buffer",
|
|
55
|
+
"setTimeout",
|
|
56
|
+
"clearTimeout",
|
|
57
|
+
"setInterval",
|
|
58
|
+
"clearInterval",
|
|
59
|
+
"fetch",
|
|
60
|
+
"XMLHttpRequest",
|
|
61
|
+
"WebSocket",
|
|
62
|
+
"Worker",
|
|
63
|
+
"window",
|
|
64
|
+
"document",
|
|
65
|
+
"self",
|
|
66
|
+
"globalThis",
|
|
67
|
+
"global",
|
|
68
|
+
"process",
|
|
69
|
+
"require",
|
|
70
|
+
"module",
|
|
71
|
+
"exports",
|
|
72
|
+
"navigator",
|
|
73
|
+
"importScripts",
|
|
74
|
+
];
|
|
75
|
+
// Names that the caller cannot use as a "label-as-global" workflow key.
|
|
76
|
+
// Exposing a workflow node named `pm` or `eval` would shadow the built-in
|
|
77
|
+
// API or reintroduce a blocked global, so we reject these reservations
|
|
78
|
+
// when building label globals.
|
|
79
|
+
export const RESERVED_LABEL_NAMES = new Set([
|
|
80
|
+
...Object.keys(ALLOWED_GLOBALS),
|
|
81
|
+
...BLOCKED_GLOBALS,
|
|
82
|
+
"pm",
|
|
83
|
+
"env",
|
|
84
|
+
"console",
|
|
85
|
+
"request",
|
|
86
|
+
"response",
|
|
87
|
+
"test",
|
|
88
|
+
"expect",
|
|
89
|
+
"workflow",
|
|
90
|
+
// Backend reserves these specifically to keep label globals from clashing
|
|
91
|
+
// with planned db/kafka/redis runtime APIs (Sandbox D / future).
|
|
92
|
+
"db",
|
|
93
|
+
"kafka",
|
|
94
|
+
"redis",
|
|
95
|
+
]);
|
|
96
|
+
export const VALID_LABEL_IDENTIFIER_PATTERN = /^[A-Za-z_$][\w$]*$/;
|
|
97
|
+
export const buildScopeTarget = (bindings) => {
|
|
98
|
+
const target = {
|
|
99
|
+
...ALLOWED_GLOBALS,
|
|
100
|
+
pm: bindings.pm,
|
|
101
|
+
};
|
|
102
|
+
if (bindings.env !== undefined) {
|
|
103
|
+
target.env = bindings.env;
|
|
104
|
+
}
|
|
105
|
+
if (bindings.environment !== undefined) {
|
|
106
|
+
target.environment = bindings.environment;
|
|
107
|
+
}
|
|
108
|
+
if (bindings.request !== undefined) {
|
|
109
|
+
target.request = bindings.request;
|
|
110
|
+
}
|
|
111
|
+
if (bindings.response !== undefined) {
|
|
112
|
+
target.response = bindings.response;
|
|
113
|
+
}
|
|
114
|
+
if (bindings.test !== undefined) {
|
|
115
|
+
target.test = bindings.test;
|
|
116
|
+
}
|
|
117
|
+
if (bindings.expect !== undefined) {
|
|
118
|
+
target.expect = bindings.expect;
|
|
119
|
+
}
|
|
120
|
+
if (bindings.console !== undefined) {
|
|
121
|
+
target.console = bindings.console;
|
|
122
|
+
}
|
|
123
|
+
if (bindings.db !== undefined) {
|
|
124
|
+
target.db = bindings.db;
|
|
125
|
+
}
|
|
126
|
+
if (bindings.kafka !== undefined) {
|
|
127
|
+
target.kafka = bindings.kafka;
|
|
128
|
+
}
|
|
129
|
+
if (bindings.redis !== undefined) {
|
|
130
|
+
target.redis = bindings.redis;
|
|
131
|
+
}
|
|
132
|
+
if (bindings.random !== undefined) {
|
|
133
|
+
target.random = bindings.random;
|
|
134
|
+
}
|
|
135
|
+
if (bindings.counter !== undefined) {
|
|
136
|
+
target.counter = bindings.counter;
|
|
137
|
+
}
|
|
138
|
+
if (bindings.variables !== undefined) {
|
|
139
|
+
target.variables = bindings.variables;
|
|
140
|
+
}
|
|
141
|
+
if (bindings.CryptoJS !== undefined) {
|
|
142
|
+
target.CryptoJS = bindings.CryptoJS;
|
|
143
|
+
}
|
|
144
|
+
if (bindings.labelGlobals) {
|
|
145
|
+
for (const [name, value] of Object.entries(bindings.labelGlobals)) {
|
|
146
|
+
target[name] = value;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Always blocked — overwrite anything labelGlobals tried to slip in.
|
|
150
|
+
for (const name of BLOCKED_GLOBALS) {
|
|
151
|
+
target[name] = undefined;
|
|
152
|
+
}
|
|
153
|
+
return target;
|
|
154
|
+
};
|
|
155
|
+
export const createScopeProxy = (target) => new Proxy(target, {
|
|
156
|
+
has: () => true,
|
|
157
|
+
get(scopeTarget, property) {
|
|
158
|
+
if (property === Symbol.unscopables) {
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
return scopeTarget[property];
|
|
162
|
+
},
|
|
163
|
+
set(scopeTarget, property, value) {
|
|
164
|
+
scopeTarget[property] = value;
|
|
165
|
+
return true;
|
|
166
|
+
},
|
|
167
|
+
deleteProperty(scopeTarget, property) {
|
|
168
|
+
delete scopeTarget[property];
|
|
169
|
+
return true;
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/script/scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
1
|
+
export { runScript } from "./legacy.js";
|
|
2
|
+
export type { ScriptRunContext } from "./legacy.js";
|
|
3
3
|
//# sourceMappingURL=scriptEngine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scriptEngine.d.ts","sourceRoot":"","sources":["../../src/script/scriptEngine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scriptEngine.d.ts","sourceRoot":"","sources":["../../src/script/scriptEngine.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,106 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
warn: () => undefined,
|
|
9
|
-
error: () => undefined,
|
|
10
|
-
debug: () => undefined,
|
|
11
|
-
};
|
|
12
|
-
const buildScriptScope = (pm) => {
|
|
13
|
-
const scopeTarget = {
|
|
14
|
-
pm,
|
|
15
|
-
request: pm.request,
|
|
16
|
-
response: pm.response,
|
|
17
|
-
test: pm.test,
|
|
18
|
-
expect: pm.expect,
|
|
19
|
-
environment: pm.environment,
|
|
20
|
-
JSON,
|
|
21
|
-
Math,
|
|
22
|
-
Number,
|
|
23
|
-
String,
|
|
24
|
-
Boolean,
|
|
25
|
-
Array,
|
|
26
|
-
Object,
|
|
27
|
-
Date,
|
|
28
|
-
RegExp,
|
|
29
|
-
Promise,
|
|
30
|
-
parseInt,
|
|
31
|
-
parseFloat,
|
|
32
|
-
encodeURIComponent,
|
|
33
|
-
decodeURIComponent,
|
|
34
|
-
URL,
|
|
35
|
-
URLSearchParams,
|
|
36
|
-
setTimeout: undefined,
|
|
37
|
-
clearTimeout: undefined,
|
|
38
|
-
setInterval: undefined,
|
|
39
|
-
clearInterval: undefined,
|
|
40
|
-
fetch: undefined,
|
|
41
|
-
XMLHttpRequest: undefined,
|
|
42
|
-
WebSocket: undefined,
|
|
43
|
-
Worker: undefined,
|
|
44
|
-
Function: undefined,
|
|
45
|
-
eval: undefined,
|
|
46
|
-
console: noopConsole,
|
|
47
|
-
window: undefined,
|
|
48
|
-
document: undefined,
|
|
49
|
-
self: undefined,
|
|
50
|
-
globalThis: undefined,
|
|
51
|
-
global: undefined,
|
|
52
|
-
process: undefined,
|
|
53
|
-
require: undefined,
|
|
54
|
-
module: undefined,
|
|
55
|
-
exports: undefined,
|
|
56
|
-
navigator: undefined,
|
|
57
|
-
};
|
|
58
|
-
return new Proxy(scopeTarget, {
|
|
59
|
-
has: () => true,
|
|
60
|
-
get(target, property) {
|
|
61
|
-
if (property === Symbol.unscopables) {
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
return target[property];
|
|
65
|
-
},
|
|
66
|
-
set(target, property, value) {
|
|
67
|
-
target[property] = value;
|
|
68
|
-
return true;
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
};
|
|
72
|
-
export const runScript = async (script, context) => {
|
|
73
|
-
if (!script?.trim()) {
|
|
74
|
-
return [];
|
|
75
|
-
}
|
|
76
|
-
const results = [];
|
|
77
|
-
const pendingTests = [];
|
|
78
|
-
const pm = createPmApi(context, {
|
|
79
|
-
addResult: (result) => {
|
|
80
|
-
results.push(result);
|
|
81
|
-
},
|
|
82
|
-
addPending: (promise) => {
|
|
83
|
-
pendingTests.push(promise);
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
|
-
const scope = buildScriptScope(pm);
|
|
87
|
-
const runner = new AsyncFunction("scope", "context", `return (async function () {
|
|
88
|
-
with (scope) {
|
|
89
|
-
${script}
|
|
90
|
-
}
|
|
91
|
-
}).call(context);
|
|
92
|
-
//# sourceURL=callman-script.js`);
|
|
93
|
-
try {
|
|
94
|
-
await runner(scope, Object.create(null));
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
results.push({
|
|
98
|
-
name: "Script execution",
|
|
99
|
-
status: "FAIL",
|
|
100
|
-
message: error instanceof Error ? error.message : String(error),
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
await Promise.allSettled(pendingTests);
|
|
104
|
-
return results;
|
|
105
|
-
};
|
|
1
|
+
// Backwards-compatibility re-export. The real implementation now lives in
|
|
2
|
+
// `legacy.ts` (which calls the canonical `executeScript`). Direct imports
|
|
3
|
+
// from this path stay working for any consumer that pinned to the
|
|
4
|
+
// pre-1.1.0 module layout.
|
|
5
|
+
//
|
|
6
|
+
// Prefer the package entry: `import { runScript } from "callman-core";`
|
|
7
|
+
export { runScript } from "./legacy.js";
|
|
106
8
|
//# sourceMappingURL=scriptEngine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scriptEngine.js","sourceRoot":"","sources":["../../src/script/scriptEngine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scriptEngine.js","sourceRoot":"","sources":["../../src/script/scriptEngine.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,kEAAkE;AAClE,2BAA2B;AAC3B,EAAE;AACF,wEAAwE;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../src/script/timeout.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAgBrE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,CAAC,EACtC,SAAS,OAAO,CAAC,CAAC,CAAC,EACnB,WAAW,MAAM,KAChB,OAAO,CAAC,CAAC,CAgBR,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Timeout utilities for the canonical script sandbox.
|
|
2
|
+
//
|
|
3
|
+
// vm.Script.runInContext exposes a `timeout` option that only enforces
|
|
4
|
+
// synchronous execution time — async loops bypass it. The outer
|
|
5
|
+
// withAsyncTimeout enforces the deadline against the awaited completion
|
|
6
|
+
// of the host promise, so an unresolved `await new Promise(() => {})`
|
|
7
|
+
// is rejected as a timeout instead of hanging indefinitely.
|
|
8
|
+
//
|
|
9
|
+
// toHostPromise re-wraps a thenable from the sandbox's vm context so
|
|
10
|
+
// that `Promise.race` and host-side `await` see a real host promise.
|
|
11
|
+
export const toHostPromise = (value) => {
|
|
12
|
+
if ((typeof value === "object" || typeof value === "function") &&
|
|
13
|
+
value !== null &&
|
|
14
|
+
typeof value.then === "function") {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
try {
|
|
17
|
+
value.then(resolve, reject);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
reject(error);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return Promise.resolve(value);
|
|
25
|
+
};
|
|
26
|
+
export const withAsyncTimeout = async (promise, timeoutMs) => await new Promise((resolve, reject) => {
|
|
27
|
+
const timer = setTimeout(() => {
|
|
28
|
+
reject(new Error(`Script timed out after ${timeoutMs}ms`));
|
|
29
|
+
}, timeoutMs);
|
|
30
|
+
promise.then((value) => {
|
|
31
|
+
clearTimeout(timer);
|
|
32
|
+
resolve(value);
|
|
33
|
+
}, (error) => {
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
reject(error);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/script/timeout.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,uEAAuE;AACvE,gEAAgE;AAChE,wEAAwE;AACxE,sEAAsE;AACtE,4DAA4D;AAC5D,EAAE;AACF,qEAAqE;AACrE,qEAAqE;AAErE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAI,KAAyB,EAAc,EAAE;IACxE,IACE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;QAC1D,KAAK,KAAK,IAAI;QACd,OAAQ,KAAwB,CAAC,IAAI,KAAK,UAAU,EACpD,CAAC;QACD,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,IAAI,CAAC;gBACF,KAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,KAAU,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,OAAmB,EACnB,SAAiB,EACL,EAAE,CACd,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,SAAS,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC,EAAE,SAAS,CAAC,CAAC;IAEd,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE;QACR,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;QACjB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { ScenarioNodeExecutionMeta } from "../scenario-runner/types.js";
|
|
2
|
+
export type ScriptStage = "script" | "pre-request" | "tests" | "post-response";
|
|
3
|
+
export interface ScriptKeyValuePair {
|
|
4
|
+
key: string;
|
|
5
|
+
value: string;
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface ScriptRequestBodyState {
|
|
9
|
+
mode: string;
|
|
10
|
+
raw: string;
|
|
11
|
+
formEntries: ScriptKeyValuePair[];
|
|
12
|
+
}
|
|
13
|
+
export interface ScriptRequestState {
|
|
14
|
+
method: string;
|
|
15
|
+
url: string;
|
|
16
|
+
headers: ScriptKeyValuePair[];
|
|
17
|
+
query: ScriptKeyValuePair[];
|
|
18
|
+
body: ScriptRequestBodyState;
|
|
19
|
+
}
|
|
20
|
+
export interface ScriptResponseState {
|
|
21
|
+
ok: boolean;
|
|
22
|
+
status: number;
|
|
23
|
+
statusText: string;
|
|
24
|
+
headers: Record<string, string>;
|
|
25
|
+
body: unknown;
|
|
26
|
+
jsonBody: unknown | null;
|
|
27
|
+
rawBody: string;
|
|
28
|
+
contentType: string;
|
|
29
|
+
durationMs: number;
|
|
30
|
+
sizeBytes: number;
|
|
31
|
+
cookies: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface ScriptVariableMutation {
|
|
34
|
+
scope: "environment" | "global";
|
|
35
|
+
type: "set" | "unset";
|
|
36
|
+
key: string;
|
|
37
|
+
value?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ScriptLogEntry {
|
|
40
|
+
level: "log" | "info" | "warn" | "error" | "debug";
|
|
41
|
+
message: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ScriptTestResult {
|
|
44
|
+
name: string;
|
|
45
|
+
status: "PASS" | "FAIL" | "SKIP";
|
|
46
|
+
error?: string;
|
|
47
|
+
lineNumber?: number | null;
|
|
48
|
+
column?: number | null;
|
|
49
|
+
}
|
|
50
|
+
export interface ScriptError {
|
|
51
|
+
stage: ScriptStage;
|
|
52
|
+
message: string;
|
|
53
|
+
lineNumber: number | null;
|
|
54
|
+
column: number | null;
|
|
55
|
+
stack: string | null;
|
|
56
|
+
}
|
|
57
|
+
export interface ScriptDbExecutionInput {
|
|
58
|
+
connectionId: string;
|
|
59
|
+
query: string;
|
|
60
|
+
phase: "pre" | "post" | "manual";
|
|
61
|
+
context: {
|
|
62
|
+
response: unknown | null;
|
|
63
|
+
env: Record<string, string>;
|
|
64
|
+
global: Record<string, string>;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface ScriptDbExecutionResult {
|
|
68
|
+
success: boolean;
|
|
69
|
+
error?: string | null;
|
|
70
|
+
phase: "pre" | "post" | "manual";
|
|
71
|
+
connectionId: string;
|
|
72
|
+
connectionName: string;
|
|
73
|
+
connectionType: "mongo" | "oracle" | string;
|
|
74
|
+
query: string;
|
|
75
|
+
resolvedQuery: string;
|
|
76
|
+
rows: unknown[];
|
|
77
|
+
rowCount: number;
|
|
78
|
+
durationMs: number;
|
|
79
|
+
executedAt: string;
|
|
80
|
+
}
|
|
81
|
+
export interface ScriptKafkaCapability {
|
|
82
|
+
event: unknown | null;
|
|
83
|
+
messages: unknown[];
|
|
84
|
+
matchedMessage: unknown | null;
|
|
85
|
+
capturedMessages: unknown[];
|
|
86
|
+
isListening: boolean;
|
|
87
|
+
}
|
|
88
|
+
export interface ScriptRedisCapability {
|
|
89
|
+
values: Record<string, unknown>;
|
|
90
|
+
results: {
|
|
91
|
+
pre: unknown[];
|
|
92
|
+
post: unknown[];
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export interface ScriptDbCapability {
|
|
96
|
+
execute: (input: ScriptDbExecutionInput) => Promise<ScriptDbExecutionResult>;
|
|
97
|
+
preResult?: ScriptDbExecutionResult | null;
|
|
98
|
+
postResult?: ScriptDbExecutionResult | null;
|
|
99
|
+
requestConfig?: {
|
|
100
|
+
preRequest?: {
|
|
101
|
+
connectionId?: string;
|
|
102
|
+
};
|
|
103
|
+
postResponse?: {
|
|
104
|
+
connectionId?: string;
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export type CounterSnapshotEntry = [string, number];
|
|
109
|
+
export interface ScriptCounterCapability {
|
|
110
|
+
snapshot: CounterSnapshotEntry[];
|
|
111
|
+
}
|
|
112
|
+
export interface ScriptFeaturePolicy {
|
|
113
|
+
database: boolean;
|
|
114
|
+
kafka: boolean;
|
|
115
|
+
}
|
|
116
|
+
export interface ScriptCapabilities {
|
|
117
|
+
environment?: {
|
|
118
|
+
values: Record<string, string>;
|
|
119
|
+
emitMutations?: boolean;
|
|
120
|
+
};
|
|
121
|
+
globals?: {
|
|
122
|
+
values: Record<string, string>;
|
|
123
|
+
emitMutations?: boolean;
|
|
124
|
+
};
|
|
125
|
+
request?: ScriptRequestState;
|
|
126
|
+
response?: ScriptResponseState;
|
|
127
|
+
trackRequestMutations?: boolean;
|
|
128
|
+
workflowContext?: Record<string, unknown>;
|
|
129
|
+
nodeMetaByLabel?: Record<string, ScenarioNodeExecutionMeta>;
|
|
130
|
+
exposeLabelsAsGlobals?: boolean;
|
|
131
|
+
featurePolicy?: ScriptFeaturePolicy;
|
|
132
|
+
allowDeferredKafkaTests?: boolean;
|
|
133
|
+
deferredTestNames?: string[];
|
|
134
|
+
extensions?: {
|
|
135
|
+
log?: boolean;
|
|
136
|
+
node?: boolean;
|
|
137
|
+
db?: ScriptDbCapability;
|
|
138
|
+
kafka?: ScriptKafkaCapability;
|
|
139
|
+
redis?: ScriptRedisCapability;
|
|
140
|
+
random?: boolean | {
|
|
141
|
+
rng?: () => number;
|
|
142
|
+
};
|
|
143
|
+
counter?: ScriptCounterCapability;
|
|
144
|
+
cryptojs?: boolean;
|
|
145
|
+
variables?: boolean;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export interface ExecuteScriptInput {
|
|
149
|
+
script: string;
|
|
150
|
+
timeoutMs?: number;
|
|
151
|
+
filename?: string;
|
|
152
|
+
stage?: ScriptStage;
|
|
153
|
+
capabilities: ScriptCapabilities;
|
|
154
|
+
}
|
|
155
|
+
export interface ExecuteScriptResult {
|
|
156
|
+
success: boolean;
|
|
157
|
+
error: ScriptError | null;
|
|
158
|
+
testResults: ScriptTestResult[];
|
|
159
|
+
variableMutations: ScriptVariableMutation[];
|
|
160
|
+
logs: ScriptLogEntry[];
|
|
161
|
+
returnValue?: unknown;
|
|
162
|
+
hasReturnValue: boolean;
|
|
163
|
+
request?: ScriptRequestState;
|
|
164
|
+
counterSnapshot?: CounterSnapshotEntry[];
|
|
165
|
+
deferredTestNames?: string[];
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/script/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Public types for the canonical script sandbox.
|
|
2
|
+
//
|
|
3
|
+
// These types are the contract that backend, electron, and CLI consumers all
|
|
4
|
+
// share. Adding a new field is non-breaking; renaming or removing one is a
|
|
5
|
+
// breaking change that must bump the major version.
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/script/types.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,oDAAoD"}
|