@pact-foundation/pact 16.3.1 → 16.4.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/CHANGELOG.md +7 -0
- package/CONTRIBUTING.md +2 -2
- package/package.json +16 -24
- package/src/common/graphQL/configurationError.js +2 -22
- package/src/common/graphQL/configurationError.js.map +1 -1
- package/src/common/graphQL/graphQL.d.ts +2 -2
- package/src/common/graphQL/graphQL.js +11 -14
- package/src/common/graphQL/graphQL.js.map +1 -1
- package/src/common/graphQL/graphQLQueryError.js +2 -22
- package/src/common/graphQL/graphQLQueryError.js.map +1 -1
- package/src/common/logger.js +9 -9
- package/src/common/logger.js.map +1 -1
- package/src/common/matchingRules.d.ts +1 -1
- package/src/common/matchingRules.js +21 -21
- package/src/common/matchingRules.js.map +1 -1
- package/src/common/net.js +36 -42
- package/src/common/net.js.map +1 -1
- package/src/common/net.spec.js +41 -53
- package/src/common/net.spec.js.map +1 -1
- package/src/common/request.js +33 -82
- package/src/common/request.js.map +1 -1
- package/src/common/request.spec.js +26 -26
- package/src/common/request.spec.js.map +1 -1
- package/src/common/spec.js +3 -4
- package/src/common/spec.js.map +1 -1
- package/src/dsl/apolloGraphql.js +7 -25
- package/src/dsl/apolloGraphql.js.map +1 -1
- package/src/dsl/apolloGraphql.spec.js +21 -18
- package/src/dsl/apolloGraphql.spec.js.map +1 -1
- package/src/dsl/graphql.d.ts +2 -2
- package/src/dsl/graphql.js +29 -48
- package/src/dsl/graphql.js.map +1 -1
- package/src/dsl/graphql.spec.js +81 -66
- package/src/dsl/graphql.spec.js.map +1 -1
- package/src/dsl/interaction.d.ts +2 -2
- package/src/dsl/interaction.js +41 -48
- package/src/dsl/interaction.js.map +1 -1
- package/src/dsl/interaction.spec.js +77 -70
- package/src/dsl/interaction.spec.js.map +1 -1
- package/src/dsl/matchers.d.ts +1 -1
- package/src/dsl/matchers.js +19 -31
- package/src/dsl/matchers.js.map +1 -1
- package/src/dsl/matchers.spec.js +199 -208
- package/src/dsl/matchers.spec.js.map +1 -1
- package/src/dsl/message.d.ts +3 -3
- package/src/dsl/options.d.ts +3 -3
- package/src/dsl/verifier/proxy/hooks.d.ts +2 -2
- package/src/dsl/verifier/proxy/hooks.js +42 -112
- package/src/dsl/verifier/proxy/hooks.js.map +1 -1
- package/src/dsl/verifier/proxy/hooks.spec.js +84 -199
- package/src/dsl/verifier/proxy/hooks.spec.js.map +1 -1
- package/src/dsl/verifier/proxy/messages.d.ts +2 -2
- package/src/dsl/verifier/proxy/messages.js +88 -106
- package/src/dsl/verifier/proxy/messages.js.map +1 -1
- package/src/dsl/verifier/proxy/parseBody.d.ts +1 -1
- package/src/dsl/verifier/proxy/parseBody.js +2 -2
- package/src/dsl/verifier/proxy/parseBody.js.map +1 -1
- package/src/dsl/verifier/proxy/parseBody.spec.js +31 -76
- package/src/dsl/verifier/proxy/parseBody.spec.js.map +1 -1
- package/src/dsl/verifier/proxy/proxy.d.ts +2 -2
- package/src/dsl/verifier/proxy/proxy.js +22 -26
- package/src/dsl/verifier/proxy/proxy.js.map +1 -1
- package/src/dsl/verifier/proxy/proxy.spec.js +14 -14
- package/src/dsl/verifier/proxy/proxy.spec.js.map +1 -1
- package/src/dsl/verifier/proxy/proxyRequest.d.ts +3 -3
- package/src/dsl/verifier/proxy/proxyRequest.js +7 -7
- package/src/dsl/verifier/proxy/proxyRequest.js.map +1 -1
- package/src/dsl/verifier/proxy/proxyRequest.spec.js +49 -64
- package/src/dsl/verifier/proxy/proxyRequest.spec.js.map +1 -1
- package/src/dsl/verifier/proxy/stateHandler/setupStates.d.ts +3 -3
- package/src/dsl/verifier/proxy/stateHandler/setupStates.js +14 -18
- package/src/dsl/verifier/proxy/stateHandler/setupStates.js.map +1 -1
- package/src/dsl/verifier/proxy/stateHandler/setupStates.spec.js +76 -159
- package/src/dsl/verifier/proxy/stateHandler/setupStates.spec.js.map +1 -1
- package/src/dsl/verifier/proxy/stateHandler/stateHandler.d.ts +2 -2
- package/src/dsl/verifier/proxy/stateHandler/stateHandler.js +23 -72
- package/src/dsl/verifier/proxy/stateHandler/stateHandler.js.map +1 -1
- package/src/dsl/verifier/proxy/stateHandler/stateHandler.spec.js +37 -85
- package/src/dsl/verifier/proxy/stateHandler/stateHandler.spec.js.map +1 -1
- package/src/dsl/verifier/proxy/tracer.d.ts +1 -1
- package/src/dsl/verifier/proxy/tracer.js +42 -35
- package/src/dsl/verifier/proxy/tracer.js.map +1 -1
- package/src/dsl/verifier/proxy/types.d.ts +5 -5
- package/src/dsl/verifier/types.d.ts +3 -3
- package/src/dsl/verifier/verifier.d.ts +1 -1
- package/src/dsl/verifier/verifier.js +49 -56
- package/src/dsl/verifier/verifier.js.map +1 -1
- package/src/dsl/verifier/verifier.spec.js +76 -93
- package/src/dsl/verifier/verifier.spec.js.map +1 -1
- package/src/errors/configurationError.js +2 -22
- package/src/errors/configurationError.js.map +1 -1
- package/src/errors/graphQLQueryError.js +2 -22
- package/src/errors/graphQLQueryError.js.map +1 -1
- package/src/errors/matcherError.js +2 -22
- package/src/errors/matcherError.js.map +1 -1
- package/src/errors/verificationError.js +2 -22
- package/src/errors/verificationError.js.map +1 -1
- package/src/httpPact/ffi.d.ts +2 -2
- package/src/httpPact/ffi.js +28 -29
- package/src/httpPact/ffi.js.map +1 -1
- package/src/httpPact/ffi.spec.js +30 -31
- package/src/httpPact/ffi.spec.js.map +1 -1
- package/src/httpPact/index.d.ts +3 -3
- package/src/httpPact/index.js +92 -149
- package/src/httpPact/index.js.map +1 -1
- package/src/httpPact/index.spec.js +75 -125
- package/src/httpPact/index.spec.js.map +1 -1
- package/src/httpPact/tracing.js +20 -28
- package/src/httpPact/tracing.js.map +1 -1
- package/src/index.js +1 -1
- package/src/index.js.map +1 -1
- package/src/messageConsumerPact.d.ts +3 -3
- package/src/messageConsumerPact.js +50 -51
- package/src/messageConsumerPact.js.map +1 -1
- package/src/messageConsumerPact.spec.js +50 -49
- package/src/messageConsumerPact.spec.js.map +1 -1
- package/src/messageProviderPact.d.ts +3 -3
- package/src/messageProviderPact.js +68 -85
- package/src/messageProviderPact.js.map +1 -1
- package/src/messageProviderPact.spec.js +75 -66
- package/src/messageProviderPact.spec.js.map +1 -1
- package/src/pact.integration.spec.js +243 -313
- package/src/pact.integration.spec.js.map +1 -1
- package/src/v3/display.d.ts +1 -1
- package/src/v3/display.js +44 -58
- package/src/v3/display.js.map +1 -1
- package/src/v3/ffi.js +15 -15
- package/src/v3/ffi.js.map +1 -1
- package/src/v3/ffi.spec.js +8 -8
- package/src/v3/ffi.spec.js.map +1 -1
- package/src/v3/graphql/graphQL.d.ts +4 -4
- package/src/v3/graphql/graphQL.js +50 -75
- package/src/v3/graphql/graphQL.js.map +1 -1
- package/src/v3/matchers.d.ts +2 -2
- package/src/v3/matchers.js +112 -147
- package/src/v3/matchers.js.map +1 -1
- package/src/v3/matchers.spec.js +168 -187
- package/src/v3/matchers.spec.js.map +1 -1
- package/src/v3/pact.d.ts +2 -2
- package/src/v3/pact.js +103 -151
- package/src/v3/pact.js.map +1 -1
- package/src/v3/types.d.ts +1 -1
- package/src/v3/xml/xmlBuilder.d.ts +1 -3
- package/src/v3/xml/xmlBuilder.js +7 -9
- package/src/v3/xml/xmlBuilder.js.map +1 -1
- package/src/v3/xml/xmlElement.d.ts +2 -2
- package/src/v3/xml/xmlElement.js +24 -41
- package/src/v3/xml/xmlElement.js.map +1 -1
- package/src/v3/xml/xmlElement.spec.js +23 -25
- package/src/v3/xml/xmlElement.spec.js.map +1 -1
- package/src/v3/xml/xmlNode.js +2 -5
- package/src/v3/xml/xmlNode.js.map +1 -1
- package/src/v3/xml/xmlText.d.ts +1 -1
- package/src/v3/xml/xmlText.js +9 -25
- package/src/v3/xml/xmlText.js.map +1 -1
- package/src/v4/graphql/graphQLInteractionWithRequest.d.ts +4 -4
- package/src/v4/graphql/graphQLInteractionWithRequest.js +21 -17
- package/src/v4/graphql/graphQLInteractionWithRequest.js.map +1 -1
- package/src/v4/graphql/graphQLRequestBuilder.d.ts +3 -3
- package/src/v4/graphql/graphQLRequestBuilder.js +18 -20
- package/src/v4/graphql/graphQLRequestBuilder.js.map +1 -1
- package/src/v4/graphql/index.d.ts +6 -6
- package/src/v4/graphql/index.js +21 -17
- package/src/v4/graphql/index.js.map +1 -1
- package/src/v4/graphql/types.d.ts +5 -5
- package/src/v4/http/index.d.ts +2 -2
- package/src/v4/http/index.js +48 -93
- package/src/v4/http/index.js.map +1 -1
- package/src/v4/http/interactionWithCompleteRequest.d.ts +4 -7
- package/src/v4/http/interactionWithCompleteRequest.js +6 -10
- package/src/v4/http/interactionWithCompleteRequest.js.map +1 -1
- package/src/v4/http/interactionWithPlugin.d.ts +3 -3
- package/src/v4/http/interactionWithPlugin.js +14 -11
- package/src/v4/http/interactionWithPlugin.js.map +1 -1
- package/src/v4/http/interactionWithPluginRequest.d.ts +2 -2
- package/src/v4/http/interactionWithPluginRequest.js +11 -8
- package/src/v4/http/interactionWithPluginRequest.js.map +1 -1
- package/src/v4/http/interactionWithPluginResponse.d.ts +2 -2
- package/src/v4/http/interactionWithPluginResponse.js +10 -48
- package/src/v4/http/interactionWithPluginResponse.js.map +1 -1
- package/src/v4/http/interactionWithRequest.d.ts +2 -2
- package/src/v4/http/interactionWithRequest.js +11 -8
- package/src/v4/http/interactionWithRequest.js.map +1 -1
- package/src/v4/http/interactionWithResponse.d.ts +2 -2
- package/src/v4/http/interactionWithResponse.js +10 -48
- package/src/v4/http/interactionWithResponse.js.map +1 -1
- package/src/v4/http/requestBuilder.d.ts +3 -3
- package/src/v4/http/requestBuilder.js +32 -34
- package/src/v4/http/requestBuilder.js.map +1 -1
- package/src/v4/http/requestWithPluginBuilder.d.ts +2 -2
- package/src/v4/http/requestWithPluginBuilder.js +26 -46
- package/src/v4/http/requestWithPluginBuilder.js.map +1 -1
- package/src/v4/http/responseBuilder.d.ts +3 -3
- package/src/v4/http/responseBuilder.js +24 -25
- package/src/v4/http/responseBuilder.js.map +1 -1
- package/src/v4/http/responseWithPluginBuilder.d.ts +1 -1
- package/src/v4/http/responseWithPluginBuilder.js +5 -25
- package/src/v4/http/responseWithPluginBuilder.js.map +1 -1
- package/src/v4/http/types.d.ts +3 -2
- package/src/v4/http/unconfiguredInteraction.d.ts +6 -5
- package/src/v4/http/unconfiguredInteraction.js +31 -26
- package/src/v4/http/unconfiguredInteraction.js.map +1 -1
- package/src/v4/index.d.ts +4 -4
- package/src/v4/index.js +31 -35
- package/src/v4/index.js.map +1 -1
- package/src/v4/message/asynchronousMessage.d.ts +7 -6
- package/src/v4/message/asynchronousMessage.js +157 -190
- package/src/v4/message/asynchronousMessage.js.map +1 -1
- package/src/v4/message/index.d.ts +7 -6
- package/src/v4/message/index.js +188 -217
- package/src/v4/message/index.js.map +1 -1
- package/src/v4/message/types.d.ts +5 -3
- package/src/v4/types.d.ts +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
## [16.4.0](https://github.com/pact-foundation/pact-js/compare/v16.3.1...v16.4.0) (2026-05-04)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* add the addInteractionReference function to V4 DSL classes to support external references ([#1762](https://github.com/pact-foundation/pact-js/issues/1762)) ([a65fe91](https://github.com/pact-foundation/pact-js/commit/a65fe918ec7224adbfe5b336e8864774a42cefe6))
|
|
11
|
+
|
|
5
12
|
## [16.3.1](https://github.com/pact-foundation/pact-js/compare/v16.3.0...v16.3.1) (2026-04-29)
|
|
6
13
|
|
|
7
14
|
|
package/CONTRIBUTING.md
CHANGED
|
@@ -73,9 +73,9 @@ modified or new examples, refactorings, new tests, etc. We usually use one of `c
|
|
|
73
73
|
|
|
74
74
|
## Code style and formatting
|
|
75
75
|
|
|
76
|
-
We use [
|
|
76
|
+
We use [Biome](https://biomejs.dev/) for both formatting and linting.
|
|
77
77
|
|
|
78
|
-
The recommended approach is to configure
|
|
78
|
+
The recommended approach is to install the [Biome VS Code extension](https://marketplace.visualstudio.com/items?itemName=biomejs.biome) and configure it to format on save 👌. If not, don't worry, our lint step will catch it.
|
|
79
79
|
|
|
80
80
|
## Pull requests
|
|
81
81
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pact-foundation/pact",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.4.0",
|
|
4
4
|
"description": "Pact for all things Javascript",
|
|
5
5
|
"main": "./src/index.js",
|
|
6
6
|
"types": "./src/index.d.ts",
|
|
@@ -10,14 +10,16 @@
|
|
|
10
10
|
"predist": "npm run clean",
|
|
11
11
|
"dist": "tsc && copyfiles package.json ./dist",
|
|
12
12
|
"install-plugins": "./scripts/install-plugins",
|
|
13
|
-
"
|
|
14
|
-
"lint": "
|
|
15
|
-
"lint
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"format
|
|
13
|
+
"lint:biome": "biome lint",
|
|
14
|
+
"lint:tsc": "tsc --noEmit",
|
|
15
|
+
"lint": "npm run lint:biome && npm run lint:tsc",
|
|
16
|
+
"lint:fix:biome": "biome lint --write",
|
|
17
|
+
"lint:fix": "npm run lint:fix:biome",
|
|
18
|
+
"format": "biome format",
|
|
19
|
+
"format:fix": "biome format --write",
|
|
20
|
+
"check": "npm run format && npm run lint",
|
|
21
|
+
"check:fix": "npm run format:fix && npm run lint:fix",
|
|
19
22
|
"release": "commit-and-tag-version",
|
|
20
|
-
"check": "npm run format:check && npm run lint && npm run test",
|
|
21
23
|
"test": "mocha",
|
|
22
24
|
"coverage": "nyc npm run test",
|
|
23
25
|
"pretest": "npm run install-plugins",
|
|
@@ -103,7 +105,7 @@
|
|
|
103
105
|
]
|
|
104
106
|
},
|
|
105
107
|
"dependencies": {
|
|
106
|
-
"@pact-foundation/pact-core": "^19.
|
|
108
|
+
"@pact-foundation/pact-core": "^19.2.0",
|
|
107
109
|
"axios": "^1.12.2",
|
|
108
110
|
"body-parser": "^2.2.0",
|
|
109
111
|
"chalk": "4.1.2",
|
|
@@ -122,8 +124,9 @@
|
|
|
122
124
|
"devDependencies": {
|
|
123
125
|
"@babel/cli": "7.28.6",
|
|
124
126
|
"@babel/core": "7.29.0",
|
|
125
|
-
"@babel/preset-env": "7.29.
|
|
126
|
-
"@
|
|
127
|
+
"@babel/preset-env": "7.29.3",
|
|
128
|
+
"@biomejs/biome": "2.4.13",
|
|
129
|
+
"@tsconfig/node20": "20.1.9",
|
|
127
130
|
"@types/chai": "5.2.3",
|
|
128
131
|
"@types/chai-as-promised": "8.0.2",
|
|
129
132
|
"@types/express": "4.17.25",
|
|
@@ -136,31 +139,20 @@
|
|
|
136
139
|
"@types/sinon": "21.0.1",
|
|
137
140
|
"@types/sinon-chai": "4.0.0",
|
|
138
141
|
"@types/stack-utils": "2.0.3",
|
|
139
|
-
"@typescript-eslint/eslint-plugin": "5.62.0",
|
|
140
|
-
"@typescript-eslint/parser": "5.62.0",
|
|
141
142
|
"chai": "6.2.2",
|
|
142
143
|
"chai-as-promised": "8.0.2",
|
|
143
144
|
"commit-and-tag-version": "12.7.1",
|
|
144
145
|
"copyfiles": "2.4.1",
|
|
145
|
-
"eslint": "8.57.1",
|
|
146
|
-
"eslint-config-airbnb-base": "15.0.0",
|
|
147
|
-
"eslint-config-airbnb-typescript": "17.1.0",
|
|
148
|
-
"eslint-config-prettier": "10.1.8",
|
|
149
|
-
"eslint-import-resolver-typescript": "4.4.2",
|
|
150
|
-
"eslint-plugin-chai-friendly": "1.2.0",
|
|
151
|
-
"eslint-plugin-import": "2.32.0",
|
|
152
|
-
"eslint-plugin-mocha": "10.5.0",
|
|
153
146
|
"mocha": "11.7.5",
|
|
154
|
-
"nock": "14.0.
|
|
147
|
+
"nock": "14.0.14",
|
|
155
148
|
"nyc": "18.0.0",
|
|
156
|
-
"prettier": "3.6.2",
|
|
157
149
|
"proxyquire": "2.1.3",
|
|
158
150
|
"rimraf": "6.1.3",
|
|
159
151
|
"sinon": "21.1.2",
|
|
160
152
|
"sinon-chai": "4.0.1",
|
|
161
153
|
"source-map-support": "0.5.21",
|
|
162
154
|
"tsx": "4.21.0",
|
|
163
|
-
"typescript": "
|
|
155
|
+
"typescript": "6.0.3"
|
|
164
156
|
},
|
|
165
157
|
"pnpm": {
|
|
166
158
|
"onlyBuiltDependencies": [
|
|
@@ -1,27 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
3
|
exports.ConfigurationError = void 0;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
function ConfigurationError() {
|
|
22
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
23
|
-
}
|
|
24
|
-
return ConfigurationError;
|
|
25
|
-
}(Error));
|
|
4
|
+
class ConfigurationError extends Error {
|
|
5
|
+
}
|
|
26
6
|
exports.ConfigurationError = ConfigurationError;
|
|
27
7
|
//# sourceMappingURL=configurationError.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configurationError.js","sourceRoot":"","sources":["../../../../src/common/graphQL/configurationError.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"configurationError.js","sourceRoot":"","sources":["../../../../src/common/graphQL/configurationError.ts"],"names":[],"mappings":";;;AAAA,MAAa,kBAAmB,SAAQ,KAAK;CAAG;AAAhD,gDAAgD"}
|
|
@@ -5,10 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.escapeGraphQlQuery = exports.escapeRegexChars = exports.escapeSpace = void 0;
|
|
7
7
|
exports.validateQuery = validateQuery;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const graphql_1 = require("graphql");
|
|
9
|
+
const graphql_tag_1 = __importDefault(require("graphql-tag"));
|
|
10
|
+
const graphQLQueryError_1 = require("./graphQLQueryError");
|
|
11
|
+
const configurationError_1 = require("./configurationError");
|
|
12
12
|
/**
|
|
13
13
|
* Accepts a raw or pre-parsed query, validating in the former case, and
|
|
14
14
|
* returns a normalized raw query.
|
|
@@ -17,10 +17,10 @@ var configurationError_1 = require("./configurationError");
|
|
|
17
17
|
*/
|
|
18
18
|
function validateQuery(query, type) {
|
|
19
19
|
if (!query) {
|
|
20
|
-
throw new configurationError_1.ConfigurationError(
|
|
20
|
+
throw new configurationError_1.ConfigurationError(`You must provide a GraphQL ${type}.`);
|
|
21
21
|
}
|
|
22
22
|
if (typeof query !== 'string') {
|
|
23
|
-
if (
|
|
23
|
+
if (query?.kind === 'Document') {
|
|
24
24
|
// Already parsed, store in string form
|
|
25
25
|
return (0, graphql_1.print)(query);
|
|
26
26
|
}
|
|
@@ -32,19 +32,16 @@ function validateQuery(query, type) {
|
|
|
32
32
|
(0, graphql_tag_1.default)(query);
|
|
33
33
|
}
|
|
34
34
|
catch (e) {
|
|
35
|
-
|
|
35
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
36
|
+
throw new graphQLQueryError_1.GraphQLQueryError(`GraphQL ${type} is invalid: ${error.message}`);
|
|
36
37
|
}
|
|
37
38
|
return query;
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
+
const escapeSpace = (s) => s.replace(/\s+/g, '\\s*');
|
|
41
42
|
exports.escapeSpace = escapeSpace;
|
|
42
|
-
|
|
43
|
-
return s.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&');
|
|
44
|
-
};
|
|
43
|
+
const escapeRegexChars = (s) => s.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&');
|
|
45
44
|
exports.escapeRegexChars = escapeRegexChars;
|
|
46
|
-
|
|
47
|
-
return (0, exports.escapeSpace)((0, exports.escapeRegexChars)(s));
|
|
48
|
-
};
|
|
45
|
+
const escapeGraphQlQuery = (s) => (0, exports.escapeSpace)((0, exports.escapeRegexChars)(s));
|
|
49
46
|
exports.escapeGraphQlQuery = escapeGraphQlQuery;
|
|
50
47
|
//# sourceMappingURL=graphQL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphQL.js","sourceRoot":"","sources":["../../../../src/common/graphQL/graphQL.ts"],"names":[],"mappings":";;;;;;AAgBA,
|
|
1
|
+
{"version":3,"file":"graphQL.js","sourceRoot":"","sources":["../../../../src/common/graphQL/graphQL.ts"],"names":[],"mappings":";;;;;;AAgBA,sCA6BC;AA7CD,qCAA8C;AAC9C,8DAA8B;AAC9B,2DAAwD;AACxD,6DAA0D;AAO1D;;;;;GAKG;AACH,SAAgB,aAAa,CAC3B,KAAuB,EACvB,IAAmB;IAEnB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,uCAAkB,CAAC,8BAA8B,IAAI,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,uCAAuC;YACvC,OAAO,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,IAAI,uCAAkB,CAC1B,uDAAuD,CACxD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,yBAAyB;QACzB,IAAI,CAAC;YACH,IAAA,qBAAG,EAAC,KAAK,CAAC,CAAC;QACb,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,IAAI,qCAAiB,CACzB,WAAW,IAAI,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAC/C,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAEM,MAAM,WAAW,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAA/D,QAAA,WAAW,eAAoD;AAErE,MAAM,gBAAgB,GAAG,CAAC,CAAS,EAAU,EAAE,CACpD,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AADhC,QAAA,gBAAgB,oBACgB;AAEtC,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAU,EAAE,CACtD,IAAA,mBAAW,EAAC,IAAA,wBAAgB,EAAC,CAAC,CAAC,CAAC,CAAC;AADtB,QAAA,kBAAkB,sBACI"}
|
|
@@ -1,27 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
3
|
exports.GraphQLQueryError = void 0;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
function GraphQLQueryError() {
|
|
22
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
23
|
-
}
|
|
24
|
-
return GraphQLQueryError;
|
|
25
|
-
}(Error));
|
|
4
|
+
class GraphQLQueryError extends Error {
|
|
5
|
+
}
|
|
26
6
|
exports.GraphQLQueryError = GraphQLQueryError;
|
|
27
7
|
//# sourceMappingURL=graphQLQueryError.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphQLQueryError.js","sourceRoot":"","sources":["../../../../src/common/graphQL/graphQLQueryError.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graphQLQueryError.js","sourceRoot":"","sources":["../../../../src/common/graphQL/graphQLQueryError.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAkB,SAAQ,KAAK;CAAG;AAA/C,8CAA+C"}
|
package/src/common/logger.js
CHANGED
|
@@ -17,16 +17,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
const logger_1 = __importDefault(require("@pact-foundation/pact-core/src/logger"));
|
|
21
|
+
const package_json_1 = require("../../package.json");
|
|
22
22
|
__exportStar(require("@pact-foundation/pact-core/src/logger"), exports);
|
|
23
|
-
|
|
23
|
+
const context = `pact@${package_json_1.version}`;
|
|
24
24
|
exports.default = {
|
|
25
|
-
pactCrash:
|
|
26
|
-
error:
|
|
27
|
-
warn:
|
|
28
|
-
info:
|
|
29
|
-
debug:
|
|
30
|
-
trace:
|
|
25
|
+
pactCrash: (message) => logger_1.default.pactCrash(message, context),
|
|
26
|
+
error: (message) => logger_1.default.error(message, context),
|
|
27
|
+
warn: (message) => logger_1.default.warn(message, context),
|
|
28
|
+
info: (message) => logger_1.default.info(message, context),
|
|
29
|
+
debug: (message) => logger_1.default.debug(message, context),
|
|
30
|
+
trace: (message) => logger_1.default.trace(message, context),
|
|
31
31
|
};
|
|
32
32
|
//# sourceMappingURL=logger.js.map
|
package/src/common/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/common/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/common/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,mFAA2D;AAE3D,qDAA6C;AAE7C,wEAAsD;AAEtD,MAAM,OAAO,GAAG,QAAQ,sBAAO,EAAE,CAAC;AAElC,kBAAe;IACb,SAAS,EAAE,CAAC,OAAe,EAAQ,EAAE,CAAC,gBAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;IACxE,KAAK,EAAE,CAAC,OAAe,EAAQ,EAAE,CAAC,gBAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;IAChE,IAAI,EAAE,CAAC,OAAe,EAAQ,EAAE,CAAC,gBAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;IAC9D,IAAI,EAAE,CAAC,OAAe,EAAQ,EAAE,CAAC,gBAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;IAC9D,KAAK,EAAE,CAAC,OAAe,EAAQ,EAAE,CAAC,gBAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;IAChE,KAAK,EAAE,CAAC,OAAe,EAAQ,EAAE,CAAC,gBAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;CACjE,CAAC"}
|
|
@@ -6,12 +6,12 @@ exports.convertRulesToFFI = exports.validateRules = exports.convertMatcherToFFI
|
|
|
6
6
|
* @param matcher The matcher to convert
|
|
7
7
|
* @returns The matcher in FFI format
|
|
8
8
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const convertMatcherToFFI = (matcher) => {
|
|
10
|
+
const result = {};
|
|
11
11
|
if (matcher['pact:matcher:type']) {
|
|
12
12
|
result.match = matcher['pact:matcher:type'];
|
|
13
13
|
}
|
|
14
|
-
Object.keys(matcher).forEach(
|
|
14
|
+
Object.keys(matcher).forEach((key) => {
|
|
15
15
|
if (key !== 'pact:matcher:type' && key !== 'pact:generator:type') {
|
|
16
16
|
result[key] = matcher[key];
|
|
17
17
|
}
|
|
@@ -24,30 +24,30 @@ exports.convertMatcherToFFI = convertMatcherToFFI;
|
|
|
24
24
|
* @param rules The rules to validate
|
|
25
25
|
* @throws Error if rules is not a valid Rules object
|
|
26
26
|
*/
|
|
27
|
-
|
|
27
|
+
const validateRules = (rules) => {
|
|
28
28
|
if (!rules || typeof rules !== 'object' || Array.isArray(rules)) {
|
|
29
29
|
throw new Error('rules must be an object');
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
ruleKeys.forEach(
|
|
31
|
+
const validParts = ['path', 'body', 'header', 'query', 'status'];
|
|
32
|
+
const ruleKeys = Object.keys(rules);
|
|
33
|
+
ruleKeys.forEach((key) => {
|
|
34
34
|
if (!validParts.includes(key)) {
|
|
35
|
-
throw new Error(
|
|
35
|
+
throw new Error(`Invalid part "${key}" in rules. Valid parts are: ${validParts.join(', ')}`);
|
|
36
36
|
}
|
|
37
|
-
|
|
37
|
+
const partRules = rules[key];
|
|
38
38
|
if (!partRules)
|
|
39
39
|
return;
|
|
40
|
-
|
|
41
|
-
rulesArray.forEach(
|
|
40
|
+
const rulesArray = Array.isArray(partRules) ? partRules : [partRules];
|
|
41
|
+
rulesArray.forEach((rule, index) => {
|
|
42
42
|
if (!rule || typeof rule !== 'object') {
|
|
43
|
-
throw new Error(
|
|
43
|
+
throw new Error(`Rule at ${key}[${index}] must be an object`);
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
const ruleObj = rule;
|
|
46
46
|
if (!('rules' in ruleObj) || !Array.isArray(ruleObj.rules)) {
|
|
47
|
-
throw new Error(
|
|
47
|
+
throw new Error(`Rule at ${key}[${index}] must have a "rule" property that is an array`);
|
|
48
48
|
}
|
|
49
49
|
if ('path' in ruleObj && typeof ruleObj.path !== 'string') {
|
|
50
|
-
throw new Error(
|
|
50
|
+
throw new Error(`Rule at ${key}[${index}] has a "path" property that is not a string`);
|
|
51
51
|
}
|
|
52
52
|
});
|
|
53
53
|
});
|
|
@@ -58,15 +58,15 @@ exports.validateRules = validateRules;
|
|
|
58
58
|
* @param rules Rules in the user-friendly format
|
|
59
59
|
* @returns Rules in FFI format
|
|
60
60
|
*/
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
Object.keys(rules).forEach(
|
|
64
|
-
|
|
61
|
+
const convertRulesToFFI = (rules) => {
|
|
62
|
+
const ffiRules = {};
|
|
63
|
+
Object.keys(rules).forEach((part) => {
|
|
64
|
+
const partRules = rules[part];
|
|
65
65
|
if (!partRules)
|
|
66
66
|
return;
|
|
67
|
-
|
|
67
|
+
const rulesArray = Array.isArray(partRules) ? partRules : [partRules];
|
|
68
68
|
ffiRules[part] = {};
|
|
69
|
-
rulesArray.forEach(
|
|
69
|
+
rulesArray.forEach((rule) => {
|
|
70
70
|
if (rule.path) {
|
|
71
71
|
ffiRules[part][rule.path] = {
|
|
72
72
|
matchers: rule.rules.map(exports.convertMatcherToFFI),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matchingRules.js","sourceRoot":"","sources":["../../../src/common/matchingRules.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACI,
|
|
1
|
+
{"version":3,"file":"matchingRules.js","sourceRoot":"","sources":["../../../src/common/matchingRules.ts"],"names":[],"mappings":"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"}
|
package/src/common/net.js
CHANGED
|
@@ -9,52 +9,46 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
9
9
|
};
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
11
|
exports.freePort = exports.isPortAvailable = exports.portCheck = exports.localAddresses = void 0;
|
|
12
|
-
|
|
12
|
+
const node_net_1 = __importDefault(require("node:net"));
|
|
13
13
|
exports.localAddresses = ['127.0.0.1', 'localhost', '0.0.0.0', '::1'];
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
reject(new Error("Port ".concat(port, " is unavailable on address ").concat(host)));
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
reject(e);
|
|
25
|
-
}
|
|
26
|
-
})
|
|
27
|
-
.on('listening', function () {
|
|
28
|
-
server.once('close', function () { return resolve(); }).close();
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
exports.portCheck = portCheck;
|
|
33
|
-
var isPortAvailable = function (port, host) {
|
|
34
|
-
return Promise.allSettled(exports.localAddresses.map(function (localHost) { return (0, exports.portCheck)(port, localHost); })).then(function (settledPortChecks) {
|
|
35
|
-
// if every port check failed, then fail the `isPortAvailable` check
|
|
36
|
-
if (settledPortChecks.every(function (result) { return result.status === 'rejected'; })) {
|
|
37
|
-
throw new Error("Cannot open port ".concat(port, " on ipv4 or ipv6 interfaces"));
|
|
14
|
+
const portCheck = (port, host) => new Promise((resolve, reject) => {
|
|
15
|
+
const server = node_net_1.default
|
|
16
|
+
.createServer()
|
|
17
|
+
.listen({ port, host, exclusive: true })
|
|
18
|
+
.on('error', (e) => {
|
|
19
|
+
if (e.code === 'EADDRINUSE') {
|
|
20
|
+
reject(new Error(`Port ${port} is unavailable on address ${host}`));
|
|
38
21
|
}
|
|
39
|
-
|
|
40
|
-
|
|
22
|
+
else {
|
|
23
|
+
reject(e);
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
.on('listening', () => {
|
|
27
|
+
server.once('close', () => resolve()).close();
|
|
41
28
|
});
|
|
42
|
-
};
|
|
29
|
+
});
|
|
30
|
+
exports.portCheck = portCheck;
|
|
31
|
+
const isPortAvailable = (port, host) => Promise.allSettled(exports.localAddresses.map((localHost) => (0, exports.portCheck)(port, localHost))).then((settledPortChecks) => {
|
|
32
|
+
// if every port check failed, then fail the `isPortAvailable` check
|
|
33
|
+
if (settledPortChecks.every((result) => result.status === 'rejected')) {
|
|
34
|
+
throw new Error(`Cannot open port ${port} on ipv4 or ipv6 interfaces`);
|
|
35
|
+
}
|
|
36
|
+
// the local addresses passed - now check the host that the user has specified
|
|
37
|
+
return (0, exports.portCheck)(port, host);
|
|
38
|
+
});
|
|
43
39
|
exports.isPortAvailable = isPortAvailable;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
s.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
});
|
|
40
|
+
const freePort = () => new Promise((res) => {
|
|
41
|
+
const s = node_net_1.default.createServer();
|
|
42
|
+
s.listen(0, () => {
|
|
43
|
+
const addr = s.address();
|
|
44
|
+
if (addr !== null && typeof addr !== 'string') {
|
|
45
|
+
const { port } = addr;
|
|
46
|
+
s.close(() => res(port));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
throw Error('unable to find a free port');
|
|
50
|
+
}
|
|
57
51
|
});
|
|
58
|
-
};
|
|
52
|
+
});
|
|
59
53
|
exports.freePort = freePort;
|
|
60
54
|
//# sourceMappingURL=net.js.map
|
package/src/common/net.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"net.js","sourceRoot":"","sources":["../../../src/common/net.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,
|
|
1
|
+
{"version":3,"file":"net.js","sourceRoot":"","sources":["../../../src/common/net.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,wDAA2B;AAEd,QAAA,cAAc,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAEpE,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,IAAY,EAAiB,EAAE,CACrE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,MAAM,GAAG,kBAAG;SACf,YAAY,EAAE;SACd,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACvC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAwB,EAAE,EAAE;QACxC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,8BAA8B,IAAI,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;SACD,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAfQ,QAAA,SAAS,aAejB;AAEE,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,IAAY,EAAiB,EAAE,CAC3E,OAAO,CAAC,UAAU,CAChB,sBAAc,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAA,iBAAS,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAC9D,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,EAAE;IAC3B,oEAAoE;IACpE,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,6BAA6B,CAAC,CAAC;IACzE,CAAC;IAED,8EAA8E;IAC9E,OAAO,IAAA,iBAAS,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAXQ,QAAA,eAAe,mBAWvB;AAEE,MAAM,QAAQ,GAAG,GAAoB,EAAE,CAC5C,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;IAClB,MAAM,CAAC,GAAG,kBAAG,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;QACf,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;YACtB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAZQ,QAAA,QAAQ,YAYhB"}
|
package/src/common/net.spec.js
CHANGED
|
@@ -36,69 +36,57 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
const chai = __importStar(require("chai"));
|
|
40
|
+
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
41
|
+
const node_net_1 = __importDefault(require("node:net"));
|
|
42
|
+
const net_1 = require("./net");
|
|
43
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
44
|
+
const { expect } = chai;
|
|
45
45
|
chai.use(chai_as_promised_1.default);
|
|
46
|
-
describe('Net',
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
describe('Net', () => {
|
|
47
|
+
const port = 4567;
|
|
48
|
+
const defaultHost = '0.0.0.0';
|
|
49
|
+
const specialPort = -1;
|
|
50
50
|
// Utility function to create a server on a given port and return a Promise
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
server.listen({ port: p, host: host, exclusive: true }, function () {
|
|
58
|
-
logger_1.default.info("test server is up on ".concat(host, ":").concat(p));
|
|
59
|
-
});
|
|
51
|
+
const createServer = (p, host = defaultHost) => new Promise((resolve, reject) => {
|
|
52
|
+
const server = node_net_1.default.createServer();
|
|
53
|
+
server.on('error', (err) => reject(err));
|
|
54
|
+
server.on('listening', () => resolve(server));
|
|
55
|
+
server.listen({ port: p, host, exclusive: true }, () => {
|
|
56
|
+
logger_1.default.info(`test server is up on ${host}:${p}`);
|
|
60
57
|
});
|
|
61
|
-
};
|
|
62
|
-
describe('#isPortAvailable',
|
|
63
|
-
context('when the port is not allowed to be bound',
|
|
64
|
-
it('returns a rejected promise',
|
|
65
|
-
|
|
66
|
-
.rejected;
|
|
67
|
-
});
|
|
58
|
+
});
|
|
59
|
+
describe('#isPortAvailable', () => {
|
|
60
|
+
context('when the port is not allowed to be bound', () => {
|
|
61
|
+
it('returns a rejected promise', () => expect((0, net_1.isPortAvailable)(specialPort, defaultHost)).to.eventually.be
|
|
62
|
+
.rejected);
|
|
68
63
|
});
|
|
69
|
-
context('when the port is available',
|
|
70
|
-
it('returns a fulfilled promise',
|
|
71
|
-
return expect((0, net_2.isPortAvailable)(port, defaultHost)).to.eventually.be.fulfilled;
|
|
72
|
-
});
|
|
64
|
+
context('when the port is available', () => {
|
|
65
|
+
it('returns a fulfilled promise', () => expect((0, net_1.isPortAvailable)(port, defaultHost)).to.eventually.be.fulfilled);
|
|
73
66
|
});
|
|
74
|
-
context('when the port is unavailable',
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return createServer(port)
|
|
78
|
-
|
|
79
|
-
|
|
67
|
+
context('when the port is unavailable', () => {
|
|
68
|
+
it('returns a rejected promise', () => {
|
|
69
|
+
let server;
|
|
70
|
+
return createServer(port)
|
|
71
|
+
.then((s) => {
|
|
72
|
+
server = s;
|
|
73
|
+
return expect((0, net_1.isPortAvailable)(port, defaultHost)).to.eventually.be
|
|
80
74
|
.rejected;
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
// close the servers used in this test as to not conflict with other tests
|
|
84
|
-
afterEach(function (done) {
|
|
85
|
-
closeFn(done);
|
|
75
|
+
})
|
|
76
|
+
.finally(() => new Promise((resolve) => server?.close(() => resolve())));
|
|
86
77
|
});
|
|
87
78
|
});
|
|
88
|
-
context('when a single host is unavailable',
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
79
|
+
context('when a single host is unavailable', () => {
|
|
80
|
+
it('returns a fulfilled promise', () => {
|
|
81
|
+
let server;
|
|
82
|
+
return createServer(port, '::1')
|
|
83
|
+
.then((s) => {
|
|
84
|
+
server = s;
|
|
94
85
|
// this should work as the `127.0.0.1` is NOT `::1`
|
|
95
|
-
return expect((0,
|
|
86
|
+
return expect((0, net_1.isPortAvailable)(port, '127.0.0.1')).to.eventually.be
|
|
96
87
|
.fulfilled;
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
// close the servers used in this test as to not conflict with other tests
|
|
100
|
-
afterEach(function (done) {
|
|
101
|
-
closeFn(done);
|
|
88
|
+
})
|
|
89
|
+
.finally(() => new Promise((resolve) => server?.close(() => resolve())));
|
|
102
90
|
});
|
|
103
91
|
});
|
|
104
92
|
});
|