callman-core 1.3.0 → 1.5.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 (139) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/scenario-runner/adapters/connection-config.d.ts +34 -0
  6. package/dist/scenario-runner/adapters/connection-config.d.ts.map +1 -0
  7. package/dist/scenario-runner/adapters/connection-config.js +6 -0
  8. package/dist/scenario-runner/adapters/connection-config.js.map +1 -0
  9. package/dist/scenario-runner/adapters/db-executor.d.ts +4 -0
  10. package/dist/scenario-runner/adapters/db-executor.d.ts.map +1 -0
  11. package/dist/scenario-runner/adapters/db-executor.js +42 -0
  12. package/dist/scenario-runner/adapters/db-executor.js.map +1 -0
  13. package/dist/scenario-runner/adapters/helpers/abort.d.ts +4 -0
  14. package/dist/scenario-runner/adapters/helpers/abort.d.ts.map +1 -0
  15. package/dist/scenario-runner/adapters/helpers/abort.js +47 -0
  16. package/dist/scenario-runner/adapters/helpers/abort.js.map +1 -0
  17. package/dist/scenario-runner/adapters/helpers/failure-messages.d.ts +29 -0
  18. package/dist/scenario-runner/adapters/helpers/failure-messages.d.ts.map +1 -0
  19. package/dist/scenario-runner/adapters/helpers/failure-messages.js +64 -0
  20. package/dist/scenario-runner/adapters/helpers/failure-messages.js.map +1 -0
  21. package/dist/scenario-runner/adapters/helpers/mutations.d.ts +7 -0
  22. package/dist/scenario-runner/adapters/helpers/mutations.d.ts.map +1 -0
  23. package/dist/scenario-runner/adapters/helpers/mutations.js +28 -0
  24. package/dist/scenario-runner/adapters/helpers/mutations.js.map +1 -0
  25. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts +31 -0
  26. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts.map +1 -0
  27. package/dist/scenario-runner/adapters/helpers/request-helpers.js +247 -0
  28. package/dist/scenario-runner/adapters/helpers/request-helpers.js.map +1 -0
  29. package/dist/scenario-runner/adapters/helpers/response-shapes.d.ts +3 -0
  30. package/dist/scenario-runner/adapters/helpers/response-shapes.d.ts.map +1 -0
  31. package/dist/scenario-runner/adapters/helpers/response-shapes.js +32 -0
  32. package/dist/scenario-runner/adapters/helpers/response-shapes.js.map +1 -0
  33. package/dist/scenario-runner/adapters/helpers/templates.d.ts +2 -0
  34. package/dist/scenario-runner/adapters/helpers/templates.d.ts.map +1 -0
  35. package/dist/scenario-runner/adapters/helpers/templates.js +30 -0
  36. package/dist/scenario-runner/adapters/helpers/templates.js.map +1 -0
  37. package/dist/scenario-runner/adapters/index.d.ts +12 -0
  38. package/dist/scenario-runner/adapters/index.d.ts.map +1 -0
  39. package/dist/scenario-runner/adapters/index.js +30 -0
  40. package/dist/scenario-runner/adapters/index.js.map +1 -0
  41. package/dist/scenario-runner/adapters/kafka-executor.d.ts +4 -0
  42. package/dist/scenario-runner/adapters/kafka-executor.d.ts.map +1 -0
  43. package/dist/scenario-runner/adapters/kafka-executor.js +35 -0
  44. package/dist/scenario-runner/adapters/kafka-executor.js.map +1 -0
  45. package/dist/scenario-runner/adapters/notification-executor.d.ts +4 -0
  46. package/dist/scenario-runner/adapters/notification-executor.d.ts.map +1 -0
  47. package/dist/scenario-runner/adapters/notification-executor.js +67 -0
  48. package/dist/scenario-runner/adapters/notification-executor.js.map +1 -0
  49. package/dist/scenario-runner/adapters/redis-executor.d.ts +4 -0
  50. package/dist/scenario-runner/adapters/redis-executor.d.ts.map +1 -0
  51. package/dist/scenario-runner/adapters/redis-executor.js +78 -0
  52. package/dist/scenario-runner/adapters/redis-executor.js.map +1 -0
  53. package/dist/scenario-runner/adapters/request-executor.d.ts +4 -0
  54. package/dist/scenario-runner/adapters/request-executor.d.ts.map +1 -0
  55. package/dist/scenario-runner/adapters/request-executor.js +262 -0
  56. package/dist/scenario-runner/adapters/request-executor.js.map +1 -0
  57. package/dist/scenario-runner/adapters/script-executor.d.ts +4 -0
  58. package/dist/scenario-runner/adapters/script-executor.d.ts.map +1 -0
  59. package/dist/scenario-runner/adapters/script-executor.js +113 -0
  60. package/dist/scenario-runner/adapters/script-executor.js.map +1 -0
  61. package/dist/scenario-runner/adapters/types.d.ts +82 -0
  62. package/dist/scenario-runner/adapters/types.d.ts.map +1 -0
  63. package/dist/scenario-runner/adapters/types.js +9 -0
  64. package/dist/scenario-runner/adapters/types.js.map +1 -0
  65. package/dist/scenario-runner/index.d.ts +1 -0
  66. package/dist/scenario-runner/index.d.ts.map +1 -1
  67. package/dist/scenario-runner/index.js +1 -0
  68. package/dist/scenario-runner/index.js.map +1 -1
  69. package/dist/templating/counter-store.d.ts +7 -0
  70. package/dist/templating/counter-store.d.ts.map +1 -0
  71. package/dist/templating/counter-store.js +64 -0
  72. package/dist/templating/counter-store.js.map +1 -0
  73. package/dist/templating/generator-metadata.d.ts +5 -0
  74. package/dist/templating/generator-metadata.d.ts.map +1 -0
  75. package/dist/templating/generator-metadata.js +102 -0
  76. package/dist/templating/generator-metadata.js.map +1 -0
  77. package/dist/templating/index.d.ts +6 -0
  78. package/dist/templating/index.d.ts.map +1 -0
  79. package/dist/templating/index.js +11 -0
  80. package/dist/templating/index.js.map +1 -0
  81. package/dist/templating/random-generators.d.ts +10 -0
  82. package/dist/templating/random-generators.d.ts.map +1 -0
  83. package/dist/templating/random-generators.js +16 -0
  84. package/dist/templating/random-generators.js.map +1 -0
  85. package/dist/templating/template-engine.d.ts +14 -0
  86. package/dist/templating/template-engine.d.ts.map +1 -0
  87. package/dist/templating/template-engine.js +148 -0
  88. package/dist/templating/template-engine.js.map +1 -0
  89. package/dist/templating/types.d.ts +22 -0
  90. package/dist/templating/types.d.ts.map +1 -0
  91. package/dist/templating/types.js +10 -0
  92. package/dist/templating/types.js.map +1 -0
  93. package/dist-cjs/index.js +2 -4
  94. package/dist-cjs/index.js.map +1 -1
  95. package/dist-cjs/scenario-runner/adapters/connection-config.js +7 -0
  96. package/dist-cjs/scenario-runner/adapters/connection-config.js.map +1 -0
  97. package/dist-cjs/scenario-runner/adapters/db-executor.js +46 -0
  98. package/dist-cjs/scenario-runner/adapters/db-executor.js.map +1 -0
  99. package/dist-cjs/scenario-runner/adapters/helpers/abort.js +52 -0
  100. package/dist-cjs/scenario-runner/adapters/helpers/abort.js.map +1 -0
  101. package/dist-cjs/scenario-runner/adapters/helpers/failure-messages.js +69 -0
  102. package/dist-cjs/scenario-runner/adapters/helpers/failure-messages.js.map +1 -0
  103. package/dist-cjs/scenario-runner/adapters/helpers/mutations.js +32 -0
  104. package/dist-cjs/scenario-runner/adapters/helpers/mutations.js.map +1 -0
  105. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js +263 -0
  106. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js.map +1 -0
  107. package/dist-cjs/scenario-runner/adapters/helpers/response-shapes.js +36 -0
  108. package/dist-cjs/scenario-runner/adapters/helpers/response-shapes.js.map +1 -0
  109. package/dist-cjs/scenario-runner/adapters/helpers/templates.js +34 -0
  110. package/dist-cjs/scenario-runner/adapters/helpers/templates.js.map +1 -0
  111. package/dist-cjs/scenario-runner/adapters/index.js +40 -0
  112. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -0
  113. package/dist-cjs/scenario-runner/adapters/kafka-executor.js +39 -0
  114. package/dist-cjs/scenario-runner/adapters/kafka-executor.js.map +1 -0
  115. package/dist-cjs/scenario-runner/adapters/notification-executor.js +71 -0
  116. package/dist-cjs/scenario-runner/adapters/notification-executor.js.map +1 -0
  117. package/dist-cjs/scenario-runner/adapters/redis-executor.js +82 -0
  118. package/dist-cjs/scenario-runner/adapters/redis-executor.js.map +1 -0
  119. package/dist-cjs/scenario-runner/adapters/request-executor.js +266 -0
  120. package/dist-cjs/scenario-runner/adapters/request-executor.js.map +1 -0
  121. package/dist-cjs/scenario-runner/adapters/script-executor.js +117 -0
  122. package/dist-cjs/scenario-runner/adapters/script-executor.js.map +1 -0
  123. package/dist-cjs/scenario-runner/adapters/types.js +10 -0
  124. package/dist-cjs/scenario-runner/adapters/types.js.map +1 -0
  125. package/dist-cjs/scenario-runner/index.js +1 -0
  126. package/dist-cjs/scenario-runner/index.js.map +1 -1
  127. package/dist-cjs/templating/counter-store.js +72 -0
  128. package/dist-cjs/templating/counter-store.js.map +1 -0
  129. package/dist-cjs/templating/generator-metadata.js +105 -0
  130. package/dist-cjs/templating/generator-metadata.js.map +1 -0
  131. package/dist-cjs/templating/index.js +35 -0
  132. package/dist-cjs/templating/index.js.map +1 -0
  133. package/dist-cjs/templating/random-generators.js +28 -0
  134. package/dist-cjs/templating/random-generators.js.map +1 -0
  135. package/dist-cjs/templating/template-engine.js +155 -0
  136. package/dist-cjs/templating/template-engine.js.map +1 -0
  137. package/dist-cjs/templating/types.js +11 -0
  138. package/dist-cjs/templating/types.js.map +1 -0
  139. package/package.json +1 -1
