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.
@@ -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
@@ -1,2 +1,3 @@
1
+ export * from './http-client';
1
2
  export * from './integ-test-util';
2
3
  export * from './lambda-test-utils';
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUFrQztBQUNsQyxzREFBb0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ludGVnLXRlc3QtdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2xhbWJkYS10ZXN0LXV0aWxzJzsiXX0=
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?: AxiosRequestConfig): Axios;
32
- getAuthenticatedClient(email: string, password?: string, config?: AxiosRequestConfig): Promise<Axios>;
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 axios_1.Axios({
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 axios_1.Axios({
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('/', JSON.stringify({
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.status !== axios_1.HttpStatusCode.Ok) {
159
+ if (!auth.ok) {
173
160
  throw new Error(`Failed to authenticate user ${email}`);
174
161
  }
175
- const token = JSON.parse(auth.data).AuthenticationResult.IdToken;
162
+ const token = (await auth.json()).AuthenticationResult.IdToken;
176
163
  this.apiTokens[email] = {
177
164
  token,
178
- payload: (0, jsonwebtoken_1.decode)(this.apiTokens[email].token),
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": "2.22.4",
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)`.