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
package/dist/index.d.ts CHANGED
@@ -3,7 +3,10 @@ export { runRequest } from "./runner/requestRunner.js";
3
3
  export { executeRequest } from "./request/executeRequest.js";
4
4
  export { EnvStore } from "./variables/envStore.js";
5
5
  export { resolveTemplate, resolveTemplateValue } from "./variables/resolver.js";
6
- export { runScript } from "./script/scriptEngine.js";
6
+ export { runScript } from "./script/legacy.js";
7
+ export { executeScript, validateScript } from "./script/executor.js";
8
+ export type { ExecuteScriptInput, ExecuteScriptResult, ScriptCapabilities, ScriptError, ScriptKeyValuePair, ScriptLogEntry, ScriptRequestBodyState, ScriptRequestState, ScriptResponseState, ScriptStage, ScriptTestResult, ScriptVariableMutation, } from "./script/types.js";
9
+ export { PmAssertion, createExpectApi } from "./script/features/assertions.js";
7
10
  export { validateContracts } from "./contract/contractValidator.js";
8
11
  export * from "./scenario-runner/index.js";
9
12
  export * from "./types/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -3,7 +3,9 @@ export { runRequest } from "./runner/requestRunner.js";
3
3
  export { executeRequest } from "./request/executeRequest.js";
4
4
  export { EnvStore } from "./variables/envStore.js";
5
5
  export { resolveTemplate, resolveTemplateValue } from "./variables/resolver.js";
6
- export { runScript } from "./script/scriptEngine.js";
6
+ export { runScript } from "./script/legacy.js";
7
+ export { executeScript, validateScript } from "./script/executor.js";
8
+ export { PmAssertion, createExpectApi } from "./script/features/assertions.js";
7
9
  export { validateContracts } from "./contract/contractValidator.js";
8
10
  export * from "./scenario-runner/index.js";
9
11
  export * from "./types/index.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAerE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ScriptError, ScriptStage } from "./types.js";
