lcov-badge2 1.0.3 → 1.1.0

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/.editorconfig ADDED
@@ -0,0 +1,16 @@
1
+ # Editor configuration, see https://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ indent_style = space
7
+ indent_size = 4
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.{json,yml}]
12
+ indent_size = 2
13
+ max_line_length = off
14
+
15
+ [*.md]
16
+ max_line_length = off
package/.eslintrc.yml ADDED
@@ -0,0 +1,343 @@
1
+ root: true
2
+ parser: '@typescript-eslint/parser'
3
+ parserOptions:
4
+ project: tsconfig.json
5
+ sourceType: module
6
+ env:
7
+ node: true
8
+ jest: true
9
+ jest/globals: true
10
+ plugins:
11
+ - '@typescript-eslint'
12
+ - 'import'
13
+ - 'jest'
14
+ - 'unicorn'
15
+ extends:
16
+ - 'eslint:recommended'
17
+ - 'plugin:@typescript-eslint/eslint-recommended'
18
+ - 'plugin:@typescript-eslint/recommended'
19
+ settings:
20
+ import/internal-regex: '^(config|core|http-server|logging|operation-log|persistence|test|utils)/'
21
+ rules:
22
+ array-bracket-spacing:
23
+ - error
24
+ - never
25
+ arrow-parens: error
26
+ arrow-spacing: error
27
+ block-spacing:
28
+ - error
29
+ - always
30
+ brace-style:
31
+ - error
32
+ - 1tbs
33
+ camelcase: off
34
+ class-methods-use-this:
35
+ - warn
36
+ - exceptMethods:
37
+ - 'intercept'
38
+ - 'configure'
39
+ - 'getSession'
40
+ complexity: error
41
+ comma-dangle:
42
+ - warn
43
+ - always-multiline
44
+ computed-property-spacing:
45
+ - error
46
+ - never
47
+ constructor-super: error
48
+ curly: error
49
+ dot-notation: error
50
+ eol-last: error
51
+ eqeqeq:
52
+ - error
53
+ - always
54
+ - null: never
55
+ func-call-spacing:
56
+ - error
57
+ - never
58
+ func-style:
59
+ - error
60
+ - declaration
61
+ generator-star-spacing: error
62
+ guard-for-in: error
63
+ key-spacing: error
64
+ keyword-spacing: error
65
+ linebreak-style: error
66
+ max-len:
67
+ - error
68
+ - code: 120
69
+ ignoreTemplateLiterals: true
70
+ ignoreComments: true
71
+ new-parens: error
72
+ no-bitwise: error
73
+ no-caller: error
74
+ no-console: error
75
+ no-constant-condition: error
76
+ no-debugger: error
77
+ no-delete-var: error
78
+ no-eval: error
79
+ no-extra-bind: error
80
+ no-extra-semi: error
81
+ no-invalid-this: error
82
+ no-invalid-regexp: error
83
+ no-irregular-whitespace: error
84
+ no-multi-spaces:
85
+ - error
86
+ - ignoreEOLComments: true
87
+ no-multi-str: error
88
+ no-multiple-empty-lines:
89
+ - error
90
+ - max: 1
91
+ maxBOF: 0
92
+ maxEOF: 1
93
+ no-new-func: error
94
+ no-new-wrappers: error
95
+ no-octal-escape: error
96
+ no-param-reassign: error
97
+ no-plusplus:
98
+ - error
99
+ - allowForLoopAfterthoughts: true
100
+ no-regex-spaces: error
101
+ no-restricted-imports:
102
+ # this is a workaround for this bug: https://github.com/benmosher/eslint-plugin-import/issues/1610
103
+ - error
104
+ - patterns:
105
+ - '../*'
106
+ no-return-await: error
107
+ no-sequences: error
108
+ no-shadow: off # replaced by typescript-eslint/no-shadow rule below because of: https://github.com/typescript-eslint/typescript-eslint/issues/2471
109
+ no-sparse-arrays: error
110
+ no-template-curly-in-string: error
111
+ no-trailing-spaces: error
112
+ no-undef-init: error
113
+ no-unsafe-finally: error
114
+ no-unused-expressions: off
115
+ no-unused-labels: error
116
+ no-useless-rename: error
117
+ no-var: error
118
+ no-void: error
119
+ no-warning-comments: warn
120
+ no-whitespace-before-property: error
121
+ no-with: error
122
+ object-curly-spacing:
123
+ - error
124
+ - always
125
+ object-shorthand:
126
+ - error
127
+ - always
128
+ - avoidQuotes: true
129
+ one-var:
130
+ - error
131
+ - never
132
+ padded-blocks:
133
+ - error
134
+ - never
135
+ prefer-const: error
136
+ prefer-object-spread: error
137
+ prefer-template: error
138
+ quotes:
139
+ - error
140
+ - single
141
+ - avoidEscape: true
142
+ quote-props:
143
+ - error
144
+ - as-needed
145
+ radix: error
146
+ rest-spread-spacing: error
147
+ semi-spacing: error
148
+ space-before-function-paren:
149
+ - error
150
+ - asyncArrow: always
151
+ anonymous: always
152
+ named: never
153
+ space-in-parens:
154
+ - error
155
+ - never
156
+ space-infix-ops: error
157
+ space-unary-ops: error
158
+ spaced-comment: error
159
+ switch-colon-spacing: error
160
+ template-curly-spacing: error
161
+ template-tag-spacing: error
162
+ use-isnan: error
163
+ valid-typeof: error
164
+ yield-star-spacing: error
165
+
166
+ import/export: error
167
+ import/first: error
168
+ import/no-cycle: error
169
+ import/order:
170
+ - error
171
+ - groups:
172
+ - [builtin, external]
173
+ - [internal]
174
+ - [sibling, parent, index]
175
+ newlines-between: always
176
+ alphabetize:
177
+ order: asc
178
+ import/no-deprecated: warn
179
+ import/no-duplicates: error
180
+ import/no-extraneous-dependencies: error
181
+ import/no-mutable-exports: error
182
+ import/no-relative-parent-imports: error
183
+ import/no-unused-modules: error
184
+ jest/consistent-test-it:
185
+ - error
186
+ - fn: test
187
+ jest/expect-expect:
188
+ - error
189
+ - assertFunctionNames:
190
+ - expect
191
+ - assert*
192
+ jest/no-alias-methods: error
193
+ jest/no-commented-out-tests: warn
194
+ jest/no-deprecated-functions: warn
195
+ jest/no-disabled-tests: warn
196
+ # https://github.com/jest-community/eslint-plugin-jest/issues/642
197
+ # jest/no-duplicate-hooks: error
198
+ jest/no-export: error
199
+ jest/no-focused-tests: error
200
+ jest/no-identical-title: error
201
+ jest/no-if: warn
202
+ jest/no-jasmine-globals: error
203
+ jest/no-mocks-import: error
204
+ jest/no-standalone-expect:
205
+ - error
206
+ - additionalTestBlockFunctions:
207
+ - beforeEach
208
+ jest/no-test-prefixes: warn
209
+ jest/no-test-return-statement: error
210
+ jest/prefer-lowercase-title:
211
+ - error
212
+ - ignore:
213
+ - describe
214
+ jest/prefer-spy-on: error
215
+ jest/prefer-to-be: error
216
+ jest/prefer-to-contain: error
217
+ jest/prefer-to-have-length: warn
218
+ jest/prefer-todo: error
219
+ jest/require-to-throw-message: error
220
+ jest/valid-describe-callback: error
221
+ jest/valid-expect: error
222
+ jest/valid-expect-in-promise: error
223
+ unicorn/filename-case: error
224
+
225
+ # typescript-specific
226
+ '@typescript-eslint/array-type':
227
+ - error
228
+ - default: array
229
+ '@typescript-eslint/await-thenable': error
230
+ '@typescript-eslint/adjacent-overload-signatures': error
231
+ '@typescript-eslint/consistent-type-assertions':
232
+ - error
233
+ - assertionStyle: as
234
+ '@typescript-eslint/explicit-function-return-type':
235
+ - error
236
+ - allowExpressions: true
237
+ '@typescript-eslint/explicit-module-boundary-types':
238
+ - error
239
+ - allowHigherOrderFunctions: true
240
+ allowTypedFunctionExpressions: true
241
+ '@typescript-eslint/member-delimiter-style':
242
+ - error
243
+ - singleline:
244
+ delimiter: comma
245
+ requireLast: false
246
+ '@typescript-eslint/member-ordering':
247
+ - error
248
+ - default:
249
+ - static-field
250
+ - instance-field
251
+ - static-method
252
+ - instance-method
253
+ '@typescript-eslint/naming-convention':
254
+ - error
255
+ - selector: default
256
+ format:
257
+ - camelCase
258
+ leadingUnderscore: allow
259
+ trailingUnderscore: forbid
260
+ - selector: variable
261
+ format:
262
+ - camelCase
263
+ - PascalCase
264
+ - UPPER_CASE
265
+ leadingUnderscore: allow
266
+ - selector: function
267
+ format:
268
+ - camelCase
269
+ - PascalCase
270
+ - selector: property
271
+ format:
272
+ - camelCase
273
+ - PascalCase
274
+ - snake_case
275
+ - UPPER_CASE
276
+ leadingUnderscore: allow
277
+ - selector: enumMember
278
+ format:
279
+ - PascalCase
280
+ - selector: typeLike
281
+ format:
282
+ - PascalCase
283
+ '@typescript-eslint/no-array-constructor': error
284
+ '@typescript-eslint/no-dynamic-delete': error
285
+ '@typescript-eslint/no-explicit-any': error
286
+ '@typescript-eslint/no-empty-function':
287
+ - error
288
+ - allow:
289
+ - 'arrowFunctions'
290
+ '@typescript-eslint/no-empty-interface':
291
+ - error
292
+ - allowSingleExtends: true
293
+ '@typescript-eslint/no-extraneous-class': error
294
+ '@typescript-eslint/no-floating-promises': error
295
+ '@typescript-eslint/no-for-in-array': error
296
+ '@typescript-eslint/no-misused-new': error
297
+ '@typescript-eslint/no-require-imports': error
298
+ "@typescript-eslint/no-shadow": error
299
+ '@typescript-eslint/no-this-alias': error
300
+ '@typescript-eslint/no-throw-literal': error
301
+ '@typescript-eslint/no-unnecessary-qualifier': error
302
+ '@typescript-eslint/no-unnecessary-type-arguments': error
303
+ '@typescript-eslint/no-unnecessary-type-assertion': error
304
+ '@typescript-eslint/no-unused-vars':
305
+ - error
306
+ - ignoreRestSiblings: true
307
+ argsIgnorePattern: 'error|_.*'
308
+ varsIgnorePattern: '^_.*'
309
+ '@typescript-eslint/no-use-before-define':
310
+ - error
311
+ - functions: false
312
+ classes: false
313
+ '@typescript-eslint/no-useless-constructor': error
314
+ '@typescript-eslint/no-var-requires': error
315
+ '@typescript-eslint/prefer-for-of': error
316
+ '@typescript-eslint/prefer-function-type': error
317
+ '@typescript-eslint/prefer-nullish-coalescing': warn
318
+ '@typescript-eslint/prefer-optional-chain': error
319
+ '@typescript-eslint/prefer-readonly': error
320
+ '@typescript-eslint/promise-function-async': error
321
+ '@typescript-eslint/require-await': error
322
+ '@typescript-eslint/restrict-plus-operands': error
323
+ '@typescript-eslint/semi': error
324
+ '@typescript-eslint/type-annotation-spacing': error
325
+ '@typescript-eslint/unbound-method':
326
+ - error
327
+ - ignoreStatic: true
328
+ '@typescript-eslint/unified-signatures': error
329
+ overrides:
330
+ - files:
331
+ - 'cli*.ts'
332
+ - 'main*.ts'
333
+ rules:
334
+ no-console: off
335
+ - files:
336
+ - '*.spec.ts'
337
+ rules:
338
+ class-methods-use-this: off
339
+ no-unused-expressions: off
340
+ '@typescript-eslint/no-empty-function': off
341
+ '@typescript-eslint/no-explicit-any': off
342
+ '@typescript-eslint/unbound-method': off
343
+ '@typescript-eslint/ban-types': off
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: npm
4
+ directory: '/'
5
+ schedule:
6
+ interval: weekly
7
+ - package-ecosystem: github-actions
8
+ directory: '/'
9
+ schedule:
10
+ interval: weekly
@@ -0,0 +1,37 @@
1
+ name: "CodeQL"
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ # The branches below must be a subset of the branches above
8
+ branches: [ master ]
9
+ schedule:
10
+ - cron: '19 4 * * 5'
11
+
12
+ jobs:
13
+ analyze:
14
+ name: Analyze
15
+ runs-on: ubuntu-latest
16
+ permissions:
17
+ actions: read
18
+ contents: read
19
+ security-events: write
20
+
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ language: [ 'typescript' ]
25
+
26
+ steps:
27
+ - name: Checkout repository
28
+ uses: actions/checkout@v4
29
+
30
+ - name: Initialize CodeQL
31
+ uses: github/codeql-action/init@v2
32
+ with:
33
+ languages: ${{ matrix.language }}
34
+ - name: Autobuild
35
+ uses: github/codeql-action/autobuild@v2
36
+ - name: Perform CodeQL Analysis
37
+ uses: github/codeql-action/analyze@v2
@@ -0,0 +1,31 @@
1
+ name: Build
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - '*'
7
+ pull_request:
8
+ branches:
9
+ - master
10
+
11
+ jobs:
12
+ build:
13
+ runs-on: ubuntu-latest
14
+ strategy:
15
+ matrix:
16
+ node-version: [16.x, 18.x, 20.x]
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ - name: Use Node.js ${{ matrix.node-version }}
21
+ uses: actions/setup-node@v3
22
+ with:
23
+ node-version: ${{ matrix.node-version }}
24
+ - run: npm ci
25
+ - run: npm run build --if-present
26
+ - run: npm run coverage
27
+ - run: npm run lint
28
+ - name: Codecov
29
+ uses: codecov/codecov-action@v3.1.4
30
+ with:
31
+ directory: ./coverage
package/SECURITY.md ADDED
@@ -0,0 +1,14 @@
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ Currently, there's only one major and minor version, so of course it's supported!
6
+
7
+ | Version | Supported |
8
+ | ------- | ------------------- |
9
+ | 1.0.x | :heavy_check_mark: |
10
+
11
+ ## Reporting a Vulnerability
12
+
13
+ If you notice a vulnerability, please open an issue or, if you'd like to fix it yourself, a pull request.
14
+ You can expect a response within a couple of days at the latest.
package/gulpfile.mjs ADDED
@@ -0,0 +1,20 @@
1
+ import { deleteAsync } from 'del';
2
+ import gulp from 'gulp';
3
+ import header from 'gulp-header';
4
+
5
+ export async function clean() {
6
+ await deleteAsync(['dist']);
7
+ }
8
+
9
+ function addShebang() {
10
+ return gulp.src('dist/main.js')
11
+ .pipe(header('#!/usr/bin/env node\n'))
12
+ .pipe(gulp.dest('dist'));
13
+ }
14
+
15
+ function copyPackageFiles() {
16
+ return gulp.src(['package.json', 'README.md', 'LICENSE'])
17
+ .pipe(gulp.dest('dist'));
18
+ }
19
+
20
+ export const postbuild = gulp.series(addShebang, copyPackageFiles);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lcov-badge2",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "description": "Generate a badge from a LCOV report",
5
5
  "keywords": [
6
6
  "lcov",
@@ -32,33 +32,31 @@
32
32
  "lint": "eslint src/**/*.ts"
33
33
  },
