callman-core 1.0.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 (51) hide show
  1. package/dist/contract/contractValidator.d.ts +3 -0
  2. package/dist/contract/contractValidator.d.ts.map +1 -0
  3. package/dist/contract/contractValidator.js +232 -0
  4. package/dist/contract/contractValidator.js.map +1 -0
  5. package/dist/index.d.ts +9 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +9 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/request/executeRequest.d.ts +3 -0
  10. package/dist/request/executeRequest.d.ts.map +1 -0
  11. package/dist/request/executeRequest.js +26 -0
  12. package/dist/request/executeRequest.js.map +1 -0
  13. package/dist/runner/requestRunner.d.ts +3 -0
  14. package/dist/runner/requestRunner.d.ts.map +1 -0
  15. package/dist/runner/requestRunner.js +98 -0
  16. package/dist/runner/requestRunner.js.map +1 -0
  17. package/dist/runner/runCollection.d.ts +3 -0
  18. package/dist/runner/runCollection.d.ts.map +1 -0
  19. package/dist/runner/runCollection.js +48 -0
  20. package/dist/runner/runCollection.js.map +1 -0
  21. package/dist/script/pmApi.d.ts +88 -0
  22. package/dist/script/pmApi.d.ts.map +1 -0
  23. package/dist/script/pmApi.js +347 -0
  24. package/dist/script/pmApi.js.map +1 -0
  25. package/dist/script/scriptEngine.d.ts +3 -0
  26. package/dist/script/scriptEngine.d.ts.map +1 -0
  27. package/dist/script/scriptEngine.js +106 -0
  28. package/dist/script/scriptEngine.js.map +1 -0
  29. package/dist/types/index.d.ts +118 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/types/index.js +2 -0
  32. package/dist/types/index.js.map +1 -0
  33. package/dist/utils/get.d.ts +8 -0
  34. package/dist/utils/get.d.ts.map +1 -0
  35. package/dist/utils/get.js +46 -0
  36. package/dist/utils/get.js.map +1 -0
  37. package/dist/utils/random.d.ts +6 -0
  38. package/dist/utils/random.d.ts.map +1 -0
  39. package/dist/utils/random.js +79 -0
  40. package/dist/utils/random.js.map +1 -0
  41. package/dist/variables/envStore.d.ts +8 -0
  42. package/dist/variables/envStore.d.ts.map +1 -0
  43. package/dist/variables/envStore.js +20 -0
  44. package/dist/variables/envStore.js.map +1 -0
  45. package/dist/variables/resolver.d.ts +4 -0
  46. package/dist/variables/resolver.d.ts.map +1 -0
  47. package/dist/variables/resolver.js +90 -0
  48. package/dist/variables/resolver.js.map +1 -0
  49. package/package.json +17 -0
  50. package/samples/runSample.mjs +128 -0
  51. package/tsconfig.json +18 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/utils/get.ts"],"names":[],"mappings":"AAKA,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAY,EAAE;IAClD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAe,EAAE,IAAY,EAAiB,EAAE;IACtE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO;YACL,MAAM,EAAE,MAAM,KAAK,SAAS;YAC5B,KAAK,EAAE,MAAM;SACd,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,GAAG,MAAM,CAAC;IAE1B,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YACxD,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,SAAS;aACjB,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,YAAuC,CAAC;QAE1D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,SAAS;aACjB,CAAC;QACJ,CAAC;QAED,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,YAAY;KACpB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,MAAe,EACf,IAAY,EACZ,QAAY,EACC,EAAE;IACf,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjD,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const randomInt: (min?: number, max?: number) => number;
