@segment/actions-core 1.3.0-next.0 → 2.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/dist/cjs/create-request-client.d.ts +4 -3
- package/dist/cjs/create-request-client.js +24 -14
- package/dist/cjs/create-test-event.d.ts +2 -0
- package/dist/cjs/create-test-event.js +45 -0
- package/dist/cjs/create-test-integration.d.ts +36 -0
- package/dist/cjs/create-test-integration.js +34 -0
- package/dist/cjs/destination-kit/action.d.ts +7 -5
- package/dist/cjs/destination-kit/action.js +27 -30
- package/dist/cjs/destination-kit/index.d.ts +10 -5
- package/dist/cjs/destination-kit/index.js +8 -16
- package/dist/cjs/destination-kit/step.d.ts +1 -1
- package/dist/cjs/destination-kit/types.d.ts +3 -19
- package/dist/cjs/errors.d.ts +7 -0
- package/dist/cjs/errors.js +14 -0
- package/dist/cjs/fetch.d.ts +3 -0
- package/dist/cjs/fetch.js +29 -0
- package/dist/cjs/index.d.ts +7 -2
- package/dist/cjs/index.js +16 -2
- package/dist/cjs/map-values.d.ts +7 -0
- package/dist/cjs/map-values.js +16 -0
- package/dist/cjs/middleware/add-basic-auth-header.d.ts +3 -0
- package/dist/cjs/middleware/add-basic-auth-header.js +21 -0
- package/dist/cjs/request-client.d.ts +95 -0
- package/dist/cjs/request-client.js +227 -0
- package/dist/esm/create-request-client.d.ts +4 -3
- package/dist/esm/create-request-client.js +24 -14
- package/dist/esm/create-test-event.d.ts +2 -0
- package/dist/esm/create-test-event.js +41 -0
- package/dist/esm/create-test-integration.d.ts +36 -0
- package/dist/esm/create-test-integration.js +30 -0
- package/dist/esm/destination-kit/action.d.ts +7 -5
- package/dist/esm/destination-kit/action.js +27 -30
- package/dist/esm/destination-kit/index.d.ts +10 -5
- package/dist/esm/destination-kit/index.js +8 -16
- package/dist/esm/destination-kit/step.d.ts +1 -1
- package/dist/esm/destination-kit/types.d.ts +3 -19
- package/dist/esm/errors.d.ts +7 -0
- package/dist/esm/errors.js +10 -0
- package/dist/esm/fetch.d.ts +3 -0
- package/dist/esm/fetch.js +5 -0
- package/dist/esm/index.d.ts +7 -2
- package/dist/esm/index.js +5 -1
- package/dist/esm/map-values.d.ts +7 -0
- package/dist/esm/map-values.js +12 -0
- package/dist/esm/middleware/add-basic-auth-header.d.ts +3 -0
- package/dist/esm/middleware/add-basic-auth-header.js +16 -0
- package/dist/esm/request-client.d.ts +95 -0
- package/dist/esm/request-client.js +199 -0
- package/package.json +8 -7
package/dist/cjs/index.js
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isString = exports.isArray = exports.isObject = exports.realTypeOf = exports.duration = exports.time = exports.removeUndefined = exports.omit = exports.get = exports.defaultValues = exports.transform = exports.jsonSchemaToFields = exports.fieldsToJsonSchema = exports.Destination = void 0;
|
|
6
|
+
exports.Headers = exports.Response = exports.Request = exports.fetch = exports.isString = exports.isArray = exports.isObject = exports.realTypeOf = exports.duration = exports.time = exports.removeUndefined = exports.omit = exports.get = exports.UnsupportedActionError = exports.defaultValues = exports.createTestIntegration = exports.createTestEvent = exports.transform = exports.jsonSchemaToFields = exports.fieldsToJsonSchema = exports.Destination = void 0;
|
|
4
7
|
var destination_kit_1 = require("./destination-kit");
|
|
5
8
|
Object.defineProperty(exports, "Destination", { enumerable: true, get: function () { return destination_kit_1.Destination; } });
|
|
6
9
|
Object.defineProperty(exports, "fieldsToJsonSchema", { enumerable: true, get: function () { return destination_kit_1.fieldsToJsonSchema; } });
|
|
7
10
|
Object.defineProperty(exports, "jsonSchemaToFields", { enumerable: true, get: function () { return destination_kit_1.jsonSchemaToFields; } });
|
|
8
11
|
var mapping_kit_1 = require("./mapping-kit");
|
|
9
12
|
Object.defineProperty(exports, "transform", { enumerable: true, get: function () { return mapping_kit_1.transform; } });
|
|
13
|
+
var create_test_event_1 = require("./create-test-event");
|
|
14
|
+
Object.defineProperty(exports, "createTestEvent", { enumerable: true, get: function () { return create_test_event_1.createTestEvent; } });
|
|
15
|
+
var create_test_integration_1 = require("./create-test-integration");
|
|
16
|
+
Object.defineProperty(exports, "createTestIntegration", { enumerable: true, get: function () { return create_test_integration_1.createTestIntegration; } });
|
|
10
17
|
var defaults_1 = require("./defaults");
|
|
11
18
|
Object.defineProperty(exports, "defaultValues", { enumerable: true, get: function () { return defaults_1.defaultValues; } });
|
|
19
|
+
var errors_1 = require("./errors");
|
|
20
|
+
Object.defineProperty(exports, "UnsupportedActionError", { enumerable: true, get: function () { return errors_1.UnsupportedActionError; } });
|
|
12
21
|
var get_1 = require("./get");
|
|
13
22
|
Object.defineProperty(exports, "get", { enumerable: true, get: function () { return get_1.get; } });
|
|
14
23
|
var omit_1 = require("./omit");
|
|
@@ -23,4 +32,9 @@ Object.defineProperty(exports, "realTypeOf", { enumerable: true, get: function (
|
|
|
23
32
|
Object.defineProperty(exports, "isObject", { enumerable: true, get: function () { return real_type_of_1.isObject; } });
|
|
24
33
|
Object.defineProperty(exports, "isArray", { enumerable: true, get: function () { return real_type_of_1.isArray; } });
|
|
25
34
|
Object.defineProperty(exports, "isString", { enumerable: true, get: function () { return real_type_of_1.isString; } });
|
|
26
|
-
|
|
35
|
+
var fetch_1 = require("./fetch");
|
|
36
|
+
Object.defineProperty(exports, "fetch", { enumerable: true, get: function () { return __importDefault(fetch_1).default; } });
|
|
37
|
+
Object.defineProperty(exports, "Request", { enumerable: true, get: function () { return fetch_1.Request; } });
|
|
38
|
+
Object.defineProperty(exports, "Response", { enumerable: true, get: function () { return fetch_1.Response; } });
|
|
39
|
+
Object.defineProperty(exports, "Headers", { enumerable: true, get: function () { return fetch_1.Headers; } });
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQXVGO0FBQTlFLDhHQUFBLFdBQVcsT0FBQTtBQUFFLHFIQUFBLGtCQUFrQixPQUFBO0FBQUUscUhBQUEsa0JBQWtCLE9BQUE7QUFDNUQsNkNBQXlDO0FBQWhDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix5REFBcUQ7QUFBNUMsb0hBQUEsZUFBZSxPQUFBO0FBQ3hCLHFFQUFpRTtBQUF4RCxnSUFBQSxxQkFBcUIsT0FBQTtBQUM5Qix1Q0FBMEM7QUFBakMseUdBQUEsYUFBYSxPQUFBO0FBQ3RCLG1DQUFpRDtBQUF4QyxnSEFBQSxzQkFBc0IsT0FBQTtBQUMvQiw2QkFBMkI7QUFBbEIsMEZBQUEsR0FBRyxPQUFBO0FBQ1osK0JBQTZCO0FBQXBCLDRGQUFBLElBQUksT0FBQTtBQUNiLHVEQUFvRDtBQUEzQyxtSEFBQSxlQUFlLE9BQUE7QUFDeEIsK0JBQXVDO0FBQTlCLDRGQUFBLElBQUksT0FBQTtBQUFFLGdHQUFBLFFBQVEsT0FBQTtBQUV2QiwrQ0FBd0U7QUFBL0QsMEdBQUEsVUFBVSxPQUFBO0FBQUUsd0dBQUEsUUFBUSxPQUFBO0FBQUUsdUdBQUEsT0FBTyxPQUFBO0FBQUUsd0dBQUEsUUFBUSxPQUFBO0FBR2hELGlDQUFzRTtBQUE3RCwrR0FBQSxPQUFPLE9BQVM7QUFBRSxnR0FBQSxPQUFPLE9BQUE7QUFBRSxpR0FBQSxRQUFRLE9BQUE7QUFBRSxnR0FBQSxPQUFPLE9BQUEifQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight alternative to lodash.mapValues
|
|
3
|
+
* Creates an object with the same keys as the input object
|
|
4
|
+
*/
|
|
5
|
+
export declare function mapValues<Values extends Record<string, unknown>, Obj extends Record<string, Values>, ValueKey extends keyof Values>(obj: Obj, key: ValueKey): {
|
|
6
|
+
[K in keyof Obj]: Obj[K][ValueKey];
|
|
7
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapValues = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Lightweight alternative to lodash.mapValues
|
|
6
|
+
* Creates an object with the same keys as the input object
|
|
7
|
+
*/
|
|
8
|
+
function mapValues(obj, key) {
|
|
9
|
+
return Object.entries(obj).reduce((agg, [name, value]) => {
|
|
10
|
+
// @ts-ignore this is a pretty complex type, skipping for now
|
|
11
|
+
agg[name] = value[key];
|
|
12
|
+
return agg;
|
|
13
|
+
}, {});
|
|
14
|
+
}
|
|
15
|
+
exports.mapValues = mapValues;
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXZhbHVlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXAtdmFsdWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7R0FHRztBQUNILFNBQWdCLFNBQVMsQ0FJdkIsR0FBUSxFQUFFLEdBQWE7SUFDdkIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQ3ZELDZEQUE2RDtRQUM3RCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3RCLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQyxFQUFFLEVBQTRDLENBQUMsQ0FBQTtBQUNsRCxDQUFDO0FBVkQsOEJBVUMifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const btoa_lite_1 = __importDefault(require("btoa-lite"));
|
|
7
|
+
const addBasicAuthHeader = (options) => {
|
|
8
|
+
if (options.username || options.password) {
|
|
9
|
+
const username = options.username || '';
|
|
10
|
+
const password = options.password || '';
|
|
11
|
+
const encoded = btoa_lite_1.default(`${username}:${password}`);
|
|
12
|
+
const authorization = `Basic ${encoded}`;
|
|
13
|
+
return {
|
|
14
|
+
headers: {
|
|
15
|
+
Authorization: authorization
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.default = addBasicAuthHeader;
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWJhc2ljLWF1dGgtaGVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21pZGRsZXdhcmUvYWRkLWJhc2ljLWF1dGgtaGVhZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMERBQTRCO0FBRzVCLE1BQU0sa0JBQWtCLEdBQXNCLENBQUMsT0FBTyxFQUFFLEVBQUU7SUFDeEQsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7UUFDeEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUE7UUFDdkMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUE7UUFDdkMsTUFBTSxPQUFPLEdBQUcsbUJBQUksQ0FBQyxHQUFHLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQy9DLE1BQU0sYUFBYSxHQUFHLFNBQVMsT0FBTyxFQUFFLENBQUE7UUFFeEMsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUCxhQUFhLEVBQUUsYUFBYTthQUM3QjtTQUNGLENBQUE7S0FDRjtBQUNILENBQUMsQ0FBQTtBQUVELGtCQUFlLGtCQUFrQixDQUFBIn0=
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { CustomError } from 'ts-custom-error';
|
|
2
|
+
declare type LowerAndUpper<T extends string> = Lowercase<T> | Uppercase<T>;
|
|
3
|
+
/**
|
|
4
|
+
* The supported request options you can use with the request client
|
|
5
|
+
*/
|
|
6
|
+
export interface RequestOptions extends Omit<RequestInit, 'headers'> {
|
|
7
|
+
/**
|
|
8
|
+
* Simplified header format to reduce variation
|
|
9
|
+
*/
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
/**
|
|
12
|
+
* Shortcut for sending JSON. Use instead of `body`.
|
|
13
|
+
* Accepts any plain object or value, which will be `JSON.stringify()`'d and sent in the body with the correct header set.
|
|
14
|
+
*/
|
|
15
|
+
json?: unknown;
|
|
16
|
+
/**
|
|
17
|
+
* HTTP method used to make the request.
|
|
18
|
+
* Internally, the standard methods (`GET`, `POST`, `PUT`, `PATCH`, `HEAD` and `DELETE`) are uppercased in order to avoid server errors due to case sensitivity.
|
|
19
|
+
* @default 'get'
|
|
20
|
+
*/
|
|
21
|
+
method?: LowerAndUpper<'get' | 'post' | 'put' | 'delete' | 'patch' | 'head'>;
|
|
22
|
+
/**
|
|
23
|
+
* When provided, will automatically apply basic authentication
|
|
24
|
+
*/
|
|
25
|
+
password?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Search parameters to include int he request URL. Setting this will override existing search parameters in the input URL.
|
|
28
|
+
* Accepts [`URLSearchParams()`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/URLSearchParams)
|
|
29
|
+
*/
|
|
30
|
+
searchParams?: URLSearchParams | Record<string, string | number | boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Throw an error when, after redirects, the response has a non-2xx status code.
|
|
33
|
+
* @default true
|
|
34
|
+
*/
|
|
35
|
+
throwHttpErrors?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Timeout in milliseconds for getting a response.
|
|
38
|
+
* If set to `false` there will be no timeout.
|
|
39
|
+
* @default 10000
|
|
40
|
+
*/
|
|
41
|
+
timeout?: number | false;
|
|
42
|
+
/**
|
|
43
|
+
* When provided, will automatically apply basic authentication
|
|
44
|
+
*/
|
|
45
|
+
username?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* All request options including before/after hooks
|
|
49
|
+
*/
|
|
50
|
+
export interface AllRequestOptions extends RequestOptions {
|
|
51
|
+
/**
|
|
52
|
+
* Hooks that execute before a request is sent.
|
|
53
|
+
* Useful to modify the options that a request will use
|
|
54
|
+
*/
|
|
55
|
+
beforeRequest?: BeforeRequestHook[];
|
|
56
|
+
/**
|
|
57
|
+
* Hooks that executes after a response is received.
|
|
58
|
+
* Useful for logging, cleanup, or modifying the response object
|
|
59
|
+
*/
|
|
60
|
+
afterResponse?: AfterResponseHook[];
|
|
61
|
+
}
|
|
62
|
+
export interface NormalizedOptions extends Omit<AllRequestOptions, 'headers'> {
|
|
63
|
+
headers: RequestInit['headers'];
|
|
64
|
+
method: Uppercase<'get' | 'post' | 'put' | 'delete' | 'patch' | 'head'>;
|
|
65
|
+
}
|
|
66
|
+
declare type MaybePromise<T> = Promise<T> | T;
|
|
67
|
+
/** A hook that executes before a request is executed. Useful to modify the options that a request will use */
|
|
68
|
+
export declare type BeforeRequestHook = (options: NormalizedOptions) => MaybePromise<RequestOptions | void>;
|
|
69
|
+
/** A hook that executes after a response is received. Useful for logging, cleanup, or modifying the response object */
|
|
70
|
+
export declare type AfterResponseHook = (request: Request, options: NormalizedOptions, response: Response) => MaybePromise<Response | void>;
|
|
71
|
+
/** Error thrown when a response has a non-2xx response. */
|
|
72
|
+
export declare class HTTPError extends CustomError {
|
|
73
|
+
request: Request;
|
|
74
|
+
response: ModifiedResponse;
|
|
75
|
+
options: NormalizedOptions;
|
|
76
|
+
constructor(response: ModifiedResponse, request: Request, options: NormalizedOptions);
|
|
77
|
+
}
|
|
78
|
+
/** Error thrown when a request is aborted because of a client timeout. */
|
|
79
|
+
export declare class TimeoutError extends CustomError {
|
|
80
|
+
request: Request;
|
|
81
|
+
options: NormalizedOptions;
|
|
82
|
+
constructor(request: Request, options: NormalizedOptions);
|
|
83
|
+
}
|
|
84
|
+
export interface ModifiedResponse extends Response {
|
|
85
|
+
data?: unknown;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Creates a new instance of the fetch request client,
|
|
89
|
+
* optionally with default configuration to apply to all requests made with the client
|
|
90
|
+
*/
|
|
91
|
+
export default function createInstance(defaults?: AllRequestOptions): {
|
|
92
|
+
(url: string, options?: RequestOptions): Promise<ModifiedResponse>;
|
|
93
|
+
extend(newDefaults: AllRequestOptions): any;
|
|
94
|
+
};
|
|
95
|
+
export {};
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.TimeoutError = exports.HTTPError = void 0;
|
|
26
|
+
const abort_controller_1 = __importDefault(require("abort-controller"));
|
|
27
|
+
const ts_custom_error_1 = require("ts-custom-error");
|
|
28
|
+
const fetch_1 = __importStar(require("./fetch"));
|
|
29
|
+
const real_type_of_1 = require("./real-type-of");
|
|
30
|
+
// We need the loose definition of "object" to iterate over things like `[object Headers]`
|
|
31
|
+
const isObjectLike = (value) => {
|
|
32
|
+
return value !== null && typeof value === 'object';
|
|
33
|
+
};
|
|
34
|
+
/** Merges two sets of headers intelligently */
|
|
35
|
+
function mergeHeaders(source1, source2) {
|
|
36
|
+
const result = new fetch_1.Headers(source1 || {});
|
|
37
|
+
const source = new fetch_1.Headers(source2 || {});
|
|
38
|
+
source.forEach((value, key) => {
|
|
39
|
+
// `value` may be the string `undefined` when the source is a Headers object
|
|
40
|
+
if (value === 'undefined') {
|
|
41
|
+
result.delete(key);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
result.set(key, value);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
/** Deeply merge multiple objects or arrays. Arrays get concatenated. */
|
|
50
|
+
function merge(...sources) {
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
let result = {};
|
|
53
|
+
let headers = {};
|
|
54
|
+
for (const source of sources) {
|
|
55
|
+
if (Array.isArray(source)) {
|
|
56
|
+
if (!Array.isArray(result)) {
|
|
57
|
+
result = [];
|
|
58
|
+
}
|
|
59
|
+
// Concatenate arrays (e.g. hooks)
|
|
60
|
+
result = [...result, ...source];
|
|
61
|
+
}
|
|
62
|
+
else if (isObjectLike(source)) {
|
|
63
|
+
// eslint-disable-next-line prefer-const
|
|
64
|
+
for (let [key, value] of Object.entries(source)) {
|
|
65
|
+
// Recurse over objects
|
|
66
|
+
if (isObjectLike(value) && key in result) {
|
|
67
|
+
value = merge(result[key], value);
|
|
68
|
+
}
|
|
69
|
+
// Update the key's value in our copy
|
|
70
|
+
result[key] = value;
|
|
71
|
+
}
|
|
72
|
+
// Merge headers more carefully to handle duplicates
|
|
73
|
+
if (isObjectLike(source.headers)) {
|
|
74
|
+
headers = mergeHeaders(headers, source.headers);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Assign after we've merged all the headers because they are handled specially
|
|
78
|
+
result.headers = headers;
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Validates and merges request options
|
|
84
|
+
*/
|
|
85
|
+
function mergeOptions(...sources) {
|
|
86
|
+
for (const source of sources) {
|
|
87
|
+
if (!real_type_of_1.isObject(source)) {
|
|
88
|
+
throw new TypeError(`The 'options' argument must be an object`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return merge({}, ...sources);
|
|
92
|
+
}
|
|
93
|
+
function getRequestMethod(method) {
|
|
94
|
+
return method.toUpperCase();
|
|
95
|
+
}
|
|
96
|
+
/** Error thrown when a response has a non-2xx response. */
|
|
97
|
+
class HTTPError extends ts_custom_error_1.CustomError {
|
|
98
|
+
constructor(response, request, options) {
|
|
99
|
+
var _a, _b;
|
|
100
|
+
super((_a = response.statusText) !== null && _a !== void 0 ? _a : String((_b = response.status) !== null && _b !== void 0 ? _b : 'Unknown response error'));
|
|
101
|
+
this.response = response;
|
|
102
|
+
this.request = request;
|
|
103
|
+
this.options = options;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.HTTPError = HTTPError;
|
|
107
|
+
/** Error thrown when a request is aborted because of a client timeout. */
|
|
108
|
+
class TimeoutError extends ts_custom_error_1.CustomError {
|
|
109
|
+
constructor(request, options) {
|
|
110
|
+
super(`Request timed out`);
|
|
111
|
+
this.request = request;
|
|
112
|
+
this.options = options;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.TimeoutError = TimeoutError;
|
|
116
|
+
/**
|
|
117
|
+
* Given a request, reject the request when a timeout is exceeded
|
|
118
|
+
*/
|
|
119
|
+
function timeoutFetch(request, abortController, options) {
|
|
120
|
+
return new Promise((resolve, reject) => {
|
|
121
|
+
const timer = setTimeout(() => {
|
|
122
|
+
if (abortController) {
|
|
123
|
+
abortController.abort();
|
|
124
|
+
}
|
|
125
|
+
reject(new TimeoutError(request, options));
|
|
126
|
+
}, options.timeout);
|
|
127
|
+
void fetch_1.default(request)
|
|
128
|
+
.then(resolve)
|
|
129
|
+
.catch(reject)
|
|
130
|
+
.then(() => clearTimeout(timer));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
class RequestClient {
|
|
134
|
+
constructor(url, options = {}) {
|
|
135
|
+
this.setOptions(url, options);
|
|
136
|
+
}
|
|
137
|
+
setOptions(url, options) {
|
|
138
|
+
var _a, _b;
|
|
139
|
+
this.options = {
|
|
140
|
+
...options,
|
|
141
|
+
method: getRequestMethod((_a = options.method) !== null && _a !== void 0 ? _a : 'get'),
|
|
142
|
+
throwHttpErrors: options.throwHttpErrors !== false,
|
|
143
|
+
timeout: (_b = options.timeout) !== null && _b !== void 0 ? _b : 10000
|
|
144
|
+
};
|
|
145
|
+
// Timeout support. Use our own abort controller so consumers can pass in their own `signal`
|
|
146
|
+
// if they wish to use timeouts alongside other logic to abort a request
|
|
147
|
+
this.abortController = new abort_controller_1.default();
|
|
148
|
+
if (this.options.signal) {
|
|
149
|
+
// Listen to consumer abort events to also abort our internal controller
|
|
150
|
+
this.options.signal.addEventListener('abort', () => {
|
|
151
|
+
this.abortController.abort();
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// Use our internal abort controller for fetch
|
|
155
|
+
this.options.signal = this.abortController.signal;
|
|
156
|
+
// Construct a request object to send to the Fetch API
|
|
157
|
+
this.request = new fetch_1.Request(url, this.options);
|
|
158
|
+
// Parse search params and merge them with the request URL
|
|
159
|
+
if (this.options.searchParams) {
|
|
160
|
+
// The type is a bit too restrictive, since you can pass in other primitives like `{ foo: 1, bar: true }`
|
|
161
|
+
const searchParams = new URLSearchParams(this.options.searchParams);
|
|
162
|
+
const url = new URL(this.request.url);
|
|
163
|
+
url.search = searchParams.toString();
|
|
164
|
+
// Update the request object with the new url including the search params
|
|
165
|
+
this.request = new fetch_1.Request(new fetch_1.Request(url.toString(), this.request), this.options);
|
|
166
|
+
}
|
|
167
|
+
// Automatically handle json header + stringification as a convenience when using `json` option
|
|
168
|
+
if (this.options.json !== undefined) {
|
|
169
|
+
this.options.body = JSON.stringify(this.options.json);
|
|
170
|
+
this.request.headers.set('content-type', 'application/json');
|
|
171
|
+
this.request = new fetch_1.Request(this.request, { body: this.options.body });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async executeRequest() {
|
|
175
|
+
var _a;
|
|
176
|
+
let response = await this.fetch();
|
|
177
|
+
for (const hook of (_a = this.options.afterResponse) !== null && _a !== void 0 ? _a : []) {
|
|
178
|
+
const modifiedResponse = await hook(this.request, this.options, response.clone());
|
|
179
|
+
if (modifiedResponse instanceof fetch_1.Response) {
|
|
180
|
+
response = modifiedResponse;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Automatically attempt to parse json responses, matching the content-type
|
|
184
|
+
const contentType = response.headers.get('content-type');
|
|
185
|
+
if (contentType === null || contentType === void 0 ? void 0 : contentType.includes('application/json')) {
|
|
186
|
+
try {
|
|
187
|
+
// call `.json` on a clone, to prevent `TypeError: body used already` in callers
|
|
188
|
+
response.data = await response.clone().json();
|
|
189
|
+
}
|
|
190
|
+
catch (_error) {
|
|
191
|
+
// Ignore the error
|
|
192
|
+
response.data = null;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (!response.ok && this.options.throwHttpErrors) {
|
|
196
|
+
throw new HTTPError(response, this.request, this.options);
|
|
197
|
+
}
|
|
198
|
+
return response;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Make a fetch request, running all beforeRequest hooks, and optionally wrap in a timeout
|
|
202
|
+
*/
|
|
203
|
+
async fetch() {
|
|
204
|
+
var _a;
|
|
205
|
+
for (const hook of (_a = this.options.beforeRequest) !== null && _a !== void 0 ? _a : []) {
|
|
206
|
+
const newOptions = await hook({ ...this.options });
|
|
207
|
+
if (newOptions && real_type_of_1.isObject(newOptions)) {
|
|
208
|
+
this.setOptions(this.request.url, mergeOptions(this.options, newOptions));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (this.options.timeout === false) {
|
|
212
|
+
return fetch_1.default(this.request.clone());
|
|
213
|
+
}
|
|
214
|
+
return timeoutFetch(this.request.clone(), this.abortController, this.options);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Creates a new instance of the fetch request client,
|
|
219
|
+
* optionally with default configuration to apply to all requests made with the client
|
|
220
|
+
*/
|
|
221
|
+
function createInstance(defaults = {}) {
|
|
222
|
+
const client = (url, options = {}) => new RequestClient(url, mergeOptions(defaults, options)).executeRequest();
|
|
223
|
+
client.extend = (newDefaults) => createInstance(mergeOptions(defaults, newDefaults));
|
|
224
|
+
return client;
|
|
225
|
+
}
|
|
226
|
+
exports.default = createInstance;
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVxdWVzdC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdFQUE4QztBQUM5QyxxREFBNkM7QUFDN0MsaURBQTJEO0FBQzNELGlEQUF5QztBQW9GekMsMEZBQTBGO0FBQzFGLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBYyxFQUF1QyxFQUFFO0lBQzNFLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUE7QUFDcEQsQ0FBQyxDQUFBO0FBRUQsK0NBQStDO0FBQy9DLFNBQVMsWUFBWSxDQUFDLE9BQStCLEVBQUUsT0FBK0I7SUFDcEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUV6QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzVCLDRFQUE0RTtRQUM1RSxJQUFJLEtBQUssS0FBSyxXQUFXLEVBQUU7WUFDekIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUNuQjthQUFNO1lBQ0wsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7U0FDdkI7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLEtBQUssQ0FBSSxHQUFHLE9BQVk7SUFDL0IsOERBQThEO0lBQzlELElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQTtJQUNwQixJQUFJLE9BQU8sR0FBMkIsRUFBRSxDQUFBO0lBRXhDLEtBQUssTUFBTSxNQUFNLElBQUks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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AllRequestOptions, RequestOptions } from './request-client';
|
|
2
|
+
export declare type RequestClient = ReturnType<typeof createRequestClient>;
|
|
2
3
|
/**
|
|
3
|
-
* Creates a
|
|
4
|
+
* Creates a request client instance with Segment's default configuration + custom options
|
|
4
5
|
*/
|
|
5
|
-
export default function createRequestClient(...
|
|
6
|
+
export default function createRequestClient(...requestOptions: AllRequestOptions[]): (url: string, options?: RequestOptions | undefined) => Promise<import("./request-client").ModifiedResponse>;
|
|
@@ -1,18 +1,28 @@
|
|
|
1
|
-
import
|
|
1
|
+
import addBasicAuthHeader from './middleware/add-basic-auth-header';
|
|
2
|
+
import createInstance from './request-client';
|
|
3
|
+
const baseClient = createInstance({
|
|
4
|
+
timeout: 10000,
|
|
5
|
+
headers: {
|
|
6
|
+
'user-agent': 'Segment'
|
|
7
|
+
},
|
|
8
|
+
beforeRequest: [
|
|
9
|
+
// Automatically handle username/password -> basic auth header
|
|
10
|
+
addBasicAuthHeader
|
|
11
|
+
]
|
|
12
|
+
});
|
|
2
13
|
/**
|
|
3
|
-
* Creates a
|
|
14
|
+
* Creates a request client instance with Segment's default configuration + custom options
|
|
4
15
|
*/
|
|
5
|
-
export default function createRequestClient(...
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
export default function createRequestClient(...requestOptions) {
|
|
17
|
+
let client = baseClient;
|
|
18
|
+
// TODO include `data` bundle in before/after hooks
|
|
19
|
+
// TODO expose before/after hooks to destination definition and action definition?
|
|
20
|
+
for (const options of (requestOptions !== null && requestOptions !== void 0 ? requestOptions : [])) {
|
|
21
|
+
client = client.extend(options);
|
|
22
|
+
}
|
|
23
|
+
// Limit request client interface and handle basic auth scheme
|
|
24
|
+
return (url, options) => {
|
|
25
|
+
return client(url, options);
|
|
14
26
|
};
|
|
15
|
-
const client = got.extend(defaultOptions, ...options);
|
|
16
|
-
return client;
|
|
17
27
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXJlcXVlc3QtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NyZWF0ZS1yZXF1ZXN0LWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGtCQUFrQixNQUFNLG9DQUFvQyxDQUFBO0FBQ25FLE9BQU8sY0FBcUQsTUFBTSxrQkFBa0IsQ0FBQTtBQUVwRixNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUM7SUFDaEMsT0FBTyxFQUFFLEtBQUs7SUFDZCxPQUFPLEVBQUU7UUFDUCxZQUFZLEVBQUUsU0FBUztLQUN4QjtJQUNELGFBQWEsRUFBRTtRQUNiLDhEQUE4RDtRQUM5RCxrQkFBa0I7S0FDbkI7Q0FDRixDQUFDLENBQUE7QUFJRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsbUJBQW1CLENBQUMsR0FBRyxjQUFtQztJQUNoRixJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUE7SUFFdkIsbURBQW1EO0lBQ25ELGtGQUFrRjtJQUNsRixLQUFLLE1BQU0sT0FBTyxJQUFJLENBQUMsY0FBYyxhQUFkLGNBQWMsY0FBZCxjQUFjLEdBQUksRUFBRSxDQUFDLEVBQUU7UUFDNUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDaEM7SUFFRCw4REFBOEQ7SUFDOUQsT0FBTyxDQUFDLEdBQVcsRUFBRSxPQUF3QixFQUFFLEVBQUU7UUFDL0MsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzdCLENBQUMsQ0FBQTtBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
export function createTestEvent(event = {}) {
|
|
3
|
+
return {
|
|
4
|
+
anonymousId: uuidv4(),
|
|
5
|
+
context: {
|
|
6
|
+
ip: '8.8.8.8',
|
|
7
|
+
library: {
|
|
8
|
+
name: 'analytics.js',
|
|
9
|
+
version: '2.11.1'
|
|
10
|
+
},
|
|
11
|
+
locale: 'en-US',
|
|
12
|
+
location: {
|
|
13
|
+
city: 'San Francisco',
|
|
14
|
+
country: 'United States',
|
|
15
|
+
latitude: 40.2964197,
|
|
16
|
+
longitude: -76.9411617,
|
|
17
|
+
speed: 0
|
|
18
|
+
},
|
|
19
|
+
page: {
|
|
20
|
+
path: '/academy/',
|
|
21
|
+
referrer: '',
|
|
22
|
+
search: '',
|
|
23
|
+
title: 'Analytics Academy',
|
|
24
|
+
url: 'https://segment.com/academy/'
|
|
25
|
+
},
|
|
26
|
+
timezone: 'Europe/Amsterdam',
|
|
27
|
+
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
|
|
28
|
+
},
|
|
29
|
+
event: 'Test Event',
|
|
30
|
+
messageId: uuidv4(),
|
|
31
|
+
properties: {},
|
|
32
|
+
receivedAt: new Date().toISOString(),
|
|
33
|
+
sentAt: new Date().toISOString(),
|
|
34
|
+
timestamp: new Date().toISOString(),
|
|
35
|
+
traits: {},
|
|
36
|
+
type: 'track',
|
|
37
|
+
userId: 'user1234',
|
|
38
|
+
...event
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlc3QtZXZlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY3JlYXRlLXRlc3QtZXZlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFHbkMsTUFBTSxVQUFVLGVBQWUsQ0FBQyxRQUErQixFQUFFO0lBQy9ELE9BQU87UUFDTCxXQUFXLEVBQUUsTUFBTSxFQUFFO1FBQ3JCLE9BQU8sRUFBRTtZQUNQLEVBQUUsRUFBRSxTQUFTO1lBQ2IsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxjQUFjO2dCQUNwQixPQUFPLEVBQUUsUUFBUTthQUNsQjtZQUNELE1BQU0sRUFBRSxPQUFPO1lBQ2YsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxlQUFlO2dCQUNyQixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLFNBQVMsRUFBRSxDQUFDLFVBQVU7Z0JBQ3RCLEtBQUssRUFBRSxDQUFDO2FBQ1Q7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFFBQVEsRUFBRSxFQUFFO2dCQUNaLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUssRUFBRSxtQkFBbUI7Z0JBQzFCLEdBQUcsRUFBRSw4QkFBOEI7YUFDcEM7WUFDRCxRQUFRLEVBQUUsa0JBQWtCO1lBQzVCLFNBQVMsRUFDUCx1SUFBdUk7U0FDMUk7UUFDRCxLQUFLLEVBQUUsWUFBWTtRQUNuQixTQUFTLEVBQUUsTUFBTSxFQUFFO1FBQ25CLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1FBQ3BDLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtRQUNoQyxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7UUFDbkMsTUFBTSxFQUFFLEVBQUU7UUFDVixJQUFJLEVBQUUsT0FBTztRQUNiLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLEdBQUcsS0FBSztLQUNULENBQUE7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Destination } from './destination-kit';
|
|
2
|
+
import type { DestinationDefinition } from './destination-kit';
|
|
3
|
+
import type { JSONObject } from './json-object';
|
|
4
|
+
import type { SegmentEvent } from './segment-event';
|
|
5
|
+
interface InputData<Settings> {
|
|
6
|
+
/**
|
|
7
|
+
* The Segment event. You can use `createTestEvent` if you want
|
|
8
|
+
* to construct an event from partial data.
|
|
9
|
+
*/
|
|
10
|
+
event?: Partial<SegmentEvent>;
|
|
11
|
+
/**
|
|
12
|
+
* The raw input - this is what customers define. It may include
|
|
13
|
+
* literal values as well as mapping-kit directives.
|
|
14
|
+
*/
|
|
15
|
+
mapping?: JSONObject;
|
|
16
|
+
/**
|
|
17
|
+
* The settings for a destination instance. Includes things like
|
|
18
|
+
* `apiKey` or `subdomain`. Any fields that are used across all actions
|
|
19
|
+
* in a destination.
|
|
20
|
+
*/
|
|
21
|
+
settings?: Settings;
|
|
22
|
+
/**
|
|
23
|
+
* Whether or not to use default mappings in the test.
|
|
24
|
+
* Set to `false` or omit if you want to explicitly provide the raw input.
|
|
25
|
+
* Set to `true` if you want to test the defaultMappings (along with any mapping passed in)
|
|
26
|
+
*/
|
|
27
|
+
useDefaultMappings?: boolean;
|
|
28
|
+
}
|
|
29
|
+
declare class TestDestination<T> extends Destination<T> {
|
|
30
|
+
responses: Destination['responses'];
|
|
31
|
+
constructor(destination: DestinationDefinition<T>);
|
|
32
|
+
/** Testing method that runs an action e2e while allowing slightly more flexible inputs */
|
|
33
|
+
testAction(action: string, { event, mapping, settings, useDefaultMappings }: InputData<T>): Promise<Destination['responses']>;
|
|
34
|
+
}
|
|
35
|
+
export declare function createTestIntegration<T>(destination: DestinationDefinition<T>): TestDestination<T>;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createTestEvent } from './create-test-event';
|
|
2
|
+
import { Destination } from './destination-kit';
|
|
3
|
+
import { mapValues } from './map-values';
|
|
4
|
+
class TestDestination extends Destination {
|
|
5
|
+
constructor(destination) {
|
|
6
|
+
super(destination);
|
|
7
|
+
this.responses = [];
|
|
8
|
+
}
|
|
9
|
+
/** Testing method that runs an action e2e while allowing slightly more flexible inputs */
|
|
10
|
+
async testAction(action, { event, mapping, settings, useDefaultMappings }) {
|
|
11
|
+
mapping = mapping !== null && mapping !== void 0 ? mapping : {};
|
|
12
|
+
if (useDefaultMappings) {
|
|
13
|
+
const fields = this.definition.actions[action].fields;
|
|
14
|
+
const defaultMappings = mapValues(fields, 'default');
|
|
15
|
+
mapping = { ...defaultMappings, ...mapping };
|
|
16
|
+
}
|
|
17
|
+
await super.executeAction(action, {
|
|
18
|
+
event: createTestEvent(event),
|
|
19
|
+
mapping,
|
|
20
|
+
settings: settings !== null && settings !== void 0 ? settings : {}
|
|
21
|
+
});
|
|
22
|
+
const responses = this.responses;
|
|
23
|
+
this.responses = [];
|
|
24
|
+
return responses;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function createTestIntegration(destination) {
|
|
28
|
+
return new TestDestination(destination);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlc3QtaW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY3JlYXRlLXRlc3QtaW50ZWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBOEJ4QyxNQUFNLGVBQW1CLFNBQVEsV0FBYztJQUc3QyxZQUFZLFdBQXFDO1FBQy9DLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUhwQixjQUFTLEdBQTZCLEVBQUUsQ0FBQTtJQUl4QyxDQUFDO0lBRUQsMEZBQTBGO0lBQzFGLEtBQUssQ0FBQyxVQUFVLENBQ2QsTUFBYyxFQUNkLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQWdCO1FBRTlELE9BQU8sR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxFQUFFLENBQUE7UUFFdkIsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUE7WUFDckQsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUNwRCxPQUFPLEdBQUcsRUFBRSxHQUFHLGVBQWUsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFBO1NBQzdDO1FBRUQsTUFBTSxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUM3QixPQUFPO1lBQ1AsUUFBUSxFQUFFLFFBQVEsYUFBUixRQUFRLGNBQVIsUUFBUSxHQUFLLEVBQVE7U0FDaEMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtRQUVuQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLFVBQVUscUJBQXFCLENBQUksV0FBcUM7SUFDNUUsT0FBTyxJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUN6QyxDQUFDIn0=
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import Ajv from 'ajv';
|
|
3
3
|
import { EventEmitter } from 'events';
|
|
4
|
-
import
|
|
4
|
+
import createRequestClient from '../create-request-client';
|
|
5
5
|
import { JSONLikeObject } from '../json-object';
|
|
6
6
|
import { ExecuteInput, Step, StepResult, Steps } from './step';
|
|
7
|
-
import type { InputField, RequestExtension } from './types';
|
|
8
|
-
|
|
7
|
+
import type { AutocompleteResponse, InputField, RequestExtension } from './types';
|
|
8
|
+
declare type MaybePromise<T> = T | Promise<T>;
|
|
9
|
+
declare type RequestClient = ReturnType<typeof createRequestClient>;
|
|
10
|
+
export declare type RequestFn<Settings, Payload, Return = any> = (request: RequestClient, data: ExecuteInput<Settings, Payload>) => MaybePromise<Return>;
|
|
9
11
|
export interface ActionDefinition<Settings, Payload = any> {
|
|
10
12
|
/** The unique identifier for the action, e.g. `postToChannel` */
|
|
11
13
|
/** The display title of the action */
|
|
@@ -34,7 +36,7 @@ export interface ActionDefinition<Settings, Payload = any> {
|
|
|
34
36
|
* This is likely going to change as we productionalize the data model and definition object
|
|
35
37
|
*/
|
|
36
38
|
autocompleteFields?: {
|
|
37
|
-
[K in keyof Payload]?: RequestFn<Settings, Payload>;
|
|
39
|
+
[K in keyof Payload]?: RequestFn<Settings, Payload, AutocompleteResponse>;
|
|
38
40
|
};
|
|
39
41
|
/**
|
|
40
42
|
* Register fields that should be executed, cached and provided
|
|
@@ -72,7 +74,7 @@ declare type ExecuteInputField = 'payload' | 'settings';
|
|
|
72
74
|
*/
|
|
73
75
|
export declare class Action<Settings, Payload extends JSONLikeObject> extends EventEmitter {
|
|
74
76
|
readonly steps: Steps<Settings, Payload>;
|
|
75
|
-
private
|
|
77
|
+
private extendRequest;
|
|
76
78
|
private autocompleteCache;
|
|
77
79
|
constructor(definition: ActionDefinition<Settings, Payload>, extendRequest?: RequestExtension<Settings, Payload>);
|
|
78
80
|
execute(data: ExecuteInput<Settings, Payload>): Promise<StepResult[]>;
|