cdk-serverless 2.22.4 → 3.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.
- package/README.md +64 -0
- package/docs/constructs/assets/highlight.css +4 -4
- package/docs/constructs/classes/LambdaFunction.html +8 -8
- package/docs/constructs/index.html +45 -1
- package/docs/lambda/assets/highlight.css +9 -2
- package/docs/lambda/classes/errors.BadRequestError.html +1 -1
- package/docs/lambda/classes/errors.ForbiddenError.html +1 -1
- package/docs/lambda/classes/errors.HttpError.html +1 -1
- package/docs/lambda/classes/errors.NotFoundError.html +1 -1
- package/docs/lambda/classes/errors.UnauthenticatedError.html +1 -1
- package/docs/lambda/index.html +45 -1
- package/docs/projen/assets/highlight.css +13 -6
- package/docs/projen/index.html +45 -1
- package/docs/projen/interfaces/ServerlessProjectOptions.html +4 -4
- package/lib/constructs/authentication.js +2 -2
- package/lib/constructs/graphql.js +3 -3
- package/lib/constructs/rest-api.js +2 -2
- package/lib/lambda/auth.js +10 -4
- package/lib/projen/core.js +1 -3
- package/lib/projen/datastore.js +6 -7
- package/lib/projen/lazy-sampledir.js +9 -9
- package/lib/projen/rest-api.js +4 -4
- package/lib/projen/workflow.js +4 -4
- package/lib/tests/http-client.d.ts +48 -0
- package/lib/tests/http-client.js +82 -0
- package/lib/tests/index.d.ts +1 -0
- package/lib/tests/index.js +2 -1
- package/lib/tests/integ-test-util.d.ts +4 -3
- package/lib/tests/integ-test-util.js +14 -27
- package/package.json +2 -5
- package/specs/remove-axios-dependency.md +240 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A minimal HTTP client used by IntegTestUtil, backed by the native `fetch`
|
|
4
|
+
* API. It exists to keep the integration-test API stable while removing the
|
|
5
|
+
* `axios` runtime dependency.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.HttpClient = exports.HttpClientResponse = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Response wrapper returned by every `HttpClient` request method.
|
|
11
|
+
*/
|
|
12
|
+
class HttpClientResponse {
|
|
13
|
+
constructor(status, ok, headers, body) {
|
|
14
|
+
this.status = status;
|
|
15
|
+
this.ok = ok;
|
|
16
|
+
this.headers = headers;
|
|
17
|
+
this.body = body;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse the response body as JSON. Throws if the body is not valid JSON.
|
|
21
|
+
*/
|
|
22
|
+
json() {
|
|
23
|
+
return JSON.parse(this.body);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.HttpClientResponse = HttpClientResponse;
|
|
27
|
+
class HttpClient {
|
|
28
|
+
constructor(config = {}) {
|
|
29
|
+
this.baseURL = config.baseURL;
|
|
30
|
+
this.defaultHeaders = { ...(config.headers ?? {}) };
|
|
31
|
+
}
|
|
32
|
+
get(path, options) {
|
|
33
|
+
return this.request('GET', path, undefined, options);
|
|
34
|
+
}
|
|
35
|
+
delete(path, options) {
|
|
36
|
+
return this.request('DELETE', path, undefined, options);
|
|
37
|
+
}
|
|
38
|
+
post(path, body, options) {
|
|
39
|
+
return this.request('POST', path, body, options);
|
|
40
|
+
}
|
|
41
|
+
put(path, body, options) {
|
|
42
|
+
return this.request('PUT', path, body, options);
|
|
43
|
+
}
|
|
44
|
+
patch(path, body, options) {
|
|
45
|
+
return this.request('PATCH', path, body, options);
|
|
46
|
+
}
|
|
47
|
+
async request(method, path, body, options) {
|
|
48
|
+
const url = this.resolveUrl(path);
|
|
49
|
+
const headers = {
|
|
50
|
+
...this.defaultHeaders,
|
|
51
|
+
...(options?.headers ?? {}),
|
|
52
|
+
};
|
|
53
|
+
let requestBody;
|
|
54
|
+
if (body !== undefined && body !== null) {
|
|
55
|
+
if (typeof body === 'string') {
|
|
56
|
+
requestBody = body;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
requestBody = JSON.stringify(body);
|
|
60
|
+
if (!Object.keys(headers).some((h) => h.toLowerCase() === 'content-type')) {
|
|
61
|
+
headers['Content-Type'] = 'application/json';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const res = await fetch(url, { method, headers, body: requestBody });
|
|
66
|
+
const responseBody = await res.text();
|
|
67
|
+
return new HttpClientResponse(res.status, res.ok, res.headers, responseBody);
|
|
68
|
+
}
|
|
69
|
+
resolveUrl(path) {
|
|
70
|
+
if (!this.baseURL) {
|
|
71
|
+
return path;
|
|
72
|
+
}
|
|
73
|
+
if (/^https?:\/\//i.test(path)) {
|
|
74
|
+
return path;
|
|
75
|
+
}
|
|
76
|
+
const base = this.baseURL.endsWith('/') ? this.baseURL.slice(0, -1) : this.baseURL;
|
|
77
|
+
const suffix = path.startsWith('/') ? path : `/${path}`;
|
|
78
|
+
return `${base}${suffix}`;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.HttpClient = HttpClient;
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQXNCSDs7R0FFRztBQUNILE1BQWEsa0JBQWtCO0lBTTdCLFlBQVksTUFBYyxFQUFFLEVBQVcsRUFBRSxPQUFnQixFQUFFLElBQVk7UUFDckUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJO1FBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQU0sQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFuQkQsZ0RBbUJDO0FBRUQsTUFBYSxVQUFVO0lBSXJCLFlBQVksU0FBMkIsRUFBRTtRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVNLEdBQUcsQ0FBQyxJQUFZLEVBQUUsT0FBa0M7UUFDekQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTSxNQUFNLENBQUMsSUFBWSxFQUFFLE9BQWtDO1FBQzVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sSUFBSSxDQUFDLElB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Y2VzQ29udGVudCI6WyIvKipcbiAqIEEgbWluaW1hbCBIVFRQIGNsaWVudCB1c2VkIGJ5IEludGVnVGVzdFV0aWwsIGJhY2tlZCBieSB0aGUgbmF0aXZlIGBmZXRjaGBcbiAqIEFQSS4gSXQgZXhpc3RzIHRvIGtlZXAgdGhlIGludGVncmF0aW9uLXRlc3QgQVBJIHN0YWJsZSB3aGlsZSByZW1vdmluZyB0aGVcbiAqIGBheGlvc2AgcnVudGltZSBkZXBlbmRlbmN5LlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENsaWVudENvbmZpZyB7XG4gIC8qKlxuICAgKiBCYXNlIFVSTCBwcmVwZW5kZWQgdG8gcmVsYXRpdmUgcGF0aHMgcGFzc2VkIHRvIGNsaWVudCBtZXRob2RzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVVSTD86IHN0cmluZztcblxuICAvKipcbiAgICogRGVmYXVsdCBoZWFkZXJzIGFwcGxpZWQgdG8gZXZlcnkgcmVxdWVzdCBpc3N1ZWQgYnkgdGhpcyBjbGllbnQuXG4gICAqIFBlci1yZXF1ZXN0IGhlYWRlcnMgb3ZlcnJpZGUgdGhlc2Ugb24gY29sbGlzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENsaWVudFJlcXVlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBlci1yZXF1ZXN0IGhlYWRlcnMsIG1lcmdlZCBvbiB0b3Agb2YgdGhlIGNsaWVudCdzIGRlZmF1bHQgaGVhZGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIHdyYXBwZXIgcmV0dXJuZWQgYnkgZXZlcnkgYEh0dHBDbGllbnRgIHJlcXVlc3QgbWV0aG9kLlxuICovXG5leHBvcnQgY2xhc3MgSHR0cENsaWVudFJlc3BvbnNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgb2s6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICBwdWJsaWMgcmVhZG9ubHkgYm9keTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHN0YXR1czogbnVtYmVyLCBvazogYm9vbGVhbiwgaGVhZGVyczogSGVhZGVycywgYm9keTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5vayA9IG9rO1xuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgcmVzcG9uc2UgYm9keSBhcyBKU09OLiBUaHJvd3MgaWYgdGhlIGJvZHkgaXMgbm90IHZhbGlkIEpTT04uXG4gICAqL1xuICBwdWJsaWMganNvbjxUID0gdW5rbm93bj4oKTogVCB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5ib2R5KSBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIdHRwQ2xpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVVJMPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogSHR0cENsaWVudENvbmZpZyA9IHt9KSB7XG4gICAgdGhpcy5iYXNlVVJMID0gY29uZmlnLmJhc2VVUkw7XG4gICAgdGhpcy5kZWZhdWx0SGVhZGVycyA9IHsgLi4uKGNvbmZpZy5oZWFkZXJzID8/IHt9KSB9O1xuICB9XG5cbiAgcHVibGljIGdldChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIHBhdGgsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IEh0dHBDbGllbnRSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnREVMRVRFJywgcGF0aCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBwb3N0KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24sIG9wdGlvbnM/OiBIdHRwQ2xpZW50UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BPU1QnLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBwdXQocGF0aDogc3RyaW5nLCBib2R5PzogdW5rbm93biwgb3B0aW9ucz86IEh0dHBDbGllbnRSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUFVUJywgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgcGF0Y2gocGF0aDogc3RyaW5nLCBib2R5PzogdW5rbm93biwgb3B0aW9ucz86IEh0dHBDbGllbnRSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUEFUQ0gnLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdChtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nLCBib2R5OiB1bmtub3duLCBvcHRpb25zPzogSHR0cENsaWVudFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJlc29sdmVVcmwocGF0aCk7XG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC4uLnRoaXMuZGVmYXVsdEhlYWRlcnMsXG4gICAgICAuLi4ob3B0aW9ucz8uaGVhZGVycyA/PyB7fSksXG4gICAgfTtcblxuICAgIGxldCByZXF1ZXN0Qm9keTogQm9keUluaXQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGJvZHkgIT09IHVuZGVmaW5lZCAmJiBib2R5ICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlcXVlc3RCb2R5ID0gYm9keTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RCb2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgICAgIGlmICghT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaCkgPT4gaC50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBtZXRob2QsIGhlYWRlcnMsIGJvZHk6IHJlcXVlc3RCb2R5IH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50UmVzcG9uc2UocmVzLnN0YXR1cywgcmVzLm9rLCByZXMuaGVhZGVycywgcmVzcG9uc2VCb2R5KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVVybChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5iYXNlVVJMKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgaWYgKC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICBjb25zdCBiYXNlID0gdGhpcy5iYXNlVVJMLmVuZHNXaXRoKCcvJykgPyB0aGlzLmJhc2VVUkwuc2xpY2UoMCwgLTEpIDogdGhpcy5iYXNlVVJMO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6IGAvJHtwYXRofWA7XG4gICAgcmV0dXJuIGAke2Jhc2V9JHtzdWZmaXh9YDtcbiAgfVxufVxuIl19
|
package/lib/tests/index.d.ts
CHANGED
package/lib/tests/index.js
CHANGED
|
@@ -14,6 +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
|
+
__exportStar(require("./http-client"), exports);
|
|
17
18
|
__exportStar(require("./integ-test-util"), exports);
|
|
18
19
|
__exportStar(require("./lambda-test-utils"), exports);
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUE4QjtBQUM5QixvREFBa0M7QUFDbEMsc0RBQW9DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9odHRwLWNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVnLXRlc3QtdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2xhbWJkYS10ZXN0LXV0aWxzJzsiXX0=
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NativeAttributeValue } from '@aws-sdk/lib-dynamodb';
|
|
2
|
-
import { Axios, AxiosRequestConfig } from 'axios';
|
|
3
2
|
import { JwtPayload } from 'jsonwebtoken';
|
|
3
|
+
import { HttpClient, HttpClientConfig } from './http-client';
|
|
4
|
+
export { HttpClient, HttpClientConfig, HttpClientResponse } from './http-client';
|
|
4
5
|
export interface IntegTestUtilOptions {
|
|
5
6
|
readonly region: string;
|
|
6
7
|
readonly apiOptions?: {
|
|
@@ -28,8 +29,8 @@ export declare class IntegTestUtil {
|
|
|
28
29
|
private apiTokens;
|
|
29
30
|
private itemsToDelete;
|
|
30
31
|
constructor(options: IntegTestUtilOptions);
|
|
31
|
-
getClient(config?:
|
|
32
|
-
getAuthenticatedClient(email: string, password?: string, config?:
|
|
32
|
+
getClient(config?: HttpClientConfig): HttpClient;
|
|
33
|
+
getAuthenticatedClient(email: string, password?: string, config?: HttpClientConfig): Promise<HttpClient>;
|
|
33
34
|
initializeItemsToCleanup(): void;
|
|
34
35
|
addItemToDeleteAfterTest(key: Record<string, NativeAttributeValue>): void;
|
|
35
36
|
cleanupItems(): Promise<void>;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IntegTestUtil = void 0;
|
|
3
|
+
exports.IntegTestUtil = exports.HttpClientResponse = exports.HttpClient = void 0;
|
|
4
4
|
exports.parseCfnOutputs = parseCfnOutputs;
|
|
5
5
|
const client_cognito_identity_provider_1 = require("@aws-sdk/client-cognito-identity-provider");
|
|
6
6
|
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
7
7
|
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
8
|
-
const axios_1 = require("axios");
|
|
9
8
|
const jsonwebtoken_1 = require("jsonwebtoken");
|
|
9
|
+
const http_client_1 = require("./http-client");
|
|
10
10
|
const outputs_1 = require("../shared/outputs");
|
|
11
|
+
var http_client_2 = require("./http-client");
|
|
12
|
+
Object.defineProperty(exports, "HttpClient", { enumerable: true, get: function () { return http_client_2.HttpClient; } });
|
|
13
|
+
Object.defineProperty(exports, "HttpClientResponse", { enumerable: true, get: function () { return http_client_2.HttpClientResponse; } });
|
|
11
14
|
function parseCfnOutputs(output, stackName, config) {
|
|
12
15
|
const outputs = output[stackName];
|
|
13
16
|
return {
|
|
@@ -39,24 +42,8 @@ class IntegTestUtil {
|
|
|
39
42
|
}
|
|
40
43
|
// AUTH
|
|
41
44
|
getClient(config) {
|
|
42
|
-
return new
|
|
45
|
+
return new http_client_1.HttpClient({
|
|
43
46
|
baseURL: this.options.apiOptions?.baseURL,
|
|
44
|
-
transformResponse: (data) => {
|
|
45
|
-
try {
|
|
46
|
-
return JSON.parse(data);
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
return data;
|
|
50
|
-
}
|
|
51
|
-
},
|
|
52
|
-
transformRequest: (data) => {
|
|
53
|
-
try {
|
|
54
|
-
return JSON.stringify(data);
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
return data;
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
47
|
...config,
|
|
61
48
|
});
|
|
62
49
|
}
|
|
@@ -68,11 +55,11 @@ class IntegTestUtil {
|
|
|
68
55
|
await this.loginUser(email, password);
|
|
69
56
|
}
|
|
70
57
|
return this.getClient({
|
|
58
|
+
...config,
|
|
71
59
|
headers: {
|
|
72
60
|
Authorization: `Bearer ${this.apiTokens[email].token}`,
|
|
73
61
|
...(config?.headers ?? {}),
|
|
74
62
|
},
|
|
75
|
-
...config,
|
|
76
63
|
});
|
|
77
64
|
}
|
|
78
65
|
// DATASTORE
|
|
@@ -153,31 +140,31 @@ class IntegTestUtil {
|
|
|
153
140
|
if (!this.options.authOptions?.userPoolClientId) {
|
|
154
141
|
throw new Error('No userPoolClientId configured');
|
|
155
142
|
}
|
|
156
|
-
const cognitoClient = new
|
|
143
|
+
const cognitoClient = new http_client_1.HttpClient({
|
|
157
144
|
baseURL: `https://cognito-idp.${this.options.region}.amazonaws.com/`,
|
|
158
145
|
});
|
|
159
|
-
const auth = await cognitoClient.post('/',
|
|
146
|
+
const auth = await cognitoClient.post('/', {
|
|
160
147
|
AuthParameters: {
|
|
161
148
|
USERNAME: email,
|
|
162
149
|
PASSWORD: password,
|
|
163
150
|
},
|
|
164
151
|
AuthFlow: 'USER_PASSWORD_AUTH',
|
|
165
152
|
ClientId: this.options.authOptions.userPoolClientId,
|
|
166
|
-
}
|
|
153
|
+
}, {
|
|
167
154
|
headers: {
|
|
168
155
|
'Content-Type': 'application/x-amz-json-1.1',
|
|
169
156
|
'X-Amz-Target': 'AWSCognitoIdentityProviderService.InitiateAuth',
|
|
170
157
|
},
|
|
171
158
|
});
|
|
172
|
-
if (auth.
|
|
159
|
+
if (!auth.ok) {
|
|
173
160
|
throw new Error(`Failed to authenticate user ${email}`);
|
|
174
161
|
}
|
|
175
|
-
const token =
|
|
162
|
+
const token = (await auth.json()).AuthenticationResult.IdToken;
|
|
176
163
|
this.apiTokens[email] = {
|
|
177
164
|
token,
|
|
178
|
-
payload: (0, jsonwebtoken_1.decode)(
|
|
165
|
+
payload: (0, jsonwebtoken_1.decode)(token),
|
|
179
166
|
};
|
|
180
167
|
}
|
|
181
168
|
}
|
|
182
169
|
exports.IntegTestUtil = IntegTestUtil;
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC11dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RzL2ludGVnLXRlc3QtdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvQ0EsMENBZ0JDO0FBcERELGdHQUFzTjtBQUN0Tiw4REFBMEQ7QUFDMUQsd0RBQW9HO0FBQ3BHLGlDQUFrRTtBQUNsRSwrQ0FBa0Q7QUFDbEQsK0NBQThOO0FBK0I5TixTQUFnQixlQUFlLENBQUMsTUFBVyxFQUFFLFNBQWlCLEVBQUUsTUFBdUI7SUFDckYsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLE9BQU87UUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsVUFBVSxFQUFFO1lBQ1YsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsdUNBQTZCLEVBQUUsQ0FBQztTQUN0RTtRQUNELFdBQVcsRUFBRTtZQUNYLFVBQVUsRUFBRSxPQUFPLENBQUMsMkNBQWlDLENBQUM7WUFDdEQsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGtEQUF3QyxDQUFDO1lBQ25FLGNBQWMsRUFBRSxPQUFPLENBQUMsZ0RBQXNDLENBQUM7U0FDaEU7UUFDRCxnQkFBZ0IsRUFBRTtZQUNoQixTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQywrQ0FBcUMsQ0FBQyxFQUFFO1NBQ3RGO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFPRCxNQUFhLGFBQWE7SUFPeEIsWUFBc0IsT0FBNkI7UUFBN0IsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFIM0MsY0FBUyxHQUFtQyxFQUFFLENBQUM7UUFDL0Msa0JBQWEsR0FBMkMsRUFBRSxDQUFDO1FBR2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0Is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dEIsS0FBSztZQUNMLE9BQU8sRUFBRSxJQUFBLHFCQUFNLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQWU7U0FDM0QsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXpLRCxzQ0F5S0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZG1pbkFkZFVzZXJUb0dyb3VwQ29tbWFuZCwgQWRtaW5DcmVhdGVVc2VyQ29tbWFuZCwgQWRtaW5EZWxldGVVc2VyQ29tbWFuZCwgQWRtaW5TZXRVc2VyUGFzc3dvcmRDb21tYW5kLCBDb2duaXRvSWRlbnRpdHlQcm92aWRlckNsaWVudCwgTWVzc2FnZUFjdGlvblR5cGUgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY29nbml0by1pZGVudGl0eS1wcm92aWRlcic7XG5pbXBvcnQgeyBEeW5hbW9EQkNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1keW5hbW9kYic7XG5pbXBvcnQgeyBEZWxldGVDb21tYW5kLCBEeW5hbW9EQkRvY3VtZW50Q2xpZW50LCBOYXRpdmVBdHRyaWJ1dGVWYWx1ZSB9IGZyb20gJ0Bhd3Mtc2RrL2xpYi1keW5hbW9kYic7XG5pbXBvcnQgeyBBeGlvcywgQXhpb3NSZXF1ZXN0Q29uZmlnLCBIdHRwU3RhdHVzQ29kZSB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IGRlY29kZSwgSnd0UGF5bG9hZCB9IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBDRk5fT1VUUFVUX1NVRkZJWF9BVVRIX0lERU5USVRZUE9PTF9JRCwgQ0ZOX09VVFBVVF9TVUZGSVhfQVVUSF9VU0VSUE9PTElELCBDRk5fT1VUUFVUX1NVRkZJWF9BVVRIX1VTRVJQT09MX0NMSUVOVElELCBDRk5fT1VUUFVUX1NVRkZJWF9EQVRBU1RPUkVfVEFCTEVOQU1FLCBDRk5fT1VUUFVUX1NVRkZJWF9SRVNUQVBJX1VSTCB9IGZyb20gJy4uL3NoYXJlZC9vdXRwdXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBJbnRlZ1Rlc3RVdGlsT3B0aW9ucyB7XG5cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgYXBpT3B0aW9ucz86IHtcbiAgICByZWFkb25seSBiYXNlVVJMPzogc3RyaW5nO1xuICB9O1xuXG4gIHJlYWRvbmx5IGF1dGhPcHRpb25zPzoge1xuICAgIHJlYWRvbmx5IHVzZXJQb29sSWQ/OiBzdHJpbmc7XG5cbiAgICByZWFkb25seSB1c2VyUG9vbENsaWVudElkPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHVzZXJQb29sQ2xpZW50U2VjcmV0Pzogc3RyaW5nO1xuXG4gICAgcmVhZG9ubHkgaWRlbnRpdHlQb29sSWQ/OiBzdHJpbmc7XG4gIH07XG5cbiAgcmVhZG9ubHkgZGF0YXN0b3JlT3B0aW9ucz86IHtcbiAgICByZWFkb25seSB0YWJsZU5hbWU/OiBzdHJpbmc7XG4gIH07XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZm5PdXRwdXRDb25maWcge1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYXBpTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkYXRhc3RvcmVOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNmbk91dHB1dHMob3V0cHV0OiBhbnksIHN0YWNrTmFtZTogc3RyaW5nLCBjb25maWc6IENmbk91dHB1dENvbmZpZyk6IEludGVnVGVzdFV0aWxPcHRpb25zIHtcbiAgY29uc3Qgb3V0cHV0cyA9IG91dHB1dFtzdGFja05hbWVdO1xuICByZXR1cm4ge1xuICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbixcbiAgICBhcGlPcHRpb25zOiB7XG4gICAgICBiYXNlVVJMOiBvdXRwdXRzW2Ake2NvbmZpZy5hcGlOYW1lfSR7Q0ZOX09VVFBVVF9TVUZGSVhfUkVTVEFQSV9VUkx9YF0sXG4gICAgfSxcbiAgICBhdXRoT3B0aW9uczoge1xuICAgICAgdXNlclBvb2xJZDogb3V0cHV0c1tDRk5fT1VUUFVUX1NVRkZJWF9BVVRIX1VTRVJQT09MSURdLFxuICAgICAgdXNlclBvb2xDbGllbnRJZDogb3V0cHV0c1tDRk5fT1VUUFVUX1NVRkZJWF9BVVRIX1VTRVJQT09MX0NMSUVOVElEXSxcbiAgICAgIGlkZW50aXR5UG9vbElkOiBvdXRwdXRzW0NGTl9PVVRQVVRfU1VGRklYX0FVVEhfSURFTlRJVFlQT09MX0lEXSxcbiAgICB9LFxuICAgIGRhdGFzdG9yZU9wdGlvbnM6IHtcbiAgICAgIHRhYmxlTmFtZTogYCR7Y29uZmlnLmRhdGFzdG9yZU5hbWV9JHtvdXRwdXRzW0NGTl9PVVRQVVRfU1VGRklYX0RBVEFTVE9SRV9UQUJMRU5BTUVdfWAsXG4gICAgfSxcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFRva2VuSW5mbyB7XG4gIHJlYWRvbmx5IHRva2VuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBheWxvYWQ6IEp3dFBheWxvYWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlZ1Rlc3RVdGlsIHtcblxuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgYXBpVG9rZW5zOiB7IFtlbWFpbDogc3RyaW5nXTogVG9rZW5JbmZvIH0gPSB7fTtcbiAgcHJpdmF0ZSBpdGVtc1RvRGVsZXRlOiBSZWNvcmQ8c3RyaW5nLCBOYXRpdmVBdHRyaWJ1dGVWYWx1ZT5bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBvcHRpb25zOiBJbnRlZ1Rlc3RVdGlsT3B0aW9ucykge1xuICAgIHByb2Nlc3MuZW52LkFXU19SRUdJT04gPSBvcHRpb25zLnJlZ2lvbjtcbiAgICBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04gPSBvcHRpb25zLnJlZ2lvbjtcbiAgICBpZiAob3B0aW9ucy5kYXRhc3RvcmVPcHRpb25zPy50YWJsZU5hbWUpIHtcbiAgICAgIHByb2Nlc3MuZW52LlRBQkxFID0gb3B0aW9ucy5kYXRhc3RvcmVPcHRpb25zLnRhYmxlTmFtZTtcbiAgICAgIHRoaXMudGFibGVOYW1lID0gb3B0aW9ucy5kYXRhc3RvcmVPcHRpb25zLnRhYmxlTmFtZTtcbiAgICB9XG4gIH1cblxuICAvLyBBVVRIXG5cbiAgcHVibGljIGdldENsaWVudChjb25maWc/OiBBeGlvc1JlcXVlc3RDb25maWcpIHtcbiAgICByZXR1cm4gbmV3IEF4aW9zKHtcbiAgICAgIGJhc2VVUkw6IHRoaXMub3B0aW9ucy5hcGlPcHRpb25zPy5iYXNlVVJMLFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IChkYXRhKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiAoZGF0YSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBdXRoZW50aWNhdGVkQ2xpZW50KGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkPzogc3RyaW5nLCBjb25maWc/OiBBeGlvc1JlcXVlc3RDb25maWcpIHtcbiAgICBpZiAoIXRoaXMuYXBpVG9rZW5zW2VtYWlsXSkge1xuICAgICAgaWYgKCFwYXNzd29yZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHBhc3N3b3JkIHByb3ZpZGVkOyBZb3UgY2FuIG9ubHkgbGVhdmUgcGFzc3dvcmQgYmxhbmsgZm9yIHVzZXJzIGNyZWF0ZWQgYnkgdGhpcyB1dGlsaXR5Jyk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmxvZ2luVXNlcihlbWFpbCwgcGFzc3dvcmQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRDbGllbnQoe1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hcGlUb2tlbnNbZW1haWxdLnRva2VufWAsXG4gICAgICAgIC4uLihjb25maWc/LmhlYWRlcnMgPz8ge30pLFxuICAgICAgfSxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIERBVEFTVE9SRVxuXG4gIHB1YmxpYyBpbml0aWFsaXplSXRlbXNUb0NsZWFudXAoKSB7XG4gICAgdGhpcy5pdGVtc1RvRGVsZXRlID0gW107XG4gIH1cblxuICBwdWJsaWMgYWRkSXRlbVRvRGVsZXRlQWZ0ZXJUZXN0KGtleTogUmVjb3JkPHN0cmluZywgTmF0aXZlQXR0cmlidXRlVmFsdWU+KSB7XG4gICAgdGhpcy5pdGVtc1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjbGVhbnVwSXRlbXMoKSB7XG4gICAgY29uc3QgZGRiID0gRHluYW1vREJEb2N1bWVudENsaWVudC5mcm9tKG5ldyBEeW5hbW9EQkNsaWVudCh7IHJlZ2lvbjogdGhpcy5vcHRpb25zLnJlZ2lvbiB9KSk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXNUb0RlbGV0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGRiLnNlbmQobmV3IERlbGV0ZUNvbW1hbmQoeyBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLCBLZXk6IGl0ZW0gfSkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFVVEhcblxuICBwdWJsaWMgZ2V0VG9rZW5QYXlsb2FkKGVtYWlsOiBzdHJpbmcpOiBKd3RQYXlsb2FkIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcGlUb2tlbnNbZW1haWxdPy5wYXlsb2FkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVVzZXIoZW1haWw6IHN0cmluZywgYXR0cmlidXRlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSwgZ3JvdXBzOiBzdHJpbmdbXSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmF1dGhPcHRpb25zPy51c2VyUG9vbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHVzZXJQb29sSWQgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmRvbVBhc3N3b3JkOiBzdHJpbmcgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgtMTYpO1xuXG4gICAgY29uc3QgY29nbml0b0NsaWVudDogQ29nbml0b0lkZW50aXR5UHJvdmlkZXJDbGllbnQgPSBuZXcgQ29nbml0b0lkZW50aXR5UHJvdmlkZXJDbGllbnQoeyByZWdpb246IHRoaXMub3B0aW9ucy5yZWdpb24gfSk7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHVzZXIgaW4gQ29nbml0b1xuICAgIGF3YWl0IGNvZ25pdG9DbGllbnQuc2VuZChuZXcgQWRtaW5DcmVhdGVVc2VyQ29tbWFuZCh7XG4gICAgICBVc2VyUG9vbElkOiB0aGlzLm9wdGlvbnMuYXV0aE9wdGlvbnM/LnVzZXJQb29sSWQsXG4gICAgICBVc2VybmFtZTogZW1haWwsXG4gICAgICBNZXNzYWdlQWN0aW9uOiBNZXNzYWdlQWN0aW9uVHlwZS5TVVBQUkVTUyxcbiAgICAgIFRlbXBvcmFyeVBhc3N3b3JkOiByYW5kb21QYXNzd29yZCxcbiAgICAgIFVzZXJBdHRyaWJ1dGVzOiBbe1xuICAgICAgICBOYW1lOiAnZW1haWwnLFxuICAgICAgICBWYWx1ZTogZW1haWwsXG4gICAgICB9LCB7XG4gICAgICAgIE5hbWU6ICdlbWFpbF92ZXJpZmllZCcsXG4gICAgICAgIFZhbHVlOiAndHJ1ZScsXG4gICAgICB9LFxuICAgICAgLi4uT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykubWFwKChhdHRyKSA9PiAoe1xuICAgICAgICBOYW1lOiBhdHRyWzBdLFxuICAgICAgICBWYWx1ZTogYXR0clsxXSxcbiAgICAgIH0pKV0sXG4gICAgfSkpO1xuICAgIC8vIE1ha2UgcGFzc3dvcmQgcGVybWFuZW50IHRvIGdldCB1c2VyIG91dCBvZiBGT1JDRV9DSEFOR0VfUEFTU1dPUkRcbiAgICBhd2FpdCBjb2duaXRvQ2xpZW50LnNlbmQobmV3IEFkbWluU2V0VXNlclBhc3N3b3JkQ29tbWFuZCh7XG4gICAgICBVc2VyUG9vbElkOiB0aGlzLm9wdGlvbnMuYXV0aE9wdGlvbnM/LnVzZXJQb29sSWQsXG4gICAgICBVc2VybmFtZTogZW1haWwsXG4gICAgICBQYXNzd29yZDogcmFuZG9tUGFzc3dvcmQsXG4gICAgICBQZXJtYW5lbnQ6IHRydWUsXG4gICAgfSkpO1xuICAgIC8vIEFkZCB1c2VyIHRvIGdyb3Vwc1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICBhd2FpdCBjb2duaXRvQ2xpZW50LnNlbmQobmV3IEFkbWluQWRkVXNlclRvR3JvdXBDb21tYW5kKHtcbiAgICAgICAgVXNlclBvb2xJZDogdGhpcy5vcHRpb25zLmF1dGhPcHRpb25zPy51c2VyUG9vbElkLFxuICAgICAgICBVc2VybmFtZTogZW1haWwsXG4gICAgICAgIEdyb3VwTmFtZTogZ3JvdXAsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5sb2dpblVzZXIoZW1haWwsIHJhbmRvbVBhc3N3b3JkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZW1vdmVVc2VyKGVtYWlsOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5hdXRoT3B0aW9ucz8udXNlclBvb2xJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1c2VyUG9vbElkIGNvbmZpZ3VyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgY29nbml0b0NsaWVudDogQ29nbml0b0lkZW50aXR5UHJvdmlkZXJDbGllbnQgPSBuZXcgQ29nbml0b0lkZW50aXR5UHJvdmlkZXJDbGllbnQoeyByZWdpb246IHRoaXMub3B0aW9ucy5yZWdpb24gfSk7XG4gICAgYXdhaXQgY29nbml0b0NsaWVudC5zZW5kKG5ldyBBZG1pbkRlbGV0ZVVzZXJDb21tYW5kKHtcbiAgICAgIFVzZXJQb29sSWQ6IHRoaXMub3B0aW9ucy5hdXRoT3B0aW9ucz8udXNlclBvb2xJZCxcbiAgICAgIFVzZXJuYW1lOiBlbWFpbCxcbiAgICB9KSk7XG4gICAgZGVsZXRlIHRoaXMuYXBpVG9rZW5zW2VtYWlsXTtcbiAgfVxuXG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxvZ2luVXNlcihlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuYXV0aE9wdGlvbnM/LnVzZXJQb29sQ2xpZW50SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdXNlclBvb2xDbGllbnRJZCBjb25maWd1cmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvZ25pdG9DbGllbnQgPSBuZXcgQXhpb3Moe1xuICAgICAgYmFzZVVSTDogYGh0dHBzOi8vY29nbml0by1pZHAuJHt0aGlzLm9wdGlvbnMucmVnaW9ufS5hbWF6b25hd3MuY29tL2AsXG4gICAgfSk7XG4gICAgY29uc3QgYXV0aCA9IGF3YWl0IGNvZ25pdG9DbGllbnQucG9zdCgnLycsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIEF1dGhQYXJhbWV0ZXJzOiB7XG4gICAgICAgIFVTRVJOQU1FOiBlbWFpbCxcbiAgICAgICAgUEFTU1dPUkQ6IHBhc3N3b3JkLFxuICAgICAgfSxcbiAgICAgIEF1dGhGbG93OiAnVVNFUl9QQVNTV09SRF9BVVRIJyxcbiAgICAgIENsaWVudElkOiB0aGlzLm9wdGlvbnMuYXV0aE9wdGlvbnMudXNlclBvb2xDbGllbnRJZCxcbiAgICB9KSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtYW16LWpzb24tMS4xJyxcbiAgICAgICAgJ1gtQW16LVRhcmdldCc6ICdBV1NDb2duaXRvSWRlbnRpdHlQcm92aWRlclNlcnZpY2UuSW5pdGlhdGVBdXRoJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGF1dGguc3RhdHVzICE9PSBIdHRwU3RhdHVzQ29kZS5Paykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gYXV0aGVudGljYXRlIHVzZXIgJHtlbWFpbH1gKTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBKU09OLnBhcnNlKGF1dGguZGF0YSkuQXV0aGVudGljYXRpb25SZXN1bHQuSWRUb2tlbjtcbiAgICB0aGlzLmFwaVRva2Vuc1tlbWFpbF0gPSB7XG4gICAgICB0b2tlbixcbiAgICAgIHBheWxvYWQ6IGRlY29kZSh0aGlzLmFwaVRva2Vuc1tlbWFpbF0udG9rZW4pIGFzIEp3dFBheWxvYWQsXG4gICAgfTtcbiAgfVxufSJdfQ==
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC11dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RzL2ludGVnLXRlc3QtdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzQ0EsMENBZ0JDO0FBdERELGdHQUFzTjtBQUN0Tiw4REFBMEQ7QUFDMUQsd0RBQW9HO0FBQ3BHLCtDQUFrRDtBQUNsRCwrQ0FBNkQ7QUFDN0QsK0NBQThOO0FBRTlOLDZDQUFpRjtBQUF4RSx5R0FBQSxVQUFVLE9BQUE7QUFBb0IsaUhBQUEsa0JBQWtCLE9BQUE7QUErQnpELFNBQWdCLGVBQWUsQ0FBQyxNQUFXLEVBQUUsU0FBaUIsRUFBRSxNQUF1QjtJQUNyRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEMsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixVQUFVLEVBQUU7WUFDVixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyx1Q0FBNkIsRUFBRSxDQUFDO1NBQ3RFO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsVUFBVSxFQUFFLE9BQU8sQ0FBQywyQ0FBaUMsQ0FBQztZQUN0RCxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsa0RBQXdDLENBQUM7WUFDbkUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxnREFBc0MsQ0FBQztTQUNoRTtRQUNELGdCQUFnQixFQUFFO1lBQ2hCLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLCtDQUFxQyxDQUFDLEVBQUU7U0FDdEY7S0FDRixDQUFDO0FBQ0osQ0FBQztBQU9ELE1BQWEsYUFBYTtJQU94QixZQUFzQixPQUE2QjtRQUE3QixZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQUgzQyxjQUFTLEdBQW1DLEVBQUUsQ0FBQztRQUMvQyxrQkFBYSxHQUEyQyxFQUFFLENBQUM7UUFHakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFV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T0FBTyxDQUFDLE1BQU0saUJBQWlCO1NBQ3JFLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDekMsY0FBYyxFQUFFO2dCQUNkLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFFBQVEsRUFBRSxRQUFRO2FBQ25CO1lBQ0QsUUFBUSxFQUFFLG9CQUFvQjtZQUM5QixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCO1NBQ3BELEVBQUU7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLDRCQUE0QjtnQkFDNUMsY0FBYyxFQUFFLGdEQUFnRDthQUNqRTtTQUNGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBaUQsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztRQUM5RyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3RCLEtBQUs7WUFDTCxPQUFPLEVBQUUsSUFBQSxxQkFBTSxFQUFDLEtBQUssQ0FBZTtTQUNyQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBM0pELHNDQTJKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkbWluQWRkVXNlclRvR3JvdXBDb21tYW5kLCBBZG1pbkNyZWF0ZVVzZXJDb21tYW5kLCBBZG1pbkRlbGV0ZVVzZXJDb21tYW5kLCBBZG1pblNldFVzZXJQYXNzd29yZENvbW1hbmQsIENvZ25pdG9JZGVudGl0eVByb3ZpZGVyQ2xpZW50LCBNZXNzYWdlQWN0aW9uVHlwZSB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jb2duaXRvLWlkZW50aXR5LXByb3ZpZGVyJztcbmltcG9ydCB7IER5bmFtb0RCQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiJztcbmltcG9ydCB7IERlbGV0ZUNvbW1hbmQsIER5bmFtb0RCRG9jdW1lbnRDbGllbnQsIE5hdGl2ZUF0dHJpYnV0ZVZhbHVlIH0gZnJvbSAnQGF3cy1zZGsvbGliLWR5bmFtb2RiJztcbmltcG9ydCB7IGRlY29kZSwgSnd0UGF5bG9hZCB9IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwQ2xpZW50Q29uZmlnIH0gZnJvbSAnLi9odHRwLWNsaWVudCc7XG5pbXBvcnQgeyBDRk5fT1VUUFVUX1NVRkZJWF9BVVRIX0lERU5USVRZUE9PTF9JRCwgQ0ZOX09VVFBVVF9TVUZGSVhfQVVUSF9VU0VSUE9PTElELCBDRk5fT1VUUFVUX1NVRkZJWF9BVVRIX1VTRVJQT09MX0NMSUVOVElELCBDRk5fT1VUUFVUX1NVRkZJWF9EQVRBU1RPUkVfVEFCTEVOQU1FLCBDRk5fT1VUUFVUX1NVRkZJWF9SRVNUQVBJX1VSTCB9IGZyb20gJy4uL3NoYXJlZC9vdXRwdXRzJztcblxuZXhwb3J0IHsgSHR0cENsaWVudCwgSHR0cENsaWVudENvbmZpZywgSHR0cENsaWVudFJlc3BvbnNlIH0gZnJvbSAnLi9odHRwLWNsaWVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdUZXN0VXRpbE9wdGlvbnMge1xuXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGFwaU9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgYmFzZVVSTD86IHN0cmluZztcbiAgfTtcblxuICByZWFkb25seSBhdXRoT3B0aW9ucz86IHtcbiAgICByZWFkb25seSB1c2VyUG9vbElkPzogc3RyaW5nO1xuXG4gICAgcmVhZG9ubHkgdXNlclBvb2xDbGllbnRJZD86IHN0cmluZztcbiAgICByZWFkb25seSB1c2VyUG9vbENsaWVudFNlY3JldD86IHN0cmluZztcblxuICAgIHJlYWRvbmx5IGlkZW50aXR5UG9vbElkPzogc3RyaW5nO1xuICB9O1xuXG4gIHJlYWRvbmx5IGRhdGFzdG9yZU9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgdGFibGVOYW1lPzogc3RyaW5nO1xuICB9O1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2ZuT3V0cHV0Q29uZmlnIHtcbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFwaU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZGF0YXN0b3JlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDZm5PdXRwdXRzKG91dHB1dDogYW55LCBzdGFja05hbWU6IHN0cmluZywgY29uZmlnOiBDZm5PdXRwdXRDb25maWcpOiBJbnRlZ1Rlc3RVdGlsT3B0aW9ucyB7XG4gIGNvbnN0IG91dHB1dHMgPSBvdXRwdXRbc3RhY2tOYW1lXTtcbiAgcmV0dXJuIHtcbiAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgYXBpT3B0aW9uczoge1xuICAgICAgYmFzZVVSTDogb3V0cHV0c1tgJHtjb25maWcuYXBpTmFtZX0ke0NGTl9PVVRQVVRfU1VGRklYX1JFU1RBUElfVVJMfWBdLFxuICAgIH0sXG4gICAgYXV0aE9wdGlvbnM6IHtcbiAgICAgIHVzZXJQb29sSWQ6IG91dHB1dHNbQ0ZOX09VVFBVVF9TVUZGSVhfQVVUSF9VU0VSUE9PTElEXSxcbiAgICAgIHVzZXJQb29sQ2xpZW50SWQ6IG91dHB1dHNbQ0ZOX09VVFBVVF9TVUZGSVhfQVVUSF9VU0VSUE9PTF9DTElFTlRJRF0sXG4gICAgICBpZGVudGl0eVBvb2xJZDogb3V0cHV0c1tDRk5fT1VUUFVUX1NVRkZJWF9BVVRIX0lERU5USVRZUE9PTF9JRF0sXG4gICAgfSxcbiAgICBkYXRhc3RvcmVPcHRpb25zOiB7XG4gICAgICB0YWJsZU5hbWU6IGAke2NvbmZpZy5kYXRhc3RvcmVOYW1lfSR7b3V0cHV0c1tDRk5fT1VUUFVUX1NVRkZJWF9EQVRBU1RPUkVfVEFCTEVOQU1FXX1gLFxuICAgIH0sXG4gIH07XG59XG5cbmludGVyZmFjZSBUb2tlbkluZm8ge1xuICByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICByZWFkb25seSBwYXlsb2FkOiBKd3RQYXlsb2FkO1xufVxuXG5leHBvcnQgY2xhc3MgSW50ZWdUZXN0VXRpbCB7XG5cbiAgcHVibGljIHJlYWRvbmx5IHRhYmxlTmFtZT86IHN0cmluZztcblxuICBwcml2YXRlIGFwaVRva2VuczogeyBbZW1haWw6IHN0cmluZ106IFRva2VuSW5mbyB9ID0ge307XG4gIHByaXZhdGUgaXRlbXNUb0RlbGV0ZTogUmVjb3JkPHN0cmluZywgTmF0aXZlQXR0cmlidXRlVmFsdWU+W10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3B0aW9uczogSW50ZWdUZXN0VXRpbE9wdGlvbnMpIHtcbiAgICBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID0gb3B0aW9ucy5yZWdpb247XG4gICAgcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OID0gb3B0aW9ucy5yZWdpb247XG4gICAgaWYgKG9wdGlvbnMuZGF0YXN0b3JlT3B0aW9ucz8udGFibGVOYW1lKSB7XG4gICAgICBwcm9jZXNzLmVudi5UQUJMRSA9IG9wdGlvbnMuZGF0YXN0b3JlT3B0aW9ucy50YWJsZU5hbWU7XG4gICAgICB0aGlzLnRhYmxlTmFtZSA9IG9wdGlvbnMuZGF0YXN0b3JlT3B0aW9ucy50YWJsZU5hbWU7XG4gICAgfVxuICB9XG5cbiAgLy8gQVVUSFxuXG4gIHB1YmxpYyBnZXRDbGllbnQoY29uZmlnPzogSHR0cENsaWVudENvbmZpZyk6IEh0dHBDbGllbnQge1xuICAgIHJldHVybiBuZXcgSHR0cENsaWVudCh7XG4gICAgICBiYXNlVVJMOiB0aGlzLm9wdGlvbnMuYXBpT3B0aW9ucz8uYmFzZVVSTCxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBdXRoZW50aWNhdGVkQ2xpZW50KGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkPzogc3RyaW5nLCBjb25maWc/OiBIdHRwQ2xpZW50Q29uZmlnKTogUHJvbWlzZTxIdHRwQ2xpZW50PiB7XG4gICAgaWYgKCF0aGlzLmFwaVRva2Vuc1tlbWFpbF0pIHtcbiAgICAgIGlmICghcGFzc3dvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBwYXNzd29yZCBwcm92aWRlZDsgWW91IGNhbiBvbmx5IGxlYXZlIHBhc3N3b3JkIGJsYW5rIGZvciB1c2VycyBjcmVhdGVkIGJ5IHRoaXMgdXRpbGl0eScpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5sb2dpblVzZXIoZW1haWwsIHBhc3N3b3JkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2xpZW50KHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuYXBpVG9rZW5zW2VtYWlsXS50b2tlbn1gLFxuICAgICAgICAuLi4oY29uZmlnPy5oZWFkZXJzID8/IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyBEQVRBU1RPUkVcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUl0ZW1zVG9DbGVhbnVwKCkge1xuICAgIHRoaXMuaXRlbXNUb0RlbGV0ZSA9IFtdO1xuICB9XG5cbiAgcHVibGljIGFkZEl0ZW1Ub0RlbGV0ZUFmdGVyVGVzdChrZXk6IFJlY29yZDxzdHJpbmcsIE5hdGl2ZUF0dHJpYnV0ZVZhbHVlPikge1xuICAgIHRoaXMuaXRlbXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYW51cEl0ZW1zKCkge1xuICAgIGNvbnN0IGRkYiA9IER5bmFtb0RCRG9jdW1lbnRDbGllbnQuZnJvbShuZXcgRHluYW1vREJDbGllbnQoeyByZWdpb246IHRoaXMub3B0aW9ucy5yZWdpb24gfSkpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zVG9EZWxldGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRkYi5zZW5kKG5ldyBEZWxldGVDb21tYW5kKHsgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSwgS2V5OiBpdGVtIH0pKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBVVRIXG5cbiAgcHVibGljIGdldFRva2VuUGF5bG9hZChlbWFpbDogc3RyaW5nKTogSnd0UGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBpVG9rZW5zW2VtYWlsXT8ucGF5bG9hZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVVc2VyKGVtYWlsOiBzdHJpbmcsIGF0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sIGdyb3Vwczogc3RyaW5nW10pIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5hdXRoT3B0aW9ucz8udXNlclBvb2xJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1c2VyUG9vbElkIGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByYW5kb21QYXNzd29yZDogc3RyaW5nID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoLTE2KTtcblxuICAgIGNvbnN0IGNvZ25pdG9DbGllbnQ6IENvZ25pdG9JZGVudGl0eVByb3ZpZGVyQ2xpZW50ID0gbmV3IENvZ25pdG9JZGVudGl0eVByb3ZpZGVyQ2xpZW50KHsgcmVnaW9uOiB0aGlzLm9wdGlvbnMucmVnaW9uIH0pO1xuICAgIC8vIENyZWF0ZSBhIG5ldyB1c2VyIGluIENvZ25pdG9cbiAgICBhd2FpdCBjb2duaXRvQ2xpZW50LnNlbmQobmV3IEFkbWluQ3JlYXRlVXNlckNvbW1hbmQoe1xuICAgICAgVXNlclBvb2xJZDogdGhpcy5vcHRpb25zLmF1dGhPcHRpb25zPy51c2VyUG9vbElkLFxuICAgICAgVXNlcm5hbWU6IGVtYWlsLFxuICAgICAgTWVzc2FnZUFjdGlvbjogTWVzc2FnZUFjdGlvblR5cGUuU1VQUFJFU1MsXG4gICAgICBUZW1wb3JhcnlQYXNzd29yZDogcmFuZG9tUGFzc3dvcmQsXG4gICAgICBVc2VyQXR0cmlidXRlczogW3tcbiAgICAgICAgTmFtZTogJ2VtYWlsJyxcbiAgICAgICAgVmFsdWU6IGVtYWlsLFxuICAgICAgfSwge1xuICAgICAgICBOYW1lOiAnZW1haWxfdmVyaWZpZWQnLFxuICAgICAgICBWYWx1ZTogJ3RydWUnLFxuICAgICAgfSxcbiAgICAgIC4uLk9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpLm1hcCgoYXR0cikgPT4gKHtcbiAgICAgICAgTmFtZTogYXR0clswXSxcbiAgICAgICAgVmFsdWU6IGF0dHJbMV0sXG4gICAgICB9KSldLFxuICAgIH0pKTtcbiAgICAvLyBNYWtlIHBhc3N3b3JkIHBlcm1hbmVudCB0byBnZXQgdXNlciBvdXQgb2YgRk9SQ0VfQ0hBTkdFX1BBU1NXT1JEXG4gICAgYXdhaXQgY29nbml0b0NsaWVudC5zZW5kKG5ldyBBZG1pblNldFVzZXJQYXNzd29yZENvbW1hbmQoe1xuICAgICAgVXNlclBvb2xJZDogdGhpcy5vcHRpb25zLmF1dGhPcHRpb25zPy51c2VyUG9vbElkLFxuICAgICAgVXNlcm5hbWU6IGVtYWlsLFxuICAgICAgUGFzc3dvcmQ6IHJhbmRvbVBhc3N3b3JkLFxuICAgICAgUGVybWFuZW50OiB0cnVlLFxuICAgIH0pKTtcbiAgICAvLyBBZGQgdXNlciB0byBncm91cHNcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgICAgYXdhaXQgY29nbml0b0NsaWVudC5zZW5kKG5ldyBBZG1pbkFkZFVzZXJUb0dyb3VwQ29tbWFuZCh7XG4gICAgICAgIFVzZXJQb29sSWQ6IHRoaXMub3B0aW9ucy5hdXRoT3B0aW9ucz8udXNlclBvb2xJZCxcbiAgICAgICAgVXNlcm5hbWU6IGVtYWlsLFxuICAgICAgICBHcm91cE5hbWU6IGdyb3VwLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMubG9naW5Vc2VyKGVtYWlsLCByYW5kb21QYXNzd29yZCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVtb3ZlVXNlcihlbWFpbDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuYXV0aE9wdGlvbnM/LnVzZXJQb29sSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdXNlclBvb2xJZCBjb25maWd1cmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvZ25pdG9DbGllbnQ6IENvZ25pdG9JZGVudGl0eVByb3ZpZGVyQ2xpZW50ID0gbmV3IENvZ25pdG9JZGVudGl0eVByb3ZpZGVyQ2xpZW50KHsgcmVnaW9uOiB0aGlzLm9wdGlvbnMucmVnaW9uIH0pO1xuICAgIGF3YWl0IGNvZ25pdG9DbGllbnQuc2VuZChuZXcgQWRtaW5EZWxldGVVc2VyQ29tbWFuZCh7XG4gICAgICBVc2VyUG9vbElkOiB0aGlzLm9wdGlvbnMuYXV0aE9wdGlvbnM/LnVzZXJQb29sSWQsXG4gICAgICBVc2VybmFtZTogZW1haWwsXG4gICAgfSkpO1xuICAgIGRlbGV0ZSB0aGlzLmFwaVRva2Vuc1tlbWFpbF07XG4gIH1cblxuXG4gIHByb3RlY3RlZCBhc3luYyBsb2dpblVzZXIoZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmF1dGhPcHRpb25zPy51c2VyUG9vbENsaWVudElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHVzZXJQb29sQ2xpZW50SWQgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCBjb2duaXRvQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoe1xuICAgICAgYmFzZVVSTDogYGh0dHBzOi8vY29nbml0by1pZHAuJHt0aGlzLm9wdGlvbnMucmVnaW9ufS5hbWF6b25hd3MuY29tL2AsXG4gICAgfSk7XG4gICAgY29uc3QgYXV0aCA9IGF3YWl0IGNvZ25pdG9DbGllbnQucG9zdCgnLycsIHtcbiAgICAgIEF1dGhQYXJhbWV0ZXJzOiB7XG4gICAgICAgIFVTRVJOQU1FOiBlbWFpbCxcbiAgICAgICAgUEFTU1dPUkQ6IHBhc3N3b3JkLFxuICAgICAgfSxcbiAgICAgIEF1dGhGbG93OiAnVVNFUl9QQVNTV09SRF9BVVRIJyxcbiAgICAgIENsaWVudElkOiB0aGlzLm9wdGlvbnMuYXV0aE9wdGlvbnMudXNlclBvb2xDbGllbnRJZCxcbiAgICB9LCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC1hbXotanNvbi0xLjEnLFxuICAgICAgICAnWC1BbXotVGFyZ2V0JzogJ0FXU0NvZ25pdG9JZGVudGl0eVByb3ZpZGVyU2VydmljZS5Jbml0aWF0ZUF1dGgnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoIWF1dGgub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSB1c2VyICR7ZW1haWx9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gKGF3YWl0IGF1dGguanNvbjx7IEF1dGhlbnRpY2F0aW9uUmVzdWx0OiB7IElkVG9rZW46IHN0cmluZyB9IH0+KCkpLkF1dGhlbnRpY2F0aW9uUmVzdWx0LklkVG9rZW47XG4gICAgdGhpcy5hcGlUb2tlbnNbZW1haWxdID0ge1xuICAgICAgdG9rZW4sXG4gICAgICBwYXlsb2FkOiBkZWNvZGUodG9rZW4pIGFzIEp3dFBheWxvYWQsXG4gICAgfTtcbiAgfVxufSJdfQ==
|
package/package.json
CHANGED
|
@@ -44,7 +44,6 @@
|
|
|
44
44
|
"@types/jwk-to-pem": "^2.0.3",
|
|
45
45
|
"@types/lambda-log": "^2.2.1",
|
|
46
46
|
"@types/node": "^18",
|
|
47
|
-
"@types/uuid": "^9.0.8",
|
|
48
47
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
49
48
|
"@typescript-eslint/parser": "^8",
|
|
50
49
|
"aws-cdk-lib": "2.248.0",
|
|
@@ -75,14 +74,12 @@
|
|
|
75
74
|
},
|
|
76
75
|
"dependencies": {
|
|
77
76
|
"@types/aws-lambda": "^8.10.161",
|
|
78
|
-
"axios": "^1.15.0",
|
|
79
77
|
"constructs": "^10.5.1",
|
|
80
78
|
"date-fns": "^4.1.0",
|
|
81
79
|
"js-yaml": "^4.1.1",
|
|
82
80
|
"jsonwebtoken": "^9.0.3",
|
|
83
81
|
"jwk-to-pem": "^2.0.7",
|
|
84
|
-
"lambda-log": "^3.1.0"
|
|
85
|
-
"uuid": "^13.0.0"
|
|
82
|
+
"lambda-log": "^3.1.0"
|
|
86
83
|
},
|
|
87
84
|
"keywords": [
|
|
88
85
|
"aws",
|
|
@@ -102,7 +99,7 @@
|
|
|
102
99
|
"publishConfig": {
|
|
103
100
|
"access": "public"
|
|
104
101
|
},
|
|
105
|
-
"version": "
|
|
102
|
+
"version": "3.0.0",
|
|
106
103
|
"jest": {
|
|
107
104
|
"coverageProvider": "v8",
|
|
108
105
|
"testMatch": [
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# Spec: Remove the `axios` Runtime Dependency
|
|
2
|
+
|
|
3
|
+
Status: Proposed
|
|
4
|
+
Author: open-constructs
|
|
5
|
+
Target: `cdk-serverless@next` (minor or major release — see Breaking Changes)
|
|
6
|
+
|
|
7
|
+
## Summary
|
|
8
|
+
|
|
9
|
+
Drop `axios` as a runtime dependency of `cdk-serverless` by replacing every
|
|
10
|
+
call site with the platform-native `fetch` API. `axios` is currently declared
|
|
11
|
+
in `dependencies` (`^1.15.0`, `package.json:77`) and therefore ships into
|
|
12
|
+
every Lambda bundle that pulls in `cdk-serverless/lambda`, and into every
|
|
13
|
+
test workspace that pulls in `cdk-serverless/tests`.
|
|
14
|
+
|
|
15
|
+
The Node.js `fetch` global has been stable since Node 21 and available since
|
|
16
|
+
Node 18. The Lambda functions created by this library use
|
|
17
|
+
`Runtime.NODEJS_LATEST` (`src/constructs/func.ts:145`), which today resolves
|
|
18
|
+
to Node 22, so the runtime requirement is already met.
|
|
19
|
+
|
|
20
|
+
## Motivation
|
|
21
|
+
|
|
22
|
+
1. **Smaller Lambda bundles.** `axios` is bundled into the JWT-verifying code
|
|
23
|
+
path that ships with every cdk-serverless Lambda using `auth.ts`. The
|
|
24
|
+
minified+gzipped cost of axios is ~15 KB; with `fetch` that drops to 0.
|
|
25
|
+
2. **Smaller dependency surface.** One fewer third-party runtime dependency
|
|
26
|
+
to track for supply-chain and CVE management. axios has had several
|
|
27
|
+
security advisories (CVE-2023-45857, CVE-2024-39338, etc.) which forced
|
|
28
|
+
downstream upgrades in this library before.
|
|
29
|
+
3. **Cleaner peer story.** With `axios` gone, the `dependencies` section
|
|
30
|
+
only contains things consumers genuinely need at runtime. `@types/aws-lambda`
|
|
31
|
+
stays for typed handler shapes, and we keep the small set of crypto/JWT
|
|
32
|
+
libs.
|
|
33
|
+
4. **Alignment with platform.** AWS Lambda's managed Node runtime ships
|
|
34
|
+
`fetch` and `undici` natively; using them avoids re-shipping HTTP client
|
|
35
|
+
code that the runtime already provides.
|
|
36
|
+
|
|
37
|
+
## Non-Goals
|
|
38
|
+
|
|
39
|
+
- Replacing `jsonwebtoken` / `jwk-to-pem`. These do crypto, not HTTP, and
|
|
40
|
+
there is no equivalent built-in.
|
|
41
|
+
- Replacing the AWS SDK clients used in `IntegTestUtil` (Cognito, DynamoDB).
|
|
42
|
+
- Adding a new HTTP abstraction layer. `fetch` is the abstraction.
|
|
43
|
+
- Changing the JWT verification flow itself (token discovery, JWKS caching
|
|
44
|
+
behavior, claims shape).
|
|
45
|
+
|
|
46
|
+
## Current Usage
|
|
47
|
+
|
|
48
|
+
`axios` is imported from exactly two source files:
|
|
49
|
+
|
|
50
|
+
### 1. `src/lambda/auth.ts` — runtime (ships in Lambda bundles)
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import Axios from 'axios';
|
|
54
|
+
// ...
|
|
55
|
+
const publicKeys: PublicKeys =
|
|
56
|
+
(await Axios.get<PublicKeys>(jwksUrl)).data; // line 47
|
|
57
|
+
// ...
|
|
58
|
+
const issuerMetadata =
|
|
59
|
+
(await Axios.get<IssuerMetadata>(wellKnownUri)).data; // line 65
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Both calls are plain GETs against well-known JSON endpoints (the issuer's
|
|
63
|
+
`/.well-known` discovery document and the JWKS URL). Response is parsed as
|
|
64
|
+
JSON. No retry, no interceptors, no custom transports — trivially mappable
|
|
65
|
+
to `fetch(url).then(r => r.json())`.
|
|
66
|
+
|
|
67
|
+
### 2. `src/tests/integ-test-util.ts` — test utility (consumer-facing API)
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
import { Axios, AxiosRequestConfig, HttpStatusCode } from 'axios';
|
|
71
|
+
|
|
72
|
+
public getClient(config?: AxiosRequestConfig) { return new Axios({...}); } // line 78
|
|
73
|
+
public async getAuthenticatedClient(email, password?, config?) { ... } // line 99
|
|
74
|
+
protected async loginUser(email, password) {
|
|
75
|
+
const cognitoClient = new Axios({ baseURL: '...' }); // line 204
|
|
76
|
+
const auth = await cognitoClient.post('/', JSON.stringify({...}), {...});
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
This file is exported via `src/tests/index.ts` and is part of the **public
|
|
81
|
+
API** of `cdk-serverless/tests`. `getClient()` and `getAuthenticatedClient()`
|
|
82
|
+
both **return an `Axios` instance** and accept an `AxiosRequestConfig`.
|
|
83
|
+
Consumers writing integration tests call `.get()` / `.post()` etc. on the
|
|
84
|
+
returned client.
|
|
85
|
+
|
|
86
|
+
## Proposed Changes
|
|
87
|
+
|
|
88
|
+
### Phase 1 — `src/lambda/auth.ts` (no breaking change)
|
|
89
|
+
|
|
90
|
+
Replace the two `Axios.get` calls with `fetch`. The function signatures and
|
|
91
|
+
exported types in `auth.ts` do not expose axios, so this is a pure internal
|
|
92
|
+
refactor.
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
const getPublicKeys = async (jwksUrl: string): Promise<MapOfKidToPublicKey> => {
|
|
96
|
+
if (!cacheKeys) {
|
|
97
|
+
const res = await fetch(jwksUrl);
|
|
98
|
+
if (!res.ok) throw new Error(`JWKS fetch failed: ${res.status}`);
|
|
99
|
+
const publicKeys = (await res.json()) as PublicKeys;
|
|
100
|
+
cacheKeys = publicKeys.keys.reduce(/* ... unchanged ... */);
|
|
101
|
+
}
|
|
102
|
+
return cacheKeys;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const getJwksUri = async (discoveryUri: string, jwksUri?: string): Promise<string> => {
|
|
106
|
+
if (jwksUri) return jwksUri;
|
|
107
|
+
const res = await fetch(`${discoveryUri}/.well-known`);
|
|
108
|
+
if (!res.ok) throw new Error(`Issuer metadata fetch failed: ${res.status}`);
|
|
109
|
+
const issuerMetadata = (await res.json()) as IssuerMetadata;
|
|
110
|
+
if (!issuerMetadata.jwks_uri) throw new Error('Issuer does not offer JWKS endpoint');
|
|
111
|
+
return issuerMetadata.jwks_uri;
|
|
112
|
+
};
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Behavior delta vs. axios:
|
|
116
|
+
- axios throws on non-2xx by default; `fetch` does not. We add an explicit
|
|
117
|
+
`if (!res.ok)` check at each call site to preserve the prior behavior.
|
|
118
|
+
- axios JSON-parses based on response `Content-Type`; we call `res.json()`
|
|
119
|
+
explicitly. The two endpoints (JWKS, well-known) are spec-defined to
|
|
120
|
+
return JSON.
|
|
121
|
+
- Error shape changes (no `AxiosError`). Callers in this file already wrap
|
|
122
|
+
with try/catch and log via `lambda-log`, so the visible behavior is the
|
|
123
|
+
same.
|
|
124
|
+
|
|
125
|
+
### Phase 2 — `src/tests/integ-test-util.ts` (breaking change for tests/integ consumers)
|
|
126
|
+
|
|
127
|
+
Two options, choose one before implementation:
|
|
128
|
+
|
|
129
|
+
**Option A — Replace return type with a thin `fetch`-based client (breaking).**
|
|
130
|
+
Introduce a small internal `HttpClient` class with the methods consumers
|
|
131
|
+
actually use (`get`, `post`, optional `put`/`delete`/`patch`), backed by
|
|
132
|
+
`fetch`. Update the exported signatures:
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
public getClient(config?: HttpClientConfig): HttpClient { ... }
|
|
136
|
+
public async getAuthenticatedClient(email, password?, config?): Promise<HttpClient> { ... }
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
`HttpClientConfig` covers the fields actually used today: `baseURL`,
|
|
140
|
+
`headers`, `transformRequest`, `transformResponse`. The `loginUser` flow
|
|
141
|
+
is rewritten internally to call `fetch` directly against the Cognito
|
|
142
|
+
endpoint.
|
|
143
|
+
|
|
144
|
+
This is the cleanest end state. It is a breaking change for anyone
|
|
145
|
+
chaining axios-specific methods (`interceptors`, `defaults`, etc.) on
|
|
146
|
+
the returned client — but the existing public surface in this repo only
|
|
147
|
+
uses `.get`/`.post` with `baseURL` and headers.
|
|
148
|
+
|
|
149
|
+
**Option B — Keep axios in `IntegTestUtil`, move to `devDependencies`/`peerDependencies`.**
|
|
150
|
+
Remove axios only from `auth.ts`. Move axios from `dependencies` to
|
|
151
|
+
`peerDependencies` (optional) in `package.json` so it is no longer pulled
|
|
152
|
+
in transitively by consumers who only use the Lambda runtime helpers.
|
|
153
|
+
Consumers who use `cdk-serverless/tests` add `axios` to their own
|
|
154
|
+
`devDependencies` (standard for test utilities).
|
|
155
|
+
|
|
156
|
+
This is **lower risk** and still removes axios from production Lambda
|
|
157
|
+
bundles, but leaves an axios dep in the picture for test consumers.
|
|
158
|
+
|
|
159
|
+
**Recommendation: Option A.** The public surface of the integ-test client
|
|
160
|
+
is small, the migration is mechanical (replace `client.get('/x').then(r => r.data)`
|
|
161
|
+
with `client.get('/x').then(r => r.json())`), and the end state — zero
|
|
162
|
+
axios — is clean. Bundle as a `feat!`/major in the next breaking release.
|
|
163
|
+
|
|
164
|
+
### Phase 3 — Cleanup
|
|
165
|
+
|
|
166
|
+
- Remove `axios` from `dependencies` in `package.json`.
|
|
167
|
+
- Remove `'axios'` from `deps` in `.projenrc.ts:20`.
|
|
168
|
+
- Run `npx projen` to regenerate `package.json` and lockfile.
|
|
169
|
+
- Verify no transitive axios in the produced Lambda bundles via
|
|
170
|
+
`esbuild --analyze` or `npm ls axios` showing empty.
|
|
171
|
+
|
|
172
|
+
## API Impact
|
|
173
|
+
|
|
174
|
+
| Symbol | Before | After (Option A) | Breaking? |
|
|
175
|
+
|---|---|---|---|
|
|
176
|
+
| `auth.ApiGatewayv1JwtAuthorizer` and friends | — | — | No (internal only) |
|
|
177
|
+
| `tests.IntegTestUtil#getClient` | returns `Axios` | returns `HttpClient` | **Yes** |
|
|
178
|
+
| `tests.IntegTestUtil#getAuthenticatedClient` | returns `Promise<Axios>` | returns `Promise<HttpClient>` | **Yes** |
|
|
179
|
+
| `tests.IntegTestUtil#getClient(config)` | `AxiosRequestConfig` | `HttpClientConfig` (subset) | **Yes** |
|
|
180
|
+
|
|
181
|
+
Migration note for consumers of `IntegTestUtil`:
|
|
182
|
+
- `client.get(path).then(r => r.data)` → `client.get(path).then(r => r.json())`
|
|
183
|
+
- `client.post(path, JSON.stringify(body), { headers })` → same shape, but
|
|
184
|
+
the response shape differs (no `.data`, no `.status` — use `.ok`, `.status`,
|
|
185
|
+
`.json()`).
|
|
186
|
+
|
|
187
|
+
## Testing
|
|
188
|
+
|
|
189
|
+
1. **Unit tests** — exercise `auth.ts` against a local HTTP server that
|
|
190
|
+
serves a mock `/.well-known` document and JWKS. Confirm:
|
|
191
|
+
- Successful key fetch and PEM conversion (cache populated once).
|
|
192
|
+
- 5xx from JWKS endpoint surfaces as an error (existing behavior).
|
|
193
|
+
- Missing `jwks_uri` in metadata throws.
|
|
194
|
+
2. **Lambda test utilities** — update existing `lambda-test-utils.ts` tests
|
|
195
|
+
if any depend on the axios import path (none today, but verify).
|
|
196
|
+
3. **Integ tests** — re-run any integ test in this repo that uses
|
|
197
|
+
`IntegTestUtil` against a real Cognito user pool to confirm
|
|
198
|
+
`getClient`/`getAuthenticatedClient`/`loginUser` paths work with the
|
|
199
|
+
new client.
|
|
200
|
+
4. **Bundle size check** — run `esbuild` over `src/lambda/handler.ts` before
|
|
201
|
+
and after to record the delta. Include the number in the PR description.
|
|
202
|
+
|
|
203
|
+
## Alternatives Considered
|
|
204
|
+
|
|
205
|
+
1. **`node-fetch` or `undici` directly.** `node-fetch` is a polyfill we
|
|
206
|
+
don't need; `undici` is what `fetch` is built on, but using it directly
|
|
207
|
+
adds a runtime dep without benefit. Native `fetch` is the right call.
|
|
208
|
+
2. **Keep axios, pin tighter, add interceptors for fetch-like ergonomics.**
|
|
209
|
+
Doesn't address bundle size or supply-chain motivations.
|
|
210
|
+
3. **Vendor a tiny `http`/`https` wrapper.** Works on older Node, but the
|
|
211
|
+
minimum supported runtime here (`NODEJS_LATEST`) makes `fetch` strictly
|
|
212
|
+
better.
|
|
213
|
+
|
|
214
|
+
## Rollout
|
|
215
|
+
|
|
216
|
+
1. Land Phase 1 (`auth.ts` only) as a non-breaking `chore:` or `refactor:`
|
|
217
|
+
commit. This already removes axios from the **Lambda runtime** code path
|
|
218
|
+
even before the API is changed.
|
|
219
|
+
2. Land Phase 2 (`IntegTestUtil`) as a `feat!:` commit gated to a major
|
|
220
|
+
bump. Document the migration in the release notes / CHANGELOG.
|
|
221
|
+
3. Land Phase 3 (`package.json` / `.projenrc.ts` cleanup) together with
|
|
222
|
+
Phase 2.
|
|
223
|
+
|
|
224
|
+
If we choose Option B instead, Phase 2 becomes a `chore:` (move axios to
|
|
225
|
+
peerDependencies, document in README) and there is no major bump.
|
|
226
|
+
|
|
227
|
+
## Open Questions
|
|
228
|
+
|
|
229
|
+
1. **Option A vs. Option B** — accept a breaking change in `IntegTestUtil`,
|
|
230
|
+
or keep axios there and just move it to `peerDependencies`? (Recommendation
|
|
231
|
+
above is A.)
|
|
232
|
+
2. **Cache invalidation on fetch failure** — should we clear `cacheKeys` if
|
|
233
|
+
a JWKS rotation makes a previously-cached `kid` invalid? Out of scope for
|
|
234
|
+
this spec, but worth filing as a follow-up if not already tracked.
|
|
235
|
+
3. **Timeout behavior** — `fetch` has no default timeout. Should we wrap
|
|
236
|
+
the JWKS/well-known fetches with `AbortSignal.timeout(5000)`? axios also
|
|
237
|
+
had no default timeout in our usage, so behavior parity is preserved
|
|
238
|
+
without it — but adding one is cheap and prevents a hang on a dead JWKS
|
|
239
|
+
host from blocking a cold start. Recommendation: add
|
|
240
|
+
`AbortSignal.timeout(5000)`.
|