Skip to content

Commit 90456f8

Browse files
committed
Adds features and component analysis capabilities
1 parent 46efab8 commit 90456f8

File tree

3 files changed

+93
-1
lines changed

3 files changed

+93
-1
lines changed

src/ClientBuilder.js

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const SharedCredentials = require("./SharedCredentials");
77
const CustomHeaderSender = require("./CustomHeaderSender");
88
const StatusCodeSender = require("./StatusCodeSender");
99
const LicenseSender = require("./LicenseSender");
10+
const CustomQuerySender = require("@/src/CustomQuerySender");
1011
const BadCredentialsError = require("./Errors").BadCredentialsError;
1112
const RetrySender = require("./RetrySender");
1213
const Sleeper = require("./util/Sleeper.ts");
@@ -50,6 +51,7 @@ class ClientBuilder {
5051
this.customHeaders = {};
5152
this.debug = undefined;
5253
this.licenses = [];
54+
this.customQueries = new Map();
5355

5456
function noCredentialsProvided() {
5557
return (!signer) instanceof StaticCredentials || (!signer) instanceof SharedCredentials;
@@ -152,6 +154,42 @@ class ClientBuilder {
152154
return this;
153155
}
154156

157+
/**
158+
* Allows the caller to specify key and value pair that is added to the request
159+
* @param {string} key - The query parameter key
160+
* @param {string} value - The query parameter value
161+
* @return Returns <b>this</b> to accommodate method chaining.
162+
*/
163+
withCustomQuery(key, value) {
164+
this.customQueries.set(key, value);
165+
166+
return this;
167+
}
168+
169+
/**
170+
* Allows the caller to specify key and value pair and appends the value associated with the key, seperated by a comma.
171+
* @param {string} key - The query parameter key
172+
* @param {string} value - The query parameter value
173+
* @return Returns <b>this</b> to accommodate method chaining.
174+
*/
175+
withCustomCommaSeperatedQuery(key, value) {
176+
let values = this.customQueries.get(key);
177+
if (values === "") {
178+
values = value;
179+
} else {
180+
values += "," + value;
181+
}
182+
this.customQueries.set(key, values);
183+
}
184+
185+
/**
186+
* Adds to the request query to use the component analysis feature.
187+
* @return Returns <b>this</b> to accommodate method chaining.
188+
*/
189+
withFeatureComponentAnalysis() {
190+
return this.withCustomCommaSeperatedQuery("features", "component-analysis");
191+
}
192+
155193
buildSender() {
156194
if (this.httpSender) return this.httpSender;
157195

@@ -166,8 +204,9 @@ class ClientBuilder {
166204
const customHeaderSender = new CustomHeaderSender(agentSender, this.customHeaders);
167205
const baseUrlSender = new BaseUrlSender(customHeaderSender, this.baseUrl);
168206
const licenseSender = new LicenseSender(baseUrlSender, this.licenses);
207+
const customQuerySender = new CustomQuerySender(licenseSender, this.customQueries);
169208

170-
return licenseSender;
209+
return customQuerySender;
171210
}
172211

173212
buildClient(baseUrl, Client) {

src/CustomQuerySender.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Request, Response, Sender } from "./types";
2+
3+
export default class CustomQuerySender {
4+
private queries: Map<string, string>;
5+
private sender: Sender;
6+
7+
constructor(innerSender: Sender, queries: Map<string, string>) {
8+
this.queries = queries;
9+
this.sender = innerSender;
10+
}
11+
12+
send(request: Request): Promise<Response> {
13+
this.queries.forEach((value, key) => {
14+
const existingValue = request.parameters[key];
15+
request.parameters[key] = existingValue ? `${existingValue},${value}` : value;
16+
});
17+
18+
return this.sender.send(request);
19+
}
20+
}

tests/test_CustomQuerySender.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { expect } from "chai";
2+
import CustomQuerySender from "../src/CustomQuerySender";
3+
import Request from "../src/Request.js";
4+
import Response from "../src/Response.js";
5+
import { Sender } from "@/src/types";
6+
7+
describe("A custom query sender", function () {
8+
it("adds custom query parameters to the request.", function () {
9+
class MockSender implements Sender {
10+
request?: Request;
11+
12+
send = (request: Request): Promise<Response> => {
13+
this.request = request;
14+
return Promise.resolve(new Response(200, {}));
15+
};
16+
}
17+
18+
const mockSender = new MockSender();
19+
const customQueries = new Map<string, string>([
20+
["a", "1"],
21+
["b", "2"],
22+
]);
23+
const customQuerySender = new CustomQuerySender(mockSender, customQueries);
24+
const request = new Request();
25+
26+
customQuerySender.send(request);
27+
28+
expect("a" in mockSender.request!.parameters).to.equal(true);
29+
expect((mockSender.request!.parameters as Record<string, string>)["a"]).to.equal("1");
30+
expect("b" in mockSender.request!.parameters).to.equal(true);
31+
expect((mockSender.request!.parameters as Record<string, string>)["b"]).to.equal("2");
32+
});
33+
});

0 commit comments

Comments
 (0)