@pact-foundation/pact 16.0.1 → 16.0.2

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 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.0.2](https://github.com/pact-foundation/pact-js/compare/v16.0.1...v16.0.2) (2025-10-21)
6
+
7
+
8
+ ### Fixes and Improvements
9
+
10
+ * gracefully handle state handler errors ([#1585](https://github.com/pact-foundation/pact-js/issues/1585)) ([a323814](https://github.com/pact-foundation/pact-js/commit/a323814eaa0f5133b1d0eb68c41e601fe6141de3)), closes [#631](https://github.com/pact-foundation/pact-js/issues/631)
11
+
5
12
  ## [16.0.1](https://github.com/pact-foundation/pact-js/compare/v16.0.0...v16.0.1) (2025-10-16)
6
13
 
7
14
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pact-foundation/pact",
3
- "version": "16.0.1",
3
+ "version": "16.0.2",
4
4
  "description": "Pact for all things Javascript",
5
5
  "main": "./src/index.js",
6
6
  "types": "./src/index.d.ts",
@@ -116,24 +116,26 @@
116
116
  "lodash": "^4.17.21",
117
117
  "ramda": "^0.32.0",
118
118
  "randexp": "^0.5.3",
119
- "router": "^2.2.0"
119
+ "router": "^2.2.0",
120
+ "stack-utils": "^2.0.6"
120
121
  },
121
122
  "devDependencies": {
122
123
  "@babel/cli": "7.28.3",
123
124
  "@babel/core": "7.28.4",
124
125
  "@babel/preset-env": "7.28.3",
125
126
  "@pact-foundation/pact-js-prettier-config": "1.0.0",
126
- "@types/chai": "5.2.2",
127
+ "@types/chai": "5.2.3",
127
128
  "@types/chai-as-promised": "8.0.2",
128
129
  "@types/express": "4.17.23",
129
130
  "@types/http-proxy": "1.17.16",
130
131
  "@types/lodash": "4.17.20",
131
132
  "@types/mocha": "10.0.10",
132
133
  "@types/nock": "11.1.0",
133
- "@types/node": "22.18.10",
134
+ "@types/node": "22.18.12",
134
135
  "@types/ramda": "0.31.1",
135
136
  "@types/sinon": "17.0.4",
136
137
  "@types/sinon-chai": "4.0.0",
138
+ "@types/stack-utils": "^2.0.3",
137
139
  "@typescript-eslint/eslint-plugin": "5.62.0",
138
140
  "@typescript-eslint/parser": "5.62.0",
139
141
  "chai": "6.2.0",
@@ -1,14 +1,88 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
2
41
  Object.defineProperty(exports, "__esModule", { value: true });
3
42
  exports.createProxyStateHandler = void 0;
43
+ var stack_utils_1 = __importDefault(require("stack-utils"));
44
+ var chalk_1 = __importDefault(require("chalk"));
4
45
  var setupStates_1 = require("./setupStates");
46
+ var cleanStack = function (e) {
47
+ var stack = new stack_utils_1.default({
48
+ cwd: process.cwd(),
49
+ internals: stack_utils_1.default.nodeInternals(),
50
+ });
51
+ if (!e.stack)
52
+ return '';
53
+ var cleanedStack = stack.clean(e.stack);
54
+ var lines = cleanedStack.split('\n').map(function (line) { return line.trim(); });
55
+ return lines[0];
56
+ };
5
57
  var createProxyStateHandler = function (config) {
6
- return function (req, res) {
7
- var message = req.body;
8
- return Promise.resolve((0, setupStates_1.setupStates)(message, config))
9
- .then(function (data) { return res.json(data); })
10
- .catch(function (e) { return res.status(500).send(e); });
11
- };
58
+ return function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
59
+ var state, data, e_1, error, errorDetails, errorSource;
60
+ return __generator(this, function (_a) {
61
+ switch (_a.label) {
62
+ case 0:
63
+ state = req.body;
64
+ _a.label = 1;
65
+ case 1:
66
+ _a.trys.push([1, 3, , 4]);
67
+ return [4 /*yield*/, (0, setupStates_1.setupStates)(state, config)];
68
+ case 2:
69
+ data = _a.sent();
70
+ return [2 /*return*/, res.json(data)];
71
+ case 3:
72
+ e_1 = _a.sent();
73
+ error = "\nError executing state handler for state '".concat(state.state, "' on '").concat(state.action, "'.");
74
+ errorDetails = "\u21B3 Error details: ".concat(e_1.message);
75
+ errorSource = "\u21B3 Error source: ".concat(cleanStack(e_1), "\n");
76
+ /* eslint-disable no-console */
77
+ console.log(chalk_1.default.red(error));
78
+ console.log(chalk_1.default.red(errorDetails));
79
+ console.log(chalk_1.default.red(errorSource));
80
+ /* eslint-enable */
81
+ return [2 /*return*/, res.status(200).send()];
82
+ case 4: return [2 /*return*/];
83
+ }
84
+ });
85
+ }); };
12
86
  };
