callman-core 1.4.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 (43) 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/templating/counter-store.d.ts +7 -0
  6. package/dist/templating/counter-store.d.ts.map +1 -0
  7. package/dist/templating/counter-store.js +64 -0
  8. package/dist/templating/counter-store.js.map +1 -0
  9. package/dist/templating/generator-metadata.d.ts +5 -0
  10. package/dist/templating/generator-metadata.d.ts.map +1 -0
  11. package/dist/templating/generator-metadata.js +102 -0
  12. package/dist/templating/generator-metadata.js.map +1 -0
  13. package/dist/templating/index.d.ts +6 -0
  14. package/dist/templating/index.d.ts.map +1 -0
  15. package/dist/templating/index.js +11 -0
  16. package/dist/templating/index.js.map +1 -0
  17. package/dist/templating/random-generators.d.ts +10 -0
  18. package/dist/templating/random-generators.d.ts.map +1 -0
  19. package/dist/templating/random-generators.js +16 -0
  20. package/dist/templating/random-generators.js.map +1 -0
  21. package/dist/templating/template-engine.d.ts +14 -0
  22. package/dist/templating/template-engine.d.ts.map +1 -0
  23. package/dist/templating/template-engine.js +148 -0
  24. package/dist/templating/template-engine.js.map +1 -0
  25. package/dist/templating/types.d.ts +22 -0
  26. package/dist/templating/types.d.ts.map +1 -0
  27. package/dist/templating/types.js +10 -0
  28. package/dist/templating/types.js.map +1 -0
  29. package/dist-cjs/index.js +2 -4
  30. package/dist-cjs/index.js.map +1 -1
  31. package/dist-cjs/templating/counter-store.js +72 -0
  32. package/dist-cjs/templating/counter-store.js.map +1 -0
  33. package/dist-cjs/templating/generator-metadata.js +105 -0
  34. package/dist-cjs/templating/generator-metadata.js.map +1 -0
  35. package/dist-cjs/templating/index.js +35 -0
  36. package/dist-cjs/templating/index.js.map +1 -0
  37. package/dist-cjs/templating/random-generators.js +28 -0
  38. package/dist-cjs/templating/random-generators.js.map +1 -0
  39. package/dist-cjs/templating/template-engine.js +155 -0
  40. package/dist-cjs/templating/template-engine.js.map +1 -0
  41. package/dist-cjs/templating/types.js +11 -0
  42. package/dist-cjs/templating/types.js.map +1 -0
  43. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -2,8 +2,8 @@ export { runCollection } from "./runner/runCollection.js";
2
2
  export { runRequest } from "./runner/requestRunner.js";
3
3
  export { executeRequest } from "./request/executeRequest.js";
4
4
  export { EnvStore } from "./variables/envStore.js";
5
- export { resolveTemplate, resolveTemplateValue } from "./variables/resolver.js";
6
5
  export { runScript } from "./script/legacy.js";
6
+ export * from "./templating/index.js";
7
7
  export { executeScript, validateScript } from "./script/executor.js";
8
8
  export type { CounterSnapshotEntry, ExecuteScriptInput, ExecuteScriptResult, ScriptCapabilities, ScriptCounterCapability, ScriptDbCapability, ScriptDbExecutionInput, ScriptDbExecutionResult, ScriptError, ScriptFeaturePolicy, ScriptKafkaCapability, ScriptKeyValuePair, ScriptLogEntry, ScriptRedisCapability, ScriptRequestBodyState, ScriptRequestState, ScriptResponseState, ScriptStage, ScriptTestResult, ScriptVariableMutation, } from "./script/types.js";
9
9
  export { PmAssertion, createExpectApi } from "./script/features/assertions.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -2,8 +2,8 @@ export { runCollection } from "./runner/runCollection.js";
2
2
  export { runRequest } from "./runner/requestRunner.js";
3
3
  export { executeRequest } from "./request/executeRequest.js";
4
4
  export { EnvStore } from "./variables/envStore.js";
5
- export { resolveTemplate, resolveTemplateValue } from "./variables/resolver.js";
6
5
  export { runScript } from "./script/legacy.js";
6
+ export * from "./templating/index.js";
7
7
  export { executeScript, validateScript } from "./script/executor.js";