@@ -0,0 +1,5 @@
1
+ import type { TemplateGeneratorMeta } from "./types.js";
2
+ export declare const RANDOM_GENERATOR_METADATA: TemplateGeneratorMeta[];
3
+ export declare const COUNTER_GENERATOR_METADATA: TemplateGeneratorMeta[];
4
+ export declare const TEMPLATE_GENERATOR_METADATA: TemplateGeneratorMeta[];
5
+ //# sourceMappingURL=generator-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator-metadata.d.ts","sourceRoot":"","sources":["../../src/templating/generator-metadata.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,yBAAyB,EAAE,qBAAqB,EAyE5D,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,qBAAqB,EAiB7D,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,qBAAqB,EAG9D,CAAC"}
@@ -0,0 +1,102 @@
1
+ // Generator suggestion metadata — single source of truth for the UI
2
+ // autocomplete + the runtime resolver. Both must agree on what generators
3
+ // exist; previously the data lived only in the renderer's
4
+ // `randomGenerators.ts` while the runtime path used a separate switch
5
+ // statement, allowing UI to suggest generators the runtime didn't ship.
6
+ export const RANDOM_GENERATOR_METADATA = [
7
+ {
8
+ name: "random.email",
9
+ label: "email",
10
+ insertText: "random.email",
11
+ detail: "Random email address",
12
+ preview: "sam.user42@example.com",
13
+ kind: "generator",
14
+ },
15
+ {
16
+ name: "random.string",
17
+ label: "string",
18
+ insertText: "random.string",
19
+ detail: "Random alphanumeric string",
20
+ preview: "aZ19xPq20LmN",
21
+ kind: "generator",
22
+ },
23
+ {
24
+ name: "random.uuid",
25
+ label: "uuid",
26
+ insertText: "random.uuid",
27
+ detail: "Random UUID v4",
28
+ preview: "1d7fe6b6-6f47-4fa9-b57a-d2e1d285be51",
29
+ kind: "generator",
30
+ },
31
+ {
32
+ name: "random.int",
33
+ label: "int",
34
+ insertText: "random.int",
35
+ detail: "Random integer",
36
+ preview: "48291",
37
+ kind: "generator",
38
+ },
39
+ {
40
+ name: "random.bigdecimal",
41
+ label: "bigdecimal",
42
+ insertText: "random.bigdecimal",
43
+ detail: "Random decimal number",
44
+ preview: "1842.552190",
45
+ kind: "generator",
46
+ },
47
+ {
48
+ name: "random.boolean",
49
+ label: "boolean",
50
+ insertText: "random.boolean",
51
+ detail: "Random boolean",
52
+ preview: "true",
53
+ kind: "generator",
54
+ },
55
+ {
56
+ name: "random.phone",
57
+ label: "phone",
58
+ insertText: "random.phone",
59
+ detail: "Random phone number",
60
+ preview: "+15558675309",
61
+ kind: "generator",
62
+ },
63
+ {
64
+ name: "random.date",
65
+ label: "date",
66
+ insertText: 'random.date("YYYY-MM-DD")',
67
+ detail: "Random date",
68
+ preview: "2026-04-06",
69
+ kind: "generator",
70
+ },
71
+ {
72
+ name: "random.name",
73
+ label: "name",
74
+ insertText: "random.name",
75
+ detail: "Random human name",
76
+ preview: "Aylin Karimli",
77
+ kind: "generator",
78
+ },
79
+ ];
80
+ export const COUNTER_GENERATOR_METADATA = [
81
+ {
82
+ name: "counter",
83
+ label: "counter",
84
+ insertText: "counter",
85
+ detail: "Incrementing counter per request",
86
+ preview: "1, 2, 3...",
87
+ kind: "counter",
88
+ },
89
+ {
90
+ name: "counter.start(100)",
91
+ label: "counter.start(100)",
92
+ insertText: "counter.start(100)",
93
+ detail: "Counter starting at 100",
94
+ preview: "100, 101, 102...",
95
+ kind: "counter",
96
+ },
97
+ ];
98
+ export const TEMPLATE_GENERATOR_METADATA = [
99
+ ...RANDOM_GENERATOR_METADATA,
100
+ ...COUNTER_GENERATOR_METADATA,
101
+ ];
102
+ //# sourceMappingURL=generator-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator-metadata.js","sourceRoot":"","sources":["../../src/templating/generator-metadata.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,0EAA0E;AAC1E,0DAA0D;AAC1D,sEAAsE;AACtE,wEAAwE;AAIxE,MAAM,CAAC,MAAM,yBAAyB,GAA4B;IAChE;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,cAAc;QAC1B,MAAM,EAAE,sBAAsB;QAC9B,OAAO,EAAE,wBAAwB;QACjC,IAAI,EAAE,WAAW;KAClB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,eAAe;QAC3B,MAAM,EAAE,4BAA4B;QACpC,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,WAAW;KAClB;IACD;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,aAAa;QACzB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,sCAAsC;QAC/C,IAAI,EAAE,WAAW;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,YAAY;QACxB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,WAAW;KAClB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE,mBAAmB;QAC/B,MAAM,EAAE,uBAAuB;QAC/B,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,WAAW;KAClB;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,gBAAgB;QAC5B,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,WAAW;KAClB;IACD;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,cAAc;QAC1B,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,WAAW;KAClB;IACD;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,2BAA2B;QACvC,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,WAAW;KAClB;IACD;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,aAAa;QACzB,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,eAAe;QACxB,IAAI,EAAE,WAAW;KAClB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAA4B;IACjE;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,SAAS;QACrB,MAAM,EAAE,kCAAkC;QAC1C,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,SAAS;KAChB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,oBAAoB;QAC3B,UAAU,EAAE,oBAAoB;QAChC,MAAM,EAAE,yBAAyB;QACjC,OAAO,EAAE,kBAAkB;QAC3B,IAAI,EAAE,SAAS;KAChB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAA4B;IAClE,GAAG,yBAAyB;IAC5B,GAAG,0BAA0B;CAC9B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { parseTemplateArguments, createTemplateRuntimeContext, resolveTemplate, resolveTemplateKeyValuePairs, } from "./template-engine.js";
2
+ export { generateRandomUuid, generateRandomString, generateRandomEmail, generateRandomInt, generateRandomBigDecimal, generateRandomBoolean, generateRandomPhone, generateRandomDate, generateRandomName, } from "./random-generators.js";
3
+ export { createCounterStore, getNextCounterValue, resetCounterValue, getCounterSnapshot, hydrateCounterStore, } from "./counter-store.js";
4
+ export { RANDOM_GENERATOR_METADATA, COUNTER_GENERATOR_METADATA, TEMPLATE_GENERATOR_METADATA, } from "./generator-metadata.js";
5
+ export type { CounterSnapshotEntry, CounterStore, TemplateRuntimeContext, TemplateGeneratorMeta, } from "./types.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templating/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,eAAe,EACf,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Public surface for the Postman-style template engine.
2
+ //
3
+ // Domain: collection runner + single-request templating tokens
4
+ // (`{{varname}}`, `{{random.uuid()}}`, `{{counter.start(N)}}`). Scenario
5
+ // runtime data substitution lives in `scenario-runner/templateResolver.ts`
6
+ // — a separate API axis with pre-flattened values and condition support.
7
+ export { parseTemplateArguments, createTemplateRuntimeContext, resolveTemplate, resolveTemplateKeyValuePairs, } from "./template-engine.js";
8
+ export { generateRandomUuid, generateRandomString, generateRandomEmail, generateRandomInt, generateRandomBigDecimal, generateRandomBoolean, generateRandomPhone, generateRandomDate, generateRandomName, } from "./random-generators.js";
9
+ export { createCounterStore, getNextCounterValue, resetCounterValue, getCounterSnapshot, hydrateCounterStore, } from "./counter-store.js";
10
+ export { RANDOM_GENERATOR_METADATA, COUNTER_GENERATOR_METADATA, TEMPLATE_GENERATOR_METADATA, } from "./generator-metadata.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templating/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,+DAA+D;AAC/D,yEAAyE;AACzE,2EAA2E;AAC3E,yEAAyE;AAEzE,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,eAAe,EACf,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const generateRandomUuid: () => string;
2
+ export declare const generateRandomString: (length?: number) => string;
3
+ export declare const generateRandomEmail: () => string;
4
+ export declare const generateRandomInt: (min?: number, max?: number) => string;
5
+ export declare const generateRandomBigDecimal: (min?: number, max?: number, scale?: number) => string;
6
+ export declare const generateRandomBoolean: () => string;
7
+ export declare const generateRandomPhone: () => string;
8
+ export declare const generateRandomDate: (format?: string) => string;
9
+ export declare const generateRandomName: () => string;
10
+ //# sourceMappingURL=random-generators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-generators.d.ts","sourceRoot":"","sources":["../../src/templating/random-generators.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,kBAAkB,QAAO,MAA2B,CAAC;AAElE,eAAO,MAAM,oBAAoB,GAAI,eAAW,KAAG,MACxB,CAAC;AAE5B,eAAO,MAAM,mBAAmB,QAAO,MAA4B,CAAC;AAEpE,eAAO,MAAM,iBAAiB,GAAI,YAAO,EAAE,YAAa,KAAG,MACjC,CAAC;AAE3B,eAAO,MAAM,wBAAwB,GACnC,YAAO,EACP,YAAa,EACb,cAAS,KACR,MAAgD,CAAC;AAEpD,eAAO,MAAM,qBAAqB,QAAO,MAA8B,CAAC;AAExE,eAAO,MAAM,mBAAmB,QAAO,MAA4B,CAAC;AAEpE,eAAO,MAAM,kBAAkB,GAAI,eAAqB,KAAG,MAClC,CAAC;AAE1B,eAAO,MAAM,kBAAkB,QAAO,MAA2B,CAAC"}
@@ -0,0 +1,16 @@
1
+ // Standalone random generator functions consumed by the Postman-style
2
+ // template engine (`{{random.uuid()}}`, etc.). Internally backed by the
3
+ // canonical `buildRandomApi` so script sandbox (`pm.random.*`) and
4
+ // template engine share one implementation — no drift between the two.
5
+ import { buildRandomApi } from "../script/features/random.js";
6
+ const defaultApi = buildRandomApi();
7
+ export const generateRandomUuid = () => defaultApi.uuid();
8
+ export const generateRandomString = (length = 12) => defaultApi.string(length);
9
+ export const generateRandomEmail = () => defaultApi.email();
10
+ export const generateRandomInt = (min = 0, max = 999_999) => defaultApi.int(min, max);
11
+ export const generateRandomBigDecimal = (min = 0, max = 100_000, scale = 6) => defaultApi.bigdecimal(min, max, scale);
12
+ export const generateRandomBoolean = () => defaultApi.boolean();
13
+ export const generateRandomPhone = () => defaultApi.phone();
14
+ export const generateRandomDate = (format = "YYYY-MM-DD") => defaultApi.date(format);
15
+ export const generateRandomName = () => defaultApi.name();
16
+ //# sourceMappingURL=random-generators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-generators.js","sourceRoot":"","sources":["../../src/templating/random-generators.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,wEAAwE;AACxE,mEAAmE;AACnE,uEAAuE;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;AAEpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAElE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,GAAG,EAAE,EAAU,EAAE,CAC1D,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE5B,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,EAAU,EAAE,CAClE,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE3B,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,OAAO,EACb,KAAK,GAAG,CAAC,EACD,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;AAExE,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;AAEpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAM,GAAG,YAAY,EAAU,EAAE,CAClE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAE1B,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { CounterStore, TemplateRuntimeContext } from "./types.js";
2
+ interface KeyValuePair {
3
+ key: string;
4
+ value: string;
5
+ enabled?: boolean;
6
+ }
7
+ export declare const parseTemplateArguments: (input: string) => string[];
8
+ export declare const createTemplateRuntimeContext: (environment: Record<string, string>, options?: {
9
+ counterStore?: CounterStore;
10
+ }) => TemplateRuntimeContext;
11
+ export declare const resolveTemplate: (input: string, context: TemplateRuntimeContext) => string;
12
+ export declare const resolveTemplateKeyValuePairs: <T extends KeyValuePair>(entries: T[], context: TemplateRuntimeContext) => T[];
13
+ export {};
14
+ //# sourceMappingURL=template-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.d.ts","sourceRoot":"","sources":["../../src/templating/template-engine.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEvE,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAyBD,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM,KAAG,MAAM,EA4C5D,CAAC;AAyGF,eAAO,MAAM,4BAA4B,GACvC,aAAa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,UAAS;IAAE,YAAY,CAAC,EAAE,YAAY,CAAA;CAAO,KAC5C,sBAID,CAAC;AAEH,eAAO,MAAM,eAAe,GAC1B,OAAO,MAAM,EACb,SAAS,sBAAsB,KAC9B,MAkBF,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,CAAC,SAAS,YAAY,EACjE,SAAS,CAAC,EAAE,EACZ,SAAS,sBAAsB,KAC9B,CAAC,EAMC,CAAC"}
@@ -0,0 +1,148 @@
1
+ // Postman-style template engine — resolves `{{varname}}`,
2
+ // `{{random.<name>(...args)}}`, `{{counter}}` / `{{counter.start(N)}}`
3
+ // against a runtime context. Multi-pass loop (4 passes) enables nested
4
+ // resolution like `{{varname}}` whose value is itself `{{random.uuid()}}`.
5
+ import { generateRandomBigDecimal, generateRandomBoolean, generateRandomDate, generateRandomEmail, generateRandomInt, generateRandomName, generateRandomPhone, generateRandomString, generateRandomUuid, } from "./random-generators.js";
6
+ import { getNextCounterValue as defaultGetNextCounterValue } from "./counter-store.js";
7
+ const TEMPLATE_PATTERN = /\{\{\s*([^{}]+?)\s*\}\}/g;
8
+ const RANDOM_EXPRESSION_PATTERN = /^random\.([a-z]+)(?:\((.*)\))?$/i;
9
+ const COUNTER_START_PATTERN = /^counter\.start\((.*)\)$/i;
10
+ const MAX_TEMPLATE_PASSES = 4;
11
+ const stripWrappingQuotes = (value) => {
12
+ const trimmed = value.trim();
13
+ if (trimmed.length >= 2) {
14
+ const firstCharacter = trimmed[0];
15
+ const lastCharacter = trimmed[trimmed.length - 1];
16
+ if ((firstCharacter === `"` || firstCharacter === `'`) &&
17
+ firstCharacter === lastCharacter) {
18
+ return trimmed.slice(1, -1);
19
+ }
20
+ }
21
+ return trimmed;
22
+ };
23
+ export const parseTemplateArguments = (input) => {
24
+ const args = [];
25
+ let current = "";
26
+ let quote = null;
27
+ let isEscaped = false;
28
+ for (const character of input) {
29
+ if (isEscaped) {
30
+ current += character;
31
+ isEscaped = false;
32
+ continue;
33
+ }
34
+ if (character === "\\") {
35
+ isEscaped = true;
36
+ continue;
37
+ }
38
+ if ((character === `"` || character === `'`) && quote === null) {
39
+ quote = character;
40
+ current += character;
41
+ continue;
42
+ }
43
+ if (quote !== null && character === quote) {
44
+ quote = null;
45
+ current += character;
46
+ continue;
47
+ }
48
+ if (character === "," && quote === null) {
49
+ args.push(stripWrappingQuotes(current));
50
+ current = "";
51
+ continue;
52
+ }
53
+ current += character;
54
+ }
55
+ if (current.trim() || input.endsWith(",")) {
56
+ args.push(stripWrappingQuotes(current));
57
+ }
58
+ return args.filter((argument) => argument.length > 0);
59
+ };
60
+ const toFiniteNumber = (value, fallback) => {
61
+ if (!value) {
62
+ return fallback;
63
+ }
64
+ const parsedValue = Number(value);
65
+ return Number.isFinite(parsedValue) ? parsedValue : fallback;
66
+ };
67
+ const resolveRandomExpression = (generatorName, args) => {
68
+ switch (generatorName.toLowerCase()) {
69
+ case "email":
70
+ return generateRandomEmail();
71
+ case "string":
72
+ return generateRandomString(toFiniteNumber(args[0], 12));
73
+ case "uuid":
74
+ return generateRandomUuid();
75
+ case "int":
76
+ return generateRandomInt(toFiniteNumber(args[0], 0), toFiniteNumber(args[1], 999_999));
77
+ case "bigdecimal":
78
+ return generateRandomBigDecimal(toFiniteNumber(args[0], 0), toFiniteNumber(args[1], 100_000), toFiniteNumber(args[2], 6));
79
+ case "boolean":
80
+ return generateRandomBoolean();
81
+ case "phone":
82
+ return generateRandomPhone();
83
+ case "date":
84
+ return generateRandomDate(args[0] || "YYYY-MM-DD");
85
+ case "name":
86
+ return generateRandomName();
87
+ default:
88
+ return "";
89
+ }
90
+ };
91
+ const resolveCounterExpression = (expression, context) => {
92
+ if (context.requestCounterCache.has(expression)) {
93
+ return context.requestCounterCache.get(expression) ?? "";
94
+ }
95
+ const counterStartMatch = expression.match(COUNTER_START_PATTERN);
96
+ const startAt = counterStartMatch
97
+ ? toFiniteNumber(parseTemplateArguments(counterStartMatch[1] ?? "")[0], 1)
98
+ : 1;
99
+ const counterKey = counterStartMatch ? `counter.start:${startAt}` : "counter";
100
+ const advanceFn = context.counterStore
101
+ ? (key, start) => context.counterStore.getNextValue(key, start)
102
+ : defaultGetNextCounterValue;
103
+ const nextValue = String(advanceFn(counterKey, startAt));
104
+ context.requestCounterCache.set(expression, nextValue);
105
+ return nextValue;
106
+ };
107
+ const resolveExpression = (expression, context) => {
108
+ const normalizedExpression = expression.trim();
109
+ if (!normalizedExpression) {
110
+ return "";
111
+ }
112
+ const randomMatch = normalizedExpression.match(RANDOM_EXPRESSION_PATTERN);
113
+ if (randomMatch) {
114
+ return resolveRandomExpression(randomMatch[1] ?? "", parseTemplateArguments(randomMatch[2] ?? ""));
115
+ }
116
+ if (normalizedExpression === "counter" ||
117
+ COUNTER_START_PATTERN.test(normalizedExpression)) {
118
+ return resolveCounterExpression(normalizedExpression, context);
119
+ }
120
+ return context.environment[normalizedExpression] ?? "";
121
+ };
122
+ const resolveTemplatePass = (input, context) => input.replace(TEMPLATE_PATTERN, (_match, expression) => resolveExpression(expression, context));
123
+ export const createTemplateRuntimeContext = (environment, options = {}) => ({
124
+ environment,
125
+ requestCounterCache: new Map(),
126
+ ...(options.counterStore ? { counterStore: options.counterStore } : {}),
127
+ });
128
+ export const resolveTemplate = (input, context) => {
129
+ if (!input.includes("{{")) {
130
+ return input;
131
+ }
132
+ let currentValue = input;
133
+ for (let pass = 0; pass < MAX_TEMPLATE_PASSES; pass += 1) {
134
+ const nextValue = resolveTemplatePass(currentValue, context);
135
+ if (nextValue === currentValue || !nextValue.includes("{{")) {
136
+ return nextValue;
137
+ }
138
+ currentValue = nextValue;
139
+ }
140
+ return currentValue;
141
+ };
142
+ export const resolveTemplateKeyValuePairs = (entries, context) => entries.map((entry) => ({
143
+ ...entry,
144
+ key: resolveTemplate(entry.key, context),
145
+ value: resolveTemplate(entry.value, context),
146
+ enabled: entry.enabled ?? true,
147
+ }));
148
+ //# sourceMappingURL=template-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../../src/templating/template-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { CounterSnapshotEntry } from "../script/types.js";
2
+ export type { CounterSnapshotEntry };
3
+ export interface CounterStore {
4
+ getNextValue: (key: string, startAt?: number) => number;
5
+ snapshot: () => CounterSnapshotEntry[];
6
+ hydrate: (snapshot: CounterSnapshotEntry[]) => void;
7
+ reset: (key?: string) => void;
8
+ }
9
+ export interface TemplateRuntimeContext {
10
+ environment: Record<string, string>;
11
+ requestCounterCache: Map<string, string>;
12
+ counterStore?: CounterStore;
13
+ }
14
+ export interface TemplateGeneratorMeta {
15
+ name: string;
16
+ label: string;
17
+ insertText: string;
18
+ detail: string;
19
+ preview: string;
20
+ kind: "generator" | "counter";
21
+ }
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/templating/types.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD,QAAQ,EAAE,MAAM,oBAAoB,EAAE,CAAC;IACvC,OAAO,EAAE,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,IAAI,CAAC;IACpD,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIpC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIzC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC;CAC/B"}
@@ -0,0 +1,10 @@
1
+ // Postman-style template engine types — shared across runtime hosts
2
+ // (renderer, electron Node, future CLI/server).
3
+ //
4
+ // The engine is domain-agnostic: it resolves `{{varname}}`,
5
+ // `{{random.*}}`, `{{counter}}` / `{{counter.start(N)}}` tokens against
6
+ // a flat environment plus pluggable random + counter primitives. Scenario
7
+ // runtime templating (response/db/kafka substitution) is a separate
8
+ // module; see `scenario-runner/templateResolver.ts`.
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/templating/types.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,gDAAgD;AAChD,EAAE;AACF,4DAA4D;AAC5D,wEAAwE;AACxE,0EAA0E;AAC1E,oEAAoE;AACpE,qDAAqD"}
package/dist-cjs/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.validateContracts = exports.isDisabledFeatureValue = exports.DisabledFeatureDependencyError = exports.isPendingKafkaValue = exports.PendingKafkaDependencyError = exports.createExpectApi = exports.PmAssertion = exports.validateScript = exports.executeScript = exports.runScript = exports.resolveTemplateValue = exports.resolveTemplate = exports.EnvStore = exports.executeRequest = exports.runRequest = exports.runCollection = void 0;
17
+ exports.validateContracts = exports.isDisabledFeatureValue = exports.DisabledFeatureDependencyError = exports.isPendingKafkaValue = exports.PendingKafkaDependencyError = exports.createExpectApi = exports.PmAssertion = exports.validateScript = exports.executeScript = exports.runScript = exports.EnvStore = exports.executeRequest = exports.runRequest = exports.runCollection = void 0;
18
18
  var runCollection_js_1 = require("./runner/runCollection.js");
