@contractkit/plugin-openapi 0.8.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.
- package/.turbo/turbo-build$colon$ci.log +35 -0
- package/.turbo/turbo-build.log +15 -0
- package/.turbo/turbo-test$colon$ci.log +105 -0
- package/.turbo/turbo-test.log +14 -0
- package/CHANGELOG.md +103 -0
- package/README.md +78 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +403 -0
- package/coverage/coverage-final.json +3 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +131 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/codegen-openapi.ts.html +2308 -0
- package/coverage/src/index.html +116 -0
- package/coverage/tests/helpers.ts.html +616 -0
- package/coverage/tests/index.html +116 -0
- package/dist/codegen-openapi.d.ts +44 -0
- package/dist/codegen-openapi.d.ts.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +701 -0
- package/dist/index.js.map +1 -0
- package/dist/src/codegen-openapi.d.ts +38 -0
- package/dist/src/codegen-openapi.d.ts.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/tests/codegen-openapi.test.d.ts +2 -0
- package/dist/tests/codegen-openapi.test.d.ts.map +1 -0
- package/dist/tests/helpers.d.ts +31 -0
- package/dist/tests/helpers.d.ts.map +1 -0
- package/eslint.config.js +6 -0
- package/package.json +43 -0
- package/src/codegen-openapi.ts +741 -0
- package/src/index.ts +43 -0
- package/tests/codegen-openapi.test.ts +767 -0
- package/tests/helpers.ts +177 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @contractkit/plugin-openapi@0.8.0 build:ci /Users/robert/projects/contractkit/packages/plugin-openapi
|
|
4
|
+
> eslint --max-warnings=0 && pnpm run build
|
|
5
|
+
|
|
6
|
+
=============
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
WARNING: You are currently running a version of TypeScript which is not officially supported by @typescript-eslint/typescript-estree.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
* @typescript-eslint/typescript-estree version: 8.57.2
|
|
13
|
+
* Supported TypeScript versions: >=4.8.4 <6.0.0
|
|
14
|
+
* Your TypeScript version: 6.0.2
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
Please only submit bug reports when using the officially supported version.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
=============
|
|
21
|
+
|
|
22
|
+
> @contractkit/plugin-openapi@0.8.0 build /Users/robert/projects/contractkit/packages/plugin-openapi
|
|
23
|
+
> tsup src/index.ts --format esm --sourcemap --dts && tsc --emitDeclarationOnly --declaration
|
|
24
|
+
|
|
25
|
+
[34mCLI[39m Building entry: src/index.ts
|
|
26
|
+
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
27
|
+
[34mCLI[39m tsup v8.5.1
|
|
28
|
+
[34mCLI[39m Target: esnext
|
|
29
|
+
[34mESM[39m Build start
|
|
30
|
+
[32mESM[39m [1mdist/index.js [22m[32m19.85 KB[39m
|
|
31
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m44.92 KB[39m
|
|
32
|
+
[32mESM[39m ⚡️ Build success in 38ms
|
|
33
|
+
DTS Build start
|
|
34
|
+
DTS ⚡️ Build success in 657ms
|
|
35
|
+
DTS dist/index.d.ts 1.33 KB
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
> @contractkit/plugin-openapi@0.8.0 build /Users/robert/projects/contractkit/packages/plugin-openapi
|
|
3
|
+
> tsup src/index.ts --format esm --sourcemap --dts && tsc --emitDeclarationOnly --declaration
|
|
4
|
+
|
|
5
|
+
CLI Building entry: src/index.ts
|
|
6
|
+
CLI Using tsconfig: tsconfig.json
|
|
7
|
+
CLI tsup v8.5.1
|
|
8
|
+
CLI Target: esnext
|
|
9
|
+
ESM Build start
|
|
10
|
+
ESM dist/index.js 19.85 KB
|
|
11
|
+
ESM dist/index.js.map 44.92 KB
|
|
12
|
+
ESM ⚡️ Build success in 60ms
|
|
13
|
+
DTS Build start
|
|
14
|
+
DTS ⚡️ Build success in 671ms
|
|
15
|
+
DTS dist/index.d.ts 1.33 KB
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @contractkit/plugin-openapi@0.8.0 test:ci /Users/robert/projects/contractkit/packages/plugin-openapi
|
|
4
|
+
> vitest run --coverage
|
|
5
|
+
|
|
6
|
+
[?25l
|
|
7
|
+
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/Users/robert/projects/contractkit/packages/plugin-openapi[39m
|
|
8
|
+
[2mCoverage enabled with [22m[33mv8[39m
|
|
9
|
+
|
|
10
|
+
[?2026h
|
|
11
|
+
[1m[33m ❯ [39m[22mtests/codegen-openapi.test.ts[2m [queued][22m
|
|
12
|
+
|
|
13
|
+
[2m Test Files [22m[1m[32m0 passed[39m[22m[90m (1)[39m
|
|
14
|
+
[2m Tests [22m[1m[32m0 passed[39m[22m[90m (0)[39m
|
|
15
|
+
[2m Start at [22m08:51:09
|
|
16
|
+
[2m Duration [22m204ms
|
|
17
|
+
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K
|
|
18
|
+
[1m[33m ❯ [39m[22mtests/codegen-openapi.test.ts[2m 0/53[22m
|
|
19
|
+
|
|
20
|
+
[2m Test Files [22m[1m[32m0 passed[39m[22m[90m (1)[39m
|
|
21
|
+
[2m Tests [22m[1m[32m0 passed[39m[22m[90m (53)[39m
|
|
22
|
+
[2m Start at [22m08:51:09
|
|
23
|
+
[2m Duration [22m863ms
|
|
24
|
+
[?2026l[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m tests/codegen-openapi.test.ts [2m([22m[2m53 tests[22m[2m)[22m[32m 46[2mms[22m[39m
|
|
25
|
+
[32m✓[39m toYaml [2m(8)[22m
|
|
26
|
+
[32m✓[39m serializes simple scalars[32m 1[2mms[22m[39m
|
|
27
|
+
[32m✓[39m quotes strings that look like YAML reserved words[32m 0[2mms[22m[39m
|
|
28
|
+
[32m✓[39m quotes empty strings[32m 0[2mms[22m[39m
|
|
29
|
+
[32m✓[39m quotes strings starting with digits[32m 0[2mms[22m[39m
|
|
30
|
+
[32m✓[39m serializes flat objects[32m 0[2mms[22m[39m
|
|
31
|
+
[32m✓[39m serializes nested objects[32m 3[2mms[22m[39m
|
|
32
|
+
[32m✓[39m serializes simple arrays inline[32m 1[2mms[22m[39m
|
|
33
|
+
[32m✓[39m serializes object arrays as block sequences[32m 0[2mms[22m[39m
|
|
34
|
+
[32m✓[39m generateOpenApi [2m(31)[22m
|
|
35
|
+
[32m✓[39m document structure [2m(5)[22m
|
|
36
|
+
[32m✓[39m generates openapi 3.1.0 header[32m 0[2mms[22m[39m
|
|
37
|
+
[32m✓[39m uses config info values[32m 0[2mms[22m[39m
|
|
38
|
+
[32m✓[39m defaults title and version when not specified[32m 0[2mms[22m[39m
|
|
39
|
+
[32m✓[39m includes servers when configured[32m 0[2mms[22m[39m
|
|
40
|
+
[32m✓[39m includes security when configured[32m 10[2mms[22m[39m
|
|
41
|
+
[32m✓[39m component schemas [2m(12)[22m
|
|
42
|
+
[32m✓[39m generates schema for simple model[32m 6[2mms[22m[39m
|
|
43
|
+
[32m✓[39m handles optional fields by omitting from required[32m 1[2mms[22m[39m
|
|
44
|
+
[32m✓[39m marks readonly/writeonly fields[32m 1[2mms[22m[39m
|
|
45
|
+
[32m✓[39m handles default values[32m 0[2mms[22m[39m
|
|
46
|
+
[32m✓[39m generates enum schema[32m 0[2mms[22m[39m
|
|
47
|
+
[32m✓[39m generates array field schema[32m 0[2mms[22m[39m
|
|
48
|
+
[32m✓[39m generates model with base (allOf)[32m 0[2mms[22m[39m
|
|
49
|
+
[32m✓[39m emits one $ref per base for multi-base inheritance[32m 0[2mms[22m[39m
|
|
50
|
+
[32m✓[39m handles scalar type constraints[32m 0[2mms[22m[39m
|
|
51
|
+
[32m✓[39m handles record type[32m 0[2mms[22m[39m
|
|
52
|
+
[32m✓[39m handles description on models and fields[32m 0[2mms[22m[39m
|
|
53
|
+
[32m✓[39m emits oneOf with a discriminator block for discriminated unions[32m 1[2mms[22m[39m
|
|
54
|
+
[32m✓[39m paths [2m(12)[22m
|
|
55
|
+
[32m✓[39m converts :param to {param} in paths[32m 0[2mms[22m[39m
|
|
56
|
+
[32m✓[39m generates GET operation[32m 0[2mms[22m[39m
|
|
57
|
+
[32m✓[39m generates POST with request body[32m 0[2mms[22m[39m
|
|
58
|
+
[32m✓[39m generates path parameters[32m 0[2mms[22m[39m
|
|
59
|
+
[32m✓[39m generates query parameters[32m 0[2mms[22m[39m
|
|
60
|
+
[32m✓[39m generates header parameters[32m 0[2mms[22m[39m
|
|
61
|
+
[32m✓[39m uses operationId from service binding[32m 0[2mms[22m[39m
|
|
62
|
+
[32m✓[39m uses operationId from sdk name[32m 0[2mms[22m[39m
|
|
63
|
+
[32m✓[39m generates 204 No content response[32m 0[2mms[22m[39m
|
|
64
|
+
[32m✓[39m includes operation description[32m 0[2mms[22m[39m
|
|
65
|
+
[32m✓[39m emits response headers[32m 0[2mms[22m[39m
|
|
66
|
+
[32m✓[39m handles inline object response body[32m 0[2mms[22m[39m
|
|
67
|
+
[32m✓[39m combining multiple files [2m(2)[22m
|
|
68
|
+
[32m✓[39m merges paths from multiple op files[32m 0[2mms[22m[39m
|
|
69
|
+
[32m✓[39m merges schemas from multiple contract files[32m 0[2mms[22m[39m
|
|
70
|
+
[32m✓[39m route modifiers [2m(11)[22m
|
|
71
|
+
[32m✓[39m internal [2m(4)[22m
|
|
72
|
+
[32m✓[39m excludes an internal operation from paths[32m 0[2mms[22m[39m
|
|
73
|
+
[32m✓[39m includes internal operations when config.includeInternal is true[32m 0[2mms[22m[39m
|
|
74
|
+
[32m✓[39m excludes all operations when route is internal[32m 0[2mms[22m[39m
|
|
75
|
+
[32m✓[39m operation-level override on internal route makes that operation visible[32m 0[2mms[22m[39m
|
|
76
|
+
[32m✓[39m schema filtering — internal operations [2m(4)[22m
|
|
77
|
+
[32m✓[39m excludes schemas only referenced by internal operations[32m 0[2mms[22m[39m
|
|
78
|
+
[32m✓[39m transitively includes schemas referenced by public types[32m 0[2mms[22m[39m
|
|
79
|
+
[32m✓[39m excludes all schemas when all operations are internal[32m 0[2mms[22m[39m
|
|
80
|
+
[32m✓[39m includes all schemas when there are no op files[32m 0[2mms[22m[39m
|
|
81
|
+
[32m✓[39m deprecated [2m(3)[22m
|
|
82
|
+
[32m✓[39m sets deprecated: true for a deprecated operation[32m 0[2mms[22m[39m
|
|
83
|
+
[32m✓[39m does not set deprecated for a normal operation[32m 0[2mms[22m[39m
|
|
84
|
+
[32m✓[39m cascades route-level deprecated to all operations[32m 0[2mms[22m[39m
|
|
85
|
+
[32m✓[39m options-level header globals [2m(3)[22m
|
|
86
|
+
[32m✓[39m renders global response headers on every status code, including bodyless and 4xx/5xx[32m 3[2mms[22m[39m
|
|
87
|
+
[32m✓[39m omits global response headers on a status code that opts out via headers: none[32m 1[2mms[22m[39m
|
|
88
|
+
[32m✓[39m renders global request headers as parameters on every operation[32m 9[2mms[22m[39m
|
|
89
|
+
|
|
90
|
+
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
|
91
|
+
[2m Tests [22m [1m[32m53 passed[39m[22m[90m (53)[39m
|
|
92
|
+
[2m Start at [22m 08:51:09
|
|
93
|
+
[2m Duration [22m 1.02s[2m (transform 161ms, setup 0ms, import 651ms, tests 46ms, environment 0ms)[22m
|
|
94
|
+
|
|
95
|
+
[34m % [39m[2mCoverage report from [22m[33mv8[39m
|
|
96
|
+
---------------------|---------|----------|---------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------
|
|
97
|
+
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
|
|
98
|
+
---------------------|---------|----------|---------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------
|
|
99
|
+
[33;1mAll files [0m | [33;1m 78.88[0m | [33;1m 74.52[0m | [32;1m 82.25[0m | [32;1m 81.03[0m | [31;1m [0m
|
|
100
|
+
[33;1m src [0m | [33;1m 79.5[0m | [33;1m 75.26[0m | [32;1m 86.11[0m | [32;1m 81.5[0m | [31;1m [0m
|
|
101
|
+
[33;1m codegen-openapi.ts[0m | [33;1m 79.5[0m | [33;1m 75.26[0m | [32;1m 86.11[0m | [32;1m 81.5[0m | [31;1m56-60,67-68,78-79,85,278,288,302,315,323,345,351,363-364,376-377,382-385,392-394,399-409,415-417,424-437,468-474,525,567,588-609,669-672,696,706[0m
|
|
102
|
+
[33;1m tests [0m | [33;1m 73.33[0m | [33;1m 67.74[0m | [33;1m 76.92[0m | [33;1m 76.92[0m | [31;1m [0m
|
|
103
|
+
[33;1m helpers.ts [0m | [33;1m 73.33[0m | [33;1m 67.74[0m | [33;1m 76.92[0m | [33;1m 76.92[0m | [31;1m44,60,76,110-118,138,149-150 [0m
|
|
104
|
+
---------------------|---------|----------|---------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------
|
|
105
|
+
[?25h
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
> @contractkit/plugin-openapi@0.8.0 test /Users/robert/projects/contractkit/packages/plugin-openapi
|
|
3
|
+
> vitest run
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/Users/robert/projects/contractkit/packages/plugin-openapi[39m
|
|
7
|
+
|
|
8
|
+
[32m✓[39m tests/codegen-openapi.test.ts [2m([22m[2m53 tests[22m[2m)[22m[32m 11[2mms[22m[39m
|
|
9
|
+
|
|
10
|
+
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
|
11
|
+
[2m Tests [22m [1m[32m53 passed[39m[22m[90m (53)[39m
|
|
12
|
+
[2m Start at [22m 08:51:33
|
|
13
|
+
[2m Duration [22m 418ms[2m (transform 180ms, setup 0ms, import 274ms, tests 11ms, environment 0ms)[22m
|
|
14
|
+
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# @contractkit/contractkit-plugin-openapi
|
|
2
|
+
|
|
3
|
+
## 0.8.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [c9f2166]
|
|
8
|
+
- @contractkit/core@0.11.0
|
|
9
|
+
|
|
10
|
+
## 0.8.0
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- bbee232: prep for public release
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- Updated dependencies [bbee232]
|
|
19
|
+
- @contractkit/core@0.10.0
|
|
20
|
+
|
|
21
|
+
## 0.7.0
|
|
22
|
+
|
|
23
|
+
### Minor Changes
|
|
24
|
+
|
|
25
|
+
- e27b771: Add an `includeInternal: boolean` config option to every plugin so consumers can override whether `internal` operations are emitted. Defaults preserve today's behavior: server router and Bruno default to `true` (include); TS SDK, Python SDK, OpenAPI, and Markdown default to `false` (exclude).
|
|
26
|
+
|
|
27
|
+
## 0.6.1
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [d13614c]
|
|
32
|
+
- @maroonedsoftware/contractkit@0.9.0
|
|
33
|
+
|
|
34
|
+
## 0.6.0
|
|
35
|
+
|
|
36
|
+
### Minor Changes
|
|
37
|
+
|
|
38
|
+
- 353aa10: Implement options-level header globals for request and response in the contract DSL. This update allows headers to be declared at the file level, merging them into every operation's request and response. Added normalization logic to handle header collisions and opt-out scenarios. Updated documentation and tests to reflect these changes, ensuring proper round-trip formatting and validation of headers.
|
|
39
|
+
- 888ded5: Enhance contract DSL with multi-base inheritance support and override modifier. This update introduces the ability to declare multiple base contracts, along with validation rules for field conflicts across bases. The `override` modifier is now required for redeclaring conflicting fields, and the documentation has been updated to reflect these changes. Tests have been added to ensure correct behavior for inheritance and modifier usage.
|
|
40
|
+
|
|
41
|
+
### Patch Changes
|
|
42
|
+
|
|
43
|
+
- Updated dependencies [353aa10]
|
|
44
|
+
- Updated dependencies [888ded5]
|
|
45
|
+
- @maroonedsoftware/contractkit@0.8.0
|
|
46
|
+
|
|
47
|
+
## 0.5.0
|
|
48
|
+
|
|
49
|
+
### Minor Changes
|
|
50
|
+
|
|
51
|
+
- 16ac3a7: Implement support for typed response headers in API operations. Added functionality to declare headers alongside response bodies, affecting OpenAPI, TypeScript SDK, and Markdown documentation generation. Updated related tests to ensure correct parsing and rendering of response headers, including handling optional headers and duplicate declarations.
|
|
52
|
+
|
|
53
|
+
### Patch Changes
|
|
54
|
+
|
|
55
|
+
- Updated dependencies [16ac3a7]
|
|
56
|
+
- @maroonedsoftware/contractkit@0.7.0
|
|
57
|
+
|
|
58
|
+
## 0.4.1
|
|
59
|
+
|
|
60
|
+
### Patch Changes
|
|
61
|
+
|
|
62
|
+
- Updated dependencies [d3ea773]
|
|
63
|
+
- @maroonedsoftware/contractkit@0.6.0
|
|
64
|
+
|
|
65
|
+
## 0.4.0
|
|
66
|
+
|
|
67
|
+
### Minor Changes
|
|
68
|
+
|
|
69
|
+
- 181dadb: Refactor request handling to support multiple content types in operations. Updated OpRequestNode to accept an array of bodies, modified related functions and tests to accommodate multi-MIME requests, and enhanced validation for nested structures in URL-encoded bodies. Improved code generation across various plugins to handle new request structure.
|
|
70
|
+
|
|
71
|
+
### Patch Changes
|
|
72
|
+
|
|
73
|
+
- Updated dependencies [181dadb]
|
|
74
|
+
- @maroonedsoftware/contractkit@0.5.0
|
|
75
|
+
|
|
76
|
+
## 0.3.0
|
|
77
|
+
|
|
78
|
+
### Minor Changes
|
|
79
|
+
|
|
80
|
+
- ada5f84: Implement discriminated unions in ContractKit with validation and code generation support. Update README and tests to reflect new functionality, including parsing, rendering, and OpenAPI generation for discriminated unions.
|
|
81
|
+
|
|
82
|
+
### Patch Changes
|
|
83
|
+
|
|
84
|
+
- Updated dependencies [ada5f84]
|
|
85
|
+
- @maroonedsoftware/contractkit@0.4.0
|
|
86
|
+
|
|
87
|
+
## 0.2.1
|
|
88
|
+
|
|
89
|
+
### Patch Changes
|
|
90
|
+
|
|
91
|
+
- Updated dependencies [f396a68]
|
|
92
|
+
- @maroonedsoftware/contractkit@0.3.0
|
|
93
|
+
|
|
94
|
+
## 0.2.0
|
|
95
|
+
|
|
96
|
+
### Minor Changes
|
|
97
|
+
|
|
98
|
+
- db7345b: updating to contractkit as the org
|
|
99
|
+
|
|
100
|
+
### Patch Changes
|
|
101
|
+
|
|
102
|
+
- Updated dependencies [db7345b]
|
|
103
|
+
- @contractkit/core@0.2.0
|
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# @contractkit/contractkit-plugin-openapi
|
|
2
|
+
|
|
3
|
+
ContractKit plugin that generates an OpenAPI 3.0 YAML specification from `.ck` contract and operation files.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @contractkit/contractkit-plugin-openapi
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Configuration
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"plugins": {
|
|
16
|
+
"@contractkit/contractkit-plugin-openapi": {
|
|
17
|
+
"output": "openapi.yaml",
|
|
18
|
+
"info": {
|
|
19
|
+
"title": "Acme API",
|
|
20
|
+
"version": "1.0.0",
|
|
21
|
+
"description": "Public API for Acme services"
|
|
22
|
+
},
|
|
23
|
+
"servers": [
|
|
24
|
+
{ "url": "https://api.acme.com", "description": "Production" },
|
|
25
|
+
{ "url": "https://api.staging.acme.com", "description": "Staging" }
|
|
26
|
+
],
|
|
27
|
+
"security": [{ "bearerAuth": [] }],
|
|
28
|
+
"securitySchemes": {
|
|
29
|
+
"bearerAuth": {
|
|
30
|
+
"type": "http",
|
|
31
|
+
"scheme": "bearer",
|
|
32
|
+
"bearerFormat": "JWT"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Options
|
|
41
|
+
|
|
42
|
+
| Option | Type | Default | Description |
|
|
43
|
+
|---|---|---|---|
|
|
44
|
+
| `baseDir` | `string` | `rootDir` | Base directory for the output file |
|
|
45
|
+
| `output` | `string` | `"openapi.yaml"` | Output file path |
|
|
46
|
+
| `info.title` | `string` | — | API title in the `info` block |
|
|
47
|
+
| `info.version` | `string` | — | API version in the `info` block |
|
|
48
|
+
| `info.description` | `string` | — | API description in the `info` block |
|
|
49
|
+
| `servers` | `array` | — | List of server objects (`url`, optional `description`) |
|
|
50
|
+
| `security` | `array` | — | Global security requirements (e.g. `[{ "bearerAuth": [] }]`) |
|
|
51
|
+
| `securitySchemes` | `object` | — | Security scheme definitions added to `components.securitySchemes` |
|
|
52
|
+
|
|
53
|
+
### Security scheme types
|
|
54
|
+
|
|
55
|
+
| `type` | Required fields | Description |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| `"http"` | `scheme` (`"bearer"` or `"basic"`), optional `bearerFormat` | HTTP auth (Bearer JWT, Basic, etc.) |
|
|
58
|
+
| `"apiKey"` | `name`, `in` (`"header"` or `"query"`) | API key passed in a header or query param |
|
|
59
|
+
| `"oauth2"` | — | OAuth 2.0 |
|
|
60
|
+
| `"openIdConnect"` | — | OpenID Connect |
|
|
61
|
+
|
|
62
|
+
## Output
|
|
63
|
+
|
|
64
|
+
The plugin writes a single YAML file. All `contract` declarations become entries in `components/schemas`. All `operation` declarations become paths with their HTTP verbs, request bodies, parameters, and response schemas.
|
|
65
|
+
|
|
66
|
+
Operations marked `internal` are omitted from the generated spec by default. Set `includeInternal: true` in the plugin config to include them (e.g. for an internal-use API spec).
|
|
67
|
+
|
|
68
|
+
## Programmatic use
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { createOpenApiPlugin } from '@contractkit/contractkit-plugin-openapi';
|
|
72
|
+
|
|
73
|
+
const plugin = createOpenApiPlugin({
|
|
74
|
+
output: 'dist/openapi.yaml',
|
|
75
|
+
info: { title: 'My API', version: '2.0.0' },
|
|
76
|
+
servers: [{ url: 'https://api.example.com' }],
|
|
77
|
+
});
|
|
78
|
+
```
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
body, html {
|
|
2
|
+
margin:0; padding: 0;
|
|
3
|
+
height: 100%;
|
|
4
|
+
}
|
|
5
|
+
body {
|
|
6
|
+
font-family: Helvetica Neue, Helvetica, Arial;
|
|
7
|
+
font-size: 14px;
|
|
8
|
+
color:#333;
|
|
9
|
+
}
|
|
10
|
+
.small { font-size: 12px; }
|
|
11
|
+
*, *:after, *:before {
|
|
12
|
+
-webkit-box-sizing:border-box;
|
|
13
|
+
-moz-box-sizing:border-box;
|
|
14
|
+
box-sizing:border-box;
|
|
15
|
+
}
|
|
16
|
+
h1 { font-size: 20px; margin: 0;}
|
|
17
|
+
h2 { font-size: 14px; }
|
|
18
|
+
pre {
|
|
19
|
+
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
|
20
|
+
margin: 0;
|
|
21
|
+
padding: 0;
|
|
22
|
+
-moz-tab-size: 2;
|
|
23
|
+
-o-tab-size: 2;
|
|
24
|
+
tab-size: 2;
|
|
25
|
+
}
|
|
26
|
+
a { color:#0074D9; text-decoration:none; }
|
|
27
|
+
a:hover { text-decoration:underline; }
|
|
28
|
+
.strong { font-weight: bold; }
|
|
29
|
+
.space-top1 { padding: 10px 0 0 0; }
|
|
30
|
+
.pad2y { padding: 20px 0; }
|
|
31
|
+
.pad1y { padding: 10px 0; }
|
|
32
|
+
.pad2x { padding: 0 20px; }
|
|
33
|
+
.pad2 { padding: 20px; }
|
|
34
|
+
.pad1 { padding: 10px; }
|
|
35
|
+
.space-left2 { padding-left:55px; }
|
|
36
|
+
.space-right2 { padding-right:20px; }
|
|
37
|
+
.center { text-align:center; }
|
|
38
|
+
.clearfix { display:block; }
|
|
39
|
+
.clearfix:after {
|
|
40
|
+
content:'';
|
|
41
|
+
display:block;
|
|
42
|
+
height:0;
|
|
43
|
+
clear:both;
|
|
44
|
+
visibility:hidden;
|
|
45
|
+
}
|
|
46
|
+
.fl { float: left; }
|
|
47
|
+
@media only screen and (max-width:640px) {
|
|
48
|
+
.col3 { width:100%; max-width:100%; }
|
|
49
|
+
.hide-mobile { display:none!important; }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.quiet {
|
|
53
|
+
color: #7f7f7f;
|
|
54
|
+
color: rgba(0,0,0,0.5);
|
|
55
|
+
}
|
|
56
|
+
.quiet a { opacity: 0.7; }
|
|
57
|
+
|
|
58
|
+
.fraction {
|
|
59
|
+
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
|
|
60
|
+
font-size: 10px;
|
|
61
|
+
color: #555;
|
|
62
|
+
background: #E8E8E8;
|
|
63
|
+
padding: 4px 5px;
|
|
64
|
+
border-radius: 3px;
|
|
65
|
+
vertical-align: middle;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
div.path a:link, div.path a:visited { color: #333; }
|
|
69
|
+
table.coverage {
|
|
70
|
+
border-collapse: collapse;
|
|
71
|
+
margin: 10px 0 0 0;
|
|
72
|
+
padding: 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
table.coverage td {
|
|
76
|
+
margin: 0;
|
|
77
|
+
padding: 0;
|
|
78
|
+
vertical-align: top;
|
|
79
|
+
}
|
|
80
|
+
table.coverage td.line-count {
|
|
81
|
+
text-align: right;
|
|
82
|
+
padding: 0 5px 0 20px;
|
|
83
|
+
}
|
|
84
|
+
table.coverage td.line-coverage {
|
|
85
|
+
text-align: right;
|
|
86
|
+
padding-right: 10px;
|
|
87
|
+
min-width:20px;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
table.coverage td span.cline-any {
|
|
91
|
+
display: inline-block;
|
|
92
|
+
padding: 0 5px;
|
|
93
|
+
width: 100%;
|
|
94
|
+
}
|
|
95
|
+
.missing-if-branch {
|
|
96
|
+
display: inline-block;
|
|
97
|
+
margin-right: 5px;
|
|
98
|
+
border-radius: 3px;
|
|
99
|
+
position: relative;
|
|
100
|
+
padding: 0 4px;
|
|
101
|
+
background: #333;
|
|
102
|
+
color: yellow;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.skip-if-branch {
|
|
106
|
+
display: none;
|
|
107
|
+
margin-right: 10px;
|
|
108
|
+
position: relative;
|
|
109
|
+
padding: 0 4px;
|
|
110
|
+
background: #ccc;
|
|
111
|
+
color: white;
|
|
112
|
+
}
|
|
113
|
+
.missing-if-branch .typ, .skip-if-branch .typ {
|
|
114
|
+
color: inherit !important;
|
|
115
|
+
}
|
|
116
|
+
.coverage-summary {
|
|
117
|
+
border-collapse: collapse;
|
|
118
|
+
width: 100%;
|
|
119
|
+
}
|
|
120
|
+
.coverage-summary tr { border-bottom: 1px solid #bbb; }
|
|
121
|
+
.keyline-all { border: 1px solid #ddd; }
|
|
122
|
+
.coverage-summary td, .coverage-summary th { padding: 10px; }
|
|
123
|
+
.coverage-summary tbody { border: 1px solid #bbb; }
|
|
124
|
+
.coverage-summary td { border-right: 1px solid #bbb; }
|
|
125
|
+
.coverage-summary td:last-child { border-right: none; }
|
|
126
|
+
.coverage-summary th {
|
|
127
|
+
text-align: left;
|
|
128
|
+
font-weight: normal;
|
|
129
|
+
white-space: nowrap;
|
|
130
|
+
}
|
|
131
|
+
.coverage-summary th.file { border-right: none !important; }
|
|
132
|
+
.coverage-summary th.pct { }
|
|
133
|
+
.coverage-summary th.pic,
|
|
134
|
+
.coverage-summary th.abs,
|
|
135
|
+
.coverage-summary td.pct,
|
|
136
|
+
.coverage-summary td.abs { text-align: right; }
|
|
137
|
+
.coverage-summary td.file { white-space: nowrap; }
|
|
138
|
+
.coverage-summary td.pic { min-width: 120px !important; }
|
|
139
|
+
.coverage-summary tfoot td { }
|
|
140
|
+
|
|
141
|
+
.coverage-summary .sorter {
|
|
142
|
+
height: 10px;
|
|
143
|
+
width: 7px;
|
|
144
|
+
display: inline-block;
|
|
145
|
+
margin-left: 0.5em;
|
|
146
|
+
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
|
|
147
|
+
}
|
|
148
|
+
.coverage-summary .sorted .sorter {
|
|
149
|
+
background-position: 0 -20px;
|
|
150
|
+
}
|
|
151
|
+
.coverage-summary .sorted-desc .sorter {
|
|
152
|
+
background-position: 0 -10px;
|
|
153
|
+
}
|
|
154
|
+
.status-line { height: 10px; }
|
|
155
|
+
/* yellow */
|
|
156
|
+
.cbranch-no { background: yellow !important; color: #111; }
|
|
157
|
+
/* dark red */
|
|
158
|
+
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
|
|
159
|
+
.low .chart { border:1px solid #C21F39 }
|
|
160
|
+
.highlighted,
|
|
161
|
+
.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
|
|
162
|
+
background: #C21F39 !important;
|
|
163
|
+
}
|
|
164
|
+
/* medium red */
|
|
165
|
+
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
|
|
166
|
+
/* light red */
|
|
167
|
+
.low, .cline-no { background:#FCE1E5 }
|
|
168
|
+
/* light green */
|
|
169
|
+
.high, .cline-yes { background:rgb(230,245,208) }
|
|
170
|
+
/* medium green */
|
|
171
|
+
.cstat-yes { background:rgb(161,215,106) }
|
|
172
|
+
/* dark green */
|
|
173
|
+
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
|
|
174
|
+
.high .chart { border:1px solid rgb(77,146,33) }
|
|
175
|
+
/* dark yellow (gold) */
|
|
176
|
+
.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
|
|
177
|
+
.medium .chart { border:1px solid #f9cd0b; }
|
|
178
|
+
/* light yellow */
|
|
179
|
+
.medium { background: #fff4c2; }
|
|
180
|
+
|
|
181
|
+
.cstat-skip { background: #ddd; color: #111; }
|
|
182
|
+
.fstat-skip { background: #ddd; color: #111 !important; }
|
|
183
|
+
.cbranch-skip { background: #ddd !important; color: #111; }
|
|
184
|
+
|
|
185
|
+
span.cline-neutral { background: #eaeaea; }
|
|
186
|
+
|
|
187
|
+
.coverage-summary td.empty {
|
|
188
|
+
opacity: .5;
|
|
189
|
+
padding-top: 4px;
|
|
190
|
+
padding-bottom: 4px;
|
|
191
|
+
line-height: 1;
|
|
192
|
+
color: #888;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.cover-fill, .cover-empty {
|
|
196
|
+
display:inline-block;
|
|
197
|
+
height: 12px;
|
|
198
|
+
}
|
|
199
|
+
.chart {
|
|
200
|
+
line-height: 0;
|
|
201
|
+
}
|
|
202
|
+
.cover-empty {
|
|
203
|
+
background: white;
|
|
204
|
+
}
|
|
205
|
+
.cover-full {
|
|
206
|
+
border-right: none !important;
|
|
207
|
+
}
|
|
208
|
+
pre.prettyprint {
|
|
209
|
+
border: none !important;
|
|
210
|
+
padding: 0 !important;
|
|
211
|
+
margin: 0 !important;
|
|
212
|
+
}
|
|
213
|
+
.com { color: #999 !important; }
|
|
214
|
+
.ignore-none { color: #999; font-weight: normal; }
|
|
215
|
+
|
|
216
|
+
.wrapper {
|
|
217
|
+
min-height: 100%;
|
|
218
|
+
height: auto !important;
|
|
219
|
+
height: 100%;
|
|
220
|
+
margin: 0 auto -48px;
|
|
221
|
+
}
|
|
222
|
+
.footer, .push {
|
|
223
|
+
height: 48px;
|
|
224
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
var jumpToCode = (function init() {
|
|
3
|
+
// Classes of code we would like to highlight in the file view
|
|
4
|
+
var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
|
|
5
|
+
|
|
6
|
+
// Elements to highlight in the file listing view
|
|
7
|
+
var fileListingElements = ['td.pct.low'];
|
|
8
|
+
|
|
9
|
+
// We don't want to select elements that are direct descendants of another match
|
|
10
|
+
var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
|
|
11
|
+
|
|
12
|
+
// Selector that finds elements on the page to which we can jump
|
|
13
|
+
var selector =
|
|
14
|
+
fileListingElements.join(', ') +
|
|
15
|
+
', ' +
|
|
16
|
+
notSelector +
|
|
17
|
+
missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
|
|
18
|
+
|
|
19
|
+
// The NodeList of matching elements
|
|
20
|
+
var missingCoverageElements = document.querySelectorAll(selector);
|
|
21
|
+
|
|
22
|
+
var currentIndex;
|
|
23
|
+
|
|
24
|
+
function toggleClass(index) {
|
|
25
|
+
missingCoverageElements
|
|
26
|
+
.item(currentIndex)
|
|
27
|
+
.classList.remove('highlighted');
|
|
28
|
+
missingCoverageElements.item(index).classList.add('highlighted');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function makeCurrent(index) {
|
|
32
|
+
toggleClass(index);
|
|
33
|
+
currentIndex = index;
|
|
34
|
+
missingCoverageElements.item(index).scrollIntoView({
|
|
35
|
+
behavior: 'smooth',
|
|
36
|
+
block: 'center',
|
|
37
|
+
inline: 'center'
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function goToPrevious() {
|
|
42
|
+
var nextIndex = 0;
|
|
43
|
+
if (typeof currentIndex !== 'number' || currentIndex === 0) {
|
|
44
|
+
nextIndex = missingCoverageElements.length - 1;
|
|
45
|
+
} else if (missingCoverageElements.length > 1) {
|
|
46
|
+
nextIndex = currentIndex - 1;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
makeCurrent(nextIndex);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function goToNext() {
|
|
53
|
+
var nextIndex = 0;
|
|
54
|
+
|
|
55
|
+
if (
|
|
56
|
+
typeof currentIndex === 'number' &&
|
|
57
|
+
currentIndex < missingCoverageElements.length - 1
|
|
58
|
+
) {
|
|
59
|
+
nextIndex = currentIndex + 1;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
makeCurrent(nextIndex);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return function jump(event) {
|
|
66
|
+
if (
|
|
67
|
+
document.getElementById('fileSearch') === document.activeElement &&
|
|
68
|
+
document.activeElement != null
|
|
69
|
+
) {
|
|
70
|
+
// if we're currently focused on the search input, we don't want to navigate
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
switch (event.which) {
|
|
75
|
+
case 78: // n
|
|
76
|
+
case 74: // j
|
|
77
|
+
goToNext();
|
|
78
|
+
break;
|
|
79
|
+
case 66: // b
|
|
80
|
+
case 75: // k
|
|
81
|
+
case 80: // p
|
|
82
|
+
goToPrevious();
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
})();
|
|
87
|
+
window.addEventListener('keydown', jumpToCode);
|