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.
Files changed (199) hide show
  1. package/dist/index.d.ts +6 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +5 -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 +301 -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/counter.d.ts +11 -0
  18. package/dist/script/features/counter.d.ts.map +1 -0
  19. package/dist/script/features/counter.js +43 -0
  20. package/dist/script/features/counter.js.map +1 -0
  21. package/dist/script/features/cryptojs.d.ts +13 -0
  22. package/dist/script/features/cryptojs.d.ts.map +1 -0
  23. package/dist/script/features/cryptojs.js +63 -0
  24. package/dist/script/features/cryptojs.js.map +1 -0
  25. package/dist/script/features/db.d.ts +36 -0
  26. package/dist/script/features/db.d.ts.map +1 -0
  27. package/dist/script/features/db.js +165 -0
  28. package/dist/script/features/db.js.map +1 -0
  29. package/dist/script/features/environment.d.ts +11 -0
  30. package/dist/script/features/environment.d.ts.map +1 -0
  31. package/dist/script/features/environment.js +61 -0
  32. package/dist/script/features/environment.js.map +1 -0
  33. package/dist/script/features/feature-policy.d.ts +8 -0
  34. package/dist/script/features/feature-policy.d.ts.map +1 -0
  35. package/dist/script/features/feature-policy.js +88 -0
  36. package/dist/script/features/feature-policy.js.map +1 -0
  37. package/dist/script/features/kafka.d.ts +11 -0
  38. package/dist/script/features/kafka.d.ts.map +1 -0
  39. package/dist/script/features/kafka.js +71 -0
  40. package/dist/script/features/kafka.js.map +1 -0
  41. package/dist/script/features/log.d.ts +15 -0
  42. package/dist/script/features/log.d.ts.map +1 -0
  43. package/dist/script/features/log.js +59 -0
  44. package/dist/script/features/log.js.map +1 -0
  45. package/dist/script/features/node.d.ts +14 -0
  46. package/dist/script/features/node.d.ts.map +1 -0
  47. package/dist/script/features/node.js +82 -0
  48. package/dist/script/features/node.js.map +1 -0
  49. package/dist/script/features/random.d.ts +13 -0
  50. package/dist/script/features/random.d.ts.map +1 -0
  51. package/dist/script/features/random.js +111 -0
  52. package/dist/script/features/random.js.map +1 -0
  53. package/dist/script/features/redis.d.ts +10 -0
  54. package/dist/script/features/redis.d.ts.map +1 -0
  55. package/dist/script/features/redis.js +22 -0
  56. package/dist/script/features/redis.js.map +1 -0
  57. package/dist/script/features/request.d.ts +23 -0
  58. package/dist/script/features/request.d.ts.map +1 -0
  59. package/dist/script/features/request.js +105 -0
  60. package/dist/script/features/request.js.map +1 -0
  61. package/dist/script/features/response.d.ts +25 -0
  62. package/dist/script/features/response.d.ts.map +1 -0
  63. package/dist/script/features/response.js +43 -0
  64. package/dist/script/features/response.js.map +1 -0
  65. package/dist/script/features/tests.d.ts +15 -0
  66. package/dist/script/features/tests.d.ts.map +1 -0
  67. package/dist/script/features/tests.js +147 -0
  68. package/dist/script/features/tests.js.map +1 -0
  69. package/dist/script/features/variables.d.ts +6 -0
  70. package/dist/script/features/variables.d.ts.map +1 -0
  71. package/dist/script/features/variables.js +25 -0
  72. package/dist/script/features/variables.js.map +1 -0
  73. package/dist/script/legacy.d.ts +4 -0
  74. package/dist/script/legacy.d.ts.map +1 -0
  75. package/dist/script/legacy.js +128 -0
  76. package/dist/script/legacy.js.map +1 -0
  77. package/dist/script/sandbox.d.ts +16 -0
  78. package/dist/script/sandbox.d.ts.map +1 -0
  79. package/dist/script/sandbox.js +51 -0
  80. package/dist/script/sandbox.js.map +1 -0
  81. package/dist/script/scope.d.ts +23 -0
  82. package/dist/script/scope.d.ts.map +1 -0
  83. package/dist/script/scope.js +172 -0
  84. package/dist/script/scope.js.map +1 -0
  85. package/dist/script/scriptEngine.d.ts +2 -2
  86. package/dist/script/scriptEngine.d.ts.map +1 -1
  87. package/dist/script/scriptEngine.js +7 -105
  88. package/dist/script/scriptEngine.js.map +1 -1
  89. package/dist/script/timeout.d.ts +3 -0
  90. package/dist/script/timeout.d.ts.map +1 -0
  91. package/dist/script/timeout.js +38 -0
  92. package/dist/script/timeout.js.map +1 -0
  93. package/dist/script/types.d.ts +167 -0
  94. package/dist/script/types.d.ts.map +1 -0
  95. package/dist/script/types.js +7 -0
  96. package/dist/script/types.js.map +1 -0
  97. package/dist-cjs/contract/contractValidator.js +236 -0
  98. package/dist-cjs/contract/contractValidator.js.map +1 -0
  99. package/dist-cjs/index.js +47 -0
  100. package/dist-cjs/index.js.map +1 -0
  101. package/dist-cjs/package.json +1 -0
  102. package/dist-cjs/request/executeRequest.js +33 -0
  103. package/dist-cjs/request/executeRequest.js.map +1 -0
  104. package/dist-cjs/runner/requestRunner.js +102 -0
  105. package/dist-cjs/runner/requestRunner.js.map +1 -0
  106. package/dist-cjs/runner/runCollection.js +53 -0
  107. package/dist-cjs/runner/runCollection.js.map +1 -0
  108. package/dist-cjs/scenario-runner/condition.js +1735 -0
  109. package/dist-cjs/scenario-runner/condition.js.map +1 -0
  110. package/dist-cjs/scenario-runner/conditionTypes.js +3 -0
  111. package/dist-cjs/scenario-runner/conditionTypes.js.map +1 -0
  112. package/dist-cjs/scenario-runner/executionPolicyRunner.js +53 -0
  113. package/dist-cjs/scenario-runner/executionPolicyRunner.js.map +1 -0
  114. package/dist-cjs/scenario-runner/graphTraversal.js +27 -0
  115. package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -0
  116. package/dist-cjs/scenario-runner/index.js +39 -0
  117. package/dist-cjs/scenario-runner/index.js.map +1 -0
  118. package/dist-cjs/scenario-runner/nodePolicy.js +127 -0
  119. package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -0
  120. package/dist-cjs/scenario-runner/notification/index.js +18 -0
  121. package/dist-cjs/scenario-runner/notification/index.js.map +1 -0
  122. package/dist-cjs/scenario-runner/notification/providers/provider.interface.js +3 -0
  123. package/dist-cjs/scenario-runner/notification/providers/provider.interface.js.map +1 -0
  124. package/dist-cjs/scenario-runner/notification/providers/slack.provider.js +88 -0
  125. package/dist-cjs/scenario-runner/notification/providers/slack.provider.js.map +1 -0
  126. package/dist-cjs/scenario-runner/notification/template.js +13 -0
  127. package/dist-cjs/scenario-runner/notification/template.js.map +1 -0
  128. package/dist-cjs/scenario-runner/retryExecutor.js +57 -0
  129. package/dist-cjs/scenario-runner/retryExecutor.js.map +1 -0
  130. package/dist-cjs/scenario-runner/runScenario.js +1545 -0
  131. package/dist-cjs/scenario-runner/runScenario.js.map +1 -0
  132. package/dist-cjs/scenario-runner/templateResolver.js +468 -0
  133. package/dist-cjs/scenario-runner/templateResolver.js.map +1 -0
  134. package/dist-cjs/scenario-runner/types.js +3 -0
  135. package/dist-cjs/scenario-runner/types.js.map +1 -0
  136. package/dist-cjs/scenario-runner/waitNodeExecutor.js +71 -0
  137. package/dist-cjs/scenario-runner/waitNodeExecutor.js.map +1 -0
  138. package/dist-cjs/script/errors.js +72 -0
  139. package/dist-cjs/script/errors.js.map +1 -0
  140. package/dist-cjs/script/executor.js +306 -0
  141. package/dist-cjs/script/executor.js.map +1 -0
  142. package/dist-cjs/script/features/assertions.js +269 -0
  143. package/dist-cjs/script/features/assertions.js.map +1 -0
  144. package/dist-cjs/script/features/counter.js +47 -0
  145. package/dist-cjs/script/features/counter.js.map +1 -0
  146. package/dist-cjs/script/features/cryptojs.js +67 -0
  147. package/dist-cjs/script/features/cryptojs.js.map +1 -0
  148. package/dist-cjs/script/features/db.js +169 -0
  149. package/dist-cjs/script/features/db.js.map +1 -0
  150. package/dist-cjs/script/features/environment.js +65 -0
  151. package/dist-cjs/script/features/environment.js.map +1 -0
  152. package/dist-cjs/script/features/feature-policy.js +94 -0
  153. package/dist-cjs/script/features/feature-policy.js.map +1 -0
  154. package/dist-cjs/script/features/kafka.js +77 -0
  155. package/dist-cjs/script/features/kafka.js.map +1 -0
  156. package/dist-cjs/script/features/log.js +64 -0
  157. package/dist-cjs/script/features/log.js.map +1 -0
  158. package/dist-cjs/script/features/node.js +89 -0
  159. package/dist-cjs/script/features/node.js.map +1 -0
  160. package/dist-cjs/script/features/random.js +115 -0
  161. package/dist-cjs/script/features/random.js.map +1 -0
  162. package/dist-cjs/script/features/redis.js +26 -0
  163. package/dist-cjs/script/features/redis.js.map +1 -0
  164. package/dist-cjs/script/features/request.js +109 -0
  165. package/dist-cjs/script/features/request.js.map +1 -0
  166. package/dist-cjs/script/features/response.js +47 -0
  167. package/dist-cjs/script/features/response.js.map +1 -0
  168. package/dist-cjs/script/features/tests.js +151 -0
  169. package/dist-cjs/script/features/tests.js.map +1 -0
  170. package/dist-cjs/script/features/variables.js +29 -0
  171. package/dist-cjs/script/features/variables.js.map +1 -0
  172. package/dist-cjs/script/legacy.js +132 -0
  173. package/dist-cjs/script/legacy.js.map +1 -0
  174. package/dist-cjs/script/pmApi.js +353 -0
  175. package/dist-cjs/script/pmApi.js.map +1 -0
  176. package/dist-cjs/script/sandbox.js +91 -0
  177. package/dist-cjs/script/sandbox.js.map +1 -0
  178. package/dist-cjs/script/scope.js +177 -0
  179. package/dist-cjs/script/scope.js.map +1 -0
  180. package/dist-cjs/script/scriptEngine.js +12 -0
  181. package/dist-cjs/script/scriptEngine.js.map +1 -0
  182. package/dist-cjs/script/timeout.js +43 -0
  183. package/dist-cjs/script/timeout.js.map +1 -0
  184. package/dist-cjs/script/types.js +8 -0
  185. package/dist-cjs/script/types.js.map +1 -0
  186. package/dist-cjs/types/index.js +3 -0
  187. package/dist-cjs/types/index.js.map +1 -0
  188. package/dist-cjs/utils/get.js +52 -0
  189. package/dist-cjs/utils/get.js.map +1 -0
  190. package/dist-cjs/utils/random.js +87 -0
  191. package/dist-cjs/utils/random.js.map +1 -0
  192. package/dist-cjs/variables/envStore.js +24 -0
  193. package/dist-cjs/variables/envStore.js.map +1 -0
  194. package/dist-cjs/variables/resolver.js +95 -0
  195. package/dist-cjs/variables/resolver.js.map +1 -0
  196. package/package.json +19 -3
  197. package/samples/runSample.mjs +0 -128
  198. package/tests/waitNode.test.mjs +0 -311
  199. package/tsconfig.json +0 -18
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../../src/script/features/assertions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CounterSnapshotEntry } from "../types.js";
2
+ export interface CounterApi {
3
+ next: () => number;
4
+ start: (startAt?: number) => number;
5
+ }
6
+ export interface CounterFeature {
7
+ api: CounterApi;
8
+ snapshot: () => CounterSnapshotEntry[];
9
+ }
10
+ export declare const buildCounterFeature: (snapshot: CounterSnapshotEntry[]) => CounterFeature;
11
+ //# sourceMappingURL=counter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../../src/script/features/counter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,MAAM,oBAAoB,EAAE,CAAC;CACxC;AAoCD,eAAO,MAAM,mBAAmB,GAAI,UAAU,oBAAoB,EAAE,KAAG,cAWtE,CAAC"}
@@ -0,0 +1,43 @@
1
+ // pm.counter — collection-runner stateful counter.
2
+ //
3
+ // Per-execution instance (no module-level state) so concurrent script runs
4
+ // can't interfere. The host threads `snapshot` through successive script
5
+ // executions: input.snapshot hydrates initial state; output.snapshot is
6
+ // emitted after the script completes and should be passed to the next run.
7
+ const hydrate = (store, snapshot) => {
8
+ store.clear();
9
+ for (const entry of snapshot) {
10
+ if (!Array.isArray(entry) || entry.length !== 2) {
11
+ continue;
12
+ }
13
+ const [key, value] = entry;
14
+ const normalizedKey = String(key ?? "").trim();
15
+ const normalizedValue = Number(value);
16
+ if (!normalizedKey || !Number.isFinite(normalizedValue)) {
17
+ continue;
18
+ }
19
+ store.set(normalizedKey, Math.trunc(normalizedValue));
20
+ }
21
+ };
22
+ const advance = (store, key, startAt) => {
23
+ const normalizedStartAt = Number.isFinite(startAt) ? Math.trunc(startAt) : 1;
24
+ if (!store.has(key)) {
25
+ store.set(key, normalizedStartAt);
26
+ return normalizedStartAt;
27
+ }
28
+ const next = (store.get(key) ?? normalizedStartAt) + 1;
29
+ store.set(key, next);
30
+ return next;
31
+ };
32
+ export const buildCounterFeature = (snapshot) => {
33
+ const store = new Map();
34
+ hydrate(store, snapshot);
35
+ return {
36
+ api: {
37
+ next: () => advance(store, "counter", 1),
38
+ start: (startAt = 1) => advance(store, `counter.start:${startAt}`, startAt),
39
+ },
40
+ snapshot: () => Array.from(store.entries()),
41
+ };
42
+ };
43
+ //# sourceMappingURL=counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counter.js","sourceRoot":"","sources":["../../../src/script/features/counter.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,wEAAwE;AACxE,2EAA2E;AAc3E,MAAM,OAAO,GAAG,CACd,KAA0B,EAC1B,QAAgC,EAC1B,EAAE;IACR,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;QAC3B,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACxD,SAAS;QACX,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CACd,KAA0B,EAC1B,GAAW,EACX,OAAe,EACP,EAAE;IACV,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAClC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAgC,EAAkB,EAAE;IACtF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEzB,OAAO;QACL,GAAG,EAAE;YACH,IAAI,EAAE,GAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAChD,KAAK,EAAE,CAAC,OAAO,GAAG,CAAC,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,OAAO,EAAE,EAAE,OAAO,CAAC;SACpF;QACD,QAAQ,EAAE,GAA2B,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;KACpE,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface CryptoJsApi {
2
+ enc: {
3
+ Utf8: {
4
+ parse: (input: unknown) => Uint8Array;
5
+ stringify: (input: unknown) => string;
6
+ };
7
+ Base64: {
8
+ stringify: (input: unknown) => string;
9
+ };
10
+ };
11
+ }
12
+ export declare const createCryptoJsApi: () => CryptoJsApi;
13
+ //# sourceMappingURL=cryptojs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cryptojs.d.ts","sourceRoot":"","sources":["../../../src/script/features/cryptojs.ts"],"names":[],"mappings":"AAqDA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE;QACH,IAAI,EAAE;YACJ,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,UAAU,CAAC;YACtC,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;SACvC,CAAC;QACF,MAAM,EAAE;YACN,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;SACvC,CAAC;KACH,CAAC;CACH;AAED,eAAO,MAAM,iBAAiB,QAAO,WAapC,CAAC"}
@@ -0,0 +1,63 @@
1
+ // CryptoJS — minimal collection-runner crypto helpers.
2
+ //
3
+ // Migrated from pmanfrontend/electron/script/runtime.ts. The original
4
+ // implementation used Node's `Buffer` for base64 encoding; the canonical
5
+ // sandbox blocks `Buffer` (security policy), so this rewrite uses an
6
+ // in-process btoa-equivalent that produces RFC 4648 standard output.
7
+ //
8
+ // Only the surface that user scripts actually consume is implemented:
9
+ // CryptoJS.enc.Utf8.parse(string) → Uint8Array
10
+ // CryptoJS.enc.Utf8.stringify(Uint8Array | ArrayBufferLike) → string
11
+ // CryptoJS.enc.Base64.stringify(Uint8Array | ArrayBufferLike) → string
12
+ //
13
+ // HMAC / SHA / AES are intentionally out of scope.
14
+ const BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
15
+ const toUint8Array = (input) => {
16
+ if (input instanceof Uint8Array) {
17
+ return input;
18
+ }
19
+ if (input instanceof ArrayBuffer) {
20
+ return new Uint8Array(input);
21
+ }
22
+ if (ArrayBuffer.isView(input)) {
23
+ const view = input;
24
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
25
+ }
26
+ if (typeof input === "string") {
27
+ return new TextEncoder().encode(input);
28
+ }
29
+ return new Uint8Array(0);
30
+ };
31
+ // Portable base64 encoder: walks the Uint8Array in 3-byte chunks and emits
32
+ // four characters per chunk per RFC 4648. No reliance on Buffer or btoa,
33
+ // so it works in vm contexts where neither is exposed.
34
+ const encodeBase64 = (bytes) => {
35
+ let output = "";
36
+ const length = bytes.length;
37
+ for (let index = 0; index < length; index += 3) {
38
+ const b0 = bytes[index];
39
+ const b1 = index + 1 < length ? bytes[index + 1] : 0;
40
+ const b2 = index + 2 < length ? bytes[index + 2] : 0;
41
+ const triplet = (b0 << 16) | (b1 << 8) | b2;
42
+ output += BASE64_CHARS[(triplet >> 18) & 0x3f];
43
+ output += BASE64_CHARS[(triplet >> 12) & 0x3f];
44
+ output += index + 1 < length ? BASE64_CHARS[(triplet >> 6) & 0x3f] : "=";
45
+ output += index + 2 < length ? BASE64_CHARS[triplet & 0x3f] : "=";
46
+ }
47
+ return output;
48
+ };
49
+ export const createCryptoJsApi = () => {
50
+ const decoder = new TextDecoder();
51
+ return {
52
+ enc: {
53
+ Utf8: {
54
+ parse: (input) => toUint8Array(input),
55
+ stringify: (input) => decoder.decode(toUint8Array(input)),
56
+ },
57
+ Base64: {
58
+ stringify: (input) => encodeBase64(toUint8Array(input)),
59
+ },
60
+ },
61
+ };
62
+ };
63
+ //# sourceMappingURL=cryptojs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cryptojs.js","sourceRoot":"","sources":["../../../src/script/features/cryptojs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { ScriptDbCapability } from "../types.js";
2
+ export interface DbSourceApi {
3
+ success: boolean;
4
+ error: string | null;
5
+ rowCount: number;
6
+ rows: unknown[];
7
+ firstRow: () => unknown;
8
+ }
9
+ export interface DbQueryResultApi extends DbSourceApi {
10
+ connectionId: string;
11
+ connectionName: string;
12
+ connectionType: string;
13
+ phase: "pre" | "post" | "manual";
14
+ query: string;
15
+ resolvedQuery: string;
16
+ durationMs: number;
17
+ executedAt: string;
18
+ }
19
+ export interface DbApi {
20
+ pre: DbSourceApi;
21
+ post: DbSourceApi;
22
+ query: (input: {
23
+ connectionId?: unknown;
24
+ query: unknown;
25
+ }) => Promise<DbQueryResultApi>;
26
+ }
27
+ export interface BuildDbApiInput {
28
+ capability: ScriptDbCapability | null | undefined;
29
+ enabled: boolean;
30
+ isInsideTestCallback: () => boolean;
31
+ responseTemplateRoot: unknown | null;
32
+ environment: Record<string, string>;
33
+ globals: Record<string, string>;
34
+ }
35
+ export declare const buildDbApi: (input: BuildDbApiInput) => DbApi;
36
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/script/features/db.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,kBAAkB,EAA2B,MAAM,aAAa,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,CAAC,KAAK,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACzF;AAyHD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,CAAC;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,MAAM,OAAO,CAAC;IAKpC,oBAAoB,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,eAAe,KAAG,KA2DnD,CAAC"}
@@ -0,0 +1,165 @@
1
+ // pm.db — collection-runner database integration.
2
+ //
3
+ // The DB driver itself (mongodb / oracledb / etc.) cannot live inside
4
+ // callman-core because that would pull a multi-megabyte native dependency
5
+ // into a runtime-agnostic package. Instead, the host (electron, future
6
+ // backend) injects the `execute` callback via capability config; this
7
+ // module wraps the result into the user-facing `pm.db` API.
8
+ //
9
+ // `pm.db.pre` and `pm.db.post` expose synchronously-injected results from
10
+ // pre/post-request DB query nodes (host runs them BEFORE the script).
11
+ // `pm.db.query()` is the user-callable async entry — it routes through
12
+ // the injected `execute` callback.
13
+ import { DisabledFeatureDependencyError } from "./feature-policy.js";
14
+ const wrapSourceResult = (result) => ({
15
+ success: result?.success ?? false,
16
+ error: result?.error ?? null,
17
+ rowCount: result?.rowCount ?? 0,
18
+ rows: Array.isArray(result?.rows) ? result.rows : [],
19
+ firstRow: () => Array.isArray(result?.rows) && result.rows.length > 0 ? result.rows[0] : null,
20
+ });
21
+ const wrapQueryResult = (result) => ({
22
+ ...wrapSourceResult(result),
23
+ connectionId: result.connectionId,
24
+ connectionName: result.connectionName,
25
+ connectionType: result.connectionType,
26
+ phase: result.phase,
27
+ query: result.query,
28
+ resolvedQuery: result.resolvedQuery,
29
+ durationMs: result.durationMs,
30
+ executedAt: result.executedAt,
31
+ });
32
+ const buildDisabledSource = (feature, isInsideTestCallback) => {
33
+ const guard = () => {
34
+ if (isInsideTestCallback()) {
35
+ throw new DisabledFeatureDependencyError(feature);
36
+ }
37
+ };
38
+ return {
39
+ get success() {
40
+ guard();
41
+ return false;
42
+ },
43
+ get error() {
44
+ guard();
45
+ return "Database execution is disabled for this collection runner.";
46
+ },
47
+ get rowCount() {
48
+ guard();
49
+ return 0;
50
+ },
51
+ get rows() {
52
+ guard();
53
+ return [];
54
+ },
55
+ firstRow: () => {
56
+ guard();
57
+ return null;
58
+ },
59
+ };
60
+ };
61
+ const buildDisabledQueryResult = (feature, isInsideTestCallback) => {
62
+ const guard = () => {
63
+ if (isInsideTestCallback()) {
64
+ throw new DisabledFeatureDependencyError(feature);
65
+ }
66
+ };
67
+ return {
68
+ get success() {
69
+ guard();
70
+ return false;
71
+ },
72
+ get error() {
73
+ guard();
74
+ return "Database execution is disabled for this collection runner.";
75
+ },
76
+ get rowCount() {
77
+ guard();
78
+ return 0;
79
+ },
80
+ get rows() {
81
+ guard();
82
+ return [];
83
+ },
84
+ firstRow: () => {
85
+ guard();
86
+ return null;
87
+ },
88
+ get connectionId() {
89
+ guard();
90
+ return "";
91
+ },
92
+ get connectionName() {
93
+ guard();
94
+ return "";
95
+ },
96
+ get connectionType() {
97
+ guard();
98
+ return "mongo";
99
+ },
100
+ get phase() {
101
+ guard();
102
+ return "manual";
103
+ },
104
+ get query() {
105
+ guard();
106
+ return "";
107
+ },
108
+ get resolvedQuery() {
109
+ guard();
110
+ return "";
111
+ },
112
+ get durationMs() {
113
+ guard();
114
+ return 0;
115
+ },
116
+ get executedAt() {
117
+ guard();
118
+ return new Date().toISOString();
119
+ },
120
+ };
121
+ };
122
+ export const buildDbApi = (input) => {
123
+ if (!input.enabled || !input.capability) {
124
+ const disabledSource = buildDisabledSource("database", input.isInsideTestCallback);
125
+ return {
126
+ pre: disabledSource,
127
+ post: disabledSource,
128
+ query: async () => buildDisabledQueryResult("database", input.isInsideTestCallback),
129
+ };
130
+ }
131
+ const cap = input.capability;
132
+ const config = cap.requestConfig;
133
+ return {
134
+ pre: wrapSourceResult(cap.preResult),
135
+ post: wrapSourceResult(cap.postResult),
136
+ query: async ({ connectionId, query, }) => {
137
+ const normalizedQuery = String(query ?? "").trim();
138
+ if (!normalizedQuery) {
139
+ throw new Error("pm.db.query requires a query");
140
+ }
141
+ const normalizedConnectionId = String(connectionId ?? "").trim() ||
142
+ config?.postResponse?.connectionId ||
143
+ config?.preRequest?.connectionId ||
144
+ "";
145
+ if (!normalizedConnectionId) {
146
+ throw new Error("pm.db.query requires a connectionId or a configured request database connection");
147
+ }
148
+ const result = await cap.execute({
149
+ connectionId: normalizedConnectionId,
150
+ query: normalizedQuery,
151
+ phase: "manual",
152
+ context: {
153
+ response: input.responseTemplateRoot,
154
+ env: { ...input.environment },
155
+ global: { ...input.globals },
156
+ },
157
+ });
158
+ if (!result.success) {
159
+ throw new Error(result.error ?? "Database query failed");
160
+ }
161
+ return wrapQueryResult(result);
162
+ },
163
+ };
164
+ };
165
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/script/features/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ScriptVariableMutation } from "../types.js";
2
+ export interface EnvironmentApi {
3
+ values: Record<string, string>;
4
+ get: (key: string) => string | undefined;
5
+ set: (key: string, value: unknown) => void;
6
+ unset: (key: string) => void;
7
+ has: (key: string) => boolean;
8
+ toObject: () => Record<string, string>;
9
+ }
10
+ export declare const buildEnvironmentApi: (initial: Record<string, string>, mutations: ScriptVariableMutation[] | null, scope: ScriptVariableMutation["scope"]) => EnvironmentApi;
11
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/script/features/environment.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACzC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9B,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AASD,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,sBAAsB,EAAE,GAAG,IAAI,EAC1C,OAAO,sBAAsB,CAAC,OAAO,CAAC,KACrC,cA8CF,CAAC"}