19
19
  Object.defineProperty(exports, "runCollection", { enumerable: true, get: function () { return runCollection_js_1.runCollection; } });
20
20
  var requestRunner_js_1 = require("./runner/requestRunner.js");
@@ -23,11 +23,9 @@ var executeRequest_js_1 = require("./request/executeRequest.js");
23
23
  Object.defineProperty(exports, "executeRequest", { enumerable: true, get: function () { return executeRequest_js_1.executeRequest; } });
24
24
  var envStore_js_1 = require("./variables/envStore.js");
25
25
  Object.defineProperty(exports, "EnvStore", { enumerable: true, get: function () { return envStore_js_1.EnvStore; } });
26
- var resolver_js_1 = require("./variables/resolver.js");
27
- Object.defineProperty(exports, "resolveTemplate", { enumerable: true, get: function () { return resolver_js_1.resolveTemplate; } });
28
- Object.defineProperty(exports, "resolveTemplateValue", { enumerable: true, get: function () { return resolver_js_1.resolveTemplateValue; } });
29
26
  var legacy_js_1 = require("./script/legacy.js");
30
27
  Object.defineProperty(exports, "runScript", { enumerable: true, get: function () { return legacy_js_1.runScript; } });
28
+ __exportStar(require("./templating/index.js"), exports);
31
29
  var executor_js_1 = require("./script/executor.js");
