jest-audio-reporter 2.2.4 → 2.2.5
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/cjs/AudioReporter.d.ts +1 -1
- package/cjs/AudioReporter.js +13 -9
- package/cjs/AudioReporter.js.map +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/log.js +1 -1
- package/cjs/log.js.map +1 -1
- package/cjs/options.js +7 -7
- package/cjs/options.js.map +1 -1
- package/cjs/store.js +2 -3
- package/cjs/store.js.map +1 -1
- package/package.json +26 -35
- package/ts/AudioReporter.ts +97 -94
- package/ts/index.ts +2 -2
- package/ts/log.ts +17 -18
- package/ts/options.ts +52 -52
- package/ts/store.ts +15 -17
package/cjs/AudioReporter.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ReporterOnStartOptions } from '@jest/reporters';
|
|
2
2
|
import type { AggregatedResult } from '@jest/test-result';
|
|
3
3
|
import type { Config } from '@jest/types';
|
|
4
|
-
import { Options, RuntimeOptions } from './options';
|
|
4
|
+
import { type Options, type RuntimeOptions } from './options';
|
|
5
5
|
export declare class AudioReporter {
|
|
6
6
|
globalConfig: Config.GlobalConfig;
|
|
7
7
|
log: {
|
package/cjs/AudioReporter.js
CHANGED
|
@@ -10,9 +10,16 @@ const log_1 = require("./log");
|
|
|
10
10
|
const options_1 = require("./options");
|
|
11
11
|
const store_1 = require("./store");
|
|
12
12
|
class AudioReporter {
|
|
13
|
+
globalConfig;
|
|
14
|
+
log = (0, log_1.createLog)();
|
|
15
|
+
player;
|
|
16
|
+
disable;
|
|
17
|
+
options;
|
|
18
|
+
volume;
|
|
19
|
+
onStartVolume;
|
|
20
|
+
onCompleteVolume;
|
|
13
21
|
constructor(globalConfig, jestOptions) {
|
|
14
22
|
this.globalConfig = globalConfig;
|
|
15
|
-
this.log = (0, log_1.createLog)();
|
|
16
23
|
if (jestOptions.debug) {
|
|
17
24
|
this.log.enabled = true;
|
|
18
25
|
}
|
|
@@ -34,8 +41,7 @@ class AudioReporter {
|
|
|
34
41
|
store_1.store.completeAudio = undefined;
|
|
35
42
|
}
|
|
36
43
|
if (results.numTotalTestSuites === 0 ||
|
|
37
|
-
options.estimatedTime > 0 &&
|
|
38
|
-
options.estimatedTime <= this.options.onStartThreshold)
|
|
44
|
+
(options.estimatedTime > 0 && options.estimatedTime <= this.options.onStartThreshold))
|
|
39
45
|
return;
|
|
40
46
|
const file = pickOne(this.options.onStart);
|
|
41
47
|
const volume = this.getEffectiveOnStartVolume();
|
|
@@ -58,10 +64,8 @@ class AudioReporter {
|
|
|
58
64
|
store_1.store.doesLastRunPass = true;
|
|
59
65
|
return this.playComplete(pickOne(this.options.onSuitePass));
|
|
60
66
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return this.playComplete(pickOne(this.options.onSuiteFailure));
|
|
64
|
-
}
|
|
67
|
+
store_1.store.doesLastRunPass = false;
|
|
68
|
+
return this.playComplete(pickOne(this.options.onSuiteFailure));
|
|
65
69
|
}
|
|
66
70
|
playComplete(file) {
|
|
67
71
|
if (!file)
|
|
@@ -71,7 +75,7 @@ class AudioReporter {
|
|
|
71
75
|
store_1.store.completeAudio = this.player.play(file, this.getPlayOption({ volume }));
|
|
72
76
|
}
|
|
73
77
|
else {
|
|
74
|
-
return new Promise(a => {
|
|
78
|
+
return new Promise((a) => {
|
|
75
79
|
store_1.store.completeAudio = this.player.play(file, this.getPlayOption({ volume }), a);
|
|
76
80
|
});
|
|
77
81
|
}
|
|
@@ -110,7 +114,7 @@ function getAfPlayOption({ volume }) {
|
|
|
110
114
|
// log(0.1) = -1
|
|
111
115
|
// log(0) = -infinity
|
|
112
116
|
// So for now, I treat [0, 1] as linear
|
|
113
|
-
return { afplay: ['-v', 1 /
|
|
117
|
+
return { afplay: ['-v', 1 / 10 ** Math.log2(1 / volume)] };
|
|
114
118
|
}
|
|
115
119
|
function getMplayerOption({ volume }) {
|
|
116
120
|
// http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html search for "-volume"
|
package/cjs/AudioReporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioReporter.js","sourceRoot":"","sources":["../ts/AudioReporter.ts"],"names":[],"mappings":";;;;;;AAGA,4DAA+B;AAC/B,4CAAmB;AAEnB,+BAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"AudioReporter.js","sourceRoot":"","sources":["../ts/AudioReporter.ts"],"names":[],"mappings":"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"}
|
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../ts/index.ts"],"names":[],"mappings":";;AAAA,mCAA+B;AAE/B,uBAAuB;AACvB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../ts/index.ts"],"names":[],"mappings":";;AAAA,mCAA+B;AAE/B,uBAAuB;AACvB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;IACvB,IAAI,aAAK,CAAC,UAAU;QAAE,aAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;IAC7C,IAAI,aAAK,CAAC,aAAa;QAAE,aAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAA;AACpD,CAAC,CAAC,CAAA;AAEF,mDAA+C;AAE/C,kBAAe,6BAAa,CAAA"}
|
package/cjs/log.js
CHANGED
package/cjs/log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../ts/log.ts"],"names":[],"mappings":";;AAEA,8BAYC;AAED,
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../ts/log.ts"],"names":[],"mappings":";;AAEA,8BAYC;AAED,gCAWC;AA3BD,mCAA+B;AAE/B,SAAgB,SAAS;IACxB,OAAO;QACN,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,OAAO;QACf,KAAK,CAAC,GAAG,IAAI;YACZ,IAAI,aAAK,CAAC,KAAK;gBAAE,OAAM;YACvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,uBAAuB;gBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;YAC1B,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC;AAED,SAAgB,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO;IAC/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAChC,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,KAAK,CAAC;EACV,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAG3C,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;CACtC,CAAC,CAAA;IACD,CAAC;AACF,CAAC"}
|
package/cjs/options.js
CHANGED
|
@@ -4,15 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.processOptions = processOptions;
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
9
|
function processOptions(rawRCOptions) {
|
|
10
10
|
// reversing the config so the first one is the closest.
|
|
11
|
-
const dirs = rawRCOptions.configs ? rawRCOptions.configs.map(
|
|
11
|
+
const dirs = rawRCOptions.configs ? rawRCOptions.configs.map(node_path_1.default.dirname) : [];
|
|
12
12
|
const onStart = processRCFileEntry(rawRCOptions.onStart, dirs);
|
|
13
13
|
const onSuitePass = processRCFileEntry(rawRCOptions.onSuitePass, dirs);
|
|
14
14
|
const onSuiteFailure = processRCFileEntry(rawRCOptions.onSuiteFailure, dirs);
|
|
15
|
-
const onStartThreshold = rawRCOptions.onStartThreshold !== undefined ? parseInt(rawRCOptions.onStartThreshold, 10) : 10;
|
|
15
|
+
const onStartThreshold = rawRCOptions.onStartThreshold !== undefined ? Number.parseInt(rawRCOptions.onStartThreshold, 10) : 10;
|
|
16
16
|
return {
|
|
17
17
|
onStartThreshold,
|
|
18
18
|
onStart,
|
|
@@ -25,12 +25,12 @@ function processRCFileEntry(files, dirs) {
|
|
|
25
25
|
return [];
|
|
26
26
|
const entries = typeof files === 'string' ? [files] : files;
|
|
27
27
|
const validFiles = [];
|
|
28
|
-
entries.forEach(e => {
|
|
29
|
-
if (
|
|
28
|
+
entries.forEach((e) => {
|
|
29
|
+
if (node_path_1.default.isAbsolute(e)) {
|
|
30
30
|
validFiles.push(e);
|
|
31
31
|
}
|
|
32
32
|
else {
|
|
33
|
-
const file = dirs.map(dir =>
|
|
33
|
+
const file = dirs.map((dir) => node_path_1.default.resolve(dir, e)).find((p) => node_fs_1.default.existsSync(p));
|
|
34
34
|
if (file) {
|
|
35
35
|
validFiles.push(file);
|
|
36
36
|
}
|
package/cjs/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../ts/options.ts"],"names":[],"mappings":";;;;;AAiCA,
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../ts/options.ts"],"names":[],"mappings":";;;;;AAiCA,wCAgBC;AAjDD,sDAAwB;AACxB,0DAA4B;AAgC5B,SAAgB,cAAc,CAAC,YAAY;IAC1C,wDAAwD;IACxD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/E,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC9D,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACtE,MAAM,cAAc,GAAG,kBAAkB,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IAE5E,MAAM,gBAAgB,GACrB,YAAY,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAEtG,OAAO;QACN,gBAAgB;QAChB,OAAO;QACP,WAAW;QACX,cAAc;KACd,CAAA;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAoC,EAAE,IAAc;IAC/E,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IACrB,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC3D,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,IAAI,mBAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;YAClF,IAAI,IAAI,EAAE,CAAC;gBACV,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACtB,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAA;IACF,OAAO,UAAU,CAAA;AAClB,CAAC"}
|
package/cjs/store.js
CHANGED
|
@@ -5,9 +5,8 @@ exports.store = {
|
|
|
5
5
|
devel: false,
|
|
6
6
|
doesLastRunPass: false,
|
|
7
7
|
reset() {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
exports.store.startAudio = undefined;
|
|
8
|
+
;
|
|
9
|
+
(exports.store.completeAudio = undefined), (exports.store.doesLastRunPass = false), (exports.store.startAudio = undefined);
|
|
11
10
|
}
|
|
12
11
|
};
|
|
13
12
|
//# sourceMappingURL=store.js.map
|
package/cjs/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../ts/store.ts"],"names":[],"mappings":";;;AAQa,QAAA,KAAK,GAAU;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../ts/store.ts"],"names":[],"mappings":";;;AAQa,QAAA,KAAK,GAAU;IAC3B,KAAK,EAAE,KAAK;IACZ,eAAe,EAAE,KAAK;IACtB,KAAK;QACJ,CAAC;QAAA,CAAC,aAAK,CAAC,aAAa,GAAG,SAAS,CAAC,EAAE,CAAC,aAAK,CAAC,eAAe,GAAG,KAAK,CAAC,EAAE,CAAC,aAAK,CAAC,UAAU,GAAG,SAAS,CAAC,CAAA;IACpG,CAAC;CACD,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jest-audio-reporter",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.5",
|
|
4
4
|
"description": "Plays audio on jest events",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jest",
|
|
@@ -24,51 +24,42 @@
|
|
|
24
24
|
"!ts/**/*.spec.ts"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@jest/reporters": "^29.0.0",
|
|
28
|
-
"@jest/test-result": "^29.0.0",
|
|
29
|
-
"@jest/types": "^29.0.0",
|
|
30
|
-
"play-sound": "^1.1.
|
|
27
|
+
"@jest/reporters": "^29.0.0 || ^30.0.0",
|
|
28
|
+
"@jest/test-result": "^29.0.0 || ^30.0.0",
|
|
29
|
+
"@jest/types": "^29.0.0 || ^30.0.0",
|
|
30
|
+
"play-sound": "^1.1.6",
|
|
31
31
|
"rc": "^1.2.8"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
+
"@biomejs/biome": "^2.5.11",
|
|
34
35
|
"@changesets/cli": "^3.0.0",
|
|
35
|
-
"@commitlint/cli": "^
|
|
36
|
-
"@commitlint/config-conventional": "^
|
|
37
|
-
"@
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"husky": "^9.
|
|
43
|
-
"jest": "^
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"jest
|
|
47
|
-
"
|
|
48
|
-
"jest-watch-toggle-config": "^3.0.0",
|
|
49
|
-
"jest-watch-typeahead": "^2.0.0",
|
|
50
|
-
"npm-check-updates": "^16.0.0",
|
|
51
|
-
"npm-run-all2": "^6.0.0",
|
|
52
|
-
"rimraf": "^5.0.0",
|
|
53
|
-
"satisfier": "^5.1.0",
|
|
54
|
-
"ts-jest": "^29.0.0",
|
|
55
|
-
"typescript": "^5.0.0"
|
|
36
|
+
"@commitlint/cli": "^21.2.1",
|
|
37
|
+
"@commitlint/config-conventional": "^21.2.0",
|
|
38
|
+
"@repobuddy/biome": "^2.3.1",
|
|
39
|
+
"@types/jest": "^30.0.0",
|
|
40
|
+
"@types/node": "^26.2.0",
|
|
41
|
+
"assertron": "^11.5.4",
|
|
42
|
+
"depcheck": "^1.4.7",
|
|
43
|
+
"husky": "^9.1.7",
|
|
44
|
+
"jest": "^30.0.0",
|
|
45
|
+
"npm-run-all2": "^9.0.3",
|
|
46
|
+
"rimraf": "^6.1.3",
|
|
47
|
+
"ts-jest": "^29.4.12",
|
|
48
|
+
"typescript": "^5.9.0"
|
|
56
49
|
},
|
|
57
50
|
"scripts": {
|
|
58
51
|
"build": "tsc -p tsconfig.base.json",
|
|
59
|
-
"clean": "rimraf cjs dist",
|
|
52
|
+
"clean": "rimraf cjs coverage dist",
|
|
60
53
|
"coverage": "jest --coverage",
|
|
61
54
|
"cs": "changeset",
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"dependency-check:missing": "dependency-check . --missing --no-dev",
|
|
66
|
-
"lint": "eslint --ext=ts,js .",
|
|
55
|
+
"depcheck": "depcheck",
|
|
56
|
+
"lint": "biome check .",
|
|
57
|
+
"lint:fix": "biome check --write .",
|
|
67
58
|
"release": "changeset publish",
|
|
68
|
-
"size-limit": "echo no size-limit",
|
|
69
59
|
"test": "jest",
|
|
70
|
-
"
|
|
71
|
-
"verify
|
|
60
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
61
|
+
"verify": "run-p lint verify:pkg",
|
|
62
|
+
"verify:pkg": "run-s clean build && run-p depcheck typecheck coverage",
|
|
72
63
|
"version": "changeset version",
|
|
73
64
|
"watch": "jest --watch"
|
|
74
65
|
}
|
package/ts/AudioReporter.ts
CHANGED
|
@@ -5,119 +5,122 @@ import Player from 'play-sound'
|
|
|
5
5
|
import rc from 'rc'
|
|
6
6
|
|
|
7
7
|
import { createLog, logOptions } from './log'
|
|
8
|
-
import { Options, processOptions, RuntimeOptions } from './options'
|
|
8
|
+
import { type Options, processOptions, type RuntimeOptions } from './options'
|
|
9
9
|
import { store } from './store'
|
|
10
10
|
|
|
11
11
|
export class AudioReporter {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
12
|
+
log = createLog()
|
|
13
|
+
player
|
|
14
|
+
disable: boolean
|
|
15
|
+
options: RuntimeOptions
|
|
16
|
+
volume: number | undefined
|
|
17
|
+
onStartVolume: number
|
|
18
|
+
onCompleteVolume: number | undefined
|
|
19
|
+
constructor(
|
|
20
|
+
public globalConfig: Config.GlobalConfig,
|
|
21
|
+
jestOptions: Partial<Options>
|
|
22
|
+
) {
|
|
23
|
+
if (jestOptions.debug) {
|
|
24
|
+
this.log.enabled = true
|
|
25
|
+
}
|
|
26
|
+
this.player = Player({})
|
|
27
|
+
this.disable = !!jestOptions.disable
|
|
28
|
+
this.volume = jestOptions.volume
|
|
29
|
+
this.onStartVolume = jestOptions.onStartVolume || 0.5
|
|
30
|
+
this.onCompleteVolume = jestOptions.onCompleteVolume
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
const rawRCOptions = rc('jest-audio-reporter')
|
|
33
|
+
const rcOptions = processOptions(rawRCOptions)
|
|
34
|
+
logOptions({ log: this.log }, rawRCOptions, rcOptions)
|
|
35
|
+
this.options = rcOptions
|
|
36
|
+
}
|
|
37
|
+
onRunStart(results: AggregatedResult, options: ReporterOnStartOptions) {
|
|
38
|
+
if (this.disable) return
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
if (store.completeAudio) {
|
|
41
|
+
store.completeAudio.kill()
|
|
42
|
+
store.completeAudio = undefined
|
|
43
|
+
}
|
|
41
44
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
if (
|
|
46
|
+
results.numTotalTestSuites === 0 ||
|
|
47
|
+
(options.estimatedTime > 0 && options.estimatedTime <= this.options.onStartThreshold)
|
|
48
|
+
)
|
|
49
|
+
return
|
|
45
50
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
const file = pickOne(this.options.onStart)
|
|
52
|
+
const volume = this.getEffectiveOnStartVolume()
|
|
53
|
+
store.startAudio = this.player.play(file, this.getPlayOption({ volume }))
|
|
54
|
+
}
|
|
55
|
+
onRunComplete(_contexts, results: AggregatedResult) {
|
|
56
|
+
if (this.disable) return
|
|
52
57
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
if (store.startAudio) {
|
|
59
|
+
store.startAudio.kill()
|
|
60
|
+
store.startAudio = undefined
|
|
61
|
+
}
|
|
62
|
+
if (results.numTotalTestSuites === 0) return
|
|
63
|
+
if (results.wasInterrupted) return
|
|
59
64
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
}
|
|
65
|
+
if (results.numFailedTestSuites === 0) {
|
|
66
|
+
if (isWatch(this.globalConfig) && store.doesLastRunPass) return
|
|
67
|
+
store.doesLastRunPass = true
|
|
68
|
+
return this.playComplete(pickOne(this.options.onSuitePass))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
store.doesLastRunPass = false
|
|
72
|
+
return this.playComplete(pickOne(this.options.onSuiteFailure))
|
|
73
|
+
}
|
|
74
|
+
private playComplete(file: string | undefined) {
|
|
75
|
+
if (!file) return
|
|
76
|
+
const volume = this.getEffectiveOnCompleteVolume()
|
|
77
|
+
if (isWatch(this.globalConfig)) {
|
|
78
|
+
store.completeAudio = this.player.play(file, this.getPlayOption({ volume }))
|
|
79
|
+
} else {
|
|
80
|
+
return new Promise((a) => {
|
|
81
|
+
store.completeAudio = this.player.play(file, this.getPlayOption({ volume }), a)
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
private getEffectiveOnStartVolume() {
|
|
86
|
+
return Math.min(this.volume || 1, this.onStartVolume)
|
|
87
|
+
}
|
|
88
|
+
private getEffectiveOnCompleteVolume() {
|
|
89
|
+
return Math.min(this.volume || 1, this.onCompleteVolume || 1)
|
|
90
|
+
}
|
|
91
|
+
private getPlayOption(option) {
|
|
92
|
+
switch (this.player.player) {
|
|
93
|
+
case 'afplay':
|
|
94
|
+
return getAfPlayOption(option)
|
|
95
|
+
case 'mplayer':
|
|
96
|
+
return getMplayerOption(option)
|
|
97
|
+
default:
|
|
98
|
+
return {}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
98
101
|
}
|
|
99
102
|
|
|
100
103
|
function pickOne(arr: Array<any>) {
|
|
101
|
-
|
|
102
|
-
|
|
104
|
+
if (arr.length === 0) return undefined
|
|
105
|
+
return arr[Math.floor(Math.random() * arr.length)]
|
|
103
106
|
}
|
|
104
107
|
|
|
105
108
|
function isWatch(globalConfig) {
|
|
106
|
-
|
|
109
|
+
return globalConfig.watch || globalConfig.watchAll
|
|
107
110
|
}
|
|
108
111
|
|
|
109
112
|
function getAfPlayOption({ volume }: { volume: number }) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
113
|
+
// https://ss64.com/osx/afplay.html
|
|
114
|
+
// According to the link, the volume is logarithmic,
|
|
115
|
+
// but I'm not sure what does it mean, as:
|
|
116
|
+
// log(1) = 0
|
|
117
|
+
// log(0.1) = -1
|
|
118
|
+
// log(0) = -infinity
|
|
119
|
+
// So for now, I treat [0, 1] as linear
|
|
120
|
+
return { afplay: ['-v', 1 / 10 ** Math.log2(1 / volume)] }
|
|
118
121
|
}
|
|
119
122
|
|
|
120
123
|
function getMplayerOption({ volume }: { volume: number }) {
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
// http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html search for "-volume"
|
|
125
|
+
return { mplayer: ['-volume', volume * 100] }
|
|
123
126
|
}
|
package/ts/index.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { store } from './store'
|
|
|
2
2
|
|
|
3
3
|
// istanbul ignore next
|
|
4
4
|
process.on('exit', () => {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
if (store.startAudio) store.startAudio.kill()
|
|
6
|
+
if (store.completeAudio) store.completeAudio.kill()
|
|
7
7
|
})
|
|
8
8
|
|
|
9
9
|
import { AudioReporter } from './AudioReporter'
|
package/ts/log.ts
CHANGED
|
@@ -1,29 +1,28 @@
|
|
|
1
1
|
import { store } from './store'
|
|
2
2
|
|
|
3
3
|
export function createLog() {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
return {
|
|
5
|
+
enabled: false,
|
|
6
|
+
writer: console,
|
|
7
|
+
debug(...args) {
|
|
8
|
+
if (store.devel) return
|
|
9
|
+
if (this.enabled) {
|
|
10
|
+
// istanbul ignore next
|
|
11
|
+
this.writer.info(...args)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export function logOptions({ log }, raw, options) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
${raw.configs.map(c => ` ${c}`).join('\n')}
|
|
18
|
+
if (!raw.configs) {
|
|
19
|
+
log.debug('no config detected')
|
|
20
|
+
} else {
|
|
21
|
+
log.debug(`configs location:
|
|
22
|
+
${raw.configs.map((c) => ` ${c}`).join('\n')}
|
|
24
23
|
|
|
25
24
|
options:
|
|
26
25
|
${JSON.stringify(options, undefined, 2)}
|
|
27
26
|
`)
|
|
28
|
-
|
|
27
|
+
}
|
|
29
28
|
}
|
package/ts/options.ts
CHANGED
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
import fs from 'fs'
|
|
2
|
-
import path from 'path'
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
3
|
|
|
4
4
|
export interface Options {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Enable debug mode.
|
|
7
|
+
*/
|
|
8
|
+
debug: boolean
|
|
9
|
+
/**
|
|
10
|
+
* Master volume. 0 (silent) - 1 (normal).
|
|
11
|
+
*/
|
|
12
|
+
volume: number
|
|
13
|
+
/**
|
|
14
|
+
* Volume for onStart. 0 (silent) - 1 (normal).
|
|
15
|
+
* Value higher than Master volume is ignored.
|
|
16
|
+
*/
|
|
17
|
+
onStartVolume: number
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Volume for onPass and onFailure. 0 (silent) - 1 (normal).
|
|
21
|
+
* Value higher than Master volume is ignored.
|
|
22
|
+
*/
|
|
23
|
+
onCompleteVolume: number
|
|
24
|
+
disable: boolean
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export interface RuntimeOptions {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
onStart: string[]
|
|
29
|
+
onStartThreshold: number
|
|
30
|
+
onSuitePass: string[]
|
|
31
|
+
onSuiteFailure: string[]
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export function processOptions(rawRCOptions) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
// reversing the config so the first one is the closest.
|
|
36
|
+
const dirs = rawRCOptions.configs ? rawRCOptions.configs.map(path.dirname) : []
|
|
37
|
+
const onStart = processRCFileEntry(rawRCOptions.onStart, dirs)
|
|
38
|
+
const onSuitePass = processRCFileEntry(rawRCOptions.onSuitePass, dirs)
|
|
39
|
+
const onSuiteFailure = processRCFileEntry(rawRCOptions.onSuiteFailure, dirs)
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
const onStartThreshold =
|
|
42
|
+
rawRCOptions.onStartThreshold !== undefined ? Number.parseInt(rawRCOptions.onStartThreshold, 10) : 10
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
return {
|
|
45
|
+
onStartThreshold,
|
|
46
|
+
onStart,
|
|
47
|
+
onSuitePass,
|
|
48
|
+
onSuiteFailure
|
|
49
|
+
}
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
function processRCFileEntry(files: string | string[] | undefined, dirs: string[]) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return validFiles
|
|
53
|
+
if (!files) return []
|
|
54
|
+
const entries = typeof files === 'string' ? [files] : files
|
|
55
|
+
const validFiles: string[] = []
|
|
56
|
+
entries.forEach((e) => {
|
|
57
|
+
if (path.isAbsolute(e)) {
|
|
58
|
+
validFiles.push(e)
|
|
59
|
+
} else {
|
|
60
|
+
const file = dirs.map((dir) => path.resolve(dir, e)).find((p) => fs.existsSync(p))
|
|
61
|
+
if (file) {
|
|
62
|
+
validFiles.push(file)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
return validFiles
|
|
67
67
|
}
|
package/ts/store.ts
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
export interface Store {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const store: Store = {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
}
|
|
1
|
+
export interface Store {
|
|
2
|
+
devel: boolean
|
|
3
|
+
startAudio?: any
|
|
4
|
+
completeAudio?: any
|
|
5
|
+
doesLastRunPass: boolean
|
|
6
|
+
reset(): void
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const store: Store = {
|
|
10
|
+
devel: false,
|
|
11
|
+
doesLastRunPass: false,
|
|
12
|
+
reset() {
|
|
13
|
+
;(store.completeAudio = undefined), (store.doesLastRunPass = false), (store.startAudio = undefined)
|
|
14
|
+
}
|
|
15
|
+
}
|