gurkencheck 0.0.7 → 0.0.9

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.
Files changed (80) hide show
  1. package/README.md +19 -0
  2. package/dist/config-parser.d.ts.map +1 -1
  3. package/dist/config-parser.js +7 -1
  4. package/dist/config-parser.js.map +1 -1
  5. package/dist/diagnostics.d.ts +34 -0
  6. package/dist/diagnostics.d.ts.map +1 -0
  7. package/dist/diagnostics.js +53 -0
  8. package/dist/diagnostics.js.map +1 -0
  9. package/dist/feature-finder.d.ts +38 -0
  10. package/dist/feature-finder.d.ts.map +1 -1
  11. package/dist/feature-finder.js +86 -8
  12. package/dist/feature-finder.js.map +1 -1
  13. package/dist/formatters/index.d.ts +44 -4
  14. package/dist/formatters/index.d.ts.map +1 -1
  15. package/dist/formatters/index.js +52 -15
  16. package/dist/formatters/index.js.map +1 -1
  17. package/dist/formatters/stylish.d.ts +3 -0
  18. package/dist/formatters/stylish.d.ts.map +1 -1
  19. package/dist/formatters/stylish.js +32 -1
  20. package/dist/formatters/stylish.js.map +1 -1
  21. package/dist/formatters/tap.d.ts +14 -0
  22. package/dist/formatters/tap.d.ts.map +1 -1
  23. package/dist/formatters/tap.js +22 -7
  24. package/dist/formatters/tap.js.map +1 -1
  25. package/dist/gherkin/parse.d.ts +42 -1
  26. package/dist/gherkin/parse.d.ts.map +1 -1
  27. package/dist/gherkin/parse.js +68 -3
  28. package/dist/gherkin/parse.js.map +1 -1
  29. package/dist/index.d.ts +18 -10
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +10 -6
  32. package/dist/index.js.map +1 -1
  33. package/dist/linter.d.ts +31 -3
  34. package/dist/linter.d.ts.map +1 -1
  35. package/dist/linter.js +82 -15
  36. package/dist/linter.js.map +1 -1
  37. package/dist/logger.d.ts +2 -0
  38. package/dist/logger.d.ts.map +1 -1
  39. package/dist/logger.js +4 -0
  40. package/dist/logger.js.map +1 -1
  41. package/dist/main.d.ts +9 -1
  42. package/dist/main.d.ts.map +1 -1
  43. package/dist/main.js +147 -26
  44. package/dist/main.js.map +1 -1
  45. package/dist/rules/no-dupe-feature-names.d.ts.map +1 -1
  46. package/dist/rules/no-dupe-feature-names.js +26 -13
  47. package/dist/rules/no-dupe-feature-names.js.map +1 -1
  48. package/dist/rules/no-dupe-file-names.d.ts.map +1 -1
  49. package/dist/rules/no-dupe-file-names.js +32 -17
  50. package/dist/rules/no-dupe-file-names.js.map +1 -1
  51. package/dist/rules/no-dupe-scenario-names.d.ts.map +1 -1
  52. package/dist/rules/no-dupe-scenario-names.js +34 -22
  53. package/dist/rules/no-dupe-scenario-names.js.map +1 -1
  54. package/dist/rules.d.ts +41 -3
  55. package/dist/rules.d.ts.map +1 -1
  56. package/dist/rules.js +112 -4
  57. package/dist/rules.js.map +1 -1
  58. package/dist/stats/collect.d.ts +8 -0
  59. package/dist/stats/collect.d.ts.map +1 -1
  60. package/dist/stats/collect.js +67 -37
  61. package/dist/stats/collect.js.map +1 -1
  62. package/dist/stats/command.d.ts +2 -1
  63. package/dist/stats/command.d.ts.map +1 -1
  64. package/dist/stats/command.js +34 -34
  65. package/dist/stats/command.js.map +1 -1
  66. package/dist/types.d.ts +47 -3
  67. package/dist/types.d.ts.map +1 -1
  68. package/dist/util/glob.d.ts +18 -0
  69. package/dist/util/glob.d.ts.map +1 -1
  70. package/dist/util/glob.js +126 -22
  71. package/dist/util/glob.js.map +1 -1
  72. package/dist/util/stream.d.ts +31 -0
  73. package/dist/util/stream.d.ts.map +1 -0
  74. package/dist/util/stream.js +67 -0
  75. package/dist/util/stream.js.map +1 -0
  76. package/dist/watch.d.ts +36 -0
  77. package/dist/watch.d.ts.map +1 -0
  78. package/dist/watch.js +203 -0
  79. package/dist/watch.js.map +1 -0
  80. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/util/glob.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA8DpD;AA0DD,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAyBD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,EAAE,CAmC7E"}
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/util/glob.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA8DpD;AAgCD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAE7E;AAsFD,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AA0DD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,EAAE,CAsB7E;AAED;;;;;;;;;;GAUG;AACH,wBAAuB,UAAU,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAgB,GACxB,cAAc,CAAC,MAAM,CAAC,CAsBxB"}
package/dist/util/glob.js CHANGED
@@ -109,19 +109,44 @@ function staticPrefix(pattern) {
109
109
  }
