specmatic 1.0.0 → 1.2.1

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/.babelrc CHANGED
@@ -1,13 +1,9 @@
1
1
  {
2
- "presets": [
3
- "@babel/typescript",
4
- [
5
- "@babel/preset-env",
6
- {
7
- "targets": {
8
- "esmodules": true
9
- }
10
- }
11
- ],
12
- ]
13
- }
2
+ "presets": [
3
+ "@babel/preset-env",
4
+ "@babel/preset-typescript"
5
+ ],
6
+ "plugins": [
7
+ "@babel/plugin-proposal-class-properties"
8
+ ]
9
+ }
@@ -0,0 +1,18 @@
1
+ # To get started with Dependabot version updates, you'll need to specify which
2
+ # package ecosystems to update and where the package manifests are located.
3
+ # Please see the documentation for all configuration options:
4
+ # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5
+
6
+ version: 2
7
+ updates:
8
+ # Maintain dependencies for Gradle
9
+ - package-ecosystem: "npm"
10
+ directory: "/"
11
+ schedule:
12
+ interval: "daily"
13
+
14
+ # Maintain dependencies for GitHub Actions
15
+ - package-ecosystem: "github-actions"
16
+ directory: "/"
17
+ schedule:
18
+ interval: "daily"
@@ -0,0 +1,22 @@
1
+ name: publish
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ publish:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ - uses: actions/setup-node@v3
13
+ with:
14
+ node-version: 14
15
+ - run: npm install
16
+ - run: npm run build
17
+ - uses: reedyuk/npm-version@1.2.2
18
+ with:
19
+ version: ${{ github.event.release.tag_name }}
20
+ - uses: JS-DevTools/npm-publish@v2
21
+ with:
22
+ token: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,21 @@
1
+ name: test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+
8
+ jobs:
9
+ test:
10
+ strategy:
11
+ matrix:
12
+ node-version: [16.x, 18.x, 20.x]
13
+ os: [ubuntu-latest, windows-latest, macos-latest]
14
+ runs-on: ${{ matrix.os }}
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: actions/setup-node@v3
18
+ with:
19
+ node-version: ${{ matrix.node-version }}
20
+ - run: npm install
21
+ - run: npm test
package/CONTRIBUTING.MD CHANGED
@@ -1,6 +1,8 @@
1
1
  # Contributing
2
2
 
