callman-core 1.0.5 → 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 (183) 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/scenario-runner/condition.d.ts.map +1 -1
  6. package/dist/scenario-runner/condition.js +10 -0
  7. package/dist/scenario-runner/condition.js.map +1 -1
  8. package/dist/scenario-runner/index.d.ts +1 -0
  9. package/dist/scenario-runner/index.d.ts.map +1 -1
  10. package/dist/scenario-runner/index.js +1 -0
  11. package/dist/scenario-runner/index.js.map +1 -1
  12. package/dist/scenario-runner/nodePolicy.d.ts +2 -2
  13. package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
  14. package/dist/scenario-runner/nodePolicy.js +8 -0
  15. package/dist/scenario-runner/nodePolicy.js.map +1 -1
  16. package/dist/scenario-runner/notification/index.d.ts +7 -0
  17. package/dist/scenario-runner/notification/index.d.ts.map +1 -0
  18. package/dist/scenario-runner/notification/index.js +14 -0
  19. package/dist/scenario-runner/notification/index.js.map +1 -0
  20. package/dist/scenario-runner/notification/providers/provider.interface.d.ts +20 -0
  21. package/dist/scenario-runner/notification/providers/provider.interface.d.ts.map +1 -0
  22. package/dist/scenario-runner/notification/providers/provider.interface.js +2 -0
  23. package/dist/scenario-runner/notification/providers/provider.interface.js.map +1 -0
  24. package/dist/scenario-runner/notification/providers/slack.provider.d.ts +3 -0
  25. package/dist/scenario-runner/notification/providers/slack.provider.d.ts.map +1 -0
  26. package/dist/scenario-runner/notification/providers/slack.provider.js +85 -0
  27. package/dist/scenario-runner/notification/providers/slack.provider.js.map +1 -0
  28. package/dist/scenario-runner/notification/template.d.ts +2 -0
  29. package/dist/scenario-runner/notification/template.d.ts.map +1 -0
  30. package/dist/scenario-runner/notification/template.js +9 -0
  31. package/dist/scenario-runner/notification/template.js.map +1 -0
  32. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  33. package/dist/scenario-runner/runScenario.js +80 -4
  34. package/dist/scenario-runner/runScenario.js.map +1 -1
  35. package/dist/scenario-runner/types.d.ts +49 -3
  36. package/dist/scenario-runner/types.d.ts.map +1 -1
  37. package/dist/script/errors.d.ts +3 -0
  38. package/dist/script/errors.d.ts.map +1 -0
  39. package/dist/script/errors.js +68 -0
  40. package/dist/script/errors.js.map +1 -0
  41. package/dist/script/executor.d.ts +5 -0
  42. package/dist/script/executor.d.ts.map +1 -0
  43. package/dist/script/executor.js +192 -0
  44. package/dist/script/executor.js.map +1 -0
  45. package/dist/script/features/assertions.d.ts +46 -0
  46. package/dist/script/features/assertions.d.ts.map +1 -0
  47. package/dist/script/features/assertions.js +264 -0
  48. package/dist/script/features/assertions.js.map +1 -0
  49. package/dist/script/features/environment.d.ts +11 -0
  50. package/dist/script/features/environment.d.ts.map +1 -0
  51. package/dist/script/features/environment.js +61 -0
  52. package/dist/script/features/environment.js.map +1 -0
  53. package/dist/script/features/log.d.ts +15 -0
  54. package/dist/script/features/log.d.ts.map +1 -0
  55. package/dist/script/features/log.js +59 -0
  56. package/dist/script/features/log.js.map +1 -0
  57. package/dist/script/features/node.d.ts +14 -0
  58. package/dist/script/features/node.d.ts.map +1 -0
  59. package/dist/script/features/node.js +82 -0
  60. package/dist/script/features/node.js.map +1 -0
  61. package/dist/script/features/request.d.ts +23 -0
  62. package/dist/script/features/request.d.ts.map +1 -0
  63. package/dist/script/features/request.js +105 -0
  64. package/dist/script/features/request.js.map +1 -0
  65. package/dist/script/features/response.d.ts +25 -0
  66. package/dist/script/features/response.d.ts.map +1 -0
  67. package/dist/script/features/response.js +43 -0
  68. package/dist/script/features/response.js.map +1 -0
  69. package/dist/script/features/tests.d.ts +9 -0
  70. package/dist/script/features/tests.d.ts.map +1 -0
  71. package/dist/script/features/tests.js +62 -0
  72. package/dist/script/features/tests.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 +16 -0
  82. package/dist/script/scope.d.ts.map +1 -0
  83. package/dist/script/scope.js +151 -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 +94 -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 +41 -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 +197 -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/environment.js +65 -0
  145. package/dist-cjs/script/features/environment.js.map +1 -0
  146. package/dist-cjs/script/features/log.js +64 -0
  147. package/dist-cjs/script/features/log.js.map +1 -0
  148. package/dist-cjs/script/features/node.js +89 -0
  149. package/dist-cjs/script/features/node.js.map +1 -0
  150. package/dist-cjs/script/features/request.js +109 -0
  151. package/dist-cjs/script/features/request.js.map +1 -0
  152. package/dist-cjs/script/features/response.js +47 -0
  153. package/dist-cjs/script/features/response.js.map +1 -0
  154. package/dist-cjs/script/features/tests.js +66 -0
  155. package/dist-cjs/script/features/tests.js.map +1 -0
  156. package/dist-cjs/script/legacy.js +132 -0
  157. package/dist-cjs/script/legacy.js.map +1 -0
  158. package/dist-cjs/script/pmApi.js +353 -0
  159. package/dist-cjs/script/pmApi.js.map +1 -0
  160. package/dist-cjs/script/sandbox.js +91 -0
  161. package/dist-cjs/script/sandbox.js.map +1 -0
  162. package/dist-cjs/script/scope.js +156 -0
  163. package/dist-cjs/script/scope.js.map +1 -0
  164. package/dist-cjs/script/scriptEngine.js +12 -0
  165. package/dist-cjs/script/scriptEngine.js.map +1 -0
  166. package/dist-cjs/script/timeout.js +43 -0
  167. package/dist-cjs/script/timeout.js.map +1 -0
  168. package/dist-cjs/script/types.js +8 -0
  169. package/dist-cjs/script/types.js.map +1 -0
  170. package/dist-cjs/types/index.js +3 -0
  171. package/dist-cjs/types/index.js.map +1 -0
  172. package/dist-cjs/utils/get.js +52 -0
  173. package/dist-cjs/utils/get.js.map +1 -0
  174. package/dist-cjs/utils/random.js +87 -0
  175. package/dist-cjs/utils/random.js.map +1 -0
  176. package/dist-cjs/variables/envStore.js +24 -0
  177. package/dist-cjs/variables/envStore.js.map +1 -0
  178. package/dist-cjs/variables/resolver.js +95 -0
  179. package/dist-cjs/variables/resolver.js.map +1 -0
  180. package/package.json +19 -3
  181. package/samples/runSample.mjs +0 -128
  182. package/tests/waitNode.test.mjs +0 -311
  183. package/tsconfig.json +0 -18
