callman-core 1.1.0 → 1.2.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.
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/script/executor.d.ts.map +1 -1
- package/dist/script/executor.js +118 -9
- package/dist/script/executor.js.map +1 -1
- package/dist/script/features/counter.d.ts +11 -0
- package/dist/script/features/counter.d.ts.map +1 -0
- package/dist/script/features/counter.js +43 -0
- package/dist/script/features/counter.js.map +1 -0
- package/dist/script/features/cryptojs.d.ts +13 -0
- package/dist/script/features/cryptojs.d.ts.map +1 -0
- package/dist/script/features/cryptojs.js +63 -0
- package/dist/script/features/cryptojs.js.map +1 -0
- package/dist/script/features/db.d.ts +36 -0
- package/dist/script/features/db.d.ts.map +1 -0
- package/dist/script/features/db.js +165 -0
- package/dist/script/features/db.js.map +1 -0
- package/dist/script/features/feature-policy.d.ts +8 -0
- package/dist/script/features/feature-policy.d.ts.map +1 -0
- package/dist/script/features/feature-policy.js +88 -0
- package/dist/script/features/feature-policy.js.map +1 -0
- package/dist/script/features/kafka.d.ts +11 -0
- package/dist/script/features/kafka.d.ts.map +1 -0
- package/dist/script/features/kafka.js +71 -0
- package/dist/script/features/kafka.js.map +1 -0
- package/dist/script/features/random.d.ts +13 -0
- package/dist/script/features/random.d.ts.map +1 -0
- package/dist/script/features/random.js +111 -0
- package/dist/script/features/random.js.map +1 -0
- package/dist/script/features/redis.d.ts +10 -0
- package/dist/script/features/redis.d.ts.map +1 -0
- package/dist/script/features/redis.js +22 -0
- package/dist/script/features/redis.js.map +1 -0
- package/dist/script/features/tests.d.ts +7 -1
- package/dist/script/features/tests.d.ts.map +1 -1
- package/dist/script/features/tests.js +97 -12
- package/dist/script/features/tests.js.map +1 -1
- package/dist/script/features/variables.d.ts +6 -0
- package/dist/script/features/variables.d.ts.map +1 -0
- package/dist/script/features/variables.js +25 -0
- package/dist/script/features/variables.js.map +1 -0
- package/dist/script/scope.d.ts +7 -0
- package/dist/script/scope.d.ts.map +1 -1
- package/dist/script/scope.js +21 -0
- package/dist/script/scope.js.map +1 -1
- package/dist/script/types.d.ts +73 -0
- package/dist/script/types.d.ts.map +1 -1
- package/dist-cjs/index.js +7 -1
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/script/executor.js +118 -9
- package/dist-cjs/script/executor.js.map +1 -1
- package/dist-cjs/script/features/counter.js +47 -0
- package/dist-cjs/script/features/counter.js.map +1 -0
- package/dist-cjs/script/features/cryptojs.js +67 -0
- package/dist-cjs/script/features/cryptojs.js.map +1 -0
- package/dist-cjs/script/features/db.js +169 -0
- package/dist-cjs/script/features/db.js.map +1 -0
- package/dist-cjs/script/features/feature-policy.js +94 -0
- package/dist-cjs/script/features/feature-policy.js.map +1 -0
- package/dist-cjs/script/features/kafka.js +77 -0
- package/dist-cjs/script/features/kafka.js.map +1 -0
- package/dist-cjs/script/features/random.js +115 -0
- package/dist-cjs/script/features/random.js.map +1 -0
- package/dist-cjs/script/features/redis.js +26 -0
- package/dist-cjs/script/features/redis.js.map +1 -0
- package/dist-cjs/script/features/tests.js +97 -12
- package/dist-cjs/script/features/tests.js.map +1 -1
- package/dist-cjs/script/features/variables.js +29 -0
- package/dist-cjs/script/features/variables.js.map +1 -0
- package/dist-cjs/script/scope.js +21 -0
- package/dist-cjs/script/scope.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// pm.db — collection-runner database integration.
|
|
2
|
+
//
|
|
3
|
+
// The DB driver itself (mongodb / oracledb / etc.) cannot live inside
|
|
4
|
+
// callman-core because that would pull a multi-megabyte native dependency
|
|
5
|
+
// into a runtime-agnostic package. Instead, the host (electron, future
|
|
6
|
+
// backend) injects the `execute` callback via capability config; this
|
|
7
|
+
// module wraps the result into the user-facing `pm.db` API.
|
|
8
|
+
//
|
|
9
|
+
// `pm.db.pre` and `pm.db.post` expose synchronously-injected results from
|
|
10
|
+
// pre/post-request DB query nodes (host runs them BEFORE the script).
|
|
11
|
+
// `pm.db.query()` is the user-callable async entry — it routes through
|
|
12
|
+
// the injected `execute` callback.
|
|
13
|
+
import { DisabledFeatureDependencyError } from "./feature-policy.js";
|
|
14
|
+
const wrapSourceResult = (result) => ({
|
|
15
|
+
success: result?.success ?? false,
|
|
16
|
+
error: result?.error ?? null,
|
|
17
|
+
rowCount: result?.rowCount ?? 0,
|
|
18
|
+
rows: Array.isArray(result?.rows) ? result.rows : [],
|
|
19
|
+
firstRow: () => Array.isArray(result?.rows) && result.rows.length > 0 ? result.rows[0] : null,
|
|
20
|
+
});
|
|
21
|
+
const wrapQueryResult = (result) => ({
|
|
22
|
+
...wrapSourceResult(result),
|
|
23
|
+
connectionId: result.connectionId,
|
|
24
|
+
connectionName: result.connectionName,
|
|
25
|
+
connectionType: result.connectionType,
|
|
26
|
+
phase: result.phase,
|
|
27
|
+
query: result.query,
|
|
28
|
+
resolvedQuery: result.resolvedQuery,
|
|
29
|
+
durationMs: result.durationMs,
|
|
30
|
+
executedAt: result.executedAt,
|
|
31
|
+
});
|
|
32
|
+
const buildDisabledSource = (feature, isInsideTestCallback) => {
|
|
33
|
+
const guard = () => {
|
|
34
|
+
if (isInsideTestCallback()) {
|
|
35
|
+
throw new DisabledFeatureDependencyError(feature);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
get success() {
|
|
40
|
+
guard();
|
|
41
|
+
return false;
|
|
42
|
+
},
|
|
43
|
+
get error() {
|
|
44
|
+
guard();
|
|
45
|
+
return "Database execution is disabled for this collection runner.";
|
|
46
|
+
},
|
|
47
|
+
get rowCount() {
|
|
48
|
+
guard();
|
|
49
|
+
return 0;
|
|
50
|
+
},
|
|
51
|
+
get rows() {
|
|
52
|
+
guard();
|
|
53
|
+
return [];
|
|
54
|
+
},
|
|
55
|
+
firstRow: () => {
|
|
56
|
+
guard();
|
|
57
|
+
return null;
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
const buildDisabledQueryResult = (feature, isInsideTestCallback) => {
|
|
62
|
+
const guard = () => {
|
|
63
|
+
if (isInsideTestCallback()) {
|
|
64
|
+
throw new DisabledFeatureDependencyError(feature);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
get success() {
|
|
69
|
+
guard();
|
|
70
|
+
return false;
|
|
71
|
+
},
|
|
72
|
+
get error() {
|
|
73
|
+
guard();
|
|
74
|
+
return "Database execution is disabled for this collection runner.";
|
|
75
|
+
},
|
|
76
|
+
get rowCount() {
|
|
77
|
+
guard();
|
|
78
|
+
return 0;
|
|
79
|
+
},
|
|
80
|
+
get rows() {
|
|
81
|
+
guard();
|
|
82
|
+
return [];
|
|
83
|
+
},
|
|
84
|
+
firstRow: () => {
|
|
85
|
+
guard();
|
|
86
|
+
return null;
|
|
87
|
+
},
|
|
88
|
+
get connectionId() {
|
|
89
|
+
guard();
|
|
90
|
+
return "";
|
|
91
|
+
},
|
|
92
|
+
get connectionName() {
|
|
93
|
+
guard();
|
|
94
|
+
return "";
|
|
95
|
+
},
|
|
96
|
+
get connectionType() {
|
|
97
|
+
guard();
|
|
98
|
+
return "mongo";
|
|
99
|
+
},
|
|
100
|
+
get phase() {
|
|
101
|
+
guard();
|
|
102
|
+
return "manual";
|
|
103
|
+
},
|
|
104
|
+
get query() {
|
|
105
|
+
guard();
|
|
106
|
+
return "";
|
|
107
|
+
},
|
|
108
|
+
get resolvedQuery() {
|
|
109
|
+
guard();
|
|
110
|
+
return "";
|
|
111
|
+
},
|
|
112
|
+
get durationMs() {
|
|
113
|
+
guard();
|
|
114
|
+
return 0;
|
|
115
|
+
},
|
|
116
|
+
get executedAt() {
|
|
117
|
+
guard();
|
|
118
|
+
return new Date().toISOString();
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
export const buildDbApi = (input) => {
|
|
123
|
+
if (!input.enabled || !input.capability) {
|
|
124
|
+
const disabledSource = buildDisabledSource("database", input.isInsideTestCallback);
|
|
125
|
+
return {
|
|
126
|
+
pre: disabledSource,
|
|
127
|
+
post: disabledSource,
|
|
128
|
+
query: async () => buildDisabledQueryResult("database", input.isInsideTestCallback),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const cap = input.capability;
|
|
132
|
+
const config = cap.requestConfig;
|
|
133
|
+
return {
|
|
134
|
+
pre: wrapSourceResult(cap.preResult),
|
|
135
|
+
post: wrapSourceResult(cap.postResult),
|
|
136
|
+
query: async ({ connectionId, query, }) => {
|
|
137
|
+
const normalizedQuery = String(query ?? "").trim();
|
|
138
|
+
if (!normalizedQuery) {
|
|
139
|
+
throw new Error("pm.db.query requires a query");
|
|
140
|
+
}
|
|
141
|
+
const normalizedConnectionId = String(connectionId ?? "").trim() ||
|
|
142
|
+
config?.postResponse?.connectionId ||
|
|
143
|
+
config?.preRequest?.connectionId ||
|
|
144
|
+
"";
|
|
145
|
+
if (!normalizedConnectionId) {
|
|
146
|
+
throw new Error("pm.db.query requires a connectionId or a configured request database connection");
|
|
147
|
+
}
|
|
148
|
+
const result = await cap.execute({
|
|
149
|
+
connectionId: normalizedConnectionId,
|
|
150
|
+
query: normalizedQuery,
|
|
151
|
+
phase: "manual",
|
|
152
|
+
context: {
|
|
153
|
+
response: input.responseTemplateRoot,
|
|
154
|
+
env: { ...input.environment },
|
|
155
|
+
global: { ...input.globals },
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
if (!result.success) {
|
|
159
|
+
throw new Error(result.error ?? "Database query failed");
|
|
160
|
+
}
|
|
161
|
+
return wrapQueryResult(result);
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/script/features/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type DisabledFeature = "database" | "kafka";
|
|
2
|
+
export declare class DisabledFeatureDependencyError extends Error {
|
|
3
|
+
readonly feature: DisabledFeature;
|
|
4
|
+
constructor(feature: DisabledFeature);
|
|
5
|
+
}
|
|
6
|
+
export declare const isDisabledFeatureValue: (value: unknown) => DisabledFeature | null;
|
|
7
|
+
export declare const createDisabledFeatureValue: (feature: DisabledFeature, isInsideTestCallback: () => boolean) => object;
|
|
8
|
+
//# sourceMappingURL=feature-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-policy.d.ts","sourceRoot":"","sources":["../../../src/script/features/feature-policy.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC;AAEnD,qBAAa,8BAA+B,SAAQ,KAAK;aAC3B,OAAO,EAAE,eAAe;gBAAxB,OAAO,EAAE,eAAe;CAQrD;AAID,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,KAAG,eAAe,GAAG,IAWzE,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,SAAS,eAAe,EACxB,sBAAsB,MAAM,OAAO,KAClC,MAyDA,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Feature policy — disabled-feature handling for collection-runner.
|
|
2
|
+
//
|
|
3
|
+
// When the host disables a feature (e.g., `featurePolicy.database = false`
|
|
4
|
+
// for a collection that has no DB step), user scripts that reach into the
|
|
5
|
+
// disabled API should NOT crash the runner. Instead, accessing the API
|
|
6
|
+
// inside a `pm.test` callback throws DisabledFeatureDependencyError; the
|
|
7
|
+
// test collector recognizes that error class and emits a SKIP result with
|
|
8
|
+
// a descriptive message.
|
|
9
|
+
//
|
|
10
|
+
// Outside test callbacks (e.g., at script top level) the disabled API
|
|
11
|
+
// returns benign no-op values so the script can continue to execute and
|
|
12
|
+
// any errors propagate as normal exceptions.
|
|
13
|
+
export class DisabledFeatureDependencyError extends Error {
|
|
14
|
+
feature;
|
|
15
|
+
constructor(feature) {
|
|
16
|
+
super(feature === "database"
|
|
17
|
+
? "Database-dependent test is disabled for this collection runner."
|
|
18
|
+
: "Kafka-dependent test is disabled for this collection runner.");
|
|
19
|
+
this.feature = feature;
|
|
20
|
+
this.name = "DisabledFeatureDependencyError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const DISABLED_FEATURE_SYMBOL = Symbol.for("callman:disabled-feature");
|
|
24
|
+
export const isDisabledFeatureValue = (value) => {
|
|
25
|
+
if ((typeof value === "object" && value !== null) ||
|
|
26
|
+
typeof value === "function") {
|
|
27
|
+
const tag = value[DISABLED_FEATURE_SYMBOL];
|
|
28
|
+
if (tag === "database" || tag === "kafka") {
|
|
29
|
+
return tag;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
};
|
|
34
|
+
export const createDisabledFeatureValue = (feature, isInsideTestCallback) => new Proxy(function disabledFeatureValue() {
|
|
35
|
+
return undefined;
|
|
36
|
+
}, {
|
|
37
|
+
get(_target, property) {
|
|
38
|
+
if (property === DISABLED_FEATURE_SYMBOL) {
|
|
39
|
+
return feature;
|
|
40
|
+
}
|
|
41
|
+
if (isInsideTestCallback()) {
|
|
42
|
+
throw new DisabledFeatureDependencyError(feature);
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
},
|
|
46
|
+
apply() {
|
|
47
|
+
if (isInsideTestCallback()) {
|
|
48
|
+
throw new DisabledFeatureDependencyError(feature);
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
},
|
|
52
|
+
set() {
|
|
53
|
+
if (isInsideTestCallback()) {
|
|
54
|
+
throw new DisabledFeatureDependencyError(feature);
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
},
|
|
58
|
+
has(_target, property) {
|
|
59
|
+
if (property === DISABLED_FEATURE_SYMBOL) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (isInsideTestCallback()) {
|
|
63
|
+
throw new DisabledFeatureDependencyError(feature);
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
},
|
|
67
|
+
ownKeys() {
|
|
68
|
+
if (isInsideTestCallback()) {
|
|
69
|
+
throw new DisabledFeatureDependencyError(feature);
|
|
70
|
+
}
|
|
71
|
+
return [];
|
|
72
|
+
},
|
|
73
|
+
getOwnPropertyDescriptor(_target, property) {
|
|
74
|
+
if (property === DISABLED_FEATURE_SYMBOL) {
|
|
75
|
+
return {
|
|
76
|
+
configurable: true,
|
|
77
|
+
enumerable: false,
|
|
78
|
+
writable: false,
|
|
79
|
+
value: feature,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (isInsideTestCallback()) {
|
|
83
|
+
throw new DisabledFeatureDependencyError(feature);
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=feature-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-policy.js","sourceRoot":"","sources":["../../../src/script/features/feature-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ScriptKafkaCapability } from "../types.js";
|
|
2
|
+
export declare class PendingKafkaDependencyError extends Error {
|
|
3
|
+
constructor();
|
|
4
|
+
}
|
|
5
|
+
export declare const isPendingKafkaValue: (value: unknown) => boolean;
|
|
6
|
+
export interface KafkaApi {
|
|
7
|
+
event: () => unknown;
|
|
8
|
+
messages: () => unknown[];
|
|
9
|
+
}
|
|
10
|
+
export declare const buildKafkaApi: (kafka: ScriptKafkaCapability | null | undefined, allowDeferredKafkaTests: boolean) => KafkaApi;
|
|
11
|
+
//# sourceMappingURL=kafka.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka.d.ts","sourceRoot":"","sources":["../../../src/script/features/kafka.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,qBAAa,2BAA4B,SAAQ,KAAK;;CAKrD;AAID,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,OAQpD,CAAC;AA2CF,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,OAAO,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,aAAa,GACxB,OAAO,qBAAqB,GAAG,IAAI,GAAG,SAAS,EAC/C,yBAAyB,OAAO,KAC/B,QAQF,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// pm.kafka — collection-runner Kafka data view + deferred-test mechanism.
|
|
2
|
+
//
|
|
3
|
+
// The data view is read-only (event/messages — both functions returning
|
|
4
|
+
// the snapshot value). The deferred-test mechanism uses a Proxy that
|
|
5
|
+
// throws PendingKafkaDependencyError on any property access; the test
|
|
6
|
+
// collector recognizes that error class and routes the test to the
|
|
7
|
+
// `deferredTestNames` output instead of recording PASS/FAIL.
|
|
8
|
+
//
|
|
9
|
+
// IMPORTANT: We preserve the exact CURRENT behavior of Sandbox D, including
|
|
10
|
+
// the latent issue where `allowDeferredKafkaTests && isListening` is the
|
|
11
|
+
// pending condition (it does not check `!event` — so a re-run where the
|
|
12
|
+
// event is now present still produces a pending proxy). Snapshot tests
|
|
13
|
+
// lock this in. Fix is tracked separately.
|
|
14
|
+
export class PendingKafkaDependencyError extends Error {
|
|
15
|
+
constructor() {
|
|
16
|
+
super("Kafka-dependent test is waiting for the matched event.");
|
|
17
|
+
this.name = "PendingKafkaDependencyError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const PENDING_KAFKA_SYMBOL = Symbol.for("callman:pending-kafka");
|
|
21
|
+
export const isPendingKafkaValue = (value) => {
|
|
22
|
+
if ((typeof value === "object" && value !== null) ||
|
|
23
|
+
typeof value === "function") {
|
|
24
|
+
return Boolean(value[PENDING_KAFKA_SYMBOL]);
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
};
|
|
28
|
+
const createPendingKafkaValue = () => new Proxy(function pendingKafkaValue() {
|
|
29
|
+
return undefined;
|
|
30
|
+
}, {
|
|
31
|
+
get(_target, property) {
|
|
32
|
+
if (property === PENDING_KAFKA_SYMBOL) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
throw new PendingKafkaDependencyError();
|
|
36
|
+
},
|
|
37
|
+
apply() {
|
|
38
|
+
throw new PendingKafkaDependencyError();
|
|
39
|
+
},
|
|
40
|
+
set() {
|
|
41
|
+
throw new PendingKafkaDependencyError();
|
|
42
|
+
},
|
|
43
|
+
has(_target, property) {
|
|
44
|
+
if (property === PENDING_KAFKA_SYMBOL) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
throw new PendingKafkaDependencyError();
|
|
48
|
+
},
|
|
49
|
+
ownKeys() {
|
|
50
|
+
throw new PendingKafkaDependencyError();
|
|
51
|
+
},
|
|
52
|
+
getOwnPropertyDescriptor(_target, property) {
|
|
53
|
+
if (property === PENDING_KAFKA_SYMBOL) {
|
|
54
|
+
return {
|
|
55
|
+
configurable: true,
|
|
56
|
+
enumerable: false,
|
|
57
|
+
writable: false,
|
|
58
|
+
value: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
throw new PendingKafkaDependencyError();
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
export const buildKafkaApi = (kafka, allowDeferredKafkaTests) => {
|
|
65
|
+
const pending = allowDeferredKafkaTests && kafka?.isListening ? createPendingKafkaValue() : null;
|
|
66
|
+
return {
|
|
67
|
+
event: () => pending ?? kafka?.event ?? null,
|
|
68
|
+
messages: () => pending ?? kafka?.messages ?? [],
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=kafka.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka.js","sourceRoot":"","sources":["../../../src/script/features/kafka.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,wEAAwE;AACxE,qEAAqE;AACrE,sEAAsE;AACtE,mEAAmE;AACnE,6DAA6D;AAC7D,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AACxE,uEAAuE;AACvE,2CAA2C;AAI3C,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD;QACE,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,oBAAoB,GAAkB,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAW,EAAE;IAC7D,IACE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;QAC7C,OAAO,KAAK,KAAK,UAAU,EAC3B,CAAC;QACD,OAAO,OAAO,CAAE,KAAsC,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,GAAW,EAAE,CAC3C,IAAI,KAAK,CACP,SAAS,iBAAiB;IACxB,OAAO,SAAS,CAAC;AACnB,CAAC,EACD;IACE,GAAG,CAAC,OAAO,EAAE,QAAQ;QACnB,IAAI,QAAQ,KAAK,oBAAoB,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,2BAA2B,EAAE,CAAC;IAC1C,CAAC;IACD,KAAK;QACH,MAAM,IAAI,2BAA2B,EAAE,CAAC;IAC1C,CAAC;IACD,GAAG;QACD,MAAM,IAAI,2BAA2B,EAAE,CAAC;IAC1C,CAAC;IACD,GAAG,CAAC,OAAO,EAAE,QAAQ;QACnB,IAAI,QAAQ,KAAK,oBAAoB,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,2BAA2B,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO;QACL,MAAM,IAAI,2BAA2B,EAAE,CAAC;IAC1C,CAAC;IACD,wBAAwB,CAAC,OAAO,EAAE,QAAQ;QACxC,IAAI,QAAQ,KAAK,oBAAoB,EAAE,CAAC;YACtC,OAAO;gBACL,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,2BAA2B,EAAE,CAAC;IAC1C,CAAC;CACF,CACF,CAAC;AAOJ,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAA+C,EAC/C,uBAAgC,EACtB,EAAE;IACZ,MAAM,OAAO,GACX,uBAAuB,IAAI,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnF,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,IAAI,KAAK,EAAE,KAAK,IAAI,IAAI;QAC5C,QAAQ,EAAE,GAAG,EAAE,CAAE,OAAgC,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE;KAC3E,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface RandomApi {
|
|
2
|
+
uuid: () => string;
|
|
3
|
+
int: (min?: number, max?: number) => string;
|
|
4
|
+
string: (length?: number) => string;
|
|
5
|
+
email: () => string;
|
|
6
|
+
phone: () => string;
|
|
7
|
+
name: () => string;
|
|
8
|
+
date: (format?: string) => string;
|
|
9
|
+
boolean: () => string;
|
|
10
|
+
bigdecimal: (min?: number, max?: number, scale?: number) => string;
|
|
11
|
+
}
|
|
12
|
+
export declare const buildRandomApi: (rng?: () => number) => RandomApi;
|
|
13
|
+
//# sourceMappingURL=random.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../../src/script/features/random.ts"],"names":[],"mappings":"AAyCA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,KAAK,EAAE,MAAM,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACpE;AAED,eAAO,MAAM,cAAc,GAAI,MAAK,MAAM,MAAmB,KAAG,SAgF/D,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// pm.random — collection-runner random data generators.
|
|
2
|
+
//
|
|
3
|
+
// Lifted from pmanfrontend/electron/script/randomGenerators.ts so all
|
|
4
|
+
// runtimes (CLI, backend, electron) can use the same surface. The host can
|
|
5
|
+
// optionally inject a deterministic RNG (`() => number` returning [0, 1))
|
|
6
|
+
// for testing; the default uses crypto.getRandomValues when available, else
|
|
7
|
+
// Math.random.
|
|
8
|
+
const EMAIL_DOMAINS = ["example.com", "mailinator.com", "test.dev", "pman.dev"];
|
|
9
|
+
const FIRST_NAMES = [
|
|
10
|
+
"Aylin",
|
|
11
|
+
"Murad",
|
|
12
|
+
"Laman",
|
|
13
|
+
"Orxan",
|
|
14
|
+
"Leyla",
|
|
15
|
+
"Kenan",
|
|
16
|
+
"Nigar",
|
|
17
|
+
"Farid",
|
|
18
|
+
];
|
|
19
|
+
const LAST_NAMES = [
|
|
20
|
+
"Aliyev",
|
|
21
|
+
"Mammadov",
|
|
22
|
+
"Rahimova",
|
|
23
|
+
"Hasanli",
|
|
24
|
+
"Rustamov",
|
|
25
|
+
"Asadova",
|
|
26
|
+
"Karimli",
|
|
27
|
+
"Guliyev",
|
|
28
|
+
];
|
|
29
|
+
const STRING_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
30
|
+
const defaultRng = () => {
|
|
31
|
+
if (typeof crypto !== "undefined" && typeof crypto.getRandomValues === "function") {
|
|
32
|
+
const values = new Uint32Array(1);
|
|
33
|
+
crypto.getRandomValues(values);
|
|
34
|
+
return values[0] / 0xffffffff;
|
|
35
|
+
}
|
|
36
|
+
return Math.random();
|
|
37
|
+
};
|
|
38
|
+
export const buildRandomApi = (rng = defaultRng) => {
|
|
39
|
+
const intBetween = (min, max) => {
|
|
40
|
+
const lo = Math.ceil(Math.min(min, max));
|
|
41
|
+
const hi = Math.floor(Math.max(min, max));
|
|
42
|
+
return Math.floor(rng() * (hi - lo + 1)) + lo;
|
|
43
|
+
};
|
|
44
|
+
const pick = (items) => items[intBetween(0, Math.max(0, items.length - 1))];
|
|
45
|
+
const pad = (value, length = 2) => String(value).padStart(length, "0");
|
|
46
|
+
const formatDate = (date, format) => {
|
|
47
|
+
const offsetMin = -date.getTimezoneOffset();
|
|
48
|
+
const offsetSign = offsetMin >= 0 ? "+" : "-";
|
|
49
|
+
const offsetH = Math.floor(Math.abs(offsetMin) / 60);
|
|
50
|
+
const offsetM = Math.abs(offsetMin) % 60;
|
|
51
|
+
return format
|
|
52
|
+
.replace(/YYYY/g, String(date.getFullYear()))
|
|
53
|
+
.replace(/MM/g, pad(date.getMonth() + 1))
|
|
54
|
+
.replace(/DD/g, pad(date.getDate()))
|
|
55
|
+
.replace(/HH/g, pad(date.getHours()))
|
|
56
|
+
.replace(/mm/g, pad(date.getMinutes()))
|
|
57
|
+
.replace(/ss/g, pad(date.getSeconds()))
|
|
58
|
+
.replace(/SSS/g, pad(date.getMilliseconds(), 3))
|
|
59
|
+
.replace(/Z/g, `${offsetSign}${pad(offsetH)}:${pad(offsetM)}`);
|
|
60
|
+
};
|
|
61
|
+
const randomString = (length = 12) => {
|
|
62
|
+
const n = Math.max(1, Math.min(128, Math.trunc(length)));
|
|
63
|
+
let out = "";
|
|
64
|
+
for (let i = 0; i < n; i += 1) {
|
|
65
|
+
out += STRING_ALPHABET[intBetween(0, STRING_ALPHABET.length - 1)];
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
uuid() {
|
|
71
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
72
|
+
return crypto.randomUUID();
|
|
73
|
+
}
|
|
74
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (token) => {
|
|
75
|
+
const v = Math.floor(rng() * 16);
|
|
76
|
+
const r = token === "x" ? v : (v & 0x3) | 0x8;
|
|
77
|
+
return r.toString(16);
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
int(min = 0, max = 999_999) {
|
|
81
|
+
return String(intBetween(min, max));
|
|
82
|
+
},
|
|
83
|
+
string: randomString,
|
|
84
|
+
email() {
|
|
85
|
+
const local = `${pick(FIRST_NAMES).toLowerCase()}.${randomString(6).toLowerCase()}`;
|
|
86
|
+
return `${local}@${pick(EMAIL_DOMAINS)}`;
|
|
87
|
+
},
|
|
88
|
+
phone() {
|
|
89
|
+
return `+1${intBetween(2_000_000_000, 9_999_999_999)}`;
|
|
90
|
+
},
|
|
91
|
+
name() {
|
|
92
|
+
return `${pick(FIRST_NAMES)} ${pick(LAST_NAMES)}`;
|
|
93
|
+
},
|
|
94
|
+
date(format = "YYYY-MM-DD") {
|
|
95
|
+
return formatDate(new Date(Date.now() + intBetween(-365, 365) * 24 * 60 * 60 * 1000), format);
|
|
96
|
+
},
|
|
97
|
+
boolean() {
|
|
98
|
+
return rng() >= 0.5 ? "true" : "false";
|
|
99
|
+
},
|
|
100
|
+
bigdecimal(min = 0, max = 100_000, scale = 6) {
|
|
101
|
+
const integer = intBetween(min, max);
|
|
102
|
+
const width = Math.max(1, Math.min(12, scale));
|
|
103
|
+
let fraction = "";
|
|
104
|
+
for (let i = 0; i < width; i += 1) {
|
|
105
|
+
fraction += String(intBetween(0, 9));
|
|
106
|
+
}
|
|
107
|
+
return `${integer}.${fraction}`;
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=random.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../../src/script/features/random.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ScriptRedisCapability } from "../types.js";
|
|
2
|
+
export interface RedisApi {
|
|
3
|
+
get: (key: unknown) => unknown;
|
|
4
|
+
results: {
|
|
5
|
+
pre: unknown[];
|
|
6
|
+
post: unknown[];
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare const buildRedisApi: (redis: ScriptRedisCapability | null | undefined) => RedisApi;
|
|
10
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../src/script/features/redis.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IAC/B,OAAO,EAAE;QAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAAC,IAAI,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;CAC9C;AAED,eAAO,MAAM,aAAa,GAAI,OAAO,qBAAqB,GAAG,IAAI,GAAG,SAAS,KAAG,QAgB/E,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// pm.redis — collection-runner Redis data view (read-only).
|
|
2
|
+
//
|
|
3
|
+
// Values come from the host (pre-request Redis command results, populated
|
|
4
|
+
// outside the sandbox). The script can fetch by key via `pm.redis.get(key)`
|
|
5
|
+
// and inspect raw command results via `pm.redis.results.{pre, post}`.
|
|
6
|
+
export const buildRedisApi = (redis) => {
|
|
7
|
+
const values = redis?.values ?? {};
|
|
8
|
+
const pre = Array.isArray(redis?.results?.pre) ? [...redis.results.pre] : [];
|
|
9
|
+
const post = Array.isArray(redis?.results?.post) ? [...redis.results.post] : [];
|
|
10
|
+
return {
|
|
11
|
+
get: (key) => {
|
|
12
|
+
const normalizedKey = String(key ?? "").trim();
|
|
13
|
+
if (!normalizedKey) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const value = values[normalizedKey];
|
|
17
|
+
return value === undefined ? null : value;
|
|
18
|
+
},
|
|
19
|
+
results: { pre, post },
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=redis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../../src/script/features/redis.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,sEAAsE;AAStE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAA+C,EAAY,EAAE;IACzF,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhF,OAAO;QACL,GAAG,EAAE,CAAC,GAAY,EAAW,EAAE;YAC7B,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAI,MAAkC,CAAC,aAAa,CAAC,CAAC;YACjE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5C,CAAC;QACD,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;KACvB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -3,7 +3,13 @@ export interface TestCollector {
|
|
|
3
3
|
test: (name: string, fn: ((() => unknown | Promise<unknown>) | undefined)) => Promise<void>;
|
|
4
4
|
skip: (name: string, reason?: string) => void;
|
|
5
5
|
testResults: ScriptTestResult[];
|
|
6
|
+
deferredTestNames: string[];
|
|
6
7
|
flush: () => Promise<void>;
|
|
8
|
+
isInsideCallback: () => boolean;
|
|
7
9
|
}
|
|
8
|
-
export
|
|
10
|
+
export interface TestCollectorOptions {
|
|
11
|
+
allowDeferredKafkaTests?: boolean;
|
|
12
|
+
selectedTestNames?: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare const buildTestCollector: (_stage: ScriptStage, options?: TestCollectorOptions) => TestCollector;
|
|
9
15
|
//# sourceMappingURL=tests.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../../src/script/features/tests.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../../src/script/features/tests.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA2DjE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,KACjD,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,gBAAgB,EAAE,MAAM,OAAO,CAAC;CACjC;AAOD,MAAM,WAAW,oBAAoB;IACnC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,WAAW,EACnB,UAAS,oBAAyB,KACjC,aA4FF,CAAC"}
|