specmatic 1.0.0 → 1.0.3

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.
Files changed (65) hide show
  1. package/.babelrc +8 -12
  2. package/.github/dependabot.yml +18 -0
  3. package/.github/workflows/publish.yml +22 -0
  4. package/.github/workflows/test.yml +21 -0
  5. package/CONTRIBUTING.MD +17 -41
  6. package/README.md +152 -22
  7. package/dist/app.d.js +2 -1
  8. package/dist/bin/command.line.d.ts +2 -0
  9. package/dist/bin/command.line.js +36 -0
  10. package/dist/bin/index.d.ts +2 -0
  11. package/dist/bin/index.js +4 -5
  12. package/dist/common/logger.d.ts +3 -0
  13. package/dist/common/logger.js +62 -0
  14. package/dist/common/runner.d.ts +4 -0
  15. package/dist/common/runner.js +53 -0
  16. package/dist/config.d.ts +2 -0
  17. package/dist/config.js +6 -7
  18. package/dist/core/index.d.ts +24 -0
  19. package/dist/core/index.js +297 -0
  20. package/dist/core/shutdownUtils.d.ts +2 -0
  21. package/dist/core/shutdownUtils.js +42 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +100 -9
  24. package/dist/kafka/index.d.ts +14 -0
  25. package/dist/kafka/index.js +158 -0
  26. package/global.d.ts +1 -0
  27. package/jest.config.json +5 -0
  28. package/package.json +50 -23
  29. package/specmatic.jar +0 -0
  30. package/src/app.d.ts +1 -1
  31. package/src/bin/__tests__/command.line.ts +40 -0
  32. package/src/bin/command.line.ts +35 -0
  33. package/src/bin/index.ts +2 -2
  34. package/src/common/__tests__/logger.ts +85 -0
  35. package/src/common/logger.ts +49 -0
  36. package/src/common/runner.ts +44 -0
  37. package/src/config.ts +2 -3
  38. package/src/core/__tests__/end.points.api.ts +103 -0
  39. package/src/core/__tests__/print.jar.version.ts +28 -0
  40. package/src/core/__tests__/set.expectation.ts +54 -0
  41. package/src/core/__tests__/set.test.results.ts +62 -0
  42. package/src/core/__tests__/stub.ts +136 -0
  43. package/src/core/__tests__/test.ts +176 -0
  44. package/src/core/index.ts +261 -0
  45. package/src/core/shutdownUtils.ts +21 -0
  46. package/src/downloadSpecmaticJar.js +30 -0
  47. package/src/index.ts +19 -2
  48. package/src/kafka/index.ts +140 -0
  49. package/test-resources/sample-junit-result-corrupt.xml +175 -0
  50. package/test-resources/sample-junit-result-generative.xml +389 -0
  51. package/test-resources/sample-junit-result-multiple.xml +304 -0
  52. package/test-resources/sample-junit-result-no-testname.xml +179 -0
  53. package/test-resources/sample-junit-result-single.xml +92 -0
  54. package/test-resources/sample-junit-result-skipped.xml +198 -0
  55. package/tsconfig.json +106 -20
  56. package/.github/workflows/npm-publish.yml +0 -25
  57. package/.vscode/settings.json +0 -7
  58. package/dist/bin/core.js +0 -30
  59. package/dist/lib/index.js +0 -107
  60. package/src/bin/__tests__/core.ts +0 -13
  61. package/src/bin/core.ts +0 -22
  62. package/src/lib/__tests__/index.ts +0 -122
  63. package/src/lib/index.ts +0 -84
  64. /package/{mockStub.json → test-resources/sample-mock-stub.json} +0 -0
  65. /package/{specmatic.json → test-resources/sample-specmatic.json} +0 -0
