@plugjs/cov8 0.3.5 → 0.4.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/dist/cli.d.mts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.mjs ADDED
@@ -0,0 +1,169 @@
1
+ #!/usr/bin/env node
2
+
3
+ // cli.mts
4
+ import { async, find, paths, pipe, logging, mkdtemp, rmrf, utils } from "@plugjs/plug";
5
+ import { main, yargsParser } from "@plugjs/tsrun";
6
+ import { Coverage } from "./coverage.mjs";
7
+ var { $blu, $und, $gry, $wht, $p } = logging;
8
+ var $gnd = (s) => $gry($und(s));
9
+ var $bnd = (s) => $blu($und(s));
10
+ var $wnd = (s) => $wht($und(s));
11
+ var version = true ? "0.4.1" : "0.0.0-dev";
12
+ function help() {
13
+ console.log(`${$blu($und("Usage:"))}
14
+
15
+ ${$wht("cov8")} ${$gry("[")}--options${$gry("] [--] [...")}command${$gry("...]")}
16
+
17
+ ${$bnd("Options:")}
18
+
19
+ ${$wht("-c --coverage-dir")} ${$gnd("dir")} The directory containing all coverage data files
20
+ ${$wht("-r --report-dir")} ${$gnd("dir")} Write an HTML report to this directory
21
+ ${$wht("-d --source-dir")} ${$gnd("dir")} The directory where source files are located
22
+ ${$wht("-s --sources")} ${$gnd("glob")} A glob for the sources to be reported upon
23
+ ${$wht("-m --minimum")} ${$gnd("num")} The desired minimum coverage level to achieve
24
+ ${$wht("-o --optimal")} ${$gnd("num")} The desired optimal coverage level to achieve
25
+ ${$wht("-h --help ")} Help! You're reading it now!
26
+ ${$wht(" --version")} Version! This one: ${version}!
27
+
28
+
29
+ ${$bnd("Usave:")}
30
+
31
+ This utility can process and create reports for ${$und("existing")} Node.js coverage
32
+ data, or execute a command and verify the execution's coverage.
33
+
34
+ When a command is not specified, the ${$wht("--coverage-dir")} option must be
35
+ specified, and point to a directory containing one or more Node.js JSON
36
+ coverage files. Those can be generated running node and specifying the
37
+ ${$wnd("NODE_V8_COVERAGE")} environment variable.
38
+
39
+ When a command is specified, the command will be executed, and coverage
40
+ will be collected automatically in a temporary directory (or in the
41
+ directory specified by ${$wht("--coverage-dir")}).
42
+
43
+ The sources to report upon can be specified with the ${$wht("--source-dir")} option,
44
+ indicating the directory where sources can be found (defailts to the current
45
+ directory) and the ${$wht("--sources")} option (can be specified multiple times)
46
+ indicating the globs matching the source files to report upon.
47
+
48
+ The default is to report upon all JavaScript and TypeScript files in the
49
+ ${$wnd("./src")} directory.
50
+
51
+ ${$bnd("Environment Variables:")}
52
+
53
+ ${$wht("LOG_LEVEL$ ")} The default ${$wnd("notice")}, or ${$gnd("debug")}, ${$gnd("info")}, ${$gnd("warn")} or ${$gnd("error")}.
54
+
55
+ ${$bnd("TypeScript module format:")}
56
+
57
+ Normally our TypeScript loader will transpile ${$wnd(".ts")} files to the type
58
+ specified in ${$wnd("package.json")}, either ${$wnd("commonjs")} (the default) or ${$wnd("module")}.
59
+
60
+ To force a specific module format use one of the following flags:
61
+
62
+ ${$wht("--force-esm")} Force transpilation of ${$wnd(".ts")} files to EcmaScript modules
63
+ ${$wht("--force-cjs")} Force transpilation of ${$wnd(".ts")} files to CommonJS modules
64
+ `);
65
+ process.exit(0);
66
+ }
67
+ main(import.meta.url, async (args) => {
68
+ logging.logOptions.spinner = false;
69
+ const filename = paths.requireFilename(import.meta.url);
70
+ const context = new pipe.Context(filename, "");
71
+ const command = [];
72
+ const globs = [];
73
+ let minimumCoverage = void 0;
74
+ let optimalCoverage = void 0;
75
+ let coverageDir;
76
+ let reportDir;
77
+ let sourceDir;
78
+ const parsed = yargsParser(args, {
79
+ configuration: {
80
+ "camel-case-expansion": false,
81
+ "halt-at-non-option": true,
82
+ "strip-aliased": true,
83
+ "strip-dashed": true
84
+ },
85
+ alias: {
86
+ "coverage-dir": ["c"],
87
+ "report-dir": ["r"],
88
+ "source-dir": ["d"],
89
+ "minimum": ["m"],
90
+ "optimal": ["o"],
91
+ "sources": ["s"],
92
+ "help": ["h"]
93
+ },
94
+ string: ["coverage-dir", "report-dir", "source-dir", "sources"],
95
+ number: ["minimum", "optimal"],
96
+ boolean: ["help", "version"]
97
+ });
98
+ for (const [key, value] of Object.entries(parsed)) {
99
+ switch (key) {
100
+ case "_":
101
+ command.push(...value);
102
+ break;
103
+ case "coverage-dir":
104
+ coverageDir = value;
105
+ break;
106
+ case "report-dir":
107
+ reportDir = value;
108
+ break;
109
+ case "source-dir":
110
+ sourceDir = value;
111
+ break;
112
+ case "sources":
113
+ globs.push(value);
114
+ break;
115
+ case "minimum":
116
+ minimumCoverage = value;
117
+ break;
118
+ case "optimal":
119
+ optimalCoverage = value;
120
+ break;
121
+ case "help":
122
+ return help();
123
+ case "version":
124
+ return context.log.notice(`Cov8 ${$gry("ver.")} ${$wnd(version)}`);
125
+ default:
126
+ context.log.error(`Unsupported option ${$wnd(key)} (try ${$wnd("--help")})`);
127
+ process.exit(1);
128
+ }
129
+ }
130
+ if (command.length === 0 && !coverageDir) {
131
+ context.log.error(`Either ${$wnd("--coverage-dir")} or a command must me specified`);
132
+ process.exit(1);
133
+ }
134
+ const glob = globs.shift() || "**/*.([cm])?[jt]s";
135
+ const ignore = "**/*.d.([cm])?ts";
136
+ try {
137
+ process.exitCode = 0;
138
+ await async.runAsync(context, "", async () => {
139
+ let tempDir = void 0;
140
+ if (!coverageDir) {
141
+ const directory = mkdtemp();
142
+ context.log.notice(`Writing coverage data in ${$p(directory)}`);
143
+ coverageDir = tempDir = directory;
144
+ }
145
+ try {
146
+ const [cmd, ...args2] = command;
147
+ if (cmd) {
148
+ const env = {
149
+ ...process.env,
150
+ ...logging.logOptions.forkEnv()
151
+ };
152
+ await utils.execChild(cmd, args2, { coverageDir, env }, context);
153
+ }
154
+ await find(glob, ...globs, { directory: sourceDir || "src", ignore }).plug(new Coverage(coverageDir, {
155
+ reportDir,
156
+ minimumCoverage,
157
+ optimalCoverage
158
+ }));
159
+ } finally {
160
+ if (tempDir)
161
+ await rmrf(tempDir);
162
+ }
163
+ });
164
+ } catch (error) {
165
+ context.log.error(error);
166
+ process.exitCode = 1;
167
+ }
168
+ });
169
+ //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli.mts"],
4
+ "mappings": "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",
5
+ "names": ["args"]
6
+ }
package/dist/coverage.cjs CHANGED
@@ -103,11 +103,13 @@ var Coverage = class {
103
103
  _report.add({ level: import_logging.WARN, message });
104
104
  }
