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
package/dist/rules.js CHANGED
@@ -39,7 +39,13 @@ async function loadRulesFrom(directory) {
39
39
  const loaded = [];
40
40
  for (const file of files) {
41
41
  const absolute = path.join(resolved, file);
42
- const module = (await import(__rewriteRelativeImportExtension(pathToFileURL(absolute).href)));
42
+ let module;
43
+ try {
44
+ module = (await import(__rewriteRelativeImportExtension(pathToFileURL(absolute).href)));
45
+ }
46
+ catch (thrown) {
47
+ throw new Error(`Could not load the rule "${absolute}": ${thrown instanceof Error ? thrown.message : String(thrown)}`);
48
+ }
43
49
  loaded.push(extractRule(module, absolute));
44
50
  }
45
51
  return loaded;
@@ -77,20 +83,106 @@ export function getRuleSeverity(config) {
77
83
  export function getRuleSettings(config) {
78
84
  return Array.isArray(config) ? config[1] : undefined;
79
85
  }
80
- /** Clears the state kept by rules that look for duplicates across files. */
86
+ /**
87
+ * Clears the state kept by rules that look for duplicates across files.
88
+ *
89
+ * @deprecated Use `beginRun`, which does this and hands each rule a context
90
+ * of its own besides.
91
+ */
81
92
  export function resetRules(rules) {
82
93
  for (const rule of rules.values()) {
83
94
  rule.reset?.();
84
95
  }
85
96
  }
97
+ /**
98
+ * One rule's state for one run, made the first time the rule asks for it.
99
+ *
100
+ * Exported because testing a rule on its own means handing it one of these.
101
+ */
102
+ export function newRunContext() {
103
+ let state;
104
+ let made = false;
105
+ return {
106
+ state(create) {
107
+ if (!made) {
108
+ state = create();
109
+ made = true;
110
+ }
111
+ return state;
112
+ },
113
+ };
114
+ }
115
+ /** Starts a run, telling every enabled rule that one is beginning. */
116
+ export function beginRun(rules, configuration) {
117
+ // Rules written before contexts existed keep their state in the module and
118
+ // clear it here. Deprecated, but still honoured.
119
+ resetRules(rules);
120
+ const contexts = new Map();
121
+ const run = {
122
+ contextFor(ruleName) {
123
+ let context = contexts.get(ruleName);
124
+ if (context === undefined) {
125
+ context = newRunContext();
126
+ contexts.set(ruleName, context);
127
+ }
128
+ return context;
129
+ },
130
+ };
131
+ for (const rule of rules.values()) {
132
+ const config = configuration[rule.name];
133
+ if (isRuleEnabled(config)) {
134
+ rule.onRunStart?.(getRuleSettings(config), run.contextFor(rule.name));
135
+ }
136
+ }
137
+ return run;
138
+ }
139
+ /**
140
+ * Ends a run, collecting what could only be worked out once every file had
141
+ * been seen.
142
+ *
143
+ * As while checking a file, a rule that throws costs you its own findings
144
+ * rather than everyone else's.
145
+ */
146
+ export async function finishRun(rules, configuration, run) {
147
+ const findings = [];
148
+ for (const rule of rules.values()) {
149
+ const config = configuration[rule.name];
150
+ if (!isRuleEnabled(config) || rule.onRunEnd === undefined) {
151
+ continue;
152
+ }
153
+ const severity = getRuleSeverity(config);
154
+ try {
155
+ const found = await rule.onRunEnd(getRuleSettings(config), run.contextFor(rule.name));
156
+ for (const finding of found) {
157
+ findings.push({ severity, ...finding });
158
+ }
159
+ }
160
+ catch (thrown) {
161
+ // No file to blame: what failed was the look back over all of them.
162
+ findings.push({
163
+ message: `Rule "${rule.name}" failed at the end of the run: ${thrown instanceof Error ? thrown.message : String(thrown)}`,
164
+ rule: 'unexpected-error',
165
+ line: 0,
166
+ });
167
+ }
168
+ }
169
+ return findings;
170
+ }
86
171
  /**
87
172
  * Runs every enabled rule against one feature file.
88
173
  *
89
174
  * Rules are awaited one at a time. Most return an array outright, in which
90
175
  * case awaiting costs nothing; a rule that needs to wait for something can
91
176
  * return a promise instead.
177
+ *
178
+ * A rule that throws is reported as an `unexpected-error` finding naming it,
179
+ * and the remaining rules still run.
180
+ *
181
+ * `run` carries the state the rules keep between the files of one run. Left
182
+ * out, a run of this one file alone is started, which is what a caller
183
+ * checking a single file wants.
92
184
  */
93
- export async function runEnabledRules(feature, file, configuration, rules) {
185
+ export async function runEnabledRules(feature, file, configuration, rules, run = beginRun(rules, configuration)) {
94
186
  const errors = [];
95
187
  for (const rule of rules.values()) {
96
188
  const config = configuration[rule.name];
@@ -98,7 +190,23 @@ export async function runEnabledRules(feature, file, configuration, rules) {
98
190
  continue;
99
191
  }
100
192
  const severity = getRuleSeverity(config);
101
- for (const error of await rule.run(feature, file, getRuleSettings(config))) {
193
+ let found;
194
+ try {
195
+ found = await rule.run(feature, file, getRuleSettings(config), run.contextFor(rule.name));
196
+ }
197
+ catch (thrown) {
198
+ // A rule that throws - one of your own from --rulesdir, or a built-in
199
+ // one meeting a file it did not expect - costs you that rule's findings
200
+ // for this file, not every other rule's. The failure is reported in
201
+ // their place so that it cannot pass unnoticed.
202
+ errors.push({
203
+ message: `Rule "${rule.name}" failed: ${thrown instanceof Error ? thrown.message : String(thrown)}`,
204
+ rule: 'unexpected-error',
205
+ line: 0,
206
+ });
207
+ continue;
208
+ }
209
+ for (const error of found) {
102
210
  // The configuration decides how loudly a rule reports, so a custom rule
103
211
  // needs no say in it - but one that sets a severity itself is respected.
104
212
  errors.push({ severity, ...error });
package/dist/rules.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":";;;;;;;;AAAA;;GAEG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AACvC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAWhD,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAExC,uDAAuD;AACvD,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAE1C,SAAS,MAAM,CAAC,SAAkB;IAChC,OAAO,CACL,OAAO,SAAS,KAAK,QAAQ;QAC7B,SAAS,KAAK,IAAI;QAClB,OAAQ,SAAsB,CAAC,IAAI,KAAK,QAAQ;QAChD,OAAQ,SAAsB,CAAC,GAAG,KAAK,UAAU,CAClD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,MAA+B,EAAE,MAAc;IAClE,KAAK,MAAM,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;QACpE,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,kGAAkG,CAC5G,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,SAAiB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,eAAe,EAAE,EAAE,EAAC,GAAG,EAAE,QAAQ,EAAC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,kCAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAC,CAA4B,CAAC;QACvF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,mBAAmB,GAAsB,EAAE;IAE3C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,MAAM,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gDAAgD;AAChD,SAAS,OAAO,CAAC,MAA8B;IAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7F,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,MAA8B;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC;AAC5C,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,eAAe,CAAC,MAA8B;IAC5D,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AAC1D,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,MAA8B;IAC5D,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CAAC,KAAmB;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAA4B,EAC5B,IAAiB,EACjB,aAA4B,EAC5B,KAAmB;IAEnB,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC3E,wEAAwE;YACxE,yEAAyE;YACzE,MAAM,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,GAAG,KAAK,EAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { ParseResult } from '../gherkin/parse.ts';
2
2
  import type { SimilarityOptions } from './similar.ts';
3
+ import type { Sequence } from '../util/stream.ts';
3
4
  import type { Distribution, Statistics } from './types.ts';
4
5
  export interface CollectOptions {
5
6
  /** How alike two steps have to be to be reported as nearly the same. */
@@ -20,4 +21,11 @@ export declare function distribution(values: readonly number[]): Distribution;
20
21
  * is worse than none of it, because the numbers would quietly be wrong.
21
22
  */
22
23
  export declare function collectStatistics(parsed: readonly ParseResult[], options?: CollectOptions): Statistics;
24
+ /**
25
+ * The same count, over files arriving one at a time.
26
+ *
27
+ * Nothing here holds on to a parsed document once it has been counted, so a
28
+ * suite of any size costs the same as the report it produces.
29
+ */
30
+ export declare function collectStatisticsFrom(parsed: Sequence<ParseResult>, options?: CollectOptions): Promise<Statistics>;
23
31
  //# sourceMappingURL=collect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/stats/collect.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAWrD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EAMZ,UAAU,EAGX,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,CAkBpE;AA2ID;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,OAAO,GAAE,cAAmB,GAC3B,UAAU,CA8FZ"}
1
+ {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/stats/collect.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAWrD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EAMZ,UAAU,EAGX,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,CAkBpE;AAgRD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,OAAO,GAAE,cAAmB,GAC3B,UAAU,CAMZ;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC7B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAMrB"}
@@ -40,7 +40,7 @@ function testCases(scenario) {
40
40
  }
41
41
  return scenario.examples.reduce((total, examples) => total + examples.tableBody.length, 0);
42
42
  }
43
- function tally(counts, key) {
43
+ function tallyOne(counts, key) {
44
44
  counts.set(key, (counts.get(key) ?? 0) + 1);
45
45
  }
46
46
  /** Most used first, and alphabetically within an equal count. */
@@ -122,17 +122,11 @@ function collectFile(feature, file, into) {
122
122
  }
123
123
  for (const { node } of taggedNodesOf(feature)) {
124
124
  for (const tag of node.tags) {
125
- tally(into.tags, tag.name);
125
+ tallyOne(into.tags, tag.name);
126
126
  }
127
127
  }
128
128
  }
129
- /**
130
- * Counts a set of parsed feature files.
131
- *
132
- * Files the parser refused are listed rather than counted: half a broken file
133
- * is worse than none of it, because the numbers would quietly be wrong.
134
- */
135
- export function collectStatistics(parsed, options = {}) {
129
+ function newTally() {
136
130
  const inventory = {
137
131
  features: 0,
138
132
  rules: 0,
@@ -145,35 +139,45 @@ export function collectStatistics(parsed, options = {}) {
145
139
  dataTables: 0,
146
140
  docStrings: 0,
147
141
  };
148
- const into = {
149
- inventory,
150
- steps: new Map(),
151
- keywords: { given: 0, when: 0, then: 0, other: 0 },
152
- stepWords: [],
153
- stepsPerScenario: [],
154
- scenarios: [],
155
- tags: new Map(),
156
- effective: 0,
157
- untagged: 0,
142
+ return {
143
+ into: {
144
+ inventory,
145
+ steps: new Map(),
146
+ keywords: { given: 0, when: 0, then: 0, other: 0 },
147
+ stepWords: [],
148
+ stepsPerScenario: [],
149
+ scenarios: [],
150
+ tags: new Map(),
151
+ effective: 0,
152
+ untagged: 0,
153
+ },
154
+ unreadable: [],
155
+ languages: new Map(),
156
+ readable: 0,
157
+ total: 0,
158
158
  };
159
- const unreadable = [];
160
- const languages = new Map();
161
- let readable = 0;
162
- for (const result of parsed) {
163
- const file = result.file.relativePath;
164
- const failure = result.errors[0];
165
- if (failure !== undefined) {
166
- unreadable.push({ file, reason: failure.message, line: failure.line });
167
- continue;
168
- }
169
- readable += 1;
170
- // An empty file parses without complaint and holds nothing to count.
171
- if (result.feature === undefined) {
172
- continue;
173
- }
174
- tally(languages, result.feature.language);
175
- collectFile(result.feature, file, into);
159
+ }
160
+ /** Counts one file into the tally. */
161
+ function absorb(tally, result) {
162
+ tally.total += 1;
163
+ const file = result.file.relativePath;
164
+ const failure = result.errors[0];
165
+ if (failure !== undefined) {
166
+ tally.unreadable.push({ file, reason: failure.message, line: failure.line });
167
+ return;
176
168
  }
169
+ tally.readable += 1;
170
+ // An empty file parses without complaint and holds nothing to count.
171
+ if (result.feature === undefined) {
172
+ return;
173
+ }
174
+ tallyOne(tally.languages, result.feature.language);
175
+ collectFile(result.feature, file, tally.into);
176
+ }
177
+ /** Turns the running totals into the report. */
178
+ function summarise(tally, options) {
179
+ const { into, unreadable, languages } = tally;
180
+ const { inventory } = into;
177
181
  const vocabulary = [...into.steps]
178
182
  .map(([text, sighting]) => ({ text, ...sighting }))
179
183
  .sort(byCountThenName((entry) => entry.text));
@@ -187,7 +191,7 @@ export function collectStatistics(parsed, options = {}) {
187
191
  .map(([name, count]) => ({ name, count }))
188
192
  .sort(byCountThenName((entry) => entry.name));
189
193
  return {
190
- files: { total: parsed.length, parsed: readable, unreadable },
194
+ files: { total: tally.total, parsed: tally.readable, unreadable },
191
195
  inventory,
192
196
  scenarios: {
193
197
  effective: into.effective,
@@ -216,4 +220,30 @@ export function collectStatistics(parsed, options = {}) {
216
220
  .sort((a, b) => b.files - a.files || (a.code < b.code ? -1 : 1)),
217
221
  };
218
222
  }
223
+ /**
224
+ * Counts a set of parsed feature files.
225
+ *
226
+ * Files the parser refused are listed rather than counted: half a broken file
227
+ * is worse than none of it, because the numbers would quietly be wrong.
228
+ */
229
+ export function collectStatistics(parsed, options = {}) {
230
+ const tally = newTally();
231
+ for (const result of parsed) {
232
+ absorb(tally, result);
233
+ }
234
+ return summarise(tally, options);
235
+ }
236
+ /**
237
+ * The same count, over files arriving one at a time.
238
+ *
239
+ * Nothing here holds on to a parsed document once it has been counted, so a
240
+ * suite of any size costs the same as the report it produces.
241
+ */
242
+ export async function collectStatisticsFrom(parsed, options = {}) {
243
+ const tally = newTally();
244
+ for await (const result of parsed) {
245
+ absorb(tally, result);
246
+ }
247
+ return summarise(tally, options);
248
+ }
219
249
  //# sourceMappingURL=collect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/stats/collect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/stats/collect.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { Diagnostics } from '../diagnostics.ts';
1
2
  export declare function statsUsage(): string;
2
- export declare function runStats(argv: readonly string[]): Promise<number>;
3
+ export declare function runStats(argv: readonly string[], diagnostics?: Diagnostics): Promise<number>;
3
4
  //# sourceMappingURL=command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/stats/command.ts"],"names":[],"mappings":"AAuBA,wBAAgB,UAAU,IAAI,MAAM,CAmBnC;AAqBD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkEvE"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/stats/command.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AASnD,wBAAgB,UAAU,IAAI,MAAM,CAmBnC;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,WAAW,GAAE,WAAoB,GAChC,OAAO,CAAC,MAAM,CAAC,CAmFjB"}
@@ -8,11 +8,11 @@
8
8
  */
9
9
  import { parseArgs } from 'node:util';
10
10
  import { EXIT_OK, EXIT_USAGE } from '../exit-codes.js';
11
- import { DEFAULT_IGNORE_FILE_NAME, findFeatureFiles } from '../feature-finder.js';
11
+ import { DEFAULT_IGNORE_FILE_NAME, findFeatureFileStream } from '../feature-finder.js';
12
12
  import { isKnownLanguage } from '../gherkin/dialects.js';
13
- import { readAndParseFile } from '../gherkin/parse.js';
14
- import * as logger from '../logger.js';
15
- import { collectStatistics } from './collect.js';
13
+ import { readAndParseFiles } from '../gherkin/parse.js';
14
+ import { SILENT } from '../diagnostics.js';
15
+ import { collectStatisticsFrom } from './collect.js';
16
16
  import { DEFAULT_STATS_FORMAT, DEFAULT_TOP, STATS_FORMATTERS, getStatsFormatter, } from './format/index.js';
17
17
  export function statsUsage() {
18
18
  return [
@@ -34,26 +34,7 @@ export function statsUsage() {
34
34
  'rather than judging them. Use the linter itself to fail a build.',
35
35
  ].join('\n');
36
36
  }
37
- /** Reads and parses a file, turning a file that cannot be read into a result. */
38
- async function read(file, language) {
39
- try {
40
- return await readAndParseFile(file, language);
41
- }
42
- catch (thrown) {
43
- return {
44
- file: { relativePath: file, lines: [] },
45
- feature: undefined,
46
- errors: [
47
- {
48
- message: thrown instanceof Error ? thrown.message : String(thrown),
49
- rule: 'unexpected-error',
50
- line: 0,
51
- },
52
- ],
53
- };
54
- }
55
- }
56
- export async function runStats(argv) {
37
+ export async function runStats(argv, diagnostics = SILENT) {
57
38
  let parsed;
58
39
  try {
59
40
  parsed = parseArgs({
@@ -69,8 +50,11 @@ export async function runStats(argv) {
69
50
  });
70
51
  }
71
52
  catch (thrown) {
72
- logger.boldError(thrown instanceof Error ? thrown.message : String(thrown));
73
- console.error(statsUsage());
53
+ diagnostics.report({
54
+ level: 'error',
55
+ message: thrown instanceof Error ? thrown.message : String(thrown),
56
+ });
57
+ diagnostics.report({ level: 'notice', message: statsUsage() });
74
58
  return EXIT_USAGE;
75
59
  }
76
60
  const { values, positionals } = parsed;
@@ -80,33 +64,49 @@ export async function runStats(argv) {
80
64
  }
81
65
  const formatter = getStatsFormatter(values.format);
82
66
  if (formatter === undefined) {
83
- logger.boldError(`Unsupported format "${values.format}". Use one of ${Object.keys(STATS_FORMATTERS).join(', ')}.`);
67
+ diagnostics.report({
68
+ level: 'error',
69
+ message: `Unsupported format "${values.format}". Use one of ${Object.keys(STATS_FORMATTERS).join(', ')}.`,
70
+ });
84
71
  return EXIT_USAGE;
85
72
  }
86
73
  let top = DEFAULT_TOP;
87
74
  if (values.top !== undefined) {
88
75
  top = Number(values.top);
89
76
  if (!Number.isInteger(top) || top < 1) {
90
- logger.boldError(`--top needs a whole number of at least 1, not "${values.top}".`);
77
+ diagnostics.report({
78
+ level: 'error',
79
+ message: `--top needs a whole number of at least 1, not "${values.top}".`,
80
+ });
91
81
  return EXIT_USAGE;
92
82
  }
93
83
  }
94
84
  const language = values.language;
95
85
  if (language !== undefined && !isKnownLanguage(language)) {
96
- logger.boldError(`Unknown language "${language}". Use a Gherkin language code, such as "fr".`);
86
+ diagnostics.report({
87
+ level: 'error',
88
+ message: `Unknown language "${language}". Use a Gherkin language code, such as "fr".`,
89
+ });
97
90
  return EXIT_USAGE;
98
91
  }
99
92
  const ignore = values.ignore?.split(',').map((pattern) => pattern.trim());
100
- const { files, invalidPatterns } = findFeatureFiles(positionals, ignore);
93
+ const { files, invalidPatterns } = findFeatureFileStream(positionals, ignore);
101
94
  if (invalidPatterns.length > 0) {
102
95
  for (const pattern of invalidPatterns) {
103
- logger.boldError(`Invalid format of the feature file path/pattern: "${pattern}".`);
96
+ diagnostics.report({
97
+ level: 'error',
98
+ message: `Invalid format of the feature file path/pattern: "${pattern}".`,
99
+ });
104
100
  }
105
- logger.error('To run the linter please specify an existing feature file, directory or glob.');
101
+ diagnostics.report({
102
+ level: 'detail',
103
+ message: 'To run the linter please specify an existing feature file, directory or glob.',
104
+ });
106
105
  return EXIT_USAGE;
107
106
  }
108
- const results = await Promise.all(files.map((file) => read(file, language)));
109
- const statistics = collectStatistics(results);
107
+ // Counted as they arrive, so a suite of any size costs what the report
108
+ // costs rather than what the suite does.
109
+ const statistics = await collectStatisticsFrom(readAndParseFiles(files, { language }));
110
110
  console.log(formatter(statistics, { top }));
111
111
  return EXIT_OK;
112
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/stats/command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/stats/command.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -50,6 +50,30 @@ export type Severity = 'error' | 'warning';
50
50
  export type RuleConfig = RuleState | readonly [RuleState, unknown];
51
51
  /** The parsed contents of a `.gurkencheckrc` file. */
52
52
  export type Configuration = Record<string, RuleConfig>;
53
+ /**
54
+ * Somewhere for a rule to keep what it learns as a run goes on.
55
+ *
56
+ * A rule looking for duplicates has to remember what it has already seen.
57
+ * Keeping that in the module makes it process-global, so two runs at once - a
58
+ * language server checking two folders, a test suite running cases side by
59
+ * side - quietly corrupt each other's state. A context belongs to one rule in
60
+ * one run, so there is nothing shared and nothing to reset.
61
+ */
62
+ export interface RunContext {
63
+ /** This rule's state for this run, made the first time it is asked for. */
64
+ state<T>(create: () => T): T;
65
+ }
66
+ /**
67
+ * A finding that could only be worked out once every file had been seen, so
68
+ * it has to say which file it is about.
69
+ */
70
+ export interface RunFinding extends RuleError {
71
+ /**
72
+ * The file this is about, as it was given to the linter. Left out for a
73
+ * finding about the run as a whole rather than about any one file.
74
+ */
75
+ filePath?: string;
76
+ }
53
77
  /**
54
78
  * A lint rule.
55
79
  *
@@ -68,11 +92,31 @@ export interface LintRule {
68
92
  /**
69
93
  * Returns the violations found in this file. A rule that needs to wait for
70
94
  * something - reading a file, asking a service - may return a promise.
95
+ *
96
+ * `context` is the same object for every file of a run, and a different one
97
+ * for every other run, so it is where anything remembered between files
98
+ * belongs.
99
+ */
100
+ run(feature: Feature | undefined, file: FeatureFile, configuration: unknown, context: RunContext): RuleError[] | Promise<RuleError[]>;
101
+ /**
102
+ * Called once before the first file, for a rule with something to set up.
103
+ * Rules that only accumulate as they go need nothing here: the context
104
+ * makes their state the first time they ask for it.
105
+ */
106
+ onRunStart?(configuration: unknown, context: RunContext): void;
107
+ /**
108
+ * The findings that could only be worked out once every file had been seen,
109
+ * such as two files sharing a name. Called once after the last file, and
110
+ * only for a rule the configuration switched on.
71
111
  */
72
- run(feature: Feature | undefined, file: FeatureFile, configuration: unknown): RuleError[] | Promise<RuleError[]>;
112
+ onRunEnd?(configuration: unknown, context: RunContext): RunFinding[] | Promise<RunFinding[]>;
73
113
  /**
74
- * Clears any state kept between files. Implemented by the rules that look
75
- * for duplicates across a whole run; called once before each lint run.
114
+ * Clears any state kept between files.
115
+ *
116
+ * @deprecated Keep state in the `RunContext` handed to `run` instead. State
117
+ * in the module is shared by every run in the process, so two at once tread
118
+ * on each other. Still called before each run, for rules written before
119
+ * contexts existed.
76
120
  */
77
121
  reset?(): void;
78
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAEhD,6CAA6C;AAC7C,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,+BAA+B;AAC/B,MAAM,WAAW,SAAS;IACxB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9C,kCAAkC;AAClC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAEnE,sDAAsD;AACtD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,GAAG,CACD,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,IAAI,EAAE,WAAW,EACjB,aAAa,EAAE,OAAO,GACrB,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtC;;;OAGG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,mDAAmD;AACnD,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAEhD,6CAA6C;AAC7C,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,+BAA+B;AAC/B,MAAM,WAAW,SAAS;IACxB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9C,kCAAkC;AAClC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAEnE,sDAAsD;AACtD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;;;;OAOG;IACH,GAAG,CACD,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,IAAI,EAAE,WAAW,EACjB,aAAa,EAAE,OAAO,EACtB,OAAO,EAAE,UAAU,GAClB,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtC;;;;OAIG;IACH,UAAU,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,CACP,aAAa,EAAE,OAAO,EACtB,OAAO,EAAE,UAAU,GAClB,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACxC;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,mDAAmD;AACnD,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC"}
@@ -3,6 +3,12 @@
3
3
  * slash-separated paths.
4
4
  */
5
5
  export declare function globToRegExp(pattern: string): RegExp;
6
+ /**
7
+ * The directory a pattern's search starts from - the leading run of literal
8
+ * segments, resolved against `cwd`. What you would watch to be told about
9
+ * anything the pattern could match.
10
+ */
11
+ export declare function globRoot(pattern: string, cwd?: string): string;
6
12
  export interface GlobOptions {
7
13
  /** Directory that relative patterns and returned paths are relative to. */
8
14
  cwd?: string;
@@ -17,4 +23,16 @@ export interface GlobOptions {
17
23
  * forward slashes. Directories are never returned. Results are sorted.
18
24
  */
19
25
  export declare function globSync(pattern: string, options?: GlobOptions): string[];
26
+ /**
27
+ * The same search, handing each match over as it is found.
28
+ *
29
+ * Collecting a whole tree before anything else starts is time in which
30
+ * nothing is read, parsed or checked. This hands each match over as it is
31
+ * reached, so the work after it starts on the first file rather than on the
32
+ * last.
33
+ *
34
+ * The order is the order `globSync` returns, without anything being collected
35
+ * to sort: `byPathOrder` is what makes the two agree.
36
+ */
37
+ export declare function globStream(pattern: string, options?: GlobOptions): AsyncGenerator<string>;
20
38
  //# sourceMappingURL=glob.d.ts.map