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.
- package/.babelrc +8 -12
- package/.github/dependabot.yml +18 -0
- package/.github/workflows/publish.yml +22 -0
- package/.github/workflows/test.yml +21 -0
- package/CONTRIBUTING.MD +17 -41
- package/README.md +152 -22
- package/dist/app.d.js +2 -1
- package/dist/bin/command.line.d.ts +2 -0
- package/dist/bin/command.line.js +36 -0
- package/dist/bin/index.d.ts +2 -0
- package/dist/bin/index.js +4 -5
- package/dist/common/logger.d.ts +3 -0
- package/dist/common/logger.js +62 -0
- package/dist/common/runner.d.ts +4 -0
- package/dist/common/runner.js +53 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +6 -7
- package/dist/core/index.d.ts +24 -0
- package/dist/core/index.js +297 -0
- package/dist/core/shutdownUtils.d.ts +2 -0
- package/dist/core/shutdownUtils.js +42 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +100 -9
- package/dist/kafka/index.d.ts +14 -0
- package/dist/kafka/index.js +158 -0
- package/global.d.ts +1 -0
- package/jest.config.json +5 -0
- package/package.json +50 -23
- package/specmatic.jar +0 -0
- package/src/app.d.ts +1 -1
- package/src/bin/__tests__/command.line.ts +40 -0
- package/src/bin/command.line.ts +35 -0
- package/src/bin/index.ts +2 -2
- package/src/common/__tests__/logger.ts +85 -0
- package/src/common/logger.ts +49 -0
- package/src/common/runner.ts +44 -0
- package/src/config.ts +2 -3
- package/src/core/__tests__/end.points.api.ts +103 -0
- package/src/core/__tests__/print.jar.version.ts +28 -0
- package/src/core/__tests__/set.expectation.ts +54 -0
- package/src/core/__tests__/set.test.results.ts +62 -0
- package/src/core/__tests__/stub.ts +136 -0
- package/src/core/__tests__/test.ts +176 -0
- package/src/core/index.ts +261 -0
- package/src/core/shutdownUtils.ts +21 -0
- package/src/downloadSpecmaticJar.js +30 -0
- package/src/index.ts +19 -2
- package/src/kafka/index.ts +140 -0
- package/test-resources/sample-junit-result-corrupt.xml +175 -0
- package/test-resources/sample-junit-result-generative.xml +389 -0
- package/test-resources/sample-junit-result-multiple.xml +304 -0
- package/test-resources/sample-junit-result-no-testname.xml +179 -0
- package/test-resources/sample-junit-result-single.xml +92 -0
- package/test-resources/sample-junit-result-skipped.xml +198 -0
- package/tsconfig.json +106 -20
- package/.github/workflows/npm-publish.yml +0 -25
- package/.vscode/settings.json +0 -7
- package/dist/bin/core.js +0 -30
- package/dist/lib/index.js +0 -107
- package/src/bin/__tests__/core.ts +0 -13
- package/src/bin/core.ts +0 -22
- package/src/lib/__tests__/index.ts +0 -122
- package/src/lib/index.ts +0 -84
- /package/{mockStub.json → test-resources/sample-mock-stub.json} +0 -0
- /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
|
|
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
|
|
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
|
|
93
|
+
return _core.test;
|
|
22
94
|
}
|
|
23
95
|
});
|
|
24
|
-
Object.defineProperty(exports, "
|
|
96
|
+
Object.defineProperty(exports, "testWithApiCoverage", {
|
|
25
97
|
enumerable: true,
|
|
26
98
|
get: function get() {
|
|
27
|
-
return
|
|
99
|
+
return _core.testWithApiCoverage;
|
|
28
100
|
}
|
|
29
101
|
});
|
|
30
|
-
Object.defineProperty(exports, "
|
|
102
|
+
Object.defineProperty(exports, "verifyKafkaMock", {
|
|
31
103
|
enumerable: true,
|
|
32
104
|
get: function get() {
|
|
33
|
-
return
|
|
105
|
+
return _kafka.verifyKafkaStub;
|
|
34
106
|
}
|
|
35
107
|
});
|
|
36
|
-
|
|
37
|
-
|
|
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';
|
package/jest.config.json
ADDED
package/package.json
CHANGED
|
@@ -1,24 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specmatic",
|
|
3
|
-
"version": "1.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
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"build
|
|
10
|
-
"build
|
|
11
|
-
"build
|
|
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
|
-
|
|
43
|
+
"specmatic": "dist/bin/index.js"
|
|
44
|
+
},
|
|
45
|
+
"specmatic": {
|
|
46
|
+
"logLevel": "debug"
|
|
32
47
|
},
|
|
33
48
|
"dependencies": {
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
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
|
-
"@
|
|
47
|
-
"
|
|
48
|
-
"
|
|
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