8
8
  export { PmAssertion, createExpectApi } from "./script/features/assertions.js";
9
9
  export { PendingKafkaDependencyError, isPendingKafkaValue, } from "./script/features/kafka.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAuBrE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAuBrE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { CounterSnapshotEntry, CounterStore } from "./types.js";
2
+ export declare const createCounterStore: (initialSnapshot?: CounterSnapshotEntry[]) => CounterStore;
3
+ export declare const getNextCounterValue: (key: string, startAt?: number) => number;
4
+ export declare const resetCounterValue: (key: string) => void;
5
+ export declare const getCounterSnapshot: () => CounterSnapshotEntry[];
6
+ export declare const hydrateCounterStore: (snapshot: CounterSnapshotEntry[]) => void;
7
+ //# sourceMappingURL=counter-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counter-store.d.ts","sourceRoot":"","sources":["../../src/templating/counter-store.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAoCrE,eAAO,MAAM,kBAAkB,GAC7B,kBAAiB,oBAAoB,EAAO,KAC3C,YAgBF,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,EAAE,gBAAW,KAAG,MACtB,CAAC;AAE1C,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,IAE/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,oBAAoB,EACjC,CAAC;AAE1B,eAAO,MAAM,mBAAmB,GAAI,UAAU,oBAAoB,EAAE,KAAG,IAEtE,CAAC"}
@@ -0,0 +1,64 @@
1
+ // Counter store for the Postman-style template engine.
2
+ //
3
+ // Two access modes:
4
+ // 1. `createCounterStore()` — fresh instance with snapshot/hydrate API.
5
+ // Hosts that need explicit lifecycle control (electron Node singleton
6
+ // with IPC snapshot transfer to renderer) construct their own.
7
+ // 2. Module-level default singleton via `getNextCounterValue` /
8
+ // `getCounterSnapshot` / `hydrateCounterStore` — convenient default
9
+ // shared across calls in the same process.
10
+ //
11
+ // Both modes use identical advance semantics: `counter` and
12
+ // `counter.start:N` are independent keys; missing key returns the
13
+ // requested startAt; subsequent calls increment.
14
+ const advance = (store, key, startAt) => {
15
+ const normalizedStartAt = Number.isFinite(startAt) ? Math.trunc(startAt) : 1;
16
+ if (!store.has(key)) {
17
+ store.set(key, normalizedStartAt);
18
+ return normalizedStartAt;
19
+ }
20
+ const next = (store.get(key) ?? normalizedStartAt) + 1;
21
+ store.set(key, next);
22
+ return next;
23
+ };
24
+ const hydrateStore = (store, snapshot) => {
25
+ store.clear();
26
+ for (const entry of snapshot) {
27
+ if (!Array.isArray(entry) || entry.length !== 2) {
28
+ continue;
29
+ }
30
+ const [key, value] = entry;
31
+ const normalizedKey = String(key ?? "").trim();
32
+ const normalizedValue = Number(value);
33
+ if (!normalizedKey || !Number.isFinite(normalizedValue)) {
34
+ continue;
35
+ }
36
+ store.set(normalizedKey, Math.trunc(normalizedValue));
37
+ }
38
+ };
39
+ export const createCounterStore = (initialSnapshot = []) => {
40
+ const store = new Map();
41
+ hydrateStore(store, initialSnapshot);
42
+ return {
43
+ getNextValue: (key, startAt = 1) => advance(store, key, startAt),
44
+ snapshot: () => Array.from(store.entries()),
45
+ hydrate: (snapshot) => hydrateStore(store, snapshot),
46
+ reset: (key) => {
47
+ if (key === undefined) {
48
+ store.clear();
49
+ return;
50
+ }
51
+ store.delete(key);
52
+ },
53
+ };
54
+ };
55
+ const defaultStore = createCounterStore();
56
+ export const getNextCounterValue = (key, startAt = 1) => defaultStore.getNextValue(key, startAt);
57
+ export const resetCounterValue = (key) => {
58
+ defaultStore.reset(key);
59
+ };
60
+ export const getCounterSnapshot = () => defaultStore.snapshot();
61
+ export const hydrateCounterStore = (snapshot) => {
62
+ defaultStore.hydrate(snapshot);
63
+ };
64
+ //# sourceMappingURL=counter-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counter-store.js","sourceRoot":"","sources":["../../src/templating/counter-store.ts"],"names":[],"mappings":"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"}
@@ -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,72 @@
1
+ "use strict";
2
+ // Counter store for the Postman-style template engine.
3
+ //
4
+ // Two access modes:
5
+ // 1. `createCounterStore()` — fresh instance with snapshot/hydrate API.
6
+ // Hosts that need explicit lifecycle control (electron Node singleton
7
+ // with IPC snapshot transfer to renderer) construct their own.
8
+ // 2. Module-level default singleton via `getNextCounterValue` /
9
+ // `getCounterSnapshot` / `hydrateCounterStore` — convenient default
10
+ // shared across calls in the same process.
11
+ //
12
+ // Both modes use identical advance semantics: `counter` and
13
+ // `counter.start:N` are independent keys; missing key returns the
14
+ // requested startAt; subsequent calls increment.
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.hydrateCounterStore = exports.getCounterSnapshot = exports.resetCounterValue = exports.getNextCounterValue = exports.createCounterStore = void 0;
17
+ const advance = (store, key, startAt) => {
18
+ const normalizedStartAt = Number.isFinite(startAt) ? Math.trunc(startAt) : 1;
19
+ if (!store.has(key)) {
20
+ store.set(key, normalizedStartAt);
21
+ return normalizedStartAt;
22
+ }
23
+ const next = (store.get(key) ?? normalizedStartAt) + 1;
24
+ store.set(key, next);
25
+ return next;
26
+ };
27
+ const hydrateStore = (store, snapshot) => {
28
+ store.clear();
29
+ for (const entry of snapshot) {
30
+ if (!Array.isArray(entry) || entry.length !== 2) {
31
+ continue;
32
+ }
33
+ const [key, value] = entry;
34
+ const normalizedKey = String(key ?? "").trim();
35
+ const normalizedValue = Number(value);
36
+ if (!normalizedKey || !Number.isFinite(normalizedValue)) {
37
+ continue;
38
+ }
39
+ store.set(normalizedKey, Math.trunc(normalizedValue));
40
+ }
41
+ };
42
+ const createCounterStore = (initialSnapshot = []) => {
43
+ const store = new Map();
44
+ hydrateStore(store, initialSnapshot);
45
+ return {
46
+ getNextValue: (key, startAt = 1) => advance(store, key, startAt),
47
+ snapshot: () => Array.from(store.entries()),
48
+ hydrate: (snapshot) => hydrateStore(store, snapshot),
49
+ reset: (key) => {
50
+ if (key === undefined) {
51
+ store.clear();
52
+ return;
53
+ }
54
+ store.delete(key);
55
+ },
56
+ };
57
+ };
58
+ exports.createCounterStore = createCounterStore;
59
+ const defaultStore = (0, exports.createCounterStore)();
60
+ const getNextCounterValue = (key, startAt = 1) => defaultStore.getNextValue(key, startAt);
61
+ exports.getNextCounterValue = getNextCounterValue;
62
+ const resetCounterValue = (key) => {
63
+ defaultStore.reset(key);
64
+ };
65
+ exports.resetCounterValue = resetCounterValue;
66
+ const getCounterSnapshot = () => defaultStore.snapshot();
67
+ exports.getCounterSnapshot = getCounterSnapshot;
68
+ const hydrateCounterStore = (snapshot) => {
69
+ defaultStore.hydrate(snapshot);
70
+ };
71
+ exports.hydrateCounterStore = hydrateCounterStore;
72
+ //# sourceMappingURL=counter-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counter-store.js","sourceRoot":"","sources":["../../src/templating/counter-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ // Generator suggestion metadata — single source of truth for the UI
3
+ // autocomplete + the runtime resolver. Both must agree on what generators
4
+ // exist; previously the data lived only in the renderer's
5
+ // `randomGenerators.ts` while the runtime path used a separate switch
6
+ // statement, allowing UI to suggest generators the runtime didn't ship.
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.TEMPLATE_GENERATOR_METADATA = exports.COUNTER_GENERATOR_METADATA = exports.RANDOM_GENERATOR_METADATA = void 0;
9
+ exports.RANDOM_GENERATOR_METADATA = [
10
+ {
11
+ name: "random.email",
12
+ label: "email",
13
+ insertText: "random.email",
14
+ detail: "Random email address",
15
+ preview: "sam.user42@example.com",
16
+ kind: "generator",
17
+ },
18
+ {
19
+ name: "random.string",
20
+ label: "string",
21
+ insertText: "random.string",
22
+ detail: "Random alphanumeric string",
23
+ preview: "aZ19xPq20LmN",
24
+ kind: "generator",
25
+ },
26
+ {
27
+ name: "random.uuid",
28
+ label: "uuid",
29
+ insertText: "random.uuid",
30
+ detail: "Random UUID v4",
31
+ preview: "1d7fe6b6-6f47-4fa9-b57a-d2e1d285be51",
32
+ kind: "generator",
33
+ },
34
+ {
35
+ name: "random.int",
36
+ label: "int",
37
+ insertText: "random.int",
38
+ detail: "Random integer",
39
+ preview: "48291",
40
+ kind: "generator",
41
+ },
42
+ {
43
+ name: "random.bigdecimal",
44
+ label: "bigdecimal",
45
+ insertText: "random.bigdecimal",
46
+ detail: "Random decimal number",
47
+ preview: "1842.552190",
48
+ kind: "generator",
49
+ },
50
+ {
51
+ name: "random.boolean",
52
+ label: "boolean",
53
+ insertText: "random.boolean",
54
+ detail: "Random boolean",
55
+ preview: "true",
56
+ kind: "generator",
57
+ },
58
+ {
59
+ name: "random.phone",
60
+ label: "phone",
61
+ insertText: "random.phone",
62
+ detail: "Random phone number",
63
+ preview: "+15558675309",
64
+ kind: "generator",
65
+ },
66
+ {
67
+ name: "random.date",
68
+ label: "date",
69
+ insertText: 'random.date("YYYY-MM-DD")',
70
+ detail: "Random date",
71
+ preview: "2026-04-06",
72
+ kind: "generator",
73
+ },
74
+ {
75
+ name: "random.name",
76
+ label: "name",
77
+ insertText: "random.name",
78
+ detail: "Random human name",
79
+ preview: "Aylin Karimli",
80
+ kind: "generator",
81
+ },
82
+ ];
83
+ exports.COUNTER_GENERATOR_METADATA = [
84
+ {
85
+ name: "counter",
86
+ label: "counter",
87
+ insertText: "counter",
88
+ detail: "Incrementing counter per request",
89
+ preview: "1, 2, 3...",
90
+ kind: "counter",
91
+ },
92
+ {
93
+ name: "counter.start(100)",
94
+ label: "counter.start(100)",
95
+ insertText: "counter.start(100)",
96
+ detail: "Counter starting at 100",
97
+ preview: "100, 101, 102...",
98
+ kind: "counter",
99
+ },
100
+ ];
101
+ exports.TEMPLATE_GENERATOR_METADATA = [
102
+ ...exports.RANDOM_GENERATOR_METADATA,
103
+ ...exports.COUNTER_GENERATOR_METADATA,
104
+ ];
105
+ //# 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;;;AAI3D,QAAA,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;AAEW,QAAA,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;AAEW,QAAA,2BAA2B,GAA4B;IAClE,GAAG,iCAAyB;IAC5B,GAAG,kCAA0B;CAC9B,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ // Public surface for the Postman-style template engine.
3
+ //
4
+ // Domain: collection runner + single-request templating tokens
5
+ // (`{{varname}}`, `{{random.uuid()}}`, `{{counter.start(N)}}`). Scenario
6
+ // runtime data substitution lives in `scenario-runner/templateResolver.ts`
7
+ // — a separate API axis with pre-flattened values and condition support.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TEMPLATE_GENERATOR_METADATA = exports.COUNTER_GENERATOR_METADATA = exports.RANDOM_GENERATOR_METADATA = exports.hydrateCounterStore = exports.getCounterSnapshot = exports.resetCounterValue = exports.getNextCounterValue = exports.createCounterStore = exports.generateRandomName = exports.generateRandomDate = exports.generateRandomPhone = exports.generateRandomBoolean = exports.generateRandomBigDecimal = exports.generateRandomInt = exports.generateRandomEmail = exports.generateRandomString = exports.generateRandomUuid = exports.resolveTemplateKeyValuePairs = exports.resolveTemplate = exports.createTemplateRuntimeContext = exports.parseTemplateArguments = void 0;
10
+ var template_engine_js_1 = require("./template-engine.js");
11
+ Object.defineProperty(exports, "parseTemplateArguments", { enumerable: true, get: function () { return template_engine_js_1.parseTemplateArguments; } });
12
+ Object.defineProperty(exports, "createTemplateRuntimeContext", { enumerable: true, get: function () { return template_engine_js_1.createTemplateRuntimeContext; } });
13
+ Object.defineProperty(exports, "resolveTemplate", { enumerable: true, get: function () { return template_engine_js_1.resolveTemplate; } });
14
+ Object.defineProperty(exports, "resolveTemplateKeyValuePairs", { enumerable: true, get: function () { return template_engine_js_1.resolveTemplateKeyValuePairs; } });
15
+ var random_generators_js_1 = require("./random-generators.js");
16
+ Object.defineProperty(exports, "generateRandomUuid", { enumerable: true, get: function () { return random_generators_js_1.generateRandomUuid; } });
17
+ Object.defineProperty(exports, "generateRandomString", { enumerable: true, get: function () { return random_generators_js_1.generateRandomString; } });
18
+ Object.defineProperty(exports, "generateRandomEmail", { enumerable: true, get: function () { return random_generators_js_1.generateRandomEmail; } });
19
+ Object.defineProperty(exports, "generateRandomInt", { enumerable: true, get: function () { return random_generators_js_1.generateRandomInt; } });
20
+ Object.defineProperty(exports, "generateRandomBigDecimal", { enumerable: true, get: function () { return random_generators_js_1.generateRandomBigDecimal; } });
21
+ Object.defineProperty(exports, "generateRandomBoolean", { enumerable: true, get: function () { return random_generators_js_1.generateRandomBoolean; } });
22
+ Object.defineProperty(exports, "generateRandomPhone", { enumerable: true, get: function () { return random_generators_js_1.generateRandomPhone; } });
23
+ Object.defineProperty(exports, "generateRandomDate", { enumerable: true, get: function () { return random_generators_js_1.generateRandomDate; } });
24
+ Object.defineProperty(exports, "generateRandomName", { enumerable: true, get: function () { return random_generators_js_1.generateRandomName; } });
25
+ var counter_store_js_1 = require("./counter-store.js");
26
+ Object.defineProperty(exports, "createCounterStore", { enumerable: true, get: function () { return counter_store_js_1.createCounterStore; } });
27
+ Object.defineProperty(exports, "getNextCounterValue", { enumerable: true, get: function () { return counter_store_js_1.getNextCounterValue; } });
28
+ Object.defineProperty(exports, "resetCounterValue", { enumerable: true, get: function () { return counter_store_js_1.resetCounterValue; } });
29
+ Object.defineProperty(exports, "getCounterSnapshot", { enumerable: true, get: function () { return counter_store_js_1.getCounterSnapshot; } });
30
+ Object.defineProperty(exports, "hydrateCounterStore", { enumerable: true, get: function () { return counter_store_js_1.hydrateCounterStore; } });
31
+ var generator_metadata_js_1 = require("./generator-metadata.js");
32
+ Object.defineProperty(exports, "RANDOM_GENERATOR_METADATA", { enumerable: true, get: function () { return generator_metadata_js_1.RANDOM_GENERATOR_METADATA; } });
33
+ Object.defineProperty(exports, "COUNTER_GENERATOR_METADATA", { enumerable: true, get: function () { return generator_metadata_js_1.COUNTER_GENERATOR_METADATA; } });
34
+ Object.defineProperty(exports, "TEMPLATE_GENERATOR_METADATA", { enumerable: true, get: function () { return generator_metadata_js_1.TEMPLATE_GENERATOR_METADATA; } });
35
+ //# 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,2DAK8B;AAJ5B,4HAAA,sBAAsB,OAAA;AACtB,kIAAA,4BAA4B,OAAA;AAC5B,qHAAA,eAAe,OAAA;AACf,kIAAA,4BAA4B,OAAA;AAG9B,+DAUgC;AAT9B,0HAAA,kBAAkB,OAAA;AAClB,4HAAA,oBAAoB,OAAA;AACpB,2HAAA,mBAAmB,OAAA;AACnB,yHAAA,iBAAiB,OAAA;AACjB,gIAAA,wBAAwB,OAAA;AACxB,6HAAA,qBAAqB,OAAA;AACrB,2HAAA,mBAAmB,OAAA;AACnB,0HAAA,kBAAkB,OAAA;AAClB,0HAAA,kBAAkB,OAAA;AAGpB,uDAM4B;AAL1B,sHAAA,kBAAkB,OAAA;AAClB,uHAAA,mBAAmB,OAAA;AACnB,qHAAA,iBAAiB,OAAA;AACjB,sHAAA,kBAAkB,OAAA;AAClB,uHAAA,mBAAmB,OAAA;AAGrB,iEAIiC;AAH/B,kIAAA,yBAAyB,OAAA;AACzB,mIAAA,0BAA0B,OAAA;AAC1B,oIAAA,2BAA2B,OAAA"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ // Standalone random generator functions consumed by the Postman-style
3
+ // template engine (`{{random.uuid()}}`, etc.). Internally backed by the
4
+ // canonical `buildRandomApi` so script sandbox (`pm.random.*`) and
5
+ // template engine share one implementation — no drift between the two.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.generateRandomName = exports.generateRandomDate = exports.generateRandomPhone = exports.generateRandomBoolean = exports.generateRandomBigDecimal = exports.generateRandomInt = exports.generateRandomEmail = exports.generateRandomString = exports.generateRandomUuid = void 0;
8
+ const random_js_1 = require("../script/features/random.js");
9
+ const defaultApi = (0, random_js_1.buildRandomApi)();
10
+ const generateRandomUuid = () => defaultApi.uuid();
11
+ exports.generateRandomUuid = generateRandomUuid;
12
+ const generateRandomString = (length = 12) => defaultApi.string(length);
13
+ exports.generateRandomString = generateRandomString;
14
+ const generateRandomEmail = () => defaultApi.email();
15
+ exports.generateRandomEmail = generateRandomEmail;
16
+ const generateRandomInt = (min = 0, max = 999_999) => defaultApi.int(min, max);
17
+ exports.generateRandomInt = generateRandomInt;
18
+ const generateRandomBigDecimal = (min = 0, max = 100_000, scale = 6) => defaultApi.bigdecimal(min, max, scale);
19
+ exports.generateRandomBigDecimal = generateRandomBigDecimal;
20
+ const generateRandomBoolean = () => defaultApi.boolean();
21
+ exports.generateRandomBoolean = generateRandomBoolean;
22
+ const generateRandomPhone = () => defaultApi.phone();
23
+ exports.generateRandomPhone = generateRandomPhone;
24
+ const generateRandomDate = (format = "YYYY-MM-DD") => defaultApi.date(format);
25
+ exports.generateRandomDate = generateRandomDate;
26
+ const generateRandomName = () => defaultApi.name();
27
+ exports.generateRandomName = generateRandomName;
28
+ //# 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,4DAA8D;AAE9D,MAAM,UAAU,GAAG,IAAA,0BAAc,GAAE,CAAC;AAE7B,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAArD,QAAA,kBAAkB,sBAAmC;AAE3D,MAAM,oBAAoB,GAAG,CAAC,MAAM,GAAG,EAAE,EAAU,EAAE,CAC1D,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AADf,QAAA,oBAAoB,wBACL;AAErB,MAAM,mBAAmB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;AAAvD,QAAA,mBAAmB,uBAAoC;AAE7D,MAAM,iBAAiB,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,EAAU,EAAE,CAClE,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AADd,QAAA,iBAAiB,qBACH;AAEpB,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;AAJvC,QAAA,wBAAwB,4BAIe;AAE7C,MAAM,qBAAqB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;AAA3D,QAAA,qBAAqB,yBAAsC;AAEjE,MAAM,mBAAmB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;AAAvD,QAAA,mBAAmB,uBAAoC;AAE7D,MAAM,kBAAkB,GAAG,CAAC,MAAM,GAAG,YAAY,EAAU,EAAE,CAClE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AADb,QAAA,kBAAkB,sBACL;AAEnB,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAArD,QAAA,kBAAkB,sBAAmC"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ // Postman-style template engine — resolves `{{varname}}`,
3
+ // `{{random.<name>(...args)}}`, `{{counter}}` / `{{counter.start(N)}}`
4
+ // against a runtime context. Multi-pass loop (4 passes) enables nested
5
+ // resolution like `{{varname}}` whose value is itself `{{random.uuid()}}`.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.resolveTemplateKeyValuePairs = exports.resolveTemplate = exports.createTemplateRuntimeContext = exports.parseTemplateArguments = void 0;
8
+ const random_generators_js_1 = require("./random-generators.js");
9
+ const counter_store_js_1 = require("./counter-store.js");
10
+ const TEMPLATE_PATTERN = /\{\{\s*([^{}]+?)\s*\}\}/g;
11
+ const RANDOM_EXPRESSION_PATTERN = /^random\.([a-z]+)(?:\((.*)\))?$/i;
12
+ const COUNTER_START_PATTERN = /^counter\.start\((.*)\)$/i;
13
+ const MAX_TEMPLATE_PASSES = 4;
14
+ const stripWrappingQuotes = (value) => {
15
+ const trimmed = value.trim();
16
+ if (trimmed.length >= 2) {
17
+ const firstCharacter = trimmed[0];
18
+ const lastCharacter = trimmed[trimmed.length - 1];
19
+ if ((firstCharacter === `"` || firstCharacter === `'`) &&
20
+ firstCharacter === lastCharacter) {
21
+ return trimmed.slice(1, -1);
22
+ }
23
+ }
24
+ return trimmed;
25
+ };
26
+ const parseTemplateArguments = (input) => {
27
+ const args = [];
28
+ let current = "";
29
+ let quote = null;
30
+ let isEscaped = false;
31
+ for (const character of input) {
32
+ if (isEscaped) {
33
+ current += character;
34
+ isEscaped = false;
35
+ continue;
36
+ }
37
+ if (character === "\\") {
38
+ isEscaped = true;
39
+ continue;
40
+ }
41
+ if ((character === `"` || character === `'`) && quote === null) {
42
+ quote = character;
43
+ current += character;
44
+ continue;
45
+ }
46
+ if (quote !== null && character === quote) {
47
+ quote = null;
48
+ current += character;
49
+ continue;
50
+ }
51
+ if (character === "," && quote === null) {
52
+ args.push(stripWrappingQuotes(current));
53
+ current = "";
54
+ continue;
55
+ }
56
+ current += character;
57
+ }
58
+ if (current.trim() || input.endsWith(",")) {
59
+ args.push(stripWrappingQuotes(current));
60
+ }
61
+ return args.filter((argument) => argument.length > 0);
62
+ };
63
+ exports.parseTemplateArguments = parseTemplateArguments;
64
+ const toFiniteNumber = (value, fallback) => {
65
+ if (!value) {
66
+ return fallback;
67
+ }
68
+ const parsedValue = Number(value);
69
+ return Number.isFinite(parsedValue) ? parsedValue : fallback;
70
+ };
71
+ const resolveRandomExpression = (generatorName, args) => {
72
+ switch (generatorName.toLowerCase()) {
73
+ case "email":
74
+ return (0, random_generators_js_1.generateRandomEmail)();
75
+ case "string":
76
+ return (0, random_generators_js_1.generateRandomString)(toFiniteNumber(args[0], 12));
77
+ case "uuid":
78
+ return (0, random_generators_js_1.generateRandomUuid)();
79
+ case "int":
80
+ return (0, random_generators_js_1.generateRandomInt)(toFiniteNumber(args[0], 0), toFiniteNumber(args[1], 999_999));
81
+ case "bigdecimal":
82
+ return (0, random_generators_js_1.generateRandomBigDecimal)(toFiniteNumber(args[0], 0), toFiniteNumber(args[1], 100_000), toFiniteNumber(args[2], 6));
83
+ case "boolean":
84
+ return (0, random_generators_js_1.generateRandomBoolean)();
85
+ case "phone":
86
+ return (0, random_generators_js_1.generateRandomPhone)();
87
+ case "date":
88
+ return (0, random_generators_js_1.generateRandomDate)(args[0] || "YYYY-MM-DD");
89
+ case "name":
90
+ return (0, random_generators_js_1.generateRandomName)();
91
+ default:
92
+ return "";
93
+ }
94
+ };
95
+ const resolveCounterExpression = (expression, context) => {
96
+ if (context.requestCounterCache.has(expression)) {
97
+ return context.requestCounterCache.get(expression) ?? "";
98
+ }
99
+ const counterStartMatch = expression.match(COUNTER_START_PATTERN);
100
+ const startAt = counterStartMatch
101
+ ? toFiniteNumber((0, exports.parseTemplateArguments)(counterStartMatch[1] ?? "")[0], 1)
102
+ : 1;
103
+ const counterKey = counterStartMatch ? `counter.start:${startAt}` : "counter";
104
+ const advanceFn = context.counterStore
105
+ ? (key, start) => context.counterStore.getNextValue(key, start)
106
+ : counter_store_js_1.getNextCounterValue;
107
+ const nextValue = String(advanceFn(counterKey, startAt));
108
+ context.requestCounterCache.set(expression, nextValue);
109
+ return nextValue;
110
+ };
111
+ const resolveExpression = (expression, context) => {
112
+ const normalizedExpression = expression.trim();
113
+ if (!normalizedExpression) {
114
+ return "";
115
+ }
116
+ const randomMatch = normalizedExpression.match(RANDOM_EXPRESSION_PATTERN);
117
+ if (randomMatch) {
118
+ return resolveRandomExpression(randomMatch[1] ?? "", (0, exports.parseTemplateArguments)(randomMatch[2] ?? ""));
119
+ }
120
+ if (normalizedExpression === "counter" ||
121
+ COUNTER_START_PATTERN.test(normalizedExpression)) {
122
+ return resolveCounterExpression(normalizedExpression, context);
123
+ }
124
+ return context.environment[normalizedExpression] ?? "";
125
+ };
126
+ const resolveTemplatePass = (input, context) => input.replace(TEMPLATE_PATTERN, (_match, expression) => resolveExpression(expression, context));
127
+ const createTemplateRuntimeContext = (environment, options = {}) => ({
128
+ environment,
129
+ requestCounterCache: new Map(),
130
+ ...(options.counterStore ? { counterStore: options.counterStore } : {}),
131
+ });
132
+ exports.createTemplateRuntimeContext = createTemplateRuntimeContext;
133
+ const resolveTemplate = (input, context) => {
134
+ if (!input.includes("{{")) {
135
+ return input;
136
+ }
137
+ let currentValue = input;
138
+ for (let pass = 0; pass < MAX_TEMPLATE_PASSES; pass += 1) {
139
+ const nextValue = resolveTemplatePass(currentValue, context);
140
+ if (nextValue === currentValue || !nextValue.includes("{{")) {
141
+ return nextValue;
142
+ }
143
+ currentValue = nextValue;
144
+ }
145
+ return currentValue;
146
+ };
147
+ exports.resolveTemplate = resolveTemplate;
148
+ const resolveTemplateKeyValuePairs = (entries, context) => entries.map((entry) => ({
149
+ ...entry,
150
+ key: (0, exports.resolveTemplate)(entry.key, context),
151
+ value: (0, exports.resolveTemplate)(entry.value, context),
152
+ enabled: entry.enabled ?? true,
153
+ }));
154
+ exports.resolveTemplateKeyValuePairs = resolveTemplateKeyValuePairs;
155
+ //# 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,11 @@
1
+ "use strict";
2
+ // Postman-style template engine types — shared across runtime hosts
3
+ // (renderer, electron Node, future CLI/server).
4
+ //
5
+ // The engine is domain-agnostic: it resolves `{{varname}}`,
6
+ // `{{random.*}}`, `{{counter}}` / `{{counter.start(N)}}` tokens against
7
+ // a flat environment plus pluggable random + counter primitives. Scenario
8
+ // runtime templating (response/db/kafka substitution) is a separate
9
+ // module; see `scenario-runner/templateResolver.ts`.
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ //# 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "callman-core",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "main": "dist-cjs/index.js",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",