105
105
  if (fileErrors) {
106
- const message = `${(0, import_logging.$red)(fileErrors)} files do not meet minimum file coverage ${(0, import_logging.$gry)(`(${minimumFileCoverage}%)`)}`;
106
+ const f = fileErrors === 1 ? "file does" : "files do";
107
+ const message = `${(0, import_logging.$red)(fileErrors)} ${f} not meet minimum file coverage ${(0, import_logging.$gry)(`(${minimumFileCoverage}%)`)}`;
107
108
  _report.add({ level: import_logging.ERROR, message });
108
109
  }
109
110
  if (fileWarnings) {
110
- const message = `${(0, import_logging.$ylw)(fileWarnings)} files do not meet optimal file coverage ${(0, import_logging.$gry)(`(${optimalFileCoverage}%)`)}`;
111
+ const f = fileErrors === 1 ? "file does" : "files do";
112
+ const message = `${(0, import_logging.$ylw)(fileWarnings)} ${f} not meet optimal file coverage ${(0, import_logging.$gry)(`(${optimalFileCoverage}%)`)}`;
111
113
  _report.add({ level: import_logging.WARN, message });
112
114
  }
113
115
  if (this._options.reportDir == null)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/coverage.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/dist/coverage.mjs CHANGED
@@ -79,11 +79,13 @@ var Coverage = class {
79
79
  _report.add({ level: WARN, message });
80
80
  }