2
+ export declare const toSerializableError: (stage: ScriptStage, error: unknown) => ScriptError;
3
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/script/errors.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6D3D,eAAO,MAAM,mBAAmB,GAC9B,OAAO,WAAW,EAClB,OAAO,OAAO,KACb,WAYF,CAAC"}
@@ -0,0 +1,68 @@
1
+ // Error serialization for the canonical script sandbox.
2
+ //
3
+ // vm errors arrive with a stack trace whose first useful frame names the
4
+ // virtual filename we passed to `new vm.Script({ filename })`. We pull
5
+ // line/column from that frame so editors can highlight the offending row.
6
+ // `lineOffset: -2` is set on the vm.Script (the wrapper prepends two lines:
7
+ // the IIFE opener and the `with(scope)` line). When the stack reports
8
+ // "callman-script.js:5:7" the displayed line in the user's source is 5.
9
+ const FRAME_PATTERNS = [
10
+ /callman-script\.js:(\d+):(\d+)/,
11
+ /callman-scenario\.script\.js:(\d+):(\d+)/,
12
+ /callman-request\.script\.js:(\d+):(\d+)/,
13
+ /<anonymous>:(\d+):(\d+)/,
14
+ ];
15
+ const matchFrame = (stack) => {
16
+ if (!stack) {
17
+ return { lineNumber: null, column: null };
18
+ }
19
+ for (const pattern of FRAME_PATTERNS) {
20
+ const match = stack.match(pattern);
21
+ if (match) {
22
+ return {
23
+ lineNumber: Math.max(1, Number(match[1])),
24
+ column: Number(match[2]),
25
+ };
26
+ }
27
+ }
28
+ return { lineNumber: null, column: null };
29
+ };
30
+ // Cross-realm: errors thrown inside vm context fail `instanceof Error` checks
31
+ // from the host, so read .message / .stack structurally.
32
+ const readMessage = (error) => {
33
+ if (error instanceof Error) {
34
+ return error.message;
35
+ }
36
+ if (error &&
37
+ typeof error === "object" &&
38
+ "message" in error &&
39
+ typeof error.message === "string") {
40
+ return error.message;
41
+ }
42
+ return String(error);
43
+ };
44
+ const readStack = (error) => {
45
+ if (error instanceof Error) {
46
+ return error.stack ?? null;
47
+ }
48
+ if (error &&
49
+ typeof error === "object" &&
50
+ "stack" in error &&
51
+ typeof error.stack === "string") {
52
+ return error.stack;
53
+ }
54
+ return null;
55
+ };
56
+ export const toSerializableError = (stage, error) => {
57
+ const stack = readStack(error);
58
+ const message = readMessage(error);
59
+ const { lineNumber, column } = matchFrame(stack);
60
+ return {
61
+ stage,
62
+ message,
63
+ lineNumber,
64
+ column,
65
+ stack,
66
+ };
67
+ };
68
+ //# 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;AAEF,MAAM,CAAC,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"}
@@ -0,0 +1,5 @@
1
+ import type { ExecuteScriptInput, ExecuteScriptResult, ScriptError, ScriptRequestState } from "./types.js";
2
+ export declare const executeScript: (input: ExecuteScriptInput) => Promise<ExecuteScriptResult>;
3
+ export declare const validateScript: (script: string, filename?: string) => ScriptError | null;
4
+ export type { ScriptRequestState };
5
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/script/executor.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAEnB,WAAW,EAEX,kBAAkB,EAInB,MAAM,YAAY,CAAC;AA+FpB,eAAO,MAAM,aAAa,GACxB,OAAO,kBAAkB,KACxB,OAAO,CAAC,mBAAmB,CAqH7B,CAAC;AAKF,eAAO,MAAM,cAAc,GACzB,QAAQ,MAAM,EACd,iBAA2B,KAC1B,WAAW,GAAG,IAUhB,CAAC;AAKF,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,192 @@
1
+ // Public canonical script executor — the single entry point that all three
2
+ // consumers (CLI via legacy shim, backend, electron) ultimately call.
3
+ //
4
+ // Composes:
5
+ // - sandbox (vm.createContext + scope Proxy + reserved globals)
6
+ // - pm API (assertions + tests + env/globals + request/response + node + log)
7
+ // - timeout (vm-level + outer Promise race)
8
+ // - error serialization (line/column attribution)
9
+ //
10
+ // The function never throws. Parse errors, runtime errors, and timeouts are
11
+ // all returned in the `error` field of the result. Callers that need to
12
+ // distinguish "the sandbox itself blew up" should check `success === false`.
13
+ import { buildEnvironmentApi } from "./features/environment.js";
14
+ import { createExpectApi } from "./features/assertions.js";
15
+ import { buildLabelGlobals, buildNodeApi } from "./features/node.js";
16
+ import { buildRequestApi } from "./features/request.js";
17
+ import { buildResponseApi } from "./features/response.js";
18
+ import { buildTestCollector } from "./features/tests.js";
19
+ import { createLogCollector, createSilentLogCollector, } from "./features/log.js";
20
+ import { compileAndPrepare } from "./sandbox.js";
21
+ import { toSerializableError } from "./errors.js";
22
+ import { toHostPromise, withAsyncTimeout } from "./timeout.js";
23
+ const DEFAULT_TIMEOUT_MS = 15_000;
24
+ const DEFAULT_FILENAME = "callman-script.js";
25
+ const DEFAULT_STAGE = "script";
26
+ const buildPm = (capabilities, logs, collectors) => {
27
+ const pm = {
28
+ test: collectors.test.test,
29
+ expect: collectors.expect,
30
+ };
31
+ if (collectors.environment) {
32
+ pm.environment = collectors.environment;
33
+ pm.env = collectors.environment;
34
+ }
35
+ if (collectors.globals) {
36
+ pm.globals = collectors.globals;
37
+ }
38
+ if (collectors.request) {
39
+ pm.request = collectors.request.api;
40
+ }
41
+ if (collectors.response) {
42
+ pm.response = collectors.response;
43
+ }
44
+ const extensions = capabilities.extensions ?? {};
45
+ if (extensions.log) {
46
+ pm.log = logs.pmLog;
47
+ }
48
+ if (extensions.node) {
49
+ pm.node = buildNodeApi({
50
+ workflowContext: capabilities.workflowContext ?? {},
51
+ nodeMetaByLabel: capabilities.nodeMetaByLabel,
52
+ });
53
+ }
54
+ return pm;
55
+ };
56
+ const buildScopeBindings = ({ pm, capabilities, consoleApi, envValues, environmentApi, request, response, expect, test, }) => {
57
+ const exposeLabels = capabilities.workflowContext &&
58
+ capabilities.exposeLabelsAsGlobals !== false;
59
+ const labelGlobals = exposeLabels
60
+ ? buildLabelGlobals({
61
+ workflowContext: capabilities.workflowContext ?? {},
62
+ nodeMetaByLabel: capabilities.nodeMetaByLabel,
63
+ })
64
+ : undefined;
65
+ return {
66
+ pm,
67
+ env: envValues,
68
+ environment: environmentApi,
69
+ request,
70
+ response,
71
+ test,
72
+ expect,
73
+ console: consoleApi,
74
+ labelGlobals,
75
+ };
76
+ };
77
+ export const executeScript = async (input) => {
78
+ const timeoutMs = input.timeoutMs ?? DEFAULT_TIMEOUT_MS;
79
+ const filename = input.filename ?? DEFAULT_FILENAME;
80
+ const stage = input.stage ?? DEFAULT_STAGE;
81
+ const capabilities = input.capabilities;
82
+ // Empty / whitespace-only scripts short-circuit with an empty success.
83
+ if (!input.script.trim()) {
84
+ return {
85
+ success: true,
86
+ error: null,
87
+ testResults: [],
88
+ variableMutations: [],
89
+ logs: [],
90
+ hasReturnValue: false,
91
+ };
92
+ }
93
+ const variableMutations = [];
94
+ const environmentApi = capabilities.environment
95
+ ? buildEnvironmentApi(capabilities.environment.values, capabilities.environment.emitMutations !== false ? variableMutations : null, "environment")
96
+ : undefined;
97
+ const globalsApi = capabilities.globals
98
+ ? buildEnvironmentApi(capabilities.globals.values, capabilities.globals.emitMutations !== false ? variableMutations : null, "global")
99
+ : undefined;
100
+ const requestBundle = capabilities.request
101
+ ? buildRequestApi(capabilities.request)
102
+ : undefined;
103
+ const responseApi = buildResponseApi(capabilities.response ?? null) ?? undefined;
104
+ const expect = createExpectApi();
105
+ const tests = buildTestCollector(stage);
106
+ const logCollector = capabilities.extensions?.log
107
+ ? createLogCollector()
108
+ : createSilentLogCollector();
109
+ const pm = buildPm(capabilities, { pmLog: logCollector.pmLog }, {
110
+ test: tests,
111
+ expect,
112
+ environment: environmentApi,
113
+ globals: globalsApi,
114
+ request: requestBundle,
115
+ response: responseApi ?? undefined,
116
+ });
117
+ const bindings = buildScopeBindings({
118
+ pm,
119
+ capabilities,
120
+ consoleApi: logCollector.consoleApi,
121
+ envValues: environmentApi?.values,
122
+ environmentApi,
123
+ request: requestBundle?.api,
124
+ response: responseApi,
125
+ expect,
126
+ test: tests.test,
127
+ });
128
+ let compiled;
129
+ try {
130
+ compiled = compileAndPrepare(input.script, bindings, filename);
131
+ }
132
+ catch (error) {
133
+ // Parse errors (SyntaxError) — return early as a sandbox error so the
134
+ // caller never sees a raw throw. Mutations and tests are empty since
135
+ // execution never started.
136
+ return {
137
+ success: false,
138
+ error: toSerializableError(stage, error),
139
+ testResults: [],
140
+ variableMutations: [],
141
+ logs: logCollector.logs,
142
+ hasReturnValue: false,
143
+ ...(requestBundle ? { request: requestBundle.toRequestState() } : {}),
144
+ };
145
+ }
146
+ let returnValue;
147
+ let hasReturnValue = false;
148
+ let runtimeError = null;
149
+ try {
150
+ const execution = compiled.vmScript.runInContext(compiled.vmContext, {
151
+ timeout: timeoutMs,
152
+ displayErrors: true,
153
+ breakOnSigint: false,
154
+ });
155
+ const awaited = await withAsyncTimeout(toHostPromise(execution), timeoutMs);
156
+ if (typeof awaited !== "undefined") {
157
+ returnValue = awaited;
158
+ hasReturnValue = true;
159
+ }
160
+ await withAsyncTimeout(tests.flush(), timeoutMs);
161
+ }
162
+ catch (error) {
163
+ await Promise.allSettled([tests.flush()]);
164
+ runtimeError = toSerializableError(stage, error);
165
+ }
166
+ return {
167
+ success: runtimeError === null,
168
+ error: runtimeError,
169
+ testResults: tests.testResults,
170
+ variableMutations,
171
+ logs: logCollector.logs,
172
+ returnValue: hasReturnValue ? returnValue : undefined,
173
+ hasReturnValue,
174
+ ...(requestBundle ? { request: requestBundle.toRequestState() } : {}),
175
+ };
176
+ };
177
+ // Standalone parse-only check — exposed so the desktop's
178
+ // `desktop:validate-scenario-script` IPC handler can give immediate
179
+ // in-editor feedback without preparing the full sandbox state.
180
+ export const validateScript = (script, filename = DEFAULT_FILENAME) => {
181
+ if (!script.trim()) {
182
+ return null;
183
+ }
184
+ try {
185
+ compileAndPrepare(script, { pm: {} }, filename);
186
+ return null;
187
+ }
188
+ catch (error) {
189
+ return toSerializableError(DEFAULT_STAGE, error);
190
+ }
191
+ };
192
+ //# 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,46 @@
1
+ export declare class PmAssertion {
2
+ private readonly actual;
3
+ constructor(actual: unknown);
4
+ get to(): PmAssertion;
5
+ get be(): PmAssertion;
6
+ get been(): PmAssertion;
7
+ get is(): PmAssertion;
8
+ get that(): PmAssertion;
9
+ get which(): PmAssertion;
10
+ get and(): PmAssertion;
11
+ get has(): PmAssertion;
12
+ get have(): PmAssertion;
13
+ get with(): PmAssertion;
14
+ get same(): PmAssertion;
15
+ get deep(): PmAssertion;
16
+ get ok(): PmAssertion;
17
+ get true(): PmAssertion;
18
+ get false(): PmAssertion;
19
+ get exist(): PmAssertion;
20
+ equal(expected: unknown): PmAssertion;
21
+ toBe(expected: unknown): PmAssertion;
22
+ toBeDefined(): PmAssertion;
23
+ equals(expected: unknown): PmAssertion;
24
+ eql(expected: unknown): PmAssertion;
25
+ toEqual(expected: unknown): PmAssertion;
26
+ a(expectedType: string): PmAssertion;
27
+ an(expectedType: string): PmAssertion;
28
+ property(key: string, expectedValue?: unknown): PmAssertion;
29
+ contain(expected: unknown): PmAssertion;
30
+ include(expected: unknown): PmAssertion;
31
+ toContain(expected: unknown): PmAssertion;
32
+ match(pattern: RegExp | string): PmAssertion;
33
+ status(expected: number): PmAssertion;
34
+ header(name: string, expectedValue?: unknown): PmAssertion;
35
+ greaterThan(expected: unknown): PmAssertion;
36
+ lessThan(expected: unknown): PmAssertion;
37
+ toBeGreaterThan(expected: unknown): PmAssertion;
38
+ toBeLessThan(expected: unknown): PmAssertion;
39
+ toBeTruthy(): PmAssertion;
40
+ toBeFalsy(): PmAssertion;
41
+ }
42
+ export type ExpectFn = ((actual: unknown) => PmAssertion) & {
43
+ fail: (message?: unknown) => never;
44
+ };
45
+ export declare const createExpectApi: () => ExpectFn;
46
+ //# sourceMappingURL=assertions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../../src/script/features/assertions.ts"],"names":[],"mappings":"AAgEA,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,OAAO;IAG5C,IAAI,EAAE,IAAI,WAAW,CAEpB;IACD,IAAI,EAAE,IAAI,WAAW,CAEpB;IACD,IAAI,IAAI,IAAI,WAAW,CAEtB;IACD,IAAI,EAAE,IAAI,WAAW,CAEpB;IACD,IAAI,IAAI,IAAI,WAAW,CAEtB;IACD,IAAI,KAAK,IAAI,WAAW,CAEvB;IACD,IAAI,GAAG,IAAI,WAAW,CAErB;IACD,IAAI,GAAG,IAAI,WAAW,CAErB;IACD,IAAI,IAAI,IAAI,WAAW,CAEtB;IACD,IAAI,IAAI,IAAI,WAAW,CAEtB;IACD,IAAI,IAAI,IAAI,WAAW,CAEtB;IACD,IAAI,IAAI,IAAI,WAAW,CAEtB;IAED,IAAI,EAAE,IAAI,WAAW,CAEpB;IAED,IAAI,IAAI,IAAI,WAAW,CAKtB;IAED,IAAI,KAAK,IAAI,WAAW,CAKvB;IAED,IAAI,KAAK,IAAI,WAAW,CAKvB;IAED,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IASrC,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAIpC,WAAW,IAAI,WAAW;IAO1B,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAItC,GAAG,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAInC,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IASvC,CAAC,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW;IAWpC,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW;IAIrC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,WAAW;IAc3D,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAIvC,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAIvC,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAoBzC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW;IAa5C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAIrC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,WAAW;IAmB1D,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAI3C,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAIxC,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAc/C,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;IAc5C,UAAU,IAAI,WAAW;IAOzB,SAAS,IAAI,WAAW;CAMzB;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,CAAC,GAAG;IAC1D,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,KAAK,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,eAAe,QAAO,QAUlC,CAAC"}
@@ -0,0 +1,264 @@
1
+ // pm.expect / PmAssertion — Postman/Chai-flavored fluent assertion vocabulary.
2
+ //
3
+ // Lifted as-is from the legacy callman_core/src/script/pmApi.ts (which is
4
+ // also identical to the backend's PostmanAssertion class). This is the one
5
+ // part of the sandbox that all three implementations agreed on, so we keep
6
+ // the behavior bit-identical to avoid breaking user scripts.
7
+ //
8
+ // Chain getters (.to / .be / .have / ...) return `this` and exist purely
9
+ // for English-grammar fluency (`pm.expect(x).to.have.status(200)`).
10
+ import { safeGet } from "../../utils/get.js";
11
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
12
+ const formatValue = (value) => {
13
+ if (typeof value === "string") {
14
+ return `"${value}"`;
15
+ }
16
+ if (value === undefined) {
17
+ return "undefined";
18
+ }
19
+ try {
20
+ return JSON.stringify(value);
21
+ }
22
+ catch {
23
+ return String(value);
24
+ }
25
+ };
26
+ const getValueType = (value) => {
27
+ if (value === null) {
28
+ return "null";
29
+ }
30
+ if (Array.isArray(value)) {
31
+ return "array";
32
+ }
33
+ return typeof value;
34
+ };
35
+ const isDeepEqual = (left, right) => {
36
+ if (Object.is(left, right)) {
37
+ return true;
38
+ }
39
+ if (Array.isArray(left) && Array.isArray(right)) {
40
+ return (left.length === right.length &&
41
+ left.every((value, index) => isDeepEqual(value, right[index])));
42
+ }
43
+ if (isRecord(left) && isRecord(right)) {
44
+ const leftKeys = Object.keys(left);
45
+ const rightKeys = Object.keys(right);
46
+ return (leftKeys.length === rightKeys.length &&
47
+ leftKeys.every((key) => Object.prototype.hasOwnProperty.call(right, key) &&
48
+ isDeepEqual(left[key], right[key])));
49
+ }
50
+ return false;
51
+ };
52
+ export class PmAssertion {
53
+ actual;
54
+ constructor(actual) {
55
+ this.actual = actual;
56
+ }
57
+ // English chain getters — return `this` for fluent grammar
58
+ get to() {
59
+ return this;
60
+ }
61
+ get be() {
62
+ return this;
63
+ }
64
+ get been() {
65
+ return this;
66
+ }
67
+ get is() {
68
+ return this;
69
+ }
70
+ get that() {
71
+ return this;
72
+ }
73
+ get which() {
74
+ return this;
75
+ }
76
+ get and() {
77
+ return this;
78
+ }
79
+ get has() {
80
+ return this;
81
+ }
82
+ get have() {
83
+ return this;
84
+ }
85
+ get with() {
86
+ return this;
87
+ }
88
+ get same() {
89
+ return this;
90
+ }
91
+ get deep() {
92
+ return this;
93
+ }
94
+ get ok() {
95
+ return this.toBeTruthy();
96
+ }
97
+ get true() {
98
+ if (this.actual !== true) {
99
+ throw new Error(`Expected ${formatValue(this.actual)} to be true`);
100
+ }
101
+ return this;
102
+ }
103
+ get false() {
104
+ if (this.actual !== false) {
105
+ throw new Error(`Expected ${formatValue(this.actual)} to be false`);
106
+ }
107
+ return this;
108
+ }
109
+ get exist() {
110
+ if (this.actual === null || this.actual === undefined) {
111
+ throw new Error(`Expected ${formatValue(this.actual)} to exist`);
112
+ }
113
+ return this;
114
+ }
115
+ equal(expected) {
116
+ if (!Object.is(this.actual, expected)) {
117
+ throw new Error(`Expected ${formatValue(this.actual)} to equal ${formatValue(expected)}`);
118
+ }
119
+ return this;
120
+ }
121
+ toBe(expected) {
122
+ return this.equal(expected);
123
+ }
124
+ toBeDefined() {
125
+ if (this.actual === undefined) {
126
+ throw new Error(`Expected ${formatValue(this.actual)} to be defined`);
127
+ }
128
+ return this;
129
+ }
130
+ equals(expected) {
131
+ return this.equal(expected);
132
+ }
133
+ eql(expected) {
134
+ return this.toEqual(expected);
135
+ }
136
+ toEqual(expected) {
137
+ if (!isDeepEqual(this.actual, expected)) {
138
+ throw new Error(`Expected ${formatValue(this.actual)} to deeply equal ${formatValue(expected)}`);
139
+ }
140
+ return this;
141
+ }
142
+ a(expectedType) {
143
+ const actualType = getValueType(this.actual);
144
+ const normalizedExpectedType = expectedType.trim().toLowerCase();
145
+ if (actualType !== normalizedExpectedType) {
146
+ throw new Error(`Expected type ${normalizedExpectedType} but got ${actualType}`);
147
+ }
148
+ return this;
149
+ }
150
+ an(expectedType) {
151
+ return this.a(expectedType);
152
+ }
153
+ property(key, expectedValue) {
154
+ const property = safeGet(this.actual, key);
155
+ if (!property.exists) {
156
+ throw new Error(`Expected ${formatValue(this.actual)} to have property "${key}"`);
157
+ }
158
+ const nextAssertion = new PmAssertion(property.value);
159
+ if (arguments.length > 1) {
160
+ nextAssertion.toEqual(expectedValue);
161
+ }
162
+ return nextAssertion;
163
+ }
164
+ contain(expected) {
165
+ return this.toContain(expected);
166
+ }
167
+ include(expected) {
168
+ return this.toContain(expected);
169
+ }
170
+ toContain(expected) {
171
+ if (typeof this.actual === "string") {
172
+ if (!this.actual.includes(String(expected))) {
173
+ throw new Error(`Expected ${formatValue(this.actual)} to contain ${formatValue(expected)}`);
174
+ }
175
+ return this;
176
+ }
177
+ if (Array.isArray(this.actual)) {
178
+ if (!this.actual.some((entry) => isDeepEqual(entry, expected))) {
179
+ throw new Error(`Expected ${formatValue(this.actual)} to contain ${formatValue(expected)}`);
180
+ }
181
+ return this;
182
+ }
183
+ throw new Error("toContain supports only strings and arrays");
184
+ }
185
+ match(pattern) {
186
+ if (typeof this.actual !== "string") {
187
+ throw new Error(`Expected ${formatValue(this.actual)} to be a string`);
188
+ }
189
+ const matcher = typeof pattern === "string" ? new RegExp(pattern) : pattern;
190
+ if (!matcher.test(this.actual)) {
191
+ throw new Error(`Expected ${formatValue(this.actual)} to match ${String(matcher)}`);
192
+ }
193
+ return this;
194
+ }
195
+ status(expected) {
196
+ return this.property("status", expected);
197
+ }
198
+ header(name, expectedValue) {
199
+ const headers = safeGet(this.actual, "headers");
200
+ if (!headers.exists || !isRecord(headers.value)) {
201
+ throw new Error("Expected a response-like object with headers");
202
+ }
203
+ const normalizedName = name.toLowerCase();
204
+ const entry = Object.entries(headers.value).find(([key]) => key.toLowerCase() === normalizedName);
205
+ if (!entry) {
206
+ throw new Error(`Expected response headers to contain "${name}"`);
207
+ }
208
+ const nextAssertion = new PmAssertion(entry[1]);
209
+ if (arguments.length > 1) {
210
+ nextAssertion.toEqual(expectedValue);
211
+ }
212
+ return nextAssertion;
213
+ }
214
+ greaterThan(expected) {
215
+ return this.toBeGreaterThan(expected);
216
+ }
217
+ lessThan(expected) {
218
+ return this.toBeLessThan(expected);
219
+ }
220
+ toBeGreaterThan(expected) {
221
+ const actualNumber = Number(this.actual);
222
+ const expectedNumber = Number(expected);
223
+ if (!Number.isFinite(actualNumber) || !Number.isFinite(expectedNumber)) {
224
+ throw new Error("toBeGreaterThan supports only finite numbers");
225
+ }
226
+ if (actualNumber <= expectedNumber) {
227
+ throw new Error(`Expected ${formatValue(this.actual)} to be greater than ${formatValue(expected)}`);
228
+ }
229
+ return this;
230
+ }
231
+ toBeLessThan(expected) {
232
+ const actualNumber = Number(this.actual);
233
+ const expectedNumber = Number(expected);
234
+ if (!Number.isFinite(actualNumber) || !Number.isFinite(expectedNumber)) {
235
+ throw new Error("toBeLessThan supports only finite numbers");
236
+ }
237
+ if (actualNumber >= expectedNumber) {
238
+ throw new Error(`Expected ${formatValue(this.actual)} to be less than ${formatValue(expected)}`);
239
+ }
240
+ return this;
241
+ }
242
+ toBeTruthy() {
243
+ if (!this.actual) {
244
+ throw new Error(`Expected ${formatValue(this.actual)} to be truthy`);
245
+ }
246
+ return this;
247
+ }
248
+ toBeFalsy() {
249
+ if (this.actual) {
250
+ throw new Error(`Expected ${formatValue(this.actual)} to be falsy`);
251
+ }
252
+ return this;
253
+ }
254
+ }
255
+ export const createExpectApi = () => {
256
+ const expect = ((actual) => new PmAssertion(actual));
257
+ expect.fail = (message) => {
258
+ throw new Error(message === undefined || message === null
259
+ ? "Expectation failed"
260
+ : String(message));
261
+ };
262
+ return expect;
263
+ };
264
+ //# sourceMappingURL=assertions.js.map