2
+ export declare const randomString: (length?: number) => string;
3
+ export declare const randomUuid: () => string;
4
+ export declare const randomDate: (format?: string) => string;
5
+ export declare const resolveRandom: (expression: string) => unknown;
6
+ //# sourceMappingURL=random.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../src/utils/random.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,SAAS,GAAI,YAAO,EAAE,YAAa,KAAG,MAIlD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,eAAW,KAAG,MAS1C,CAAC;AAEF,eAAO,MAAM,UAAU,QAAO,MAU7B,CAAC;AAKF,eAAO,MAAM,UAAU,GAAI,eAAqB,KAAG,MAkBlD,CAAC;AAWF,eAAO,MAAM,aAAa,GAAI,YAAY,MAAM,KAAG,OAqBlD,CAAC"}
@@ -0,0 +1,79 @@
1
+ const UUID_TEMPLATE = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
2
+ const ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
3
+ const getRandomNumber = () => {
4
+ const cryptoApi = globalThis.crypto;
5
+ if (cryptoApi?.getRandomValues) {
6
+ const values = new Uint32Array(1);
7
+ cryptoApi.getRandomValues(values);
8
+ return values[0] / 0xffffffff;
9
+ }
10
+ return Math.random();
11
+ };
12
+ export const randomInt = (min = 0, max = 999_999) => {
13
+ const normalizedMin = Math.ceil(Math.min(min, max));
14
+ const normalizedMax = Math.floor(Math.max(min, max));
15
+ return Math.floor(getRandomNumber() * (normalizedMax - normalizedMin + 1)) + normalizedMin;
16
+ };
17
+ export const randomString = (length = 12) => {
18
+ const normalizedLength = Math.max(1, Math.min(128, Math.trunc(length)));
19
+ let output = "";
20
+ for (let index = 0; index < normalizedLength; index += 1) {
21
+ output += ALPHABET[randomInt(0, ALPHABET.length - 1)];
22
+ }
23
+ return output;
24
+ };
25
+ export const randomUuid = () => {
26
+ if (globalThis.crypto?.randomUUID) {
27
+ return globalThis.crypto.randomUUID();
28
+ }
29
+ return UUID_TEMPLATE.replace(/[xy]/g, (token) => {
30
+ const value = Math.floor(getRandomNumber() * 16);
31
+ const resolvedValue = token === "x" ? value : (value & 0x3) | 0x8;
32
+ return resolvedValue.toString(16);
33
+ });
34
+ };
35
+ const pad = (value, length = 2) => String(value).padStart(length, "0");
36
+ export const randomDate = (format = "YYYY-MM-DD") => {
37
+ const date = new Date(Date.now() + randomInt(-365, 365) * 24 * 60 * 60 * 1000);
38
+ const timezoneOffsetMinutes = -date.getTimezoneOffset();
39
+ const timezoneSign = timezoneOffsetMinutes >= 0 ? "+" : "-";
40
+ const timezoneHours = Math.floor(Math.abs(timezoneOffsetMinutes) / 60);
41
+ const timezoneMinutes = Math.abs(timezoneOffsetMinutes) % 60;
42
+ return format
43
+ .replace(/YYYY/g, String(date.getFullYear()))
44
+ .replace(/MM/g, pad(date.getMonth() + 1))
45
+ .replace(/DD/g, pad(date.getDate()))
46
+ .replace(/HH/g, pad(date.getHours()))
47
+ .replace(/mm/g, pad(date.getMinutes()))
48
+ .replace(/ss/g, pad(date.getSeconds()))
49
+ .replace(/SSS/g, pad(date.getMilliseconds(), 3))
50
+ .replace(/Z/g, `${timezoneSign}${pad(timezoneHours)}:${pad(timezoneMinutes)}`);
51
+ };
52
+ const toFiniteNumber = (value, fallback) => {
53
+ if (value === undefined || value === "") {
54
+ return fallback;
55
+ }
56
+ const parsedValue = Number(value);
57
+ return Number.isFinite(parsedValue) ? parsedValue : fallback;
58
+ };
59
+ export const resolveRandom = (expression) => {
60
+ const normalizedExpression = expression.trim();
61
+ const [, generator = "", rawArgs = ""] = normalizedExpression.match(/^random\.([a-z]+)(?:\((.*)\))?$/i) ?? [];
62
+ const args = rawArgs
63
+ .split(",")
64
+ .map((entry) => entry.trim().replace(/^['"]|['"]$/g, ""))
65
+ .filter(Boolean);
66
+ switch (generator.toLowerCase()) {
67
+ case "uuid":
68
+ return randomUuid();
69
+ case "string":
70
+ return randomString(toFiniteNumber(args[0], 12));
71
+ case "int":
72
+ return randomInt(toFiniteNumber(args[0], 0), toFiniteNumber(args[1], 999_999));
73
+ case "date":
74
+ return randomDate(args[0] || "YYYY-MM-DD");
75
+ default:
76
+ return "";
77
+ }
78
+ };
79
+ //# sourceMappingURL=random.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/utils/random.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,sCAAsC,CAAC;AAC7D,MAAM,QAAQ,GAAG,gEAAgE,CAAC;AAElF,MAAM,eAAe,GAAG,GAAW,EAAE;IACnC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;IAEpC,IAAI,SAAS,EAAE,eAAe,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,EAAU,EAAE;IAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;AAC7F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,GAAG,EAAE,EAAU,EAAE;IAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,gBAAgB,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAW,EAAE;IACrC,IAAI,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QAClC,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IACxC,CAAC;IAED,OAAO,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM,aAAa,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAClE,OAAO,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,MAAM,GAAG,CAAC,EAAU,EAAE,CAChD,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,YAAY,EAAU,EAAE;IAC1D,MAAM,IAAI,GAAG,IAAI,IAAI,CACnB,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CACxD,CAAC;IACF,MAAM,qBAAqB,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,qBAAqB,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC;IAE7D,OAAO,MAAM;SACV,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;SAC5C,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;SACxC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;SACnC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;SACpC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;SACtC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;SACtC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;SAC/C,OAAO,CAAC,IAAI,EAAE,GAAG,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAyB,EAAE,QAAgB,EAAU,EAAE;IAC7E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAW,EAAE;IAC3D,MAAM,oBAAoB,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,CAAC,GACpC,oBAAoB,CAAC,KAAK,CAAC,kCAAkC,CAAC,IAAI,EAAE,CAAC;IACvE,MAAM,IAAI,GAAG,OAAO;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;SACxD,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,QAAQ,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,MAAM;YACT,OAAO,UAAU,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACnD,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACjF,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC;QAC7C;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare class EnvStore {
2
+ private store;
3
+ constructor(initial?: Record<string, any>);
4
+ get(key: string): any;
5
+ set(key: string, value: any): void;
6
+ all(): Record<string, any>;
7
+ }
8
+ //# sourceMappingURL=envStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envStore.d.ts","sourceRoot":"","sources":["../../src/variables/envStore.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAsB;gBAEvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG;IAIrB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAUlC,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAG3B"}
@@ -0,0 +1,20 @@
1
+ export class EnvStore {
2
+ store;
3
+ constructor(initial) {
4
+ this.store = initial ?? {};
5
+ }
6
+ get(key) {
7
+ return this.store[key];
8
+ }
9
+ set(key, value) {
10
+ const normalizedKey = key.trim();
11
+ if (!normalizedKey) {
12
+ return;
13
+ }
14
+ this.store[normalizedKey] = value;
15
+ }
16
+ all() {
17
+ return { ...this.store };
18
+ }
19
+ }
20
+ //# sourceMappingURL=envStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envStore.js","sourceRoot":"","sources":["../../src/variables/envStore.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAQ;IACX,KAAK,CAAsB;IAEnC,YAAY,OAA6B;QACvC,IAAI,CAAC,KAAK,GAAG,OAAO,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAU;QACzB,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;IACpC,CAAC;IAED,GAAG;QACD,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { ResolveTemplateContext } from "../types/index.js";
2
+ export declare const resolveTemplate: (template: string, context: ResolveTemplateContext) => string;
3
+ export declare const resolveTemplateValue: <T>(value: T, context: ResolveTemplateContext) => T;
4
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/variables/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AA4FhE,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,SAAS,sBAAsB,KAC9B,MAqBF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,OAAO,CAAC,EACR,SAAS,sBAAsB,KAC9B,CAmBF,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { safeGet } from "../utils/get.js";
2
+ import { resolveRandom } from "../utils/random.js";
3
+ import { EnvStore } from "./envStore.js";
4
+ const TEMPLATE_PATTERN = /\{\{\s*([^{}]+?)\s*\}\}/g;
5
+ const MAX_TEMPLATE_PASSES = 4;
6
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
7
+ const readEnvValue = (env, key) => {
8
+ if (!env) {
9
+ return {
10
+ exists: false,
11
+ value: undefined,
12
+ };
13
+ }
14
+ if (env instanceof EnvStore) {
15
+ const values = env.all();
16
+ return safeGet(values, key);
17
+ }
18
+ return safeGet(env, key);
19
+ };
20
+ const stringifyTemplateValue = (value) => {
21
+ if (value === undefined || value === null) {
22
+ return "";
23
+ }
24
+ if (typeof value === "string") {
25
+ return value;
26
+ }
27
+ if (typeof value === "number" || typeof value === "boolean") {
28
+ return String(value);
29
+ }
30
+ try {
31
+ return JSON.stringify(value);
32
+ }
33
+ catch {
34
+ return String(value);
35
+ }
36
+ };
37
+ const resolveExpression = (expression, context) => {
38
+ const normalizedExpression = expression.trim();
39
+ if (!normalizedExpression) {
40
+ return "";
41
+ }
42
+ if (normalizedExpression.startsWith("random.")) {
43
+ return stringifyTemplateValue(resolveRandom(normalizedExpression));
44
+ }
45
+ if (normalizedExpression.startsWith("env.")) {
46
+ return stringifyTemplateValue(readEnvValue(context.env, normalizedExpression.slice("env.".length)).value);
47
+ }
48
+ if (normalizedExpression.startsWith("response.")) {
49
+ return stringifyTemplateValue(safeGet(context.response, normalizedExpression.slice("response.".length)).value);
50
+ }
51
+ if (normalizedExpression.startsWith("request.")) {
52
+ return stringifyTemplateValue(safeGet(context.request, normalizedExpression.slice("request.".length)).value);
53
+ }
54
+ const scopedValue = safeGet(context, normalizedExpression);
55
+ if (scopedValue.exists) {
56
+ return stringifyTemplateValue(scopedValue.value);
57
+ }
58
+ const envValue = readEnvValue(context.env, normalizedExpression);
59
+ return stringifyTemplateValue(envValue.value);
60
+ };
61
+ export const resolveTemplate = (template, context) => {
62
+ if (!template.includes("{{")) {
63
+ return template;
64
+ }
65
+ let currentValue = template;
66
+ for (let pass = 0; pass < MAX_TEMPLATE_PASSES; pass += 1) {
67
+ const nextValue = currentValue.replace(TEMPLATE_PATTERN, (_match, expression) => resolveExpression(expression, context));
68
+ if (nextValue === currentValue || !nextValue.includes("{{")) {
69
+ return nextValue;
70
+ }
71
+ currentValue = nextValue;
72
+ }
73
+ return currentValue;
74
+ };
75
+ export const resolveTemplateValue = (value, context) => {
76
+ if (typeof value === "string") {
77
+ return resolveTemplate(value, context);
78
+ }
79
+ if (Array.isArray(value)) {
80
+ return value.map((entry) => resolveTemplateValue(entry, context));
81
+ }
82
+ if (isRecord(value)) {
83
+ return Object.fromEntries(Object.entries(value).map(([key, entryValue]) => [
84
+ resolveTemplate(key, context),
85
+ resolveTemplateValue(entryValue, context),
86
+ ]));
87
+ }
88
+ return value;
89
+ };
90
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/variables/resolver.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "callman-core",
3
+ "version": "1.0.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "type": "module",
7
+ "scripts": {
8
+ "build": "tsc -p tsconfig.json",
9
+ "sample": "node samples/runSample.mjs"
10
+ },
11
+ "dependencies": {
12
+ "axios": "^1.6.0"
13
+ },
14
+ "devDependencies": {
15
+ "typescript": "^5.7.2"
16
+ }
17
+ }
@@ -0,0 +1,128 @@
1
+ import { createServer } from "node:http";
2
+ import { EnvStore, runCollection } from "../dist/index.js";
3
+
4
+ const readRequestBody = (request) =>
5
+ new Promise((resolve) => {
6
+ const chunks = [];
7
+
8
+ request.on("data", (chunk) => {
9
+ chunks.push(chunk);
10
+ });
11
+
12
+ request.on("end", () => {
13
+ resolve(Buffer.concat(chunks).toString("utf8"));
14
+ });
15
+ });
16
+
17
+ const server = createServer(async (request, response) => {
18
+ response.setHeader("content-type", "application/json");
19
+
20
+ if (request.url === "/users" && request.method === "POST") {
21
+ const rawBody = await readRequestBody(request);
22
+ const body = rawBody ? JSON.parse(rawBody) : {};
23
+
24
+ response.end(
25
+ JSON.stringify({
26
+ id: "usr_123",
27
+ name: body.name,
28
+ token: "sample-token",
29
+ }),
30
+ );
31
+ return;
32
+ }
33
+
34
+ if (request.url === "/users/usr_123" && request.method === "GET") {
35
+ response.end(
36
+ JSON.stringify({
37
+ id: "usr_123",
38
+ name: "Ada Lovelace",
39
+ }),
40
+ );
41
+ return;
42
+ }
43
+
44
+ response.statusCode = 404;
45
+ response.end(JSON.stringify({ error: "Not found" }));
46
+ });
47
+
48
+ await new Promise((resolve) => {
49
+ server.listen(0, "127.0.0.1", resolve);
50
+ });
51
+
52
+ const address = server.address();
53
+ const baseUrl = `http://127.0.0.1:${address.port}`;
54
+ const env = new EnvStore({
55
+ baseUrl,
56
+ userName: "Ada Lovelace",
57
+ });
58
+
59
+ const collection = {
60
+ name: "Sample collection",
61
+ requests: [
62
+ {
63
+ id: "create-user",
64
+ name: "Create user",
65
+ method: "POST",
66
+ url: "{{env.baseUrl}}/users",
67
+ headers: {
68
+ "content-type": "application/json",
69
+ "x-request-id": "{{random.uuid}}",
70
+ },
71
+ body: {
72
+ name: "{{env.userName}}",
73
+ },
74
+ contracts: [
75
+ {
76
+ name: "Created user id exists",
77
+ path: "id",
78
+ type: "string",
79
+ },
80
+ {
81
+ name: "Created user name matches env",
82
+ path: "name",
83
+ equals: "Ada Lovelace",
84
+ },
85
+ ],
86
+ tests: `
87
+ pm.test("create returns 200", () => {
88
+ pm.expect(pm.response.status).to.equal(200);
89
+ });
90
+
91
+ pm.test("script can read response JSON", () => {
92
+ pm.expect(pm.response.json().id).to.equal("usr_123");
93
+ });
94
+
95
+ pm.environment.set("userId", pm.response.json().id);
96
+ `,
97
+ },
98
+ {
99
+ id: "get-user",
100
+ name: "Get user",
101
+ method: "GET",
102
+ url: "{{env.baseUrl}}/users/{{env.userId}}",
103
+ contracts: [
104
+ {
105
+ name: "Fetched user id came from previous response",
106
+ path: "id",
107
+ equals: "usr_123",
108
+ },
109
+ ],
110
+ tests: `
111
+ pm.test("env was updated by previous script", () => {
112
+ pm.expect(pm.environment.get("userId")).to.equal("usr_123");
113
+ });
114
+ `,
115
+ },
116
+ ],
117
+ };
118
+
119
+ try {
120
+ const result = await runCollection({
121
+ collection,
122
+ env,
123
+ });
124
+
125
+ console.log(JSON.stringify({ result, env: env.all() }, null, 2));
126
+ } finally {
127
+ server.close();
128
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ESNext",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "outDir": "dist",
7
+ "rootDir": "src",
8
+ "declaration": true,
9
+ "declarationMap": true,
10
+ "sourceMap": true,
11
+ "strict": true,
12
+ "esModuleInterop": true,
13
+ "skipLibCheck": true,
14
+ "forceConsistentCasingInFileNames": true
15
+ },
16
+ "include": ["src/**/*"],
17
+ "exclude": ["dist", "node_modules"]
18
+ }