3
- Thanks for being willing to contribute!
3
+ Thanks for your willingness to contribute!
4
+
5
+ Please check [open issues](https://github.com/znsio/specmatic-node/issues?q=is%3Aopen+is%3Aissue). Please respond to questions/bug reports/feature requests!
4
6
 
5
7
  ## Project setup
6
8
 
@@ -29,53 +31,27 @@ Please make sure to run the tests before you commit your changes by using the co
29
31
 
30
32
  `npm test`
31
33
 
32
- Build the dist files using
34
+ Build the dist files locally once to make sure build works
33
35
 
34
36
  `npm run build`
35
37
 
36
-
37
- ### Update Typings
38
-
39
- If your PR introduced some changes in the API, you are more than welcome to
40
- modify the Typescript type definition to reflect those changes. Just modify the
41
- `/types/index.d.ts` file accordingly. If you have never seen Typescript
42
- definitions before, you can read more about it in its
43
- [documentation pages](https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html).
44
- Though this library itself is not written in Typescript we use
45
- [dtslint](https://github.com/microsoft/dtslint) to lint our typings.
46
-
38
+ Finally commit
47
39
 
48
40
  ## Publishing a new version to npm
49
41
 
50
42
  ### Prerequisites
51
- * Access to push to master.
52
- * Node version > 14 is needed.
53
-
54
- ### Step 1: Make the changes
55
- If there is a new version available in [specmatic downloads](https://specmatic.in/download/), download it in the project root, replacing the older version. Commit the new version.
56
-
57
- ### Step 2: Update node module's version
58
- `npm version` displays the existing version of the npm module.
59
-
60
- Use the suitable command to auto increment the npm version:
61
-
62
- `npm version major`
63
-
64
- `npm version minor`
65
-
66
- `npm version patch`
67
-
68
- OR
69
-
70
- Update the version to a specific semver by using command `npm version x.y.z`
71
-
72
- ### Step 3: Publish to npm
73
- If the version updated in step 2 is different from the one available in npm global repository, push to remote master on github will automatically build, run the tests and publish the new version to npm. You can check the status of the publish in [github actions](https://github.com/znsio/specmatic-node/actions). Though, it might take some time to reflect in the [specmatic npm page](https://www.npmjs.com/package/specmatic) because of the npm caching.
74
-
43
+ * Push access to master branch
44
+ * Node version 14 or higher
75
45
 
76
- ## Help needed
46
+ ### Step 1: Updating specmatic jar version
47
+ If the specmatic jar version is to be updated, modify the __specmaticVersion__ property in __package.json__ accordingly and check it in.
77
48
 
78
- Please checkout the [the open issues][issues]
49
+ ### Step 2: Make a release via github releases
50
+ * Goto [github releases](https://github.com/znsio/specmatic-node/releases) and draft a new release
51
+ * Click `choose a tag` and enter the required version. If the tag exists then you might be releasing a wrong version. Reverify the tag and version number. Ideally the tag should not exist as this is a new version and thus you should be presented with option to `+ Create new tag: <version> on publish` option. Click it.
52
+ * Give a release title of format `v<version>`.
53
+ * Describe the changes in this release briefly
54
+ * You can either save this draft and come back later to publish it or publish it now.
55
+ * On publish, a github action is triggered that updates the release on npm repository.
79
56
 
80
- Also, please watch the repo and respond to questions/bug reports/feature
81
- requests! Thanks!
57
+ You can check the publish status in [github actions](https://github.com/znsio/specmatic-node/actions). Though, it might take some time to reflect in the [specmatic npm page](https://www.npmjs.com/package/specmatic) because of the npm caching.
package/README.md CHANGED
@@ -1,11 +1,36 @@
1
1
  # Specmatic Framework Node Module
2
2
 
3
- This node module is a thin wrapper over the [standalone executable jar](https://specmatic.in/getting_started.html#setup). All core capabilities are in the main [Specmatic project](https://github.com/znsio/specmatic). The purpose of this wrapper module is to act as a convenience to help with below aspects.
4
- * Easy installation and upgrade of the jar file in node projects through npm
5
- * JS helper library which provides to do various setup steps like start, stop the specmatic stub server, installing specs etc. These helpers methods can be used inside a setup file inside a javascript project programmatically instead of using cli scripts.
3
+ ![tests](https://github.com/znsio/specmatic-node/actions/workflows/test.yml/badge.svg)
4
+ [![publish](https://github.com/znsio/specmatic-node/actions/workflows/publish.yml/badge.svg)](https://www.npmjs.com/package/specmatic)
5
+ [![release](https://img.shields.io/npm/v/specmatic)](https://github.com/znsio/specmatic-node/releases/latest)
6
+
7
+ This node module is a thin wrapper over the [specmatic executable jar](https://specmatic.in/getting_started.html#setup). All core capabilities are in the main [Specmatic project](https://github.com/znsio/specmatic). The purpose of this wrapper module is to act as a helper with below aspects.
8
+
9
+ - Easy installation and upgrade of the jar file in node projects through npm
10
+ - Global install using npm and easy run specmatic jar executable without having to download the jar file and having to run `java -jar`
11
+ - Programmatic access to some of the specmatic options as api like start / stop the stub server, setting expecations, running tests. These helpers methods can be used in a javascript project programmatically instead of using cli scripts.
12
+
13
+ ## Table Of Contents
14
+ - [Quick Start](#quick-start)
15
+ - [Contract as Stub / Smart Mock (For API clients / consumers)](#contract-as-stub--smart-mock-for-api-clients--consumers)
16
+ - [Contract as Test (For API Providers / Service)](#contract-as-test-for-api-providers--service)
17
+ - [Sample Repo](#sample-repo)
18
+ - [Programmatic Access](#programmatic-access)
19
+ - [Core APIs](#core-apis)
20
+ - [Kafka APIs](#kafka-apis)
21
+ - [IDE Support](#ide-support)
22
+ - [Jest Framework](#jest-framework)
23
+ - [Logging](#logging)
24
+ - [Known Issues](#known-issues)
25
+ - [1. Node 17/18 - Connection Refused error when connecting to stub](#1-node-1718---connection-refused-error-when-connecting-to-stub)
26
+ - [2. Error "ReferenceError: setImmediate is not defined"](#2-error-referenceerror-setimmediate-is-not-defined)
27
+ - [3. Specmatic stub is not terminated after test execution](#3-specmatic-stub-is-not-terminated-after-test-execution)
28
+ - [4. Test results don't show up in IDE](#4-test-results-dont-show-up-in-ide)
29
+ - [Contribution](#contribution)
6
30
 
7
31
  ## Quick Start
8
- `npm install specmatic` will install the specmatic locally to the node project.
32
+
33
+ `npm install specmatic` will install the specmatic locally to the node project.
9
34
 
10
35
  Sample npm scripts to run specmatic, (Check [Documentation](https://specmatic.in/documentation.html) for more information on cli commands and arguments.)
11
36
 
@@ -17,35 +42,140 @@ In stub mode, Specmatic emulates the Provider / API / Service based on the API S
17
42
 
18
43
  Tests for Free – Specmatic parses your API Specification files and based on this generates requests which are fired at your application. It then verifies if your application’s response is as per your API Specification. All this with a “No Code” approach.. [Learn More](https://specmatic.in/#contract-as-test)
19
44
 
20
- ## API
45
+ ## Sample Repo
21
46
 
22
- Check [Documentation](https://specmatic.in/documentation.html) for more information on cli commands and arguments.
47
+ https://github.com/znsio/specmatic-order-bff-nodejs
23
48
 
24
49
  ## Programmatic Access
25
50
 
26
51
  Specmatic JS library exposes some of the commands as methods that can be run programmatically from any javascript testing framework, during setup or test phases.
27
52
 
28
- ```
29
- import {
30
- startStub,
31
- stopStub,
32
- test,
33
- setExpecations,
34
- printJarVersion
53
+ ```javascript
54
+ import {
55
+ startHttpStub,
56
+ setHttpStubExpectations,
57
+ stopHttpStub,
58
+ test,
59
+ showTestResults,
60
+ printJarVersion,
61
+ startKafkaMock,
62
+ setKafkaMockExpecations,
63
+ stopKafkaMock,
64
+ verifyKafkaMock
35
65
  } from 'specmatic';
36
66
  ```
67
+ ### Core APIs
68
+
69
+ `startHttpStub(host?: string, port?: number, args?: (string | number)[]): Promise<Stub>` <br />
70
+ Start the stub server. Argument `args` values are passed directly to specmatic jar executable.<br />
71
+ *Note: This replaces `startStub` method which is deprecated*
37
72
 
38
- `startStub(host?: string, port?: string, stubDir?: string) : Promise<ChildProcess>` <br />
39
- method to start the stub server.
73
+ `setHttpStubExpectations(stubPath: string, stubServerBaseUrl?: string): Promise<boolean>` <br />
74
+ Set stub expectiona. Stub should be running before invoking this method.<br />
75
+ *Note: This replaces `setExpectations` method which is deprecated*
40
76
 
41
- `stopStub(process: ChildProcess)` <br />
42
- method to stop the stub server.
77
+ `stopHttpStub(stub: Stub)` <br />
78
+ Stop the stub server<br />
79
+ *Note: This replaces `stopStub` method which is deprecated*
43
80
 
44
- `test(specs?: string, host?: string, port?: string): Promise<boolean>` <br />
45
- method to run tests.
81
+ `test(host?: string, port?: string, contractPath?: string, args?: (string | number)[]): Promise<{ [k: string]: number } | undefined>` <br />
82
+ Run tests. Argument `args` values are passed directly to specmatic jar executable.
46
83
 
47
- `setExpectations(stubPath: string, stubServerBaseUrl?: string)` <br />
48
- method to dynamically set stub expectiona. Stub should be running before invoking this method.
84
+ `showTestResults(testFn: (name: string, cb: () => void) => void)` <br />
85
+ View test results in any framework so that it shows up in IDE specific test results interface. Refer [IDE Support](#ide-support) below for details on how to use this feature.
49
86
 
50
- `printSpecmaticJarVersion()` <br />
87
+ `printJarVersion()` <br />
51
88
  method to print the version of specmatic.jar
89
+
90
+ `enableApiCoverage(expressAppRef) ` <br />
91
+ enable api coverage for express apps to know which apis and http verbs are covered in contract tests and which not
92
+
93
+ ### Kafka APIs
94
+
95
+ `startKafkaMock(port?: number, args?: (string | number)[]): Promise<KafkaStub>` <br />
96
+ Start kafka stub. Requires an OpenAPI kafka spec in specmatic.json.<br />
97
+ *Note: This replaces `startKafkaStub` method which is deprecated*
98
+
99
+ `setKafkaMockExpectations(stub: KafkaStub, expecations: any): Promise<void>` <br />
100
+ Set expected message count on Kafka for each topic. Expecations are of the format
101
+ ```
102
+ [
103
+ {
104
+ "topic": "product-queries",
105
+ "count": 2
106
+ },
107
+ {
108
+ "topic": "test-topic",
109
+ "count": 2
110
+ }
111
+ ]
112
+ ```
113
+ *Note: This replaces `setKafkaStubExpectations` method which is deprecated*<br />
114
+
115
+ `stopKafkaMock(stub: KafkaStub)` <br />
116
+ Stop a running kafka stub.<br />
117
+ *Note: This replaces `stopKafkaStub` method which is deprecated*
118
+
119
+ `verifyKafkaMock(stub: KafkaStub): Promise<Boolean>` <br />
120
+ Verify all expecations set on Kafka.<br />
121
+ *Note: This replaces `verifyKafkaStub` method which is deprecated*
122
+
123
+ `verifyKafkaMockMessage(stub: KafkaStub, topic: string, value: string): Promise<Boolean>` <br />
124
+ Verify kafka message. This is invoked in tests to check on kafka side if a message expected to by pushed by a BFF api is recieved by Kafka. The Kafka stub starts a verification end point for this purpose which is invoked internally by this api..<br />
125
+ *Note: This replaces `verifyKafkaStubMessage` method which is deprecated*
126
+
127
+ ## IDE Support
128
+
129
+ Specmatic tests can be displayed in IDE specific test result view by using `showTestResults` method coupled with `test` method. Test framework specific steps are below.
130
+
131
+ ### Jest Framework
132
+ Example: https://github.com/znsio/specmatic-order-bff-nodejs/blob/main/test/contract
133
+
134
+ 1. Call `test` method in a [`globalSetup`](https://jestjs.io/docs/configuration#globalsetup-string) script. `globalSetup` script path can be set either in the jest command line argument or in jest configuration file.
135
+ 2. Call `showTestResults` in the root of your test file anywhere. You can pass `test` method of Jest as its argument and it works out of the box.
136
+
137
+ *Note 1:* Since you are running test method in a `globalSetup` script, any pre-test setup like starting a stub server, app server and any dependent processes like redis server has to be done in the globalSetup script in required sequence before `test` method is called.
138
+
139
+ *Note 2:* If your project already has a jest globalSetup and or globalTeardown scripts then reuse them but include the necessary code to make IDE integration work.
140
+
141
+ *Note 3:* If your project uses jest projects support ([`--projects`](https://jestjs.io/docs/configuration#projects-arraystring--projectconfig)), then configure `globalSetup/globalTeardown` in the project specific jest config file
142
+
143
+ ## Logging
144
+
145
+ By default only warning and error messages are displayed. You can configure the loglevel in package.json as
146
+
147
+ ```json
148
+ "specmatic": {
149
+ "logLevel": "debug"
150
+ },
151
+ ```
152
+
153
+ logLevel accepts all values supported by [winston logger](https://github.com/winstonjs/winston#logging-levels)
154
+
155
+ ## Known Issues
156
+
157
+ ### 1. Node 17/18 - Connection Refused error when connecting to stub
158
+
159
+ Node 18 apparently shifted to IPv6 as first choice for resolving hostname when both IPv4 and IPv6 addresses are available. This means `localhost` most likely resolves to `::1` rather than `127.0.0.1` or `0.0.0.0`. Now specmatic node wrapper does not start the stub server but the java program under the hood does it and java still resolves to IPv4 address by default. Thus localhost on node v18 and java might resolve to a different address and any connection from node to the running stub will fail. To resolve this, until we have a permanent solution, we request to disable any IPv6 address mapping to a named host in your DNS resolver or `/etc/hosts`.
160
+
161
+ ### 2. Error "ReferenceError: setImmediate is not defined"
162
+
163
+ This happens due to an issue in Jest framework. The easiest solution is to import `core-js` in the affected test file.
164
+
165
+ ### 3. Specmatic stub is not terminated after test execution
166
+
167
+ This happens if stub is not stopped in the same way it is started. There can be two possibilities in case of *Jest* framework
168
+ 1. If started from `before*` methods in a test suite, then it should be stopped using `stopStub` method in corresponding `after*` method
169
+ 2. If started using `globalSetup` script, then it should be stopped in a `globalTeardown` script
170
+
171
+ *Note*: If `bail` is set to true in jest config, then any test failure will abort further execution of tests including `after*` methods and `globalTeardown` script. This will prevent stopping your stubs and other processes leaving them hanging and causing port conflicts when tests are run again next.
172
+
173
+ ### 4. Test results don't show up in IDE
174
+
175
+ We have tested IDE integration with webstorm and jest framework combination. Visual Studio Code seems to work on and off with Jest. Please follow the instructions mentioned in [IDE Support](#ide-support) to set this up.
176
+
177
+ Any other test framework can easily be also configured to display test results in IDE test results view by passing a convertor function to the `showTestResults` api.
178
+
179
+ ## Contribution
180
+
181
+ Please refer to this [link](CONTRIBUTING.MD)
package/dist/app.d.js CHANGED
@@ -1 +1,2 @@
1
- "use strict";
1
+ "use strict";
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2FwcC5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImRlY2xhcmUgbW9kdWxlICdleGVjLXNoJztcbiJdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,2 @@
1
+ declare const callSpecmaticCli: (args?: string[]) => void;
2
+ export default callSpecmaticCli;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ var _logger = _interopRequireDefault(require("../common/logger"));
8
+ var _runner = require("../common/runner");
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
+ var callSpecmaticCli = function callSpecmaticCli(args) {
11
+ args = args || process.argv;
12
+ var cliArgs = extractArgsForJar(args);
13
+ var fn = getJarFunction(args);
14
+ _logger["default"].info("CLI: Running with args \"".concat(cliArgs, "\""));
15
+ fn(cliArgs, function (err) {
16
+ if (err) {
17
+ _logger["default"].info('CLI: Finished with non zero exit code: ', err.code);
18
+ process.exitCode = err.code;
19
+ } else {
20
+ _logger["default"].info('CLI: Finished');
21
+ process.exitCode = 0;
22
+ }
23
+ }, function (message) {
24
+ console.log("".concat(message));
25
+ });
26
+ };
27
+ function getJarFunction(args) {
28
+ return args.length >= 3 && args[2] == 'kafka' ? _runner.callKafka : _runner.callCore;
29
+ }
30
+ function extractArgsForJar(args) {
31
+ var argsToRemove = args.length >= 3 && args[2] == 'kafka' ? 3 : 2;
32
+ return args.slice(argsToRemove).join(' ');
33
+ }
34
+ var _default = callSpecmaticCli;
35
+ exports["default"] = _default;
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcnVubmVyIiwib2JqIiwiX19lc01vZHVsZSIsImNhbGxTcGVjbWF0aWNDbGkiLCJhcmdzIiwicHJvY2VzcyIsImFyZ3YiLCJjbGlBcmdzIiwiZXh0cmFjdEFyZ3NGb3JKYXIiLCJmbiIsImdldEphckZ1bmN0aW9uIiwibG9nZ2VyIiwiaW5mbyIsImNvbmNhdCIsImVyciIsImNvZGUiLCJleGl0Q29kZSIsIm1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwibGVuZ3RoIiwiY2FsbEthZmthIiwiY2FsbENvcmUiLCJhcmdzVG9SZW1vdmUiLCJzbGljZSIsImpvaW4iLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2NvbW1hbmQubGluZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2NvbW1vbi9sb2dnZXInXG5pbXBvcnQgeyBjYWxsS2Fma2EsIGNhbGxDb3JlIH0gZnJvbSAnLi4vY29tbW9uL3J1bm5lcidcblxuY29uc3QgY2FsbFNwZWNtYXRpY0NsaSA9IChhcmdzPzogc3RyaW5nW10pID0+IHtcbiAgICBhcmdzID0gYXJncyB8fCBwcm9jZXNzLmFyZ3ZcbiAgICBsZXQgY2xpQXJncyA9IGV4dHJhY3RBcmdzRm9ySmFyKGFyZ3MpXG4gICAgbGV0IGZuID0gZ2V0SmFyRnVuY3Rpb24oYXJncylcbiAgICBsb2dnZXIuaW5mbyhgQ0xJOiBSdW5uaW5nIHdpdGggYXJncyBcIiR7Y2xpQXJnc31cImApXG4gICAgZm4oXG4gICAgICAgIGNsaUFyZ3MsXG4gICAgICAgIChlcnI/OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnQ0xJOiBGaW5pc2hlZCB3aXRoIG5vbiB6ZXJvIGV4aXQgY29kZTogJywgZXJyLmNvZGUpXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGVyci5jb2RlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDTEk6IEZpbmlzaGVkJylcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXNzYWdlID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke21lc3NhZ2V9YClcbiAgICAgICAgfVxuICAgIClcbn1cblxuZnVuY3Rpb24gZ2V0SmFyRnVuY3Rpb24oYXJnczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gYXJncy5sZW5ndGggPj0gMyAmJiBhcmdzWzJdID09ICdrYWZrYScgPyBjYWxsS2Fma2EgOiBjYWxsQ29yZVxufVxuXG5mdW5jdGlvbiBleHRyYWN0QXJnc0ZvckphcihhcmdzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGFyZ3NUb1JlbW92ZSA9IGFyZ3MubGVuZ3RoID49IDMgJiYgYXJnc1syXSA9PSAna2Fma2EnID8gMyA6IDJcbiAgICByZXR1cm4gYXJncy5zbGljZShhcmdzVG9SZW1vdmUpLmpvaW4oJyAnKVxufVxuXG5leHBvcnQgZGVmYXVsdCBjYWxsU3BlY21hdGljQ2xpXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUFzRCxTQUFBRCx1QkFBQUcsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLGdCQUFBQSxHQUFBO0FBRXRELElBQU1FLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBZ0JBLENBQUlDLElBQWUsRUFBSztFQUMxQ0EsSUFBSSxHQUFHQSxJQUFJLElBQUlDLE9BQU8sQ0FBQ0MsSUFBSTtFQUMzQixJQUFJQyxPQUFPLEdBQUdDLGlCQUFpQixDQUFDSixJQUFJLENBQUM7RUFDckMsSUFBSUssRUFBRSxHQUFHQyxjQUFjLENBQUNOLElBQUksQ0FBQztFQUM3Qk8sa0JBQU0sQ0FBQ0MsSUFBSSw2QkFBQUMsTUFBQSxDQUE0Qk4sT0FBTyxPQUFHLENBQUM7RUFDbERFLEVBQUUsQ0FDRUYsT0FBTyxFQUNQLFVBQUNPLEdBQVMsRUFBSztJQUNYLElBQUlBLEdBQUcsRUFBRTtNQUNMSCxrQkFBTSxDQUFDQyxJQUFJLENBQUMseUNBQXlDLEVBQUVFLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDO01BQ2hFVixPQUFPLENBQUNXLFFBQVEsR0FBR0YsR0FBRyxDQUFDQyxJQUFJO0lBQy9CLENBQUMsTUFBTTtNQUNISixrQkFBTSxDQUFDQyxJQUFJLENBQUMsZUFBZSxDQUFDO01BQzVCUCxPQUFPLENBQUNXLFFBQVEsR0FBRyxDQUFDO0lBQ3hCO0VBQ0osQ0FBQyxFQUNELFVBQUFDLE9BQU8sRUFBSTtJQUNQQyxPQUFPLENBQUNDLEdBQUcsSUFBQU4sTUFBQSxDQUFJSSxPQUFPLENBQUUsQ0FBQztFQUM3QixDQUNKLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBU1AsY0FBY0EsQ0FBQ04sSUFBYyxFQUFFO0VBQ3BDLE9BQU9BLElBQUksQ0FBQ2dCLE1BQU0sSUFBSSxDQUFDLElBQUloQixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxHQUFHaUIsaUJBQVMsR0FBR0MsZ0JBQVE7QUFDeEU7QUFFQSxTQUFTZCxpQkFBaUJBLENBQUNKLElBQWMsRUFBRTtFQUN2QyxJQUFNbUIsWUFBWSxHQUFHbkIsSUFBSSxDQUFDZ0IsTUFBTSxJQUFJLENBQUMsSUFBSWhCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUM7RUFDbkUsT0FBT0EsSUFBSSxDQUFDb0IsS0FBSyxDQUFDRCxZQUFZLENBQUMsQ0FBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUM3QztBQUFDLElBQUFDLFFBQUEsR0FFY3ZCLGdCQUFnQjtBQUFBd0IsT0FBQSxjQUFBRCxRQUFBIn0=
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/bin/index.js CHANGED
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
 
4
- var _core = _interopRequireDefault(require("./core"));
5
-
6
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
7
-
8
- (0, _core.default)();
4
+ var _command = _interopRequireDefault(require("./command.line"));
5
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
6
+ (0, _command["default"])();
7
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tbWFuZCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwib2JqIiwiX19lc01vZHVsZSIsImNhbGxTcGVjbWF0aWNDbGkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCBjYWxsU3BlY21hdGljQ2xpIGZyb20gJy4vY29tbWFuZC5saW5lJztcblxuY2FsbFNwZWNtYXRpY0NsaSgpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFtQjs7QUFDbkIsSUFBQUEsUUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQThDLFNBQUFELHVCQUFBRSxHQUFBLFdBQUFBLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLEdBQUFELEdBQUEsZ0JBQUFBLEdBQUE7QUFFOUMsSUFBQUUsbUJBQWdCLEVBQUMsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ export declare function initLogger(): import("winston").Logger;
2
+ declare const _default: import("winston").Logger;
3
+ export default _default;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ exports.initLogger = initLogger;
8
+ var _winston = require("winston");
9
+ var _fs = _interopRequireDefault(require("fs"));
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
11
+ var logFormat = _winston.format.printf(function (_ref) {
12
+ var level = _ref.level,
13
+ message = _ref.message,
14
+ label = _ref.label,
15
+ timestamp = _ref.timestamp;
16
+ return "[".concat(label, "] ").concat(timestamp, " ").concat(level, ": ").concat(message);
17
+ });
18
+ function getSpecmaticConfig() {
19
+ var packageJsonPath = './package.json';
20
+ var specmaticConfig;
21
+ if (_fs["default"].existsSync(packageJsonPath)) {
22
+ var packageJsonContent;
23
+ try {
24
+ packageJsonContent = _fs["default"].readFileSync(packageJsonPath);
25
+ } catch (error) {
26
+ packageJsonContent = '{}';
27
+ }
28
+ var packageConfig = JSON.parse(packageJsonContent);
29
+ specmaticConfig = packageConfig.specmatic;
30
+ }
31
+ return specmaticConfig || {};
32
+ }
33
+ function getLogLevel() {
34
+ var logLevel;
35
+ if (process.env.SPECMATIC_LOG_LEVEL) {
36
+ logLevel = process.env.SPECMATIC_LOG_LEVEL;
37
+ }
38
+ if (!logLevel || !_winston.config.syslog.levels[logLevel]) {
39
+ var specmaticConfig = getSpecmaticConfig();
40
+ logLevel = specmaticConfig.logLevel;
41
+ }
42
+ if (!logLevel || !_winston.config.syslog.levels[logLevel]) {
43
+ logLevel = 'warn';
44
+ }
45
+ return logLevel;
46
+ }
47
+ function initLogger() {
48
+ var logLevel = getLogLevel();
49
+ var logger = (0, _winston.createLogger)({
50
+ level: logLevel,
51
+ format: _winston.format.combine(_winston.format.label({
52
+ label: 'specmatic'
53
+ }), _winston.format.timestamp({
54
+ format: 'DD-MM-YYYY HH:mm:ss'
55
+ }), logFormat),
56
+ transports: [new _winston.transports.Console()]
57
+ });
58
+ return logger;
59
+ }
60
+ var _default = initLogger();
61
+ exports["default"] = _default;
62
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luc3RvbiIsInJlcXVpcmUiLCJfZnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Iiwib2JqIiwiX19lc01vZHVsZSIsImxvZ0Zvcm1hdCIsImZvcm1hdCIsInByaW50ZiIsIl9yZWYiLCJsZXZlbCIsIm1lc3NhZ2UiLCJsYWJlbCIsInRpbWVzdGFtcCIsImNvbmNhdCIsImdldFNwZWNtYXRpY0NvbmZpZyIsInBhY2thZ2VKc29uUGF0aCIsInNwZWNtYXRpY0NvbmZpZyIsImZzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VKc29uQ29udGVudCIsInJlYWRGaWxlU3luYyIsImVycm9yIiwicGFja2FnZUNvbmZpZyIsIkpTT04iLCJwYXJzZSIsInNwZWNtYXRpYyIsImdldExvZ0xldmVsIiwibG9nTGV2ZWwiLCJwcm9jZXNzIiwiZW52IiwiU1BFQ01BVElDX0xPR19MRVZFTCIsImNvbmZpZyIsInN5c2xvZyIsImxldmVscyIsImluaXRMb2dnZXIiLCJsb2dnZXIiLCJjcmVhdGVMb2dnZXIiLCJjb21iaW5lIiwidHJhbnNwb3J0cyIsIkNvbnNvbGUiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbW9uL2xvZ2dlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25maWcsIGNyZWF0ZUxvZ2dlciwgZm9ybWF0LCB0cmFuc3BvcnRzIH0gZnJvbSAnd2luc3RvbidcbmltcG9ydCBmcyBmcm9tICdmcydcblxuY29uc3QgbG9nRm9ybWF0ID0gZm9ybWF0LnByaW50ZigoeyBsZXZlbCwgbWVzc2FnZSwgbGFiZWwsIHRpbWVzdGFtcCB9KSA9PiB7XG4gICAgcmV0dXJuIGBbJHtsYWJlbH1dICR7dGltZXN0YW1wfSAke2xldmVsfTogJHttZXNzYWdlfWBcbn0pXG5cbmZ1bmN0aW9uIGdldFNwZWNtYXRpY0NvbmZpZygpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSAnLi9wYWNrYWdlLmpzb24nXG4gICAgdmFyIHNwZWNtYXRpY0NvbmZpZ1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICAgICAgbGV0IHBhY2thZ2VKc29uQ29udGVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFja2FnZUpzb25Db250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHBhY2thZ2VKc29uQ29udGVudCA9ICd7fSdcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrYWdlQ29uZmlnID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQgYXMgdW5rbm93biBhcyBzdHJpbmcpXG4gICAgICAgIHNwZWNtYXRpY0NvbmZpZyA9IHBhY2thZ2VDb25maWcuc3BlY21hdGljXG4gICAgfVxuICAgIHJldHVybiBzcGVjbWF0aWNDb25maWcgfHwge31cbn1cblxuZnVuY3Rpb24gZ2V0TG9nTGV2ZWwoKSB7XG4gICAgbGV0IGxvZ0xldmVsXG4gICAgaWYgKHByb2Nlc3MuZW52LlNQRUNNQVRJQ19MT0dfTEVWRUwpIHtcbiAgICAgICAgbG9nTGV2ZWwgPSBwcm9jZXNzLmVudi5TUEVDTUFUSUNfTE9HX0xFVkVMXG4gICAgfVxuICAgIGlmICghbG9nTGV2ZWwgfHwgIWNvbmZpZy5zeXNsb2cubGV2ZWxzW2xvZ0xldmVsXSkge1xuICAgICAgICBjb25zdCBzcGVjbWF0aWNDb25maWcgPSBnZXRTcGVjbWF0aWNDb25maWcoKVxuICAgICAgICBsb2dMZXZlbCA9IHNwZWNtYXRpY0NvbmZpZy5sb2dMZXZlbFxuICAgIH1cbiAgICBpZiAoIWxvZ0xldmVsIHx8ICFjb25maWcuc3lzbG9nLmxldmVsc1tsb2dMZXZlbF0pIHtcbiAgICAgICAgbG9nTGV2ZWwgPSAnd2FybidcbiAgICB9XG4gICAgcmV0dXJuIGxvZ0xldmVsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0TG9nZ2VyKCkge1xuICAgIGxldCBsb2dMZXZlbCA9IGdldExvZ0xldmVsKClcbiAgICBjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoe1xuICAgICAgICBsZXZlbDogbG9nTGV2ZWwsXG4gICAgICAgIGZvcm1hdDogZm9ybWF0LmNvbWJpbmUoZm9ybWF0LmxhYmVsKHsgbGFiZWw6ICdzcGVjbWF0aWMnIH0pLCBmb3JtYXQudGltZXN0YW1wKHsgZm9ybWF0OiAnREQtTU0tWVlZWSBISDptbTpzcycgfSksIGxvZ0Zvcm1hdCksXG4gICAgICAgIHRyYW5zcG9ydHM6IFtuZXcgdHJhbnNwb3J0cy5Db25zb2xlKCldLFxuICAgIH0pXG4gICAgcmV0dXJuIGxvZ2dlclxufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0TG9nZ2VyKClcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLFFBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLEdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUFtQixTQUFBRSx1QkFBQUMsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLGdCQUFBQSxHQUFBO0FBRW5CLElBQU1FLFNBQVMsR0FBR0MsZUFBTSxDQUFDQyxNQUFNLENBQUMsVUFBQUMsSUFBQSxFQUEwQztFQUFBLElBQXZDQyxLQUFLLEdBQUFELElBQUEsQ0FBTEMsS0FBSztJQUFFQyxPQUFPLEdBQUFGLElBQUEsQ0FBUEUsT0FBTztJQUFFQyxLQUFLLEdBQUFILElBQUEsQ0FBTEcsS0FBSztJQUFFQyxTQUFTLEdBQUFKLElBQUEsQ0FBVEksU0FBUztFQUMvRCxXQUFBQyxNQUFBLENBQVdGLEtBQUssUUFBQUUsTUFBQSxDQUFLRCxTQUFTLE9BQUFDLE1BQUEsQ0FBSUosS0FBSyxRQUFBSSxNQUFBLENBQUtILE9BQU87QUFDdkQsQ0FBQyxDQUFDO0FBRUYsU0FBU0ksa0JBQWtCQSxDQUFBLEVBQUc7RUFDMUIsSUFBTUMsZUFBZSxHQUFHLGdCQUFnQjtFQUN4QyxJQUFJQyxlQUFlO0VBQ25CLElBQUlDLGNBQUUsQ0FBQ0MsVUFBVSxDQUFDSCxlQUFlLENBQUMsRUFBRTtJQUNoQyxJQUFJSSxrQkFBa0I7SUFDdEIsSUFBSTtNQUNBQSxrQkFBa0IsR0FBR0YsY0FBRSxDQUFDRyxZQUFZLENBQUNMLGVBQWUsQ0FBQztJQUN6RCxDQUFDLENBQUMsT0FBT00sS0FBSyxFQUFFO01BQ1pGLGtCQUFrQixHQUFHLElBQUk7SUFDN0I7SUFDQSxJQUFNRyxhQUFhLEdBQUdDLElBQUksQ0FBQ0MsS0FBSyxDQUFDTCxrQkFBdUMsQ0FBQztJQUN6RUgsZUFBZSxHQUFHTSxhQUFhLENBQUNHLFNBQVM7RUFDN0M7RUFDQSxPQUFPVCxlQUFlLElBQUksQ0FBQyxDQUFDO0FBQ2hDO0FBRUEsU0FBU1UsV0FBV0EsQ0FBQSxFQUFHO0VBQ25CLElBQUlDLFFBQVE7RUFDWixJQUFJQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsbUJBQW1CLEVBQUU7SUFDakNILFFBQVEsR0FBR0MsT0FBTyxDQUFDQyxHQUFHLENBQUNDLG1CQUFtQjtFQUM5QztFQUNBLElBQUksQ0FBQ0gsUUFBUSxJQUFJLENBQUNJLGVBQU0sQ0FBQ0MsTUFBTSxDQUFDQyxNQUFNLENBQUNOLFFBQVEsQ0FBQyxFQUFFO0lBQzlDLElBQU1YLGVBQWUsR0FBR0Ysa0JBQWtCLENBQUMsQ0FBQztJQUM1Q2EsUUFBUSxHQUFHWCxlQUFlLENBQUNXLFFBQVE7RUFDdkM7RUFDQSxJQUFJLENBQUNBLFFBQVEsSUFBSSxDQUFDSSxlQUFNLENBQUNDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDTixRQUFRLENBQUMsRUFBRTtJQUM5Q0EsUUFBUSxHQUFHLE1BQU07RUFDckI7RUFDQSxPQUFPQSxRQUFRO0FBQ25CO0FBRU8sU0FBU08sVUFBVUEsQ0FBQSxFQUFHO0VBQ3pCLElBQUlQLFFBQVEsR0FBR0QsV0FBVyxDQUFDLENBQUM7RUFDNUIsSUFBTVMsTUFBTSxHQUFHLElBQUFDLHFCQUFZLEVBQUM7SUFDeEIzQixLQUFLLEVBQUVrQixRQUFRO0lBQ2ZyQixNQUFNLEVBQUVBLGVBQU0sQ0FBQytCLE9BQU8sQ0FBQy9CLGVBQU0sQ0FBQ0ssS0FBSyxDQUFDO01BQUVBLEtBQUssRUFBRTtJQUFZLENBQUMsQ0FBQyxFQUFFTCxlQUFNLENBQUNNLFNBQVMsQ0FBQztNQUFFTixNQUFNLEVBQUU7SUFBc0IsQ0FBQyxDQUFDLEVBQUVELFNBQVMsQ0FBQztJQUM1SGlDLFVBQVUsRUFBRSxDQUFDLElBQUlBLG1CQUFVLENBQUNDLE9BQU8sQ0FBQyxDQUFDO0VBQ3pDLENBQUMsQ0FBQztFQUNGLE9BQU9KLE1BQU07QUFDakI7QUFBQyxJQUFBSyxRQUFBLEdBRWNOLFVBQVUsQ0FBQyxDQUFDO0FBQUFPLE9BQUEsY0FBQUQsUUFBQSJ9
@@ -0,0 +1,4 @@
1
+ import { ChildProcess } from 'child_process';
2
+ declare const callCore: (args: string, done: (error: any) => void, onOutput: (message: string, error: boolean) => void) => ChildProcess;
3
+ declare const callKafka: (args: string, done: (error: any) => void, onOutput: (message: string, error: boolean) => void) => ChildProcess;
4
+ export { callCore, callKafka };
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.callKafka = exports.callCore = void 0;
7
+ var _path = _interopRequireDefault(require("path"));
8
+ var _config = require("../config");
9
+ var _logger = _interopRequireDefault(require("../common/logger"));
10
+ var _child_process = require("child_process");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
12
+ var callCore = function callCore(args, done, onOutput) {
13
+ var rootPath = _path["default"].resolve(__dirname, '..', '..');
14
+ var specmaticJarPath = _path["default"].resolve(rootPath, _config.specmaticCoreJarName);
15
+ _logger["default"].debug("CLI: Specmatic jar path: ".concat(specmaticJarPath));
16
+ return callJar(specmaticJarPath, args, done, onOutput);
17
+ };
18
+ exports.callCore = callCore;
19
+ var callKafka = function callKafka(args, done, onOutput) {
20
+ var rootPath = _path["default"].resolve(__dirname, '..', '..', '..', 'specmatic-beta', 'kafka');
21
+ var specmaticJarPath = _path["default"].resolve(rootPath, _config.specmaticKafkaJarName);
22
+ _logger["default"].debug("CLI: Specmatic jar path: ".concat(specmaticJarPath));
23
+ return callJar(specmaticJarPath, args, done, onOutput);
24
+ };
25
+ exports.callKafka = callKafka;
26
+ function callJar(jarPath, args, done, onOutput) {
27
+ var _javaProcess$stdout, _javaProcess$stderr;
28
+ var argsList = [];
29
+ if (process.env['endpointsAPI']) {
30
+ argsList.push("-DendpointsAPI=\"".concat(process.env['endpointsAPI'], "\""));
31
+ }
32
+ argsList = argsList.concat(['-jar', "\"".concat(jarPath, "\""), args]);
33
+ var javaProcess = (0, _child_process.spawn)('java', argsList, {
34
+ stdio: 'pipe',
35
+ stderr: 'pipe',
36
+ shell: true
37
+ });
38
+ (_javaProcess$stdout = javaProcess.stdout) === null || _javaProcess$stdout === void 0 || _javaProcess$stdout.on('data', function (data) {
39
+ onOutput("".concat(data), false);
40
+ });
41
+ (_javaProcess$stderr = javaProcess.stderr) === null || _javaProcess$stderr === void 0 || _javaProcess$stderr.on('data', function (data) {
42
+ onOutput("".concat(data), true);
43
+ });
44
+ javaProcess.on('close', function (code) {
45
+ if (code) {
46
+ done(new Error('Command exited with non zero code: ' + code));
47
+ } else {
48
+ done(null);
49
+ }
50
+ });
51
+ return javaProcess;
52
+ }
53
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGF0aCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvbmZpZyIsIl9sb2dnZXIiLCJfY2hpbGRfcHJvY2VzcyIsIm9iaiIsIl9fZXNNb2R1bGUiLCJjYWxsQ29yZSIsImFyZ3MiLCJkb25lIiwib25PdXRwdXQiLCJyb290UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwic3BlY21hdGljSmFyUGF0aCIsInNwZWNtYXRpY0NvcmVKYXJOYW1lIiwibG9nZ2VyIiwiZGVidWciLCJjb25jYXQiLCJjYWxsSmFyIiwiZXhwb3J0cyIsImNhbGxLYWZrYSIsInNwZWNtYXRpY0thZmthSmFyTmFtZSIsImphclBhdGgiLCJfamF2YVByb2Nlc3Mkc3Rkb3V0IiwiX2phdmFQcm9jZXNzJHN0ZGVyciIsImFyZ3NMaXN0IiwicHJvY2VzcyIsImVudiIsInB1c2giLCJqYXZhUHJvY2VzcyIsInNwYXduIiwic3RkaW8iLCJzdGRlcnIiLCJzaGVsbCIsInN0ZG91dCIsIm9uIiwiZGF0YSIsImNvZGUiLCJFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vcnVubmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBleGVjU2ggZnJvbSAnZXhlYy1zaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHNwZWNtYXRpY0NvcmVKYXJOYW1lLCBzcGVjbWF0aWNLYWZrYUphck5hbWUgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9jb21tb24vbG9nZ2VyJztcbmltcG9ydCB7IENoaWxkUHJvY2Vzcywgc3Bhd24sIFNwYXduT3B0aW9ucyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuXG5jb25zdCBjYWxsQ29yZSA9IChhcmdzOiBzdHJpbmcsIGRvbmU6IChlcnJvcjogYW55KSA9PiB2b2lkLCBvbk91dHB1dDogKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I6IGJvb2xlYW4pID0+IHZvaWQpOiBDaGlsZFByb2Nlc3MgPT4ge1xuICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJy4uJyk7XG4gICAgY29uc3Qgc3BlY21hdGljSmFyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290UGF0aCwgc3BlY21hdGljQ29yZUphck5hbWUpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ0xJOiBTcGVjbWF0aWMgamFyIHBhdGg6ICR7c3BlY21hdGljSmFyUGF0aH1gKTtcbiAgICByZXR1cm4gY2FsbEphcihzcGVjbWF0aWNKYXJQYXRoLCBhcmdzLCBkb25lLCBvbk91dHB1dCk7XG59O1xuXG5jb25zdCBjYWxsS2Fma2EgPSAoYXJnczogc3RyaW5nLCBkb25lOiAoZXJyb3I6IGFueSkgPT4gdm9pZCwgb25PdXRwdXQ6IChtZXNzYWdlOiBzdHJpbmcsIGVycm9yOiBib29sZWFuKSA9PiB2b2lkKTogQ2hpbGRQcm9jZXNzID0+IHtcbiAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdzcGVjbWF0aWMtYmV0YScsICdrYWZrYScpO1xuICAgIGNvbnN0IHNwZWNtYXRpY0phclBhdGggPSBwYXRoLnJlc29sdmUocm9vdFBhdGgsIHNwZWNtYXRpY0thZmthSmFyTmFtZSk7XG4gICAgbG9nZ2VyLmRlYnVnKGBDTEk6IFNwZWNtYXRpYyBqYXIgcGF0aDogJHtzcGVjbWF0aWNKYXJQYXRofWApO1xuICAgIHJldHVybiBjYWxsSmFyKHNwZWNtYXRpY0phclBhdGgsIGFyZ3MsIGRvbmUsIG9uT3V0cHV0KTtcbn07XG5cbmZ1bmN0aW9uIGNhbGxKYXIoamFyUGF0aDogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIGRvbmU6IChlcnJvcjogYW55KSA9PiB2b2lkLCBvbk91dHB1dDogKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I6IGJvb2xlYW4pID0+IHZvaWQpIHtcbiAgICBsZXQgYXJnc0xpc3QgPSBbXTtcbiAgICBpZiAocHJvY2Vzcy5lbnZbJ2VuZHBvaW50c0FQSSddKSB7XG4gICAgICAgIGFyZ3NMaXN0LnB1c2goYC1EZW5kcG9pbnRzQVBJPVwiJHtwcm9jZXNzLmVudlsnZW5kcG9pbnRzQVBJJ119XCJgKTtcbiAgICB9XG4gICAgYXJnc0xpc3QgPSBhcmdzTGlzdC5jb25jYXQoWyctamFyJywgYFwiJHtqYXJQYXRofVwiYCwgYXJnc10pO1xuICAgIGNvbnN0IGphdmFQcm9jZXNzOiBDaGlsZFByb2Nlc3MgPSBzcGF3bignamF2YScsIGFyZ3NMaXN0LCB7IHN0ZGlvOiAncGlwZScsIHN0ZGVycjogJ3BpcGUnLCBzaGVsbDogdHJ1ZSB9IGFzIFNwYXduT3B0aW9ucyk7XG4gICAgamF2YVByb2Nlc3Muc3Rkb3V0Py5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhOiBTdHJpbmcpIHtcbiAgICAgICAgb25PdXRwdXQoYCR7ZGF0YX1gLCBmYWxzZSk7XG4gICAgfSk7XG4gICAgamF2YVByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhOiBTdHJpbmcpIHtcbiAgICAgICAgb25PdXRwdXQoYCR7ZGF0YX1gLCB0cnVlKTtcbiAgICB9KTtcbiAgICBqYXZhUHJvY2Vzcy5vbignY2xvc2UnLCBmdW5jdGlvbiAoY29kZTpudW1iZXIpIHtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKCdDb21tYW5kIGV4aXRlZCB3aXRoIG5vbiB6ZXJvIGNvZGU6ICcgKyBjb2RlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvbmUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gamF2YVByb2Nlc3M7XG59XG5cbmV4cG9ydCB7IGNhbGxDb3JlLCBjYWxsS2Fma2EgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FB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
@@ -0,0 +1,2 @@
1
+ export declare const specmaticCoreJarName = "specmatic.jar";
2
+ export declare const specmaticKafkaJarName = "specmatic-kafka-all.jar";
package/dist/config.js CHANGED
@@ -3,10 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.specmatic = exports.specmaticJarPathRemote = exports.specmaticJarPathLocal = void 0;
7
- var specmaticJarPathLocal = './node_modules/specmatic/specmatic.jar';
8
- exports.specmaticJarPathLocal = specmaticJarPathLocal;
9
- var specmaticJarPathRemote = 'https://github.com/znsio/specmatic/releases/download/0.24.2/specmatic.jar';
10
- exports.specmaticJarPathRemote = specmaticJarPathRemote;
11
- var specmatic = 'specmatic.json';
12
- exports.specmatic = specmatic;
6
+ exports.specmaticKafkaJarName = exports.specmaticCoreJarName = void 0;
7
+ var specmaticCoreJarName = 'specmatic.jar';
8
+ exports.specmaticCoreJarName = specmaticCoreJarName;
9
+ var specmaticKafkaJarName = 'specmatic-kafka-all.jar';
10
+ exports.specmaticKafkaJarName = specmaticKafkaJarName;
11
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzcGVjbWF0aWNDb3JlSmFyTmFtZSIsImV4cG9ydHMiLCJzcGVjbWF0aWNLYWZrYUphck5hbWUiXSwic291cmNlcyI6WyIuLi9zcmMvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBzcGVjbWF0aWNDb3JlSmFyTmFtZSA9ICdzcGVjbWF0aWMuamFyJztcbmV4cG9ydCBjb25zdCBzcGVjbWF0aWNLYWZrYUphck5hbWUgPSAnc3BlY21hdGljLWthZmthLWFsbC5qYXInO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBTyxJQUFNQSxvQkFBb0IsR0FBRyxlQUFlO0FBQUNDLE9BQUEsQ0FBQUQsb0JBQUEsR0FBQUEsb0JBQUE7QUFDN0MsSUFBTUUscUJBQXFCLEdBQUcseUJBQXlCO0FBQUNELE9BQUEsQ0FBQUMscUJBQUEsR0FBQUEscUJBQUEifQ==
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ import { ChildProcess } from 'child_process';
3
+ import http from 'http';
4
+ export declare class Stub {
5
+ host: string;
6
+ port: number;
7
+ url: string;
8
+ process: ChildProcess;
9
+ constructor(host: string, port: number, url: string, process: ChildProcess);
10
+ }
11
+ declare const startStub: (host?: string, port?: number, args?: (string | number)[]) => Promise<Stub>;
12
+ declare const stopStub: (stub: Stub) => Promise<void>;
13
+ declare const testWithApiCoverage: (expressApp: any, host?: string, port?: number, contractPath?: string, args?: (string | number)[]) => Promise<{
14
+ [k: string]: number;
15
+ } | undefined>;
16
+ declare const test: (host?: string, port?: number, contractPath?: string, args?: (string | number)[]) => Promise<{
17
+ [k: string]: number;
18
+ } | undefined>;
19
+ declare const showTestResults: (testFn: (name: string, cb: () => void) => void) => void;
20
+ declare const setExpectations: (stubPath: string, stubServerBaseUrl?: string) => Promise<void>;
21
+ declare const printJarVersion: () => void;
22
+ declare const startApiCoverageServer: (expressApp: any) => Promise<http.Server>;
23
+ export { startStub, stopStub, test, testWithApiCoverage, setExpectations, printJarVersion, showTestResults };
24
+ export { startApiCoverageServer };