110
110
  return literal.join('/');
111
111
  }
112
+ /**
113
+ * The directory a pattern's search starts from - the leading run of literal
114
+ * segments, resolved against `cwd`. What you would watch to be told about
115
+ * anything the pattern could match.
116
+ */
117
+ export function globRoot(pattern, cwd = process.cwd()) {
118
+ return path.resolve(cwd, staticPrefix(pattern.split(path.sep).join('/')));
119
+ }
112
120
  function isHidden(name) {
113
121
  return name.startsWith('.');
114
122
  }
115
- function walk(directory, onFile) {
116
- let entries;
123
+ /**
124
+ * Orders the entries of a directory so that walking depth-first reaches files
125
+ * in the same order that sorting the finished paths would.
126
+ *
127
+ * Everything inside a directory `d` has a path starting `d/`, so `d` has to
128
+ * be ordered as `d/` rather than as `d`. Otherwise a sibling file called
129
+ * `d-1.feature` comes after the directory here and before it in a sorted
130
+ * list, because `-` sorts before `/` - and a walk that hands files over as it
131
+ * finds them would quietly report them in a different order from one that
132
+ * collects and sorts.
133
+ */
134
+ function byPathOrder(a, b) {
135
+ const left = a.isDirectory() ? `${a.name}/` : a.name;
136
+ const right = b.isDirectory() ? `${b.name}/` : b.name;
137
+ return left < right ? -1 : left > right ? 1 : 0;
138
+ }
139
+ function readEntries(directory) {
117
140
  try {
118
- entries = fs.readdirSync(directory, { withFileTypes: true });
141
+ return fs.readdirSync(directory, { withFileTypes: true }).sort(byPathOrder);
119
142
  }
120
143
  catch {
121
144
  // A missing or unreadable directory simply contributes no matches.
122
- return;
145
+ return [];
123
146
  }
124
- for (const entry of entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))) {
147
+ }
148
+ function walk(directory, onFile) {
149
+ for (const entry of readEntries(directory)) {
125
150
  if (isHidden(entry.name)) {
126
151
  continue;
127
152
  }
@@ -134,6 +159,43 @@ function walk(directory, onFile) {
134
159
  }
135
160
  }
136
161
  }
