@prosopo/api 3.5.20 → 4.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.
@@ -0,0 +1,257 @@
1
+ import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
2
+ import HttpClientBase from "../api/HttpClientBase.js";
3
+ import { HttpError } from "../api/HttpError.js";
4
+ import { ApiClient } from "../api/apiClient.js";
5
+ import { BASE_URL, stubFetch } from "./apiHarness.js";
6
+ class TestClient extends HttpClientBase {
7
+ get(input, init) {
8
+ return this.fetch(input, init);
9
+ }
10
+ send(input, body, init) {
11
+ return this.post(input, body, init);
12
+ }
13
+ sendWithHeaders(input, body, init) {
14
+ return this.postWithHeaders(input, body, init);
15
+ }
16
+ url() {
17
+ return this.baseURL;
18
+ }
19
+ }
20
+ let fetchStub;
21
+ beforeEach(() => {
22
+ fetchStub = stubFetch();
23
+ vi.spyOn(console, "error").mockImplementation(() => undefined);
24
+ });
25
+ afterEach(() => {
26
+ fetchStub.restore();
27
+ vi.restoreAllMocks();
28
+ });
29
+ const client = (prefix) => prefix === undefined
30
+ ? new TestClient(BASE_URL)
31
+ : new TestClient(BASE_URL, prefix);
32
+ const json = (body, status = 200) => ({
33
+ status,
34
+ headers: { "content-type": "application/json" },
35
+ statusText: status === 200 ? "OK" : "Error",
36
+ });
37
+ describe("the base URL", () => {
38
+ test("defaults to no prefix", () => {
39
+ expect(client().url()).toBe(BASE_URL);
40
+ });
41
+ test("appends the prefix, so paths stay relative to it", async () => {
42
+ const withPrefix = client("/v1");
43
+ expect(withPrefix.url()).toBe(`${BASE_URL}/v1`);
44
+ await withPrefix.get("/status");
45
+ expect(fetchStub.last().url).toBe(`${BASE_URL}/v1/status`);
46
+ });
47
+ test("an empty path still hits the base URL", async () => {
48
+ await client().get("");
49
+ expect(fetchStub.last().url).toBe(BASE_URL);
50
+ });
51
+ });
52
+ describe("fetch", () => {
53
+ test("returns the parsed JSON body", async () => {
54
+ fetchStub.respond({ registered: true });
55
+ await expect(client().get("/status")).resolves.toEqual({
56
+ registered: true,
57
+ });
58
+ });
59
+ test("passes the caller's init straight through", async () => {
60
+ await client().get("/status", { headers: { "X-Test": "1" } });
61
+ expect(fetchStub.last().headers).toEqual({ "X-Test": "1" });
62
+ });
63
+ test("throws an HttpError for a non-JSON failure", async () => {
64
+ fetchStub.respond("gateway down", {
65
+ status: 502,
66
+ statusText: "Bad Gateway",
67
+ headers: { "content-type": "text/plain" },
68
+ });
69
+ await expect(client().get("/status")).rejects.toBeInstanceOf(HttpError);
70
+ });
71
+ test("a JSON error body is handed back instead of thrown, so callers can read the error", async () => {
72
+ fetchStub.respond({ error: { message: "rate limited" } }, json({}, 429));
73
+ await expect(client().get("/status")).resolves.toEqual({
74
+ error: { message: "rate limited" },
75
+ });
76
+ });
77
+ test("a 400 is handed back even without a JSON content type", async () => {
78
+ fetchStub.respond('{"error":"bad request"}', {
79
+ status: 400,
80
+ headers: { "content-type": "text/plain" },
81
+ });
82
+ await expect(client().get("/status")).resolves.toEqual({
83
+ error: "bad request",
84
+ });
85
+ });
86
+ test("a response with no content type at all is treated as a failure", async () => {
87
+ fetchStub.respond("", { status: 500, headers: {} });
88
+ await expect(client().get("/status")).rejects.toBeInstanceOf(HttpError);
89
+ });
90
+ test("rejects with the network error when fetch itself fails", async () => {
91
+ const boom = new Error("network down");
92
+ fetchStub.fail(boom);
93
+ await expect(client().get("/status")).rejects.toBe(boom);
94
+ });
95
+ test("rejects when the body is not valid JSON", async () => {
96
+ fetchStub.respond("<html>not json</html>", json({}));
97
+ await expect(client().get("/status")).rejects.toBeInstanceOf(Error);
98
+ });
99
+ test("an empty 200 body is a parse failure, not a silent undefined", async () => {
100
+ fetchStub.respond("", json({}));
101
+ await expect(client().get("/status")).rejects.toBeInstanceOf(Error);
102
+ });
103
+ });
104
+ describe("post", () => {
105
+ test("sends the body as JSON with the right method", async () => {
106
+ await client().send("/solve", { nonce: 1 });
107
+ const request = fetchStub.last();
108
+ expect(request.init?.method).toBe("POST");
109
+ expect(request.body).toEqual({ nonce: 1 });
110
+ expect(request.headers["Content-Type"]).toBe("application/json");
111
+ });
112
+ test("caller headers are merged on top of the content type", async () => {
113
+ await client().send("/solve", {}, { headers: { "Prosopo-Site-Key": "key" } });
114
+ expect(fetchStub.last().headers).toEqual({
115
+ "Content-Type": "application/json",
116
+ "Prosopo-Site-Key": "key",
117
+ });
118
+ });
119
+ test("a caller may override the content type", async () => {
120
+ await client().send("/solve", {}, { headers: { "Content-Type": "text/*" } });
121
+ expect(fetchStub.last().headers["Content-Type"]).toBe("text/*");
122
+ });
123
+ test("headers survive an init that also carries other options", async () => {
124
+ await client().send("/solve", {}, { keepalive: true, headers: { "X-A": "1" } });
125
+ const request = fetchStub.last();
126
+ expect(request.init?.keepalive).toBe(true);
127
+ expect(request.headers["Content-Type"]).toBe("application/json");
128
+ expect(request.headers["X-A"]).toBe("1");
129
+ });
130
+ test("an undefined body still produces a request", async () => {
131
+ await client().send("/solve", undefined);
132
+ expect(fetchStub.last().init?.body).toBeUndefined();
133
+ });
134
+ test("a zero-length array body is sent, not dropped", async () => {
135
+ await client().send("/events", []);
136
+ expect(fetchStub.last().init?.body).toBe("[]");
137
+ });
138
+ test("returns the parsed response", async () => {
139
+ fetchStub.respond({ verified: true });
140
+ await expect(client().send("/solve", {})).resolves.toEqual({
141
+ verified: true,
142
+ });
143
+ });
144
+ test("throws an HttpError for a non-JSON failure", async () => {
145
+ fetchStub.respond("nope", { status: 503, headers: {} });
146
+ await expect(client().send("/solve", {})).rejects.toBeInstanceOf(HttpError);
147
+ });
148
+ test("hands back a 400 JSON body", async () => {
149
+ fetchStub.respond({ error: "bad" }, json({}, 400));
150
+ await expect(client().send("/solve", {})).resolves.toEqual({
151
+ error: "bad",
152
+ });
153
+ });
154
+ test("rejects with the network error", async () => {
155
+ const boom = new Error("offline");
156
+ fetchStub.fail(boom);
157
+ await expect(client().send("/solve", {})).rejects.toBe(boom);
158
+ });
159
+ });
160
+ describe("postWithHeaders", () => {
161
+ test("returns the body and the response headers together", async () => {
162
+ fetchStub.respond({ captchaType: "pow" }, {
163
+ status: 200,
164
+ headers: {
165
+ "content-type": "application/json",
166
+ "x-prosopo-meta": "encoded",
167
+ },
168
+ });
169
+ const { data, headers } = await client().sendWithHeaders("/frictionless", {});
170
+ expect(data).toEqual({ captchaType: "pow" });
171
+ expect(headers.get("x-prosopo-meta")).toBe("encoded");
172
+ });
173
+ test("sends JSON with the merged headers", async () => {
174
+ await client().sendWithHeaders("/frictionless", { token: "t" }, {
175
+ headers: { "Prosopo-User": "user" },
176
+ });
177
+ const request = fetchStub.last();
178
+ expect(request.init?.method).toBe("POST");
179
+ expect(request.body).toEqual({ token: "t" });
180
+ expect(request.headers).toEqual({
181
+ "Content-Type": "application/json",
182
+ "Prosopo-User": "user",
183
+ });
184
+ });
185
+ test("a missing meta header is absent rather than an error", async () => {
186
+ const { headers } = await client().sendWithHeaders("/frictionless", {});
187
+ expect(headers.get("x-prosopo-meta")).toBeNull();
188
+ });
189
+ test("throws an HttpError for a non-JSON failure", async () => {
190
+ fetchStub.respond("nope", { status: 500, headers: {} });
191
+ await expect(client().sendWithHeaders("/frictionless", {})).rejects.toBeInstanceOf(HttpError);
192
+ });
193
+ test("hands back a 400 JSON body with its headers", async () => {
194
+ fetchStub.respond({ error: "bad" }, json({}, 400));
195
+ const { data } = await client().sendWithHeaders("/frictionless", {});
196
+ expect(data).toEqual({ error: "bad" });
197
+ });
198
+ test("rejects when the body cannot be parsed", async () => {
199
+ fetchStub.respond("not json", json({}));
200
+ await expect(client().sendWithHeaders("/frictionless", {})).rejects.toBeInstanceOf(Error);
201
+ });
202
+ test("rejects with the network error", async () => {
203
+ const boom = new Error("offline");
204
+ fetchStub.fail(boom);
205
+ await expect(client().sendWithHeaders("/frictionless", {})).rejects.toBe(boom);
206
+ });
207
+ });
208
+ describe("HttpError", () => {
209
+ test("carries the status, text and URL a caller needs to triage", () => {
210
+ const error = new HttpError(429, "Too Many Requests", `${BASE_URL}/pow`);
211
+ expect(error.status).toBe(429);
212
+ expect(error.statusText).toBe("Too Many Requests");
213
+ expect(error.url).toBe(`${BASE_URL}/pow`);
214
+ expect(error.name).toBe("HttpError");
215
+ expect(error).toBeInstanceOf(Error);
216
+ expect(error.message).toBe(`HTTP error! status: 429 (Too Many Requests) for URL: ${BASE_URL}/pow`);
217
+ });
218
+ test("is distinguishable from any other error at a catch site", () => {
219
+ expect(new HttpError(500, "", "")).toBeInstanceOf(HttpError);
220
+ expect(new Error("plain")).not.toBeInstanceOf(HttpError);
221
+ });
222
+ });
223
+ describe("ApiClient", () => {
224
+ test("keeps an explicit protocol", () => {
225
+ const api = new ApiClient("http://localhost:9229", "account");
226
+ expect(new TestClient("http://localhost:9229").url()).toBe("http://localhost:9229");
227
+ expect(api).toBeInstanceOf(HttpClientBase);
228
+ });
229
+ test("assumes HTTPS when the URL has no protocol", async () => {
230
+ class Probe extends ApiClient {
231
+ go() {
232
+ return this.fetch("/status");
233
+ }
234
+ }
235
+ await new Probe("provider.prosopo.io", "account").go();
236
+ expect(fetchStub.last().url).toBe("https://provider.prosopo.io/status");
237
+ });
238
+ test("does not upgrade an https URL twice", async () => {
239
+ class Probe extends ApiClient {
240
+ go() {
241
+ return this.fetch("/status");
242
+ }
243
+ }
244
+ await new Probe("https://provider.prosopo.io", "account").go();
245
+ expect(fetchStub.last().url).toBe("https://provider.prosopo.io/status");
246
+ });
247
+ test("an empty base URL becomes a relative https URL, not a crash", async () => {
248
+ class Probe extends ApiClient {
249
+ go() {
250
+ return this.fetch("/status");
251
+ }
252
+ }
253
+ await new Probe("", "account").go();
254
+ expect(fetchStub.last().url).toBe("https:///status");
255
+ });
256
+ });
257
+ //# sourceMappingURL=httpClientBase.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpClientBase.unit.test.js","sourceRoot":"","sources":["../../src/tests/httpClientBase.unit.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC3E,OAAO,cAAc,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAkB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMtE,MAAM,UAAW,SAAQ,cAAc;IAC/B,GAAG,CAAI,KAAkB,EAAE,IAAkB;QACnD,OAAO,IAAI,CAAC,KAAK,CAAI,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACM,IAAI,CACV,KAAkB,EAClB,IAAO,EACP,IAAkB;QAElB,OAAO,IAAI,CAAC,IAAI,CAAO,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IACM,eAAe,CACrB,KAAkB,EAClB,IAAO,EACP,IAAkB;QAElB,OAAO,IAAI,CAAC,eAAe,CAAO,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IACM,GAAG;QACT,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;CACD;AAED,IAAI,SAAoB,CAAC;AAEzB,UAAU,CAAC,GAAG,EAAE;IACf,SAAS,GAAG,SAAS,EAAE,CAAC;IACxB,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACd,SAAS,CAAC,OAAO,EAAE,CAAC;IACpB,EAAE,CAAC,eAAe,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,MAAe,EAAc,EAAE,CAC9C,MAAM,KAAK,SAAS;IACnB,CAAC,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC;IAC1B,CAAC,CAAC,IAAI,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAErC,MAAM,IAAI,GAAG,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG,EAAgB,EAAE,CAAC,CAAC;IAC5D,MAAM;IACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;IAC/C,UAAU,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;CAC3C,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC;QAChD,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,YAAY,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACtB,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC/C,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtD,UAAU,EAAE,IAAI;SAChB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC7D,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE;YACjC,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,aAAa;YACzB,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;SACzC,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QAIpG,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACzE,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtD,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;SAClC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACxE,SAAS,CAAC,OAAO,CAAC,yBAAyB,EAAE;YAC5C,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;SACzC,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtD,KAAK,EAAE,aAAa;SACpB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QACjF,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QACvC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QAC1D,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAG/E,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACrB,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,MAAM,EAAE,CAAC,IAAI,CAClB,QAAQ,EACR,EAAE,EACF,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,CAC1C,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACxC,cAAc,EAAE,kBAAkB;YAClC,kBAAkB,EAAE,KAAK;SACzB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,EAAE,CAAC,IAAI,CAClB,QAAQ,EACR,EAAE,EACF,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,CACzC,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QAG1E,MAAM,MAAM,EAAE,CAAC,IAAI,CAClB,QAAQ,EACR,EAAE,EACF,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAC5C,CAAC;QACF,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC9C,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC1D,QAAQ,EAAE,IAAI;SACd,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC7D,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC7C,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC1D,KAAK,EAAE,KAAK;SACZ,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,IAAI,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QACrE,SAAS,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;YACzC,MAAM,EAAE,GAAG;YACX,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,SAAS;aAC3B;SACsB,CAAC,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC,eAAe,CAGtD,eAAe,EAAE,EAAE,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/D,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE;SACb,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAC/B,cAAc,EAAE,kBAAkB;YAClC,cAAc,EAAE,MAAM;SACtB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC7D,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,CACX,MAAM,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC,CAC7C,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC9D,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACzD,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,MAAM,CACX,MAAM,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC,CAC7C,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CACvE,IAAI,CACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACtE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CACzB,wDAAwD,QAAQ,MAAM,CACtE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,UAAU,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CACzD,uBAAuB,CACvB,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,KAAM,SAAQ,SAAS;YACrB,EAAE;gBACR,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;SACD;QACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,KAAM,SAAQ,SAAS;YACrB,EAAE;gBACR,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;SACD;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,KAAM,SAAQ,SAAS;YACrB,EAAE;gBACR,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;SACD;QACD,MAAM,IAAI,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=providerApi.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerApi.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/providerApi.unit.test.ts"],"names":[],"mappings":""}