callman-core 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/index.d.ts +4 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +3 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/script/errors.d.ts +3 -0
  6. package/dist/script/errors.d.ts.map +1 -0
  7. package/dist/script/errors.js +68 -0
  8. package/dist/script/errors.js.map +1 -0
  9. package/dist/script/executor.d.ts +5 -0
  10. package/dist/script/executor.d.ts.map +1 -0
  11. package/dist/script/executor.js +192 -0
  12. package/dist/script/executor.js.map +1 -0
  13. package/dist/script/features/assertions.d.ts +46 -0
  14. package/dist/script/features/assertions.d.ts.map +1 -0
  15. package/dist/script/features/assertions.js +264 -0
  16. package/dist/script/features/assertions.js.map +1 -0
  17. package/dist/script/features/environment.d.ts +11 -0
  18. package/dist/script/features/environment.d.ts.map +1 -0
  19. package/dist/script/features/environment.js +61 -0
  20. package/dist/script/features/environment.js.map +1 -0
  21. package/dist/script/features/log.d.ts +15 -0
  22. package/dist/script/features/log.d.ts.map +1 -0
  23. package/dist/script/features/log.js +59 -0
  24. package/dist/script/features/log.js.map +1 -0
  25. package/dist/script/features/node.d.ts +14 -0
  26. package/dist/script/features/node.d.ts.map +1 -0
  27. package/dist/script/features/node.js +82 -0
  28. package/dist/script/features/node.js.map +1 -0
  29. package/dist/script/features/request.d.ts +23 -0
  30. package/dist/script/features/request.d.ts.map +1 -0
  31. package/dist/script/features/request.js +105 -0
  32. package/dist/script/features/request.js.map +1 -0
  33. package/dist/script/features/response.d.ts +25 -0
  34. package/dist/script/features/response.d.ts.map +1 -0
  35. package/dist/script/features/response.js +43 -0
  36. package/dist/script/features/response.js.map +1 -0
  37. package/dist/script/features/tests.d.ts +9 -0
  38. package/dist/script/features/tests.d.ts.map +1 -0
  39. package/dist/script/features/tests.js +62 -0
  40. package/dist/script/features/tests.js.map +1 -0
  41. package/dist/script/legacy.d.ts +4 -0
  42. package/dist/script/legacy.d.ts.map +1 -0
  43. package/dist/script/legacy.js +128 -0
  44. package/dist/script/legacy.js.map +1 -0
  45. package/dist/script/sandbox.d.ts +16 -0
  46. package/dist/script/sandbox.d.ts.map +1 -0
  47. package/dist/script/sandbox.js +51 -0
  48. package/dist/script/sandbox.js.map +1 -0
  49. package/dist/script/scope.d.ts +16 -0
  50. package/dist/script/scope.d.ts.map +1 -0
  51. package/dist/script/scope.js +151 -0
  52. package/dist/script/scope.js.map +1 -0
  53. package/dist/script/scriptEngine.d.ts +2 -2
  54. package/dist/script/scriptEngine.d.ts.map +1 -1
  55. package/dist/script/scriptEngine.js +7 -105
  56. package/dist/script/scriptEngine.js.map +1 -1
  57. package/dist/script/timeout.d.ts +3 -0
  58. package/dist/script/timeout.d.ts.map +1 -0
  59. package/dist/script/timeout.js +38 -0
  60. package/dist/script/timeout.js.map +1 -0
  61. package/dist/script/types.d.ts +94 -0
  62. package/dist/script/types.d.ts.map +1 -0
  63. package/dist/script/types.js +7 -0
  64. package/dist/script/types.js.map +1 -0
  65. package/dist-cjs/contract/contractValidator.js +236 -0
  66. package/dist-cjs/contract/contractValidator.js.map +1 -0
  67. package/dist-cjs/index.js +41 -0
  68. package/dist-cjs/index.js.map +1 -0
  69. package/dist-cjs/package.json +1 -0
  70. package/dist-cjs/request/executeRequest.js +33 -0
  71. package/dist-cjs/request/executeRequest.js.map +1 -0
  72. package/dist-cjs/runner/requestRunner.js +102 -0
  73. package/dist-cjs/runner/requestRunner.js.map +1 -0
  74. package/dist-cjs/runner/runCollection.js +53 -0
  75. package/dist-cjs/runner/runCollection.js.map +1 -0
  76. package/dist-cjs/scenario-runner/condition.js +1735 -0
  77. package/dist-cjs/scenario-runner/condition.js.map +1 -0
  78. package/dist-cjs/scenario-runner/conditionTypes.js +3 -0
  79. package/dist-cjs/scenario-runner/conditionTypes.js.map +1 -0
  80. package/dist-cjs/scenario-runner/executionPolicyRunner.js +53 -0
  81. package/dist-cjs/scenario-runner/executionPolicyRunner.js.map +1 -0
  82. package/dist-cjs/scenario-runner/graphTraversal.js +27 -0
  83. package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -0
  84. package/dist-cjs/scenario-runner/index.js +39 -0
  85. package/dist-cjs/scenario-runner/index.js.map +1 -0
  86. package/dist-cjs/scenario-runner/nodePolicy.js +127 -0
  87. package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -0
  88. package/dist-cjs/scenario-runner/notification/index.js +18 -0
  89. package/dist-cjs/scenario-runner/notification/index.js.map +1 -0
  90. package/dist-cjs/scenario-runner/notification/providers/provider.interface.js +3 -0
  91. package/dist-cjs/scenario-runner/notification/providers/provider.interface.js.map +1 -0
  92. package/dist-cjs/scenario-runner/notification/providers/slack.provider.js +88 -0
  93. package/dist-cjs/scenario-runner/notification/providers/slack.provider.js.map +1 -0
  94. package/dist-cjs/scenario-runner/notification/template.js +13 -0
  95. package/dist-cjs/scenario-runner/notification/template.js.map +1 -0
  96. package/dist-cjs/scenario-runner/retryExecutor.js +57 -0
  97. package/dist-cjs/scenario-runner/retryExecutor.js.map +1 -0
  98. package/dist-cjs/scenario-runner/runScenario.js +1545 -0
  99. package/dist-cjs/scenario-runner/runScenario.js.map +1 -0
  100. package/dist-cjs/scenario-runner/templateResolver.js +468 -0
  101. package/dist-cjs/scenario-runner/templateResolver.js.map +1 -0
  102. package/dist-cjs/scenario-runner/types.js +3 -0
  103. package/dist-cjs/scenario-runner/types.js.map +1 -0
  104. package/dist-cjs/scenario-runner/waitNodeExecutor.js +71 -0
  105. package/dist-cjs/scenario-runner/waitNodeExecutor.js.map +1 -0
  106. package/dist-cjs/script/errors.js +72 -0
  107. package/dist-cjs/script/errors.js.map +1 -0
  108. package/dist-cjs/script/executor.js +197 -0
  109. package/dist-cjs/script/executor.js.map +1 -0
  110. package/dist-cjs/script/features/assertions.js +269 -0
  111. package/dist-cjs/script/features/assertions.js.map +1 -0
  112. package/dist-cjs/script/features/environment.js +65 -0
  113. package/dist-cjs/script/features/environment.js.map +1 -0
  114. package/dist-cjs/script/features/log.js +64 -0
  115. package/dist-cjs/script/features/log.js.map +1 -0
  116. package/dist-cjs/script/features/node.js +89 -0
  117. package/dist-cjs/script/features/node.js.map +1 -0
  118. package/dist-cjs/script/features/request.js +109 -0
  119. package/dist-cjs/script/features/request.js.map +1 -0
  120. package/dist-cjs/script/features/response.js +47 -0
  121. package/dist-cjs/script/features/response.js.map +1 -0
  122. package/dist-cjs/script/features/tests.js +66 -0
  123. package/dist-cjs/script/features/tests.js.map +1 -0
  124. package/dist-cjs/script/legacy.js +132 -0
  125. package/dist-cjs/script/legacy.js.map +1 -0
  126. package/dist-cjs/script/pmApi.js +353 -0
  127. package/dist-cjs/script/pmApi.js.map +1 -0
  128. package/dist-cjs/script/sandbox.js +91 -0
  129. package/dist-cjs/script/sandbox.js.map +1 -0
  130. package/dist-cjs/script/scope.js +156 -0
  131. package/dist-cjs/script/scope.js.map +1 -0
  132. package/dist-cjs/script/scriptEngine.js +12 -0
  133. package/dist-cjs/script/scriptEngine.js.map +1 -0
  134. package/dist-cjs/script/timeout.js +43 -0
  135. package/dist-cjs/script/timeout.js.map +1 -0
  136. package/dist-cjs/script/types.js +8 -0
  137. package/dist-cjs/script/types.js.map +1 -0
  138. package/dist-cjs/types/index.js +3 -0
  139. package/dist-cjs/types/index.js.map +1 -0
  140. package/dist-cjs/utils/get.js +52 -0
  141. package/dist-cjs/utils/get.js.map +1 -0
  142. package/dist-cjs/utils/random.js +87 -0
  143. package/dist-cjs/utils/random.js.map +1 -0
  144. package/dist-cjs/variables/envStore.js +24 -0
  145. package/dist-cjs/variables/envStore.js.map +1 -0
  146. package/dist-cjs/variables/resolver.js +95 -0
  147. package/dist-cjs/variables/resolver.js.map +1 -0
  148. package/package.json +19 -3
  149. package/samples/runSample.mjs +0 -128
  150. package/tests/waitNode.test.mjs +0 -311
  151. package/tsconfig.json +0 -18
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeWaitNode = exports.ScenarioWaitNodeCancelledError = exports.ScenarioWaitNodeValidationError = exports.MAX_SCENARIO_WAIT_DURATION_MS = exports.MIN_SCENARIO_WAIT_DURATION_MS = void 0;
4
+ exports.MIN_SCENARIO_WAIT_DURATION_MS = 1;
5
+ exports.MAX_SCENARIO_WAIT_DURATION_MS = 2_147_483_647;
6
+ const normalizeWaitDurationMs = (value) => Number.isFinite(value) ? Math.round(value) : Number.NaN;
7
+ const createWaitSummary = ({ configuredDurationMs, actualDurationMs, status, }) => ({
8
+ type: "wait",
9
+ configuredDurationMs,
10
+ actualDurationMs: Math.max(0, Math.round(actualDurationMs)),
11
+ status,
12
+ });
13
+ class ScenarioWaitNodeValidationError extends Error {
14
+ summary;
15
+ constructor(durationMs) {
16
+ super(`Wait node duration must be a finite number between ${exports.MIN_SCENARIO_WAIT_DURATION_MS} ms and ${exports.MAX_SCENARIO_WAIT_DURATION_MS} ms.`);
17
+ this.name = "ScenarioWaitNodeValidationError";
18
+ this.summary = createWaitSummary({
19
+ configuredDurationMs: normalizeWaitDurationMs(durationMs),
20
+ actualDurationMs: 0,
21
+ status: "failed",
22
+ });
23
+ }
24
+ }
25
+ exports.ScenarioWaitNodeValidationError = ScenarioWaitNodeValidationError;
26
+ class ScenarioWaitNodeCancelledError extends Error {
27
+ summary;
28
+ constructor(durationMs, actualDurationMs) {
29
+ super("Wait node execution was cancelled.");
30
+ this.name = "ScenarioWaitNodeCancelledError";
31
+ this.summary = createWaitSummary({
32
+ configuredDurationMs: durationMs,
33
+ actualDurationMs,
34
+ status: "cancelled",
35
+ });
36
+ }
37
+ }
38
+ exports.ScenarioWaitNodeCancelledError = ScenarioWaitNodeCancelledError;
39
+ const waitWithSignal = (durationMs, signal, startedAtMs) => new Promise((resolve, reject) => {
40
+ const timeoutId = globalThis.setTimeout(() => {
41
+ signal?.removeEventListener?.("abort", onAbort);
42
+ resolve();
43
+ }, durationMs);
44
+ const onAbort = () => {
45
+ globalThis.clearTimeout(timeoutId);
46
+ signal?.removeEventListener?.("abort", onAbort);
47
+ reject(new ScenarioWaitNodeCancelledError(durationMs, Date.now() - startedAtMs));
48
+ };
49
+ if (signal?.aborted) {
50
+ onAbort();
51
+ return;
52
+ }
53
+ signal?.addEventListener?.("abort", onAbort, { once: true });
54
+ });
55
+ const executeWaitNode = async ({ durationMs, signal, }) => {
56
+ const normalizedDurationMs = normalizeWaitDurationMs(durationMs);
57
+ if (!Number.isFinite(normalizedDurationMs) ||
58
+ normalizedDurationMs < exports.MIN_SCENARIO_WAIT_DURATION_MS ||
59
+ normalizedDurationMs > exports.MAX_SCENARIO_WAIT_DURATION_MS) {
60
+ throw new ScenarioWaitNodeValidationError(durationMs);
61
+ }
62
+ const startedAtMs = Date.now();
63
+ await waitWithSignal(normalizedDurationMs, signal, startedAtMs);
64
+ return createWaitSummary({
65
+ configuredDurationMs: normalizedDurationMs,
66
+ actualDurationMs: Date.now() - startedAtMs,
67
+ status: "success",
68
+ });
69
+ };
70
+ exports.executeWaitNode = executeWaitNode;
71
+ //# sourceMappingURL=waitNodeExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitNodeExecutor.js","sourceRoot":"","sources":["../../src/scenario-runner/waitNodeExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ // Error serialization for the canonical script sandbox.
3
+ //
4
+ // vm errors arrive with a stack trace whose first useful frame names the
5
+ // virtual filename we passed to `new vm.Script({ filename })`. We pull
6
+ // line/column from that frame so editors can highlight the offending row.
7
+ // `lineOffset: -2` is set on the vm.Script (the wrapper prepends two lines:
8
+ // the IIFE opener and the `with(scope)` line). When the stack reports
9
+ // "callman-script.js:5:7" the displayed line in the user's source is 5.
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.toSerializableError = void 0;
12
+ const FRAME_PATTERNS = [
13
+ /callman-script\.js:(\d+):(\d+)/,
14
+ /callman-scenario\.script\.js:(\d+):(\d+)/,
15
+ /callman-request\.script\.js:(\d+):(\d+)/,
16
+ /<anonymous>:(\d+):(\d+)/,
17
+ ];
18
+ const matchFrame = (stack) => {
19
+ if (!stack) {
20
+ return { lineNumber: null, column: null };
21
+ }
22
+ for (const pattern of FRAME_PATTERNS) {
23
+ const match = stack.match(pattern);
24
+ if (match) {
25
+ return {
26
+ lineNumber: Math.max(1, Number(match[1])),
27
+ column: Number(match[2]),
28
+ };
29
+ }
30
+ }
31
+ return { lineNumber: null, column: null };
32
+ };
33
+ // Cross-realm: errors thrown inside vm context fail `instanceof Error` checks
34
+ // from the host, so read .message / .stack structurally.
35
+ const readMessage = (error) => {
36
+ if (error instanceof Error) {
37
+ return error.message;
38
+ }
39
+ if (error &&
40
+ typeof error === "object" &&
41
+ "message" in error &&
42
+ typeof error.message === "string") {
43
+ return error.message;
44
+ }
45
+ return String(error);
46
+ };
47
+ const readStack = (error) => {
48
+ if (error instanceof Error) {
49
+ return error.stack ?? null;
50
+ }
51
+ if (error &&
52
+ typeof error === "object" &&
53
+ "stack" in error &&
54
+ typeof error.stack === "string") {
55
+ return error.stack;
56
+ }
57
+ return null;
58
+ };
59
+ const toSerializableError = (stage, error) => {
60
+ const stack = readStack(error);
61
+ const message = readMessage(error);
62
+ const { lineNumber, column } = matchFrame(stack);
63
+ return {
64
+ stage,
65
+ message,
66
+ lineNumber,
67
+ column,
68
+ stack,
69
+ };
70
+ };
71
+ exports.toSerializableError = toSerializableError;
72
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/script/errors.ts"],"names":[],"mappings":";AAAA,wDAAwD;AACxD,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,0EAA0E;AAC1E,4EAA4E;AAC5E,sEAAsE;AACtE,wEAAwE;;;AAIxE,MAAM,cAAc,GAAa;IAC/B,gCAAgC;IAChC,0CAA0C;IAC1C,yCAAyC;IACzC,yBAAyB;CAC1B,CAAC;AAEF,MAAM,UAAU,GAAG,CACjB,KAAoB,EACkC,EAAE;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO;gBACL,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACzB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF,8EAA8E;AAC9E,yDAAyD;AACzD,MAAM,WAAW,GAAG,CAAC,KAAc,EAAU,EAAE;IAC7C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,IACE,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACzB,SAAS,IAAI,KAAK;QAClB,OAAQ,KAA8B,CAAC,OAAO,KAAK,QAAQ,EAC3D,CAAC;QACD,OAAQ,KAA6B,CAAC,OAAO,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,KAAc,EAAiB,EAAE;IAClD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;IAC7B,CAAC;IACD,IACE,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,IAAI,KAAK;QAChB,OAAQ,KAA4B,CAAC,KAAK,KAAK,QAAQ,EACvD,CAAC;QACD,OAAQ,KAA2B,CAAC,KAAK,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEK,MAAM,mBAAmB,GAAG,CACjC,KAAkB,EAClB,KAAc,EACD,EAAE;IACf,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEjD,OAAO;QACL,KAAK;QACL,OAAO;QACP,UAAU;QACV,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC,CAAC;AAfW,QAAA,mBAAmB,uBAe9B"}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ // Public canonical script executor — the single entry point that all three
3
+ // consumers (CLI via legacy shim, backend, electron) ultimately call.
4
+ //
5
+ // Composes:
6
+ // - sandbox (vm.createContext + scope Proxy + reserved globals)
7
+ // - pm API (assertions + tests + env/globals + request/response + node + log)
8
+ // - timeout (vm-level + outer Promise race)
9
+ // - error serialization (line/column attribution)
10
+ //
11
+ // The function never throws. Parse errors, runtime errors, and timeouts are
12
+ // all returned in the `error` field of the result. Callers that need to
13
+ // distinguish "the sandbox itself blew up" should check `success === false`.
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.validateScript = exports.executeScript = void 0;
16
+ const environment_js_1 = require("./features/environment.js");
17
+ const assertions_js_1 = require("./features/assertions.js");
18
+ const node_js_1 = require("./features/node.js");
19
+ const request_js_1 = require("./features/request.js");
20
+ const response_js_1 = require("./features/response.js");
21
+ const tests_js_1 = require("./features/tests.js");
22
+ const log_js_1 = require("./features/log.js");
23
+ const sandbox_js_1 = require("./sandbox.js");
24
+ const errors_js_1 = require("./errors.js");
25
+ const timeout_js_1 = require("./timeout.js");
26
+ const DEFAULT_TIMEOUT_MS = 15_000;
27
+ const DEFAULT_FILENAME = "callman-script.js";
28
+ const DEFAULT_STAGE = "script";
29
+ const buildPm = (capabilities, logs, collectors) => {
30
+ const pm = {
31
+ test: collectors.test.test,
32
+ expect: collectors.expect,
33
+ };
34
+ if (collectors.environment) {
35
+ pm.environment = collectors.environment;
36
+ pm.env = collectors.environment;
37
+ }
38
+ if (collectors.globals) {
39
+ pm.globals = collectors.globals;
40
+ }
41
+ if (collectors.request) {
42
+ pm.request = collectors.request.api;
43
+ }
44
+ if (collectors.response) {
45
+ pm.response = collectors.response;
46
+ }
47
+ const extensions = capabilities.extensions ?? {};
48
+ if (extensions.log) {
49
+ pm.log = logs.pmLog;
50
+ }
51
+ if (extensions.node) {
52
+ pm.node = (0, node_js_1.buildNodeApi)({
53
+ workflowContext: capabilities.workflowContext ?? {},
54
+ nodeMetaByLabel: capabilities.nodeMetaByLabel,
55
+ });
56
+ }
57
+ return pm;
58
+ };
59
+ const buildScopeBindings = ({ pm, capabilities, consoleApi, envValues, environmentApi, request, response, expect, test, }) => {
60
+ const exposeLabels = capabilities.workflowContext &&
61
+ capabilities.exposeLabelsAsGlobals !== false;
62
+ const labelGlobals = exposeLabels
63
+ ? (0, node_js_1.buildLabelGlobals)({
64
+ workflowContext: capabilities.workflowContext ?? {},
65
+ nodeMetaByLabel: capabilities.nodeMetaByLabel,
66
+ })
67
+ : undefined;
68
+ return {
69
+ pm,
70
+ env: envValues,
71
+ environment: environmentApi,
72
+ request,
73
+ response,
74
+ test,
75
+ expect,
76
+ console: consoleApi,
77
+ labelGlobals,
78
+ };
79
+ };
80
+ const executeScript = async (input) => {
81
+ const timeoutMs = input.timeoutMs ?? DEFAULT_TIMEOUT_MS;
82
+ const filename = input.filename ?? DEFAULT_FILENAME;
83
+ const stage = input.stage ?? DEFAULT_STAGE;
84
+ const capabilities = input.capabilities;
85
+ // Empty / whitespace-only scripts short-circuit with an empty success.
86
+ if (!input.script.trim()) {
87
+ return {
88
+ success: true,
89
+ error: null,
90
+ testResults: [],
91
+ variableMutations: [],
92
+ logs: [],
93
+ hasReturnValue: false,
94
+ };
95
+ }
96
+ const variableMutations = [];
97
+ const environmentApi = capabilities.environment
98
+ ? (0, environment_js_1.buildEnvironmentApi)(capabilities.environment.values, capabilities.environment.emitMutations !== false ? variableMutations : null, "environment")
99
+ : undefined;
100
+ const globalsApi = capabilities.globals
101
+ ? (0, environment_js_1.buildEnvironmentApi)(capabilities.globals.values, capabilities.globals.emitMutations !== false ? variableMutations : null, "global")
102
+ : undefined;
103
+ const requestBundle = capabilities.request
104
+ ? (0, request_js_1.buildRequestApi)(capabilities.request)
105
+ : undefined;
106
+ const responseApi = (0, response_js_1.buildResponseApi)(capabilities.response ?? null) ?? undefined;
107
+ const expect = (0, assertions_js_1.createExpectApi)();
108
+ const tests = (0, tests_js_1.buildTestCollector)(stage);
109
+ const logCollector = capabilities.extensions?.log
110
+ ? (0, log_js_1.createLogCollector)()
111
+ : (0, log_js_1.createSilentLogCollector)();
112
+ const pm = buildPm(capabilities, { pmLog: logCollector.pmLog }, {
113
+ test: tests,
114
+ expect,
115
+ environment: environmentApi,
116
+ globals: globalsApi,
117
+ request: requestBundle,
118
+ response: responseApi ?? undefined,
119
+ });
120
+ const bindings = buildScopeBindings({
121
+ pm,
122
+ capabilities,
123
+ consoleApi: logCollector.consoleApi,
124
+ envValues: environmentApi?.values,
125
+ environmentApi,
126
+ request: requestBundle?.api,
127
+ response: responseApi,
128
+ expect,
129
+ test: tests.test,
130
+ });
131
+ let compiled;
132
+ try {
133
+ compiled = (0, sandbox_js_1.compileAndPrepare)(input.script, bindings, filename);
134
+ }
135
+ catch (error) {
136
+ // Parse errors (SyntaxError) — return early as a sandbox error so the
137
+ // caller never sees a raw throw. Mutations and tests are empty since
138
+ // execution never started.
139
+ return {
140
+ success: false,
141
+ error: (0, errors_js_1.toSerializableError)(stage, error),
142
+ testResults: [],
143
+ variableMutations: [],
144
+ logs: logCollector.logs,
145
+ hasReturnValue: false,
146
+ ...(requestBundle ? { request: requestBundle.toRequestState() } : {}),
147
+ };
148
+ }
149
+ let returnValue;
150
+ let hasReturnValue = false;
151
+ let runtimeError = null;
152
+ try {
153
+ const execution = compiled.vmScript.runInContext(compiled.vmContext, {
154
+ timeout: timeoutMs,
155
+ displayErrors: true,
156
+ breakOnSigint: false,
157
+ });
158
+ const awaited = await (0, timeout_js_1.withAsyncTimeout)((0, timeout_js_1.toHostPromise)(execution), timeoutMs);
159
+ if (typeof awaited !== "undefined") {
160
+ returnValue = awaited;
161
+ hasReturnValue = true;
162
+ }
163
+ await (0, timeout_js_1.withAsyncTimeout)(tests.flush(), timeoutMs);
164
+ }
165
+ catch (error) {
166
+ await Promise.allSettled([tests.flush()]);
167
+ runtimeError = (0, errors_js_1.toSerializableError)(stage, error);
168
+ }
169
+ return {
170
+ success: runtimeError === null,
171
+ error: runtimeError,
172
+ testResults: tests.testResults,
173
+ variableMutations,
174
+ logs: logCollector.logs,
175
+ returnValue: hasReturnValue ? returnValue : undefined,
176
+ hasReturnValue,
177
+ ...(requestBundle ? { request: requestBundle.toRequestState() } : {}),
178
+ };
179
+ };
180
+ exports.executeScript = executeScript;
181
+ // Standalone parse-only check — exposed so the desktop's
182
+ // `desktop:validate-scenario-script` IPC handler can give immediate
183
+ // in-editor feedback without preparing the full sandbox state.
184
+ const validateScript = (script, filename = DEFAULT_FILENAME) => {
185
+ if (!script.trim()) {
186
+ return null;
187
+ }
188
+ try {
189
+ (0, sandbox_js_1.compileAndPrepare)(script, { pm: {} }, filename);
190
+ return null;
191
+ }
192
+ catch (error) {
193
+ return (0, errors_js_1.toSerializableError)(DEFAULT_STAGE, error);
194
+ }
195
+ };
196
+ exports.validateScript = validateScript;
197
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/script/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ // pm.expect / PmAssertion — Postman/Chai-flavored fluent assertion vocabulary.
3
+ //
4
+ // Lifted as-is from the legacy callman_core/src/script/pmApi.ts (which is
5
+ // also identical to the backend's PostmanAssertion class). This is the one
6
+ // part of the sandbox that all three implementations agreed on, so we keep
7
+ // the behavior bit-identical to avoid breaking user scripts.
8
+ //
9
+ // Chain getters (.to / .be / .have / ...) return `this` and exist purely
10
+ // for English-grammar fluency (`pm.expect(x).to.have.status(200)`).
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createExpectApi = exports.PmAssertion = void 0;
13
+ const get_js_1 = require("../../utils/get.js");
14
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
15
+ const formatValue = (value) => {
16
+ if (typeof value === "string") {
17
+ return `"${value}"`;
18
+ }
19
+ if (value === undefined) {
20
+ return "undefined";
21
+ }
22
+ try {
23
+ return JSON.stringify(value);
24
+ }
25
+ catch {
26
+ return String(value);
27
+ }
28
+ };
29
+ const getValueType = (value) => {
30
+ if (value === null) {
31
+ return "null";
32
+ }
33
+ if (Array.isArray(value)) {
34
+ return "array";
35
+ }
36
+ return typeof value;
37
+ };
38
+ const isDeepEqual = (left, right) => {
39
+ if (Object.is(left, right)) {
40
+ return true;
41
+ }
42
+ if (Array.isArray(left) && Array.isArray(right)) {
43
+ return (left.length === right.length &&
44
+ left.every((value, index) => isDeepEqual(value, right[index])));
45
+ }
46
+ if (isRecord(left) && isRecord(right)) {
47
+ const leftKeys = Object.keys(left);
48
+ const rightKeys = Object.keys(right);
49
+ return (leftKeys.length === rightKeys.length &&
50
+ leftKeys.every((key) => Object.prototype.hasOwnProperty.call(right, key) &&
51
+ isDeepEqual(left[key], right[key])));
52
+ }
53
+ return false;
54
+ };
55
+ class PmAssertion {
56
+ actual;
57
+ constructor(actual) {
58
+ this.actual = actual;
59
+ }
60
+ // English chain getters — return `this` for fluent grammar
61
+ get to() {
62
+ return this;
63
+ }
64
+ get be() {
65
+ return this;
66
+ }
67
+ get been() {
68
+ return this;
69
+ }
70
+ get is() {
71
+ return this;
72
+ }
73
+ get that() {
74
+ return this;
75
+ }
76
+ get which() {
77
+ return this;
78
+ }
79
+ get and() {
80
+ return this;
81
+ }
82
+ get has() {
83
+ return this;
84
+ }
85
+ get have() {
86
+ return this;
87
+ }
88
+ get with() {
89
+ return this;
90
+ }
91
+ get same() {
92
+ return this;
93
+ }
94
+ get deep() {
95
+ return this;
96
+ }
97
+ get ok() {
98
+ return this.toBeTruthy();
99
+ }
100
+ get true() {
101
+ if (this.actual !== true) {
102
+ throw new Error(`Expected ${formatValue(this.actual)} to be true`);
103
+ }
104
+ return this;
105
+ }
106
+ get false() {
107
+ if (this.actual !== false) {
108
+ throw new Error(`Expected ${formatValue(this.actual)} to be false`);
109
+ }
110
+ return this;
111
+ }
112
+ get exist() {
113
+ if (this.actual === null || this.actual === undefined) {
114
+ throw new Error(`Expected ${formatValue(this.actual)} to exist`);
115
+ }
116
+ return this;
117
+ }
118
+ equal(expected) {
119
+ if (!Object.is(this.actual, expected)) {
120
+ throw new Error(`Expected ${formatValue(this.actual)} to equal ${formatValue(expected)}`);
121
+ }
122
+ return this;
123
+ }
124
+ toBe(expected) {
125
+ return this.equal(expected);
126
+ }
127
+ toBeDefined() {
128
+ if (this.actual === undefined) {
129
+ throw new Error(`Expected ${formatValue(this.actual)} to be defined`);
130
+ }
131
+ return this;
132
+ }
133
+ equals(expected) {
134
+ return this.equal(expected);
135
+ }
136
+ eql(expected) {
137
+ return this.toEqual(expected);
138
+ }
139
+ toEqual(expected) {
140
+ if (!isDeepEqual(this.actual, expected)) {
141
+ throw new Error(`Expected ${formatValue(this.actual)} to deeply equal ${formatValue(expected)}`);
142
+ }
143
+ return this;
144
+ }
145
+ a(expectedType) {
146
+ const actualType = getValueType(this.actual);
147
+ const normalizedExpectedType = expectedType.trim().toLowerCase();
148
+ if (actualType !== normalizedExpectedType) {
149
+ throw new Error(`Expected type ${normalizedExpectedType} but got ${actualType}`);
150
+ }
151
+ return this;
152
+ }
153
+ an(expectedType) {
154
+ return this.a(expectedType);
155
+ }
156
+ property(key, expectedValue) {
157
+ const property = (0, get_js_1.safeGet)(this.actual, key);
158
+ if (!property.exists) {
159
+ throw new Error(`Expected ${formatValue(this.actual)} to have property "${key}"`);
160
+ }
161
+ const nextAssertion = new PmAssertion(property.value);
162
+ if (arguments.length > 1) {
163
+ nextAssertion.toEqual(expectedValue);
164
+ }
165
+ return nextAssertion;
166
+ }
167
+ contain(expected) {
168
+ return this.toContain(expected);
169
+ }
170
+ include(expected) {
171
+ return this.toContain(expected);
172
+ }
173
+ toContain(expected) {
174
+ if (typeof this.actual === "string") {
175
+ if (!this.actual.includes(String(expected))) {
176
+ throw new Error(`Expected ${formatValue(this.actual)} to contain ${formatValue(expected)}`);
177
+ }
178
+ return this;
179
+ }
180
+ if (Array.isArray(this.actual)) {
181
+ if (!this.actual.some((entry) => isDeepEqual(entry, expected))) {
182
+ throw new Error(`Expected ${formatValue(this.actual)} to contain ${formatValue(expected)}`);
183
+ }
184
+ return this;
185
+ }
186
+ throw new Error("toContain supports only strings and arrays");
187
+ }
188
+ match(pattern) {
189
+ if (typeof this.actual !== "string") {
190
+ throw new Error(`Expected ${formatValue(this.actual)} to be a string`);
191
+ }
192
+ const matcher = typeof pattern === "string" ? new RegExp(pattern) : pattern;
193
+ if (!matcher.test(this.actual)) {
194
+ throw new Error(`Expected ${formatValue(this.actual)} to match ${String(matcher)}`);
195
+ }
196
+ return this;
197
+ }
198
+ status(expected) {
199
+ return this.property("status", expected);
200
+ }
201
+ header(name, expectedValue) {
202
+ const headers = (0, get_js_1.safeGet)(this.actual, "headers");
203
+ if (!headers.exists || !isRecord(headers.value)) {
204
+ throw new Error("Expected a response-like object with headers");
205
+ }
206
+ const normalizedName = name.toLowerCase();
207
+ const entry = Object.entries(headers.value).find(([key]) => key.toLowerCase() === normalizedName);
208
+ if (!entry) {
209
+ throw new Error(`Expected response headers to contain "${name}"`);
210
+ }
211
+ const nextAssertion = new PmAssertion(entry[1]);
212
+ if (arguments.length > 1) {
213
+ nextAssertion.toEqual(expectedValue);
214
+ }
215
+ return nextAssertion;
216
+ }
217
+ greaterThan(expected) {
218
+ return this.toBeGreaterThan(expected);
219
+ }
220
+ lessThan(expected) {
221
+ return this.toBeLessThan(expected);
222
+ }
223
+ toBeGreaterThan(expected) {
224
+ const actualNumber = Number(this.actual);
225
+ const expectedNumber = Number(expected);
226
+ if (!Number.isFinite(actualNumber) || !Number.isFinite(expectedNumber)) {
227
+ throw new Error("toBeGreaterThan supports only finite numbers");
228
+ }
229
+ if (actualNumber <= expectedNumber) {
230
+ throw new Error(`Expected ${formatValue(this.actual)} to be greater than ${formatValue(expected)}`);
231
+ }
232
+ return this;
233
+ }
234
+ toBeLessThan(expected) {
235
+ const actualNumber = Number(this.actual);
236
+ const expectedNumber = Number(expected);
237
+ if (!Number.isFinite(actualNumber) || !Number.isFinite(expectedNumber)) {
238
+ throw new Error("toBeLessThan supports only finite numbers");
239
+ }
240
+ if (actualNumber >= expectedNumber) {
241
+ throw new Error(`Expected ${formatValue(this.actual)} to be less than ${formatValue(expected)}`);
242
+ }
243
+ return this;
244
+ }
245
+ toBeTruthy() {
246
+ if (!this.actual) {
247
+ throw new Error(`Expected ${formatValue(this.actual)} to be truthy`);
248
+ }
249
+ return this;
250
+ }
251
+ toBeFalsy() {
252
+ if (this.actual) {
253
+ throw new Error(`Expected ${formatValue(this.actual)} to be falsy`);
254
+ }
255
+ return this;
256
+ }
257
+ }
258
+ exports.PmAssertion = PmAssertion;
259
+ const createExpectApi = () => {
260
+ const expect = ((actual) => new PmAssertion(actual));
261
+ expect.fail = (message) => {
262
+ throw new Error(message === undefined || message === null
263
+ ? "Expectation failed"
264
+ : String(message));
265
+ };
266
+ return expect;
267
+ };
268
+ exports.createExpectApi = createExpectApi;
269
+ //# sourceMappingURL=assertions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../../src/script/features/assertions.ts"],"names":[],"mappings":"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"}