@bahmutov/cy-grep 1.5.2 → 1.7.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 +25 -0
- package/package.json +1 -1
- package/src/plugin.js +30 -7
- package/src/utils.js +31 -1
package/README.md
CHANGED
@@ -70,6 +70,7 @@ Watch the video [intro to cypress-grep plugin](https://www.youtube.com/watch?v=H
|
|
70
70
|
- [Debugging in the browser](#debugging-in-the-browser)
|
71
71
|
- [Examples](#examples)
|
72
72
|
- [See also](#see-also)
|
73
|
+
- [cy-grep vs cypress-grep vs @cypress/grep](#cy-grep-vs-cypress-grep-vs-cypressgrep)
|
73
74
|
- [Small Print](#small-print)
|
74
75
|
|
75
76
|
<!-- /MarkdownTOC -->
|
@@ -288,6 +289,13 @@ If you can pass commas in the environment variable `grepTags`, you can use `,` t
|
|
288
289
|
CYPRESS_grepTags=one,two npx cypress run
|
289
290
|
```
|
290
291
|
|
292
|
+
If a specific tag is not found in the specs, you will get a warning in the terminal:
|
293
|
+
|
294
|
+
```
|
295
|
+
$ npx cypress run --env grepTags=@wrong-tag
|
296
|
+
cy-grep: could not find the tag "@wrong-tag" in any of the specs
|
297
|
+
```
|
298
|
+
|
291
299
|
### Tags in the test config object
|
292
300
|
|
293
301
|
Cypress tests can have their own [test config object](https://on.cypress.io/configuration#Test-Configuration), and when using this plugin you can put the test tags there, either as a single tag string or as an array of tags.
|
@@ -643,8 +651,25 @@ To see how to debug this plugin, watch the video [Debug cypress-grep Plugin](htt
|
|
643
651
|
- [cypress-select-tests](https://github.com/bahmutov/cypress-select-tests)
|
644
652
|
- [cypress-skip-test](https://github.com/cypress-io/cypress-skip-test)
|
645
653
|
|
654
|
+
## cy-grep vs cypress-grep vs @cypress/grep
|
655
|
+
|
656
|
+
Many years ago I wrote a plugin `cypress-grep`. When I left the company Cypress, I transferred that MIT-licensed plugin to the Cypress GitHub organization. They moved it to the Cypress monorepo and renamed the NPM module `@cypress/grep`. I still use this grep plugin in some projects. When Cypress v10 was released, it broke some of the things in the plugin. Since I needed to fix it quickly and the monorepo setup is suboptimal, I forked the plugin back to my own repo `bahmutov/cy-grep` (this repo) and released under NPM name `@bahmutov/cy-grep`.
|
657
|
+
|
658
|
+
I plan to maintain the plugin `@bahmutov/cy-grep` in the future, since I rely on it myself **a lot**.
|
659
|
+
|
646
660
|
## Small Print
|
647
661
|
|
662
|
+
Author: Gleb Bahmutov <gleb.bahmutov@gmail.com> © 2022
|
663
|
+
|
664
|
+
- [@bahmutov](https://twitter.com/bahmutov)
|
665
|
+
- [glebbahmutov.com](https://glebbahmutov.com)
|
666
|
+
- [blog](https://glebbahmutov.com/blog)
|
667
|
+
- [videos](https://www.youtube.com/glebbahmutov)
|
668
|
+
- [presentations](https://slides.com/bahmutov)
|
669
|
+
- [cypress.tips](https://cypress.tips)
|
670
|
+
- [Cypress Tips & Tricks Newsletter](https://cypresstips.substack.com/)
|
671
|
+
- [my Cypress courses](https://cypress.tips/courses)
|
672
|
+
|
648
673
|
License: MIT - do anything with the code, but don't blame me if it does not work.
|
649
674
|
|
650
675
|
Support: if you find any problems with this module, email / tweet /
|
package/package.json
CHANGED
package/src/plugin.js
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
// @ts-check
|
2
2
|
const debug = require('debug')('cy-grep')
|
3
|
-
const globby = require('globby')
|
4
3
|
|
5
4
|
const { getSpecs } = require('find-cypress-specs')
|
6
5
|
const { getTestNames, findEffectiveTestTags } = require('find-test-names')
|
7
6
|
const fs = require('fs')
|
8
7
|
const path = require('path')
|
9
8
|
const { version } = require('../package.json')
|
10
|
-
const { parseGrep, shouldTestRun } = require('./utils')
|
9
|
+
const { parseGrep, shouldTestRun, getMentionedTags } = require('./utils')
|
11
10
|
|
12
11
|
const isCypressV9 = (config) => !('specPattern' in config)
|
13
12
|
|
@@ -107,8 +106,12 @@ function cypressGrepPlugin(config) {
|
|
107
106
|
debug('%o', greppedSpecs)
|
108
107
|
} else if (grepTags) {
|
109
108
|
const parsedGrep = parseGrep(null, grepTags)
|
110
|
-
|
111
109
|
debug('parsed grep tags %o', parsedGrep)
|
110
|
+
const mentionedTags = getMentionedTags(grepTags)
|
111
|
+
debug('user mentioned tags %o', mentionedTags)
|
112
|
+
// unique tags found across all specs we search
|
113
|
+
const foundTags = new Set()
|
114
|
+
|
112
115
|
greppedSpecs = specFiles.filter((specFile) => {
|
113
116
|
const text = fs.readFileSync(specFile, { encoding: 'utf8' })
|
114
117
|
|
@@ -121,6 +124,15 @@ function cypressGrepPlugin(config) {
|
|
121
124
|
return Object.keys(testTags).some((testTitle) => {
|
122
125
|
const effectiveTags = testTags[testTitle].effectiveTags
|
123
126
|
const requiredTags = testTags[testTitle].requiredTags
|
127
|
+
|
128
|
+
// remember all found tags
|
129
|
+
effectiveTags.forEach((tag) => {
|
130
|
+
foundTags.add(tag)
|
131
|
+
})
|
132
|
+
requiredTags.forEach((tag) => {
|
133
|
+
foundTags.add(tag)
|
134
|
+
})
|
135
|
+
|
124
136
|
return shouldTestRun(
|
125
137
|
parsedGrep,
|
126
138
|
undefined,
|
@@ -139,6 +151,17 @@ function cypressGrepPlugin(config) {
|
|
139
151
|
|
140
152
|
debug('found grep tags "%s" in %d specs', grepTags, greppedSpecs.length)
|
141
153
|
debug('%o', greppedSpecs)
|
154
|
+
|
155
|
+
debug('all found tags across the specs %o', ...foundTags)
|
156
|
+
debug('user mentioned tags %o', mentionedTags)
|
157
|
+
mentionedTags.forEach((tag) => {
|
158
|
+
if (!foundTags.has(tag)) {
|
159
|
+
console.warn(
|
160
|
+
'cy-grep: could not find the tag "%s" in any of the specs',
|
161
|
+
tag,
|
162
|
+
)
|
163
|
+
}
|
164
|
+
})
|
142
165
|
} else {
|
143
166
|
// we have no tags to grep
|
144
167
|
debug('will try eliminating specs with required tags')
|
@@ -191,10 +214,10 @@ function cypressGrepPlugin(config) {
|
|
191
214
|
}
|
192
215
|
} else {
|
193
216
|
// hmm, we filtered out all specs, probably something is wrong
|
194
|
-
console.warn('grep and/or grepTags has eliminated all specs')
|
195
|
-
grep ? console.warn('grep: %s', grep) : null
|
196
|
-
grepTags ? console.warn('
|
197
|
-
console.warn('Will leave all specs to run to filter at run-time')
|
217
|
+
console.warn('cy-grep: grep and/or grepTags has eliminated all specs')
|
218
|
+
grep ? console.warn('cy-grep: title: %s', grep) : null
|
219
|
+
grepTags ? console.warn('cy-grep: tags: %s', grepTags) : null
|
220
|
+
console.warn('cy-grep: Will leave all specs to run to filter at run-time')
|
198
221
|
}
|
199
222
|
}
|
200
223
|
|
package/src/utils.js
CHANGED
@@ -37,13 +37,20 @@ function parseFullTitleGrep(s) {
|
|
37
37
|
|
38
38
|
/**
|
39
39
|
* Parses tags to grep for.
|
40
|
-
* @param {string} s Tags string like "@tag1+@tag2"
|
40
|
+
* @param {string|string[]} s Tags string like "@tag1+@tag2", or array of tags
|
41
|
+
* @example
|
42
|
+
* parseTagsGrep('@tag1+@tag2')
|
43
|
+
* @example
|
44
|
+
* parseTagsGrep(['@tag1', '@tag2'])
|
41
45
|
*/
|
42
46
|
function parseTagsGrep(s) {
|
43
47
|
if (!s) {
|
44
48
|
return []
|
45
49
|
}
|
46
50
|
|
51
|
+
if (Array.isArray(s)) {
|
52
|
+
s = s.join(',')
|
53
|
+
}
|
47
54
|
const explicitNotTags = []
|
48
55
|
|
49
56
|
// top level split - using space or comma, each part is OR
|
@@ -95,6 +102,28 @@ function parseTagsGrep(s) {
|
|
95
102
|
return ORS_filtered
|
96
103
|
}
|
97
104
|
|
105
|
+
/**
|
106
|
+
* Given a user string of tags to find, with various connectors,
|
107
|
+
* returns the list of just the tags themselves. Could be used to
|
108
|
+
* quickly filter test specs or find misspelled tags.
|
109
|
+
* @returns {string[]} list of unique tags
|
110
|
+
*/
|
111
|
+
function getMentionedTags(s) {
|
112
|
+
if (!s) {
|
113
|
+
return []
|
114
|
+
}
|
115
|
+
const spaced = s.replaceAll(/[+,]/g, ' ')
|
116
|
+
const tags = spaced
|
117
|
+
.split(' ')
|
118
|
+
.map((s) => s.trim())
|
119
|
+
.filter(Boolean)
|
120
|
+
// remove any "-" at the start of the tag
|
121
|
+
// because these are to signal inverted tags
|
122
|
+
.map((s) => (s.startsWith('-') ? s.slice(1) : s))
|
123
|
+
const uniqueTags = [...new Set(tags)]
|
124
|
+
return uniqueTags.sort()
|
125
|
+
}
|
126
|
+
|
98
127
|
function shouldTestRunRequiredTags(parsedGrepTags, requiredTags = []) {
|
99
128
|
if (!requiredTags.length) {
|
100
129
|
// there are no tags to check
|
@@ -216,4 +245,5 @@ module.exports = {
|
|
216
245
|
shouldTestRunTags,
|
217
246
|
shouldTestRunRequiredTags,
|
218
247
|
shouldTestRunTitle,
|
248
|
+
getMentionedTags,
|
219
249
|
}
|