162
+ /**
163
+ * The same walk, handing each file over as it is reached.
164
+ *
165
+ * Each directory is still read synchronously. `fs.promises.readdir` was tried
166
+ * and is about 40% slower over a tree of a couple of thousand directories -
167
+ * a promise for each directory costs more than reading it does - and it
168
+ * bought nothing, because the only thing waiting on this walk is the work
169
+ * being fed by it. What matters is that the walk is no longer one long block:
170
+ * it gives way at every file, and the reading and checking downstream happen
171
+ * in the gaps.
172
+ */
173
+ async function* walkStream(root) {
174
+ // An explicit stack rather than recursion: a recursive async generator
175
+ // delegates through one `yield*` per level of nesting for every file it
176
+ // hands over, so a deep tree pays for its depth on every single file.
177
+ const stack = [{ directory: root, entries: readEntries(root), index: 0 }];
178
+ while (stack.length > 0) {
179
+ const top = stack[stack.length - 1];
180
+ if (top.index >= top.entries.length) {
181
+ stack.pop();
182
+ continue;
183
+ }
184
+ const entry = top.entries[top.index++];
185
+ if (isHidden(entry.name)) {
186
+ continue;
187
+ }
188
+ const absolutePath = path.join(top.directory, entry.name);
189
+ if (entry.isDirectory()) {
190
+ // Pushed so that its contents come before the entries after it here,
191
+ // which is what a depth-first walk means.
192
+ stack.push({ directory: absolutePath, entries: readEntries(absolutePath), index: 0 });
193
+ }
194
+ else if (entry.isFile()) {
195
+ yield absolutePath;
196
+ }
197
+ }
198
+ }
137
199
  /**
138
200
  * True when the path, or any directory leading to it, matches one of the
139
201
  * patterns.
@@ -156,42 +218,84 @@ function isIgnored(relativePath, ignores) {
156
218
  }
157
219
  return false;
158
220
  }
159
- /**
160
- * Returns the files matching `pattern`, as paths relative to `cwd` using
161
- * forward slashes. Directories are never returned. Results are sorted.
162
- */
163
- export function globSync(pattern, options = {}) {
221
+ function newSearch(pattern, options) {
164
222
  const cwd = options.cwd ?? process.cwd();
165
223
  const normalisedPattern = pattern.split(path.sep).join('/');
166
224
  const matches = globToRegExp(normalisedPattern);
167
225
  const ignores = (options.ignore ?? []).map((ignorePattern) => globToRegExp(ignorePattern.split(path.sep).join('/')));
168
- const searchRoot = path.resolve(cwd, staticPrefix(normalisedPattern));
169
- const found = [];
170
226
  // An absolute pattern is matched against absolute paths: comparing it with
171
227
  // a path relative to cwd can never match, and the search would come back
172
228
  // empty rather than wrong, which reads as "nothing to report".
173
229
  const absolutePattern = path.isAbsolute(normalisedPattern);
230
+ return {
231
+ searchRoot: path.resolve(cwd, staticPrefix(normalisedPattern)),
232
+ match(absolutePath) {
233
+ const relativePath = path.relative(cwd, absolutePath).split(path.sep).join('/');
234
+ const candidate = absolutePattern ? absolutePath.split(path.sep).join('/') : relativePath;
235
+ if (!matches.test(candidate))
236
+ return undefined;
237
+ if (isIgnored(relativePath, ignores))
238
+ return undefined;
239
+ return relativePath;
240
+ },
241
+ };
242
+ }
243
+ /**
244
+ * Returns the files matching `pattern`, as paths relative to `cwd` using
245
+ * forward slashes. Directories are never returned. Results are sorted.
246
+ */
247
+ export function globSync(pattern, options = {}) {
248
+ const search = newSearch(pattern, options);
249
+ const found = [];
174
250
  const consider = (absolutePath) => {
175
- const relativePath = path.relative(cwd, absolutePath).split(path.sep).join('/');
176
- const candidate = absolutePattern ? absolutePath.split(path.sep).join('/') : relativePath;
177
- if (!matches.test(candidate))
178
- return;
179
- if (isIgnored(relativePath, ignores))
180
- return;
181
- found.push(relativePath);
251
+ const relativePath = search.match(absolutePath);
252
+ if (relativePath !== undefined) {
253
+ found.push(relativePath);
254
+ }
182
255
  };
183
- const stats = statOrUndefined(searchRoot);
256
+ const stats = statOrUndefined(search.searchRoot);
184
257
  if (stats === undefined) {
185
258
  return [];
186
259
  }
187
260
  if (stats.isFile()) {
188
- consider(searchRoot);
261
+ consider(search.searchRoot);
189
262
  }
190
263
  else {
191
- walk(searchRoot, consider);
264
+ walk(search.searchRoot, consider);
192
265
  }
193
266
  return found.sort();
194
267
  }
268
+ /**
269
+ * The same search, handing each match over as it is found.
270
+ *
271
+ * Collecting a whole tree before anything else starts is time in which
272
+ * nothing is read, parsed or checked. This hands each match over as it is
273
+ * reached, so the work after it starts on the first file rather than on the
274
+ * last.
275
+ *
276
+ * The order is the order `globSync` returns, without anything being collected
277
+ * to sort: `byPathOrder` is what makes the two agree.
278
+ */
279
+ export async function* globStream(pattern, options = {}) {
280
+ const search = newSearch(pattern, options);
281
+ const stats = statOrUndefined(search.searchRoot);
282
+ if (stats === undefined) {
283
+ return;
284
+ }
285
+ if (stats.isFile()) {
286
+ const relativePath = search.match(search.searchRoot);
287
+ if (relativePath !== undefined) {
288
+ yield relativePath;
289
+ }
290
+ return;
291
+ }
292
+ for await (const absolutePath of walkStream(search.searchRoot)) {
293
+ const relativePath = search.match(absolutePath);
294
+ if (relativePath !== undefined) {
295
+ yield relativePath;
296
+ }
297
+ }
298
+ }
195
299
  function statOrUndefined(target) {
196
300
  try {
197
301
  return fs.statSync(target);
@@ -1 +1 @@
1
- {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/util/glob.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/util/glob.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Working through a list without starting all of it at once.
3
+ */
4
+ /** Values to work through, however they arrive. */
5
+ export type Sequence<T> = Iterable<T> | AsyncIterable<T>;
6
+ /**
7
+ * Maps over the values, keeping at most `window` results in flight, and hands
8
+ * each one over in the order the values were given.
9
+ *
10
+ * `Promise.all` over a list starts every one of them at once, which for a
11
+ * list of files means a file descriptor each and every result held in memory
12
+ * until the last one arrives. A window bounds both: what is held is a
13
+ * property of the window rather than of the length of the list.
14
+ *
15
+ * Results come back in order whatever order they finish in, so a caller that
16
+ * cares about the order the values were given - and the rules looking across
17
+ * files do - gets it without sorting anything.
18
+ *
19
+ * Stopping early stops the work: nothing beyond the window is started, what
20
+ * is left is dropped, and a source still producing values is closed.
21
+ *
22
+ * The values may arrive as an array or as something producing them one at a
23
+ * time, so a walk of a directory tree can feed this without being collected
24
+ * first.
25
+ *
26
+ * `map` must not reject. A result is started before anything awaits it, so a
27
+ * rejection would be an unhandled one rather than something the caller could
28
+ * catch.
29
+ */
30
+ export declare function mapWithWindow<T, R>(values: Sequence<T>, window: number, map: (value: T) => Promise<R>): AsyncGenerator<R>;
31
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/util/stream.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mDAAmD;AACnD,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAWzD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAuB,aAAa,CAAC,CAAC,EAAE,CAAC,EACvC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EACnB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC5B,cAAc,CAAC,CAAC,CAAC,CA8BnB"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Working through a list without starting all of it at once.
3
+ */
4
+ /** One iterator over either kind, so the rest need not care which it is. */
5
+ async function* asAsync(values) {
6
+ if (Symbol.asyncIterator in values) {
7
+ yield* values;
8
+ }
9
+ else {
10
+ yield* values;
11
+ }
12
+ }
13
+ /**
14
+ * Maps over the values, keeping at most `window` results in flight, and hands
15
+ * each one over in the order the values were given.
16
+ *
17
+ * `Promise.all` over a list starts every one of them at once, which for a
18
+ * list of files means a file descriptor each and every result held in memory
19
+ * until the last one arrives. A window bounds both: what is held is a
20
+ * property of the window rather than of the length of the list.
21
+ *
22
+ * Results come back in order whatever order they finish in, so a caller that
23
+ * cares about the order the values were given - and the rules looking across
24
+ * files do - gets it without sorting anything.
25
+ *
26
+ * Stopping early stops the work: nothing beyond the window is started, what
27
+ * is left is dropped, and a source still producing values is closed.
28
+ *
29
+ * The values may arrive as an array or as something producing them one at a
30
+ * time, so a walk of a directory tree can feed this without being collected
31
+ * first.
32
+ *
33
+ * `map` must not reject. A result is started before anything awaits it, so a
34
+ * rejection would be an unhandled one rather than something the caller could
35
+ * catch.
36
+ */
37
+ export async function* mapWithWindow(values, window, map) {
38
+ const width = Math.max(1, Math.trunc(window));
39
+ const source = asAsync(values);
40
+ const inFlight = [];
41
+ let drained = false;
42
+ const fill = async () => {
43
+ while (!drained && inFlight.length < width) {
44
+ const next = await source.next();
45
+ if (next.done === true) {
46
+ drained = true;
47
+ return;
48
+ }
49
+ inFlight.push(map(next.value));
50
+ }
51
+ };
52
+ try {
53
+ await fill();
54
+ while (inFlight.length > 0) {
55
+ // Taken from the front, so the order in is the order out.
56
+ const result = await inFlight.shift();
57
+ yield result;
58
+ await fill();
59
+ }
60
+ }
61
+ finally {
62
+ // Stopping early stops the source too, so a walk feeding this does not
63
+ // carry on over a tree nobody is going to look at.
64
+ await source.return(undefined);
65
+ }
66
+ }
67
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/util/stream.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,4EAA4E;AAC5E,KAAK,SAAS,CAAC,CAAC,OAAO,CAAI,MAAmB;IAC5C,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,CAAC,MAAM,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,CAAC,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,aAAa,CAClC,MAAmB,EACnB,MAAc,EACd,GAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,0DAA0D;YAC1D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAG,CAAC;YACvC,MAAM,MAAM,CAAC;YACb,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;IACH,CAAC;YAAS,CAAC;QACT,uEAAuE;QACvE,mDAAmD;QACnD,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Diagnostics } from './diagnostics.ts';
2
+ /** How long changes are allowed to keep arriving before a pass starts. */
3
+ export declare const DEFAULT_SETTLE_MS = 80;
4
+ export interface WatchOptions {
5
+ /** Where diagnostics about the watch itself go. */
6
+ diagnostics: Diagnostics;
7
+ /**
8
+ * How long to wait for changes to stop arriving before checking again.
9
+ *
10
+ * Saving a file is rarely one event: an editor may write, rename and
11
+ * change the mode, and a formatter on save adds more. Waiting for the flurry
12
+ * to end means one pass rather than four.
13
+ */
14
+ settleMs?: number;
15
+ /** Names to take no notice of, matched against any part of the path. */
16
+ ignore?: readonly string[];
17
+ /**
18
+ * Stops the watch when it aborts.
19
+ *
20
+ * Ctrl-C stops it too. This is for a caller that is not a terminal - a test,
21
+ * or an editor closing the project it was watching.
22
+ */
23
+ signal?: AbortSignal;
24
+ }
25
+ /** True when a change to this path could change what a run would report. */
26
+ export declare function isInteresting(relativePath: string, configFileName: string): boolean;
27
+ /**
28
+ * Runs `check` once, then again whenever something under `roots` changes,
29
+ * until the process is interrupted.
30
+ *
31
+ * Resolves when it is stopped, so the caller can go on to exit tidily. A pass
32
+ * failing does not stop the watch: the point of watching is to be told when
33
+ * it stops failing.
34
+ */
35
+ export declare function watch(roots: readonly string[], configFileName: string, options: WatchOptions, check: () => Promise<unknown>): Promise<number>;
36
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAElD,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,WAAW,EAAE,WAAW,CAAC;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAGnF;AAED;;;;;;;GAOG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,CAiLjB"}
package/dist/watch.js ADDED
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Checking again whenever the feature files change.
3
+ *
4
+ * This knows about watching and nothing about linting: it is handed something
5
+ * to run, and runs it whenever the tree underneath changes. What that
6
+ * something does - which formatter, which rules - is the caller's business.
7
+ *
8
+ * Every pass is a whole run. Keeping the parsed files between passes was the
9
+ * obvious optimisation and is the wrong trade here: the rules that look
10
+ * across files rebuild their state from every file anyway, so the only thing
11
+ * caching saves is the reading and parsing - and it saves it by holding every
12
+ * syntax tree in memory for as long as the process lives, which for a suite
13
+ * of any size is hundreds of megabytes sitting idle between keystrokes. A
14
+ * whole pass over a few thousand files takes well under a second, and the
15
+ * memory stays where a bounded read-ahead put it.
16
+ */
17
+ import fs from 'node:fs';
18
+ import path from 'node:path';
19
+ import { EXIT_OK } from './exit-codes.js';
20
+ /** How long changes are allowed to keep arriving before a pass starts. */
21
+ export const DEFAULT_SETTLE_MS = 80;
22
+ /** True when a change to this path could change what a run would report. */
23
+ export function isInteresting(relativePath, configFileName) {
24
+ const name = path.basename(relativePath);
25
+ return relativePath.endsWith('.feature') || name === configFileName;
26
+ }
27
+ /**
28
+ * Runs `check` once, then again whenever something under `roots` changes,
29
+ * until the process is interrupted.
30
+ *
31
+ * Resolves when it is stopped, so the caller can go on to exit tidily. A pass
32
+ * failing does not stop the watch: the point of watching is to be told when
33
+ * it stops failing.
34
+ */
35
+ export async function watch(roots, configFileName, options, check) {
36
+ const { diagnostics } = options;
37
+ const settleMs = options.settleMs ?? DEFAULT_SETTLE_MS;
38
+ const ignore = options.ignore ?? [];
39
+ const watchers = [];
40
+ const changed = new Set();
41
+ /** Set once the watch is waiting, so a watcher failing then can end it. */
42
+ let stopWatching;
43
+ let timer;
44
+ let running = false;
45
+ let againAfterThis = false;
46
+ const ignored = (relativePath) => ignore.some((entry) => relativePath.split(path.sep).includes(entry));
47
+ /**
48
+ * Runs a pass, and one more afterwards if anything changed while it ran.
49
+ * A change arriving mid-pass may or may not have been picked up, and
50
+ * checking twice is cheaper than being wrong about it.
51
+ */
52
+ const runCheck = async () => {
53
+ if (running) {
54
+ againAfterThis = true;
55
+ return;
56
+ }
57
+ running = true;
58
+ try {
59
+ do {
60
+ againAfterThis = false;
61
+ try {
62
+ await check();
63
+ }
64
+ catch (thrown) {
65
+ // What is being run belongs to the caller. A pass that falls over
66
+ // must not end the watch, or you would have to start it again to
67
+ // find out you had fixed the thing that broke it.
68
+ diagnostics.report({
69
+ level: 'error',
70
+ message: `The check failed: ${thrown instanceof Error ? thrown.message : String(thrown)}`,
71
+ });
72
+ }
73
+ } while (againAfterThis);
74
+ }
75
+ finally {
76
+ running = false;
77
+ }
78
+ };
79
+ const schedule = () => {
80
+ if (timer !== undefined) {
81
+ clearTimeout(timer);
82
+ }
83
+ timer = setTimeout(() => {
84
+ timer = undefined;
85
+ const what = changed.size === 1 ? ([...changed][0] ?? 'a file') : `${changed.size} files`;
86
+ changed.clear();
87
+ diagnostics.report({ level: 'notice', message: `\n${what} changed - checking again` });
88
+ void runCheck();
89
+ }, settleMs);
90
+ // A watch should not be the reason a process stays alive once the thing
91
+ // it was watching for has been dealt with.
92
+ timer.unref?.();
93
+ };
94
+ /** Watchers still working. A watcher that gives up takes itself out. */
95
+ const living = new Set();
96
+ for (const root of roots) {
97
+ // Checked before watching rather than left to fs.watch, because what
98
+ // fs.watch does about a missing directory is not the same everywhere: it
99
+ // throws on some platforms and reports an error event later on others,
100
+ // and the second kind would leave this waiting on a watch of nothing.
101
+ let directory = false;
102
+ try {
103
+ directory = fs.statSync(root).isDirectory();
104
+ }
105
+ catch {
106
+ directory = false;
107
+ }
108
+ if (!directory) {
109
+ diagnostics.report({
110
+ level: 'error',
111
+ message: `Could not watch "${root}": it is not a directory.`,
112
+ });
113
+ continue;
114
+ }
115
+ try {
116
+ const watcher = fs.watch(root, { recursive: true }, (_event, filename) => {
117
+ // Some platforms hand over no name; there is nothing to filter on, so
118
+ // check rather than risk missing a change.
119
+ if (filename === null) {
120
+ schedule();
121
+ return;
122
+ }
123
+ const relativePath = filename.toString();
124
+ if (ignored(relativePath) || !isInteresting(relativePath, configFileName)) {
125
+ return;
126
+ }
127
+ changed.add(path.basename(relativePath));
128
+ schedule();
129
+ });
130
+ watcher.on('error', (thrown) => {
131
+ // One watch giving up should not take the others with it - but if
132
+ // they all give up there is nothing left to wait for, and waiting
133
+ // anyway would be a process that never returns.
134
+ diagnostics.report({
135
+ level: 'detail',
136
+ message: `No longer watching "${root}": ${thrown.message}`,
137
+ });
138
+ watcher.close();
139
+ living.delete(watcher);
140
+ if (living.size === 0) {
141
+ stopWatching?.();
142
+ }
143
+ });
144
+ watchers.push(watcher);
145
+ living.add(watcher);
146
+ }
147
+ catch (thrown) {
148
+ diagnostics.report({
149
+ level: 'error',
150
+ message: `Could not watch "${root}": ${thrown instanceof Error ? thrown.message : String(thrown)}`,
151
+ });
152
+ }
153
+ }
154
+ if (watchers.length === 0) {
155
+ diagnostics.report({
156
+ level: 'error',
157
+ message: 'Nothing could be watched, so there would be nothing to wait for.',
158
+ });
159
+ return EXIT_OK;
160
+ }
161
+ await runCheck();
162
+ diagnostics.report({
163
+ level: 'notice',
164
+ message: '\nWatching for changes. Press Ctrl-C to stop.',
165
+ });
166
+ return await new Promise((resolve) => {
167
+ let stopped = false;
168
+ const stop = () => {
169
+ if (stopped) {
170
+ return;
171
+ }
172
+ stopped = true;
173
+ process.off('SIGINT', stop);
174
+ process.off('SIGTERM', stop);
175
+ options.signal?.removeEventListener('abort', stop);
176
+ if (timer !== undefined) {
177
+ clearTimeout(timer);
178
+ }
179
+ for (const watcher of watchers) {
180
+ watcher.close();
181
+ }
182
+ // The ^C the terminal echoed is sitting at the start of the line.
183
+ diagnostics.report({ level: 'notice', message: '' });
184
+ resolve(EXIT_OK);
185
+ };
186
+ stopWatching = stop;
187
+ process.on('SIGINT', stop);
188
+ process.on('SIGTERM', stop);
189
+ // A watcher may have given up while the first pass was running, in which
190
+ // case there is nothing left to wait for.
191
+ if (living.size === 0) {
192
+ stop();
193
+ return;
194
+ }
195
+ if (options.signal?.aborted === true) {
196
+ stop();
197
+ }
198
+ else {
199
+ options.signal?.addEventListener('abort', stop, { once: true });
200
+ }
201
+ });
202
+ }
203
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gurkencheck",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "A Gherkin linter/validator written in TypeScript, with no build step beyond tsc",
5
5
  "keywords": [
6
6
  "gherkin",