eslint-plugin-traceability 1.22.0 → 1.23.1
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/CHANGELOG.md +8 -7
- package/lib/{src/rules → rules}/require-req-annotation.js +51 -45
- package/package.json +9 -13
- package/user-docs/api-reference.md +2 -2
- package/lib/tests/cli-error-handling.test.d.ts +0 -1
- package/lib/tests/cli-error-handling.test.js +0 -54
- package/lib/tests/config/eslint-config-validation.test.d.ts +0 -9
- package/lib/tests/config/eslint-config-validation.test.js +0 -101
- package/lib/tests/config/flat-config-presets-integration.test.d.ts +0 -1
- package/lib/tests/config/flat-config-presets-integration.test.js +0 -76
- package/lib/tests/config/require-story-annotation-config.test.d.ts +0 -10
- package/lib/tests/config/require-story-annotation-config.test.js +0 -26
- package/lib/tests/fixtures/stale/example.d.ts +0 -0
- package/lib/tests/fixtures/stale/example.js +0 -4
- package/lib/tests/fixtures/update/example.d.ts +0 -0
- package/lib/tests/fixtures/update/example.js +0 -4
- package/lib/tests/fixtures/valid-annotations/example.d.ts +0 -0
- package/lib/tests/fixtures/valid-annotations/example.js +0 -3
- package/lib/tests/integration/annotation-placement-inside-prettier.integration.test.d.ts +0 -1
- package/lib/tests/integration/annotation-placement-inside-prettier.integration.test.js +0 -133
- package/lib/tests/integration/catch-annotation-prettier.integration.test.d.ts +0 -1
- package/lib/tests/integration/catch-annotation-prettier.integration.test.js +0 -121
- package/lib/tests/integration/cli-integration.test.d.ts +0 -1
- package/lib/tests/integration/cli-integration.test.js +0 -96
- package/lib/tests/integration/else-if-annotation-prettier.integration.test.d.ts +0 -1
- package/lib/tests/integration/else-if-annotation-prettier.integration.test.js +0 -100
- package/lib/tests/integration/no-redundant-annotation.integration.test.d.ts +0 -1
- package/lib/tests/integration/no-redundant-annotation.integration.test.js +0 -129
- package/lib/tests/integration/prettier-test-helpers.d.ts +0 -9
- package/lib/tests/integration/prettier-test-helpers.js +0 -35
- package/lib/tests/integration/require-traceability-aliases.integration.test.d.ts +0 -1
- package/lib/tests/integration/require-traceability-aliases.integration.test.js +0 -152
- package/lib/tests/integration/require-traceability-test-callbacks.integration.test.d.ts +0 -1
- package/lib/tests/integration/require-traceability-test-callbacks.integration.test.js +0 -149
- package/lib/tests/maintenance/batch.test.d.ts +0 -1
- package/lib/tests/maintenance/batch.test.js +0 -80
- package/lib/tests/maintenance/cli.test.d.ts +0 -1
- package/lib/tests/maintenance/cli.test.js +0 -306
- package/lib/tests/maintenance/detect-isolated.test.d.ts +0 -1
- package/lib/tests/maintenance/detect-isolated.test.js +0 -187
- package/lib/tests/maintenance/detect.test.d.ts +0 -1
- package/lib/tests/maintenance/detect.test.js +0 -46
- package/lib/tests/maintenance/index.test.d.ts +0 -1
- package/lib/tests/maintenance/index.test.js +0 -26
- package/lib/tests/maintenance/report.test.d.ts +0 -1
- package/lib/tests/maintenance/report.test.js +0 -68
- package/lib/tests/maintenance/storyParser.test.d.ts +0 -8
- package/lib/tests/maintenance/storyParser.test.js +0 -505
- package/lib/tests/maintenance/update-isolated.test.d.ts +0 -1
- package/lib/tests/maintenance/update-isolated.test.js +0 -71
- package/lib/tests/maintenance/update.test.d.ts +0 -1
- package/lib/tests/maintenance/update.test.js +0 -27
- package/lib/tests/perf/maintenance-cli-large-workspace.test.d.ts +0 -1
- package/lib/tests/perf/maintenance-cli-large-workspace.test.js +0 -229
- package/lib/tests/perf/maintenance-large-workspace.test.d.ts +0 -1
- package/lib/tests/perf/maintenance-large-workspace.test.js +0 -169
- package/lib/tests/perf/require-branch-annotation-large-file.test.d.ts +0 -1
- package/lib/tests/perf/require-branch-annotation-large-file.test.js +0 -67
- package/lib/tests/perf/valid-annotation-format-large-file.test.d.ts +0 -1
- package/lib/tests/perf/valid-annotation-format-large-file.test.js +0 -75
- package/lib/tests/plugin-default-export-and-configs.test.d.ts +0 -1
- package/lib/tests/plugin-default-export-and-configs.test.js +0 -121
- package/lib/tests/plugin-setup-error.test.d.ts +0 -6
- package/lib/tests/plugin-setup-error.test.js +0 -38
- package/lib/tests/plugin-setup.test.d.ts +0 -1
- package/lib/tests/plugin-setup.test.js +0 -63
- package/lib/tests/rules/auto-fix-behavior-008.test.d.ts +0 -1
- package/lib/tests/rules/auto-fix-behavior-008.test.js +0 -285
- package/lib/tests/rules/error-reporting.test.d.ts +0 -1
- package/lib/tests/rules/error-reporting.test.js +0 -99
- package/lib/tests/rules/no-redundant-annotation.test.d.ts +0 -1
- package/lib/tests/rules/no-redundant-annotation.test.js +0 -163
- package/lib/tests/rules/prefer-implements-annotation.test.d.ts +0 -1
- package/lib/tests/rules/prefer-implements-annotation.test.js +0 -162
- package/lib/tests/rules/require-branch-annotation.test.d.ts +0 -1
- package/lib/tests/rules/require-branch-annotation.test.js +0 -593
- package/lib/tests/rules/require-req-annotation.test.d.ts +0 -1
- package/lib/tests/rules/require-req-annotation.test.js +0 -246
- package/lib/tests/rules/require-story-annotation.test.d.ts +0 -1
- package/lib/tests/rules/require-story-annotation.test.js +0 -376
- package/lib/tests/rules/require-story-core-edgecases.test.d.ts +0 -1
- package/lib/tests/rules/require-story-core-edgecases.test.js +0 -15
- package/lib/tests/rules/require-story-core.autofix.test.d.ts +0 -1
- package/lib/tests/rules/require-story-core.autofix.test.js +0 -66
- package/lib/tests/rules/require-story-core.test.d.ts +0 -1
- package/lib/tests/rules/require-story-core.test.js +0 -65
- package/lib/tests/rules/require-story-helpers-edgecases.test.d.ts +0 -7
- package/lib/tests/rules/require-story-helpers-edgecases.test.js +0 -80
- package/lib/tests/rules/require-story-helpers.test.d.ts +0 -1
- package/lib/tests/rules/require-story-helpers.test.js +0 -474
- package/lib/tests/rules/require-story-io-behavior.test.d.ts +0 -7
- package/lib/tests/rules/require-story-io-behavior.test.js +0 -46
- package/lib/tests/rules/require-story-io.edgecases.test.d.ts +0 -7
- package/lib/tests/rules/require-story-io.edgecases.test.js +0 -46
- package/lib/tests/rules/require-story-utils.test.d.ts +0 -7
- package/lib/tests/rules/require-story-utils.test.js +0 -158
- package/lib/tests/rules/require-story-visitors-edgecases.test.d.ts +0 -7
- package/lib/tests/rules/require-story-visitors-edgecases.test.js +0 -27
- package/lib/tests/rules/require-test-traceability.test.d.ts +0 -1
- package/lib/tests/rules/require-test-traceability.test.js +0 -95
- package/lib/tests/rules/valid-annotation-format-internal.test.d.ts +0 -8
- package/lib/tests/rules/valid-annotation-format-internal.test.js +0 -47
- package/lib/tests/rules/valid-annotation-format.test.d.ts +0 -1
- package/lib/tests/rules/valid-annotation-format.test.js +0 -634
- package/lib/tests/rules/valid-req-reference.test.d.ts +0 -1
- package/lib/tests/rules/valid-req-reference.test.js +0 -129
- package/lib/tests/rules/valid-story-reference.test.d.ts +0 -1
- package/lib/tests/rules/valid-story-reference.test.js +0 -413
- package/lib/tests/utils/annotation-checker-autofix-behavior.test.d.ts +0 -5
- package/lib/tests/utils/annotation-checker-autofix-behavior.test.js +0 -103
- package/lib/tests/utils/annotation-checker.test.d.ts +0 -24
- package/lib/tests/utils/annotation-checker.test.js +0 -84
- package/lib/tests/utils/annotation-scope-analyzer.test.d.ts +0 -1
- package/lib/tests/utils/annotation-scope-analyzer.test.js +0 -211
- package/lib/tests/utils/branch-annotation-catch-insert-position.test.d.ts +0 -1
- package/lib/tests/utils/branch-annotation-catch-insert-position.test.js +0 -69
- package/lib/tests/utils/branch-annotation-catch-position.test.d.ts +0 -1
- package/lib/tests/utils/branch-annotation-catch-position.test.js +0 -115
- package/lib/tests/utils/branch-annotation-else-if-insert-position.test.d.ts +0 -1
- package/lib/tests/utils/branch-annotation-else-if-insert-position.test.js +0 -82
- package/lib/tests/utils/branch-annotation-else-if-position.test.d.ts +0 -1
- package/lib/tests/utils/branch-annotation-else-if-position.test.js +0 -145
- package/lib/tests/utils/branch-annotation-helpers.test.d.ts +0 -1
- package/lib/tests/utils/branch-annotation-helpers.test.js +0 -462
- package/lib/tests/utils/fsTestHelpers.d.ts +0 -7
- package/lib/tests/utils/fsTestHelpers.js +0 -26
- package/lib/tests/utils/ioTestHelpers.d.ts +0 -7
- package/lib/tests/utils/ioTestHelpers.js +0 -24
- package/lib/tests/utils/req-annotation-detection.test.d.ts +0 -1
- package/lib/tests/utils/req-annotation-detection.test.js +0 -358
- package/lib/tests/utils/require-story-core-test-helpers.d.ts +0 -10
- package/lib/tests/utils/require-story-core-test-helpers.js +0 -75
- package/lib/tests/utils/temp-dir-helpers.d.ts +0 -19
- package/lib/tests/utils/temp-dir-helpers.js +0 -62
- package/lib/tests/utils/ts-language-options.d.ts +0 -16
- package/lib/tests/utils/ts-language-options.js +0 -30
- /package/lib/{src/index.d.ts → index.d.ts} +0 -0
- /package/lib/{src/index.js → index.js} +0 -0
- /package/lib/{src/maintenance → maintenance}/batch.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/batch.js +0 -0
- /package/lib/{src/maintenance → maintenance}/cli.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/cli.js +0 -0
- /package/lib/{src/maintenance → maintenance}/commands.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/commands.js +0 -0
- /package/lib/{src/maintenance → maintenance}/detect.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/detect.js +0 -0
- /package/lib/{src/maintenance → maintenance}/flags.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/flags.js +0 -0
- /package/lib/{src/maintenance → maintenance}/index.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/index.js +0 -0
- /package/lib/{src/maintenance → maintenance}/report.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/report.js +0 -0
- /package/lib/{src/maintenance → maintenance}/storyParser.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/storyParser.js +0 -0
- /package/lib/{src/maintenance → maintenance}/update.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/update.js +0 -0
- /package/lib/{src/maintenance → maintenance}/utils.d.ts +0 -0
- /package/lib/{src/maintenance → maintenance}/utils.js +0 -0
- /package/lib/{src/rules → rules}/helpers/pattern-validators.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/pattern-validators.js +0 -0
- /package/lib/{src/rules → rules}/helpers/prefer-implements-inline.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/prefer-implements-inline.js +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-comment-detection.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-comment-detection.js +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-core.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-core.js +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-helpers.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-helpers.js +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-io.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-io.js +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-name-extraction.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-name-extraction.js +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-node-utils.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-node-utils.js +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-utils.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-utils.js +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-visitors.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/require-story-visitors.js +0 -0
- /package/lib/{src/rules → rules}/helpers/require-test-traceability-helpers.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/require-test-traceability-helpers.js +0 -0
- /package/lib/{src/rules → rules}/helpers/test-callback-exclusion.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/test-callback-exclusion.js +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-annotation-format-internal.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-annotation-format-internal.js +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-annotation-format-validators.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-annotation-format-validators.js +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-annotation-options.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-annotation-options.js +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-annotation-utils.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-annotation-utils.js +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-implements-utils.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-implements-utils.js +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-req-reference-helpers.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-req-reference-helpers.js +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-story-reference-helpers.d.ts +0 -0
- /package/lib/{src/rules → rules}/helpers/valid-story-reference-helpers.js +0 -0
- /package/lib/{src/rules → rules}/no-redundant-annotation.d.ts +0 -0
- /package/lib/{src/rules → rules}/no-redundant-annotation.js +0 -0
- /package/lib/{src/rules → rules}/prefer-implements-annotation.d.ts +0 -0
- /package/lib/{src/rules → rules}/prefer-implements-annotation.js +0 -0
- /package/lib/{src/rules → rules}/require-branch-annotation.d.ts +0 -0
- /package/lib/{src/rules → rules}/require-branch-annotation.js +0 -0
- /package/lib/{src/rules → rules}/require-req-annotation.d.ts +0 -0
- /package/lib/{src/rules → rules}/require-story-annotation.d.ts +0 -0
- /package/lib/{src/rules → rules}/require-story-annotation.js +0 -0
- /package/lib/{src/rules → rules}/require-test-traceability.d.ts +0 -0
- /package/lib/{src/rules → rules}/require-test-traceability.js +0 -0
- /package/lib/{src/rules → rules}/require-traceability.d.ts +0 -0
- /package/lib/{src/rules → rules}/require-traceability.js +0 -0
- /package/lib/{src/rules → rules}/valid-annotation-format.d.ts +0 -0
- /package/lib/{src/rules → rules}/valid-annotation-format.js +0 -0
- /package/lib/{src/rules → rules}/valid-req-reference.d.ts +0 -0
- /package/lib/{src/rules → rules}/valid-req-reference.js +0 -0
- /package/lib/{src/rules → rules}/valid-story-reference.d.ts +0 -0
- /package/lib/{src/rules → rules}/valid-story-reference.js +0 -0
- /package/lib/{src/utils → utils}/annotation-checker.d.ts +0 -0
- /package/lib/{src/utils → utils}/annotation-checker.js +0 -0
- /package/lib/{src/utils → utils}/annotation-scope-analyzer.d.ts +0 -0
- /package/lib/{src/utils → utils}/annotation-scope-analyzer.js +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-catch-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-catch-helpers.js +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-helpers.js +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-if-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-if-helpers.js +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-indent-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-indent-helpers.js +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-loop-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-loop-helpers.js +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-report-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-report-helpers.js +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-story-fix-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-story-fix-helpers.js +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-switch-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/branch-annotation-switch-helpers.js +0 -0
- /package/lib/{src/utils → utils}/branch-validation.d.ts +0 -0
- /package/lib/{src/utils → utils}/branch-validation.js +0 -0
- /package/lib/{src/utils → utils}/comment-text-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/comment-text-helpers.js +0 -0
- /package/lib/{src/utils → utils}/function-annotation-helpers.d.ts +0 -0
- /package/lib/{src/utils → utils}/function-annotation-helpers.js +0 -0
- /package/lib/{src/utils → utils}/redundancy-detector.d.ts +0 -0
- /package/lib/{src/utils → utils}/redundancy-detector.js +0 -0
- /package/lib/{src/utils → utils}/reqAnnotationDetection.d.ts +0 -0
- /package/lib/{src/utils → utils}/reqAnnotationDetection.js +0 -0
- /package/lib/{src/utils → utils}/storyReferenceUtils.d.ts +0 -0
- /package/lib/{src/utils → utils}/storyReferenceUtils.js +0 -0
|
@@ -1,634 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
/**
|
|
7
|
-
* Tests for: docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
|
|
8
|
-
* @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
|
|
9
|
-
* @req REQ-FORMAT-SPECIFICATION - Verify valid-annotation-format rule enforces annotation format syntax
|
|
10
|
-
* Tests for: docs/stories/007.0-DEV-ERROR-REPORTING.story.md
|
|
11
|
-
* @story docs/stories/007.0-DEV-ERROR-REPORTING.story.md
|
|
12
|
-
* @req REQ-ERROR-MESSAGES-CONSISTENT - Verify invalid annotation errors use consistent wording and structure
|
|
13
|
-
* @req REQ-ERROR-MESSAGES-ACTIONABLE - Verify invalid annotation errors provide actionable guidance and examples
|
|
14
|
-
* @req REQ-ERROR-MESSAGES-IDENTIFIERS - Verify invalid annotation errors echo the offending identifier/path in the message
|
|
15
|
-
* Tests for: docs/stories/010.1-DEV-CONFIGURABLE-PATTERNS.story.md
|
|
16
|
-
* @story docs/stories/010.1-DEV-CONFIGURABLE-PATTERNS.story.md
|
|
17
|
-
* @req REQ-CONFIGURABLE-PATTERNS-STORY - Rule supports configurable story path regex patterns
|
|
18
|
-
* @req REQ-CONFIGURABLE-PATTERNS-REQ - Rule supports configurable requirement ID regex patterns
|
|
19
|
-
* @req REQ-CONFIGURABLE-PATTERNS-EXAMPLES - Rule supports configurable example strings in error messages
|
|
20
|
-
* @req REQ-CONFIGURABLE-PATTERNS-FALLBACK - Invalid regex patterns fall back to default behavior without crashing
|
|
21
|
-
* Tests for: docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
|
|
22
|
-
* @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
|
|
23
|
-
* @req REQ-SUPPORTS-PARSE - Rule parses @supports annotations with story and requirement references
|
|
24
|
-
* @req REQ-FORMAT-VALIDATION - Rule validates story and requirement formats inside @supports annotations
|
|
25
|
-
* @req REQ-MIXED-SUPPORT - Rule supports mixed @story/@req/@supports usage in the same comment
|
|
26
|
-
* Tests for: docs/stories/022.0-DEV-JSDOC-COEXISTENCE.story.md
|
|
27
|
-
* @story docs/stories/022.0-DEV-JSDOC-COEXISTENCE.story.md
|
|
28
|
-
* @req REQ-JSDOC-TAG-COEXISTENCE - Rule allows traceability annotations to coexist with other JSDoc tags
|
|
29
|
-
* @req REQ-ANNOTATION-TERMINATION - Rule correctly terminates traceability annotation values at JSDoc tag boundaries
|
|
30
|
-
* @req REQ-JSDOC-BOUNDARY-DETECTION - Rule detects @param/@returns and similar tags as boundaries
|
|
31
|
-
* @req REQ-CONTINUATION-LOGIC - Rule correctly decides when to continue or stop multi-line traceability values
|
|
32
|
-
* @req REQ-NO-FALSE-POSITIVES - Rule does not report false positives when JSDoc tags follow traceability tags
|
|
33
|
-
* @req REQ-PRESERVE-MULTILINE - Rule preserves multi-line story/req values without including following JSDoc tags
|
|
34
|
-
*/
|
|
35
|
-
const eslint_1 = require("eslint");
|
|
36
|
-
const valid_annotation_format_1 = __importDefault(require("../../src/rules/valid-annotation-format"));
|
|
37
|
-
const ruleTester = new eslint_1.RuleTester({
|
|
38
|
-
languageOptions: { parserOptions: { ecmaVersion: 2020 } },
|
|
39
|
-
});
|
|
40
|
-
const makeInvalid = ({ name, code, output, messageId, details, options, }) => ({
|
|
41
|
-
name,
|
|
42
|
-
code,
|
|
43
|
-
...(output ? { output } : {}),
|
|
44
|
-
...(options ? { options } : {}),
|
|
45
|
-
errors: [
|
|
46
|
-
{
|
|
47
|
-
messageId,
|
|
48
|
-
data: {
|
|
49
|
-
details,
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
],
|
|
53
|
-
});
|
|
54
|
-
/**
|
|
55
|
-
* Test-only convenience for Story 005.0 error messaging consistency.
|
|
56
|
-
* Preconfigures the invalidStoryFormat messageId so tests only specify
|
|
57
|
-
* name, code, and details (plus optional output/options).
|
|
58
|
-
*/
|
|
59
|
-
const makeInvalidStory = ({ name, code, details, output, options, }) => makeInvalid({
|
|
60
|
-
name,
|
|
61
|
-
code,
|
|
62
|
-
output,
|
|
63
|
-
options,
|
|
64
|
-
messageId: "invalidStoryFormat",
|
|
65
|
-
details,
|
|
66
|
-
});
|
|
67
|
-
describe("Valid Annotation Format Rule (Story 005.0-DEV-ANNOTATION-VALIDATION)", () => {
|
|
68
|
-
ruleTester.run("valid-annotation-format", valid_annotation_format_1.default, {
|
|
69
|
-
valid: [
|
|
70
|
-
{
|
|
71
|
-
name: "[REQ-PATH-FORMAT] valid story annotation format (single-line)",
|
|
72
|
-
code: `// @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md`,
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
name: "[REQ-REQ-FORMAT] valid req annotation format (single-line)",
|
|
76
|
-
code: `// @req REQ-EXAMPLE`,
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
name: "[REQ-FORMAT-SPECIFICATION] valid block annotations (single-line values)",
|
|
80
|
-
code: `/**
|
|
81
|
-
* @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
|
|
82
|
-
* @req REQ-VALID-EXAMPLE
|
|
83
|
-
*/`,
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
name: "[REQ-MULTILINE-SUPPORT] valid multi-line @story annotation value in block comment",
|
|
87
|
-
code: `/**
|
|
88
|
-
* @story docs/stories/005.0-
|
|
89
|
-
* DEV-ANNOTATION-VALIDATION.story.md
|
|
90
|
-
*/`,
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
name: "[REQ-MULTILINE-SUPPORT] valid multi-line @req annotation value in block comment",
|
|
94
|
-
code: `/**
|
|
95
|
-
* @req REQ-
|
|
96
|
-
* EXAMPLE
|
|
97
|
-
*/`,
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
name: "[REQ-FLEXIBLE-PARSING] valid JSDoc-style comment with leading stars and spacing",
|
|
101
|
-
code: `/**
|
|
102
|
-
* @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md
|
|
103
|
-
* @req REQ-FLEXIBLE-PARSING
|
|
104
|
-
*/`,
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-STORY] custom storyPathPattern accepts alternate extension",
|
|
108
|
-
code: `// @story stories/feature-010.1-CUSTOM.story.mdx`,
|
|
109
|
-
options: [
|
|
110
|
-
{
|
|
111
|
-
story: {
|
|
112
|
-
pattern: "^stories\\/[^\\s]+\\.story\\.mdx$",
|
|
113
|
-
example: "stories/example-010.1-CUSTOM.story.mdx",
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
],
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-REQ] custom requirementIdPattern accepts PROJECT-123 style IDs",
|
|
120
|
-
code: `// @req PROJECT-123`,
|
|
121
|
-
options: [
|
|
122
|
-
{
|
|
123
|
-
req: {
|
|
124
|
-
pattern: "^[A-Z]+-[0-9]+$",
|
|
125
|
-
example: "PROJECT-123",
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
],
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-BOTH] custom patterns accept alternative story and req shapes",
|
|
132
|
-
code: `/**
|
|
133
|
-
* @story stories/010.1-DEV-CONFIGURABLE-PATTERNS.story.mdx
|
|
134
|
-
* @req STORY-10
|
|
135
|
-
*/`,
|
|
136
|
-
options: [
|
|
137
|
-
{
|
|
138
|
-
story: {
|
|
139
|
-
pattern: "^stories\\/[^\\s]+\\.story\\.mdx$",
|
|
140
|
-
example: "stories/010.1-DEV-CONFIGURABLE-PATTERNS.story.mdx",
|
|
141
|
-
},
|
|
142
|
-
req: {
|
|
143
|
-
pattern: "^[A-Z]+-[0-9]+$",
|
|
144
|
-
example: "STORY-10",
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
],
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-STORY-FLAT] flat storyPathPattern accepts alternate extension when nested config not provided",
|
|
151
|
-
code: `// @story stories/feature-010.1-CUSTOM.story.mdx`,
|
|
152
|
-
options: [
|
|
153
|
-
{
|
|
154
|
-
storyPathPattern: "^stories\\/[^\\s]+\\.story\\.mdx$",
|
|
155
|
-
storyPathExample: "stories/example-010.1-CUSTOM.story.mdx",
|
|
156
|
-
},
|
|
157
|
-
],
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-REQ-FLAT] flat requirementIdPattern accepts PROJECT-123 style IDs when nested config not provided",
|
|
161
|
-
code: `// @req PROJECT-123`,
|
|
162
|
-
options: [
|
|
163
|
-
{
|
|
164
|
-
requirementIdPattern: "^[A-Z]+-[0-9]+$",
|
|
165
|
-
requirementIdExample: "PROJECT-123",
|
|
166
|
-
},
|
|
167
|
-
],
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-BOTH-FLAT] flat patterns accept alternative story and req shapes when nested config not provided",
|
|
171
|
-
code: `/**
|
|
172
|
-
* @story stories/010.1-DEV-CONFIGURABLE-PATTERNS.story.mdx
|
|
173
|
-
* @req STORY-10
|
|
174
|
-
*/`,
|
|
175
|
-
options: [
|
|
176
|
-
{
|
|
177
|
-
storyPathPattern: "^stories\\/[^\\s]+\\.story\\.mdx$",
|
|
178
|
-
storyPathExample: "stories/010.1-DEV-CONFIGURABLE-PATTERNS.story.mdx",
|
|
179
|
-
requirementIdPattern: "^[A-Z]+-[0-9]+$",
|
|
180
|
-
requirementIdExample: "STORY-10",
|
|
181
|
-
},
|
|
182
|
-
],
|
|
183
|
-
},
|
|
184
|
-
{
|
|
185
|
-
name: "[REQ-IMPLEMENTS-PARSE] valid single @supports with one story and one requirement (default patterns)",
|
|
186
|
-
code: `/**
|
|
187
|
-
* @supports docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md REQ-IMPLEMENTS-PARSE
|
|
188
|
-
*/`,
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
name: "[REQ-IMPLEMENTS-PARSE] valid multiple @supports lines with different stories and requirements",
|
|
192
|
-
code: `/**
|
|
193
|
-
* @supports docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md REQ-IMPLEMENTS-PARSE REQ-FORMAT-VALIDATION
|
|
194
|
-
* @supports docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md REQ-FORMAT-SPECIFICATION
|
|
195
|
-
*/`,
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
name: "[REQ-MIXED-SUPPORT] valid mixed @story/@req/@supports usage in same block comment",
|
|
199
|
-
code: `/**
|
|
200
|
-
* @story docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
|
|
201
|
-
* @req REQ-MIXED-SUPPORT
|
|
202
|
-
* @supports docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md REQ-IMPLEMENTS-PARSE REQ-FORMAT-VALIDATION REQ-MIXED-SUPPORT
|
|
203
|
-
*/`,
|
|
204
|
-
},
|
|
205
|
-
{
|
|
206
|
-
name: "[REQ-JSDOC-TAG-COEXISTENCE] traceability before other JSDoc tags",
|
|
207
|
-
code: `/**
|
|
208
|
-
* @story docs/stories/022.0-DEV-JSDOC-COEXISTENCE.story.md
|
|
209
|
-
* @req REQ-JSDOC-TAG-COEXISTENCE
|
|
210
|
-
* @param {string} id - Identifier for the lookup.
|
|
211
|
-
* @returns {Promise<void>} - Completes when finished.
|
|
212
|
-
*/
|
|
213
|
-
function fetchById(id) {
|
|
214
|
-
return Promise.resolve();
|
|
215
|
-
}`,
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
name: "[REQ-JSDOC-TAG-COEXISTENCE] traceability after other JSDoc tags",
|
|
219
|
-
code: `/**
|
|
220
|
-
* Fetch a user by id.
|
|
221
|
-
*
|
|
222
|
-
* @param {string} id - Identifier for the lookup.
|
|
223
|
-
* @returns {Promise<void>} - Completes when finished.
|
|
224
|
-
* @story docs/stories/022.0-DEV-JSDOC-COEXISTENCE.story.md
|
|
225
|
-
* @req REQ-ANNOTATION-TERMINATION
|
|
226
|
-
*/
|
|
227
|
-
function fetchUser(id) {
|
|
228
|
-
return Promise.resolve();
|
|
229
|
-
}`,
|
|
230
|
-
},
|
|
231
|
-
{
|
|
232
|
-
name: "[REQ-JSDOC-TAG-COEXISTENCE] mixed positions of traceability and other JSDoc tags",
|
|
233
|
-
code: `/**
|
|
234
|
-
* Update a record with new data.
|
|
235
|
-
*
|
|
236
|
-
* @story docs/stories/022.0-DEV-JSDOC-COEXISTENCE.story.md
|
|
237
|
-
* @param {string} id - Identifier.
|
|
238
|
-
* @req REQ-JSDOC-BOUNDARY-DETECTION
|
|
239
|
-
* @param {object} payload - Updated fields.
|
|
240
|
-
* @returns {boolean} - True if updated.
|
|
241
|
-
* @req REQ-CONTINUATION-LOGIC
|
|
242
|
-
*/
|
|
243
|
-
function updateRecord(id, payload) {
|
|
244
|
-
return true;
|
|
245
|
-
}`,
|
|
246
|
-
},
|
|
247
|
-
{
|
|
248
|
-
name: "[REQ-PRESERVE-MULTILINE] multi-line @story annotation before other JSDoc tags",
|
|
249
|
-
code: `/**
|
|
250
|
-
* @story docs/stories/022.0-DEV-
|
|
251
|
-
* JSDOC-COEXISTENCE.story.md
|
|
252
|
-
* @param {string} id - Identifier for the lookup.
|
|
253
|
-
* @returns {Promise<void>} - Completes when finished.
|
|
254
|
-
*/
|
|
255
|
-
function loadForStory(id) {
|
|
256
|
-
return Promise.resolve();
|
|
257
|
-
}`,
|
|
258
|
-
},
|
|
259
|
-
{
|
|
260
|
-
name: "[REQ-NO-FALSE-POSITIVES] JSDoc tags do not pollute requirement ID when following @req",
|
|
261
|
-
code: `/**
|
|
262
|
-
* @req REQ-OPTIMIZATION
|
|
263
|
-
* @param {object} data - Input payload.
|
|
264
|
-
* @returns {void}
|
|
265
|
-
*/
|
|
266
|
-
function optimize(data) {}`,
|
|
267
|
-
},
|
|
268
|
-
],
|
|
269
|
-
invalid: [
|
|
270
|
-
makeInvalidStory({
|
|
271
|
-
name: "[REQ-PATH-FORMAT] missing story path (single line)",
|
|
272
|
-
code: `// @story`,
|
|
273
|
-
details: 'Missing story path for @story annotation. Expected a path like "docs/stories/005.0-DEV-EXAMPLE.story.md".',
|
|
274
|
-
}),
|
|
275
|
-
makeInvalidStory({
|
|
276
|
-
name: "[REQ-PATH-FORMAT] invalid story file extension",
|
|
277
|
-
code: `// @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story`,
|
|
278
|
-
output: `// @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md`,
|
|
279
|
-
details: 'Invalid story path "docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story" for @story annotation. Expected a path like "docs/stories/005.0-DEV-EXAMPLE.story.md".',
|
|
280
|
-
}),
|
|
281
|
-
makeInvalidStory({
|
|
282
|
-
name: "[REQ-PATH-FORMAT] missing extension in story path",
|
|
283
|
-
code: `// @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION`,
|
|
284
|
-
output: `// @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md`,
|
|
285
|
-
details: 'Invalid story path "docs/stories/005.0-DEV-ANNOTATION-VALIDATION" for @story annotation. Expected a path like "docs/stories/005.0-DEV-EXAMPLE.story.md".',
|
|
286
|
-
}),
|
|
287
|
-
makeInvalidStory({
|
|
288
|
-
name: "[REQ-PATH-FORMAT] story path must not use path traversal",
|
|
289
|
-
code: `// @story ../docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md`,
|
|
290
|
-
details: 'Invalid story path "../docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md" for @story annotation. Expected a path like "docs/stories/005.0-DEV-EXAMPLE.story.md".',
|
|
291
|
-
}),
|
|
292
|
-
makeInvalid({
|
|
293
|
-
name: "[REQ-REQ-FORMAT] missing req id (single line)",
|
|
294
|
-
code: `// @req`,
|
|
295
|
-
messageId: "invalidReqFormat",
|
|
296
|
-
details: 'Missing requirement ID for @req annotation. Expected an identifier like "REQ-EXAMPLE".',
|
|
297
|
-
}),
|
|
298
|
-
makeInvalid({
|
|
299
|
-
name: "[REQ-REQ-FORMAT] invalid req id format (single line)",
|
|
300
|
-
code: `// @req invalid-format`,
|
|
301
|
-
messageId: "invalidReqFormat",
|
|
302
|
-
details: 'Invalid requirement ID "invalid-format" for @req annotation. Expected an identifier like "REQ-EXAMPLE" (uppercase letters, numbers, and dashes only).',
|
|
303
|
-
}),
|
|
304
|
-
makeInvalid({
|
|
305
|
-
name: "[REQ-REQ-FORMAT] missing req identifier with trailing space",
|
|
306
|
-
code: `// @req `,
|
|
307
|
-
messageId: "invalidReqFormat",
|
|
308
|
-
details: 'Missing requirement ID for @req annotation. Expected an identifier like "REQ-EXAMPLE".',
|
|
309
|
-
}),
|
|
310
|
-
makeInvalidStory({
|
|
311
|
-
name: "[REQ-MULTILINE-SUPPORT] missing story path with multi-line block comment",
|
|
312
|
-
code: `/**
|
|
313
|
-
* @story
|
|
314
|
-
*/`,
|
|
315
|
-
details: 'Missing story path for @story annotation. Expected a path like "docs/stories/005.0-DEV-EXAMPLE.story.md".',
|
|
316
|
-
}),
|
|
317
|
-
makeInvalidStory({
|
|
318
|
-
name: "[REQ-MULTILINE-SUPPORT] invalid multi-line story path after collapsing whitespace",
|
|
319
|
-
code: `/**
|
|
320
|
-
* @story docs/stories/005.0-
|
|
321
|
-
* DEV-ANNOTATION-VALIDATION.story
|
|
322
|
-
*/`,
|
|
323
|
-
details: 'Invalid story path "docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story" for @story annotation. Expected a path like "docs/stories/005.0-DEV-EXAMPLE.story.md".',
|
|
324
|
-
}),
|
|
325
|
-
makeInvalid({
|
|
326
|
-
name: "[REQ-MULTILINE-SUPPORT] missing req id with multi-line block comment",
|
|
327
|
-
code: `/**
|
|
328
|
-
* @req
|
|
329
|
-
*/`,
|
|
330
|
-
messageId: "invalidReqFormat",
|
|
331
|
-
details: 'Missing requirement ID for @req annotation. Expected an identifier like "REQ-EXAMPLE".',
|
|
332
|
-
}),
|
|
333
|
-
makeInvalid({
|
|
334
|
-
name: "[REQ-MULTILINE-SUPPORT] invalid multi-line req id after collapsing whitespace",
|
|
335
|
-
code: `/**
|
|
336
|
-
* @req invalid-
|
|
337
|
-
* format
|
|
338
|
-
*/`,
|
|
339
|
-
messageId: "invalidReqFormat",
|
|
340
|
-
details: 'Invalid requirement ID "invalid-format" for @req annotation. Expected an identifier like "REQ-EXAMPLE" (uppercase letters, numbers, and dashes only).',
|
|
341
|
-
}),
|
|
342
|
-
{
|
|
343
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-EXAMPLES] custom story example appears in error message",
|
|
344
|
-
code: `// @story invalid/path.txt`,
|
|
345
|
-
options: [
|
|
346
|
-
{
|
|
347
|
-
story: {
|
|
348
|
-
pattern: "^stories\\/[^\\s]+\\.story\\.mdx$",
|
|
349
|
-
example: "stories/example-010.1-CUSTOM.story.mdx",
|
|
350
|
-
},
|
|
351
|
-
},
|
|
352
|
-
],
|
|
353
|
-
errors: [
|
|
354
|
-
{
|
|
355
|
-
messageId: "invalidStoryFormat",
|
|
356
|
-
data: {
|
|
357
|
-
details: 'Invalid story path "invalid/path.txt" for @story annotation. Expected a path like "stories/example-010.1-CUSTOM.story.mdx".',
|
|
358
|
-
},
|
|
359
|
-
},
|
|
360
|
-
],
|
|
361
|
-
},
|
|
362
|
-
{
|
|
363
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-EXAMPLES] custom requirement example appears in error message",
|
|
364
|
-
code: `// @req not-matching`,
|
|
365
|
-
options: [
|
|
366
|
-
{
|
|
367
|
-
req: {
|
|
368
|
-
pattern: "^[A-Z]+-[0-9]+$",
|
|
369
|
-
example: "PROJECT-123",
|
|
370
|
-
},
|
|
371
|
-
},
|
|
372
|
-
],
|
|
373
|
-
errors: [
|
|
374
|
-
{
|
|
375
|
-
messageId: "invalidReqFormat",
|
|
376
|
-
data: {
|
|
377
|
-
details: 'Invalid requirement ID "not-matching" for @req annotation. Expected an identifier like "PROJECT-123" (uppercase letters, numbers, and dashes only).',
|
|
378
|
-
},
|
|
379
|
-
},
|
|
380
|
-
],
|
|
381
|
-
},
|
|
382
|
-
{
|
|
383
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-FALLBACK] invalid storyPathPattern falls back to default behavior",
|
|
384
|
-
code: `// @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story`,
|
|
385
|
-
options: [
|
|
386
|
-
{
|
|
387
|
-
// invalid regex should be caught by the rule and ignored
|
|
388
|
-
story: {
|
|
389
|
-
pattern: "[unclosed",
|
|
390
|
-
},
|
|
391
|
-
},
|
|
392
|
-
],
|
|
393
|
-
output: `// @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md`,
|
|
394
|
-
errors: [
|
|
395
|
-
{
|
|
396
|
-
// Configuration error should also be reported
|
|
397
|
-
messageId: "invalidRuleConfiguration",
|
|
398
|
-
data: {
|
|
399
|
-
details: 'Invalid regular expression for option "story.pattern": "[unclosed"',
|
|
400
|
-
},
|
|
401
|
-
},
|
|
402
|
-
{
|
|
403
|
-
messageId: "invalidStoryFormat",
|
|
404
|
-
data: {
|
|
405
|
-
// Because we fall back, we still use the default example text
|
|
406
|
-
details: 'Invalid story path "docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story" for @story annotation. Expected a path like "docs/stories/005.0-DEV-EXAMPLE.story.md".',
|
|
407
|
-
},
|
|
408
|
-
},
|
|
409
|
-
],
|
|
410
|
-
},
|
|
411
|
-
{
|
|
412
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-FALLBACK] invalid requirementIdPattern falls back to default behavior",
|
|
413
|
-
code: `// @req invalid-format`,
|
|
414
|
-
options: [
|
|
415
|
-
{
|
|
416
|
-
// invalid regex should be caught by the rule and ignored
|
|
417
|
-
req: {
|
|
418
|
-
pattern: "(unclosed",
|
|
419
|
-
},
|
|
420
|
-
},
|
|
421
|
-
],
|
|
422
|
-
errors: [
|
|
423
|
-
{
|
|
424
|
-
// Configuration error should also be reported
|
|
425
|
-
messageId: "invalidRuleConfiguration",
|
|
426
|
-
data: {
|
|
427
|
-
details: 'Invalid regular expression for option "req.pattern": "(unclosed"',
|
|
428
|
-
},
|
|
429
|
-
},
|
|
430
|
-
{
|
|
431
|
-
messageId: "invalidReqFormat",
|
|
432
|
-
data: {
|
|
433
|
-
// Because we fall back, we still use the default example text
|
|
434
|
-
details: 'Invalid requirement ID "invalid-format" for @req annotation. Expected an identifier like "REQ-EXAMPLE" (uppercase letters, numbers, and dashes only).',
|
|
435
|
-
},
|
|
436
|
-
},
|
|
437
|
-
],
|
|
438
|
-
},
|
|
439
|
-
{
|
|
440
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-FALLBACK-FLAT] invalid flat storyPathPattern falls back to default and reports config error",
|
|
441
|
-
code: `// @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story`,
|
|
442
|
-
options: [
|
|
443
|
-
{
|
|
444
|
-
// invalid regex should be caught by the rule and ignored
|
|
445
|
-
storyPathPattern: "[unclosed",
|
|
446
|
-
},
|
|
447
|
-
],
|
|
448
|
-
output: `// @story docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story.md`,
|
|
449
|
-
errors: [
|
|
450
|
-
{
|
|
451
|
-
// Configuration error should also be reported
|
|
452
|
-
messageId: "invalidRuleConfiguration",
|
|
453
|
-
data: {
|
|
454
|
-
details: 'Invalid regular expression for option "storyPathPattern": "[unclosed"',
|
|
455
|
-
},
|
|
456
|
-
},
|
|
457
|
-
{
|
|
458
|
-
// Because we fall back, we still use the default example text
|
|
459
|
-
messageId: "invalidStoryFormat",
|
|
460
|
-
data: {
|
|
461
|
-
details: 'Invalid story path "docs/stories/005.0-DEV-ANNOTATION-VALIDATION.story" for @story annotation. Expected a path like "docs/stories/005.0-DEV-EXAMPLE.story.md".',
|
|
462
|
-
},
|
|
463
|
-
},
|
|
464
|
-
],
|
|
465
|
-
},
|
|
466
|
-
{
|
|
467
|
-
name: "[REQ-CONFIGURABLE-PATTERNS-FALLBACK-FLAT] invalid flat requirementIdPattern falls back to default and reports config error",
|
|
468
|
-
code: `// @req invalid-format`,
|
|
469
|
-
options: [
|
|
470
|
-
{
|
|
471
|
-
// invalid regex should be caught by the rule and ignored
|
|
472
|
-
requirementIdPattern: "(unclosed",
|
|
473
|
-
},
|
|
474
|
-
],
|
|
475
|
-
errors: [
|
|
476
|
-
{
|
|
477
|
-
// Configuration error should also be reported
|
|
478
|
-
messageId: "invalidRuleConfiguration",
|
|
479
|
-
data: {
|
|
480
|
-
details: 'Invalid regular expression for option "requirementIdPattern": "(unclosed"',
|
|
481
|
-
},
|
|
482
|
-
},
|
|
483
|
-
{
|
|
484
|
-
// Because we fall back, we still use the default example text
|
|
485
|
-
messageId: "invalidReqFormat",
|
|
486
|
-
data: {
|
|
487
|
-
details: 'Invalid requirement ID "invalid-format" for @req annotation. Expected an identifier like "REQ-EXAMPLE" (uppercase letters, numbers, and dashes only).',
|
|
488
|
-
},
|
|
489
|
-
},
|
|
490
|
-
],
|
|
491
|
-
},
|
|
492
|
-
{
|
|
493
|
-
name: "[REQ-PATTERN-CONFIG] nested story.pattern takes precedence over flat storyPathPattern and its example",
|
|
494
|
-
code: `// @story not-matching.mdx`,
|
|
495
|
-
options: [
|
|
496
|
-
{
|
|
497
|
-
story: {
|
|
498
|
-
pattern: "^stories\\/nested-only\\.story\\.mdx$",
|
|
499
|
-
example: "stories/nested-only.story.mdx",
|
|
500
|
-
},
|
|
501
|
-
storyPathPattern: "^docs\\/stories\\/should-not-apply\\.story\\.mdx$",
|
|
502
|
-
storyPathExample: "docs/stories/should-not-apply.story.mdx",
|
|
503
|
-
},
|
|
504
|
-
],
|
|
505
|
-
errors: [
|
|
506
|
-
{
|
|
507
|
-
messageId: "invalidStoryFormat",
|
|
508
|
-
data: {
|
|
509
|
-
details: 'Invalid story path "not-matching.mdx" for @story annotation. Expected a path like "stories/nested-only.story.mdx".',
|
|
510
|
-
},
|
|
511
|
-
},
|
|
512
|
-
],
|
|
513
|
-
},
|
|
514
|
-
{
|
|
515
|
-
name: "[REQ-PATTERN-CONFIG] nested req.pattern takes precedence over flat requirementIdPattern and its example",
|
|
516
|
-
code: `// @req DOES-NOT-MATCH`,
|
|
517
|
-
options: [
|
|
518
|
-
{
|
|
519
|
-
req: {
|
|
520
|
-
pattern: "^REQ-[0-9]{4}$",
|
|
521
|
-
example: "REQ-0001",
|
|
522
|
-
},
|
|
523
|
-
requirementIdPattern: "^[A-Z]+-[0-9]+$",
|
|
524
|
-
requirementIdExample: "PROJECT-123",
|
|
525
|
-
},
|
|
526
|
-
],
|
|
527
|
-
errors: [
|
|
528
|
-
{
|
|
529
|
-
messageId: "invalidReqFormat",
|
|
530
|
-
data: {
|
|
531
|
-
details: 'Invalid requirement ID "DOES-NOT-MATCH" for @req annotation. Expected an identifier like "REQ-0001" (uppercase letters, numbers, and dashes only).',
|
|
532
|
-
},
|
|
533
|
-
},
|
|
534
|
-
],
|
|
535
|
-
},
|
|
536
|
-
{
|
|
537
|
-
name: "[REQ-EXAMPLE-MESSAGES] nested story example text overrides flat storyPathExample in error messages",
|
|
538
|
-
code: `// @story invalid/path.txt`,
|
|
539
|
-
options: [
|
|
540
|
-
{
|
|
541
|
-
story: {
|
|
542
|
-
pattern: "^stories\\/special\\/.+\\.story\\.mdx$",
|
|
543
|
-
example: "stories/special/example.story.mdx",
|
|
544
|
-
},
|
|
545
|
-
storyPathPattern: "^stories\\/ignored\\/.+\\.story\\.mdx$",
|
|
546
|
-
storyPathExample: "stories/ignored/example.story.mdx",
|
|
547
|
-
},
|
|
548
|
-
],
|
|
549
|
-
errors: [
|
|
550
|
-
{
|
|
551
|
-
messageId: "invalidStoryFormat",
|
|
552
|
-
data: {
|
|
553
|
-
details: 'Invalid story path "invalid/path.txt" for @story annotation. Expected a path like "stories/special/example.story.mdx".',
|
|
554
|
-
},
|
|
555
|
-
},
|
|
556
|
-
],
|
|
557
|
-
},
|
|
558
|
-
{
|
|
559
|
-
name: "[REQ-EXAMPLE-MESSAGES] nested req example text overrides flat requirementIdExample in error messages",
|
|
560
|
-
code: `// @req bad-id`,
|
|
561
|
-
options: [
|
|
562
|
-
{
|
|
563
|
-
req: {
|
|
564
|
-
pattern: "^REQ-[A-Z]+-[0-9]{3}$",
|
|
565
|
-
example: "REQ-FOO-001",
|
|
566
|
-
},
|
|
567
|
-
requirementIdPattern: "^[A-Z]+-[0-9]+$",
|
|
568
|
-
requirementIdExample: "PROJECT-123",
|
|
569
|
-
},
|
|
570
|
-
],
|
|
571
|
-
errors: [
|
|
572
|
-
{
|
|
573
|
-
messageId: "invalidReqFormat",
|
|
574
|
-
data: {
|
|
575
|
-
details: 'Invalid requirement ID "bad-id" for @req annotation. Expected an identifier like "REQ-FOO-001" (uppercase letters, numbers, and dashes only).',
|
|
576
|
-
},
|
|
577
|
-
},
|
|
578
|
-
],
|
|
579
|
-
},
|
|
580
|
-
makeInvalid({
|
|
581
|
-
name: "[REQ-SUPPORTS-PARSE] @supports with no value is invalid",
|
|
582
|
-
code: `/**
|
|
583
|
-
* @supports
|
|
584
|
-
*/`,
|
|
585
|
-
messageId: "invalidImplementsFormat",
|
|
586
|
-
details: 'Missing story path and requirement IDs for @supports annotation. Expected a value like "docs/stories/005.0-DEV-EXAMPLE.story.md REQ-EXAMPLE".',
|
|
587
|
-
}),
|
|
588
|
-
makeInvalid({
|
|
589
|
-
name: "[REQ-SUPPORTS-PARSE] @supports with only story path and no requirement IDs is invalid",
|
|
590
|
-
code: `/**
|
|
591
|
-
* @supports docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md
|
|
592
|
-
*/`,
|
|
593
|
-
messageId: "invalidImplementsFormat",
|
|
594
|
-
details: 'Missing requirement IDs for @supports annotation. Expected a value like "docs/stories/005.0-DEV-EXAMPLE.story.md REQ-EXAMPLE".',
|
|
595
|
-
}),
|
|
596
|
-
makeInvalid({
|
|
597
|
-
name: "[REQ-FORMAT-VALIDATION] @supports with invalid story path format",
|
|
598
|
-
code: `/**
|
|
599
|
-
* @supports invalid/path.txt REQ-IMPLEMENTS-PARSE
|
|
600
|
-
*/`,
|
|
601
|
-
messageId: "invalidImplementsFormat",
|
|
602
|
-
details: 'Invalid story path "invalid/path.txt" for @supports annotation. Expected a path like "docs/stories/005.0-DEV-EXAMPLE.story.md".',
|
|
603
|
-
}),
|
|
604
|
-
{
|
|
605
|
-
name: "[REQ-FORMAT-VALIDATION] @supports with invalid requirement ID format",
|
|
606
|
-
code: `/**
|
|
607
|
-
* @supports docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md REQ-VALID invalid-format
|
|
608
|
-
*/`,
|
|
609
|
-
errors: [
|
|
610
|
-
{
|
|
611
|
-
messageId: "invalidReqFormat",
|
|
612
|
-
data: {
|
|
613
|
-
details: 'Invalid requirement ID "invalid-format" for @req annotation. Expected an identifier like "REQ-EXAMPLE" (uppercase letters, numbers, and dashes only).',
|
|
614
|
-
},
|
|
615
|
-
},
|
|
616
|
-
],
|
|
617
|
-
},
|
|
618
|
-
{
|
|
619
|
-
name: "[REQ-FORMAT-VALIDATION] @supports with multiple requirement IDs where one is invalid",
|
|
620
|
-
code: `/**
|
|
621
|
-
* @supports docs/stories/010.2-DEV-MULTI-STORY-SUPPORT.story.md REQ-VALID-1 REQ-VALID-2 bad-id
|
|
622
|
-
*/`,
|
|
623
|
-
errors: [
|
|
624
|
-
{
|
|
625
|
-
messageId: "invalidReqFormat",
|
|
626
|
-
data: {
|
|
627
|
-
details: 'Invalid requirement ID "bad-id" for @req annotation. Expected an identifier like "REQ-EXAMPLE" (uppercase letters, numbers, and dashes only).',
|
|
628
|
-
},
|
|
629
|
-
},
|
|
630
|
-
],
|
|
631
|
-
},
|
|
632
|
-
],
|
|
633
|
-
});
|
|
634
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|