32
30
  Object.defineProperty(exports, "executeScript", { enumerable: true, get: function () { return executor_js_1.executeScript; } });
33
31
  Object.defineProperty(exports, "validateScript", { enumerable: true, get: function () { return executor_js_1.validateScript; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,uDAAgF;AAAvE,8GAAA,eAAe,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAC9C,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AAuBtC,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAAoE;AAA3D,yHAAA,iBAAiB,OAAA;AAC1B,6DAA2C;AAC3C,mDAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,wDAAsC;AACtC,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AAuBtC,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAAoE;AAA3D,yHAAA,iBAAiB,OAAA;AAC1B,6DAA2C;AAC3C,mDAAiC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ // Connection config shapes shared by core adapter orchestration. Mirror
3
+ // the backend's `connection.types.ts` definitions but framework-agnostic
4
+ // (no Mongoose, no Oracle, etc.). Hosts flatten their richer types into
5
+ // these shapes when calling `resolveConnection`.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=connection-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-config.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/connection-config.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AACxE,iDAAiD"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ // Canonical DB executor — orchestrates a single Database scenario node.
3
+ // Resolves the workspace connection, defers the actual query execution
4
+ // to the host-supplied `databaseExecutor` driver (mongoose / oracledb /
5
+ // postgres / etc.), wraps the result in the scenario adapter shape.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.buildDbExecutor = void 0;
8
+ const abort_js_1 = require("./helpers/abort.js");
9
+ const buildDbExecutor = (options) => async (input) => {
10
+ const connection = await options.resolveConnection(input.node.data.config.connectionId);
11
+ try {
12
+ const result = await (0, abort_js_1.withAbortAndTimeout)(options.drivers.databaseExecutor({
13
+ connection,
14
+ resolvedQuery: input.resolvedQuery,
15
+ }), options.nodeTimeoutMs, `Database node ${input.stepId}`, input.signal);
16
+ return {
17
+ rawResult: {
18
+ success: true,
19
+ rows: result.rows,
20
+ rowCount: result.rowCount,
21
+ },
22
+ dbResult: result.rows,
23
+ outputData: {
24
+ rows: result.rows,
25
+ rowCount: result.rowCount,
26
+ },
27
+ failureMessage: null,
28
+ };
29
+ }
30
+ catch (error) {
31
+ const message = error instanceof Error ? error.message : String(error);
32
+ return {
33
+ rawResult: {
34
+ success: false,
35
+ rows: [],
36
+ rowCount: 0,
37
+ error: message,
38
+ },
39
+ dbResult: null,
40
+ outputData: null,
41
+ failureMessage: message || "Database query failed.",
42
+ };
43
+ }
44
+ };
45
+ exports.buildDbExecutor = buildDbExecutor;
46
+ //# sourceMappingURL=db-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/db-executor.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,uEAAuE;AACvE,wEAAwE;AACxE,oEAAoE;;;AAOpE,iDAAyD;AAGlD,MAAM,eAAe,GAAG,CAC7B,OAA6C,EAC7C,EAAE,CACF,KAAK,EAAE,KAA+B,EAAsC,EAAE;IAC5E,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAExF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAmB,EACtC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,UAAU;YACV,aAAa,EAAE,KAAK,CAAC,aAAa;SACnC,CAAC,EACF,OAAO,CAAC,aAAa,EACrB,iBAAiB,KAAK,CAAC,MAAM,EAAE,EAC/B,KAAK,CAAC,MAAM,CACb,CAAC;QACF,OAAO;YACL,SAAS,EAAE;gBACT,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;YACD,QAAQ,EAAE,MAAM,CAAC,IAAI;YACrB,UAAU,EAAE;gBACV,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;YACD,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,SAAS,EAAE;gBACT,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE,OAAO;aACf;YACD,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE,OAAO,IAAI,wBAAwB;SACpD,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AA3CS,QAAA,eAAe,mBA2CxB"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ // Abort signal + timeout helpers shared by every scenario adapter.
3
+ // Lifted from p_man_backend/src/modules/scenario-runner/adapters/runtime-adapters.ts
4
+ // (lines 56-111). Uses callman-core's existing `AbortLikeSignal` type so
5
+ // custom abort dispatchers (not just DOM AbortSignal) can be supplied.
6
+ //
7
+ // `attachAbortHandler` returns a detach function so callers can clean up
8
+ // listeners without leaking when the underlying task settles before the
9
+ // signal fires. `withAbortAndTimeout` wraps a task with both a timeout
10
+ // rejection and an abort rejection, whichever comes first.
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.withAbortAndTimeout = exports.attachAbortHandler = void 0;
13
+ const attachAbortHandler = (signal, handler) => {
14
+ if (!signal?.addEventListener || !signal?.removeEventListener) {
15
+ return () => undefined;
16
+ }
17
+ if (signal.aborted) {
18
+ handler();
19
+ return () => undefined;
20
+ }
21
+ signal.addEventListener("abort", handler, { once: true });
22
+ return () => signal.removeEventListener?.("abort", handler);
23
+ };
24
+ exports.attachAbortHandler = attachAbortHandler;
25
+ const withAbortAndTimeout = async (task, timeoutMs, label, signal) => await new Promise((resolve, reject) => {
26
+ const timer = setTimeout(() => {
27
+ cleanup();
28
+ reject(new Error(`${label} timed out after ${timeoutMs}ms`));
29
+ }, timeoutMs);
30
+ const handleAbort = () => {
31
+ cleanup();
32
+ reject(new Error(`${label} cancelled`));
33
+ };
34
+ const cleanup = () => {
35
+ clearTimeout(timer);
36
+ signal?.removeEventListener?.("abort", handleAbort);
37
+ };
38
+ if (signal?.aborted) {
39
+ handleAbort();
40
+ return;
41
+ }
42
+ signal?.addEventListener?.("abort", handleAbort, { once: true });
43
+ task.then((value) => {
44
+ cleanup();
45
+ resolve(value);
46
+ }, (error) => {
47
+ cleanup();
48
+ reject(error);
49
+ });
50
+ });
51
+ exports.withAbortAndTimeout = withAbortAndTimeout;
52
+ //# sourceMappingURL=abort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort.js","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/abort.ts"],"names":[],"mappings":";AAAA,mEAAmE;AACnE,qFAAqF;AACrF,yEAAyE;AACzE,uEAAuE;AACvE,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AACxE,uEAAuE;AACvE,2DAA2D;;;AAIpD,MAAM,kBAAkB,GAAG,CAChC,MAAmC,EACnC,OAAmB,EACL,EAAE;IAChB,IAAI,CAAC,MAAM,EAAE,gBAAgB,IAAI,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC;QAC9D,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IACzB,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;QACV,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IACzB,CAAC;IACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC,CAAC;AAbW,QAAA,kBAAkB,sBAa7B;AAEK,MAAM,mBAAmB,GAAG,KAAK,EACtC,IAAgB,EAChB,SAAiB,EACjB,KAAa,EACb,MAAwB,EACZ,EAAE,CACd,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,SAAS,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC,EAAE,SAAS,CAAC,CAAC;IAEd,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,EAAE,mBAAmB,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC,CAAC;IAEF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,WAAW,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,MAAM,EAAE,gBAAgB,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,CACP,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;QACjB,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAtCQ,QAAA,mBAAmB,uBAsC3B"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ // Build a human-readable failure message from a request executor's outcome.
3
+ // Lifted from p_man_backend/src/modules/scenario-runner/adapters/runtime-adapters.ts
4
+ // (createFailureMessage, line 415). Pure function — same priority order as
5
+ // the backend's current behavior; renderer-side variant collapses into the
6
+ // same logic post-unification.
7
+ //
8
+ // Priority: response error → response.ok=false → first FAIL test → first
9
+ // FAIL contract → null (success).
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.summarizeContractResults = exports.buildRequestFailureMessage = void 0;
12
+ const buildRequestFailureMessage = ({ response, postResponseError, testsError, testResults, contractResults, }) => {
13
+ // Backend's current behavior elevates explicit script errors above
14
+ // response/contract failures so the operator sees the root cause first.
15
+ if (postResponseError?.message) {
16
+ return `Post-response script failed: ${postResponseError.message}`;
17
+ }
18
+ if (testsError?.message) {
19
+ return `Tests script failed: ${testsError.message}`;
20
+ }
21
+ if (!response.ok || response.errorMessage) {
22
+ if (response.errorMessage?.trim()) {
23
+ return response.errorMessage;
24
+ }
25
+ if (response.status > 0) {
26
+ return `Request failed with status ${response.status}`;
27
+ }
28
+ return "Request execution failed.";
29
+ }
30
+ const failedTest = testResults.find((entry) => entry.status === "FAIL");
31
+ if (failedTest) {
32
+ return failedTest.error
33
+ ? `Script test failed: ${failedTest.name} (${failedTest.error})`
34
+ : `Script test failed: ${failedTest.name}`;
35
+ }
36
+ const failedContract = contractResults.find((entry) => entry?.status === "FAIL");
37
+ if (failedContract) {
38
+ return failedContract.message
39
+ ? `Contract validation failed: ${failedContract.message}`
40
+ : "Contract validation failed.";
41
+ }
42
+ return null;
43
+ };
44
+ exports.buildRequestFailureMessage = buildRequestFailureMessage;
45
+ // Convenience helper for callers that want the contract counts in one go.
46
+ const summarizeContractResults = (contractResults) => {
47
+ let passed = 0;
48
+ let failed = 0;
49
+ let skipped = 0;
50
+ for (const entry of contractResults) {
51
+ if (entry?.status === "PASS") {
52
+ passed += 1;
53
+ }
54
+ else if (entry?.status === "FAIL") {
55
+ failed += 1;
56
+ }
57
+ else if (entry?.status === "SKIP") {
58
+ skipped += 1;
59
+ }
60
+ }
61
+ return {
62
+ total: contractResults.length,
63
+ passed,
64
+ failed,
65
+ skipped,
66
+ };
67
+ };
68
+ exports.summarizeContractResults = summarizeContractResults;
69
+ //# sourceMappingURL=failure-messages.js.map