81
81
  if (fileErrors) {
82
- const message = `${$red(fileErrors)} files do not meet minimum file coverage ${$gry(`(${minimumFileCoverage}%)`)}`;
82
+ const f = fileErrors === 1 ? "file does" : "files do";
83
+ const message = `${$red(fileErrors)} ${f} not meet minimum file coverage ${$gry(`(${minimumFileCoverage}%)`)}`;
83
84
  _report.add({ level: ERROR, message });
84
85
  }
85
86
  if (fileWarnings) {
86
- const message = `${$ylw(fileWarnings)} files do not meet optimal file coverage ${$gry(`(${optimalFileCoverage}%)`)}`;
87
+ const f = fileErrors === 1 ? "file does" : "files do";
88
+ const message = `${$ylw(fileWarnings)} ${f} not meet optimal file coverage ${$gry(`(${optimalFileCoverage}%)`)}`;
87
89
  _report.add({ level: WARN, message });
88
90
  }
89
91
  if (this._options.reportDir == null)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/coverage.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "@plugjs/cov8",
3
- "version": "0.3.5",
3
+ "version": "0.4.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "cov8": "./dist/cli.mjs"
10
+ },
8
11
  "exports": {
9
12
  ".": {
10
13
  "require": {
@@ -36,7 +39,7 @@
36
39
  "source-map": "^0.7.4"
37
40
  },
38
41
  "peerDependencies": {
39
- "@plugjs/plug": "0.3.5"
42
+ "@plugjs/plug": "0.4.1"
40
43
  },
41
44
  "files": [
42
45
  "*.md",
package/src/cli.mts ADDED
@@ -0,0 +1,199 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { async, find, paths, pipe, logging, mkdtemp, rmrf, utils } from '@plugjs/plug'
4
+ import { main, yargsParser } from '@plugjs/tsrun'
5
+
6
+ import { Coverage } from './coverage'
7
+
8
+ const { $blu, $und, $gry, $wht, $p } = logging
9
+ const $gnd = (s: string): string => $gry($und(s))
10
+ const $bnd = (s: string): string => $blu($und(s))
11
+ const $wnd = (s: string): string => $wht($und(s))
12
+
13
+
14
+ /** Version injected by esbuild, defaulted in case of dynamic transpilation */
15
+ const version = typeof __version === 'string' ? __version : '0.0.0-dev'
16
+ declare const __version: string | undefined
17
+
18
+ /* ========================================================================== *
19
+ * HELP SCREEN *
20
+ * ========================================================================== */
21
+
22
+ /** Show help screen */
23
+ function help(): void {
24
+ // eslint-disable-next-line no-console
25
+ console.log(`${$blu($und('Usage:'))}
26
+
27
+ ${$wht('cov8')} ${$gry('[')}--options${$gry('] [--] [...')}command${$gry('...]')}
28
+
29
+ ${$bnd('Options:')}
30
+
31
+ ${$wht('-c --coverage-dir')} ${$gnd('dir')} The directory containing all coverage data files
32
+ ${$wht('-r --report-dir')} ${$gnd('dir')} Write an HTML report to this directory
33
+ ${$wht('-d --source-dir')} ${$gnd('dir')} The directory where source files are located
34
+ ${$wht('-s --sources')} ${$gnd('glob')} A glob for the sources to be reported upon
35
+ ${$wht('-m --minimum')} ${$gnd('num')} The desired minimum coverage level to achieve
36
+ ${$wht('-o --optimal')} ${$gnd('num')} The desired optimal coverage level to achieve
37
+ ${$wht('-h --help ')} Help! You're reading it now!
38
+ ${$wht(' --version')} Version! This one: ${version}!
39
+
40
+
41
+ ${$bnd('Usave:')}
42
+
43
+ This utility can process and create reports for ${$und('existing')} Node.js coverage
44
+ data, or execute a command and verify the execution's coverage.
45
+
46
+ When a command is not specified, the ${$wht('--coverage-dir')} option must be
47
+ specified, and point to a directory containing one or more Node.js JSON
48
+ coverage files. Those can be generated running node and specifying the
49
+ ${$wnd('NODE_V8_COVERAGE')} environment variable.
50
+
51
+ When a command is specified, the command will be executed, and coverage
52
+ will be collected automatically in a temporary directory (or in the
53
+ directory specified by ${$wht('--coverage-dir')}).
54
+
55
+ The sources to report upon can be specified with the ${$wht('--source-dir')} option,
56
+ indicating the directory where sources can be found (defailts to the current
57
+ directory) and the ${$wht('--sources')} option (can be specified multiple times)
58
+ indicating the globs matching the source files to report upon.
59
+
60
+ The default is to report upon all JavaScript and TypeScript files in the
61
+ ${$wnd('./src')} directory.
62
+
63
+ ${$bnd('Environment Variables:')}
64
+
65
+ ${$wht('LOG_LEVEL$ ')} The default ${$wnd('notice')}, or ${$gnd('debug')}, ${$gnd('info')}, ${$gnd('warn')} or ${$gnd('error')}.
66
+
67
+ ${$bnd('TypeScript module format:')}
68
+
69
+ Normally our TypeScript loader will transpile ${$wnd('.ts')} files to the type
70
+ specified in ${$wnd('package.json')}, either ${$wnd('commonjs')} (the default) or ${$wnd('module')}.
71
+
72
+ To force a specific module format use one of the following flags:
73
+
74
+ ${$wht('--force-esm')} Force transpilation of ${$wnd('.ts')} files to EcmaScript modules
75
+ ${$wht('--force-cjs')} Force transpilation of ${$wnd('.ts')} files to CommonJS modules
76
+ `)
77
+ process.exit(0)
78
+ }
79
+
80
+ /* ========================================================================== *
81
+ * MAIN TEST RUNNER *
82
+ * ========================================================================== */
83
+
84
+ /** Parse command line and run tests */
85
+ main(import.meta.url, async (args): Promise<void> => {
86
+ logging.logOptions.spinner = false
87
+
88
+ const filename = paths.requireFilename(import.meta.url) // self, for context
89
+ const context = new pipe.Context(filename, '') // context for pipes
90
+ const command: string[] = [] // empty command line
91
+ const globs: string[] = [] // empty globs list
92
+ let minimumCoverage: number | undefined = undefined
93
+ let optimalCoverage: number | undefined = undefined
94
+ let coverageDir: string | undefined
95
+ let reportDir: string | undefined
96
+ let sourceDir: string | undefined
97
+
98
+ const parsed = yargsParser(args, {
99
+ configuration: {
100
+ 'camel-case-expansion': false,
101
+ 'halt-at-non-option': true,
102
+ 'strip-aliased': true,
103
+ 'strip-dashed': true,
104
+ },
105
+
106
+ alias: {
107
+ 'coverage-dir': [ 'c' ],
108
+ 'report-dir': [ 'r' ],
109
+ 'source-dir': [ 'd' ],
110
+ 'minimum': [ 'm' ],
111
+ 'optimal': [ 'o' ],
112
+ 'sources': [ 's' ],
113
+ 'help': [ 'h' ],
114
+ },
115
+
116
+ string: [ 'coverage-dir', 'report-dir', 'source-dir', 'sources' ],
117
+ number: [ 'minimum', 'optimal' ],
118
+ boolean: [ 'help', 'version' ],
119
+ })
120
+
121
+ for (const [ key, value ] of Object.entries(parsed)) {
122
+ switch (key) {
123
+ case '_': // extra command line as args
124
+ command.push(...value)
125
+ break
126
+ case 'coverage-dir':
127
+ coverageDir = value
128
+ break
129
+ case 'report-dir':
130
+ reportDir = value
131
+ break
132
+ case 'source-dir':
133
+ sourceDir = value
134
+ break
135
+ case 'sources':
136
+ globs.push(value)
137
+ break
138
+ case 'minimum':
139
+ minimumCoverage = value
140
+ break
141
+ case 'optimal':
142
+ optimalCoverage = value
143
+ break
144
+ case 'help':
145
+ return help()
146
+ case 'version':
147
+ return context.log.notice(`Cov8 ${$gry('ver.')} ${$wnd(version)}`)
148
+ default:
149
+ context.log.error(`Unsupported option ${$wnd(key)} (try ${$wnd('--help')})`)
150
+ process.exit(1)
151
+ }
152
+ }
153
+
154
+ // Extra check for command or coverage dir requirement
155
+ if ((command.length === 0) && (! coverageDir)) {
156
+ context.log.error(`Either ${$wnd('--coverage-dir')} or a command must me specified`)
157
+ process.exit(1)
158
+ }
159
+
160
+ // Default glob (all JS/TS in the 'src' directory)
161
+ const glob = globs.shift() || '**/*.([cm])?[jt]s'
162
+ const ignore = '**/*.d.([cm])?ts' // ignore .d.ts!
163
+
164
+ // Simply create the Test plug and pass everything to it
165
+ try {
166
+ process.exitCode = 0
167
+ await async.runAsync(context, '', async () => {
168
+ let tempDir: string | undefined = undefined
169
+ if (! coverageDir) {
170
+ const directory = mkdtemp()
171
+ context.log.notice(`Writing coverage data in ${$p(directory)}`)
172
+ coverageDir = tempDir = directory
173
+ }
174
+
175
+ try {
176
+ const [ cmd, ...args ] = command
177
+ if (cmd) {
178
+ const env = {
179
+ ...process.env,
180
+ ...logging.logOptions.forkEnv(),
181
+ }
182
+ await utils.execChild(cmd, args, { coverageDir, env }, context)
183
+ }
184
+
185
+ await find(glob, ...globs, { directory: sourceDir || 'src', ignore })
186
+ .plug(new Coverage(coverageDir, {
187
+ reportDir: reportDir as string,
188
+ minimumCoverage,
189
+ optimalCoverage,
190
+ }))
191
+ } finally {
192
+ if (tempDir) await rmrf(tempDir)
193
+ }
194
+ })
195
+ } catch (error) {
196
+ context.log.error(error)
197
+ process.exitCode = 1
198
+ }
199
+ })
package/src/coverage.ts CHANGED
@@ -103,11 +103,15 @@ export class Coverage implements Plug<Files | undefined> {
103
103
  }
104
104
 
105
105
  if (fileErrors) {
106
- const message = `${$red(fileErrors)} files do not meet minimum file coverage ${$gry(`(${minimumFileCoverage}%)`)}`
106
+ /* coverage ignore next */
107
+ const f = fileErrors === 1 ? 'file does' : 'files do'
108
+ const message = `${$red(fileErrors)} ${f} not meet minimum file coverage ${$gry(`(${minimumFileCoverage}%)`)}`
107
109
  _report.add({ level: ERROR, message })
108
110
  }
109
111
  if (fileWarnings) {
110
- const message = `${$ylw(fileWarnings)} files do not meet optimal file coverage ${$gry(`(${optimalFileCoverage}%)`)}`
112
+ /* coverage ignore next */
113
+ const f = fileErrors === 1 ? 'file does' : 'files do'
114
+ const message = `${$ylw(fileWarnings)} ${f} not meet optimal file coverage ${$gry(`(${optimalFileCoverage}%)`)}`
111
115
  _report.add({ level: WARN, message })
112
116
  }
113
117