@@ -0,0 +1,105 @@
1
+ // pm.request — read + mutate request state for pre-request and tests stages.
2
+ //
3
+ // The API mirrors the backend's surface: getHeader/setHeader/unsetHeader,
4
+ // getQueryParam/setQueryParam/unsetQueryParam, setMethod/setUrl/setRawBody.
5
+ // Mutations are applied to a working copy; callers retrieve the final
6
+ // state via `toRequestState()` after the script completes.
7
+ const cloneBody = (body) => ({
8
+ mode: body.mode,
9
+ raw: body.raw,
10
+ formEntries: body.formEntries.map((entry) => ({ ...entry })),
11
+ });
12
+ const toRecord = (entries) => {
13
+ const record = {};
14
+ for (const entry of entries) {
15
+ if (entry.enabled === false) {
16
+ continue;
17
+ }
18
+ const key = entry.key.trim();
19
+ if (!key) {
20
+ continue;
21
+ }
22
+ record[key] = entry.value;
23
+ }
24
+ return record;
25
+ };
26
+ const toEntries = (record) => Object.entries(record).map(([key, value]) => ({
27
+ key,
28
+ value,
29
+ enabled: true,
30
+ }));
31
+ const stringifyHeaderValue = (value) => {
32
+ if (value === undefined || value === null) {
33
+ return "";
34
+ }
35
+ return String(value);
36
+ };
37
+ export const buildRequestApi = (request) => {
38
+ const headers = toRecord(request.headers);
39
+ const query = toRecord(request.query);
40
+ const body = cloneBody(request.body);
41
+ const api = {
42
+ method: request.method,
43
+ url: request.url,
44
+ headers,
45
+ query,
46
+ body,
47
+ getHeader: (key) => headers[String(key ?? "").trim()],
48
+ setHeader: (key, value) => {
49
+ const normalizedKey = String(key ?? "").trim();
50
+ if (!normalizedKey) {
51
+ return;
52
+ }
53
+ headers[normalizedKey] = stringifyHeaderValue(value);
54
+ },
55
+ unsetHeader: (key) => {
56
+ const normalizedKey = String(key ?? "").trim();
57
+ if (!normalizedKey) {
58
+ return;
59
+ }
60
+ delete headers[normalizedKey];
61
+ },
62
+ getQueryParam: (key) => query[String(key ?? "").trim()],
63
+ setQueryParam: (key, value) => {
64
+ const normalizedKey = String(key ?? "").trim();
65
+ if (!normalizedKey) {
66
+ return;
67
+ }
68
+ query[normalizedKey] = stringifyHeaderValue(value);
69
+ },
70
+ unsetQueryParam: (key) => {
71
+ const normalizedKey = String(key ?? "").trim();
72
+ if (!normalizedKey) {
73
+ return;
74
+ }
75
+ delete query[normalizedKey];
76
+ },
77
+ setMethod(nextMethod) {
78
+ const normalizedValue = String(nextMethod ?? "")
79
+ .trim()
80
+ .toUpperCase();
81
+ if (normalizedValue) {
82
+ this.method = normalizedValue;
83
+ }
84
+ },
85
+ setUrl(nextUrl) {
86
+ this.url = String(nextUrl ?? "");
87
+ },
88
+ setRawBody(value) {
89
+ this.body.mode = "raw";
90
+ this.body.raw = value === undefined || value === null ? "" : String(value);
91
+ this.body.formEntries = [];
92
+ },
93
+ };
94
+ return {
95
+ api,
96
+ toRequestState: () => ({
97
+ method: api.method,
98
+ url: api.url,
99
+ headers: toEntries(api.headers),
100
+ query: toEntries(api.query),
101
+ body: cloneBody(api.body),
102
+ }),
103
+ };
104
+ };
105
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/script/features/request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { PmAssertion } from "./assertions.js";
2
+ import type { ScriptResponseState } from "../types.js";
3
+ export interface ResponseApi {
4
+ ok: boolean;
5
+ status: number;
6
+ code: number;
7
+ statusText: string;
8
+ headers: Record<string, string>;
9
+ data: unknown;
10
+ body: unknown;
11
+ rawBody: string;
12
+ raw: string;
13
+ contentType: string;
14
+ durationMs: number;
15
+ responseTime: number;
16
+ sizeBytes: number;
17
+ cookies: string[];
18
+ json: () => unknown;
19
+ text: () => string;
20
+ to?: PmAssertion;
21
+ be?: PmAssertion;
22
+ have?: PmAssertion;
23
+ }
24
+ export declare const buildResponseApi: (response: ScriptResponseState | null) => ResponseApi | null;
25
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/script/features/response.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIhC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,GAAI,UAAU,mBAAmB,GAAG,IAAI,KAAG,WAAW,GAAG,IAqCrF,CAAC"}
@@ -0,0 +1,43 @@
1
+ // pm.response — read-only view of the captured response, plus the classic
2
+ // Postman fluent assertion entry points (.to / .be / .have).
3
+ //
4
+ // We return a plain object with the assertion getters spliced on so user
5
+ // scripts can write `pm.response.to.have.status(200)` exactly like Postman.
6
+ // The PmAssertion is a fresh instance bound to the response itself so the
7
+ // chain can drill into headers / status / body via .property() etc.
8
+ import { PmAssertion } from "./assertions.js";
9
+ export const buildResponseApi = (response) => {
10
+ if (!response) {
11
+ return null;
12
+ }
13
+ // Legacy callman-core stored the parsed body under `data`. Newer
14
+ // scenario-runner uses `body` (parsed) + `rawBody` (string). Pick whichever
15
+ // upstream gave us, preferring the parsed JSON body when available.
16
+ const parsedBody = response.jsonBody ?? response.body;
17
+ const api = {
18
+ ok: response.ok,
19
+ status: response.status,
20
+ code: response.status,
21
+ statusText: response.statusText,
22
+ headers: response.headers,
23
+ data: parsedBody,
24
+ body: parsedBody,
25
+ rawBody: response.rawBody,
26
+ raw: response.rawBody,
27
+ contentType: response.contentType,
28
+ durationMs: response.durationMs,
29
+ responseTime: response.durationMs,
30
+ sizeBytes: response.sizeBytes,
31
+ cookies: [...response.cookies],
32
+ json: () => response.jsonBody,
33
+ text: () => response.rawBody,
34
+ };
35
+ // Splice fluent assertion getters onto the same object so chains like
36
+ // `pm.response.to.have.status(200)` work without a helper wrapper.
37
+ const assertion = new PmAssertion(api);
38
+ api.to = assertion;
39
+ api.be = assertion;
40
+ api.have = assertion;
41
+ return api;
42
+ };
43
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/script/features/response.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6DAA6D;AAC7D,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAC5E,0EAA0E;AAC1E,oEAAoE;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA4B9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAoC,EAAsB,EAAE;IAC3F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iEAAiE;IACjE,4EAA4E;IAC5E,oEAAoE;IACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC;IAEtD,MAAM,GAAG,GAAgB;QACvB,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,IAAI,EAAE,QAAQ,CAAC,MAAM;QACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,GAAG,EAAE,QAAQ,CAAC,OAAO;QACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,YAAY,EAAE,QAAQ,CAAC,UAAU;QACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ;QAC7B,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO;KAC7B,CAAC;IAEF,sEAAsE;IACtE,mEAAmE;IACnE,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IACnB,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;IACnB,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;IAErB,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ScriptStage, ScriptTestResult } from "../types.js";
2
+ export interface TestCollector {
3
+ test: (name: string, fn: ((() => unknown | Promise<unknown>) | undefined)) => Promise<void>;
4
+ skip: (name: string, reason?: string) => void;
5
+ testResults: ScriptTestResult[];
6
+ flush: () => Promise<void>;
7
+ }
8
+ export declare const buildTestCollector: (_stage: ScriptStage) => TestCollector;
9
+ //# sourceMappingURL=tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../../src/script/features/tests.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqBjE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,KACjD,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAOD,eAAO,MAAM,kBAAkB,GAAI,QAAQ,WAAW,KAAG,aAyCxD,CAAC"}
@@ -0,0 +1,62 @@
1
+ // pm.test collector — runs each callback as a fire-and-forget Promise that
2
+ // resolves to PASS/FAIL/SKIP and surfaces the result via `flush()`.
3
+ //
4
+ // The collector is shared by the script's `pm.test` and the script-level
5
+ // SKIP path. Errors thrown synchronously inside the callback or rejected
6
+ // from an async callback land in the FAIL branch with the error message.
7
+ // Errors thrown inside the vm context cross a realm boundary, which means
8
+ // `error instanceof Error` from the host's perspective is FALSE even when
9
+ // the value has a real .message property. Read the message structurally
10
+ // to keep the recorded text identical to what user scripts see.
11
+ const extractErrorMessage = (error) => {
12
+ if (error instanceof Error) {
13
+ return error.message;
14
+ }
15
+ if (error &&
16
+ typeof error === "object" &&
17
+ "message" in error &&
18
+ typeof error.message === "string") {
19
+ return error.message;
20
+ }
21
+ return String(error);
22
+ };
23
+ const normalizeName = (name) => {
24
+ const trimmed = String(name ?? "").trim();
25
+ return trimmed || "Unnamed test";
26
+ };
27
+ export const buildTestCollector = (_stage) => {
28
+ const testResults = [];
29
+ const pending = [];
30
+ const test = (name, fn) => {
31
+ const normalizedName = normalizeName(name);
32
+ const task = Promise.resolve()
33
+ .then(async () => {
34
+ if (typeof fn !== "function") {
35
+ throw new Error("pm.test requires a callback function");
36
+ }
37
+ await fn();
38
+ testResults.push({ name: normalizedName, status: "PASS" });
39
+ })
40
+ .catch((error) => {
41
+ testResults.push({
42
+ name: normalizedName,
43
+ status: "FAIL",
44
+ error: extractErrorMessage(error),
45
+ });
46
+ });
47
+ pending.push(task);
48
+ return task;
49
+ };
50
+ const skip = (name, reason) => {
51
+ testResults.push({
52
+ name: normalizeName(name),
53
+ status: "SKIP",
54
+ ...(reason ? { error: reason } : {}),
55
+ });
56
+ };
57
+ const flush = async () => {
58
+ await Promise.allSettled(pending);
59
+ };
60
+ return { test, skip, testResults, flush };
61
+ };
62
+ //# sourceMappingURL=tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests.js","sourceRoot":"","sources":["../../../src/script/features/tests.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,oEAAoE;AACpE,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,yEAAyE;AAIzE,0EAA0E;AAC1E,0EAA0E;AAC1E,wEAAwE;AACxE,gEAAgE;AAChE,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAU,EAAE;IACrD,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;AAYF,MAAM,aAAa,GAAG,CAAC,IAAa,EAAU,EAAE;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,OAAO,IAAI,cAAc,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAmB,EAAiB,EAAE;IACvE,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,MAAM,IAAI,GAAG,CACX,IAAY,EACZ,EAAoD,EACrC,EAAE;QACjB,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE;aAC3B,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,EAAE,EAAE,CAAC;YACX,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC;aAClC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACL,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,MAAe,EAAQ,EAAE;QACnD,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;YACzB,MAAM,EAAE,MAAM;YACd,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ScriptRunContext, TestResult } from "../types/index.js";
2
+ export type { ScriptRunContext };
3
+ export declare const runScript: (script: string | undefined, context: ScriptRunContext) => Promise<TestResult[]>;
4
+ //# sourceMappingURL=legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/script/legacy.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAGV,gBAAgB,EAChB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAS3B,YAAY,EAAE,gBAAgB,EAAE,CAAC;AA0FjC,eAAO,MAAM,SAAS,GACpB,QAAQ,MAAM,GAAG,SAAS,EAC1B,SAAS,gBAAgB,KACxB,OAAO,CAAC,UAAU,EAAE,CA0CtB,CAAC"}
@@ -0,0 +1,128 @@
1
+ // Legacy `runScript` shim — preserves the pre-1.1.0 contract used by
2
+ // callman-core's own `runner/requestRunner.ts` and external CLI consumers.
3
+ //
4
+ // Differences from the canonical `executeScript`:
5
+ // - signature: (script, context) → Promise<TestResult[]>
6
+ // - mutations are applied in-place to the supplied EnvStore
7
+ // - test results map to the legacy `{name, status, message?}` shape
8
+ // (no SKIP — sandbox A never emitted SKIP and we don't introduce one
9
+ // on the legacy path even though the canonical core supports it)
10
+ // - empty/whitespace script → []
11
+ // - top-level throws produce a single FAIL named "Script execution"
12
+ //
13
+ // New code should call `executeScript` directly. This shim exists so
14
+ // callme-cli and `runRequest` keep working without any source changes.
15
+ import { executeScript } from "./executor.js";
16
+ const toEntries = (record) => Object.entries(record ?? {}).map(([key, value]) => ({
17
+ key,
18
+ value: String(value ?? ""),
19
+ enabled: true,
20
+ }));
21
+ const toRequestState = (request) => {
22
+ if (!request) {
23
+ return undefined;
24
+ }
25
+ const bodyValue = request.body;
26
+ const isString = typeof bodyValue === "string";
27
+ return {
28
+ method: String(request.method ?? "GET").toUpperCase(),
29
+ url: String(request.url ?? ""),
30
+ headers: toEntries(request.headers),
31
+ query: toEntries(request.query),
32
+ body: {
33
+ mode: isString ? "raw" : bodyValue ? "raw" : "none",
34
+ raw: isString
35
+ ? bodyValue
36
+ : bodyValue
37
+ ? safeJsonStringify(bodyValue)
38
+ : "",
39
+ formEntries: [],
40
+ },
41
+ };
42
+ };
43
+ const safeJsonStringify = (value) => {
44
+ try {
45
+ return JSON.stringify(value);
46
+ }
47
+ catch {
48
+ return String(value);
49
+ }
50
+ };
51
+ const toResponseState = (response) => {
52
+ if (!response) {
53
+ return undefined;
54
+ }
55
+ const headers = response.headers ?? {};
56
+ const data = response.data;
57
+ const isStringBody = typeof data === "string";
58
+ const rawBody = isStringBody ? data : safeJsonStringify(data);
59
+ const contentType = Object.entries(headers).find(([key]) => key.toLowerCase() === "content-type")?.[1] ?? "";
60
+ const cookies = Object.entries(headers)
61
+ .filter(([key]) => key.toLowerCase() === "set-cookie")
62
+ .map(([, value]) => String(value));
63
+ return {
64
+ ok: response.status >= 200 && response.status < 400,
65
+ status: response.status,
66
+ statusText: "",
67
+ headers: headers,
68
+ body: data,
69
+ jsonBody: typeof data === "object" ? data : null,
70
+ rawBody,
71
+ contentType,
72
+ durationMs: response.duration ?? 0,
73
+ sizeBytes: rawBody.length,
74
+ cookies,
75
+ };
76
+ };
77
+ const toLegacyTestResult = (result) => {
78
+ if (result.status === "SKIP") {
79
+ return {
80
+ name: result.name,
81
+ status: "FAIL",
82
+ message: result.error ?? "Skipped",
83
+ };
84
+ }
85
+ return {
86
+ name: result.name,
87
+ status: result.status,
88
+ ...(result.error ? { message: result.error } : {}),
89
+ };
90
+ };
91
+ export const runScript = async (script, context) => {
92
+ if (!script?.trim()) {
93
+ return [];
94
+ }
95
+ const initialEnv = {};
96
+ for (const [key, value] of Object.entries(context.env.all())) {
97
+ initialEnv[key] = value === undefined || value === null ? "" : String(value);
98
+ }
99
+ const result = await executeScript({
100
+ script,
101
+ capabilities: {
102
+ environment: { values: initialEnv, emitMutations: true },
103
+ request: toRequestState(context.request),
104
+ response: toResponseState(context.response),
105
+ },
106
+ });
107
+ // Apply mutations to the caller's EnvStore so callers that read it
108
+ // after `runScript` returns see the changes (sandbox A semantics).
109
+ for (const mutation of result.variableMutations) {
110
+ if (mutation.scope !== "environment") {
111
+ continue;
112
+ }
113
+ if (mutation.type === "set") {
114
+ context.env.set(mutation.key, mutation.value ?? "");
115
+ }
116
+ // Legacy EnvStore has no `unset` — nothing to do for that branch.
117
+ }
118
+ const testResults = result.testResults.map(toLegacyTestResult);
119
+ if (result.error) {
120
+ testResults.push({
121
+ name: "Script execution",
122
+ status: "FAIL",
123
+ message: result.error.message,
124
+ });
125
+ }
126
+ return testResults;
127
+ };
128
+ //# sourceMappingURL=legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/script/legacy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import * as vm from "node:vm";
2
+ import type { ScopeBindings } from "./scope.js";
3
+ export declare const SCRIPT_LINE_OFFSET = -2;
4
+ export declare const wrapScriptSource: (script: string) => string;
5
+ export interface CompiledSandboxScript {
6
+ vmScript: vm.Script;
7
+ scope: Record<string, unknown>;
8
+ vmContext: vm.Context;
9
+ }
10
+ export declare const compileScript: (script: string, filename: string) => vm.Script;
11
+ export declare const createSandbox: (bindings: ScopeBindings, filename: string) => {
12
+ scope: Record<string, unknown>;
13
+ vmContext: vm.Context;
14
+ };
15
+ export declare const compileAndPrepare: (script: string, bindings: ScopeBindings, filename: string) => CompiledSandboxScript;
16
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/script/sandbox.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,MAOpC,CAAC;AAEf,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,EAAE,CAAC,MAIhE,CAAC;AAEL,eAAO,MAAM,aAAa,GACxB,UAAU,aAAa,EACvB,UAAU,MAAM,KACf;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAA;CA0BzD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,EACd,UAAU,aAAa,EACvB,UAAU,MAAM,KACf,qBAIF,CAAC"}
@@ -0,0 +1,51 @@
1
+ // vm-based sandbox for the canonical script executor.
2
+ //
3
+ // Compiles the user's script wrapped in an async IIFE + `with(scope)` block,
4
+ // then runs it inside a vm.createContext with codeGeneration disabled to
5
+ // neutralize `eval` / `new Function(...)` attempts. NOTE: Node's `vm` module
6
+ // is explicitly *not* a security boundary — this provides isolation against
7
+ // accidental cross-contamination, not against hostile scripts. A future
8
+ // `isolated-vm` migration should be tracked separately.
9
+ import * as vm from "node:vm";
10
+ import { buildScopeTarget, createScopeProxy } from "./scope.js";
11
+ export const SCRIPT_LINE_OFFSET = -2;
12
+ export const wrapScriptSource = (script) => [
13
+ "(async function () {",
14
+ "with (scope) {",
15
+ script,
16
+ "}",
17
+ "}).call(context)",
18
+ ].join("\n");
19
+ export const compileScript = (script, filename) => new vm.Script(wrapScriptSource(script), {
20
+ filename,
21
+ lineOffset: SCRIPT_LINE_OFFSET,
22
+ });
23
+ export const createSandbox = (bindings, filename) => {
24
+ const scopeTarget = buildScopeTarget(bindings);
25
+ const scope = createScopeProxy(scopeTarget);
26
+ // NOTE: We deliberately omit `microtaskMode: "afterEvaluate"` here. With
27
+ // that mode, microtasks scheduled inside the vm context are drained once
28
+ // (right after the synchronous portion of the script completes) but not
29
+ // again. That breaks fire-and-forget `pm.test(async () => {...})` because
30
+ // the host-side `tests.flush()` then awaits a Promise whose continuation
31
+ // is parked on a microtask queue that no one is draining. Backend and
32
+ // electron sandboxes both used afterEvaluate and would have hit the same
33
+ // bug; keeping it off here is the right canonical default.
34
+ const vmContext = vm.createContext({
35
+ scope,
36
+ context: Object.create(null),
37
+ }, {
38
+ name: filename,
39
+ codeGeneration: {
40
+ strings: false,
41
+ wasm: false,
42
+ },
43
+ });
44
+ return { scope, vmContext };
45
+ };
46
+ export const compileAndPrepare = (script, bindings, filename) => {
47
+ const { scope, vmContext } = createSandbox(bindings, filename);
48
+ const vmScript = compileScript(script, filename);
49
+ return { vmScript, scope, vmContext };
50
+ };
51
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/script/sandbox.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,6EAA6E;AAC7E,4EAA4E;AAC5E,wEAAwE;AACxE,wDAAwD;AAExD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,CAAC;AAErC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAU,EAAE,CACzD;IACE,sBAAsB;IACtB,gBAAgB;IAChB,MAAM;IACN,GAAG;IACH,kBAAkB;CACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAQf,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAa,EAAE,CAC3E,IAAI,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE;IACtC,QAAQ;IACR,UAAU,EAAE,kBAAkB;CAC/B,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,QAAuB,EACvB,QAAgB,EAC2C,EAAE;IAC7D,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC5C,yEAAyE;IACzE,yEAAyE;IACzE,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,sEAAsE;IACtE,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,SAAS,GAAG,EAAE,CAAC,aAAa,CAChC;QACE,KAAK;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;KAC7B,EACD;QACE,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE;YACd,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,KAAK;SACZ;KACF,CACF,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAc,EACd,QAAuB,EACvB,QAAgB,EACO,EAAE;IACzB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare const RESERVED_LABEL_NAMES: Set<string>;
2
+ export declare const VALID_LABEL_IDENTIFIER_PATTERN: RegExp;
3
+ export interface ScopeBindings {
4
+ pm: Record<string, unknown>;
5
+ env?: Record<string, string>;
6
+ environment?: unknown;
7
+ request?: unknown;
8
+ response?: unknown;
9
+ test?: unknown;
10
+ expect?: unknown;
11
+ console?: Record<string, (...args: unknown[]) => void>;
12
+ labelGlobals?: Record<string, unknown>;
13
+ }
14
+ export declare const buildScopeTarget: (bindings: ScopeBindings) => Record<string, unknown>;
15
+ export declare const createScopeProxy: (target: Record<string, unknown>) => Record<string, unknown>;
16
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/script/scope.ts"],"names":[],"mappings":"AAiFA,eAAO,MAAM,oBAAoB,aAgB/B,CAAC;AAEH,eAAO,MAAM,8BAA8B,QAAuB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAE5B,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAM5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;IAGvD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,gBAAgB,GAAI,UAAU,aAAa,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAuChF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAiBrF,CAAC"}