@contractkit/plugin-bruno 0.9.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 +128 -0
- package/.turbo/turbo-test.log +14 -0
- package/CHANGELOG.md +110 -0
- package/README.md +80 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +313 -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-bruno.ts.html +1903 -0
- package/coverage/src/index.html +116 -0
- package/coverage/tests/helpers.ts.html +604 -0
- package/coverage/tests/index.html +116 -0
- package/dist/codegen-bruno.d.ts +50 -0
- package/dist/codegen-bruno.d.ts.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +631 -0
- package/dist/index.js.map +1 -0
- package/eslint.config.js +6 -0
- package/package.json +43 -0
- package/src/codegen-bruno.ts +606 -0
- package/src/index.ts +130 -0
- package/tests/codegen-bruno.test.ts +1008 -0
- package/tests/helpers.ts +173 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @contractkit/plugin-bruno@0.9.0 build:ci /Users/robert/projects/contractkit/packages/plugin-bruno
|
|
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-bruno@0.9.0 build /Users/robert/projects/contractkit/packages/plugin-bruno
|
|
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.94 KB[39m
|
|
31
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m46.49 KB[39m
|
|
32
|
+
[32mESM[39m ⚡️ Build success in 41ms
|
|
33
|
+
DTS Build start
|
|
34
|
+
DTS ⚡️ Build success in 622ms
|
|
35
|
+
DTS dist/index.d.ts 1.37 KB
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
> @contractkit/plugin-bruno@0.9.0 build /Users/robert/projects/contractkit/packages/plugin-bruno
|
|
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.94 KB
|
|
11
|
+
ESM dist/index.js.map 46.49 KB
|
|
12
|
+
ESM ⚡️ Build success in 69ms
|
|
13
|
+
DTS Build start
|
|
14
|
+
DTS ⚡️ Build success in 594ms
|
|
15
|
+
DTS dist/index.d.ts 1.37 KB
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @contractkit/plugin-bruno@0.9.0 test:ci /Users/robert/projects/contractkit/packages/plugin-bruno
|
|
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-bruno[39m
|
|
8
|
+
[2mCoverage enabled with [22m[33mv8[39m
|
|
9
|
+
|
|
10
|
+
[?2026h
|
|
11
|
+
[1m[33m ❯ [39m[22mtests/codegen-bruno.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 [22m407ms
|
|
17
|
+
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K
|
|
18
|
+
[1m[33m ❯ [39m[22mtests/codegen-bruno.test.ts[2m [queued][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 (0)[39m
|
|
22
|
+
[2m Start at [22m08:51:09
|
|
23
|
+
[2m Duration [22m927ms
|
|
24
|
+
[?2026l[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m tests/codegen-bruno.test.ts [2m([22m[2m85 tests[22m[2m)[22m[32m 11[2mms[22m[39m
|
|
25
|
+
[32m✓[39m generateOpenCollection [2m(80)[22m
|
|
26
|
+
[32m✓[39m generates opencollection.yml with correct spec version and collection name[32m 2[2mms[22m[39m
|
|
27
|
+
[32m✓[39m generates Local environment file with baseUrl variable[32m 0[2mms[22m[39m
|
|
28
|
+
[32m✓[39m emits requests for internal operations by default[32m 0[2mms[22m[39m
|
|
29
|
+
[32m✓[39m skips internal operations when includeInternal is false[32m 0[2mms[22m[39m
|
|
30
|
+
[32m✓[39m creates one folder per op root file[32m 0[2mms[22m[39m
|
|
31
|
+
[32m✓[39m folder.yml has info block with name, type: folder, and seq[32m 0[2mms[22m[39m
|
|
32
|
+
[32m✓[39m generates one .yml file per route+method combination[32m 0[2mms[22m[39m
|
|
33
|
+
[32m✓[39m request info block has name, type: http, and seq[32m 0[2mms[22m[39m
|
|
34
|
+
[32m✓[39m seq increments across operations within a folder[32m 0[2mms[22m[39m
|
|
35
|
+
[32m✓[39m uses slugified name as filename when op.name is set[32m 0[2mms[22m[39m
|
|
36
|
+
[32m✓[39m falls back to method-path filename when op.name is not set[32m 0[2mms[22m[39m
|
|
37
|
+
[32m✓[39m uses area meta as the top-level folder name[32m 0[2mms[22m[39m
|
|
38
|
+
[32m✓[39m falls back to filename when no area meta[32m 0[2mms[22m[39m
|
|
39
|
+
[32m✓[39m places request files in subfolder when subarea meta is set[32m 0[2mms[22m[39m
|
|
40
|
+
[32m✓[39m generates folder.yml for subarea with correct name[32m 0[2mms[22m[39m
|
|
41
|
+
[32m✓[39m still generates top-level folder.yml when subarea is set[32m 0[2mms[22m[39m
|
|
42
|
+
[32m✓[39m slugifies subarea for the folder path[32m 0[2mms[22m[39m
|
|
43
|
+
[32m✓[39m places request files directly in folder when no subarea[32m 0[2mms[22m[39m
|
|
44
|
+
[32m✓[39m uses {{baseUrl}} prefix and Bruno :param syntax for path params[32m 0[2mms[22m[39m
|
|
45
|
+
[32m✓[39m generates path params as flat array entries with type: path[32m 0[2mms[22m[39m
|
|
46
|
+
[32m✓[39m uses uuid example value for uuid path params[32m 0[2mms[22m[39m
|
|
47
|
+
[32m✓[39m uses typed example values for scalar path params[32m 0[2mms[22m[39m
|
|
48
|
+
[32m✓[39m uses ISO 8601 duration example value for duration path params[32m 0[2mms[22m[39m
|
|
49
|
+
[32m✓[39m uses first enum value as example for enum path params[32m 0[2mms[22m[39m
|
|
50
|
+
[32m✓[39m falls back to empty string for untyped path params[32m 0[2mms[22m[39m
|
|
51
|
+
[32m✓[39m does not generate params block when path has no params and no query[32m 0[2mms[22m[39m
|
|
52
|
+
[32m✓[39m generates query params as flat array entries with type: query[32m 0[2mms[22m[39m
|
|
53
|
+
[32m✓[39m uses typed example values for query params[32m 0[2mms[22m[39m
|
|
54
|
+
[32m✓[39m falls back to single placeholder entry for ref query params with no registry[32m 0[2mms[22m[39m
|
|
55
|
+
[32m✓[39m expands ref query params into individual fields when model registry provided[32m 0[2mms[22m[39m
|
|
56
|
+
[32m✓[39m mixes path and query params in the same flat array[32m 0[2mms[22m[39m
|
|
57
|
+
[32m✓[39m generates headers block from op.headers inline params[32m 0[2mms[22m[39m
|
|
58
|
+
[32m✓[39m falls back to single placeholder entry for ref header source with no registry[32m 0[2mms[22m[39m
|
|
59
|
+
[32m✓[39m expands ref header source into individual fields when model registry provided[32m 0[2mms[22m[39m
|
|
60
|
+
[32m✓[39m does not generate headers block when op has no headers[32m 0[2mms[22m[39m
|
|
61
|
+
[32m✓[39m generates body with type: json and data block literal for JSON requests[32m 0[2mms[22m[39m
|
|
62
|
+
[32m✓[39m expands inline object body type into a JSON skeleton[32m 0[2mms[22m[39m
|
|
63
|
+
[32m✓[39m uses ISO 8601 duration example value in body skeleton[32m 0[2mms[22m[39m
|
|
64
|
+
[32m✓[39m excludes readonly fields from inline object body skeleton[32m 0[2mms[22m[39m
|
|
65
|
+
[32m✓[39m uses empty object for ref body types when no contractRoots provided[32m 0[2mms[22m[39m
|
|
66
|
+
[32m✓[39m expands ref body type into a JSON skeleton when contractRoots provided[32m 0[2mms[22m[39m
|
|
67
|
+
[32m✓[39m excludes readonly fields from expanded ref body[32m 0[2mms[22m[39m
|
|
68
|
+
[32m✓[39m sets optional fields to null in expanded ref body[32m 0[2mms[22m[39m
|
|
69
|
+
[32m✓[39m expands inherited fields from base model in ref body[32m 0[2mms[22m[39m
|
|
70
|
+
[32m✓[39m uses field default value in body for non-optional fields[32m 0[2mms[22m[39m
|
|
71
|
+
[32m✓[39m uses field default value in body for optional fields[32m 0[2mms[22m[39m
|
|
72
|
+
[32m✓[39m uses field defaults from expanded ref model body[32m 1[2mms[22m[39m
|
|
73
|
+
[32m✓[39m uses first enum value in body[32m 0[2mms[22m[39m
|
|
74
|
+
[32m✓[39m uses example values for nested array fields in body[32m 0[2mms[22m[39m
|
|
75
|
+
[32m✓[39m leaves ref fields as empty objects in body[32m 0[2mms[22m[39m
|
|
76
|
+
[32m✓[39m generates body with type: multipart-form for multipart requests[32m 0[2mms[22m[39m
|
|
77
|
+
[32m✓[39m does not generate body block when no request body[32m 0[2mms[22m[39m
|
|
78
|
+
[32m✓[39m handles empty roots array[32m 0[2mms[22m[39m
|
|
79
|
+
[32m✓[39m derives folder name from file path with directory prefix[32m 0[2mms[22m[39m
|
|
80
|
+
[32m✓[39m does not generate any .bru files[32m 0[2mms[22m[39m
|
|
81
|
+
[32m✓[39m adds bearer auth block to opencollection.yml when security config provided[32m 0[2mms[22m[39m
|
|
82
|
+
[32m✓[39m adds apikey auth block to opencollection.yml[32m 0[2mms[22m[39m
|
|
83
|
+
[32m✓[39m adds basic auth block to opencollection.yml[32m 0[2mms[22m[39m
|
|
84
|
+
[32m✓[39m adds auth env vars to local.yml for bearer[32m 0[2mms[22m[39m
|
|
85
|
+
[32m✓[39m does not add request or auth to opencollection.yml when no security config[32m 0[2mms[22m[39m
|
|
86
|
+
[32m✓[39m adds auth: none inside http block when operation security is none[32m 0[2mms[22m[39m
|
|
87
|
+
[32m✓[39m adds auth: inherit inside http block for normal operations when default scheme is set[32m 0[2mms[22m[39m
|
|
88
|
+
[32m✓[39m does not add auth when no default scheme is set[32m 0[2mms[22m[39m
|
|
89
|
+
[32m✓[39m emits a status-code assertion using the first declared 2xx response[32m 0[2mms[22m[39m
|
|
90
|
+
[32m✓[39m falls back to the first response when no 2xx is declared[32m 0[2mms[22m[39m
|
|
91
|
+
[32m✓[39m does not emit a runtime block when the operation declares no responses[32m 0[2mms[22m[39m
|
|
92
|
+
[32m✓[39m emits assertions for required response headers and lists them in the docs[32m 0[2mms[22m[39m
|
|
93
|
+
[32m✓[39m emits a docs block from the operation description[32m 0[2mms[22m[39m
|
|
94
|
+
[32m✓[39m combines route and operation descriptions into the docs block[32m 0[2mms[22m[39m
|
|
95
|
+
[32m✓[39m does not emit a docs block when no description is set[32m 0[2mms[22m[39m
|
|
96
|
+
[32m✓[39m marks optional query params with disabled: true[32m 0[2mms[22m[39m
|
|
97
|
+
[32m✓[39m marks optional headers with disabled: true[32m 0[2mms[22m[39m
|
|
98
|
+
[32m✓[39m does not mark path params as disabled even though they have no optional flag[32m 0[2mms[22m[39m
|
|
99
|
+
[32m✓[39m marks optional fields from a ref-expanded query model as disabled[32m 0[2mms[22m[39m
|
|
100
|
+
[32m✓[39m emits a manifest listing every generated file[32m 0[2mms[22m[39m
|
|
101
|
+
[32m✓[39m parseManifest returns [] for malformed input[32m 0[2mms[22m[39m
|
|
102
|
+
[32m✓[39m emits Bruno faker templates for compatible scalar params when randomExamples is true[32m 0[2mms[22m[39m
|
|
103
|
+
[32m✓[39m keeps deterministic placeholders when randomExamples is false[32m 0[2mms[22m[39m
|
|
104
|
+
[32m✓[39m uses faker templates inside JSON body skeletons for string-valued scalars[32m 0[2mms[22m[39m
|
|
105
|
+
[32m✓[39m does not override field defaults when randomExamples is true[32m 0[2mms[22m[39m
|
|
106
|
+
[32m✓[39m sanitizePath [2m(5)[22m
|
|
107
|
+
[32m✓[39m converts simple path to filename-safe string[32m 0[2mms[22m[39m
|
|
108
|
+
[32m✓[39m replaces path params with their names[32m 0[2mms[22m[39m
|
|
109
|
+
[32m✓[39m handles multiple segments and params[32m 0[2mms[22m[39m
|
|
110
|
+
[32m✓[39m returns root for bare slash[32m 0[2mms[22m[39m
|
|
111
|
+
[32m✓[39m collapses consecutive dashes[32m 0[2mms[22m[39m
|
|
112
|
+
|
|
113
|
+
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
|
114
|
+
[2m Tests [22m [1m[32m85 passed[39m[22m[90m (85)[39m
|
|
115
|
+
[2m Start at [22m 08:51:09
|
|
116
|
+
[2m Duration [22m 1.08s[2m (transform 161ms, setup 0ms, import 586ms, tests 11ms, environment 0ms)[22m
|
|
117
|
+
|
|
118
|
+
[34m % [39m[2mCoverage report from [22m[33mv8[39m
|
|
119
|
+
-------------------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------
|
|
120
|
+
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
|
|
121
|
+
-------------------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------
|
|
122
|
+
[32;1mAll files [0m | [32;1m 83.77[0m | [33;1m 74.26[0m | [32;1m 84.05[0m | [32;1m 85.42[0m | [31;1m [0m
|
|
123
|
+
[32;1m src [0m | [32;1m 86.1[0m | [33;1m 75.1[0m | [32;1m 90.9[0m | [32;1m 87.54[0m | [31;1m [0m
|
|
124
|
+
[32;1m codegen-bruno.ts[0m | [32;1m 86.1[0m | [33;1m 75.1[0m | [32;1m 90.9[0m | [32;1m 87.54[0m | [31;1m239-240,324,332,385-388,395-402,422,428,432-434,450,460,484,494-496,502-504,509,513-521,530,534[0m
|
|
125
|
+
[33;1m tests [0m | [33;1m 68.18[0m | [33;1m 67.74[0m | [33;1m 72[0m | [33;1m 71.05[0m | [31;1m [0m
|
|
126
|
+
[33;1m helpers.ts [0m | [33;1m 68.18[0m | [33;1m 67.74[0m | [33;1m 72[0m | [33;1m 71.05[0m | [31;1m43-47,55-59,71,113,131-135,145 [0m
|
|
127
|
+
-------------------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------
|
|
128
|
+
[?25h
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
> @contractkit/plugin-bruno@0.9.0 test /Users/robert/projects/contractkit/packages/plugin-bruno
|
|
3
|
+
> vitest run
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/Users/robert/projects/contractkit/packages/plugin-bruno[39m
|
|
7
|
+
|
|
8
|
+
[32m✓[39m tests/codegen-bruno.test.ts [2m([22m[2m85 tests[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
9
|
+
|
|
10
|
+
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
|
11
|
+
[2m Tests [22m [1m[32m85 passed[39m[22m[90m (85)[39m
|
|
12
|
+
[2m Start at [22m 08:51:33
|
|
13
|
+
[2m Duration [22m 414ms[2m (transform 136ms, setup 0ms, import 255ms, tests 9ms, environment 0ms)[22m
|
|
14
|
+
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# @contractkit/contractkit-plugin-bruno
|
|
2
|
+
|
|
3
|
+
## 0.9.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [c9f2166]
|
|
8
|
+
- @contractkit/core@0.11.0
|
|
9
|
+
|
|
10
|
+
## 0.9.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.8.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.7.1
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [d13614c]
|
|
32
|
+
- @maroonedsoftware/contractkit@0.9.0
|
|
33
|
+
|
|
34
|
+
## 0.7.0
|
|
35
|
+
|
|
36
|
+
### Minor Changes
|
|
37
|
+
|
|
38
|
+
- 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.
|
|
39
|
+
|
|
40
|
+
### Patch Changes
|
|
41
|
+
|
|
42
|
+
- Updated dependencies [353aa10]
|
|
43
|
+
- Updated dependencies [888ded5]
|
|
44
|
+
- @maroonedsoftware/contractkit@0.8.0
|
|
45
|
+
|
|
46
|
+
## 0.6.0
|
|
47
|
+
|
|
48
|
+
### Minor Changes
|
|
49
|
+
|
|
50
|
+
- 5d42e39: Enhance Python and TypeScript SDKs to support typed response headers. Updated the Python client to generate `TypedDict` for response headers and modified return types accordingly. The TypeScript SDK now includes runtime assertions for required headers and documents them in the generated markdown. Tests were added to verify the correct handling of response headers in both SDKs.
|
|
51
|
+
|
|
52
|
+
## 0.5.1
|
|
53
|
+
|
|
54
|
+
### Patch Changes
|
|
55
|
+
|
|
56
|
+
- Updated dependencies [16ac3a7]
|
|
57
|
+
- @maroonedsoftware/contractkit@0.7.0
|
|
58
|
+
|
|
59
|
+
## 0.5.0
|
|
60
|
+
|
|
61
|
+
### Minor Changes
|
|
62
|
+
|
|
63
|
+
- 5ccdeea: Enhance contractkit-plugin-bruno by adding support for random example generation in request files. Introduced a manifest file to track generated files, enabling cleanup of stale outputs while preserving user-added files. Updated README and tests to reflect these changes.
|
|
64
|
+
|
|
65
|
+
## 0.4.1
|
|
66
|
+
|
|
67
|
+
### Patch Changes
|
|
68
|
+
|
|
69
|
+
- Updated dependencies [d3ea773]
|
|
70
|
+
- @maroonedsoftware/contractkit@0.6.0
|
|
71
|
+
|
|
72
|
+
## 0.4.0
|
|
73
|
+
|
|
74
|
+
### Minor Changes
|
|
75
|
+
|
|
76
|
+
- 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.
|
|
77
|
+
|
|
78
|
+
### Patch Changes
|
|
79
|
+
|
|
80
|
+
- Updated dependencies [181dadb]
|
|
81
|
+
- @maroonedsoftware/contractkit@0.5.0
|
|
82
|
+
|
|
83
|
+
## 0.3.0
|
|
84
|
+
|
|
85
|
+
### Minor Changes
|
|
86
|
+
|
|
87
|
+
- 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.
|
|
88
|
+
|
|
89
|
+
### Patch Changes
|
|
90
|
+
|
|
91
|
+
- Updated dependencies [ada5f84]
|
|
92
|
+
- @maroonedsoftware/contractkit@0.4.0
|
|
93
|
+
|
|
94
|
+
## 0.2.1
|
|
95
|
+
|
|
96
|
+
### Patch Changes
|
|
97
|
+
|
|
98
|
+
- Updated dependencies [f396a68]
|
|
99
|
+
- @maroonedsoftware/contractkit@0.3.0
|
|
100
|
+
|
|
101
|
+
## 0.2.0
|
|
102
|
+
|
|
103
|
+
### Minor Changes
|
|
104
|
+
|
|
105
|
+
- db7345b: updating to contractkit as the org
|
|
106
|
+
|
|
107
|
+
### Patch Changes
|
|
108
|
+
|
|
109
|
+
- Updated dependencies [db7345b]
|
|
110
|
+
- @contractkit/core@0.2.0
|
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# @contractkit/contractkit-plugin-bruno
|
|
2
|
+
|
|
3
|
+
ContractKit plugin that generates a [Bruno](https://www.usebruno.com/) REST API collection from `.ck` operation files. The output is a ready-to-open OpenCollection directory.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @contractkit/contractkit-plugin-bruno
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Configuration
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"plugins": {
|
|
16
|
+
"@contractkit/contractkit-plugin-bruno": {
|
|
17
|
+
"output": "bruno-collection",
|
|
18
|
+
"collectionName": "Acme API",
|
|
19
|
+
"auth": {
|
|
20
|
+
"defaultScheme": "bearerAuth",
|
|
21
|
+
"schemes": {
|
|
22
|
+
"bearerAuth": {
|
|
23
|
+
"type": "http",
|
|
24
|
+
"scheme": "bearer"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Options
|
|
34
|
+
|
|
35
|
+
| Option | Type | Default | Description |
|
|
36
|
+
|---|---|---|---|
|
|
37
|
+
| `baseDir` | `string` | `rootDir` | Base directory for the output |
|
|
38
|
+
| `output` | `string` | `"bruno-collection"` | Output directory name |
|
|
39
|
+
| `collectionName` | `string` | basename of `rootDir` | Collection name shown in Bruno |
|
|
40
|
+
| `randomExamples` | `boolean` | `true` | Use Bruno faker templates (`{{$randomUUID}}`, `{{$randomEmail}}`, etc.) for compatible scalar fields so each send produces fresh data. Set to `false` for stable, deterministic placeholders. |
|
|
41
|
+
| `auth.defaultScheme` | `string` | — | Key from `auth.schemes` to apply by default |
|
|
42
|
+
| `auth.schemes` | `object` | — | Map of scheme name → security scheme definition |
|
|
43
|
+
|
|
44
|
+
### Auth scheme types
|
|
45
|
+
|
|
46
|
+
| `type` | Required fields | Description |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| `"http"` with `scheme: "bearer"` | — | Bearer token auth |
|
|
49
|
+
| `"http"` with `scheme: "basic"` | — | HTTP Basic auth |
|
|
50
|
+
| `"apiKey"` | `name`, `in` (`"header"` or `"query"`) | API key in a header or query param |
|
|
51
|
+
|
|
52
|
+
## Output structure
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
bruno-collection/
|
|
56
|
+
├── bruno.json # Collection manifest
|
|
57
|
+
├── environments/
|
|
58
|
+
│ └── Local.bru # Default environment with base URL variable
|
|
59
|
+
└── <area>/
|
|
60
|
+
└── <operation>.bru # One request file per HTTP verb per operation
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The output directory is fully replaced on each run — stale request files from removed operations are automatically cleaned up.
|
|
64
|
+
|
|
65
|
+
## Programmatic use
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import { createBrunoPlugin } from '@contractkit/contractkit-plugin-bruno';
|
|
69
|
+
|
|
70
|
+
const plugin = createBrunoPlugin({
|
|
71
|
+
output: 'bruno-collection',
|
|
72
|
+
collectionName: 'My API',
|
|
73
|
+
auth: {
|
|
74
|
+
defaultScheme: 'bearerAuth',
|
|
75
|
+
schemes: {
|
|
76
|
+
bearerAuth: { type: 'http', scheme: 'bearer' },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
```
|
|
@@ -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
|
+
}
|