jest-watch-typeahead 0.6.4 → 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/README.md +1 -1
- package/build/file_name_plugin/plugin.js +6 -19
- package/build/file_name_plugin/prompt.js +24 -43
- package/build/index.js +0 -2
- package/build/lib/pattern_mode_helpers.js +13 -37
- package/build/lib/scroll.js +1 -9
- package/build/lib/utils.js +25 -55
- package/build/test_name_plugin/plugin.js +6 -19
- package/build/test_name_plugin/prompt.js +19 -37
- package/build/types/Config.js +1 -1
- package/filename.js +1 -4
- package/package.json +35 -26
- package/testname.js +1 -4
- package/build/file_name_plugin/__tests__/plugin.test.js +0 -162
- package/build/lib/__tests__/utils.test.js +0 -79
- package/build/test_name_plugin/__tests__/plugin.test.js +0 -197
- package/build/test_utils/pluginTester.js +0 -59
package/README.md
CHANGED
@@ -1,17 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.default = void 0;
|
7
|
-
|
8
|
-
var _jestWatcher = require("jest-watcher");
|
9
|
-
|
10
|
-
var _prompt = _interopRequireDefault(require("./prompt"));
|
11
|
-
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
|
-
|
14
|
-
class FileNamePlugin {
|
1
|
+
import { Prompt } from 'jest-watcher';
|
2
|
+
import FileNamePatternPrompt from "./prompt.js";
|
3
|
+
export default class FileNamePlugin {
|
15
4
|
constructor({
|
16
5
|
stdin,
|
17
6
|
stdout,
|
@@ -19,7 +8,7 @@ class FileNamePlugin {
|
|
19
8
|
}) {
|
20
9
|
this._stdin = stdin;
|
21
10
|
this._stdout = stdout;
|
22
|
-
this._prompt = new
|
11
|
+
this._prompt = new Prompt();
|
23
12
|
this._projects = [];
|
24
13
|
this._usageInfo = {
|
25
14
|
key: config.key || 'p',
|
@@ -40,7 +29,7 @@ class FileNamePlugin {
|
|
40
29
|
}
|
41
30
|
|
42
31
|
run(globalConfig, updateConfigAndRun) {
|
43
|
-
const p = new
|
32
|
+
const p = new FileNamePatternPrompt(this._stdout, this._prompt);
|
44
33
|
p.updateSearchSources(this._projects);
|
45
34
|
return new Promise((res, rej) => {
|
46
35
|
p.run(testPathPattern => {
|
@@ -57,6 +46,4 @@ class FileNamePlugin {
|
|
57
46
|
return this._usageInfo;
|
58
47
|
}
|
59
48
|
|
60
|
-
}
|
61
|
-
|
62
|
-
exports.default = FileNamePlugin;
|
49
|
+
}
|
@@ -1,29 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
}
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
var _ansiEscapes = _interopRequireDefault(require("ansi-escapes"));
|
11
|
-
|
12
|
-
var _stringLength = _interopRequireDefault(require("string-length"));
|
13
|
-
|
14
|
-
var _jestWatcher = require("jest-watcher");
|
15
|
-
|
16
|
-
var _jestRegexUtil = require("jest-regex-util");
|
17
|
-
|
18
|
-
var _utils = require("../lib/utils");
|
19
|
-
|
20
|
-
var _pattern_mode_helpers = require("../lib/pattern_mode_helpers");
|
21
|
-
|
22
|
-
var _scroll = _interopRequireDefault(require("../lib/scroll"));
|
23
|
-
|
24
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
25
|
-
|
26
|
-
class FileNamePatternPrompt extends _jestWatcher.PatternPrompt {
|
1
|
+
import chalk from 'chalk';
|
2
|
+
import ansiEscapes from 'ansi-escapes';
|
3
|
+
import stringLength from 'string-length';
|
4
|
+
import { PatternPrompt, printPatternCaret, printRestoredPatternCaret } from 'jest-watcher';
|
5
|
+
import { escapeStrForRegex } from 'jest-regex-util';
|
6
|
+
import { highlight, getTerminalWidth, trimAndFormatPath, removeTrimmingDots } from "../lib/utils.js";
|
7
|
+
import { formatTypeaheadSelection, printMore, printPatternMatches, printStartTyping, printTypeaheadItem } from "../lib/pattern_mode_helpers.js";
|
8
|
+
import scroll from "../lib/scroll.js";
|
9
|
+
export default class FileNamePatternPrompt extends PatternPrompt {
|
27
10
|
constructor(pipe, prompt) {
|
28
11
|
super(pipe, prompt);
|
29
12
|
this._entityName = 'filenames';
|
@@ -42,36 +25,36 @@ class FileNamePatternPrompt extends _jestWatcher.PatternPrompt {
|
|
42
25
|
const total = matchedTests.length;
|
43
26
|
const pipe = this._pipe;
|
44
27
|
const prompt = this._prompt;
|
45
|
-
|
46
|
-
pipe.write(
|
28
|
+
printPatternCaret(pattern, pipe);
|
29
|
+
pipe.write(ansiEscapes.cursorLeft);
|
47
30
|
|
48
31
|
if (pattern) {
|
49
|
-
|
50
|
-
const prefix = ` ${
|
51
|
-
const padding = (
|
52
|
-
const width =
|
32
|
+
printPatternMatches(total, 'file', pipe);
|
33
|
+
const prefix = ` ${chalk.dim('\u203A')} `;
|
34
|
+
const padding = stringLength(prefix) + 2;
|
35
|
+
const width = getTerminalWidth(pipe);
|
53
36
|
const {
|
54
37
|
start,
|
55
38
|
end,
|
56
39
|
index
|
57
|
-
} = (
|
40
|
+
} = scroll(total, options);
|
58
41
|
prompt.setPromptLength(total);
|
59
42
|
matchedTests.slice(start, end).map(({
|
60
43
|
path,
|
61
44
|
context
|
62
45
|
}) => {
|
63
|
-
const filePath =
|
64
|
-
return
|
65
|
-
}).map((item, i) =>
|
46
|
+
const filePath = trimAndFormatPath(padding, context.config, path, width);
|
47
|
+
return highlight(path, filePath, pattern);
|
48
|
+
}).map((item, i) => formatTypeaheadSelection(item, i, index, prompt)).forEach(item => printTypeaheadItem(item, pipe));
|
66
49
|
|
67
50
|
if (total > end) {
|
68
|
-
|
51
|
+
printMore('file', pipe, total - end);
|
69
52
|
}
|
70
53
|
} else {
|
71
|
-
|
54
|
+
printStartTyping('filename', pipe);
|
72
55
|
}
|
73
56
|
|
74
|
-
|
57
|
+
printRestoredPatternCaret(pattern, this._currentUsageRows, pipe);
|
75
58
|
}
|
76
59
|
|
77
60
|
_getMatchedTests(pattern) {
|
@@ -102,10 +85,8 @@ class FileNamePatternPrompt extends _jestWatcher.PatternPrompt {
|
|
102
85
|
|
103
86
|
run(onSuccess, onCancel, options) {
|
104
87
|
super.run(value => {
|
105
|
-
onSuccess(
|
88
|
+
onSuccess(removeTrimmingDots(value).split('/').map(escapeStrForRegex).join('/'));
|
106
89
|
}, onCancel, options);
|
107
90
|
}
|
108
91
|
|
109
|
-
}
|
110
|
-
|
111
|
-
exports.default = FileNamePatternPrompt;
|
92
|
+
}
|
package/build/index.js
CHANGED
@@ -1,51 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.formatTypeaheadSelection = exports.printTypeaheadItem = exports.printMore = exports.printStartTyping = exports.printPatternMatches = void 0;
|
7
|
-
|
8
|
-
var _chalk = _interopRequireDefault(require("chalk"));
|
9
|
-
|
10
|
-
var _stripAnsi = _interopRequireDefault(require("strip-ansi"));
|
11
|
-
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1
|
+
import chalk from 'chalk';
|
2
|
+
import stripAnsi from 'strip-ansi';
|
13
3
|
|
14
4
|
const pluralize = (count, text) => count === 1 ? text : `${text}s`;
|
15
5
|
|
16
|
-
const printPatternMatches = (count, entity, pipe, extraText = '') => {
|
6
|
+
export const printPatternMatches = (count, entity, pipe, extraText = '') => {
|
17
7
|
const pluralized = pluralize(count, entity);
|
18
8
|
const result = count ? `\n\n Pattern matches ${count} ${pluralized}` : `\n\n Pattern matches no ${pluralized}`;
|
19
9
|
pipe.write(result + extraText);
|
20
10
|
};
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
const printStartTyping = (entity, pipe) => {
|
25
|
-
pipe.write(`\n\n ${_chalk.default.italic.yellow(`Start typing to filter by a ${entity} regex pattern.`)}`);
|
11
|
+
export const printStartTyping = (entity, pipe) => {
|
12
|
+
pipe.write(`\n\n ${chalk.italic.yellow(`Start typing to filter by a ${entity} regex pattern.`)}`);
|
26
13
|
};
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
const printMore = (entity, pipe, more) => {
|
31
|
-
pipe.write(`\n ${_chalk.default.dim(`...and ${more} more ${pluralize(more, entity)}`)}`);
|
14
|
+
export const printMore = (entity, pipe, more) => {
|
15
|
+
pipe.write(`\n ${chalk.dim(`...and ${more} more ${pluralize(more, entity)}`)}`);
|
32
16
|
};
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
const printTypeaheadItem = (item, pipe) => {
|
37
|
-
pipe.write(`\n ${_chalk.default.dim('\u203A')} ${item}`);
|
17
|
+
export const printTypeaheadItem = (item, pipe) => {
|
18
|
+
pipe.write(`\n ${chalk.dim('\u203A')} ${item}`);
|
38
19
|
};
|
39
|
-
|
40
|
-
exports.printTypeaheadItem = printTypeaheadItem;
|
41
|
-
|
42
|
-
const formatTypeaheadSelection = (item, index, activeIndex, prompt) => {
|
20
|
+
export const formatTypeaheadSelection = (item, index, activeIndex, prompt) => {
|
43
21
|
if (index === activeIndex) {
|
44
|
-
prompt.setPromptSelection((
|
45
|
-
return
|
22
|
+
prompt.setPromptSelection(stripAnsi(item));
|
23
|
+
return chalk.black.bgYellow(stripAnsi(item));
|
46
24
|
}
|
47
25
|
|
48
26
|
return item;
|
49
|
-
};
|
50
|
-
|
51
|
-
exports.formatTypeaheadSelection = formatTypeaheadSelection;
|
27
|
+
};
|
package/build/lib/scroll.js
CHANGED
@@ -1,10 +1,3 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.default = void 0;
|
7
|
-
|
8
1
|
const scroll = (size, {
|
9
2
|
offset,
|
10
3
|
max
|
@@ -30,5 +23,4 @@ const scroll = (size, {
|
|
30
23
|
};
|
31
24
|
};
|
32
25
|
|
33
|
-
|
34
|
-
exports.default = _default;
|
26
|
+
export default scroll;
|
package/build/lib/utils.js
CHANGED
@@ -1,39 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
});
|
6
|
-
exports.removeTrimmingDots = exports.formatTestNameByPattern = exports.highlight = exports.getTerminalWidth = exports.trimAndFormatPath = void 0;
|
7
|
-
|
8
|
-
var _path = _interopRequireDefault(require("path"));
|
9
|
-
|
10
|
-
var _chalk = _interopRequireDefault(require("chalk"));
|
11
|
-
|
12
|
-
var _slash = _interopRequireDefault(require("slash"));
|
13
|
-
|
14
|
-
var _stripAnsi = _interopRequireDefault(require("strip-ansi"));
|
15
|
-
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17
|
-
|
1
|
+
import path from 'path';
|
2
|
+
import chalk from 'chalk';
|
3
|
+
import slash from 'slash';
|
4
|
+
import stripAnsi from 'strip-ansi';
|
18
5
|
const TRIMMING_DOTS = '...';
|
19
6
|
const ENTER = '⏎';
|
20
7
|
|
21
8
|
const relativePath = (config, testPath) => {
|
22
|
-
const relativeTestPath =
|
23
|
-
|
24
|
-
const
|
25
|
-
|
26
|
-
const basename = _path.default.basename(relativeTestPath);
|
27
|
-
|
9
|
+
const relativeTestPath = path.relative(config.cwd || config.rootDir, testPath);
|
10
|
+
const dirname = path.dirname(relativeTestPath);
|
11
|
+
const basename = path.basename(relativeTestPath);
|
28
12
|
return {
|
29
13
|
basename,
|
30
14
|
dirname
|
31
15
|
};
|
32
16
|
};
|
33
17
|
|
34
|
-
const colorize = (str, start, end) =>
|
18
|
+
const colorize = (str, start, end) => chalk.dim(str.slice(0, start)) + chalk.reset(str.slice(start, end)) + chalk.dim(str.slice(end));
|
35
19
|
|
36
|
-
const trimAndFormatPath = (pad, config, testPath, columns) => {
|
20
|
+
export const trimAndFormatPath = (pad, config, testPath, columns) => {
|
37
21
|
const maxLength = columns - pad;
|
38
22
|
const relative = relativePath(config, testPath);
|
39
23
|
const {
|
@@ -43,8 +27,8 @@ const trimAndFormatPath = (pad, config, testPath, columns) => {
|
|
43
27
|
dirname
|
44
28
|
} = relative; // length is ok
|
45
29
|
|
46
|
-
if ((dirname +
|
47
|
-
return (
|
30
|
+
if ((dirname + path.sep + basename).length <= maxLength) {
|
31
|
+
return slash(chalk.dim(dirname + path.sep) + chalk.bold(basename));
|
48
32
|
} // we can fit trimmed dirname and full basename
|
49
33
|
|
50
34
|
|
@@ -53,39 +37,33 @@ const trimAndFormatPath = (pad, config, testPath, columns) => {
|
|
53
37
|
if (basenameLength + 4 < maxLength) {
|
54
38
|
const dirnameLength = maxLength - 4 - basenameLength;
|
55
39
|
dirname = `${TRIMMING_DOTS}${dirname.slice(dirname.length - dirnameLength, dirname.length)}`;
|
56
|
-
return (
|
40
|
+
return slash(chalk.dim(dirname + path.sep) + chalk.bold(basename));
|
57
41
|
}
|
58
42
|
|
59
43
|
if (basenameLength + 4 === maxLength) {
|
60
|
-
return (
|
44
|
+
return slash(chalk.dim(`${TRIMMING_DOTS}${path.sep}`) + chalk.bold(basename));
|
61
45
|
} // can't fit dirname, but can fit trimmed basename
|
62
46
|
|
63
47
|
|
64
|
-
return (
|
48
|
+
return slash(chalk.bold(`${TRIMMING_DOTS}${basename.slice(-maxLength + 3)}`));
|
65
49
|
};
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
const getTerminalWidth = (pipe = process.stdout) => pipe.columns;
|
70
|
-
|
71
|
-
exports.getTerminalWidth = getTerminalWidth;
|
72
|
-
|
73
|
-
const highlight = (rawPath, filePath, pattern) => {
|
50
|
+
export const getTerminalWidth = (pipe = process.stdout) => pipe.columns;
|
51
|
+
export const highlight = (rawPath, filePath, pattern) => {
|
74
52
|
const relativePathHead = './';
|
75
53
|
let regexp;
|
76
54
|
|
77
55
|
try {
|
78
56
|
regexp = new RegExp(pattern, 'i');
|
79
57
|
} catch (e) {
|
80
|
-
return
|
58
|
+
return chalk.dim(filePath);
|
81
59
|
}
|
82
60
|
|
83
|
-
const strippedRawPath = (
|
84
|
-
const strippedFilePath = (
|
61
|
+
const strippedRawPath = stripAnsi(rawPath);
|
62
|
+
const strippedFilePath = stripAnsi(filePath);
|
85
63
|
const match = strippedRawPath.match(regexp);
|
86
64
|
|
87
65
|
if (!match || match.index == null) {
|
88
|
-
return
|
66
|
+
return chalk.dim(strippedFilePath);
|
89
67
|
}
|
90
68
|
|
91
69
|
const offset = strippedRawPath.length - strippedFilePath.length;
|
@@ -103,23 +81,20 @@ const highlight = (rawPath, filePath, pattern) => {
|
|
103
81
|
const end = start + match[0].length;
|
104
82
|
return colorize(strippedFilePath, Math.max(start, 0), Math.max(end, trimLength));
|
105
83
|
};
|
106
|
-
|
107
|
-
exports.highlight = highlight;
|
108
|
-
|
109
|
-
const formatTestNameByPattern = (testName, pattern, width) => {
|
84
|
+
export const formatTestNameByPattern = (testName, pattern, width) => {
|
110
85
|
const inlineTestName = testName.replace(/(\r\n|\n|\r)/gm, ENTER);
|
111
86
|
let regexp;
|
112
87
|
|
113
88
|
try {
|
114
89
|
regexp = new RegExp(pattern, 'i');
|
115
90
|
} catch (e) {
|
116
|
-
return
|
91
|
+
return chalk.dim(inlineTestName);
|
117
92
|
}
|
118
93
|
|
119
94
|
const match = inlineTestName.match(regexp);
|
120
95
|
|
121
96
|
if (!match || match.index == null) {
|
122
|
-
return
|
97
|
+
return chalk.dim(inlineTestName);
|
123
98
|
}
|
124
99
|
|
125
100
|
const startPatternIndex = Math.max(match.index, 0);
|
@@ -142,15 +117,10 @@ const formatTestNameByPattern = (testName, pattern, width) => {
|
|
142
117
|
const start = startPatternIndex - numberOfTruncatedChars;
|
143
118
|
return colorize(TRIMMING_DOTS + truncatedTestName, start + TRIMMING_DOTS.length, end + TRIMMING_DOTS.length);
|
144
119
|
};
|
145
|
-
|
146
|
-
exports.formatTestNameByPattern = formatTestNameByPattern;
|
147
|
-
|
148
|
-
const removeTrimmingDots = value => {
|
120
|
+
export const removeTrimmingDots = value => {
|
149
121
|
if (value.startsWith(TRIMMING_DOTS)) {
|
150
122
|
return value.slice(TRIMMING_DOTS.length);
|
151
123
|
}
|
152
124
|
|
153
125
|
return value;
|
154
|
-
};
|
155
|
-
|
156
|
-
exports.removeTrimmingDots = removeTrimmingDots;
|
126
|
+
};
|
@@ -1,17 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.default = void 0;
|
7
|
-
|
8
|
-
var _jestWatcher = require("jest-watcher");
|
9
|
-
|
10
|
-
var _prompt = _interopRequireDefault(require("./prompt"));
|
11
|
-
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
|
-
|
14
|
-
class TestNamePlugin {
|
1
|
+
import { Prompt } from 'jest-watcher';
|
2
|
+
import TestNamePatternPrompt from "./prompt.js";
|
3
|
+
export default class TestNamePlugin {
|
15
4
|
constructor({
|
16
5
|
stdin,
|
17
6
|
stdout,
|
@@ -19,7 +8,7 @@ class TestNamePlugin {
|
|
19
8
|
}) {
|
20
9
|
this._stdin = stdin;
|
21
10
|
this._stdout = stdout;
|
22
|
-
this._prompt = new
|
11
|
+
this._prompt = new Prompt();
|
23
12
|
this._testResults = [];
|
24
13
|
this._usageInfo = {
|
25
14
|
key: config.key || 't',
|
@@ -40,7 +29,7 @@ class TestNamePlugin {
|
|
40
29
|
}
|
41
30
|
|
42
31
|
run(globalConfig, updateConfigAndRun) {
|
43
|
-
const p = new
|
32
|
+
const p = new TestNamePatternPrompt(this._stdout, this._prompt);
|
44
33
|
p.updateCachedTestResults(this._testResults);
|
45
34
|
return new Promise((res, rej) => {
|
46
35
|
p.run(testNamePattern => {
|
@@ -57,6 +46,4 @@ class TestNamePlugin {
|
|
57
46
|
return this._usageInfo;
|
58
47
|
}
|
59
48
|
|
60
|
-
}
|
61
|
-
|
62
|
-
exports.default = TestNamePlugin;
|
49
|
+
}
|
@@ -1,27 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
var _ansiEscapes = _interopRequireDefault(require("ansi-escapes"));
|
11
|
-
|
12
|
-
var _jestWatcher = require("jest-watcher");
|
13
|
-
|
14
|
-
var _jestRegexUtil = require("jest-regex-util");
|
15
|
-
|
16
|
-
var _scroll = _interopRequireDefault(require("../lib/scroll"));
|
17
|
-
|
18
|
-
var _utils = require("../lib/utils");
|
19
|
-
|
20
|
-
var _pattern_mode_helpers = require("../lib/pattern_mode_helpers");
|
21
|
-
|
22
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
23
|
-
|
24
|
-
class TestNamePatternPrompt extends _jestWatcher.PatternPrompt {
|
1
|
+
import chalk from 'chalk';
|
2
|
+
import ansiEscapes from 'ansi-escapes';
|
3
|
+
import { PatternPrompt, printPatternCaret, printRestoredPatternCaret } from 'jest-watcher';
|
4
|
+
import { escapeStrForRegex } from 'jest-regex-util';
|
5
|
+
import scroll from "../lib/scroll.js";
|
6
|
+
import { formatTestNameByPattern, getTerminalWidth, removeTrimmingDots } from "../lib/utils.js";
|
7
|
+
import { formatTypeaheadSelection, printMore, printPatternMatches, printStartTyping, printTypeaheadItem } from "../lib/pattern_mode_helpers.js";
|
8
|
+
export default class TestNamePatternPrompt extends PatternPrompt {
|
25
9
|
constructor(pipe, prompt) {
|
26
10
|
super(pipe, prompt);
|
27
11
|
this._entityName = 'tests';
|
@@ -43,28 +27,28 @@ class TestNamePatternPrompt extends _jestWatcher.PatternPrompt {
|
|
43
27
|
const total = matchedTests.length;
|
44
28
|
const pipe = this._pipe;
|
45
29
|
const prompt = this._prompt;
|
46
|
-
|
47
|
-
pipe.write(
|
30
|
+
printPatternCaret(pattern, pipe);
|
31
|
+
pipe.write(ansiEscapes.cursorLeft);
|
48
32
|
|
49
33
|
if (pattern) {
|
50
|
-
|
51
|
-
const width =
|
34
|
+
printPatternMatches(total, 'test', pipe, ` from ${chalk.yellow('cached')} test suites`);
|
35
|
+
const width = getTerminalWidth(pipe);
|
52
36
|
const {
|
53
37
|
start,
|
54
38
|
end,
|
55
39
|
index
|
56
|
-
} = (
|
40
|
+
} = scroll(total, options);
|
57
41
|
prompt.setPromptLength(total);
|
58
|
-
matchedTests.slice(start, end).map(name =>
|
42
|
+
matchedTests.slice(start, end).map(name => formatTestNameByPattern(name, pattern, width - 4)).map((item, i) => formatTypeaheadSelection(item, i, index, prompt)).forEach(item => printTypeaheadItem(item, pipe));
|
59
43
|
|
60
44
|
if (total > end) {
|
61
|
-
|
45
|
+
printMore('test', pipe, total - end);
|
62
46
|
}
|
63
47
|
} else {
|
64
|
-
|
48
|
+
printStartTyping('test name', pipe);
|
65
49
|
}
|
66
50
|
|
67
|
-
|
51
|
+
printRestoredPatternCaret(pattern, this._currentUsageRows, pipe);
|
68
52
|
}
|
69
53
|
|
70
54
|
_getMatchedTests(pattern) {
|
@@ -93,12 +77,10 @@ class TestNamePatternPrompt extends _jestWatcher.PatternPrompt {
|
|
93
77
|
|
94
78
|
run(onSuccess, onCancel, options) {
|
95
79
|
super.run(value => {
|
96
|
-
const preparedPattern =
|
80
|
+
const preparedPattern = escapeStrForRegex(removeTrimmingDots(value));
|
97
81
|
const useExactMatch = this._offset !== -1;
|
98
82
|
onSuccess(useExactMatch ? `^${preparedPattern}$` : preparedPattern);
|
99
83
|
}, onCancel, options);
|
100
84
|
}
|
101
85
|
|
102
|
-
}
|
103
|
-
|
104
|
-
exports.default = TestNamePatternPrompt;
|
86
|
+
}
|
package/build/types/Config.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
export {};
|
package/filename.js
CHANGED
package/package.json
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
{
|
2
2
|
"name": "jest-watch-typeahead",
|
3
|
-
"version": "
|
3
|
+
"version": "1.1.0",
|
4
4
|
"main": "build/index.js",
|
5
|
+
"exports": {
|
6
|
+
".": "./build/index.js",
|
7
|
+
"./filename": "./build/file_name_plugin/plugin.js",
|
8
|
+
"./testname": "./build/test_name_plugin/plugin.js",
|
9
|
+
"./package.json": "./package.json"
|
10
|
+
},
|
11
|
+
"type": "module",
|
5
12
|
"author": "Rogelio Guzman <rogelioguzmanh@gmail.com>",
|
6
13
|
"description": "Jest plugin for filtering by filename or test name",
|
7
14
|
"license": "MIT",
|
@@ -16,10 +23,10 @@
|
|
16
23
|
"testname.js"
|
17
24
|
],
|
18
25
|
"scripts": {
|
19
|
-
"test": "jest",
|
26
|
+
"test": "cross-env NODE_OPTIONS=\"--experimental-vm-modules\" jest",
|
20
27
|
"lint": "eslint .",
|
21
28
|
"prebuild": "rimraf build",
|
22
|
-
"build": "babel --extensions .js,.ts src -d build && rimraf **/*.test.{js,ts},integration",
|
29
|
+
"build": "babel --extensions .js,.ts src -d build && rimraf **/*.test.{js,ts},integration build/**/__tests__ build/test_utils",
|
23
30
|
"prepublish": "yarn build",
|
24
31
|
"format": "prettier --write \"**/*.js\" \"**/*.md\" \"**/*.ts\"",
|
25
32
|
"typecheck": "yarn tsc -p ."
|
@@ -27,42 +34,48 @@
|
|
27
34
|
"dependencies": {
|
28
35
|
"ansi-escapes": "^4.3.1",
|
29
36
|
"chalk": "^4.0.0",
|
30
|
-
"jest-regex-util": "^
|
31
|
-
"jest-watcher": "^
|
32
|
-
"slash": "^
|
33
|
-
"string-length": "^
|
34
|
-
"strip-ansi": "^
|
37
|
+
"jest-regex-util": "^28.0.0",
|
38
|
+
"jest-watcher": "^28.0.0",
|
39
|
+
"slash": "^4.0.0",
|
40
|
+
"string-length": "^5.0.1",
|
41
|
+
"strip-ansi": "^7.0.1"
|
35
42
|
},
|
36
43
|
"devDependencies": {
|
37
44
|
"@babel/cli": "^7.8.4",
|
38
45
|
"@babel/core": "^7.9.6",
|
39
46
|
"@babel/preset-env": "^7.9.6",
|
40
47
|
"@babel/preset-typescript": "^7.10.4",
|
41
|
-
"@jest/
|
48
|
+
"@jest/globals": "^28.0.0",
|
49
|
+
"@jest/types": "^28.0.0",
|
42
50
|
"@semantic-release/changelog": "^5.0.1",
|
43
51
|
"@semantic-release/git": "^9.0.0",
|
44
|
-
"@types/jest": "^
|
45
|
-
"@types/node": "^
|
46
|
-
"@typescript-eslint/eslint-plugin": "^
|
47
|
-
"@typescript-eslint/parser": "^
|
48
|
-
"babel-
|
49
|
-
"babel-
|
50
|
-
"
|
51
|
-
"eslint
|
52
|
+
"@types/jest": "^27.0.0",
|
53
|
+
"@types/node": "^16.0.0",
|
54
|
+
"@typescript-eslint/eslint-plugin": "^5.0.0",
|
55
|
+
"@typescript-eslint/parser": "^5.0.0",
|
56
|
+
"babel-jest": "^28.0.0",
|
57
|
+
"babel-plugin-add-import-extension": "^1.6.0",
|
58
|
+
"cross-env": "^7.0.3",
|
59
|
+
"eslint": "^8.0.0",
|
60
|
+
"eslint-config-airbnb-base": "^15.0.0",
|
52
61
|
"eslint-config-prettier": "^8.0.0",
|
53
62
|
"eslint-plugin-import": "^2.20.2",
|
54
|
-
"eslint-plugin-jest": "^
|
55
|
-
"eslint-plugin-prettier": "^
|
56
|
-
"jest": "^
|
63
|
+
"eslint-plugin-jest": "^26.0.0",
|
64
|
+
"eslint-plugin-prettier": "^4.0.0",
|
65
|
+
"jest": "^28.0.0",
|
57
66
|
"prettier": "^2.1.1",
|
58
67
|
"rimraf": "^3.0.2",
|
59
68
|
"semantic-release": "^17.4.3",
|
69
|
+
"semver": "^7.3.5",
|
60
70
|
"typescript": "^4.0.2"
|
61
71
|
},
|
62
72
|
"peerDependencies": {
|
63
|
-
"jest": "^
|
73
|
+
"jest": "^27.0.0 || ^28.0.0"
|
64
74
|
},
|
65
75
|
"jest": {
|
76
|
+
"extensionsToTreatAsEsm": [
|
77
|
+
".ts"
|
78
|
+
],
|
66
79
|
"watchPlugins": [
|
67
80
|
"<rootDir>/filename",
|
68
81
|
"<rootDir>/testname"
|
@@ -80,11 +93,7 @@
|
|
80
93
|
]
|
81
94
|
},
|
82
95
|
"engines": {
|
83
|
-
"node": ">=
|
84
|
-
},
|
85
|
-
"resolutions": {
|
86
|
-
"semantic-release/@semantic-release/github/fs-extra": "^9.0.0",
|
87
|
-
"semantic-release/@semantic-release/npm/fs-extra": "^9.0.0"
|
96
|
+
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
88
97
|
},
|
89
98
|
"release": {
|
90
99
|
"branches": [
|
package/testname.js
CHANGED
@@ -1,162 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
var _jestWatcher = require("jest-watcher");
|
4
|
-
|
5
|
-
var _pluginTester = _interopRequireDefault(require("../../test_utils/pluginTester"));
|
6
|
-
|
7
|
-
var _plugin = _interopRequireDefault(require("../plugin"));
|
8
|
-
|
9
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
10
|
-
|
11
|
-
const projects = [{
|
12
|
-
config: {
|
13
|
-
rootDir: '/project'
|
14
|
-
},
|
15
|
-
testPaths: ['/project/src/foo.js', '/project/src/file-1.js']
|
16
|
-
}, {
|
17
|
-
config: {
|
18
|
-
rootDir: '/project'
|
19
|
-
},
|
20
|
-
testPaths: ['/project/src/bar.js', '/project/src/file-2.js']
|
21
|
-
}];
|
22
|
-
it('shows the correct initial state', async () => {
|
23
|
-
const {
|
24
|
-
stdout,
|
25
|
-
hookEmitter,
|
26
|
-
updateConfigAndRun,
|
27
|
-
plugin,
|
28
|
-
type
|
29
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
30
|
-
hookEmitter.onFileChange({
|
31
|
-
projects
|
32
|
-
});
|
33
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
34
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
35
|
-
type(_jestWatcher.KEYS.ENTER);
|
36
|
-
await runPromise;
|
37
|
-
});
|
38
|
-
it('can use arrows to select a specific file', async () => {
|
39
|
-
const {
|
40
|
-
stdout,
|
41
|
-
hookEmitter,
|
42
|
-
updateConfigAndRun,
|
43
|
-
plugin,
|
44
|
-
type
|
45
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
46
|
-
hookEmitter.onFileChange({
|
47
|
-
projects
|
48
|
-
});
|
49
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
50
|
-
stdout.write.mockReset();
|
51
|
-
type('f', 'i', _jestWatcher.KEYS.ARROW_DOWN, _jestWatcher.KEYS.ENTER);
|
52
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
53
|
-
await runPromise;
|
54
|
-
expect(updateConfigAndRun).toHaveBeenCalledWith({
|
55
|
-
mode: 'watch',
|
56
|
-
testPathPattern: 'src/file-1\\.js'
|
57
|
-
});
|
58
|
-
});
|
59
|
-
it('can select a specific file that includes a regexp special character', async () => {
|
60
|
-
const {
|
61
|
-
hookEmitter,
|
62
|
-
updateConfigAndRun,
|
63
|
-
plugin,
|
64
|
-
type
|
65
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
66
|
-
hookEmitter.onFileChange({
|
67
|
-
projects: [{
|
68
|
-
config: {
|
69
|
-
rootDir: '/project'
|
70
|
-
},
|
71
|
-
testPaths: ['/project/src/file_(xyz).js']
|
72
|
-
}]
|
73
|
-
});
|
74
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
75
|
-
type('x', 'y', 'z', _jestWatcher.KEYS.ARROW_DOWN, _jestWatcher.KEYS.ENTER);
|
76
|
-
await runPromise;
|
77
|
-
expect(updateConfigAndRun).toHaveBeenCalledWith({
|
78
|
-
mode: 'watch',
|
79
|
-
testPathPattern: 'src/file_\\(xyz\\)\\.js'
|
80
|
-
});
|
81
|
-
});
|
82
|
-
it('can select a pattern that matches multiple files', async () => {
|
83
|
-
const {
|
84
|
-
stdout,
|
85
|
-
hookEmitter,
|
86
|
-
updateConfigAndRun,
|
87
|
-
plugin,
|
88
|
-
type
|
89
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
90
|
-
hookEmitter.onFileChange({
|
91
|
-
projects
|
92
|
-
});
|
93
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
94
|
-
stdout.write.mockReset();
|
95
|
-
type('f', 'i', _jestWatcher.KEYS.ENTER);
|
96
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
97
|
-
await runPromise;
|
98
|
-
expect(updateConfigAndRun).toHaveBeenCalledWith({
|
99
|
-
mode: 'watch',
|
100
|
-
testPathPattern: 'fi'
|
101
|
-
});
|
102
|
-
});
|
103
|
-
it('can configure the key and prompt', async () => {
|
104
|
-
const {
|
105
|
-
plugin
|
106
|
-
} = (0, _pluginTester.default)(_plugin.default, {
|
107
|
-
config: {
|
108
|
-
key: 'l',
|
109
|
-
prompt: 'have a custom prompt'
|
110
|
-
}
|
111
|
-
});
|
112
|
-
expect(plugin.getUsageInfo()).toEqual({
|
113
|
-
key: 'l',
|
114
|
-
prompt: 'have a custom prompt'
|
115
|
-
});
|
116
|
-
});
|
117
|
-
it('file matching is case insensitive', async () => {
|
118
|
-
const {
|
119
|
-
stdout,
|
120
|
-
hookEmitter,
|
121
|
-
updateConfigAndRun,
|
122
|
-
plugin,
|
123
|
-
type
|
124
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
125
|
-
hookEmitter.onFileChange({
|
126
|
-
projects
|
127
|
-
});
|
128
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
129
|
-
type('f');
|
130
|
-
stdout.write.mockReset();
|
131
|
-
type('I');
|
132
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
133
|
-
type(_jestWatcher.KEYS.ENTER);
|
134
|
-
await runPromise;
|
135
|
-
});
|
136
|
-
it("selected file doesn't include trimming dots", async () => {
|
137
|
-
const {
|
138
|
-
hookEmitter,
|
139
|
-
updateConfigAndRun,
|
140
|
-
plugin,
|
141
|
-
type
|
142
|
-
} = (0, _pluginTester.default)(_plugin.default, {
|
143
|
-
stdout: {
|
144
|
-
columns: 40
|
145
|
-
}
|
146
|
-
});
|
147
|
-
hookEmitter.onFileChange({
|
148
|
-
projects: [{
|
149
|
-
config: {
|
150
|
-
rootDir: '/project'
|
151
|
-
},
|
152
|
-
testPaths: ['/project/src/long_name_gonna_need_trimming.js']
|
153
|
-
}]
|
154
|
-
});
|
155
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
156
|
-
type('t', 'r', 'i', 'm', 'm', _jestWatcher.KEYS.ARROW_DOWN, _jestWatcher.KEYS.ENTER);
|
157
|
-
await runPromise;
|
158
|
-
expect(updateConfigAndRun).toHaveBeenCalledWith({
|
159
|
-
mode: 'watch',
|
160
|
-
testPathPattern: 'ong_name_gonna_need_trimming\\.js'
|
161
|
-
});
|
162
|
-
});
|
@@ -1,79 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
var _chalk = _interopRequireDefault(require("chalk"));
|
4
|
-
|
5
|
-
var _utils = require("../utils");
|
6
|
-
|
7
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
8
|
-
|
9
|
-
describe('trimAndFormatPath', () => {
|
10
|
-
test.each`
|
11
|
-
testPath | pad | columns
|
12
|
-
${'/project/src/gonna/fit/all.js'} | ${6} | ${80}
|
13
|
-
${'/project/src/trimmed_dir/foo.js'} | ${6} | ${20}
|
14
|
-
${'/project/src/exactly/sep_and_basename.js'} | ${6} | ${29}
|
15
|
-
${'/project/src/long_name_gonna_need_trimming.js'} | ${6} | ${40}
|
16
|
-
`('formats when testpath="$testPath", pad="$pad", and columns="$columns"', ({
|
17
|
-
testPath,
|
18
|
-
pad,
|
19
|
-
columns
|
20
|
-
}) => {
|
21
|
-
expect((0, _utils.trimAndFormatPath)(pad, {
|
22
|
-
rootDir: '/project'
|
23
|
-
}, testPath, columns)).toMatchSnapshot();
|
24
|
-
});
|
25
|
-
});
|
26
|
-
describe('formatTestNameByPattern', () => {
|
27
|
-
test.each`
|
28
|
-
testName | pattern | width
|
29
|
-
${'the test name'} | ${'the'} | ${30}
|
30
|
-
${'the test name'} | ${'the'} | ${25}
|
31
|
-
${'the test name'} | ${'the'} | ${20}
|
32
|
-
${'the test name'} | ${'the'} | ${15}
|
33
|
-
${'the test name'} | ${'the'} | ${10}
|
34
|
-
${'the test name'} | ${'the'} | ${5}
|
35
|
-
${'the test name'} | ${'test'} | ${30}
|
36
|
-
${'the test name'} | ${'test'} | ${25}
|
37
|
-
${'the test name'} | ${'test'} | ${20}
|
38
|
-
${'the test name'} | ${'test'} | ${15}
|
39
|
-
${'the test name'} | ${'test'} | ${10}
|
40
|
-
${'the test name'} | ${'test'} | ${5}
|
41
|
-
${'the test name'} | ${'name'} | ${30}
|
42
|
-
${'the test name'} | ${'name'} | ${25}
|
43
|
-
${'the test name'} | ${'name'} | ${20}
|
44
|
-
${'the test name'} | ${'name'} | ${15}
|
45
|
-
${'the test name'} | ${'name'} | ${10}
|
46
|
-
${'the test name'} | ${'name'} | ${5}
|
47
|
-
`('formats when testname="$testName", pattern="$pattern", and width="$width"', ({
|
48
|
-
testName,
|
49
|
-
pattern,
|
50
|
-
width
|
51
|
-
}) => {
|
52
|
-
expect((0, _utils.formatTestNameByPattern)(testName, pattern, width)).toMatchSnapshot();
|
53
|
-
});
|
54
|
-
});
|
55
|
-
describe('highlight', () => {
|
56
|
-
const rawPath = '/Users/janedoe/my-project/src/__tests__/utils/experimentation/entry-point/parseEntryPoint.test.js';
|
57
|
-
const pattern = 'parse';
|
58
|
-
let filePath;
|
59
|
-
/**
|
60
|
-
* Helps us test that the highlight is placed correctly when `filePath`
|
61
|
-
* contains ANSI characters from being formatted by chalk.
|
62
|
-
* Passing a plain string for `filePath` results in false negatives.
|
63
|
-
*/
|
64
|
-
|
65
|
-
const formatWithAnsi = text => _chalk.default.dim(text);
|
66
|
-
|
67
|
-
it('places highlight correctly when file path is not truncated', () => {
|
68
|
-
filePath = formatWithAnsi('__tests__/utils/experimentation/entry-point/parseEntryPoint.test.js');
|
69
|
-
expect((0, _utils.highlight)(rawPath, filePath, pattern)).toMatchInlineSnapshot(`"<dim>__tests__/utils/experimentation/entry-point/</></>parse</><dim>EntryPoint.test.js</>"`);
|
70
|
-
});
|
71
|
-
it('places highlight correctly when file path is truncated', () => {
|
72
|
-
filePath = formatWithAnsi('...tils/experimentation/entry-point/parseEntryPoint.test.js');
|
73
|
-
expect((0, _utils.highlight)(rawPath, filePath, pattern)).toMatchInlineSnapshot(`"<dim>...tils/experimentation/entry-point/</></>parse</><dim>EntryPoint.test.js</>"`);
|
74
|
-
});
|
75
|
-
it('places highlight correctly when file path has relative head', () => {
|
76
|
-
filePath = formatWithAnsi('./src/__tests__/utils/experimentation/entry-point/parseEntryPoint.test.js');
|
77
|
-
expect((0, _utils.highlight)(rawPath, filePath, pattern)).toMatchInlineSnapshot(`"<dim>./src/__tests__/utils/experimentation/entry-point/</></>parse</><dim>EntryPoint.test.js</>"`);
|
78
|
-
});
|
79
|
-
});
|
@@ -1,197 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
var _jestWatcher = require("jest-watcher");
|
4
|
-
|
5
|
-
var _pluginTester = _interopRequireDefault(require("../../test_utils/pluginTester"));
|
6
|
-
|
7
|
-
var _plugin = _interopRequireDefault(require("../plugin"));
|
8
|
-
|
9
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
10
|
-
|
11
|
-
const testResults = [{
|
12
|
-
testResults: [{
|
13
|
-
title: 'foo 1',
|
14
|
-
fullName: 'some description foo 1'
|
15
|
-
}, {
|
16
|
-
title: 'bar 1',
|
17
|
-
fullName: 'some description bar 1'
|
18
|
-
}]
|
19
|
-
}, {
|
20
|
-
testResults: [{
|
21
|
-
title: 'foo 2',
|
22
|
-
fullName: 'other description foo 2'
|
23
|
-
}, {
|
24
|
-
title: 'bar 2',
|
25
|
-
fullName: 'other description bar 2'
|
26
|
-
}]
|
27
|
-
}];
|
28
|
-
it('shows the correct initial state', async () => {
|
29
|
-
const {
|
30
|
-
stdout,
|
31
|
-
updateConfigAndRun,
|
32
|
-
plugin,
|
33
|
-
type
|
34
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
35
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
36
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
37
|
-
type(_jestWatcher.KEYS.ENTER);
|
38
|
-
await runPromise;
|
39
|
-
});
|
40
|
-
it('shows the correct message when there are no cached tests', async () => {
|
41
|
-
const {
|
42
|
-
stdout,
|
43
|
-
updateConfigAndRun,
|
44
|
-
plugin,
|
45
|
-
type
|
46
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
47
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
48
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
49
|
-
type('t', _jestWatcher.KEYS.ENTER);
|
50
|
-
await runPromise;
|
51
|
-
});
|
52
|
-
it('can use arrows to select a specific test', async () => {
|
53
|
-
const {
|
54
|
-
stdout,
|
55
|
-
hookEmitter,
|
56
|
-
updateConfigAndRun,
|
57
|
-
plugin,
|
58
|
-
type
|
59
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
60
|
-
hookEmitter.onTestRunComplete({
|
61
|
-
testResults
|
62
|
-
});
|
63
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
64
|
-
stdout.write.mockReset();
|
65
|
-
type('f', _jestWatcher.KEYS.ARROW_DOWN, _jestWatcher.KEYS.ARROW_DOWN, _jestWatcher.KEYS.ENTER);
|
66
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
67
|
-
await runPromise;
|
68
|
-
expect(updateConfigAndRun).toHaveBeenCalledWith({
|
69
|
-
mode: 'watch',
|
70
|
-
testNamePattern: '^other description foo 2$'
|
71
|
-
});
|
72
|
-
});
|
73
|
-
it('can select a pattern that matches multiple tests', async () => {
|
74
|
-
const {
|
75
|
-
stdout,
|
76
|
-
hookEmitter,
|
77
|
-
updateConfigAndRun,
|
78
|
-
plugin,
|
79
|
-
type
|
80
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
81
|
-
hookEmitter.onTestRunComplete({
|
82
|
-
testResults
|
83
|
-
});
|
84
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
85
|
-
stdout.write.mockReset();
|
86
|
-
type('f', 'o', _jestWatcher.KEYS.ENTER);
|
87
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
88
|
-
await runPromise;
|
89
|
-
expect(updateConfigAndRun).toHaveBeenCalledWith({
|
90
|
-
mode: 'watch',
|
91
|
-
testNamePattern: 'fo'
|
92
|
-
});
|
93
|
-
});
|
94
|
-
it('can select a pattern that matches a describe block', async () => {
|
95
|
-
const {
|
96
|
-
stdout,
|
97
|
-
hookEmitter,
|
98
|
-
updateConfigAndRun,
|
99
|
-
plugin,
|
100
|
-
type
|
101
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
102
|
-
hookEmitter.onTestRunComplete({
|
103
|
-
testResults
|
104
|
-
});
|
105
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
106
|
-
stdout.write.mockReset();
|
107
|
-
type('s', 'o', _jestWatcher.KEYS.ENTER);
|
108
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
109
|
-
await runPromise;
|
110
|
-
expect(updateConfigAndRun).toHaveBeenCalledWith({
|
111
|
-
mode: 'watch',
|
112
|
-
testNamePattern: 'so'
|
113
|
-
});
|
114
|
-
});
|
115
|
-
it('can select a pattern that includes a regexp special character', async () => {
|
116
|
-
const {
|
117
|
-
hookEmitter,
|
118
|
-
updateConfigAndRun,
|
119
|
-
plugin,
|
120
|
-
type
|
121
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
122
|
-
hookEmitter.onTestRunComplete({
|
123
|
-
testResults: [{
|
124
|
-
testResults: [{
|
125
|
-
title: 'bracket',
|
126
|
-
fullName: 'bracket description (foo)'
|
127
|
-
}]
|
128
|
-
}]
|
129
|
-
});
|
130
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
131
|
-
type('b', 'r', _jestWatcher.KEYS.ARROW_DOWN, _jestWatcher.KEYS.ENTER);
|
132
|
-
await runPromise;
|
133
|
-
expect(updateConfigAndRun).toHaveBeenCalledWith({
|
134
|
-
mode: 'watch',
|
135
|
-
testNamePattern: '^bracket description \\(foo\\)$'
|
136
|
-
});
|
137
|
-
});
|
138
|
-
it('can configure the key and prompt', async () => {
|
139
|
-
const {
|
140
|
-
plugin
|
141
|
-
} = (0, _pluginTester.default)(_plugin.default, {
|
142
|
-
config: {
|
143
|
-
key: 'l',
|
144
|
-
prompt: 'have a custom prompt'
|
145
|
-
}
|
146
|
-
});
|
147
|
-
expect(plugin.getUsageInfo()).toEqual({
|
148
|
-
key: 'l',
|
149
|
-
prompt: 'have a custom prompt'
|
150
|
-
});
|
151
|
-
});
|
152
|
-
it('test matching is case insensitive', async () => {
|
153
|
-
const {
|
154
|
-
stdout,
|
155
|
-
hookEmitter,
|
156
|
-
updateConfigAndRun,
|
157
|
-
plugin,
|
158
|
-
type
|
159
|
-
} = (0, _pluginTester.default)(_plugin.default);
|
160
|
-
hookEmitter.onTestRunComplete({
|
161
|
-
testResults
|
162
|
-
});
|
163
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
164
|
-
type('f');
|
165
|
-
stdout.write.mockReset();
|
166
|
-
type('O');
|
167
|
-
expect(stdout.write.mock.calls.join('\n')).toMatchSnapshot();
|
168
|
-
type(_jestWatcher.KEYS.ENTER);
|
169
|
-
await runPromise;
|
170
|
-
});
|
171
|
-
it("selected pattern doesn't include trimming dots", async () => {
|
172
|
-
const {
|
173
|
-
hookEmitter,
|
174
|
-
updateConfigAndRun,
|
175
|
-
plugin,
|
176
|
-
type
|
177
|
-
} = (0, _pluginTester.default)(_plugin.default, {
|
178
|
-
stdout: {
|
179
|
-
columns: 30
|
180
|
-
}
|
181
|
-
});
|
182
|
-
hookEmitter.onTestRunComplete({
|
183
|
-
testResults: [{
|
184
|
-
testResults: [{
|
185
|
-
title: 'trimmed long',
|
186
|
-
fullName: 'long test name, gonna need trimming'
|
187
|
-
}]
|
188
|
-
}]
|
189
|
-
});
|
190
|
-
const runPromise = plugin.run({}, updateConfigAndRun);
|
191
|
-
type('t', 'r', 'i', 'm', 'm', _jestWatcher.KEYS.ARROW_DOWN, _jestWatcher.KEYS.ENTER);
|
192
|
-
await runPromise;
|
193
|
-
expect(updateConfigAndRun).toHaveBeenCalledWith({
|
194
|
-
mode: 'watch',
|
195
|
-
testNamePattern: '^me, gonna need trimming$'
|
196
|
-
});
|
197
|
-
});
|
@@ -1,59 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.default = pluginTester;
|
7
|
-
|
8
|
-
var _jestWatcher = require("jest-watcher");
|
9
|
-
|
10
|
-
var _stripAnsi = _interopRequireDefault(require("strip-ansi"));
|
11
|
-
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
|
-
|
14
|
-
expect.addSnapshotSerializer({
|
15
|
-
test: val => typeof val === 'string',
|
16
|
-
print: val => (0, _stripAnsi.default)(val)
|
17
|
-
});
|
18
|
-
/**
|
19
|
-
* See https://github.com/facebook/jest/pull/7523 for more details
|
20
|
-
*/
|
21
|
-
|
22
|
-
const CLEAR = '\x1B[2J\x1B[3J\x1B[H';
|
23
|
-
expect.addSnapshotSerializer({
|
24
|
-
test: val => val.includes(CLEAR),
|
25
|
-
print: val => (0, _stripAnsi.default)(val.replace(CLEAR, '[MOCK - clear]'))
|
26
|
-
});
|
27
|
-
/**
|
28
|
-
* See https://github.com/facebook/jest/pull/7523 for more details
|
29
|
-
*/
|
30
|
-
|
31
|
-
const WINDOWS_CLEAR = '\x1B[2J\x1B[0f';
|
32
|
-
expect.addSnapshotSerializer({
|
33
|
-
test: val => val.includes(WINDOWS_CLEAR),
|
34
|
-
print: val => (0, _stripAnsi.default)(val.replace(WINDOWS_CLEAR, '[MOCK - clear]'))
|
35
|
-
});
|
36
|
-
|
37
|
-
function pluginTester(Plugin, options = {}) {
|
38
|
-
const stdout = {
|
39
|
-
columns: (options.stdout || {}).columns || 80,
|
40
|
-
write: jest.fn()
|
41
|
-
};
|
42
|
-
const jestHooks = new _jestWatcher.JestHook();
|
43
|
-
const plugin = new Plugin({
|
44
|
-
stdout,
|
45
|
-
stdin: process.stdin,
|
46
|
-
config: options.config
|
47
|
-
});
|
48
|
-
plugin.apply(jestHooks.getSubscriber());
|
49
|
-
|
50
|
-
const type = (...keys) => keys.forEach(key => plugin.onKey(key));
|
51
|
-
|
52
|
-
return {
|
53
|
-
stdout,
|
54
|
-
hookEmitter: jestHooks.getEmitter(),
|
55
|
-
updateConfigAndRun: jest.fn(),
|
56
|
-
plugin,
|
57
|
-
type
|
58
|
-
};
|
59
|
-
}
|