13
87
  exports.createProxyStateHandler = createProxyStateHandler;
14
88
  //# sourceMappingURL=stateHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stateHandler.js","sourceRoot":"","sources":["../../../../../../src/dsl/verifier/proxy/stateHandler/stateHandler.ts"],"names":[],"mappings":";;;AAGA,6CAA4C;AAErC,IAAM,uBAAuB,GAClC,UAAC,MAAoB;IACrB,OAAA,UAAC,GAAoB,EAAE,GAAqB;QAC1C,IAAM,OAAO,GAAkB,GAAG,CAAC,IAAI,CAAC;QAExC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAA,yBAAW,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;aACjD,IAAI,CAAC,UAAC,IAAI,IAAK,OAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAd,CAAc,CAAC;aAC9B,KAAK,CAAC,UAAC,CAAC,IAAK,OAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAvB,CAAuB,CAAC,CAAC;IAC3C,CAAC;AAND,CAMC,CAAC;AARS,QAAA,uBAAuB,2BAQhC"}
1
+ {"version":3,"file":"stateHandler.js","sourceRoot":"","sources":["../../../../../../src/dsl/verifier/proxy/stateHandler/stateHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,4DAAqC;AACrC,gDAA0B;AAE1B,6CAA4C;AAE5C,IAAM,UAAU,GAAG,UAAC,CAAQ;IAC1B,IAAM,KAAK,GAAG,IAAI,qBAAU,CAAC;QAC3B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,SAAS,EAAE,qBAAU,CAAC,aAAa,EAAE;KACtC,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACxB,IAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,EAAE,EAAX,CAAW,CAAC,CAAC;IAElE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAEK,IAAM,uBAAuB,GAClC,UAAC,MAAoB;IACrB,OAAA,UACE,GAAoB,EACpB,GAAqB;;;;;oBAEf,KAAK,GAAkB,GAAG,CAAC,IAAI,CAAC;;;;oBAEvB,qBAAM,IAAA,yBAAW,EAAC,KAAK,EAAE,MAAM,CAAC,EAAA;;oBAAvC,IAAI,GAAG,SAAgC;oBAC7C,sBAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAC;;;oBAEhB,KAAK,GAAG,qDAA8C,KAAK,CAAC,KAAK,mBAAS,KAAK,CAAC,MAAM,OAAI,CAAC;oBAC3F,YAAY,GAAG,gCAAoB,GAAC,CAAC,OAAO,CAAE,CAAC;oBAC/C,WAAW,GAAG,+BAAmB,UAAU,CAAC,GAAC,CAAC,OAAI,CAAC;oBACzD,+BAA+B;oBAC/B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;oBACpC,mBAAmB;oBAEnB,sBAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAC;;;;SAEjC;AApBD,CAoBC,CAAC;AAtBS,QAAA,uBAAuB,2BAsBhC"}
@@ -74,6 +74,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
74
74
  Object.defineProperty(exports, "__esModule", { value: true });
75
75
  var chai = __importStar(require("chai"));
76
76
  var chai_as_promised_1 = __importDefault(require("chai-as-promised"));
77
+ var sinon_1 = __importDefault(require("sinon"));
77
78
  var stateHandler_1 = require("./stateHandler");
78
79
  chai.use(chai_as_promised_1.default);
79
80
  var expect = chai.expect;
@@ -114,11 +115,12 @@ describe('#createProxyStateHandler', function () {
114
115
  setup: function () { return Promise.reject(new Error('bad')); },
115
116
  },
116
117
  };
117
- it('returns a 500', function () { return __awaiter(void 0, void 0, void 0, function () {
118
- var h;
118
+ it('returns a 200 and logs an error', function () { return __awaiter(void 0, void 0, void 0, function () {
119
+ var spy, h;
119
120
  return __generator(this, function (_a) {
120
121
  switch (_a.label) {
121
122
  case 0:
123
+ spy = sinon_1.default.spy(console, 'log');
122
124
  h = (0, stateHandler_1.createProxyStateHandler)({
123
125
  stateHandlers: badStateHandlers,
124
126
  });
@@ -127,7 +129,9 @@ describe('#createProxyStateHandler', function () {
127
129
  }, mockResponse)];
128
130
  case 1:
129
131
  _a.sent();
130
- expect(res).to.eql(500);
132
+ expect(res).to.eql(200);
133
+ expect(spy.callCount).to.eql(3);
134
+ expect(spy.getCall(0).args[0]).to.include("Error executing state handler for state 'thing exists' on 'setup'.");
131
135
  return [2 /*return*/];
132
136
  }
133
137
  });
@@ -1 +1 @@
1
- {"version":3,"file":"stateHandler.spec.js","sourceRoot":"","sources":["../../../../../../src/dsl/verifier/proxy/stateHandler/stateHandler.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA6B;AAC7B,sEAA8C;AAI9C,+CAAyD;AAGzD,IAAI,CAAC,GAAG,CAAC,0BAAc,CAAC,CAAC;AAEjB,IAAA,MAAM,GAAK,IAAI,OAAT,CAAU;AAExB,QAAQ,CAAC,0BAA0B,EAAE;IACnC,IAAM,KAAK,GAAG;QACZ,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE,OAAO;KAChB,CAAC;IAEF,IAAI,GAAQ,CAAC;IACb,IAAM,YAAY,GAAG;QACnB,MAAM,EAAE,UAAC,MAAc;YACrB,GAAG,GAAG,MAAM,CAAC;YACb,OAAO;gBACL,IAAI,EAAE,cAAO,CAAC;aACf,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,UAAC,IAAS,IAAK,OAAA,IAAI,EAAJ,CAAI;KAC1B,CAAC;IAEF,OAAO,CAAC,wCAAwC,EAAE;QAChD,EAAE,CAAC,eAAe,EAAE;;;gBACZ,aAAa,GAAG;oBACpB,cAAc,EAAE,cAAM,OAAA,OAAO,CAAC,OAAO,EAAE,EAAjB,CAAiB;iBACxC,CAAC;gBAEI,CAAC,GAAG,IAAA,sCAAuB,EAAC;oBAChC,aAAa,eAAA;iBACE,CAAC,CAAC;gBACnB,sBAAO,MAAM,CACX,CAAC,CACC;wBACE,IAAI,EAAE,KAAK;qBACO,EACpB,YAAgC,CACjC,CACF,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAC;;aAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,8CAA8C,EAAE;QACtD,IAAM,gBAAgB,GAAkB;YACtC,cAAc,EAAE;gBACd,KAAK,EAAE,cAAM,OAAA,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAhC,CAAgC;aAC9C;SACF,CAAC;QAEF,EAAE,CAAC,eAAe,EAAE;;;;;wBACZ,CAAC,GAAG,IAAA,sCAAuB,EAAC;4BAChC,aAAa,EAAE,gBAAgB;yBAChB,CAAC,CAAC;wBACnB,qBAAM,CAAC,CACL;gCACE,IAAI,EAAE,KAAK;6BACO,EACpB,YAAgC,CACjC,EAAA;;wBALD,SAKC,CAAC;wBAEF,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;;;aACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"stateHandler.spec.js","sourceRoot":"","sources":["../../../../../../src/dsl/verifier/proxy/stateHandler/stateHandler.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA6B;AAC7B,sEAA8C;AAI9C,gDAA0B;AAC1B,+CAAyD;AAGzD,IAAI,CAAC,GAAG,CAAC,0BAAc,CAAC,CAAC;AAEjB,IAAA,MAAM,GAAK,IAAI,OAAT,CAAU;AAExB,QAAQ,CAAC,0BAA0B,EAAE;IACnC,IAAM,KAAK,GAAG;QACZ,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE,OAAO;KAChB,CAAC;IAEF,IAAI,GAAQ,CAAC;IACb,IAAM,YAAY,GAAG;QACnB,MAAM,EAAE,UAAC,MAAc;YACrB,GAAG,GAAG,MAAM,CAAC;YACb,OAAO;gBACL,IAAI,EAAE,cAAO,CAAC;aACf,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,UAAC,IAAS,IAAK,OAAA,IAAI,EAAJ,CAAI;KAC1B,CAAC;IAEF,OAAO,CAAC,wCAAwC,EAAE;QAChD,EAAE,CAAC,eAAe,EAAE;;;gBACZ,aAAa,GAAG;oBACpB,cAAc,EAAE,cAAM,OAAA,OAAO,CAAC,OAAO,EAAE,EAAjB,CAAiB;iBACxC,CAAC;gBAEI,CAAC,GAAG,IAAA,sCAAuB,EAAC;oBAChC,aAAa,eAAA;iBACE,CAAC,CAAC;gBACnB,sBAAO,MAAM,CACX,CAAC,CACC;wBACE,IAAI,EAAE,KAAK;qBACO,EACpB,YAAgC,CACjC,CACF,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAC;;aAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,8CAA8C,EAAE;QACtD,IAAM,gBAAgB,GAAkB;YACtC,cAAc,EAAE;gBACd,KAAK,EAAE,cAAM,OAAA,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAhC,CAAgC;aAC9C;SACF,CAAC;QAEF,EAAE,CAAC,iCAAiC,EAAE;;;;;wBAC9B,GAAG,GAAG,eAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;wBAChC,CAAC,GAAG,IAAA,sCAAuB,EAAC;4BAChC,aAAa,EAAE,gBAAgB;yBAChB,CAAC,CAAC;wBACnB,qBAAM,CAAC,CACL;gCACE,IAAI,EAAE,KAAK;6BACO,EACpB,YAAgC,CACjC,EAAA;;wBALD,SAKC,CAAC;wBAEF,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACxB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBAChC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CACvC,oEAAoE,CACrE,CAAC;;;;aACH,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}