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,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 { 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"}
@@ -0,0 +1,61 @@
1
+ // pm.environment / pm.globals — variable-scoped key/value API.
2
+ //
3
+ // Two operating modes:
4
+ // - emitMutations=true: every set/unset is recorded into the shared
5
+ // mutation log. Callers (backend/electron scenario runner) replay this
6
+ // log onto persistent state outside the sandbox.
7
+ // - emitMutations=false: the API mutates the in-memory `values` record
8
+ // directly without producing a log. Used by callman-core's legacy
9
+ // `runScript` shim where EnvStore is the source of truth.
10
+ const coerceToString = (value) => {
11
+ if (value === undefined || value === null) {
12
+ return "";
13
+ }
14
+ return String(value);
15
+ };
16
+ export const buildEnvironmentApi = (initial, mutations, scope) => {
17
+ // Copy so the caller's record is never mutated in-place when the
18
+ // sandbox is configured to emit mutations.
19
+ const values = { ...initial };
20
+ const recordMutation = (mutation) => {
21
+ if (mutations) {
22
+ mutations.push(mutation);
23
+ }
24
+ };
25
+ return {
26
+ values,
27
+ get: (key) => values[String(key ?? "").trim()],
28
+ set: (key, value) => {
29
+ const normalizedKey = String(key ?? "").trim();
30
+ if (!normalizedKey) {
31
+ return;
32
+ }
33
+ const normalizedValue = coerceToString(value);
34
+ values[normalizedKey] = normalizedValue;
35
+ recordMutation({
36
+ scope,
37
+ type: "set",
38
+ key: normalizedKey,
39
+ value: normalizedValue,
40
+ });
41
+ },
42
+ unset: (key) => {
43
+ const normalizedKey = String(key ?? "").trim();
44
+ if (!normalizedKey || !(normalizedKey in values)) {
45
+ return;
46
+ }
47
+ delete values[normalizedKey];
48
+ recordMutation({
49
+ scope,
50
+ type: "unset",
51
+ key: normalizedKey,
52
+ });
53
+ },
54
+ has: (key) => {
55
+ const normalizedKey = String(key ?? "").trim();
56
+ return Boolean(normalizedKey) && normalizedKey in values;
57
+ },
58
+ toObject: () => ({ ...values }),
59
+ };
60
+ };
61
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/script/features/environment.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,uBAAuB;AACvB,sEAAsE;AACtE,2EAA2E;AAC3E,qDAAqD;AACrD,yEAAyE;AACzE,sEAAsE;AACtE,8DAA8D;AAa9D,MAAM,cAAc,GAAG,CAAC,KAAc,EAAU,EAAE;IAChD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAA+B,EAC/B,SAA0C,EAC1C,KAAsC,EACtB,EAAE;IAClB,iEAAiE;IACjE,2CAA2C;IAC3C,MAAM,MAAM,GAA2B,EAAE,GAAG,OAAO,EAAE,CAAC;IAEtD,MAAM,cAAc,GAAG,CAAC,QAAgC,EAAQ,EAAE;QAChE,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,MAAM;QACN,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,GAAG,EAAE,CAAC,GAAW,EAAE,KAAc,EAAE,EAAE;YACnC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,aAAa,CAAC,GAAG,eAAe,CAAC;YACxC,cAAc,CAAC;gBACb,KAAK;gBACL,IAAI,EAAE,KAAK;gBACX,GAAG,EAAE,aAAa;gBAClB,KAAK,EAAE,eAAe;aACvB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE;YACrB,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,EAAE,CAAC;gBACjD,OAAO;YACT,CAAC;YACD,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC;YAC7B,cAAc,CAAC;gBACb,KAAK;gBACL,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,aAAa;aACnB,CAAC,CAAC;QACL,CAAC;QACD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE;YACnB,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,IAAI,MAAM,CAAC;QAC3D,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;KAChC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ScriptLogEntry } from "../types.js";
2
+ export interface LogCollector {
3
+ pmLog: (...args: unknown[]) => void;
4
+ consoleApi: {
5
+ log: (...args: unknown[]) => void;
6
+ info: (...args: unknown[]) => void;
7
+ warn: (...args: unknown[]) => void;
8
+ error: (...args: unknown[]) => void;
9
+ debug: (...args: unknown[]) => void;
10
+ };
11
+ logs: ScriptLogEntry[];
12
+ }
13
+ export declare const createLogCollector: () => LogCollector;
14
+ export declare const createSilentLogCollector: () => LogCollector;
15
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../src/script/features/log.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAsBlD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE;QACV,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QAClC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QACnC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QACpC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;KACrC,CAAC;IACF,IAAI,EAAE,cAAc,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,kBAAkB,QAAO,YAqBrC,CAAC;AAKF,eAAO,MAAM,wBAAwB,QAAO,YAU1C,CAAC"}
@@ -0,0 +1,59 @@
1
+ // Log collector for pm.log + console.{log,info,warn,error,debug}.
2
+ // Captures user-script output as structured entries so callers can render
3
+ // them in scenario UIs / CLI reports without granting the script real
4
+ // access to the host's stdio.
5
+ const stringifyArgument = (value) => {
6
+ if (typeof value === "string") {
7
+ return value;
8
+ }
9
+ if (typeof value === "number" || typeof value === "boolean" || value === null) {
10
+ return String(value);
11
+ }
12
+ if (typeof value === "undefined") {
13
+ return "undefined";
14
+ }
15
+ if (value instanceof Error) {
16
+ return value.stack ?? value.message;
17
+ }
18
+ try {
19
+ return JSON.stringify(value, null, 2);
20
+ }
21
+ catch {
22
+ return String(value);
23
+ }
24
+ };
25
+ export const createLogCollector = () => {
26
+ const logs = [];
27
+ const append = (level, args) => {
28
+ logs.push({
29
+ level,
30
+ message: args.map((entry) => stringifyArgument(entry)).join(" "),
31
+ });
32
+ };
33
+ return {
34
+ pmLog: (...args) => append("log", args),
35
+ consoleApi: {
36
+ log: (...args) => append("log", args),
37
+ info: (...args) => append("info", args),
38
+ warn: (...args) => append("warn", args),
39
+ error: (...args) => append("error", args),
40
+ debug: (...args) => append("debug", args),
41
+ },
42
+ logs,
43
+ };
44
+ };
45
+ // Silent collector — used when the caller did not enable the `log` extension.
46
+ // pm.log and console.* still need to exist on the scope (so user scripts
47
+ // don't throw ReferenceError); they just become no-ops with no output.
48
+ export const createSilentLogCollector = () => ({
49
+ pmLog: () => undefined,
50
+ consoleApi: {
51
+ log: () => undefined,
52
+ info: () => undefined,
53
+ warn: () => undefined,
54
+ error: () => undefined,
55
+ debug: () => undefined,
56
+ },
57
+ logs: [],
58
+ });
59
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/script/features/log.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,0EAA0E;AAC1E,sEAAsE;AACtE,8BAA8B;AAI9B,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAU,EAAE;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9E,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;IACtC,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC;AAcF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAiB,EAAE;IACnD,MAAM,IAAI,GAAqB,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,CAAC,KAA8B,EAAE,IAAe,EAAQ,EAAE;QACvE,IAAI,CAAC,IAAI,CAAC;YACR,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACjE,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;QAClD,UAAU,EAAE;YACV,GAAG,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;YAChD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;YAClD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;YAClD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;YACpD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;SACrD;QACD,IAAI;KACL,CAAC;AACJ,CAAC,CAAC;AAEF,8EAA8E;AAC9E,yEAAyE;AACzE,uEAAuE;AACvE,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAiB,EAAE,CAAC,CAAC;IAC3D,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;IACtB,UAAU,EAAE;QACV,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;QACpB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;QACrB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;QACrB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;QACtB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;KACvB;IACD,IAAI,EAAE,EAAE;CACT,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ScenarioNodeExecutionMeta } from "../../scenario-runner/types.js";
2
+ export declare const attachMetaToScriptValue: (value: unknown, meta: ScenarioNodeExecutionMeta | undefined) => unknown;
3
+ export declare const canExposeLabelAsGlobal: (label: string) => boolean;
4
+ export interface BuildLabelGlobalsInput {
5
+ workflowContext: Record<string, unknown>;
6
+ nodeMetaByLabel?: Record<string, ScenarioNodeExecutionMeta>;
7
+ }
8
+ export declare const buildLabelGlobals: ({ workflowContext, nodeMetaByLabel, }: BuildLabelGlobalsInput) => Record<string, unknown>;
9
+ export interface BuildNodeApiInput {
10
+ workflowContext: Record<string, unknown>;
11
+ nodeMetaByLabel?: Record<string, ScenarioNodeExecutionMeta>;
12
+ }
13
+ export declare const buildNodeApi: ({ workflowContext, nodeMetaByLabel, }: BuildNodeApiInput) => ((label: string) => unknown);
14
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/script/features/node.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAmBhF,eAAO,MAAM,uBAAuB,GAClC,OAAO,OAAO,EACd,MAAM,yBAAyB,GAAG,SAAS,KAC1C,OAmCF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM,KAAG,OAOtD,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,iBAAiB,GAAI,uCAG/B,sBAAsB,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAYjD,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,YAAY,GAAI,uCAG1B,iBAAiB,KAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAWjD,CAAC"}
@@ -0,0 +1,82 @@
1
+ // pm.node + label-as-global helpers for scenario scripts.
2
+ //
3
+ // In a scenario, each prior node's output is available under its label.
4
+ // Two access paths are exposed to the user script:
5
+ // 1. pm.node("Login") — explicit, never collides
6
+ // 2. Login.token — top-level binding (only when the label
7
+ // is a valid JS identifier and not
8
+ // reserved by the sandbox)
9
+ //
10
+ // Both paths attach `__meta` to the returned value (status/timing) when the
11
+ // caller supplies nodeMetaByLabel — this lets scripts inspect the upstream
12
+ // node's execution metadata directly (e.g., login.__meta.status === "success").
13
+ import { RESERVED_LABEL_NAMES, VALID_LABEL_IDENTIFIER_PATTERN, } from "../scope.js";
14
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
15
+ const cloneMeta = (meta) => meta
16
+ ? {
17
+ ...meta,
18
+ ...(meta.error ? { error: { ...meta.error } } : {}),
19
+ }
20
+ : undefined;
21
+ export const attachMetaToScriptValue = (value, meta) => {
22
+ if (!meta) {
23
+ return value;
24
+ }
25
+ const normalizedMeta = cloneMeta(meta);
26
+ if (Array.isArray(value)) {
27
+ const nextValue = [...value];
28
+ nextValue.__meta = normalizedMeta;
29
+ return nextValue;
30
+ }
31
+ if (isRecord(value)) {
32
+ return { ...value, __meta: normalizedMeta };
33
+ }
34
+ if (value === null || typeof value === "undefined") {
35
+ return { __meta: normalizedMeta };
36
+ }
37
+ if (typeof value === "string") {
38
+ const boxed = new String(value);
39
+ boxed.__meta = normalizedMeta;
40
+ return boxed;
41
+ }
42
+ if (typeof value === "number") {
43
+ const boxed = new Number(value);
44
+ boxed.__meta = normalizedMeta;
45
+ return boxed;
46
+ }
47
+ if (typeof value === "boolean") {
48
+ const boxed = new Boolean(value);
49
+ boxed.__meta = normalizedMeta;
50
+ return boxed;
51
+ }
52
+ return { value, __meta: normalizedMeta };
53
+ };
54
+ export const canExposeLabelAsGlobal = (label) => {
55
+ const trimmed = label.trim();
56
+ return (Boolean(trimmed) &&
57
+ VALID_LABEL_IDENTIFIER_PATTERN.test(trimmed) &&
58
+ !RESERVED_LABEL_NAMES.has(trimmed));
59
+ };
60
+ export const buildLabelGlobals = ({ workflowContext, nodeMetaByLabel, }) => {
61
+ const labelGlobals = {};
62
+ for (const [label, value] of Object.entries(workflowContext)) {
63
+ if (!canExposeLabelAsGlobal(label)) {
64
+ continue;
65
+ }
66
+ labelGlobals[label] = attachMetaToScriptValue(value, nodeMetaByLabel?.[label]);
67
+ }
68
+ // The reserved key `workflow` is forwarded as-is when present (without
69
+ // __meta attachment) — backend/electron both expose this.
70
+ labelGlobals.workflow = workflowContext.workflow ?? null;
71
+ return labelGlobals;
72
+ };
73
+ export const buildNodeApi = ({ workflowContext, nodeMetaByLabel, }) => {
74
+ return (label) => {
75
+ const normalizedLabel = String(label ?? "").trim();
76
+ if (!normalizedLabel) {
77
+ return null;
78
+ }
79
+ return attachMetaToScriptValue(workflowContext[normalizedLabel] ?? null, nodeMetaByLabel?.[normalizedLabel]);
80
+ };
81
+ };
82
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/script/features/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ScriptRequestBodyState, ScriptRequestState } from "../types.js";
2
+ export interface RequestApi {
3
+ method: string;
4
+ url: string;
5
+ headers: Record<string, string>;
6
+ query: Record<string, string>;
7
+ body: ScriptRequestBodyState;
8
+ getHeader: (key: string) => string | undefined;
9
+ setHeader: (key: string, value: unknown) => void;
10
+ unsetHeader: (key: string) => void;
11
+ getQueryParam: (key: string) => string | undefined;
12
+ setQueryParam: (key: string, value: unknown) => void;
13
+ unsetQueryParam: (key: string) => void;
14
+ setMethod: (nextMethod: unknown) => void;
15
+ setUrl: (nextUrl: unknown) => void;
16
+ setRawBody: (value: unknown) => void;
17
+ }
18
+ export interface RequestApiBundle {
19
+ api: RequestApi;
20
+ toRequestState: () => ScriptRequestState;
21
+ }
22
+ export declare const buildRequestApi: (request: ScriptRequestState) => RequestApiBundle;
23
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/script/features/request.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC/C,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACnD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAqCD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,UAAU,CAAC;IAChB,cAAc,EAAE,MAAM,kBAAkB,CAAC;CAC1C;AAED,eAAO,MAAM,eAAe,GAAI,SAAS,kBAAkB,KAAG,gBAqE7D,CAAC"}