@loadmill/core 0.3.139 → 0.3.141
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/assertions/index.d.ts +32 -0
- package/dist/assertions/index.js +52 -0
- package/dist/assertions/index.js.map +1 -0
- package/dist/code-step/index.d.ts +23 -0
- package/dist/code-step/index.js +97 -0
- package/dist/code-step/index.js.map +1 -0
- package/dist/conf/defaults.d.ts +1 -0
- package/dist/conf/defaults.js +11 -0
- package/dist/conf/defaults.js.map +1 -0
- package/dist/conf/extrema.d.ts +7 -0
- package/dist/conf/extrema.js +12 -0
- package/dist/conf/extrema.js.map +1 -0
- package/dist/conf/index.d.ts +15 -0
- package/dist/conf/index.js +80 -0
- package/dist/conf/index.js.map +1 -0
- package/dist/conf/notifications.d.ts +2 -0
- package/dist/conf/notifications.js +19 -0
- package/dist/conf/notifications.js.map +1 -0
- package/dist/conf/types.d.ts +122 -0
- package/dist/conf/types.js +38 -0
- package/dist/conf/types.js.map +1 -0
- package/dist/conf/validate.d.ts +69 -0
- package/dist/conf/validate.js +509 -0
- package/dist/conf/validate.js.map +1 -0
- package/dist/distributed-logger-reporter.d.ts +3 -0
- package/dist/distributed-logger-reporter.js +74 -0
- package/dist/distributed-logger-reporter.js.map +1 -0
- package/dist/echo/firehose.d.ts +7 -0
- package/dist/echo/firehose.js +130 -0
- package/dist/echo/firehose.js.map +1 -0
- package/dist/echo/index.d.ts +3 -0
- package/dist/echo/index.js +8 -0
- package/dist/echo/index.js.map +1 -0
- package/dist/echo/stats.d.ts +8 -0
- package/dist/echo/stats.js +152 -0
- package/dist/echo/stats.js.map +1 -0
- package/dist/extract-and-assert-step/index.d.ts +29 -0
- package/dist/extract-and-assert-step/index.js +108 -0
- package/dist/extract-and-assert-step/index.js.map +1 -0
- package/dist/extractions/index.d.ts +36 -0
- package/dist/extractions/index.js +49 -0
- package/dist/extractions/index.js.map +1 -0
- package/dist/har/index.d.ts +71 -0
- package/dist/har/index.js +61 -0
- package/dist/har/index.js.map +1 -0
- package/dist/labels/constants.d.ts +1 -0
- package/dist/labels/constants.js +5 -0
- package/dist/labels/constants.js.map +1 -0
- package/dist/multipart-form-data/files.d.ts +2 -0
- package/dist/multipart-form-data/files.js +63 -0
- package/dist/multipart-form-data/files.js.map +1 -0
- package/dist/multipart-form-data/form-data-utils.d.ts +19 -0
- package/dist/multipart-form-data/form-data-utils.js +118 -0
- package/dist/multipart-form-data/form-data-utils.js.map +1 -0
- package/dist/multipart-form-data/is-binary-file.d.ts +2 -0
- package/dist/multipart-form-data/is-binary-file.js +215 -0
- package/dist/multipart-form-data/is-binary-file.js.map +1 -0
- package/dist/multipart-form-data/multipart-text-to-post-form-data.d.ts +3 -0
- package/dist/multipart-form-data/multipart-text-to-post-form-data.js +93 -0
- package/dist/multipart-form-data/multipart-text-to-post-form-data.js.map +1 -0
- package/dist/parameters/extractions.d.ts +27 -0
- package/dist/parameters/extractions.js +51 -0
- package/dist/parameters/extractions.js.map +1 -0
- package/dist/parameters/extractors/cheerio-extractor.d.ts +11 -0
- package/dist/parameters/extractors/cheerio-extractor.js +84 -0
- package/dist/parameters/extractors/cheerio-extractor.js.map +1 -0
- package/dist/parameters/extractors/expression-extractor.d.ts +6 -0
- package/dist/parameters/extractors/expression-extractor.js +38 -0
- package/dist/parameters/extractors/expression-extractor.js.map +1 -0
- package/dist/parameters/extractors/extractor.d.ts +3 -0
- package/dist/parameters/extractors/extractor.js +3 -0
- package/dist/parameters/extractors/extractor.js.map +1 -0
- package/dist/parameters/extractors/header-extractor.d.ts +7 -0
- package/dist/parameters/extractors/header-extractor.js +51 -0
- package/dist/parameters/extractors/header-extractor.js.map +1 -0
- package/dist/parameters/extractors/index.d.ts +10 -0
- package/dist/parameters/extractors/index.js +20 -0
- package/dist/parameters/extractors/index.js.map +1 -0
- package/dist/parameters/extractors/json-path-extractor.d.ts +11 -0
- package/dist/parameters/extractors/json-path-extractor.js +127 -0
- package/dist/parameters/extractors/json-path-extractor.js.map +1 -0
- package/dist/parameters/extractors/parametrized-extractor.d.ts +10 -0
- package/dist/parameters/extractors/parametrized-extractor.js +34 -0
- package/dist/parameters/extractors/parametrized-extractor.js.map +1 -0
- package/dist/parameters/extractors/regex-extractor.d.ts +7 -0
- package/dist/parameters/extractors/regex-extractor.js +46 -0
- package/dist/parameters/extractors/regex-extractor.js.map +1 -0
- package/dist/parameters/extractors/regex-matcher.d.ts +1 -0
- package/dist/parameters/extractors/regex-matcher.js +22 -0
- package/dist/parameters/extractors/regex-matcher.js.map +1 -0
- package/dist/parameters/extractors/ws-extractor.d.ts +33 -0
- package/dist/parameters/extractors/ws-extractor.js +215 -0
- package/dist/parameters/extractors/ws-extractor.js.map +1 -0
- package/dist/parameters/extractors/x-path-extractor.d.ts +9 -0
- package/dist/parameters/extractors/x-path-extractor.js +77 -0
- package/dist/parameters/extractors/x-path-extractor.js.map +1 -0
- package/dist/parameters/generate-random.d.ts +13 -0
- package/dist/parameters/generate-random.js +108 -0
- package/dist/parameters/generate-random.js.map +1 -0
- package/dist/parameters/html-utils.d.ts +1 -0
- package/dist/parameters/html-utils.js +18 -0
- package/dist/parameters/html-utils.js.map +1 -0
- package/dist/parameters/index.d.ts +94 -0
- package/dist/parameters/index.js +619 -0
- package/dist/parameters/index.js.map +1 -0
- package/dist/parameters/json-path-utils.d.ts +1 -0
- package/dist/parameters/json-path-utils.js +16 -0
- package/dist/parameters/json-path-utils.js.map +1 -0
- package/dist/parameters/operators/binary-operator.d.ts +13 -0
- package/dist/parameters/operators/binary-operator.js +39 -0
- package/dist/parameters/operators/binary-operator.js.map +1 -0
- package/dist/parameters/operators/index.d.ts +5 -0
- package/dist/parameters/operators/index.js +21 -0
- package/dist/parameters/operators/index.js.map +1 -0
- package/dist/parameters/parameter-functions/aws-cognito.d.ts +3 -0
- package/dist/parameters/parameter-functions/aws-cognito.js +119 -0
- package/dist/parameters/parameter-functions/aws-cognito.js.map +1 -0
- package/dist/parameters/parameter-functions/boolean-parameter-functions.d.ts +12 -0
- package/dist/parameters/parameter-functions/boolean-parameter-functions.js +47 -0
- package/dist/parameters/parameter-functions/boolean-parameter-functions.js.map +1 -0
- package/dist/parameters/parameter-functions/crypto.d.ts +11 -0
- package/dist/parameters/parameter-functions/crypto.js +71 -0
- package/dist/parameters/parameter-functions/crypto.js.map +1 -0
- package/dist/parameters/parameter-functions/json-schema.d.ts +1 -0
- package/dist/parameters/parameter-functions/json-schema.js +33 -0
- package/dist/parameters/parameter-functions/json-schema.js.map +1 -0
- package/dist/parameters/parameter-functions/numeric-input-parameter-functions.d.ts +11 -0
- package/dist/parameters/parameter-functions/numeric-input-parameter-functions.js +34 -0
- package/dist/parameters/parameter-functions/numeric-input-parameter-functions.js.map +1 -0
- package/dist/parameters/parameter-functions/numeric-parameter-functions.d.ts +15 -0
- package/dist/parameters/parameter-functions/numeric-parameter-functions.js +56 -0
- package/dist/parameters/parameter-functions/numeric-parameter-functions.js.map +1 -0
- package/dist/parameters/parameter-functions/parameter-function-utils.d.ts +5 -0
- package/dist/parameters/parameter-functions/parameter-function-utils.js +82 -0
- package/dist/parameters/parameter-functions/parameter-function-utils.js.map +1 -0
- package/dist/parameters/parameter-functions/parameter-function.d.ts +6 -0
- package/dist/parameters/parameter-functions/parameter-function.js +28 -0
- package/dist/parameters/parameter-functions/parameter-function.js.map +1 -0
- package/dist/parameters/parameter-functions/parameter-functions.d.ts +7 -0
- package/dist/parameters/parameter-functions/parameter-functions.js +53 -0
- package/dist/parameters/parameter-functions/parameter-functions.js.map +1 -0
- package/dist/parameters/parameter-functions/random-parameter-functions.d.ts +1 -0
- package/dist/parameters/parameter-functions/random-parameter-functions.js +43 -0
- package/dist/parameters/parameter-functions/random-parameter-functions.js.map +1 -0
- package/dist/parameters/parameter-functions/textual-parameter-functions.d.ts +72 -0
- package/dist/parameters/parameter-functions/textual-parameter-functions.js +389 -0
- package/dist/parameters/parameter-functions/textual-parameter-functions.js.map +1 -0
- package/dist/parameters/parameter-name-utils.d.ts +6 -0
- package/dist/parameters/parameter-name-utils.js +124 -0
- package/dist/parameters/parameter-name-utils.js.map +1 -0
- package/dist/parameters/parameter-regex-providers.d.ts +24 -0
- package/dist/parameters/parameter-regex-providers.js +70 -0
- package/dist/parameters/parameter-regex-providers.js.map +1 -0
- package/dist/parameters/resolvers/random-parameters-resolver.d.ts +1 -0
- package/dist/parameters/resolvers/random-parameters-resolver.js +12 -0
- package/dist/parameters/resolvers/random-parameters-resolver.js.map +1 -0
- package/dist/parameters/type.d.ts +10 -0
- package/dist/parameters/type.js +9 -0
- package/dist/parameters/type.js.map +1 -0
- package/dist/parameters/value-utils.d.ts +5 -0
- package/dist/parameters/value-utils.js +44 -0
- package/dist/parameters/value-utils.js.map +1 -0
- package/dist/request/index.d.ts +174 -0
- package/dist/request/index.js +356 -0
- package/dist/request/index.js.map +1 -0
- package/dist/schema/json-schema-generator.d.ts +20 -0
- package/dist/schema/json-schema-generator.js +135 -0
- package/dist/schema/json-schema-generator.js.map +1 -0
- package/dist/signals.d.ts +4 -0
- package/dist/signals.js +9 -0
- package/dist/signals.js.map +1 -0
- package/dist/socket-events/index.d.ts +13 -0
- package/dist/socket-events/index.js +17 -0
- package/dist/socket-events/index.js.map +1 -0
- package/dist/step/assertable.d.ts +4 -0
- package/dist/step/assertable.js +3 -0
- package/dist/step/assertable.js.map +1 -0
- package/dist/step/codeable.d.ts +3 -0
- package/dist/step/codeable.js +3 -0
- package/dist/step/codeable.js.map +1 -0
- package/dist/step/extractable.d.ts +4 -0
- package/dist/step/extractable.js +3 -0
- package/dist/step/extractable.js.map +1 -0
- package/dist/step/index.d.ts +72 -0
- package/dist/step/index.js +71 -0
- package/dist/step/index.js.map +1 -0
- package/dist/step/step-type.d.ts +4 -0
- package/dist/step/step-type.js +3 -0
- package/dist/step/step-type.js.map +1 -0
- package/dist/step/type-guards.d.ts +7 -0
- package/dist/step/type-guards.js +18 -0
- package/dist/step/type-guards.js.map +1 -0
- package/dist/subset/index.d.ts +3 -0
- package/dist/subset/index.js +8 -0
- package/dist/subset/index.js.map +1 -0
- package/dist/subset/is-subset.d.ts +2 -0
- package/dist/subset/is-subset.js +29 -0
- package/dist/subset/is-subset.js.map +1 -0
- package/dist/subset/json-contains.d.ts +1 -0
- package/dist/subset/json-contains.js +24 -0
- package/dist/subset/json-contains.js.map +1 -0
- package/dist/team-options/constants.d.ts +3 -0
- package/dist/team-options/constants.js +7 -0
- package/dist/team-options/constants.js.map +1 -0
- package/dist/xml/decode.d.ts +2 -0
- package/dist/xml/decode.js +91 -0
- package/dist/xml/decode.js.map +1 -0
- package/dist/xml/encode.d.ts +1 -0
- package/dist/xml/encode.js +14 -0
- package/dist/xml/encode.js.map +1 -0
- package/dist/xml/escape-reserved-chars.d.ts +6 -0
- package/dist/xml/escape-reserved-chars.js +57 -0
- package/dist/xml/escape-reserved-chars.js.map +1 -0
- package/dist/xml/is-xml.d.ts +1 -0
- package/dist/xml/is-xml.js +9 -0
- package/dist/xml/is-xml.js.map +1 -0
- package/dist/xml/json-to-xml.d.ts +2 -0
- package/dist/xml/json-to-xml.js +11 -0
- package/dist/xml/json-to-xml.js.map +1 -0
- package/dist/xml/namespaces.d.ts +7 -0
- package/dist/xml/namespaces.js +16 -0
- package/dist/xml/namespaces.js.map +1 -0
- package/dist/xml/remove-invisible-chars.d.ts +2 -0
- package/dist/xml/remove-invisible-chars.js +13 -0
- package/dist/xml/remove-invisible-chars.js.map +1 -0
- package/dist/xml/replace-s-tags.d.ts +4 -0
- package/dist/xml/replace-s-tags.js +21 -0
- package/dist/xml/replace-s-tags.js.map +1 -0
- package/dist/xml/xml-to-json.d.ts +7 -0
- package/dist/xml/xml-to-json.js +21 -0
- package/dist/xml/xml-to-json.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This object represents an assertion.
|
|
3
|
+
*
|
|
4
|
+
* Assertions are made once the request has been fulfilled and all parameters have been extracted.
|
|
5
|
+
* All assertions are evaluated, even if some fail.
|
|
6
|
+
* If an assertion contains more then one conditions then the conditions are or-ed.
|
|
7
|
+
*
|
|
8
|
+
* @property check A parameter name to assert the given conditions on.
|
|
9
|
+
* @property equals A parametrized expression that asserts to true if its value is equal to `check`.
|
|
10
|
+
* @property contains A parametrized expression that asserts to true if its value is contained in `check`.
|
|
11
|
+
* @property matches A JavaScript regular expression that asserts to true if `check` matches it.
|
|
12
|
+
* @property falsy if true then A parametrized expression that asserts to true if the value of `check` equales false.
|
|
13
|
+
* @property greater A parametrized expression that asserts to true if its value is less to `check`.
|
|
14
|
+
* @property lesser A parametrized expression that asserts to true if its value is greater to `check`.
|
|
15
|
+
*/
|
|
16
|
+
export interface Assertion {
|
|
17
|
+
check: string;
|
|
18
|
+
equals?: string;
|
|
19
|
+
notEquals?: string;
|
|
20
|
+
contains?: string;
|
|
21
|
+
notContains?: string;
|
|
22
|
+
matches?: string;
|
|
23
|
+
falsy?: string | boolean;
|
|
24
|
+
greater?: string;
|
|
25
|
+
lesser?: string;
|
|
26
|
+
JSONSchema?: string;
|
|
27
|
+
JSONContains?: string;
|
|
28
|
+
XMLContains?: string;
|
|
29
|
+
disabled?: true;
|
|
30
|
+
}
|
|
31
|
+
export declare type Assertions = Assertion[];
|
|
32
|
+
export declare function toAssertions(assertions: Assertions): Assertions;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toAssertions = void 0;
|
|
4
|
+
function toAssertions(assertions) {
|
|
5
|
+
var result = [];
|
|
6
|
+
assertions.forEach(function (assertion, key) {
|
|
7
|
+
var check = assertion.check, equals = assertion.equals, notEquals = assertion.notEquals, contains = assertion.contains, notContains = assertion.notContains, matches = assertion.matches, falsy = assertion.falsy, greater = assertion.greater, lesser = assertion.lesser, JSONSchema = assertion.JSONSchema, JSONContains = assertion.JSONContains, XMLContains = assertion.XMLContains, disabled = assertion.disabled;
|
|
8
|
+
var converted = {
|
|
9
|
+
check: check,
|
|
10
|
+
};
|
|
11
|
+
if (equals != null) {
|
|
12
|
+
converted.equals = equals;
|
|
13
|
+
}
|
|
14
|
+
if (notEquals != null) {
|
|
15
|
+
converted.notEquals = notEquals;
|
|
16
|
+
}
|
|
17
|
+
if (contains != null) {
|
|
18
|
+
converted.contains = contains;
|
|
19
|
+
}
|
|
20
|
+
if (notContains != null) {
|
|
21
|
+
converted.notContains = notContains;
|
|
22
|
+
}
|
|
23
|
+
if (matches != null) {
|
|
24
|
+
converted.matches = matches;
|
|
25
|
+
}
|
|
26
|
+
if (greater != null) {
|
|
27
|
+
converted.greater = greater;
|
|
28
|
+
}
|
|
29
|
+
if (lesser != null) {
|
|
30
|
+
converted.lesser = lesser;
|
|
31
|
+
}
|
|
32
|
+
if (falsy != null && (falsy === 'true' || falsy === true)) {
|
|
33
|
+
converted.falsy = true;
|
|
34
|
+
}
|
|
35
|
+
if (JSONSchema != null) {
|
|
36
|
+
converted.JSONSchema = JSONSchema;
|
|
37
|
+
}
|
|
38
|
+
if (JSONContains != null) {
|
|
39
|
+
converted.JSONContains = JSONContains;
|
|
40
|
+
}
|
|
41
|
+
if (XMLContains != null) {
|
|
42
|
+
converted.XMLContains = XMLContains;
|
|
43
|
+
}
|
|
44
|
+
if (disabled === true) {
|
|
45
|
+
converted.disabled = true;
|
|
46
|
+
}
|
|
47
|
+
result[key] = converted;
|
|
48
|
+
});
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
exports.toAssertions = toAssertions;
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assertions/index.ts"],"names":[],"mappings":";;;AAiCA,SAAgB,YAAY,CAAC,UAAsB;IACjD,IAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,UAAU,CAAC,OAAO,CAAC,UAAC,SAAoB,EAAE,GAAW;QAEjD,IAAA,KAAK,GAaH,SAAS,MAbN,EACL,MAAM,GAYJ,SAAS,OAZL,EACN,SAAS,GAWP,SAAS,UAXF,EACT,QAAQ,GAUN,SAAS,SAVH,EACR,WAAW,GAST,SAAS,YATA,EACX,OAAO,GAQL,SAAS,QARJ,EACP,KAAK,GAOH,SAAS,MAPN,EACL,OAAO,GAML,SAAS,QANJ,EACP,MAAM,GAKJ,SAAS,OALL,EACN,UAAU,GAIR,SAAS,WAJD,EACV,YAAY,GAGV,SAAS,aAHC,EACZ,WAAW,GAET,SAAS,YAFA,EACX,QAAQ,GACN,SAAS,SADH,CACI;QAEd,IAAM,SAAS,GAAc;YAC3B,KAAK,OAAA;SACN,CAAC;QAEF,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;SAC3B;QAED,IAAI,SAAS,IAAI,IAAI,EAAE;YACrB,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACjC;QAED,IAAI,QAAQ,IAAI,IAAI,EAAE;YACpB,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC;SAC/B;QAED,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;SACrC;QAED,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;SAC7B;QAED,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;SAC7B;QAED,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;SAC3B;QAED,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE;YACzD,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;SACxB;QAED,IAAI,UAAU,IAAI,IAAI,EAAE;YACtB,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;SACnC;QAED,IAAI,YAAY,IAAI,IAAI,EAAE;YACxB,SAAS,CAAC,YAAY,GAAG,YAAY,CAAC;SACvC;QAED,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;SACrC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE;YACrB,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;SAC3B;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AA5ED,oCA4EC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LoopConf, ResolvedStep, SkipConf, StepLike, StepMeta, StepStatus, StepTypes } from '../step';
|
|
2
|
+
import { Codeable } from '../step/codeable';
|
|
3
|
+
export declare class CodeStep implements StepLike, Codeable {
|
|
4
|
+
type?: StepTypes;
|
|
5
|
+
id?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
stopBefore?: string;
|
|
9
|
+
skipBefore?: SkipConf;
|
|
10
|
+
loop?: LoopConf;
|
|
11
|
+
timeout?: number;
|
|
12
|
+
delay?: number | string;
|
|
13
|
+
expectedStatus?: StepStatus;
|
|
14
|
+
meta?: StepMeta;
|
|
15
|
+
postScript?: string;
|
|
16
|
+
constructor();
|
|
17
|
+
}
|
|
18
|
+
export declare type ResolvedCodeStep = ResolvedStep;
|
|
19
|
+
/**
|
|
20
|
+
* This function should be able to take any object/json and either make a VALID CodeStep out of it
|
|
21
|
+
* or fail with a meaningful error message.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createCodeStep(from: CodeStep): CodeStep;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCodeStep = exports.CodeStep = void 0;
|
|
4
|
+
var step_1 = require("../step");
|
|
5
|
+
var CodeStep = /** @class */ (function () {
|
|
6
|
+
function CodeStep() {
|
|
7
|
+
Object.defineProperty(this, "type", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
configurable: true,
|
|
10
|
+
writable: true,
|
|
11
|
+
value: void 0
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(this, "id", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true,
|
|
17
|
+
value: void 0
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(this, "description", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: void 0
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(this, "disabled", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: void 0
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(this, "stopBefore", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: void 0
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(this, "skipBefore", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
configurable: true,
|
|
40
|
+
writable: true,
|
|
41
|
+
value: void 0
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(this, "loop", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
configurable: true,
|
|
46
|
+
writable: true,
|
|
47
|
+
value: void 0
|
|
48
|
+
});
|
|
49
|
+
Object.defineProperty(this, "timeout", {
|
|
50
|
+
enumerable: true,
|
|
51
|
+
configurable: true,
|
|
52
|
+
writable: true,
|
|
53
|
+
value: void 0
|
|
54
|
+
});
|
|
55
|
+
Object.defineProperty(this, "delay", {
|
|
56
|
+
enumerable: true,
|
|
57
|
+
configurable: true,
|
|
58
|
+
writable: true,
|
|
59
|
+
value: void 0
|
|
60
|
+
});
|
|
61
|
+
Object.defineProperty(this, "expectedStatus", {
|
|
62
|
+
enumerable: true,
|
|
63
|
+
configurable: true,
|
|
64
|
+
writable: true,
|
|
65
|
+
value: void 0
|
|
66
|
+
});
|
|
67
|
+
Object.defineProperty(this, "meta", {
|
|
68
|
+
enumerable: true,
|
|
69
|
+
configurable: true,
|
|
70
|
+
writable: true,
|
|
71
|
+
value: void 0
|
|
72
|
+
});
|
|
73
|
+
Object.defineProperty(this, "postScript", {
|
|
74
|
+
enumerable: true,
|
|
75
|
+
configurable: true,
|
|
76
|
+
writable: true,
|
|
77
|
+
value: void 0
|
|
78
|
+
});
|
|
79
|
+
this.type = step_1.StepTypes.CODE;
|
|
80
|
+
}
|
|
81
|
+
return CodeStep;
|
|
82
|
+
}());
|
|
83
|
+
exports.CodeStep = CodeStep;
|
|
84
|
+
/**
|
|
85
|
+
* This function should be able to take any object/json and either make a VALID CodeStep out of it
|
|
86
|
+
* or fail with a meaningful error message.
|
|
87
|
+
*/
|
|
88
|
+
function createCodeStep(from) {
|
|
89
|
+
var postScript = from.postScript;
|
|
90
|
+
var codeStep = step_1.createStep(from, new CodeStep());
|
|
91
|
+
if (postScript !== undefined) {
|
|
92
|
+
codeStep.postScript = postScript;
|
|
93
|
+
}
|
|
94
|
+
return codeStep;
|
|
95
|
+
}
|
|
96
|
+
exports.createCodeStep = createCodeStep;
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/code-step/index.ts"],"names":[],"mappings":";;;AAAA,gCASiB;AAGjB;IAeE;QAdA;;;;;WAAiB;QACjB;;;;;WAAY;QACZ;;;;;WAAqB;QACrB;;;;;WAAmB;QACnB;;;;;WAAoB;QACpB;;;;;WAAsB;QACtB;;;;;WAAgB;QAChB;;;;;WAAiB;QACjB;;;;;WAAwB;QACxB;;;;;WAA4B;QAC5B;;;;;WAAgB;QAEhB;;;;;WAAoB;QAGlB,IAAI,CAAC,IAAI,GAAG,gBAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;IACH,eAAC;AAAD,CAAC,AAlBD,IAkBC;AAlBY,4BAAQ;AAsBrB;;;GAGG;AACH,SAAgB,cAAc,CAAC,IAAc;IAEzC,IAAA,UAAU,GACR,IAAI,WADI,CACH;IAET,IAAM,QAAQ,GAAG,iBAAU,CACzB,IAAI,EACJ,IAAI,QAAQ,EAAE,CACf,CAAC;IAEF,IAAI,UAAU,KAAK,SAAS,EAAE;QAC5B,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;KAClC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAfD,wCAeC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DEFAULT_DURATION = 60000, DEFAULT_DURATION_MINUTES: number, DEFAULT_RAMP_UP: number, DEFAULT_RAMP_UP_MINUTES = 1, DEFAULT_CONCURRENCY: number, DEFAULT_RPS = 1, DEFAULT_REQUEST_DELAY: number, DEFAULT_ITERATION_DELAY: number, DEFAULT_CACHE_CONTROL = "no-cache, no-store, must-revalidate, max-age=0";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_CACHE_CONTROL = exports.DEFAULT_ITERATION_DELAY = exports.DEFAULT_REQUEST_DELAY = exports.DEFAULT_RPS = exports.DEFAULT_CONCURRENCY = exports.DEFAULT_RAMP_UP_MINUTES = exports.DEFAULT_RAMP_UP = exports.DEFAULT_DURATION_MINUTES = exports.DEFAULT_DURATION = void 0;
|
|
4
|
+
var extrema_1 = require("./extrema");
|
|
5
|
+
var isProduction = process.env.NODE_ENV === 'production';
|
|
6
|
+
exports.DEFAULT_DURATION = 60000, exports.DEFAULT_DURATION_MINUTES = isProduction
|
|
7
|
+
? extrema_1.MIN_DURATION_MINUTES + 1
|
|
8
|
+
: extrema_1.MIN_DURATION_MINUTES, exports.DEFAULT_RAMP_UP = extrema_1.HIGH_MIN_RAMP_UP, exports.DEFAULT_RAMP_UP_MINUTES = extrema_1.HIGH_MIN_RAMP_UP_MINUTES, exports.DEFAULT_CONCURRENCY = isProduction
|
|
9
|
+
? extrema_1.MAX_UNVERIFIED_CONCURRENCY
|
|
10
|
+
: extrema_1.MIN_CONCURRENCY, exports.DEFAULT_RPS = 1, exports.DEFAULT_REQUEST_DELAY = extrema_1.MIN_REQUEST_DELAY * 2, exports.DEFAULT_ITERATION_DELAY = extrema_1.MIN_ITERATION_DELAY * 2, exports.DEFAULT_CACHE_CONTROL = 'no-cache, no-store, must-revalidate, max-age=0';
|
|
11
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/conf/defaults.ts"],"names":[],"mappings":";;;AAAA,qCAQmB;AAEnB,IAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAE9C,QAAA,gBAAgB,GAAG,KAAK,EACnC,QAAA,wBAAwB,GAAG,YAAY;IACrC,CAAC,CAAC,8BAAoB,GAAG,CAAC;IAC1B,CAAC,CAAC,8BAAoB,EACxB,QAAA,eAAe,GAAG,0BAAgB,EAClC,QAAA,uBAAuB,GAAG,kCAAwB,EAClD,QAAA,mBAAmB,GAAG,YAAY;IAChC,CAAC,CAAC,oCAA0B;IAC5B,CAAC,CAAC,yBAAe,EACnB,QAAA,WAAW,GAAG,CAAC,EACf,QAAA,qBAAqB,GAAG,2BAAiB,GAAG,CAAC,EAC7C,QAAA,uBAAuB,GAAG,6BAAmB,GAAG,CAAC,EACjD,QAAA,qBAAqB,GAAG,gDAAgD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const MIN_DURATION: number, MIN_DURATION_MINUTES = 1, MAX_DURATION: number, MIN_REQUEST_LOOPS_ITERATIONS = 1, MAX_REQUEST_LOOPS_ITERATIONS = 100, DEFAULT_LOOP_WAIT = 1000, MIN_REQUEST_LOOP_WAIT = 500, MAX_REQUEST_LOOP_WAIT = 120000, MIN_MAX_ITERATIONS = 5, MAX_MAX_ITERATIONS: number, MIN_REQUEST_DELAY = 50, MAX_REQUEST_DELAY = 300000, MIN_ITERATION_DELAY = 500, MAX_ITERATION_DELAY = 120000, MAX_EXECUTABLE_REQUESTS = 100, MAX_API_TEST_EXECUTABLE_REQUESTS = 200, MAX_PROCESSABLE_REQUESTS = 1000, MAX_LOAD_REQUEST_BODY_LENGTH: number, // 100KB
|
|
2
|
+
MAX_API_REQUEST_BODY_LENGTH: number, // 5MB
|
|
3
|
+
MAX_RESPONSE_BYTES: number, MAX_RESPONSE_COLLECT: number, DOUBLE_MAX_RESPONSE_COLLECT: number, MIN_REQUEST_TIMEOUT = 100, MAX_REQUEST_TIMEOUT = 120000, MAX_UNVERIFIED_CONCURRENCY = 5, MAX_UNVERIFIED_DURATION_MINUTES = 5, MAX_UNVERIFIED_DURATION: number, MIN_CONCURRENCY = 1, MAX_CONCURRENCY = 100000, MIN_RPS = 1, MAX_RPS = 100000, HIGH_MIN_RAMP_UP: number, HIGH_MIN_RAMP_UP_MINUTES = 1, DEFAULT_SOCKET_TIMEOUT = 60000;
|
|
4
|
+
export declare function rampUpExtrema(duration?: number, concurrency?: number): {
|
|
5
|
+
min: number;
|
|
6
|
+
max: number;
|
|
7
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rampUpExtrema = exports.DEFAULT_SOCKET_TIMEOUT = exports.HIGH_MIN_RAMP_UP_MINUTES = exports.HIGH_MIN_RAMP_UP = exports.MAX_RPS = exports.MIN_RPS = exports.MAX_CONCURRENCY = exports.MIN_CONCURRENCY = exports.MAX_UNVERIFIED_DURATION = exports.MAX_UNVERIFIED_DURATION_MINUTES = exports.MAX_UNVERIFIED_CONCURRENCY = exports.MAX_REQUEST_TIMEOUT = exports.MIN_REQUEST_TIMEOUT = exports.DOUBLE_MAX_RESPONSE_COLLECT = exports.MAX_RESPONSE_COLLECT = exports.MAX_RESPONSE_BYTES = exports.MAX_API_REQUEST_BODY_LENGTH = exports.MAX_LOAD_REQUEST_BODY_LENGTH = exports.MAX_PROCESSABLE_REQUESTS = exports.MAX_API_TEST_EXECUTABLE_REQUESTS = exports.MAX_EXECUTABLE_REQUESTS = exports.MAX_ITERATION_DELAY = exports.MIN_ITERATION_DELAY = exports.MAX_REQUEST_DELAY = exports.MIN_REQUEST_DELAY = exports.MAX_MAX_ITERATIONS = exports.MIN_MAX_ITERATIONS = exports.MAX_REQUEST_LOOP_WAIT = exports.MIN_REQUEST_LOOP_WAIT = exports.DEFAULT_LOOP_WAIT = exports.MAX_REQUEST_LOOPS_ITERATIONS = exports.MIN_REQUEST_LOOPS_ITERATIONS = exports.MAX_DURATION = exports.MIN_DURATION_MINUTES = exports.MIN_DURATION = void 0;
|
|
4
|
+
exports.MIN_DURATION = 60 * 1000, exports.MIN_DURATION_MINUTES = 1, exports.MAX_DURATION = 24 * 60 * 60 * 1000, exports.MIN_REQUEST_LOOPS_ITERATIONS = 1, exports.MAX_REQUEST_LOOPS_ITERATIONS = 100, exports.DEFAULT_LOOP_WAIT = 1000, exports.MIN_REQUEST_LOOP_WAIT = 500, exports.MAX_REQUEST_LOOP_WAIT = 120000, exports.MIN_MAX_ITERATIONS = 5, exports.MAX_MAX_ITERATIONS = Number.MAX_SAFE_INTEGER / 2, exports.MIN_REQUEST_DELAY = 50, exports.MAX_REQUEST_DELAY = 300000, exports.MIN_ITERATION_DELAY = 500, exports.MAX_ITERATION_DELAY = 120000, exports.MAX_EXECUTABLE_REQUESTS = 100, exports.MAX_API_TEST_EXECUTABLE_REQUESTS = 200, exports.MAX_PROCESSABLE_REQUESTS = 1000, exports.MAX_LOAD_REQUEST_BODY_LENGTH = 100 * 1024, exports.MAX_API_REQUEST_BODY_LENGTH = 5000 * 1024, exports.MAX_RESPONSE_BYTES = 20 * 1024 * 1024, exports.MAX_RESPONSE_COLLECT = 110 * 1024, exports.DOUBLE_MAX_RESPONSE_COLLECT = 10 * exports.MAX_RESPONSE_COLLECT, exports.MIN_REQUEST_TIMEOUT = 100, exports.MAX_REQUEST_TIMEOUT = 120000, exports.MAX_UNVERIFIED_CONCURRENCY = 5, exports.MAX_UNVERIFIED_DURATION_MINUTES = 5, exports.MAX_UNVERIFIED_DURATION = exports.MAX_UNVERIFIED_DURATION_MINUTES * 60 * 1000, exports.MIN_CONCURRENCY = 1, exports.MAX_CONCURRENCY = 100000, exports.MIN_RPS = 1, exports.MAX_RPS = exports.MAX_CONCURRENCY, exports.HIGH_MIN_RAMP_UP = 60 * 1000, exports.HIGH_MIN_RAMP_UP_MINUTES = 1, exports.DEFAULT_SOCKET_TIMEOUT = 60000;
|
|
5
|
+
function rampUpExtrema(duration, concurrency) {
|
|
6
|
+
if (duration === void 0) { duration = exports.MIN_DURATION; }
|
|
7
|
+
if (concurrency === void 0) { concurrency = exports.MIN_CONCURRENCY; }
|
|
8
|
+
var min = concurrency < 200 ? 0 : exports.HIGH_MIN_RAMP_UP;
|
|
9
|
+
return { min: min, max: duration };
|
|
10
|
+
}
|
|
11
|
+
exports.rampUpExtrema = rampUpExtrema;
|
|
12
|
+
//# sourceMappingURL=extrema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extrema.js","sourceRoot":"","sources":["../../src/conf/extrema.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,EAAE,GAAG,IAAI,EACnC,QAAA,oBAAoB,GAAG,CAAC,EACxB,QAAA,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAClC,QAAA,4BAA4B,GAAG,CAAC,EAChC,QAAA,4BAA4B,GAAG,GAAG,EAClC,QAAA,iBAAiB,GAAG,IAAI,EACxB,QAAA,qBAAqB,GAAG,GAAG,EAC3B,QAAA,qBAAqB,GAAG,MAAM,EAC9B,QAAA,kBAAkB,GAAG,CAAC,EACtB,QAAA,kBAAkB,GAAG,MAAM,CAAC,gBAAgB,GAAG,CAAC,EAChD,QAAA,iBAAiB,GAAG,EAAE,EACtB,QAAA,iBAAiB,GAAG,MAAM,EAC1B,QAAA,mBAAmB,GAAG,GAAG,EACzB,QAAA,mBAAmB,GAAG,MAAM,EAC5B,QAAA,uBAAuB,GAAG,GAAG,EAC7B,QAAA,gCAAgC,GAAG,GAAG,EACtC,QAAA,wBAAwB,GAAG,IAAI,EAC/B,QAAA,4BAA4B,GAAG,GAAG,GAAG,IAAI,EACzC,QAAA,2BAA2B,GAAG,IAAI,GAAG,IAAI,EACzC,QAAA,kBAAkB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EACrC,QAAA,oBAAoB,GAAG,GAAG,GAAG,IAAI,EACjC,QAAA,2BAA2B,GAAG,EAAE,GAAG,4BAAoB,EACvD,QAAA,mBAAmB,GAAG,GAAG,EACzB,QAAA,mBAAmB,GAAG,MAAM,EAC5B,QAAA,0BAA0B,GAAG,CAAC,EAC9B,QAAA,+BAA+B,GAAG,CAAC,EACnC,QAAA,uBAAuB,GAAG,uCAA+B,GAAG,EAAE,GAAG,IAAI,EACrE,QAAA,eAAe,GAAG,CAAC,EACnB,QAAA,eAAe,GAAG,MAAM,EACxB,QAAA,OAAO,GAAG,CAAC,EACX,QAAA,OAAO,GAAG,uBAAe,EACzB,QAAA,gBAAgB,GAAG,EAAE,GAAG,IAAI,EAC5B,QAAA,wBAAwB,GAAG,CAAC,EAC5B,QAAA,sBAAsB,GAAG,KAAK,CAAC;AAEjC,SAAgB,aAAa,CAAC,QAAuB,EAAE,WAA6B;IAAtD,yBAAA,EAAA,WAAW,oBAAY;IAAE,4BAAA,EAAA,cAAc,uBAAe;IAClF,IAAM,GAAG,GAAG,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAgB,CAAC;IAErD,OAAO,EAAE,GAAG,KAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC;AAJD,sCAIC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EmailNotification, TestRunNotification, SlackChannel, Destination, NotificationTarget, NotificationTypes, NotificationMode, NotificationModeLike, TestConfLike, TestEntity } from './types';
|
|
2
|
+
import { validate, EntryValidations } from './validate';
|
|
3
|
+
import * as confExtrema from './extrema';
|
|
4
|
+
import * as confDefaults from './defaults';
|
|
5
|
+
import { emailToLocalNotifications } from './notifications';
|
|
6
|
+
import { Step } from '../step/step-type';
|
|
7
|
+
export declare function isParameterCandidate(value?: number | string): value is string;
|
|
8
|
+
export declare function validateIntegerDelay(delay: number | string, fieldName?: string | false): any;
|
|
9
|
+
export declare function minimalRemainingDuration(iterationDelay: number, requests: Step[], skipCount?: number): number;
|
|
10
|
+
/**
|
|
11
|
+
* Not counting duration of actual request round trip + response processing.
|
|
12
|
+
*/
|
|
13
|
+
export declare function minimalIterationDuration(iterationDelay: number, requests: Step[]): number;
|
|
14
|
+
export declare function reportDelay(iterationDelay: number, requests: Step[]): number;
|
|
15
|
+
export { validate, confDefaults, confExtrema, TestConfLike, EmailNotification, TestRunNotification, SlackChannel, Destination, NotificationTarget, NotificationTypes, NotificationMode, NotificationModeLike, EntryValidations, emailToLocalNotifications, TestEntity, };
|
|
@@ -0,0 +1,80 @@
|
|
|
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.TestEntity = exports.emailToLocalNotifications = exports.NotificationMode = exports.NotificationTypes = exports.confExtrema = exports.confDefaults = exports.validate = exports.reportDelay = exports.minimalIterationDuration = exports.minimalRemainingDuration = exports.validateIntegerDelay = exports.isParameterCandidate = void 0;
|
|
26
|
+
var types_1 = require("./types");
|
|
27
|
+
Object.defineProperty(exports, "NotificationTypes", { enumerable: true, get: function () { return types_1.NotificationTypes; } });
|
|
28
|
+
Object.defineProperty(exports, "NotificationMode", { enumerable: true, get: function () { return types_1.NotificationMode; } });
|
|
29
|
+
Object.defineProperty(exports, "TestEntity", { enumerable: true, get: function () { return types_1.TestEntity; } });
|
|
30
|
+
var validate_1 = require("./validate");
|
|
31
|
+
Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return validate_1.validate; } });
|
|
32
|
+
var validator_1 = __importDefault(require("validator"));
|
|
33
|
+
var extrema_1 = require("./extrema");
|
|
34
|
+
var defaults_1 = require("./defaults");
|
|
35
|
+
var confExtrema = __importStar(require("./extrema"));
|
|
36
|
+
exports.confExtrema = confExtrema;
|
|
37
|
+
var confDefaults = __importStar(require("./defaults"));
|
|
38
|
+
exports.confDefaults = confDefaults;
|
|
39
|
+
var notifications_1 = require("./notifications");
|
|
40
|
+
Object.defineProperty(exports, "emailToLocalNotifications", { enumerable: true, get: function () { return notifications_1.emailToLocalNotifications; } });
|
|
41
|
+
function isParameterCandidate(value) {
|
|
42
|
+
return typeof value === 'string' && !validator_1.default.isNumeric(value.charAt(0));
|
|
43
|
+
}
|
|
44
|
+
exports.isParameterCandidate = isParameterCandidate;
|
|
45
|
+
function validateIntegerDelay(delay, fieldName) {
|
|
46
|
+
if (fieldName === void 0) { fieldName = 'delay'; }
|
|
47
|
+
return validate_1.validate.integer(delay, fieldName, extrema_1.MIN_REQUEST_DELAY, extrema_1.MAX_REQUEST_DELAY);
|
|
48
|
+
}
|
|
49
|
+
exports.validateIntegerDelay = validateIntegerDelay;
|
|
50
|
+
function minimalRemainingDuration(iterationDelay, requests, skipCount) {
|
|
51
|
+
if (skipCount === void 0) { skipCount = 1; }
|
|
52
|
+
var requestsDelay = skipCount >= requests.length
|
|
53
|
+
? 0
|
|
54
|
+
: requests
|
|
55
|
+
.slice(skipCount)
|
|
56
|
+
.map(function (req) {
|
|
57
|
+
return isParameterCandidate(req.delay)
|
|
58
|
+
? extrema_1.MIN_REQUEST_DELAY
|
|
59
|
+
: Number(req.delay || defaults_1.DEFAULT_REQUEST_DELAY);
|
|
60
|
+
})
|
|
61
|
+
.reduce(function (x, y) { return x + y; }, 0);
|
|
62
|
+
return iterationDelay + requestsDelay;
|
|
63
|
+
}
|
|
64
|
+
exports.minimalRemainingDuration = minimalRemainingDuration;
|
|
65
|
+
/**
|
|
66
|
+
* Not counting duration of actual request round trip + response processing.
|
|
67
|
+
*/
|
|
68
|
+
function minimalIterationDuration(iterationDelay, requests) {
|
|
69
|
+
return minimalRemainingDuration(iterationDelay, requests);
|
|
70
|
+
}
|
|
71
|
+
exports.minimalIterationDuration = minimalIterationDuration;
|
|
72
|
+
var reportDelayFactor = 1, minReportDelay = 3000, MAX_REPORT_DELAY = 20000;
|
|
73
|
+
function reportDelay(iterationDelay, requests) {
|
|
74
|
+
var factoredWorkDelay = reportDelayFactor * minimalIterationDuration(iterationDelay, requests);
|
|
75
|
+
return minReportDelay <= factoredWorkDelay
|
|
76
|
+
? Math.min(factoredWorkDelay, MAX_REPORT_DELAY)
|
|
77
|
+
: minReportDelay;
|
|
78
|
+
}
|
|
79
|
+
exports.reportDelay = reportDelay;
|
|
80
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conf/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAWiB;AA+Ef,kGApFA,yBAAiB,OAoFA;AACjB,iGApFA,wBAAgB,OAoFA;AAIhB,2FArFA,kBAAU,OAqFA;AAnFZ,uCAAwD;AAqEtD,yFArEO,mBAAQ,OAqEP;AApEV,wDAAkC;AAClC,qCAAiE;AACjE,uCAAmD;AACnD,qDAAyC;AAmEvC,kCAAW;AAlEb,uDAA2C;AAiEzC,oCAAY;AAhEd,iDAA4D;AA4E1D,0GA5EO,yCAAyB,OA4EP;AAzE3B,SAAgB,oBAAoB,CAAC,KAAuB;IAC1D,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,mBAAS,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAFD,oDAEC;AAED,SAAgB,oBAAoB,CAClC,KAAsB,EACtB,SAAmC;IAAnC,0BAAA,EAAA,mBAAmC;IAEnC,OAAO,mBAAQ,CAAC,OAAO,CACrB,KAAK,EACL,SAAS,EACT,2BAAiB,EACjB,2BAAiB,CAClB,CAAC;AACJ,CAAC;AAVD,oDAUC;AAED,SAAgB,wBAAwB,CACtC,cAAsB,EACtB,QAAgB,EAChB,SAAa;IAAb,0BAAA,EAAA,aAAa;IAEb,IAAM,aAAa,GACjB,SAAS,IAAI,QAAQ,CAAC,MAAM;QAC1B,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,QAAQ;aACP,KAAK,CAAC,SAAS,CAAC;aAChB,GAAG,CAAC,UAAC,GAAG;YACP,OAAA,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC7B,CAAC,CAAC,2BAAiB;gBACnB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,gCAAqB,CAAC;QAF9C,CAE8C,CAC/C;aACA,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,EAAL,CAAK,EAAE,CAAC,CAAC,CAAC;IAElC,OAAO,cAAc,GAAG,aAAa,CAAC;AACxC,CAAC;AAlBD,4DAkBC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CACtC,cAAsB,EACtB,QAAgB;IAEhB,OAAO,wBAAwB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC;AALD,4DAKC;AAED,IAAM,iBAAiB,GAAG,CAAC,EACzB,cAAc,GAAG,IAAI,EACrB,gBAAgB,GAAG,KAAK,CAAC;AAE3B,SAAgB,WAAW,CAAC,cAAsB,EAAE,QAAgB;IAClE,IAAM,iBAAiB,GACrB,iBAAiB,GAAG,wBAAwB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAEzE,OAAO,cAAc,IAAI,iBAAiB;QACxC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;QAC/C,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC;AAPD,kCAOC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emailToLocalNotifications = void 0;
|
|
4
|
+
var types_1 = require("./types");
|
|
5
|
+
var emailToLocalNotifications = function (notifications) {
|
|
6
|
+
if (notifications === void 0) { notifications = []; }
|
|
7
|
+
return notifications.map(function (n) { return n.email ? emailToLocalNotification(n) : n; });
|
|
8
|
+
};
|
|
9
|
+
exports.emailToLocalNotifications = emailToLocalNotifications;
|
|
10
|
+
var emailToLocalNotification = function (notification) {
|
|
11
|
+
return {
|
|
12
|
+
destination: {
|
|
13
|
+
type: types_1.NotificationTypes.EMAIL,
|
|
14
|
+
target: notification.email
|
|
15
|
+
},
|
|
16
|
+
notifyWhen: notification.notifyWhen
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/conf/notifications.ts"],"names":[],"mappings":";;;AAAA,iCAAoF;AAE7E,IAAM,yBAAyB,GAAG,UACvC,aAA+D;IAA/D,8BAAA,EAAA,kBAA+D;IAE/D,OAAO,aAAa,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAzC,CAAyC,CAAC,CAAC;AAC7E,CAAC,CAAC;AAJW,QAAA,yBAAyB,6BAIpC;AAEF,IAAM,wBAAwB,GAAG,UAAC,YAA+B;IAC/D,OAAO;QACL,WAAW,EAAE;YACX,IAAI,EAAE,yBAAiB,CAAC,KAAK;YAC7B,MAAM,EAAE,YAAY,CAAC,KAAK;SAC3B;QACD,UAAU,EAAE,YAAY,CAAC,UAAU;KACpC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { AuthConf, LoadmillHeaders, CachePenetration } from '../request';
|
|
2
|
+
import { Parameters } from '../parameters';
|
|
3
|
+
import { StepLike } from '../step';
|
|
4
|
+
export declare type EmailNotification = {
|
|
5
|
+
email: string;
|
|
6
|
+
notifyWhen: NotificationModeLike;
|
|
7
|
+
};
|
|
8
|
+
export declare type TestRunNotification = {
|
|
9
|
+
destination: Destination;
|
|
10
|
+
notifyWhen: NotificationModeLike;
|
|
11
|
+
notifyBy?: NotifyBy;
|
|
12
|
+
detailLevel?: NotificationDetailLevel;
|
|
13
|
+
tagOwners?: boolean;
|
|
14
|
+
tagUsers?: SlackNotificationTagUsers;
|
|
15
|
+
};
|
|
16
|
+
export declare type SlackChannel = {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
accessToken?: string;
|
|
20
|
+
};
|
|
21
|
+
export declare type Destination = {
|
|
22
|
+
type: NotificationTypes;
|
|
23
|
+
target: string | SlackChannel | NotificationTarget;
|
|
24
|
+
};
|
|
25
|
+
export declare type NotificationTarget = {
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
};
|
|
29
|
+
export declare enum NotificationTypes {
|
|
30
|
+
EMAIL = "email",
|
|
31
|
+
SLACK = "slack",
|
|
32
|
+
WEBHOOK = "webhook"
|
|
33
|
+
}
|
|
34
|
+
export declare enum NotificationMode {
|
|
35
|
+
ALL = "ALL",
|
|
36
|
+
PASSED = "PASSED",
|
|
37
|
+
FAILED = "FAILED"
|
|
38
|
+
}
|
|
39
|
+
export declare enum NotifyBy {
|
|
40
|
+
FLOWS = "Flows",
|
|
41
|
+
ENDPOINTS = "Endpoints"
|
|
42
|
+
}
|
|
43
|
+
export declare enum NotificationDetailLevel {
|
|
44
|
+
MINIMAL = "Minimal",
|
|
45
|
+
FULL = "Full"
|
|
46
|
+
}
|
|
47
|
+
export declare type SlackNotificationTagUsers = {
|
|
48
|
+
suite?: {
|
|
49
|
+
groupOwners?: boolean;
|
|
50
|
+
};
|
|
51
|
+
flow?: {
|
|
52
|
+
author?: boolean;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export declare type NotificationModeLike = keyof typeof NotificationMode;
|
|
56
|
+
export declare enum TestEntity {
|
|
57
|
+
FLOW = "flow",
|
|
58
|
+
SUITE = "suite",
|
|
59
|
+
TEST_PLAN = "test plan",
|
|
60
|
+
LOAD = "load"
|
|
61
|
+
}
|
|
62
|
+
export interface TestConfLike {
|
|
63
|
+
requests: StepLike[];
|
|
64
|
+
afterEachRequests?: StepLike[];
|
|
65
|
+
afterAllRequests?: StepLike[];
|
|
66
|
+
meta?: {
|
|
67
|
+
description?: string;
|
|
68
|
+
dependencies?: ConfDependency[];
|
|
69
|
+
dependenciesData?: ConfDependencyData[];
|
|
70
|
+
};
|
|
71
|
+
auth?: AuthConf;
|
|
72
|
+
useCookies?: boolean;
|
|
73
|
+
useProxy?: boolean;
|
|
74
|
+
sensitiveData?: boolean;
|
|
75
|
+
maxFlakyFlowRetries?: number;
|
|
76
|
+
useStaticIp?: boolean;
|
|
77
|
+
skipLoginFlow?: boolean;
|
|
78
|
+
parameterPools?: string[];
|
|
79
|
+
domainsWhiteList?: string[];
|
|
80
|
+
cachePenetration?: CachePenetration;
|
|
81
|
+
parameters?: Parameters | Parameters[];
|
|
82
|
+
loginFlow?: StepLike[];
|
|
83
|
+
authenticationHeaders?: LoadmillHeaders | LoadmillHeaders[];
|
|
84
|
+
scopeParameters?: Parameters[];
|
|
85
|
+
cookies?: CookiesDetails;
|
|
86
|
+
serviceDefinitionId?: string;
|
|
87
|
+
xmlDecode?: boolean;
|
|
88
|
+
rampUp?: number;
|
|
89
|
+
rps?: number;
|
|
90
|
+
duration?: number;
|
|
91
|
+
concurrency?: number;
|
|
92
|
+
monitoredEnv?: string;
|
|
93
|
+
maxIterations?: number;
|
|
94
|
+
iterationDelay?: number | '';
|
|
95
|
+
alwaysDistributed?: boolean;
|
|
96
|
+
targetedCountries?: string[];
|
|
97
|
+
notifications?: EmailNotification[] | TestRunNotification[];
|
|
98
|
+
}
|
|
99
|
+
export declare type ConfDependency = {
|
|
100
|
+
sharedFlowId: string;
|
|
101
|
+
} & ConfDependencyLocation;
|
|
102
|
+
export declare type ConfDependencyLocation = {
|
|
103
|
+
index: number;
|
|
104
|
+
order: number;
|
|
105
|
+
};
|
|
106
|
+
export declare type ConfDependencyData = {
|
|
107
|
+
id: string;
|
|
108
|
+
description: string;
|
|
109
|
+
conf: any;
|
|
110
|
+
};
|
|
111
|
+
export declare enum CookiesScope {
|
|
112
|
+
SUITE = "Suite",
|
|
113
|
+
FLOW = "Flow"
|
|
114
|
+
}
|
|
115
|
+
export declare type CookiesDetails = {
|
|
116
|
+
[urlScope: string]: CookieDetails[];
|
|
117
|
+
};
|
|
118
|
+
export declare type CookieDetails = {
|
|
119
|
+
cookie: string;
|
|
120
|
+
domain: string;
|
|
121
|
+
path: string;
|
|
122
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CookiesScope = exports.TestEntity = exports.NotificationDetailLevel = exports.NotifyBy = exports.NotificationMode = exports.NotificationTypes = void 0;
|
|
4
|
+
var NotificationTypes;
|
|
5
|
+
(function (NotificationTypes) {
|
|
6
|
+
NotificationTypes["EMAIL"] = "email";
|
|
7
|
+
NotificationTypes["SLACK"] = "slack";
|
|
8
|
+
NotificationTypes["WEBHOOK"] = "webhook";
|
|
9
|
+
})(NotificationTypes = exports.NotificationTypes || (exports.NotificationTypes = {}));
|
|
10
|
+
var NotificationMode;
|
|
11
|
+
(function (NotificationMode) {
|
|
12
|
+
NotificationMode["ALL"] = "ALL";
|
|
13
|
+
NotificationMode["PASSED"] = "PASSED";
|
|
14
|
+
NotificationMode["FAILED"] = "FAILED";
|
|
15
|
+
})(NotificationMode = exports.NotificationMode || (exports.NotificationMode = {}));
|
|
16
|
+
var NotifyBy;
|
|
17
|
+
(function (NotifyBy) {
|
|
18
|
+
NotifyBy["FLOWS"] = "Flows";
|
|
19
|
+
NotifyBy["ENDPOINTS"] = "Endpoints";
|
|
20
|
+
})(NotifyBy = exports.NotifyBy || (exports.NotifyBy = {}));
|
|
21
|
+
var NotificationDetailLevel;
|
|
22
|
+
(function (NotificationDetailLevel) {
|
|
23
|
+
NotificationDetailLevel["MINIMAL"] = "Minimal";
|
|
24
|
+
NotificationDetailLevel["FULL"] = "Full";
|
|
25
|
+
})(NotificationDetailLevel = exports.NotificationDetailLevel || (exports.NotificationDetailLevel = {}));
|
|
26
|
+
var TestEntity;
|
|
27
|
+
(function (TestEntity) {
|
|
28
|
+
TestEntity["FLOW"] = "flow";
|
|
29
|
+
TestEntity["SUITE"] = "suite";
|
|
30
|
+
TestEntity["TEST_PLAN"] = "test plan";
|
|
31
|
+
TestEntity["LOAD"] = "load";
|
|
32
|
+
})(TestEntity = exports.TestEntity || (exports.TestEntity = {}));
|
|
33
|
+
var CookiesScope;
|
|
34
|
+
(function (CookiesScope) {
|
|
35
|
+
CookiesScope["SUITE"] = "Suite";
|
|
36
|
+
CookiesScope["FLOW"] = "Flow";
|
|
37
|
+
})(CookiesScope = exports.CookiesScope || (exports.CookiesScope = {}));
|
|
38
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/conf/types.ts"],"names":[],"mappings":";;;AAsCA,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IAC3B,oCAAe,CAAA;IACf,oCAAe,CAAA;IACf,wCAAmB,CAAA;AACrB,CAAC,EAJW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAI5B;AAED,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,+BAAW,CAAA;IACX,qCAAiB,CAAA;IACjB,qCAAiB,CAAA;AACnB,CAAC,EAJW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAI3B;AAED,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,2BAAe,CAAA;IACf,mCAAuB,CAAA;AACzB,CAAC,EAHW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAGnB;AAED,IAAY,uBAGX;AAHD,WAAY,uBAAuB;IACjC,8CAAmB,CAAA;IACnB,wCAAa,CAAA;AACf,CAAC,EAHW,uBAAuB,GAAvB,+BAAuB,KAAvB,+BAAuB,QAGlC;AAaD,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,6BAAe,CAAA;IACf,qCAAuB,CAAA;IACvB,2BAAa,CAAA;AACf,CAAC,EALW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAKrB;AA2DD,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,+BAAe,CAAA;IACf,6BAAa,CAAA;AACf,CAAC,EAHW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAGvB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Parameters } from '../parameters';
|
|
2
|
+
export declare const validate: {
|
|
3
|
+
invalid: typeof invalid;
|
|
4
|
+
positive(value: any, name: string): any;
|
|
5
|
+
email(value: any, name: string): any;
|
|
6
|
+
integer(value: any, name: string | false, min?: number, max?: number): any;
|
|
7
|
+
nonemptyArray(value: any, name: string): any;
|
|
8
|
+
array: typeof array;
|
|
9
|
+
string: typeof string;
|
|
10
|
+
jsonFormat: typeof jsonFormat;
|
|
11
|
+
isTrue: typeof isTrue;
|
|
12
|
+
maxLength(value: any, maxLength: any, name: any): any;
|
|
13
|
+
uuid(value: any, name: string): any;
|
|
14
|
+
nonemptyString: typeof nonemptyString;
|
|
15
|
+
stringIfExists(value: any, name: string, message?: string): any;
|
|
16
|
+
notification(notification: any): any;
|
|
17
|
+
parameter(name: string, value: string | string[]): any;
|
|
18
|
+
hasOnlyAcceptableCharacters: typeof hasOnlyAcceptableCharacters;
|
|
19
|
+
parameterDoesntExist: typeof parameterDoesntExist;
|
|
20
|
+
extractedValue: typeof extractedValue;
|
|
21
|
+
isUrl: typeof isUrl;
|
|
22
|
+
url(url: string, name?: string): any;
|
|
23
|
+
isUrlLocalHost(url: string, name?: string): any;
|
|
24
|
+
isMethodSupported(method: any): boolean;
|
|
25
|
+
isHttpStatusSupported(expectedHttpStatus: any): boolean;
|
|
26
|
+
method(method: any): any;
|
|
27
|
+
expectedHttpStatus(expectedHttpStatus: any): any;
|
|
28
|
+
header(_headerName: string, headerValue: string): any;
|
|
29
|
+
headerName: typeof headerName;
|
|
30
|
+
mimeType(value: string, name: string): any;
|
|
31
|
+
regex(value: string, name?: string): any;
|
|
32
|
+
regexCapture(value: string, name?: string): any;
|
|
33
|
+
jsonPath(value: string): any;
|
|
34
|
+
jQuery(value: any, name?: string): any;
|
|
35
|
+
xPath(xPath: any): any;
|
|
36
|
+
testRailIntegration(integration: any): any;
|
|
37
|
+
xrayIntegration(xrayIntegration: any): any;
|
|
38
|
+
jiraIntegration(jiraIntegration: any): any;
|
|
39
|
+
validateCron(cron: string): any;
|
|
40
|
+
validateParameterNames(names: string[]): any;
|
|
41
|
+
validateObjOrArray<T>(name: string, objOrArray: T | T[], singleValidation: any): {
|
|
42
|
+
[x: string]: any;
|
|
43
|
+
} | undefined;
|
|
44
|
+
parameterName(parameterName: string, fieldName: string | false): any;
|
|
45
|
+
label(labelParams: any): any;
|
|
46
|
+
boolean(value: any, name: string): any;
|
|
47
|
+
breakpoint(breakpoint: unknown): any;
|
|
48
|
+
};
|
|
49
|
+
declare function hasOnlyAcceptableCharacters(value: string, fieldName: string | false): any;
|
|
50
|
+
declare function parameterDoesntExist(parameterName: any, entityName: string, collection: Array<Parameters>): any;
|
|
51
|
+
declare function extractedValue(extractedVal: string, fieldName: string | false): any;
|
|
52
|
+
declare function invalid(name: string | false, message: string): any;
|
|
53
|
+
declare function array(value: any, name: string, message?: string): any;
|
|
54
|
+
declare function isUrl(url: string, name?: string): any;
|
|
55
|
+
declare function nonemptyString(value: any, name: string | false, message?: string): any;
|
|
56
|
+
declare function string(value: any, name?: string | false, message?: string): any;
|
|
57
|
+
declare function jsonFormat(value: string, name: string, message?: string): any;
|
|
58
|
+
declare function isTrue(value: any, name: string, message?: string): any;
|
|
59
|
+
declare function headerName(headerName: string, nameName?: string): {
|
|
60
|
+
[x: string]: string;
|
|
61
|
+
} | undefined;
|
|
62
|
+
export interface EntryValidations {
|
|
63
|
+
[name: string]: string | {
|
|
64
|
+
name?: string;
|
|
65
|
+
value?: string;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export declare const gitBranchName: (branchName: string) => string | undefined;
|
|
69
|
+
export {};
|