@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.
@@ -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
+ CLI Building entry: src/index.ts
26
+ CLI Using tsconfig: tsconfig.json
27
+ CLI tsup v8.5.1
28
+ CLI Target: esnext
29
+ ESM Build start
30
+ ESM dist/index.js 19.94 KB
31
+ ESM dist/index.js.map 46.49 KB
32
+ ESM ⚡️ 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
+  RUN  v4.1.5 /Users/robert/projects/contractkit/packages/plugin-bruno
8
+ Coverage enabled with v8
9
+
10
+ [?2026h
11
+  ❯ tests/codegen-bruno.test.ts [queued]
12
+
13
+  Test Files 0 passed (1)
14
+  Tests 0 passed (0)
15
+  Start at 08:51:09
16
+  Duration 407ms
17
+ [?2026l[?2026h
18
+  ❯ tests/codegen-bruno.test.ts [queued]
19
+
20
+  Test Files 0 passed (1)
21
+  Tests 0 passed (0)
22
+  Start at 08:51:09
23
+  Duration 927ms
24
+ [?2026l ✓ tests/codegen-bruno.test.ts (85 tests) 11ms
25
+ ✓ generateOpenCollection (80)
26
+ ✓ generates opencollection.yml with correct spec version and collection name 2ms
27
+ ✓ generates Local environment file with baseUrl variable 0ms
28
+ ✓ emits requests for internal operations by default 0ms
29
+ ✓ skips internal operations when includeInternal is false 0ms
30
+ ✓ creates one folder per op root file 0ms
31
+ ✓ folder.yml has info block with name, type: folder, and seq 0ms
32
+ ✓ generates one .yml file per route+method combination 0ms
33
+ ✓ request info block has name, type: http, and seq 0ms
34
+ ✓ seq increments across operations within a folder 0ms
35
+ ✓ uses slugified name as filename when op.name is set 0ms
36
+ ✓ falls back to method-path filename when op.name is not set 0ms
37
+ ✓ uses area meta as the top-level folder name 0ms
38
+ ✓ falls back to filename when no area meta 0ms
39
+ ✓ places request files in subfolder when subarea meta is set 0ms
40
+ ✓ generates folder.yml for subarea with correct name 0ms
41
+ ✓ still generates top-level folder.yml when subarea is set 0ms
42
+ ✓ slugifies subarea for the folder path 0ms
43
+ ✓ places request files directly in folder when no subarea 0ms
44
+ ✓ uses {{baseUrl}} prefix and Bruno :param syntax for path params 0ms
45
+ ✓ generates path params as flat array entries with type: path 0ms
46
+ ✓ uses uuid example value for uuid path params 0ms
47
+ ✓ uses typed example values for scalar path params 0ms
48
+ ✓ uses ISO 8601 duration example value for duration path params 0ms
49
+ ✓ uses first enum value as example for enum path params 0ms
50
+ ✓ falls back to empty string for untyped path params 0ms
51
+ ✓ does not generate params block when path has no params and no query 0ms
52
+ ✓ generates query params as flat array entries with type: query 0ms
53
+ ✓ uses typed example values for query params 0ms
54
+ ✓ falls back to single placeholder entry for ref query params with no registry 0ms
55
+ ✓ expands ref query params into individual fields when model registry provided 0ms
56
+ ✓ mixes path and query params in the same flat array 0ms
57
+ ✓ generates headers block from op.headers inline params 0ms
58
+ ✓ falls back to single placeholder entry for ref header source with no registry 0ms
59
+ ✓ expands ref header source into individual fields when model registry provided 0ms
60
+ ✓ does not generate headers block when op has no headers 0ms
61
+ ✓ generates body with type: json and data block literal for JSON requests 0ms
62
+ ✓ expands inline object body type into a JSON skeleton 0ms
63
+ ✓ uses ISO 8601 duration example value in body skeleton 0ms
64
+ ✓ excludes readonly fields from inline object body skeleton 0ms
65
+ ✓ uses empty object for ref body types when no contractRoots provided 0ms
66
+ ✓ expands ref body type into a JSON skeleton when contractRoots provided 0ms
67
+ ✓ excludes readonly fields from expanded ref body 0ms
68
+ ✓ sets optional fields to null in expanded ref body 0ms
69
+ ✓ expands inherited fields from base model in ref body 0ms
70
+ ✓ uses field default value in body for non-optional fields 0ms
71
+ ✓ uses field default value in body for optional fields 0ms
72
+ ✓ uses field defaults from expanded ref model body 1ms
73
+ ✓ uses first enum value in body 0ms
74
+ ✓ uses example values for nested array fields in body 0ms
75
+ ✓ leaves ref fields as empty objects in body 0ms
76
+ ✓ generates body with type: multipart-form for multipart requests 0ms
77
+ ✓ does not generate body block when no request body 0ms
78
+ ✓ handles empty roots array 0ms
79
+ ✓ derives folder name from file path with directory prefix 0ms
80
+ ✓ does not generate any .bru files 0ms
81
+ ✓ adds bearer auth block to opencollection.yml when security config provided 0ms
82
+ ✓ adds apikey auth block to opencollection.yml 0ms
83
+ ✓ adds basic auth block to opencollection.yml 0ms
84
+ ✓ adds auth env vars to local.yml for bearer 0ms
85
+ ✓ does not add request or auth to opencollection.yml when no security config 0ms
86
+ ✓ adds auth: none inside http block when operation security is none 0ms
87
+ ✓ adds auth: inherit inside http block for normal operations when default scheme is set 0ms
88
+ ✓ does not add auth when no default scheme is set 0ms
89
+ ✓ emits a status-code assertion using the first declared 2xx response 0ms
90
+ ✓ falls back to the first response when no 2xx is declared 0ms
91
+ ✓ does not emit a runtime block when the operation declares no responses 0ms
92
+ ✓ emits assertions for required response headers and lists them in the docs 0ms
93
+ ✓ emits a docs block from the operation description 0ms
94
+ ✓ combines route and operation descriptions into the docs block 0ms
95
+ ✓ does not emit a docs block when no description is set 0ms
96
+ ✓ marks optional query params with disabled: true 0ms
97
+ ✓ marks optional headers with disabled: true 0ms
98
+ ✓ does not mark path params as disabled even though they have no optional flag 0ms
99
+ ✓ marks optional fields from a ref-expanded query model as disabled 0ms
100
+ ✓ emits a manifest listing every generated file 0ms
101
+ ✓ parseManifest returns [] for malformed input 0ms
102
+ ✓ emits Bruno faker templates for compatible scalar params when randomExamples is true 0ms
103
+ ✓ keeps deterministic placeholders when randomExamples is false 0ms
104
+ ✓ uses faker templates inside JSON body skeletons for string-valued scalars 0ms
105
+ ✓ does not override field defaults when randomExamples is true 0ms
106
+ ✓ sanitizePath (5)
107
+ ✓ converts simple path to filename-safe string 0ms
108
+ ✓ replaces path params with their names 0ms
109
+ ✓ handles multiple segments and params 0ms
110
+ ✓ returns root for bare slash 0ms
111
+ ✓ collapses consecutive dashes 0ms
112
+
113
+  Test Files  1 passed (1)
114
+  Tests  85 passed (85)
115
+  Start at  08:51:09
116
+  Duration  1.08s (transform 161ms, setup 0ms, import 586ms, tests 11ms, environment 0ms)
117
+
118
+  % Coverage report from v8
119
+ -------------------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------
120
+ File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
121
+ -------------------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------
122
+ All files  |  83.77 |  74.26 |  84.05 |  85.42 |  
123
+  src  |  86.1 |  75.1 |  90.9 |  87.54 |  
124
+  codegen-bruno.ts |  86.1 |  75.1 |  90.9 |  87.54 | 239-240,324,332,385-388,395-402,422,428,432-434,450,460,484,494-496,502-504,509,513-521,530,534
125
+  tests  |  68.18 |  67.74 |  72 |  71.05 |  
126
+  helpers.ts  |  68.18 |  67.74 |  72 |  71.05 | 43-47,55-59,71,113,131-135,145 
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
+  RUN  v4.1.5 /Users/robert/projects/contractkit/packages/plugin-bruno
7
+
8
+ ✓ tests/codegen-bruno.test.ts (85 tests) 9ms
9
+
10
+  Test Files  1 passed (1)
11
+  Tests  85 passed (85)
12
+  Start at  08:51:33
13
+  Duration  414ms (transform 136ms, setup 0ms, import 255ms, tests 9ms, environment 0ms)
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
+ }