package/dist/index.js CHANGED
@@ -3,35 +3,126 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "printJarVersion", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _core.printJarVersion;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "setExpectations", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _core.setExpectations;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "setHttpStubExpectations", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _core.setExpectations;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "setKafkaMockExpectations", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _kafka.setKafkaStubExpectations;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "setKafkaStubExpectations", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _kafka.setKafkaStubExpectations;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "showTestResults", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _core.showTestResults;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "startHttpStub", {
43
+ enumerable: true,
44
+ get: function get() {
45
+ return _core.startStub;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "startKafkaMock", {
49
+ enumerable: true,
50
+ get: function get() {
51
+ return _kafka.startKafkaStub;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "startKafkaStub", {
55
+ enumerable: true,
56
+ get: function get() {
57
+ return _kafka.startKafkaStub;
58
+ }
59
+ });
6
60
  Object.defineProperty(exports, "startStub", {
7
61
  enumerable: true,
8
62
  get: function get() {
9
- return _lib.startStub;
63
+ return _core.startStub;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "stopHttpStub", {
67
+ enumerable: true,
68
+ get: function get() {
69
+ return _core.stopStub;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "stopKafkaMock", {
73
+ enumerable: true,
74
+ get: function get() {
75
+ return _kafka.stopKafkaStub;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "stopKafkaStub", {
79
+ enumerable: true,
80
+ get: function get() {
81
+ return _kafka.stopKafkaStub;
10
82
  }
11
83
  });
12
84
  Object.defineProperty(exports, "stopStub", {
13
85
  enumerable: true,
14
86
  get: function get() {
15
- return _lib.stopStub;
87
+ return _core.stopStub;
16
88
  }
17
89
  });
18
90
  Object.defineProperty(exports, "test", {
19
91
  enumerable: true,
20
92
  get: function get() {
21
- return _lib.test;
93
+ return _core.test;
22
94
  }
23
95
  });
24
- Object.defineProperty(exports, "setExpectations", {
96
+ Object.defineProperty(exports, "testWithApiCoverage", {
25
97
  enumerable: true,
26
98
  get: function get() {
27
- return _lib.setExpectations;
99
+ return _core.testWithApiCoverage;
28
100
  }
29
101
  });
30
- Object.defineProperty(exports, "printJarVersion", {
102
+ Object.defineProperty(exports, "verifyKafkaMock", {
31
103
  enumerable: true,
32
104
  get: function get() {
33
- return _lib.printJarVersion;
105
+ return _kafka.verifyKafkaStub;
34
106
  }
35
107
  });
36
-
37
- var _lib = require("./lib");
108
+ Object.defineProperty(exports, "verifyKafkaMockMessage", {
109
+ enumerable: true,
110
+ get: function get() {
111
+ return _kafka.verifyKafkaStubMessage;
112
+ }
113
+ });
114
+ Object.defineProperty(exports, "verifyKafkaStub", {
115
+ enumerable: true,
116
+ get: function get() {
117
+ return _kafka.verifyKafkaStub;
118
+ }
119
+ });
120
+ Object.defineProperty(exports, "verifyKafkaStubMessage", {
121
+ enumerable: true,
122
+ get: function get() {
123
+ return _kafka.verifyKafkaStubMessage;
124
+ }
125
+ });
126
+ var _core = require("./core");
127
+ var _kafka = require("./kafka");
128
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfa2Fma2EiXSwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHtcbiAgICBzdGFydFN0dWIsXG4gICAgc3RhcnRTdHViIGFzIHN0YXJ0SHR0cFN0dWIsXG4gICAgc3RvcFN0dWIsXG4gICAgc3RvcFN0dWIgYXMgc3RvcEh0dHBTdHViLFxuICAgIHRlc3QsXG4gICAgdGVzdFdpdGhBcGlDb3ZlcmFnZSxcbiAgICBzZXRFeHBlY3RhdGlvbnMsXG4gICAgc2V0RXhwZWN0YXRpb25zIGFzIHNldEh0dHBTdHViRXhwZWN0YXRpb25zLFxuICAgIHByaW50SmFyVmVyc2lvbixcbiAgICBzaG93VGVzdFJlc3VsdHMsXG59IGZyb20gJy4vY29yZSdcbmV4cG9ydCB7XG4gICAgc3RhcnRLYWZrYVN0dWIsXG4gICAgc3RhcnRLYWZrYVN0dWIgYXMgc3RhcnRLYWZrYU1vY2ssXG4gICAgc3RvcEthZmthU3R1YixcbiAgICBzdG9wS2Fma2FTdHViIGFzIHN0b3BLYWZrYU1vY2ssXG4gICAgdmVyaWZ5S2Fma2FTdHViTWVzc2FnZSxcbiAgICB2ZXJpZnlLYWZrYVN0dWJNZXNzYWdlIGFzIHZlcmlmeUthZmthTW9ja01lc3NhZ2UsXG4gICAgdmVyaWZ5S2Fma2FTdHViLFxuICAgIHZlcmlmeUthZmthU3R1YiBhcyB2ZXJpZnlLYWZrYU1vY2ssXG4gICAgc2V0S2Fma2FTdHViRXhwZWN0YXRpb25zLFxuICAgIHNldEthZmthU3R1YkV4cGVjdGF0aW9ucyBhcyBzZXRLYWZrYU1vY2tFeHBlY3RhdGlvbnMsXG59IGZyb20gJy4va2Fma2EnXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxPQUFBO0FBWUEsSUFBQUMsTUFBQSxHQUFBRCxPQUFBIn0=
@@ -0,0 +1,14 @@
1
+ /// <reference types="node" />
2
+ import { ChildProcess } from 'child_process';
3
+ export declare class KafkaStub {
4
+ port: number;
5
+ apiPort: number;
6
+ process: ChildProcess;
7
+ constructor(port: number, apiPort: number, process: ChildProcess);
8
+ }
9
+ declare const startKafkaStub: (port?: number, args?: (string | number)[]) => Promise<KafkaStub>;
10
+ declare const stopKafkaStub: (stub: KafkaStub) => Promise<void>;
11
+ declare const setKafkaStubExpectations: (stub: KafkaStub, expecations: any) => Promise<void>;
12
+ declare const verifyKafkaStub: (stub: KafkaStub) => Promise<Boolean>;
13
+ declare const verifyKafkaStubMessage: (stub: KafkaStub, topic: string, value: string) => Promise<Boolean>;
14
+ export { startKafkaStub, stopKafkaStub, verifyKafkaStubMessage, verifyKafkaStub, setKafkaStubExpectations };
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.verifyKafkaStubMessage = exports.verifyKafkaStub = exports.stopKafkaStub = exports.startKafkaStub = exports.setKafkaStubExpectations = exports.KafkaStub = void 0;
7
+ var _runner = require("../common/runner");
8
+ var _logger = _interopRequireDefault(require("../common/logger"));
9
+ var _axios = _interopRequireDefault(require("axios"));
10
+ var _promise = _interopRequireDefault(require("terminate/promise"));
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
12
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
13
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
14
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
15
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
16
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
17
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
18
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
19
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
20
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
21
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
22
+ var KafkaStub = /*#__PURE__*/_createClass(function KafkaStub(port, apiPort, process) {
23
+ _classCallCheck(this, KafkaStub);
24
+ _defineProperty(this, "port", void 0);
25
+ _defineProperty(this, "apiPort", void 0);
26
+ _defineProperty(this, "process", void 0);
27
+ this.port = port;
28
+ this.apiPort = apiPort;
29
+ this.process = process;
30
+ });
31
+ exports.KafkaStub = KafkaStub;
32
+ var startKafkaStub = function startKafkaStub(port, args) {
33
+ var cmd = "";
34
+ if (port) cmd += " --port=".concat(port);
35
+ if (args) cmd += ' ' + args.join(' ');
36
+ _logger["default"].info('Kafka Stub: Starting server');
37
+ _logger["default"].debug("Kafka Stub: Executing \"".concat(cmd, "\""));
38
+ return new Promise(function (resolve, reject) {
39
+ var port, apiPort;
40
+ var javaProcess = (0, _runner.callKafka)(cmd, function (err) {
41
+ if (err) {
42
+ _logger["default"].error("Kafka Stub: Exited with error ".concat(err));
43
+ }
44
+ }, function (message, error) {
45
+ if (!error) {
46
+ if (message.indexOf('Kafka started on port') > -1) {
47
+ _logger["default"].info("Kafka Stub: ".concat(message));
48
+ var stubInfo = message.split('on port');
49
+ if (stubInfo.length < 2) reject('Cannot determine port from kafka stub output');else port = parseInt(stubInfo[1].trim());
50
+ } else if (message.indexOf('Starting api server on port') > -1) {
51
+ _logger["default"].info("Kafka Stub: ".concat(message));
52
+ var _stubInfo = message.split(':');
53
+ if (_stubInfo.length < 2) reject('Cannot determine api port from kafka stub output');else apiPort = parseInt(_stubInfo[1].trim());
54
+ } else if (message.indexOf('Listening on topic') > -1) {
55
+ _logger["default"].info("Kafka Stub: ".concat(message));
56
+ if (port && apiPort) resolve(new KafkaStub(port, apiPort, javaProcess));else reject('No port or api port information available but kafka stub listening on topic already');
57
+ } else if (message.indexOf('Address already in use') > -1) {
58
+ _logger["default"].error("Kafka Stub: ".concat(message));
59
+ reject('Address already in use');
60
+ } else {
61
+ _logger["default"].debug("Kafka Stub: ".concat(message));
62
+ }
63
+ } else {
64
+ _logger["default"].error("Kafka Stub: ".concat(message));
65
+ }
66
+ });
67
+ });
68
+ };
69
+ exports.startKafkaStub = startKafkaStub;
70
+ var stopKafkaStub = /*#__PURE__*/function () {
71
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(stub) {
72
+ var _javaProcess$stdout, _javaProcess$stderr;
73
+ var javaProcess;
74
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
75
+ while (1) switch (_context.prev = _context.next) {
76
+ case 0:
77
+ _logger["default"].debug("Kafka Stub: Stopping at port=".concat(stub.port, ", apiPort=").concat(stub.apiPort));
78
+ javaProcess = stub.process;
79
+ (_javaProcess$stdout = javaProcess.stdout) === null || _javaProcess$stdout === void 0 || _javaProcess$stdout.removeAllListeners();
80
+ (_javaProcess$stderr = javaProcess.stderr) === null || _javaProcess$stderr === void 0 || _javaProcess$stderr.removeAllListeners();
81
+ javaProcess.removeAllListeners('close');
82
+ _context.next = 7;
83
+ return (0, _promise["default"])(javaProcess.pid);
84
+ case 7:
85
+ _logger["default"].info("Kafka Stub: Stopped at port=".concat(stub.port, ", apiPort=").concat(stub.apiPort));
86
+ case 8:
87
+ case "end":
88
+ return _context.stop();
89
+ }
90
+ }, _callee);
91
+ }));
92
+ return function stopKafkaStub(_x) {
93
+ return _ref.apply(this, arguments);
94
+ };
95
+ }();
96
+ exports.stopKafkaStub = stopKafkaStub;
97
+ var setKafkaStubExpectations = function setKafkaStubExpectations(stub, expecations) {
98
+ var exectationsUrl = "http://localhost:".concat(stub.apiPort, "/_expectations");
99
+ _logger["default"].info("Kafka Set Expectations: Url is ".concat(exectationsUrl));
100
+ return new Promise(function (resolve, reject) {
101
+ _axios["default"].post("".concat(exectationsUrl), expecations, {
102
+ headers: {
103
+ Accept: 'application/json',
104
+ 'Content-Type': 'application/json'
105
+ }
106
+ }).then(function (response) {
107
+ _logger["default"].debug("Kafka Set Expectations: Finished ".concat(JSON.stringify(response.data)));
108
+ resolve();
109
+ })["catch"](function (err) {
110
+ _logger["default"].error("Kafka Set Expectations: Failed with error ".concat(err));
111
+ reject("Set expectation failed with error ".concat(err));
112
+ });
113
+ });
114
+ };
115
+ exports.setKafkaStubExpectations = setKafkaStubExpectations;
116
+ var verifyKafkaStub = function verifyKafkaStub(stub) {
117
+ var verificationUrl = "http://localhost:".concat(stub.apiPort, "/_expectations/verifications");
118
+ _logger["default"].info("Kafka Verification: Url is ".concat(verificationUrl));
119
+ return new Promise(function (resolve, reject) {
120
+ _axios["default"].post("".concat(verificationUrl), {
121
+ headers: {
122
+ Accept: 'application/json',
123
+ 'Content-Type': 'application/json'
124
+ }
125
+ }).then(function (response) {
126
+ _logger["default"].debug("Kafka Verification: Finished ".concat(JSON.stringify(response.data)));
127
+ if (!response.data.success) _logger["default"].info("Kafka Verification: Errors\n".concat(JSON.stringify(response.data)));
128
+ resolve(response.data.success);
129
+ })["catch"](function (err) {
130
+ _logger["default"].error("Kafka Verification: Failed with error ".concat(err));
131
+ reject("Kafka verification failed with error ".concat(err));
132
+ });
133
+ });
134
+ };
135
+ exports.verifyKafkaStub = verifyKafkaStub;
136
+ var verifyKafkaStubMessage = function verifyKafkaStubMessage(stub, topic, value) {
137
+ var verificationUrl = "http://localhost:".concat(stub.apiPort, "/_verifications");
138
+ _logger["default"].info("Kafka Verify Message: Url is ".concat(verificationUrl));
139
+ return new Promise(function (resolve, reject) {
140
+ _axios["default"].post("".concat(verificationUrl), {
141
+ topic: topic,
142
+ value: value
143
+ }, {
144
+ headers: {
145
+ Accept: 'application/json',
146
+ 'Content-Type': 'application/json'
147
+ }
148
+ }).then(function (response) {
149
+ _logger["default"].debug("Kafka Verify Message: Finished ".concat(JSON.stringify(response.data)));
150
+ resolve(response.data.received);
151
+ })["catch"](function (err) {
152
+ _logger["default"].error("Kafka Verify Message: Failed with error ".concat(err));
153
+ reject("Kafka message verification failed with error ".concat(err));
154
+ });
155
+ });
156
+ };
157
+ exports.verifyKafkaStubMessage = verifyKafkaStubMessage;
158
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcnVubmVyIiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2F4aW9zIiwiX3Byb21pc2UiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsImUiLCJ0IiwiciIsIk9iamVjdCIsIm4iLCJoYXNPd25Qcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJpIiwiYSIsImMiLCJhc3luY0l0ZXJhdG9yIiwidSIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwid3JhcCIsIkdlbmVyYXRvciIsImNyZWF0ZSIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiYXJnIiwiY2FsbCIsImgiLCJsIiwiZiIsInMiLCJ5IiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsInAiLCJkIiwiZ2V0UHJvdG90eXBlT2YiLCJ2IiwidmFsdWVzIiwiZyIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsImludm9rZSIsInJlc29sdmUiLCJfX2F3YWl0IiwidGhlbiIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiRXJyb3IiLCJkb25lIiwibWV0aG9kIiwiZGVsZWdhdGUiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJUeXBlRXJyb3IiLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImlzTmFOIiwibGVuZ3RoIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwia2V5cyIsInJldmVyc2UiLCJwb3AiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicnZhbCIsImhhbmRsZSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsInJlamVjdCIsIl9uZXh0IiwiX3Rocm93Iiwia2V5IiwiaW5mbyIsImVycm9yIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJmbiIsInNlbGYiLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJlcnIiLCJ1bmRlZmluZWQiLCJfZGVmaW5lUHJvcGVydGllcyIsInRhcmdldCIsInByb3BzIiwiZGVzY3JpcHRvciIsIl90b1Byb3BlcnR5S2V5IiwiX2NyZWF0ZUNsYXNzIiwiQ29uc3RydWN0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIl9kZWZpbmVQcm9wZXJ0eSIsIl90b1ByaW1pdGl2ZSIsIlN0cmluZyIsImlucHV0IiwiaGludCIsInByaW0iLCJ0b1ByaW1pdGl2ZSIsInJlcyIsIk51bWJlciIsIkthZmthU3R1YiIsInBvcnQiLCJhcGlQb3J0IiwicHJvY2VzcyIsImV4cG9ydHMiLCJzdGFydEthZmthU3R1YiIsImNtZCIsImNvbmNhdCIsImpvaW4iLCJsb2dnZXIiLCJkZWJ1ZyIsImphdmFQcm9jZXNzIiwiY2FsbEthZmthIiwibWVzc2FnZSIsImluZGV4T2YiLCJzdHViSW5mbyIsInNwbGl0IiwicGFyc2VJbnQiLCJ0cmltIiwic3RvcEthZmthU3R1YiIsIl9yZWYiLCJfY2FsbGVlIiwic3R1YiIsIl9qYXZhUHJvY2VzcyRzdGRvdXQiLCJfamF2YVByb2Nlc3Mkc3RkZXJyIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInN0ZG91dCIsInJlbW92ZUFsbExpc3RlbmVycyIsInN0ZGVyciIsInRlcm1pbmF0ZSIsInBpZCIsIl94Iiwic2V0S2Fma2FTdHViRXhwZWN0YXRpb25zIiwiZXhwZWNhdGlvbnMiLCJleGVjdGF0aW9uc1VybCIsImF4aW9zIiwicG9zdCIsImhlYWRlcnMiLCJBY2NlcHQiLCJyZXNwb25zZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkYXRhIiwidmVyaWZ5S2Fma2FTdHViIiwidmVyaWZpY2F0aW9uVXJsIiwic3VjY2VzcyIsInZlcmlmeUthZmthU3R1Yk1lc3NhZ2UiLCJ0b3BpYyIsInJlY2VpdmVkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2thZmthL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhbGxLYWZrYSB9IGZyb20gJy4uL2NvbW1vbi9ydW5uZXInO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9jb21tb24vbG9nZ2VyJztcbmltcG9ydCB7IENoaWxkUHJvY2VzcyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB0ZXJtaW5hdGUgZnJvbSAndGVybWluYXRlL3Byb21pc2UnO1xuXG5leHBvcnQgY2xhc3MgS2Fma2FTdHViIHtcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgYXBpUG9ydDogbnVtYmVyO1xuICAgIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcbiAgICBjb25zdHJ1Y3Rvcihwb3J0OiBudW1iZXIsIGFwaVBvcnQ6IG51bWJlciwgcHJvY2VzczogQ2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7XG4gICAgICAgIHRoaXMuYXBpUG9ydCA9IGFwaVBvcnQ7XG4gICAgICAgIHRoaXMucHJvY2VzcyA9IHByb2Nlc3M7XG4gICAgfVxufVxuXG5jb25zdCBzdGFydEthZmthU3R1YiA9IChwb3J0PzogbnVtYmVyLCBhcmdzPzogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8S2Fma2FTdHViPiA9PiB7XG4gICAgdmFyIGNtZCA9IGBgO1xuICAgIGlmIChwb3J0KSBjbWQgKz0gYCAtLXBvcnQ9JHtwb3J0fWA7XG4gICAgaWYgKGFyZ3MpIGNtZCArPSAnICcgKyBhcmdzLmpvaW4oJyAnKTtcblxuICAgIGxvZ2dlci5pbmZvKCdLYWZrYSBTdHViOiBTdGFydGluZyBzZXJ2ZXInKTtcbiAgICBsb2dnZXIuZGVidWcoYEthZmthIFN0dWI6IEV4ZWN1dGluZyBcIiR7Y21kfVwiYCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcG9ydDogbnVtYmVyLCBhcGlQb3J0OiBudW1iZXI7XG4gICAgICAgIGNvbnN0IGphdmFQcm9jZXNzID0gY2FsbEthZmthKFxuICAgICAgICAgICAgY21kLFxuICAgICAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEthZmthIFN0dWI6IEV4aXRlZCB3aXRoIGVycm9yICR7ZXJyfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAobWVzc2FnZSwgZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluZGV4T2YoJ0thZmthIHN0YXJ0ZWQgb24gcG9ydCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBLYWZrYSBTdHViOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHViSW5mbyA9IG1lc3NhZ2Uuc3BsaXQoJ29uIHBvcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHViSW5mby5sZW5ndGggPCAyKSByZWplY3QoJ0Nhbm5vdCBkZXRlcm1pbmUgcG9ydCBmcm9tIGthZmthIHN0dWIgb3V0cHV0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHBvcnQgPSBwYXJzZUludChzdHViSW5mb1sxXS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UuaW5kZXhPZignU3RhcnRpbmcgYXBpIHNlcnZlciBvbiBwb3J0JykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEthZmthIFN0dWI6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0dWJJbmZvID0gbWVzc2FnZS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0dWJJbmZvLmxlbmd0aCA8IDIpIHJlamVjdCgnQ2Fubm90IGRldGVybWluZSBhcGkgcG9ydCBmcm9tIGthZmthIHN0dWIgb3V0cHV0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGFwaVBvcnQgPSBwYXJzZUludChzdHViSW5mb1sxXS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UuaW5kZXhPZignTGlzdGVuaW5nIG9uIHRvcGljJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEthZmthIFN0dWI6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0ICYmIGFwaVBvcnQpIHJlc29sdmUobmV3IEthZmthU3R1Yihwb3J0LCBhcGlQb3J0LCBqYXZhUHJvY2VzcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByZWplY3QoJ05vIHBvcnQgb3IgYXBpIHBvcnQgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGJ1dCBrYWZrYSBzdHViIGxpc3RlbmluZyBvbiB0b3BpYyBhbHJlYWR5Jyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5pbmRleE9mKCdBZGRyZXNzIGFscmVhZHkgaW4gdXNlJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBLYWZrYSBTdHViOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0FkZHJlc3MgYWxyZWFkeSBpbiB1c2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgS2Fma2EgU3R1YjogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBLYWZrYSBTdHViOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0pO1xufTtcblxuY29uc3Qgc3RvcEthZmthU3R1YiA9IGFzeW5jIChzdHViOiBLYWZrYVN0dWIpID0+IHtcbiAgICBsb2dnZXIuZGVidWcoYEthZmthIFN0dWI6IFN0b3BwaW5nIGF0IHBvcnQ9JHtzdHViLnBvcnR9LCBhcGlQb3J0PSR7c3R1Yi5hcGlQb3J0fWApO1xuICAgIGNvbnN0IGphdmFQcm9jZXNzID0gc3R1Yi5wcm9jZXNzO1xuICAgIGphdmFQcm9jZXNzLnN0ZG91dD8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgamF2YVByb2Nlc3Muc3RkZXJyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBqYXZhUHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgYXdhaXQgdGVybWluYXRlKGphdmFQcm9jZXNzLnBpZCEpO1xuICAgIGxvZ2dlci5pbmZvKGBLYWZrYSBTdHViOiBTdG9wcGVkIGF0IHBvcnQ9JHtzdHViLnBvcnR9LCBhcGlQb3J0PSR7c3R1Yi5hcGlQb3J0fWApO1xufTtcblxuY29uc3Qgc2V0S2Fma2FTdHViRXhwZWN0YXRpb25zID0gKHN0dWI6IEthZmthU3R1YiwgZXhwZWNhdGlvbnM6IGFueSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGV4ZWN0YXRpb25zVXJsID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtzdHViLmFwaVBvcnR9L19leHBlY3RhdGlvbnNgO1xuICAgIGxvZ2dlci5pbmZvKGBLYWZrYSBTZXQgRXhwZWN0YXRpb25zOiBVcmwgaXMgJHtleGVjdGF0aW9uc1VybH1gKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBheGlvc1xuICAgICAgICAgICAgLnBvc3QoYCR7ZXhlY3RhdGlvbnNVcmx9YCwgZXhwZWNhdGlvbnMsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgS2Fma2EgU2V0IEV4cGVjdGF0aW9uczogRmluaXNoZWQgJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZS5kYXRhKX1gKVxuICAgICAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgS2Fma2EgU2V0IEV4cGVjdGF0aW9uczogRmFpbGVkIHdpdGggZXJyb3IgJHtlcnJ9YClcbiAgICAgICAgICAgICAgICByZWplY3QoYFNldCBleHBlY3RhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAke2Vycn1gKVxuICAgICAgICAgICAgfSlcbiAgICB9KTtcbn07XG5cbmNvbnN0IHZlcmlmeUthZmthU3R1YiA9IChzdHViOiBLYWZrYVN0dWIpOiBQcm9taXNlPEJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCB2ZXJpZmljYXRpb25VcmwgPSBgaHR0cDovL2xvY2FsaG9zdDoke3N0dWIuYXBpUG9ydH0vX2V4cGVjdGF0aW9ucy92ZXJpZmljYXRpb25zYDtcbiAgICBsb2dnZXIuaW5mbyhgS2Fma2EgVmVyaWZpY2F0aW9uOiBVcmwgaXMgJHt2ZXJpZmljYXRpb25Vcmx9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgYXhpb3MucG9zdChgJHt2ZXJpZmljYXRpb25Vcmx9YCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEthZmthIFZlcmlmaWNhdGlvbjogRmluaXNoZWQgJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZS5kYXRhKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5kYXRhLnN1Y2Nlc3MpIGxvZ2dlci5pbmZvKGBLYWZrYSBWZXJpZmljYXRpb246IEVycm9yc1xcbiR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZGF0YSl9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YS5zdWNjZXNzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEthZmthIFZlcmlmaWNhdGlvbjogRmFpbGVkIHdpdGggZXJyb3IgJHtlcnJ9YCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGBLYWZrYSB2ZXJpZmljYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJHtlcnJ9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IHZlcmlmeUthZmthU3R1Yk1lc3NhZ2UgPSAoc3R1YjogS2Fma2FTdHViLCB0b3BpYzogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxCb29sZWFuPiA9PiB7XG4gICAgY29uc3QgdmVyaWZpY2F0aW9uVXJsID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtzdHViLmFwaVBvcnR9L192ZXJpZmljYXRpb25zYDtcbiAgICBsb2dnZXIuaW5mbyhgS2Fma2EgVmVyaWZ5IE1lc3NhZ2U6IFVybCBpcyAke3ZlcmlmaWNhdGlvblVybH1gKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBheGlvcy5wb3N0KGAke3ZlcmlmaWNhdGlvblVybH1gLCB7IHRvcGljOiB0b3BpYywgdmFsdWU6IHZhbHVlIH0sIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEthZmthIFZlcmlmeSBNZXNzYWdlOiBGaW5pc2hlZCAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlLmRhdGEpfWApO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YS5yZWNlaXZlZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBLYWZrYSBWZXJpZnkgTWVzc2FnZTogRmFpbGVkIHdpdGggZXJyb3IgJHtlcnJ9YCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGBLYWZrYSBtZXNzYWdlIHZlcmlmaWNhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAke2Vycn1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IHsgc3RhcnRLYWZrYVN0dWIsIHN0b3BLYWZrYVN0dWIsIHZlcmlmeUthZmthU3R1Yk1lc3NhZ2UsIHZlcmlmeUthZmthU3R1Yiwgc2V0S2Fma2FTdHViRXhwZWN0YXRpb25zIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFHLE1BQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUEwQyxTQUFBRSx1QkFBQUcsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLGdCQUFBQSxHQUFBO0FBQUEsU0FBQUUsUUFBQUMsQ0FBQSxzQ0FBQUQsT0FBQSx3QkFBQUUsTUFBQSx1QkFBQUEsTUFBQSxDQUFBQyxRQUFBLGFBQUFGLENBQUEsa0JBQUFBLENBQUEsZ0JBQUFBLENBQUEsV0FBQUEsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBRCxDQUFBLENBQUFHLFdBQUEsS0FBQUYsTUFBQSxJQUFBRCxDQUFBLEtBQUFDLE1BQUEsQ0FBQUcsU0FBQSxxQkFBQUosQ0FBQSxLQUFBRCxPQUFBLENBQUFDLENBQUE7QUFBQSxTQUFBSyxvQkFBQSxrQkFIMUMscUpBQUFBLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLENBQUEsU0FBQUMsQ0FBQSxFQUFBRCxDQUFBLE9BQUFFLENBQUEsR0FBQUMsTUFBQSxDQUFBTCxTQUFBLEVB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
package/global.d.ts ADDED
@@ -0,0 +1 @@
1
+ import 'jest-extended';
@@ -0,0 +1,5 @@
1
+ {
2
+ "testPathIgnorePatterns": ["/node_modules/", "dist"],
3
+ "setupFilesAfterEnv": ["jest-extended/all"],
4
+ "coverageDirectory": "./coverage"
5
+ }
package/package.json CHANGED
@@ -1,24 +1,37 @@
1
1
  {
2
2
  "name": "specmatic",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
+ "specmaticVersion": "1.0.3",
4
5
  "description": "Node wrapper for Specmatic",
5
6
  "main": "dist/index.js",
6
7
  "scripts": {
7
- "test": "jest",
8
- "build": "npm test && rimraf dist && ./node_modules/.bin/babel src --extensions '.ts,.js' --ignore '**/__tests__/*.ts' -d dist",
9
- "build-and-publish-patch": "npm run build && npm version patch && npm publish",
10
- "build-and-publish-minor": "npm run build && npm version minor && npm publish",
11
- "build-and-publish-major": "npm run build && npm version major && npm publish"
8
+ "type-check": "tsc --noEmit",
9
+ "type-check:watch": "npm run type-check -- --watch",
10
+ "build": "npm test && rimraf dist && npm run build:types && npm run build:js",
11
+ "build:types": "tsc --emitDeclarationOnly",
12
+ "build:js": "babel src --out-dir dist --ignore 'src/**/__tests__/**/*.ts' --extensions \".ts,.tsx\" --source-maps inline",
13
+ "test": "rimraf coverage && jest --coverage",
14
+ "postinstall": "node src/downloadSpecmaticJar.js"
12
15
  },
13
16
  "repository": {
14
17
  "type": "git",
15
18
  "url": "git+https://github.com/znsio/specmatic-node.git"
16
19
  },
17
20
  "keywords": [
18
- "qontract",
19
21
  "contract",
20
22
  "testing",
21
- "specmatic"
23
+ "specmatic",
24
+ "contract driven development",
25
+ "cdd",
26
+ "openapi",
27
+ "swagger",
28
+ "asyncapi",
29
+ "api",
30
+ "mocking",
31
+ "stubbing",
32
+ "kafka",
33
+ "jms",
34
+ "redis"
22
35
  ],
23
36
  "author": "Sahil Sharma (sahilaug@gmail.com)",
24
37
  "license": "ISC",
@@ -27,24 +40,38 @@
27
40
  },
28
41
  "homepage": "https://github.com/znsio/specmatic-node#readme",
29
42
  "bin": {
30
- "specmatic": "dist/bin/index.js",
31
- "qontract": "dist/bin/index.js"
43
+ "specmatic": "dist/bin/index.js"
44
+ },
45
+ "specmatic": {
46
+ "logLevel": "debug"
32
47
  },
33
48
  "dependencies": {
34
- "@babel/cli": "^7.10.5",
35
- "@babel/core": "^7.11.4",
36
- "@babel/preset-env": "^7.11.0",
37
- "@babel/preset-typescript": "^7.10.4",
38
- "@types/node-fetch": "^2.5.7",
39
- "@types/yargs": "^15.0.5",
40
- "exec-sh": "^0.3.4",
41
- "node-fetch": "^2.6.0",
42
- "rimraf": "^3.0.2",
43
- "yargs": "^15.4.1"
49
+ "axios": "^1.5.0",
50
+ "express-list-endpoints": "^6.0.0",
51
+ "fast-xml-parser": "^4.2.7",
52
+ "terminate": "^2.6.1",
53
+ "tree-kill": "^1.2.2",
54
+ "winston": "^3.10.0"
44
55
  },
45
56
  "devDependencies": {
46
- "@types/jest": "^26.0.14",
47
- "jest": "^26.4.2",
48
- "jest-mock-extended": "^3.0.4"
57
+ "@babel/cli": "^7.22.10",
58
+ "@babel/core": "^7.22.11",
59
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
60
+ "@babel/preset-env": "^7.22.10",
61
+ "@babel/preset-typescript": "^7.22.11",
62
+ "@types/express": "^4.17.17",
63
+ "@types/express-list-endpoints": "^6.0.0",
64
+ "@types/jest": "^29.5.4",
65
+ "@types/jest-when": "^3.5.2",
66
+ "@types/node": "^20.5.7",
67
+ "@types/supertest": "^2.0.12",
68
+ "express": "^4.18.2",
69
+ "jest": "^29.6.4",
70
+ "jest-extended": "^4.0.1",
71
+ "jest-mock-extended": "^3.0.5",
72
+ "jest-when": "^3.6.0",
73
+ "rimraf": "^5.0.1",
74
+ "supertest": "^6.3.3",
75
+ "typescript": "^5.2.2"
49
76
  }
50
77
  }
package/specmatic.jar CHANGED
Binary file
package/src/app.d.ts CHANGED
@@ -1 +1 @@
1
- declare module 'exec-sh';
1
+ declare module 'exec-sh';
@@ -0,0 +1,40 @@
1
+ import path from 'path';
2
+ import callSpecmaticCli from '../command.line';
3
+ import { specmaticCoreJarName, specmaticKafkaJarName } from '../../config';
4
+ import fs from 'fs';
5
+ import { ChildProcess, spawn } from 'child_process';
6
+ import { mock as jestMock, mockReset } from 'jest-mock-extended';
7
+ import { Readable } from 'stream';
8
+
9
+ jest.mock('child_process');
10
+
11
+ const javaProcessMock = jestMock<ChildProcess>();
12
+ const readableMock = jestMock<Readable>();
13
+ javaProcessMock.stdout = readableMock;
14
+ javaProcessMock.stderr = readableMock;
15
+
16
+ beforeEach(() => {
17
+ jest.resetAllMocks();
18
+ });
19
+
20
+ test('pass all wrapper arguments to the jar', async () => {
21
+ spawn.mockReturnValue(javaProcessMock);
22
+
23
+ jest.spyOn(fs, 'existsSync').mockReturnValue(true);
24
+ const testArgs = ['node', 'index.js', 'stub', '*.specmatic', '--data', 'src/mocks', '--host', 'localhost', '--port', '8000'];
25
+ callSpecmaticCli(testArgs);
26
+ const specmaticJarPath = path.resolve(__dirname, '..', '..', '..', specmaticCoreJarName);
27
+ expect(spawn.mock.calls[0][1][1]).toBe(`"${path.resolve(specmaticJarPath)}"`);
28
+ expect(spawn.mock.calls[0][1][2]).toBe(testArgs.slice(2).join(" "));
29
+ });
30
+
31
+ test('pass kafka related calls to the kafka jar', async () => {
32
+ spawn.mockReturnValue(javaProcessMock);
33
+
34
+ jest.spyOn(fs, 'existsSync').mockReturnValue(true);
35
+ const testArgs = ['node', 'index.js', 'kafka', '--host', 'localhost', '--port', '8000'];
36
+ callSpecmaticCli(testArgs);
37
+ const specmaticKafkaJarPath = path.resolve(__dirname, '..', '..', '..', '..', 'specmatic-beta', 'kafka', specmaticKafkaJarName);
38
+ expect(spawn.mock.calls[0][1][1]).toBe(`"${path.resolve(specmaticKafkaJarPath)}"`);
39
+ expect(spawn.mock.calls[0][1][2]).toBe(testArgs.slice(3).join(" "));
40
+ });
@@ -0,0 +1,35 @@
1
+ import logger from '../common/logger'
2
+ import { callKafka, callCore } from '../common/runner'
3
+
4
+ const callSpecmaticCli = (args?: string[]) => {
5
+ args = args || process.argv
6
+ let cliArgs = extractArgsForJar(args)
7
+ let fn = getJarFunction(args)
8
+ logger.info(`CLI: Running with args "${cliArgs}"`)
9
+ fn(
10
+ cliArgs,
11
+ (err?: any) => {
12
+ if (err) {
13
+ logger.info('CLI: Finished with non zero exit code: ', err.code)
14
+ process.exitCode = err.code
15
+ } else {
16
+ logger.info('CLI: Finished')
17
+ process.exitCode = 0
18
+ }
19
+ },
20
+ message => {
21
+ console.log(`${message}`)
22
+ }
23
+ )
24
+ }
25
+
26
+ function getJarFunction(args: string[]) {
27
+ return args.length >= 3 && args[2] == 'kafka' ? callKafka : callCore
28
+ }
29
+
30
+ function extractArgsForJar(args: string[]) {
31
+ const argsToRemove = args.length >= 3 && args[2] == 'kafka' ? 3 : 2
32
+ return args.slice(argsToRemove).join(' ')
33
+ }
34
+
35
+ export default callSpecmaticCli
package/src/bin/index.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import callSpecmaticCli from './core';
2
+ import callSpecmaticCli from './command.line';
3
3
 
4
- callSpecmaticCli();
4
+ callSpecmaticCli();