34
34
  "dependencies": {
35
- "badge-up": "^3.0.0",
35
+ "badge-up2": "^1.0.0",
36
36
  "minimist": "^1.2.5",
37
37
  "minimist-options": "^4.1.0",
38
38
  "parse-lcov": "^1.0.4"
39
39
  },
40
40
  "devDependencies": {
41
- "@types/jest": "^27.0.3",
41
+ "@types/jest": "^29.2.0",
42
42
  "@types/minimist": "^1.2.2",
43
- "@types/minimist-options": "^4.0.1",
44
- "@types/node": "^16.11.12",
45
- "@typescript-eslint/eslint-plugin": "^5.6.0",
46
- "@typescript-eslint/parser": "^5.6.0",
47
- "del": "^6.0.0",
43
+ "@types/node": "^20.3.3",
44
+ "@typescript-eslint/eslint-plugin": "^6.4.1",
45
+ "@typescript-eslint/parser": "^6.4.1",
46
+ "del": "^7.0.0",
48
47
  "eslint": "^8.4.1",
49
48
  "eslint-plugin-import": "^2.25.3",
50
- "eslint-plugin-jest": "^25.3.0",
51
- "eslint-plugin-unicorn": "^39.0.0",
49
+ "eslint-plugin-jest": "^27.1.3",
50
+ "eslint-plugin-unicorn": "^48.0.1",
52
51
  "gulp": "^4.0.2",
53
52
  "gulp-header": "^2.0.9",
54
- "jest": "^27.4.4",
55
- "pre-commit": "^1.2.2",
56
- "ts-jest": "^27.1.1",
53
+ "jest": "^29.2.2",
54
+ "ts-jest": "^29.0.3",
57
55
  "ts-node": "^10.4.0",
58
- "typescript": "^4.5.3"
56
+ "typescript": "^5.0.3"
59
57
  },
60
58
  "engines": {
61
- "node": ">=14"
59
+ "node": ">=16"
62
60
  },
63
61
  "jest": {
64
62
  "moduleFileExtensions": [
@@ -78,10 +76,7 @@
78
76
  "**/*.ts"
79
77
  ],
80
78
  "coverageDirectory": "../coverage",
81
- "testEnvironment": "node"
82
- },
83
- "pre-commit": [
84
- "lint",
85
- "test"
86
- ]
79
+ "testEnvironment": "node",
80
+ "maxWorkers": 1
81
+ }
87
82
  }
@@ -0,0 +1,36 @@
1
+ import badge, { colors } from 'badge-up2';
2
+
3
+ import { createBadge } from './badge';
4
+
5
+ jest.mock('badge-up2');
6
+
7
+ describe('Badge', () => {
8
+ beforeEach(() => {
9
+ (badge as jest.MockedFunction<typeof badge>).mockResolvedValue('this is a badge');
10
+ });
11
+
12
+ describe('Creating badge', () => {
13
+ test('it returns the badge contents', async () => {
14
+ const contents = await createBadge('coverage', 12.34);
15
+ expect(contents).toBe('this is a badge');
16
+ });
17
+
18
+ test.each([
19
+ [colors.red, 0],
20
+ [colors.red, 75],
21
+ [colors.orange, 75.01],
22
+ [colors.orange, 85],
23
+ [colors.yellow, 85.01],
24
+ [colors.yellow, 90],
25
+ [colors.yellowgreen, 90.01],
26
+ [colors.yellowgreen, 93],
27
+ [colors.green, 93.01],
28
+ [colors.green, 97],
29
+ [colors.brightgreen, 97.01],
30
+ [colors.brightgreen, 100],
31
+ ])('the color is %s when the coverage is %s', async (color, coverage) => {
32
+ await createBadge('abc123', coverage);
33
+ expect(badge).toHaveBeenCalledWith('abc123', `${coverage}%`, color);
34
+ });
35
+ });
36
+ });
package/src/badge.ts ADDED
@@ -0,0 +1,22 @@
1
+ import badge, { colors } from 'badge-up2';
2
+
3
+ function getColor(coverage: number): colors {
4
+ if (coverage > 97) {
5
+ return colors.brightgreen;
6
+ } else if (coverage > 93) {
7
+ return colors.green;
8
+ } else if (coverage > 90) {
9
+ return colors.yellowgreen;
10
+ } else if (coverage > 85) {
11
+ return colors.yellow;
12
+ } else if (coverage > 75) {
13
+ return colors.orange;
14
+ } else {
15
+ return colors.red;
16
+ }
17
+ }
18
+
19
+ export async function createBadge(label: string, coverage: number): Promise<string> {
20
+ const color = getColor(coverage);
21
+ return badge(label, `${coverage}%`, color);
22
+ }