@codeperfect/eslint-plugin 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts +16 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +131 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +48 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.js +126 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts +40 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.js +90 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts +11 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/exports-only-rule.js +218 -0
- package/dist/architecture/consistent-barrel-files/index.d.ts +5 -0
- package/dist/architecture/consistent-barrel-files/index.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/index.js +4 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts +11 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +100 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts +40 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.js +90 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts +65 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +154 -0
- package/dist/architecture/consistent-barrel-files/rule.d.ts +11 -0
- package/dist/architecture/consistent-barrel-files/rule.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/rule.js +58 -0
- package/dist/architecture/consistent-barrel-files/test-helpers.d.ts +141 -0
- package/dist/architecture/consistent-barrel-files/test-helpers.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/test-helpers.js +229 -0
- package/dist/architecture/consistent-barrel-files/types.d.ts +25 -0
- package/dist/architecture/consistent-barrel-files/types.d.ts.map +1 -0
- package/dist/architecture/consistent-barrel-files/types.js +2 -0
- package/dist/architecture/index.d.ts +2 -0
- package/dist/architecture/index.d.ts.map +1 -0
- package/dist/architecture/index.js +2 -0
- package/dist/benchmark-rules.d.ts +83 -0
- package/dist/benchmark-rules.d.ts.map +1 -0
- package/dist/benchmark-rules.js +175 -0
- package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
- package/dist/codeperfect-plugin.d.ts +46 -0
- package/dist/codeperfect-plugin.d.ts.map +1 -0
- package/dist/codeperfect-plugin.js +29 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/no-multiple-declarators/index.d.ts +2 -0
- package/dist/core/no-multiple-declarators/index.d.ts.map +1 -0
- package/dist/core/no-multiple-declarators/index.js +2 -0
- package/dist/core/no-multiple-declarators/rule.d.ts +4 -0
- package/dist/core/no-multiple-declarators/rule.d.ts.map +1 -0
- package/dist/core/no-multiple-declarators/rule.js +100 -0
- package/dist/core/prefer-interface-types/index.d.ts +2 -0
- package/dist/core/prefer-interface-types/index.d.ts.map +1 -0
- package/dist/core/prefer-interface-types/index.js +2 -0
- package/dist/core/prefer-interface-types/rule.d.ts +5 -0
- package/dist/core/prefer-interface-types/rule.d.ts.map +1 -0
- package/dist/core/prefer-interface-types/rule.js +145 -0
- package/dist/core/prefer-interface-types/test-helpers.d.ts +110 -0
- package/dist/core/prefer-interface-types/test-helpers.d.ts.map +1 -0
- package/dist/core/prefer-interface-types/test-helpers.js +116 -0
- package/dist/custom-rule-documentation.d.ts +36 -0
- package/dist/custom-rule-documentation.d.ts.map +1 -0
- package/dist/custom-rule-documentation.js +35 -0
- package/dist/custom-rules.d.ts +61 -0
- package/dist/custom-rules.d.ts.map +1 -0
- package/dist/custom-rules.js +70 -0
- package/dist/docs/index.d.ts +4 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +4 -0
- package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts +89 -0
- package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.js +129 -0
- package/dist/docs/no-interface-member-docs/comment-utilities.d.ts +48 -0
- package/dist/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/comment-utilities.js +146 -0
- package/dist/docs/no-interface-member-docs/index.d.ts +2 -0
- package/dist/docs/no-interface-member-docs/index.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/index.js +2 -0
- package/dist/docs/no-interface-member-docs/parameter-tags.d.ts +13 -0
- package/dist/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/parameter-tags.js +101 -0
- package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts +24 -0
- package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/parameter-utilities.js +125 -0
- package/dist/docs/no-interface-member-docs/rule.d.ts +5 -0
- package/dist/docs/no-interface-member-docs/rule.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/rule.js +168 -0
- package/dist/docs/no-interface-member-docs/test-helpers.d.ts +103 -0
- package/dist/docs/no-interface-member-docs/test-helpers.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/test-helpers.js +157 -0
- package/dist/docs/no-interface-member-docs/types.d.ts +30 -0
- package/dist/docs/no-interface-member-docs/types.d.ts.map +1 -0
- package/dist/docs/no-interface-member-docs/types.js +2 -0
- package/dist/docs/require-example-language/empty-fence-fixes.d.ts +29 -0
- package/dist/docs/require-example-language/empty-fence-fixes.d.ts.map +1 -0
- package/dist/docs/require-example-language/empty-fence-fixes.js +169 -0
- package/dist/docs/require-example-language/example-utilities.d.ts +70 -0
- package/dist/docs/require-example-language/example-utilities.d.ts.map +1 -0
- package/dist/docs/require-example-language/example-utilities.js +76 -0
- package/dist/docs/require-example-language/examples.d.ts +36 -0
- package/dist/docs/require-example-language/examples.d.ts.map +1 -0
- package/dist/docs/require-example-language/examples.js +181 -0
- package/dist/docs/require-example-language/fixes.d.ts +49 -0
- package/dist/docs/require-example-language/fixes.d.ts.map +1 -0
- package/dist/docs/require-example-language/fixes.js +182 -0
- package/dist/docs/require-example-language/index.d.ts +3 -0
- package/dist/docs/require-example-language/index.d.ts.map +1 -0
- package/dist/docs/require-example-language/index.js +2 -0
- package/dist/docs/require-example-language/reporting.d.ts +60 -0
- package/dist/docs/require-example-language/reporting.d.ts.map +1 -0
- package/dist/docs/require-example-language/reporting.js +145 -0
- package/dist/docs/require-example-language/rule.d.ts +7 -0
- package/dist/docs/require-example-language/rule.d.ts.map +1 -0
- package/dist/docs/require-example-language/rule.js +34 -0
- package/dist/docs/require-example-language/types.d.ts +22 -0
- package/dist/docs/require-example-language/types.d.ts.map +1 -0
- package/dist/docs/require-example-language/types.js +2 -0
- package/dist/docs/single-line-jsdoc/index.d.ts +2 -0
- package/dist/docs/single-line-jsdoc/index.d.ts.map +1 -0
- package/dist/docs/single-line-jsdoc/index.js +2 -0
- package/dist/docs/single-line-jsdoc/rule.d.ts +5 -0
- package/dist/docs/single-line-jsdoc/rule.d.ts.map +1 -0
- package/dist/docs/single-line-jsdoc/rule.js +196 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts +16 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.js +95 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts +25 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -0
- package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +140 -0
- package/dist/docs/test-helpers.d.ts +50 -0
- package/dist/docs/test-helpers.d.ts.map +1 -0
- package/dist/docs/test-helpers.js +107 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/presets.d.ts +10 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +50 -0
- package/dist/rules/index.d.ts +5 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +6 -0
- package/dist/testing/aaa/analyzer.d.ts +36 -0
- package/dist/testing/aaa/analyzer.d.ts.map +1 -0
- package/dist/testing/aaa/analyzer.js +490 -0
- package/dist/testing/aaa/index.d.ts +3 -0
- package/dist/testing/aaa/index.d.ts.map +1 -0
- package/dist/testing/aaa/index.js +2 -0
- package/dist/testing/aaa/types.d.ts +31 -0
- package/dist/testing/aaa/types.d.ts.map +1 -0
- package/dist/testing/aaa/types.js +2 -0
- package/dist/testing/assert-actual-expected-names/index.d.ts +2 -0
- package/dist/testing/assert-actual-expected-names/index.d.ts.map +1 -0
- package/dist/testing/assert-actual-expected-names/index.js +2 -0
- package/dist/testing/assert-actual-expected-names/rule.d.ts +4 -0
- package/dist/testing/assert-actual-expected-names/rule.d.ts.map +1 -0
- package/dist/testing/assert-actual-expected-names/rule.js +54 -0
- package/dist/testing/enforce-aaa-phase-purity/index.d.ts +2 -0
- package/dist/testing/enforce-aaa-phase-purity/index.d.ts.map +1 -0
- package/dist/testing/enforce-aaa-phase-purity/index.js +2 -0
- package/dist/testing/enforce-aaa-phase-purity/rule.d.ts +4 -0
- package/dist/testing/enforce-aaa-phase-purity/rule.d.ts.map +1 -0
- package/dist/testing/enforce-aaa-phase-purity/rule.js +110 -0
- package/dist/testing/enforce-aaa-structure/index.d.ts +2 -0
- package/dist/testing/enforce-aaa-structure/index.d.ts.map +1 -0
- package/dist/testing/enforce-aaa-structure/index.js +2 -0
- package/dist/testing/enforce-aaa-structure/rule.d.ts +4 -0
- package/dist/testing/enforce-aaa-structure/rule.d.ts.map +1 -0
- package/dist/testing/enforce-aaa-structure/rule.js +48 -0
- package/dist/testing/index.d.ts +9 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +9 -0
- package/dist/testing/prefer-vi-mocked-import/fix.d.ts +16 -0
- package/dist/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/fix.js +224 -0
- package/dist/testing/prefer-vi-mocked-import/index.d.ts +2 -0
- package/dist/testing/prefer-vi-mocked-import/index.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/index.js +2 -0
- package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts +16 -0
- package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-bindings.js +52 -0
- package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts +16 -0
- package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-declarations.js +99 -0
- package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts +66 -0
- package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-helpers.js +102 -0
- package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts +17 -0
- package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-imports.js +156 -0
- package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts +42 -0
- package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-rewrites.js +119 -0
- package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts +13 -0
- package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match-walk.js +62 -0
- package/dist/testing/prefer-vi-mocked-import/match.d.ts +15 -0
- package/dist/testing/prefer-vi-mocked-import/match.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/match.js +193 -0
- package/dist/testing/prefer-vi-mocked-import/rule.d.ts +5 -0
- package/dist/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/rule.js +32 -0
- package/dist/testing/prefer-vi-mocked-import/types.d.ts +83 -0
- package/dist/testing/prefer-vi-mocked-import/types.d.ts.map +1 -0
- package/dist/testing/prefer-vi-mocked-import/types.js +2 -0
- package/dist/testing/require-aaa-sections/index.d.ts +2 -0
- package/dist/testing/require-aaa-sections/index.d.ts.map +1 -0
- package/dist/testing/require-aaa-sections/index.js +2 -0
- package/dist/testing/require-aaa-sections/rule.d.ts +4 -0
- package/dist/testing/require-aaa-sections/rule.d.ts.map +1 -0
- package/dist/testing/require-aaa-sections/rule.js +111 -0
- package/dist/testing/require-act-result-capture/index.d.ts +2 -0
- package/dist/testing/require-act-result-capture/index.d.ts.map +1 -0
- package/dist/testing/require-act-result-capture/index.js +2 -0
- package/dist/testing/require-act-result-capture/rule.d.ts +4 -0
- package/dist/testing/require-act-result-capture/rule.d.ts.map +1 -0
- package/dist/testing/require-act-result-capture/rule.js +34 -0
- package/dist/testing/require-test-companion/index.d.ts +3 -0
- package/dist/testing/require-test-companion/index.d.ts.map +1 -0
- package/dist/testing/require-test-companion/index.js +3 -0
- package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts +16 -0
- package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -0
- package/dist/testing/require-test-companion/require-test-companion-listeners.js +145 -0
- package/dist/testing/require-test-companion/require-test-companion-options.d.ts +54 -0
- package/dist/testing/require-test-companion/require-test-companion-options.d.ts.map +1 -0
- package/dist/testing/require-test-companion/require-test-companion-options.js +112 -0
- package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts +51 -0
- package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts.map +1 -0
- package/dist/testing/require-test-companion/require-test-companion-test-helpers.js +183 -0
- package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts +28 -0
- package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts.map +1 -0
- package/dist/testing/require-test-companion/require-test-companion-utilities.js +26 -0
- package/dist/testing/require-test-companion/rule.d.ts +5 -0
- package/dist/testing/require-test-companion/rule.d.ts.map +1 -0
- package/dist/testing/require-test-companion/rule.js +57 -0
- package/dist/testing/require-test-companion/types.d.ts +11 -0
- package/dist/testing/require-test-companion/types.d.ts.map +1 -0
- package/dist/testing/require-test-companion/types.js +2 -0
- package/dist/testing/single-act-statement/index.d.ts +2 -0
- package/dist/testing/single-act-statement/index.d.ts.map +1 -0
- package/dist/testing/single-act-statement/index.js +2 -0
- package/dist/testing/single-act-statement/rule.d.ts +4 -0
- package/dist/testing/single-act-statement/rule.d.ts.map +1 -0
- package/dist/testing/single-act-statement/rule.js +33 -0
- package/package.json +106 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Closes a fence and updates the state.
|
|
3
|
+
* @param state Current fence state.
|
|
4
|
+
* @param line Fence line being processed.
|
|
5
|
+
* @returns Updated fence state.
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const next = closeFence(state, " * ```");
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
function closeFence(state, line) {
|
|
12
|
+
const fenceLines = [...state.currentFence, line];
|
|
13
|
+
const shouldRemove = !state.hasFenceContent;
|
|
14
|
+
const hasNonEmptyFence = state.hasNonEmptyFence || state.hasFenceContent;
|
|
15
|
+
const output = shouldRemove ? state.output : [...state.output, ...fenceLines];
|
|
16
|
+
return {
|
|
17
|
+
...state,
|
|
18
|
+
currentFence: [],
|
|
19
|
+
hasFenceContent: false,
|
|
20
|
+
hasNonEmptyFence,
|
|
21
|
+
inFence: false,
|
|
22
|
+
output,
|
|
23
|
+
removed: state.removed || shouldRemove,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Finalizes fence output, including any unclosed fences.
|
|
28
|
+
* @param state Current fence state.
|
|
29
|
+
* @returns Finalized fence state.
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const next = finalizeFenceState(state);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
function finalizeFenceState(state) {
|
|
36
|
+
if (state.inFence) {
|
|
37
|
+
return {
|
|
38
|
+
...state,
|
|
39
|
+
currentFence: [],
|
|
40
|
+
hasFenceContent: false,
|
|
41
|
+
hasNonEmptyFence: state.hasNonEmptyFence || state.hasFenceContent,
|
|
42
|
+
inFence: false,
|
|
43
|
+
output: [...state.output, ...state.currentFence],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return state;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Determines whether a line contains non-empty content.
|
|
50
|
+
* @param line Line text to check.
|
|
51
|
+
* @returns True when the line contains content.
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const ok = isContentLine(" * const ok = true;");
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
function isContentLine(line) {
|
|
58
|
+
const trimmed = line.replace(/^\s*\*?\s?/u, "").trim();
|
|
59
|
+
return trimmed.length > 0;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Opens a new fenced block.
|
|
63
|
+
* @param state Current fence state.
|
|
64
|
+
* @param line Fence line being processed.
|
|
65
|
+
* @returns Updated fence state.
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const next = openFence(state, " * ```typescript");
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
function openFence(state, line) {
|
|
72
|
+
return {
|
|
73
|
+
...state,
|
|
74
|
+
currentFence: [line],
|
|
75
|
+
hasFenceContent: false,
|
|
76
|
+
hasNonEmptyFence: state.hasNonEmptyFence,
|
|
77
|
+
inFence: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Parses a fence line for its leading prefix and language.
|
|
82
|
+
* @param line Fence line to parse.
|
|
83
|
+
* @returns Parsed fence info when matched.
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const info = parseFenceLine(" * ```typescript");
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
function parseFenceLine(line) {
|
|
90
|
+
const fenceMatch = /^(?<leading>\s*\*?\s*)```(?<lang>[^\s`]+)?[ \t]*$/u.exec(line);
|
|
91
|
+
if (fenceMatch === null) {
|
|
92
|
+
return void 0;
|
|
93
|
+
}
|
|
94
|
+
const groups = fenceMatch.groups ?? {};
|
|
95
|
+
const leading = typeof groups["leading"] === "string" ? groups["leading"] : "";
|
|
96
|
+
const language = typeof groups["lang"] === "string" ? groups["lang"] : "";
|
|
97
|
+
return { language, leading };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Removes fenced blocks that contain no content.
|
|
101
|
+
* @param original Original comment text.
|
|
102
|
+
* @returns Updated comment text when a fence is removed.
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* const updated = removeEmptyFences("* ```typescript\n* ```\n* ok");
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
function removeEmptyFences(original) {
|
|
109
|
+
const lineBreak = original.includes("\r\n") ? "\r\n" : "\n";
|
|
110
|
+
const lines = original.split(/\r?\n/u);
|
|
111
|
+
const initialState = {
|
|
112
|
+
currentFence: [],
|
|
113
|
+
hasFenceContent: false,
|
|
114
|
+
hasNonEmptyFence: false,
|
|
115
|
+
inFence: false,
|
|
116
|
+
output: [],
|
|
117
|
+
removed: false,
|
|
118
|
+
};
|
|
119
|
+
let state = initialState;
|
|
120
|
+
for (const line of lines) {
|
|
121
|
+
const fenceInfo = parseFenceLine(line);
|
|
122
|
+
state =
|
|
123
|
+
fenceInfo === void 0
|
|
124
|
+
? updateContentState(state, line)
|
|
125
|
+
: updateFenceState(state, line);
|
|
126
|
+
}
|
|
127
|
+
const finalState = finalizeFenceState(state);
|
|
128
|
+
return finalState.removed && finalState.hasNonEmptyFence
|
|
129
|
+
? finalState.output.join(lineBreak)
|
|
130
|
+
: void 0;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Updates the state with a non-fence line.
|
|
134
|
+
* @param state Current fence state.
|
|
135
|
+
* @param line Line being processed.
|
|
136
|
+
* @returns Updated fence state.
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* const next = updateContentState(state, " * const ok = true;");
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
function updateContentState(state, line) {
|
|
143
|
+
if (state.inFence) {
|
|
144
|
+
return {
|
|
145
|
+
...state,
|
|
146
|
+
currentFence: [...state.currentFence, line],
|
|
147
|
+
hasFenceContent: state.hasFenceContent || isContentLine(line),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return { ...state, output: [...state.output, line] };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Opens or closes a fence based on the current state.
|
|
154
|
+
* @param state Current fence state.
|
|
155
|
+
* @param line Fence line being processed.
|
|
156
|
+
* @returns Updated fence state.
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const next = updateFenceState(state, " * ```");
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
function updateFenceState(state, line) {
|
|
163
|
+
if (state.inFence) {
|
|
164
|
+
return closeFence(state, line);
|
|
165
|
+
}
|
|
166
|
+
return openFence(state, line);
|
|
167
|
+
}
|
|
168
|
+
export { parseFenceLine, removeEmptyFences };
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktZmVuY2UtZml4ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jcy9yZXF1aXJlLWV4YW1wbGUtbGFuZ3VhZ2UvZW1wdHktZmVuY2UtZml4ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBOEJBOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQXNCLEVBQUUsSUFBWTtJQUN0RCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7SUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQztJQUN6RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFFOUUsT0FBTztRQUNMLEdBQUcsS0FBSztRQUNSLFlBQVksRUFBRSxFQUFFO1FBQ2hCLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLGdCQUFnQjtRQUNoQixPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU07UUFDTixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxZQUFZO0tBQ3ZDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQXNCO0lBQ2hELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixZQUFZLEVBQUUsRUFBRTtZQUNoQixlQUFlLEVBQUUsS0FBSztZQUN0QixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGVBQWU7WUFDakUsT0FBTyxF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QUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixLQUFzQixFQUN0QixJQUFZO0lBRVosSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsT0FBTztZQUNMLEdBQUcsS0FBSztZQUNSLFlBQVksRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7WUFDM0MsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQztTQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsS0FBc0IsRUFDdEIsSUFBWTtJQUVaLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLE9BQU8sVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgRW1wdHlGZW5jZVN0YXRlIHtcbiAgLyoqIEN1cnJlbnRGZW5jZSBmaWVsZCB2YWx1ZS4gKi9cbiAgY3VycmVudEZlbmNlOiBzdHJpbmdbXTtcblxuICAvKiogSGFzRmVuY2VDb250ZW50IGZpZWxkIHZhbHVlLiAqL1xuICBoYXNGZW5jZUNvbnRlbnQ6IGJvb2xlYW47XG5cbiAgLyoqIEhhc05vbkVtcHR5RmVuY2UgZmllbGQgdmFsdWUuICovXG4gIGhhc05vbkVtcHR5RmVuY2U6IGJvb2xlYW47XG5cbiAgLyoqIEluRmVuY2UgZmllbGQgdmFsdWUuICovXG4gIGluRmVuY2U6IGJvb2xlYW47XG5cbiAgLyoqIE91dHB1dCBmaWVsZCB2YWx1ZS4gKi9cbiAgb3V0cHV0OiBzdHJpbmdbXTtcblxuICAvKiogUmVtb3ZlZCBmaWVsZCB2YWx1ZS4gKi9cbiAgcmVtb3ZlZDogYm9vbGVhbjtcbn1cblxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xuaW50ZXJmYWNlIEZlbmNlTGluZUluZm8ge1xuICAvKiogTGFuZ3VhZ2UgZmllbGQgdmFsdWUuICovXG4gIGxhbmd1YWdlOiBzdHJpbmc7XG5cbiAgLyoqIExlYWRpbmcgZmllbGQgdmFsdWUuICovXG4gIGxlYWRpbmc6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDbG9zZXMgYSBmZW5jZSBhbmQgdXBkYXRlcyB0aGUgc3RhdGUuXG4gKiBAcGFyYW0gc3RhdGUgQ3VycmVudCBmZW5jZSBzdGF0ZS5cbiAqIEBwYXJhbSBsaW5lIEZlbmNlIGxpbmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHJldHVybnMgVXBkYXRlZCBmZW5jZSBzdGF0ZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuZXh0ID0gY2xvc2VGZW5jZShzdGF0ZSwgXCIgKiBgYGBcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY2xvc2VGZW5jZShzdGF0ZTogRW1wdHlGZW5jZVN0YXRlLCBsaW5lOiBzdHJpbmcpOiBFbXB0eUZlbmNlU3RhdGUge1xuICBjb25zdCBmZW5jZUxpbmVzID0gWy4uLnN0YXRlLmN1cnJlbnRGZW5jZSwgbGluZV07XG4gIGNvbnN0IHNob3VsZFJlbW92ZSA9ICFzdGF0ZS5oYXNGZW5jZUNvbnRlbnQ7XG4gIGNvbnN0IGhhc05vbkVtcHR5RmVuY2UgPSBzdGF0ZS5oYXNOb25FbXB0eUZlbmNlIHx8IHN0YXRlLmhhc0ZlbmNlQ29udGVudDtcbiAgY29uc3Qgb3V0cHV0ID0gc2hvdWxkUmVtb3ZlID8gc3RhdGUub3V0cHV0IDogWy4uLnN0YXRlLm91dHB1dCwgLi4uZmVuY2VMaW5lc107XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjdXJyZW50RmVuY2U6IFtdLFxuICAgIGhhc0ZlbmNlQ29udGVudDogZmFsc2UsXG4gICAgaGFzTm9uRW1wdHlGZW5jZSxcbiAgICBpbkZlbmNlOiBmYWxzZSxcbiAgICBvdXRwdXQsXG4gICAgcmVtb3ZlZDogc3RhdGUucmVtb3ZlZCB8fCBzaG91bGRSZW1vdmUsXG4gIH07XG59XG5cbi8qKlxuICogRmluYWxpemVzIGZlbmNlIG91dHB1dCwgaW5jbHVkaW5nIGFueSB1bmNsb3NlZCBmZW5jZXMuXG4gKiBAcGFyYW0gc3RhdGUgQ3VycmVudCBmZW5jZSBzdGF0ZS5cbiAqIEByZXR1cm5zIEZpbmFsaXplZCBmZW5jZSBzdGF0ZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuZXh0ID0gZmluYWxpemVGZW5jZVN0YXRlKHN0YXRlKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBmaW5hbGl6ZUZlbmNlU3RhdGUoc3RhdGU6IEVtcHR5RmVuY2VTdGF0ZSk6IEVtcHR5RmVuY2VTdGF0ZSB7XG4gIGlmIChzdGF0ZS5pbkZlbmNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgY3VycmVudEZlbmNlOiBbXSxcbiAgICAgIGhhc0ZlbmNlQ29udGVudDogZmFsc2UsXG4gICAgICBoYXNOb25FbXB0eUZlbmNlOiBzdGF0ZS5oYXNOb25FbXB0eUZlbmNlIHx8IHN0YXRlLmhhc0ZlbmNlQ29udGVudCxcbiAgICAgIGluRmVuY2U6IGZhbHNlLFxuICAgICAgb3V0cHV0OiBbLi4uc3RhdGUub3V0cHV0LCAuLi5zdGF0ZS5jdXJyZW50RmVuY2VdLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbGluZSBjb250YWlucyBub24tZW1wdHkgY29udGVudC5cbiAqIEBwYXJhbSBsaW5lIExpbmUgdGV4dCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgbGluZSBjb250YWlucyBjb250ZW50LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG9rID0gaXNDb250ZW50TGluZShcIiAqIGNvbnN0IG9rID0gdHJ1ZTtcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gaXNDb250ZW50TGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUucmVwbGFjZSgvXlxccypcXCo/XFxzPy91LCBcIlwiKS50cmltKCk7XG4gIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogT3BlbnMgYSBuZXcgZmVuY2VkIGJsb2NrLlxuICogQHBhcmFtIHN0YXRlIEN1cnJlbnQgZmVuY2Ugc3RhdGUuXG4gKiBAcGFyYW0gbGluZSBGZW5jZSBsaW5lIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgZmVuY2Ugc3RhdGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmV4dCA9IG9wZW5GZW5jZShzdGF0ZSwgXCIgKiBgYGB0eXBlc2NyaXB0XCIpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIG9wZW5GZW5jZShzdGF0ZTogRW1wdHlGZW5jZVN0YXRlLCBsaW5lOiBzdHJpbmcpOiBFbXB0eUZlbmNlU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGN1cnJlbnRGZW5jZTogW2xpbmVdLFxuICAgIGhhc0ZlbmNlQ29udGVudDogZmFsc2UsXG4gICAgaGFzTm9uRW1wdHlGZW5jZTogc3RhdGUuaGFzTm9uRW1wdHlGZW5jZSxcbiAgICBpbkZlbmNlOiB0cnVlLFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGZlbmNlIGxpbmUgZm9yIGl0cyBsZWFkaW5nIHByZWZpeCBhbmQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0gbGluZSBGZW5jZSBsaW5lIHRvIHBhcnNlLlxuICogQHJldHVybnMgUGFyc2VkIGZlbmNlIGluZm8gd2hlbiBtYXRjaGVkLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGluZm8gPSBwYXJzZUZlbmNlTGluZShcIiAqIGBgYHR5cGVzY3JpcHRcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gcGFyc2VGZW5jZUxpbmUobGluZTogc3RyaW5nKTogRmVuY2VMaW5lSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZlbmNlTWF0Y2ggPSAvXig/PGxlYWRpbmc+XFxzKlxcKj9cXHMqKWBgYCg/PGxhbmc+W15cXHNgXSspP1sgXFx0XSokL3UuZXhlYyhcbiAgICBsaW5lLFxuICApO1xuXG4gIGlmIChmZW5jZU1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGNvbnN0IGdyb3VwcyA9IGZlbmNlTWF0Y2guZ3JvdXBzID8/IHt9O1xuICBjb25zdCBsZWFkaW5nID1cbiAgICB0eXBlb2YgZ3JvdXBzW1wibGVhZGluZ1wiXSA9PT0gXCJzdHJpbmdcIiA/IGdyb3Vwc1tcImxlYWRpbmdcIl0gOiBcIlwiO1xuICBjb25zdCBsYW5ndWFnZSA9IHR5cGVvZiBncm91cHNbXCJsYW5nXCJdID09PSBcInN0cmluZ1wiID8gZ3JvdXBzW1wibGFuZ1wiXSA6IFwiXCI7XG5cbiAgcmV0dXJuIHsgbGFuZ3VhZ2UsIGxlYWRpbmcgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGZlbmNlZCBibG9ja3MgdGhhdCBjb250YWluIG5vIGNvbnRlbnQuXG4gKiBAcGFyYW0gb3JpZ2luYWwgT3JpZ2luYWwgY29tbWVudCB0ZXh0LlxuICogQHJldHVybnMgVXBkYXRlZCBjb21tZW50IHRleHQgd2hlbiBhIGZlbmNlIGlzIHJlbW92ZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdXBkYXRlZCA9IHJlbW92ZUVtcHR5RmVuY2VzKFwiKiBgYGB0eXBlc2NyaXB0XFxuKiBgYGBcXG4qIG9rXCIpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RmVuY2VzKG9yaWdpbmFsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsaW5lQnJlYWsgPSBvcmlnaW5hbC5pbmNsdWRlcyhcIlxcclxcblwiKSA/IFwiXFxyXFxuXCIgOiBcIlxcblwiO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsLnNwbGl0KC9cXHI/XFxuL3UpO1xuICBjb25zdCBpbml0aWFsU3RhdGU6IEVtcHR5RmVuY2VTdGF0ZSA9IHtcbiAgICBjdXJyZW50RmVuY2U6IFtdLFxuICAgIGhhc0ZlbmNlQ29udGVudDogZmFsc2UsXG4gICAgaGFzTm9uRW1wdHlGZW5jZTogZmFsc2UsXG4gICAgaW5GZW5jZTogZmFsc2UsXG4gICAgb3V0cHV0OiBbXSxcbiAgICByZW1vdmVkOiBmYWxzZSxcbiAgfTtcbiAgbGV0IHN0YXRlID0gaW5pdGlhbFN0YXRlO1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IGZlbmNlSW5mbyA9IHBhcnNlRmVuY2VMaW5lKGxpbmUpO1xuICAgIHN0YXRlID1cbiAgICAgIGZlbmNlSW5mbyA9PT0gdm9pZCAwXG4gICAgICAgID8gdXBkYXRlQ29udGVudFN0YXRlKHN0YXRlLCBsaW5lKVxuICAgICAgICA6IHVwZGF0ZUZlbmNlU3RhdGUoc3RhdGUsIGxpbmUpO1xuICB9XG5cbiAgY29uc3QgZmluYWxTdGF0ZSA9IGZpbmFsaXplRmVuY2VTdGF0ZShzdGF0ZSk7XG5cbiAgcmV0dXJuIGZpbmFsU3RhdGUucmVtb3ZlZCAmJiBmaW5hbFN0YXRlLmhhc05vbkVtcHR5RmVuY2VcbiAgICA/IGZpbmFsU3RhdGUub3V0cHV0LmpvaW4obGluZUJyZWFrKVxuICAgIDogdm9pZCAwO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHN0YXRlIHdpdGggYSBub24tZmVuY2UgbGluZS5cbiAqIEBwYXJhbSBzdGF0ZSBDdXJyZW50IGZlbmNlIHN0YXRlLlxuICogQHBhcmFtIGxpbmUgTGluZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyBVcGRhdGVkIGZlbmNlIHN0YXRlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG5leHQgPSB1cGRhdGVDb250ZW50U3RhdGUoc3RhdGUsIFwiICogY29uc3Qgb2sgPSB0cnVlO1wiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50U3RhdGUoXG4gIHN0YXRlOiBFbXB0eUZlbmNlU3RhdGUsXG4gIGxpbmU6IHN0cmluZyxcbik6IEVtcHR5RmVuY2VTdGF0ZSB7XG4gIGlmIChzdGF0ZS5pbkZlbmNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgY3VycmVudEZlbmNlOiBbLi4uc3RhdGUuY3VycmVudEZlbmNlLCBsaW5lXSxcbiAgICAgIGhhc0ZlbmNlQ29udGVudDogc3RhdGUuaGFzRmVuY2VDb250ZW50IHx8IGlzQ29udGVudExpbmUobGluZSksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IC4uLnN0YXRlLCBvdXRwdXQ6IFsuLi5zdGF0ZS5vdXRwdXQsIGxpbmVdIH07XG59XG5cbi8qKlxuICogT3BlbnMgb3IgY2xvc2VzIGEgZmVuY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gc3RhdGUgQ3VycmVudCBmZW5jZSBzdGF0ZS5cbiAqIEBwYXJhbSBsaW5lIEZlbmNlIGxpbmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHJldHVybnMgVXBkYXRlZCBmZW5jZSBzdGF0ZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuZXh0ID0gdXBkYXRlRmVuY2VTdGF0ZShzdGF0ZSwgXCIgKiBgYGBcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdXBkYXRlRmVuY2VTdGF0ZShcbiAgc3RhdGU6IEVtcHR5RmVuY2VTdGF0ZSxcbiAgbGluZTogc3RyaW5nLFxuKTogRW1wdHlGZW5jZVN0YXRlIHtcbiAgaWYgKHN0YXRlLmluRmVuY2UpIHtcbiAgICByZXR1cm4gY2xvc2VGZW5jZShzdGF0ZSwgbGluZSk7XG4gIH1cblxuICByZXR1cm4gb3BlbkZlbmNlKHN0YXRlLCBsaW5lKTtcbn1cblxuZXhwb3J0IHsgcGFyc2VGZW5jZUxpbmUsIHJlbW92ZUVtcHR5RmVuY2VzIH07XG4iXX0=
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** Type definition for rule data. */
|
|
2
|
+
interface LineMeta {
|
|
3
|
+
/** EndIndex field value. */
|
|
4
|
+
endIndex: number;
|
|
5
|
+
/** EndOffset field value. */
|
|
6
|
+
endOffset: number;
|
|
7
|
+
/** LineIndex field value. */
|
|
8
|
+
lineIndex: number;
|
|
9
|
+
}
|
|
10
|
+
/** Type definition for rule data. */
|
|
11
|
+
interface LineMetaContext {
|
|
12
|
+
/** CommentValue field value. */
|
|
13
|
+
commentValue: string;
|
|
14
|
+
/** Full field value. */
|
|
15
|
+
full: string;
|
|
16
|
+
/** StartOffset field value. */
|
|
17
|
+
startOffset: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extracts the language from a fence line when present.
|
|
21
|
+
* @param line Fence line to inspect.
|
|
22
|
+
* @returns Language tag when present.
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const lang = getFenceLanguage(" * ```typescript");
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
declare function getFenceLanguage(line: string): string | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Extracts inline example content from the header line.
|
|
31
|
+
* @param header Example header line.
|
|
32
|
+
* @returns Inline example content.
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const text = getInlineContent("* @example hello");
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
declare function getInlineContent(header: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Computes line metadata from the raw comment value.
|
|
41
|
+
* @param context Comment metadata context.
|
|
42
|
+
* @returns Line metadata for the example.
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const meta = getLineMeta({ commentValue: "* ok", full: "* ok", startOffset: 0 });
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
declare function getLineMeta(context: LineMetaContext): LineMeta;
|
|
49
|
+
/**
|
|
50
|
+
* Resolves the leading prefix used by example lines.
|
|
51
|
+
* @param header Example header line.
|
|
52
|
+
* @returns The leading prefix string.
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const prefix = getPrefix(" * @example");
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
declare function getPrefix(header: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* Determines whether a content line contains non-empty example text.
|
|
61
|
+
* @param line Line text to check.
|
|
62
|
+
* @returns True when the line contains content.
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const ok = hasLineContent(" * const value = 1;");
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
declare function hasLineContent(line: string): boolean;
|
|
69
|
+
export { getFenceLanguage, getInlineContent, getLineMeta, getPrefix, hasLineContent, };
|
|
70
|
+
//# sourceMappingURL=example-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-utilities.d.ts","sourceRoot":"","sources":["../../../src/docs/require-example-language/example-utilities.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,UAAU,QAAQ;IAChB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAElB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qCAAqC;AACrC,UAAU,eAAe;IACvB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IAErB,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IAEb,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAU1D;AAED;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;;;;;GAQG;AACH,iBAAS,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,QAAQ,CAQvD;AAED;;;;;;;;GAQG;AACH,iBAAS,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQzC;AAED;;;;;;;;GAQG;AACH,iBAAS,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG7C;AAED,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,cAAc,GACf,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the language from a fence line when present.
|
|
3
|
+
* @param line Fence line to inspect.
|
|
4
|
+
* @returns Language tag when present.
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* const lang = getFenceLanguage(" * ```typescript");
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
function getFenceLanguage(line) {
|
|
11
|
+
const fenceMatch = /^(?<leading>\s*\*?\s*)```(?<lang>[^\s`]+)?[ \t]*$/u.exec(line);
|
|
12
|
+
if (fenceMatch === null) {
|
|
13
|
+
return void 0;
|
|
14
|
+
}
|
|
15
|
+
return fenceMatch.groups?.["lang"] ?? "";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Extracts inline example content from the header line.
|
|
19
|
+
* @param header Example header line.
|
|
20
|
+
* @returns Inline example content.
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const text = getInlineContent("* @example hello");
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function getInlineContent(header) {
|
|
27
|
+
const inlineMatch = /^.*@example\b\s?(?<c>.*)$/u.exec(header);
|
|
28
|
+
return inlineMatch?.groups?.["c"] ?? "";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Computes line metadata from the raw comment value.
|
|
32
|
+
* @param context Comment metadata context.
|
|
33
|
+
* @returns Line metadata for the example.
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const meta = getLineMeta({ commentValue: "* ok", full: "* ok", startOffset: 0 });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
function getLineMeta(context) {
|
|
40
|
+
const { commentValue, full, startOffset } = context;
|
|
41
|
+
const lineIndex = commentValue.slice(0, startOffset).split(/\r?\n/u).length - 1;
|
|
42
|
+
const endOffset = startOffset + full.length;
|
|
43
|
+
const endIndex = lineIndex + full.split(/\r?\n/u).length - 1;
|
|
44
|
+
return { endIndex, endOffset, lineIndex };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolves the leading prefix used by example lines.
|
|
48
|
+
* @param header Example header line.
|
|
49
|
+
* @returns The leading prefix string.
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const prefix = getPrefix(" * @example");
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
function getPrefix(header) {
|
|
56
|
+
const prefixMatch = header.indexOf("@example");
|
|
57
|
+
if (prefixMatch === -1) {
|
|
58
|
+
return "";
|
|
59
|
+
}
|
|
60
|
+
return header.slice(0, prefixMatch);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Determines whether a content line contains non-empty example text.
|
|
64
|
+
* @param line Line text to check.
|
|
65
|
+
* @returns True when the line contains content.
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const ok = hasLineContent(" * const value = 1;");
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
function hasLineContent(line) {
|
|
72
|
+
const trimmed = line.replace(/^\s*\*?\s?/u, "").trim();
|
|
73
|
+
return trimmed.length > 0;
|
|
74
|
+
}
|
|
75
|
+
export { getFenceLanguage, getInlineContent, getLineMeta, getPrefix, hasLineContent, };
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS11dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jcy9yZXF1aXJlLWV4YW1wbGUtbGFuZ3VhZ2UvZXhhbXBsZS11dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0JBOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFZO0lBQ3BDLE1BQU0sVUFBVSxHQUFHLG9EQUFvRCxDQUFDLElBQUksQ0FDMUUsSUFBSSxDQUNMLENBQUM7SUFFRixJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4QixPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFjO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5RCxPQUFPLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxXQUFXLENBQUMsT0FBd0I7SUFDM0MsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3BELE1BQU0sU0FBUyxHQUNiLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDNUMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxTQUFTLENBQUMsTUFBYztJQUMvQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZELE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxTQUFTLEVBQ1QsY0FBYyxHQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgTGluZU1ldGEge1xuICAvKiogRW5kSW5kZXggZmllbGQgdmFsdWUuICovXG4gIGVuZEluZGV4OiBudW1iZXI7XG5cbiAgLyoqIEVuZE9mZnNldCBmaWVsZCB2YWx1ZS4gKi9cbiAgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqIExpbmVJbmRleCBmaWVsZCB2YWx1ZS4gKi9cbiAgbGluZUluZGV4OiBudW1iZXI7XG59XG5cbi8qKiBUeXBlIGRlZmluaXRpb24gZm9yIHJ1bGUgZGF0YS4gKi9cbmludGVyZmFjZSBMaW5lTWV0YUNvbnRleHQge1xuICAvKiogQ29tbWVudFZhbHVlIGZpZWxkIHZhbHVlLiAqL1xuICBjb21tZW50VmFsdWU6IHN0cmluZztcblxuICAvKiogRnVsbCBmaWVsZCB2YWx1ZS4gKi9cbiAgZnVsbDogc3RyaW5nO1xuXG4gIC8qKiBTdGFydE9mZnNldCBmaWVsZCB2YWx1ZS4gKi9cbiAgc3RhcnRPZmZzZXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgbGFuZ3VhZ2UgZnJvbSBhIGZlbmNlIGxpbmUgd2hlbiBwcmVzZW50LlxuICogQHBhcmFtIGxpbmUgRmVuY2UgbGluZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgTGFuZ3VhZ2UgdGFnIHdoZW4gcHJlc2VudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBsYW5nID0gZ2V0RmVuY2VMYW5ndWFnZShcIiAqIGBgYHR5cGVzY3JpcHRcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0RmVuY2VMYW5ndWFnZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmZW5jZU1hdGNoID0gL14oPzxsZWFkaW5nPlxccypcXCo/XFxzKilgYGAoPzxsYW5nPlteXFxzYF0rKT9bIFxcdF0qJC91LmV4ZWMoXG4gICAgbGluZSxcbiAgKTtcblxuICBpZiAoZmVuY2VNYXRjaCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4gZmVuY2VNYXRjaC5ncm91cHM/LltcImxhbmdcIl0gPz8gXCJcIjtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBpbmxpbmUgZXhhbXBsZSBjb250ZW50IGZyb20gdGhlIGhlYWRlciBsaW5lLlxuICogQHBhcmFtIGhlYWRlciBFeGFtcGxlIGhlYWRlciBsaW5lLlxuICogQHJldHVybnMgSW5saW5lIGV4YW1wbGUgY29udGVudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB0ZXh0ID0gZ2V0SW5saW5lQ29udGVudChcIiogQGV4YW1wbGUgaGVsbG9cIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0SW5saW5lQ29udGVudChoZWFkZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlubGluZU1hdGNoID0gL14uKkBleGFtcGxlXFxiXFxzPyg/PGM+LiopJC91LmV4ZWMoaGVhZGVyKTtcblxuICByZXR1cm4gaW5saW5lTWF0Y2g/Lmdyb3Vwcz8uW1wiY1wiXSA/PyBcIlwiO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGxpbmUgbWV0YWRhdGEgZnJvbSB0aGUgcmF3IGNvbW1lbnQgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dCBDb21tZW50IG1ldGFkYXRhIGNvbnRleHQuXG4gKiBAcmV0dXJucyBMaW5lIG1ldGFkYXRhIGZvciB0aGUgZXhhbXBsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtZXRhID0gZ2V0TGluZU1ldGEoeyBjb21tZW50VmFsdWU6IFwiKiBva1wiLCBmdWxsOiBcIiogb2tcIiwgc3RhcnRPZmZzZXQ6IDAgfSk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0TGluZU1ldGEoY29udGV4dDogTGluZU1ldGFDb250ZXh0KTogTGluZU1ldGEge1xuICBjb25zdCB7IGNvbW1lbnRWYWx1ZSwgZnVsbCwgc3RhcnRPZmZzZXQgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGxpbmVJbmRleCA9XG4gICAgY29tbWVudFZhbHVlLnNsaWNlKDAsIHN0YXJ0T2Zmc2V0KS5zcGxpdCgvXFxyP1xcbi91KS5sZW5ndGggLSAxO1xuICBjb25zdCBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIGZ1bGwubGVuZ3RoO1xuICBjb25zdCBlbmRJbmRleCA9IGxpbmVJbmRleCArIGZ1bGwuc3BsaXQoL1xccj9cXG4vdSkubGVuZ3RoIC0gMTtcblxuICByZXR1cm4geyBlbmRJbmRleCwgZW5kT2Zmc2V0LCBsaW5lSW5kZXggfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbGVhZGluZyBwcmVmaXggdXNlZCBieSBleGFtcGxlIGxpbmVzLlxuICogQHBhcmFtIGhlYWRlciBFeGFtcGxlIGhlYWRlciBsaW5lLlxuICogQHJldHVybnMgVGhlIGxlYWRpbmcgcHJlZml4IHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwcmVmaXggPSBnZXRQcmVmaXgoXCIgKiBAZXhhbXBsZVwiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRQcmVmaXgoaGVhZGVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcmVmaXhNYXRjaCA9IGhlYWRlci5pbmRleE9mKFwiQGV4YW1wbGVcIik7XG5cbiAgaWYgKHByZWZpeE1hdGNoID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgcmV0dXJuIGhlYWRlci5zbGljZSgwLCBwcmVmaXhNYXRjaCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgY29udGVudCBsaW5lIGNvbnRhaW5zIG5vbi1lbXB0eSBleGFtcGxlIHRleHQuXG4gKiBAcGFyYW0gbGluZSBMaW5lIHRleHQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGxpbmUgY29udGFpbnMgY29udGVudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBvayA9IGhhc0xpbmVDb250ZW50KFwiICogY29uc3QgdmFsdWUgPSAxO1wiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBoYXNMaW5lQ29udGVudChsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUucmVwbGFjZSgvXlxccypcXCo/XFxzPy91LCBcIlwiKS50cmltKCk7XG4gIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB7XG4gIGdldEZlbmNlTGFuZ3VhZ2UsXG4gIGdldElubGluZUNvbnRlbnQsXG4gIGdldExpbmVNZXRhLFxuICBnZXRQcmVmaXgsXG4gIGhhc0xpbmVDb250ZW50LFxufTtcbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Example, Problem } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Builds an Example from a regex match and raw comment value.
|
|
4
|
+
* @param match Regex match from the example pattern.
|
|
5
|
+
* @param commentValue Raw comment value.
|
|
6
|
+
* @returns Example metadata extracted from the match.
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const example = buildExampleFromMatch(match, commentValue);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
declare function buildExampleFromMatch(match: RegExpMatchArray, commentValue: string): Example;
|
|
13
|
+
/**
|
|
14
|
+
* Checks example content for required fences and language.
|
|
15
|
+
* @param content Example content to inspect.
|
|
16
|
+
* @returns Problem identifier when the content is invalid.
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const problem = checkExampleContent("```typescript\nconst ok = true;\n```");
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare function checkExampleContent(content: string): Problem | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Extracts all `@example` entries from a JSDoc comment value.
|
|
25
|
+
* Uses a multiline regex to capture the header and following lines
|
|
26
|
+
* until the next JSDoc tag or the end of the comment.
|
|
27
|
+
* @param commentValue Raw comment value.
|
|
28
|
+
* @returns Extracted examples.
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const examples = getExamples("* @example\n* ```typescript\n* ok\n* ```");
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
declare function getExamples(commentValue: string): Example[];
|
|
35
|
+
export { buildExampleFromMatch, checkExampleContent, getExamples };
|
|
36
|
+
//# sourceMappingURL=examples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../../../src/docs/require-example-language/examples.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA6KhD;;;;;;;;;GASG;AACH,iBAAS,qBAAqB,CAC5B,KAAK,EAAE,gBAAgB,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAqBT;AAED;;;;;;;;GAQG;AACH,iBAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAoBjE;AAED;;;;;;;;;;GAUG;AACH,iBAAS,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,EAAE,CAQpD;AAED,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { getFenceLanguage, getInlineContent, getLineMeta, getPrefix, hasLineContent, } from "./example-utilities";
|
|
2
|
+
/** Captures `@example` headers and bodies for analysis. */
|
|
3
|
+
const examplePattern = /^(?<header>\s*\*?\s*@example\b[^\n]*)(?<body>[\s\S]*?)(?=^\s*\*?\s*@\w+|(?![\s\S]))/gmu;
|
|
4
|
+
/**
|
|
5
|
+
* Updates fence state based on the detected language.
|
|
6
|
+
* @param state Current fence tracking state.
|
|
7
|
+
* @param language Fence language string.
|
|
8
|
+
* @returns Updated fence tracking state.
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const next = updateFenceState(state, "typescript");
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
const updateFenceState = (state, language) => {
|
|
15
|
+
if (!state.inFence) {
|
|
16
|
+
if (language.length === 0) {
|
|
17
|
+
return { ...state, missingLanguage: true, sawFence: true };
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
...state,
|
|
21
|
+
currentFenceHasContent: false,
|
|
22
|
+
inFence: true,
|
|
23
|
+
missingLanguage: false,
|
|
24
|
+
sawFence: true,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
...state,
|
|
29
|
+
currentFenceHasContent: false,
|
|
30
|
+
hasEmptyFence: state.hasEmptyFence || !state.currentFenceHasContent,
|
|
31
|
+
inFence: false,
|
|
32
|
+
missingLanguage: false,
|
|
33
|
+
sawFence: true,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Updates fence tracking for a single example line.
|
|
38
|
+
* @param state Current fence tracking state.
|
|
39
|
+
* @param line Example line to inspect.
|
|
40
|
+
* @returns Updated fence tracking state.
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const next = updateFenceStateForLine(state, " * ok");
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
const updateFenceStateForLine = (state, line) => {
|
|
47
|
+
const language = getFenceLanguage(line);
|
|
48
|
+
if (language !== void 0) {
|
|
49
|
+
return updateFenceState(state, language);
|
|
50
|
+
}
|
|
51
|
+
if (state.inFence && hasLineContent(line)) {
|
|
52
|
+
return { ...state, currentFenceHasContent: true };
|
|
53
|
+
}
|
|
54
|
+
return state;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Analyzes fenced code blocks for missing language identifiers.
|
|
58
|
+
* @param content Example content to analyze.
|
|
59
|
+
* @returns Fence analysis results.
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* const analysis = analyzeFenceContent("```typescript\nconst value = 1;\n```");
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
function analyzeFenceContent(content) {
|
|
66
|
+
const lines = content.split(/\r?\n/u);
|
|
67
|
+
let state = {
|
|
68
|
+
currentFenceHasContent: false,
|
|
69
|
+
hasEmptyFence: false,
|
|
70
|
+
inFence: false,
|
|
71
|
+
missingLanguage: false,
|
|
72
|
+
sawFence: false,
|
|
73
|
+
};
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
state = updateFenceStateForLine(state, line);
|
|
76
|
+
if (state.missingLanguage) {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (state.inFence && !state.currentFenceHasContent) {
|
|
81
|
+
state = { ...state, hasEmptyFence: true };
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
hasEmptyFence: state.hasEmptyFence,
|
|
85
|
+
missingLanguage: state.missingLanguage,
|
|
86
|
+
sawFence: state.sawFence,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Builds example content from an inline header and body lines.
|
|
91
|
+
* @param context Example header and body lines.
|
|
92
|
+
* @returns Combined example content.
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const content = buildExampleContent({ body: "* ok", header: "* @example" });
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
function buildExampleContent(context) {
|
|
99
|
+
const { body, header } = context;
|
|
100
|
+
const inlineContent = getInlineContent(header);
|
|
101
|
+
if (inlineContent.length > 0) {
|
|
102
|
+
return `${inlineContent}\n${body}`;
|
|
103
|
+
}
|
|
104
|
+
return body;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Builds an Example from a regex match and raw comment value.
|
|
108
|
+
* @param match Regex match from the example pattern.
|
|
109
|
+
* @param commentValue Raw comment value.
|
|
110
|
+
* @returns Example metadata extracted from the match.
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* const example = buildExampleFromMatch(match, commentValue);
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
function buildExampleFromMatch(match, commentValue) {
|
|
117
|
+
const [full] = match;
|
|
118
|
+
const header = match.groups?.["header"] ?? "";
|
|
119
|
+
const body = match.groups?.["body"] ?? "";
|
|
120
|
+
const startOffset = match.index ?? 0;
|
|
121
|
+
const content = buildExampleContent({ body, header });
|
|
122
|
+
const prefix = getPrefix(header);
|
|
123
|
+
const { endIndex, endOffset, lineIndex } = getLineMeta({
|
|
124
|
+
commentValue,
|
|
125
|
+
full,
|
|
126
|
+
startOffset,
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
content: content.trim(),
|
|
130
|
+
endIndex,
|
|
131
|
+
endOffset,
|
|
132
|
+
lineIndex,
|
|
133
|
+
prefix,
|
|
134
|
+
startOffset,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Checks example content for required fences and language.
|
|
139
|
+
* @param content Example content to inspect.
|
|
140
|
+
* @returns Problem identifier when the content is invalid.
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* const problem = checkExampleContent("```typescript\nconst ok = true;\n```");
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
function checkExampleContent(content) {
|
|
147
|
+
if (content.trim().length === 0) {
|
|
148
|
+
return "emptyExample";
|
|
149
|
+
}
|
|
150
|
+
const { hasEmptyFence, missingLanguage, sawFence } = analyzeFenceContent(content);
|
|
151
|
+
if (missingLanguage) {
|
|
152
|
+
return "missingLanguage";
|
|
153
|
+
}
|
|
154
|
+
if (sawFence && hasEmptyFence) {
|
|
155
|
+
return "emptyExample";
|
|
156
|
+
}
|
|
157
|
+
if (!sawFence) {
|
|
158
|
+
return "missingFence";
|
|
159
|
+
}
|
|
160
|
+
return void 0;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Extracts all `@example` entries from a JSDoc comment value.
|
|
164
|
+
* Uses a multiline regex to capture the header and following lines
|
|
165
|
+
* until the next JSDoc tag or the end of the comment.
|
|
166
|
+
* @param commentValue Raw comment value.
|
|
167
|
+
* @returns Extracted examples.
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* const examples = getExamples("* @example\n* ```typescript\n* ok\n* ```");
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
function getExamples(commentValue) {
|
|
174
|
+
const examples = [];
|
|
175
|
+
for (const match of commentValue.matchAll(examplePattern)) {
|
|
176
|
+
examples.push(buildExampleFromMatch(match, commentValue));
|
|
177
|
+
}
|
|
178
|
+
return examples;
|
|
179
|
+
}
|
|
180
|
+
export { buildExampleFromMatch, checkExampleContent, getExamples };
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jcy9yZXF1aXJlLWV4YW1wbGUtbGFuZ3VhZ2UvZXhhbXBsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLFNBQVMsRUFDVCxjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QiwyREFBMkQ7QUFDM0QsTUFBTSxjQUFjLEdBQ2xCLHdGQUF3RixDQUFDO0FBb0IzRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBaUIsRUFBRSxRQUFnQixFQUFjLEVBQUU7SUFDM0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzdELENBQUM7UUFFRCxPQUFPO1lBQ0wsR0FBRyxLQUFLO1lBQ1Isc0JBQXNCLEVBQUUsS0FBSztZQUM3QixPQUFPLEVBQUUsSUFBSTtZQUNiLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxLQUFLO1FBQ1Isc0JBQXNCLEVBQUUsS0FBSztRQUM3QixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7UUFDbkUsT0FBTyxFQUFFLEtBQUs7UUFDZCxlQUFlLEVBQUUsS0FBSztRQUN0QixRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLENBQzlCLEtBQWlCLEVB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XCI7XG5cbmltcG9ydCB7XG4gIGdldEZlbmNlTGFuZ3VhZ2UsXG4gIGdldElubGluZUNvbnRlbnQsXG4gIGdldExpbmVNZXRhLFxuICBnZXRQcmVmaXgsXG4gIGhhc0xpbmVDb250ZW50LFxufSBmcm9tIFwiLi9leGFtcGxlLXV0aWxpdGllc1wiO1xuXG4vKiogQ2FwdHVyZXMgYEBleGFtcGxlYCBoZWFkZXJzIGFuZCBib2RpZXMgZm9yIGFuYWx5c2lzLiAqL1xuY29uc3QgZXhhbXBsZVBhdHRlcm4gPVxuICAvXig/PGhlYWRlcj5cXHMqXFwqP1xccypAZXhhbXBsZVxcYlteXFxuXSopKD88Ym9keT5bXFxzXFxTXSo/KSg/PV5cXHMqXFwqP1xccypAXFx3K3woPyFbXFxzXFxTXSkpL2dtdTtcblxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xuaW50ZXJmYWNlIEZlbmNlU3RhdGUge1xuICAvKiogQ3VycmVudEZlbmNlSGFzQ29udGVudCBmaWVsZCB2YWx1ZS4gKi9cbiAgY3VycmVudEZlbmNlSGFzQ29udGVudDogYm9vbGVhbjtcblxuICAvKiogSGFzRW1wdHlGZW5jZSBmaWVsZCB2YWx1ZS4gKi9cbiAgaGFzRW1wdHlGZW5jZTogYm9vbGVhbjtcblxuICAvKiogSW5GZW5jZSBmaWVsZCB2YWx1ZS4gKi9cbiAgaW5GZW5jZTogYm9vbGVhbjtcblxuICAvKiogTWlzc2luZ0xhbmd1YWdlIGZpZWxkIHZhbHVlLiAqL1xuICBtaXNzaW5nTGFuZ3VhZ2U6IGJvb2xlYW47XG5cbiAgLyoqIFNhd0ZlbmNlIGZpZWxkIHZhbHVlLiAqL1xuICBzYXdGZW5jZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGZlbmNlIHN0YXRlIGJhc2VkIG9uIHRoZSBkZXRlY3RlZCBsYW5ndWFnZS5cbiAqIEBwYXJhbSBzdGF0ZSBDdXJyZW50IGZlbmNlIHRyYWNraW5nIHN0YXRlLlxuICogQHBhcmFtIGxhbmd1YWdlIEZlbmNlIGxhbmd1YWdlIHN0cmluZy5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgZmVuY2UgdHJhY2tpbmcgc3RhdGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmV4dCA9IHVwZGF0ZUZlbmNlU3RhdGUoc3RhdGUsIFwidHlwZXNjcmlwdFwiKTtcbiAqIGBgYFxuICovXG5jb25zdCB1cGRhdGVGZW5jZVN0YXRlID0gKHN0YXRlOiBGZW5jZVN0YXRlLCBsYW5ndWFnZTogc3RyaW5nKTogRmVuY2VTdGF0ZSA9PiB7XG4gIGlmICghc3RhdGUuaW5GZW5jZSkge1xuICAgIGlmIChsYW5ndWFnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBtaXNzaW5nTGFuZ3VhZ2U6IHRydWUsIHNhd0ZlbmNlOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgY3VycmVudEZlbmNlSGFzQ29udGVudDogZmFsc2UsXG4gICAgICBpbkZlbmNlOiB0cnVlLFxuICAgICAgbWlzc2luZ0xhbmd1YWdlOiBmYWxzZSxcbiAgICAgIHNhd0ZlbmNlOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGN1cnJlbnRGZW5jZUhhc0NvbnRlbnQ6IGZhbHNlLFxuICAgIGhhc0VtcHR5RmVuY2U6IHN0YXRlLmhhc0VtcHR5RmVuY2UgfHwgIXN0YXRlLmN1cnJlbnRGZW5jZUhhc0NvbnRlbnQsXG4gICAgaW5GZW5jZTogZmFsc2UsXG4gICAgbWlzc2luZ0xhbmd1YWdlOiBmYWxzZSxcbiAgICBzYXdGZW5jZTogdHJ1ZSxcbiAgfTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyBmZW5jZSB0cmFja2luZyBmb3IgYSBzaW5nbGUgZXhhbXBsZSBsaW5lLlxuICogQHBhcmFtIHN0YXRlIEN1cnJlbnQgZmVuY2UgdHJhY2tpbmcgc3RhdGUuXG4gKiBAcGFyYW0gbGluZSBFeGFtcGxlIGxpbmUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgZmVuY2UgdHJhY2tpbmcgc3RhdGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmV4dCA9IHVwZGF0ZUZlbmNlU3RhdGVGb3JMaW5lKHN0YXRlLCBcIiAqIG9rXCIpO1xuICogYGBgXG4gKi9cbmNvbnN0IHVwZGF0ZUZlbmNlU3RhdGVGb3JMaW5lID0gKFxuICBzdGF0ZTogRmVuY2VTdGF0ZSxcbiAgbGluZTogc3RyaW5nLFxuKTogRmVuY2VTdGF0ZSA9PiB7XG4gIGNvbnN0IGxhbmd1YWdlID0gZ2V0RmVuY2VMYW5ndWFnZShsaW5lKTtcblxuICBpZiAobGFuZ3VhZ2UgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiB1cGRhdGVGZW5jZVN0YXRlKHN0YXRlLCBsYW5ndWFnZSk7XG4gIH1cblxuICBpZiAoc3RhdGUuaW5GZW5jZSAmJiBoYXNMaW5lQ29udGVudChsaW5lKSkge1xuICAgIHJldHVybiB7IC4uLnN0YXRlLCBjdXJyZW50RmVuY2VIYXNDb250ZW50OiB0cnVlIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG4vKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgRXhhbXBsZUNvbnRlbnRDb250ZXh0IHtcbiAgLyoqIEJvZHkgZmllbGQgdmFsdWUuICovXG4gIGJvZHk6IHN0cmluZztcblxuICAvKiogSGVhZGVyIGZpZWxkIHZhbHVlLiAqL1xuICBoZWFkZXI6IHN0cmluZztcbn1cblxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xuaW50ZXJmYWNlIEZlbmNlQW5hbHlzaXMge1xuICAvKiogSGFzRW1wdHlGZW5jZSBmaWVsZCB2YWx1ZS4gKi9cbiAgaGFzRW1wdHlGZW5jZTogYm9vbGVhbjtcblxuICAvKiogTWlzc2luZ0xhbmd1YWdlIGZpZWxkIHZhbHVlLiAqL1xuICBtaXNzaW5nTGFuZ3VhZ2U6IGJvb2xlYW47XG5cbiAgLyoqIFNhd0ZlbmNlIGZpZWxkIHZhbHVlLiAqL1xuICBzYXdGZW5jZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbmFseXplcyBmZW5jZWQgY29kZSBibG9ja3MgZm9yIG1pc3NpbmcgbGFuZ3VhZ2UgaWRlbnRpZmllcnMuXG4gKiBAcGFyYW0gY29udGVudCBFeGFtcGxlIGNvbnRlbnQgdG8gYW5hbHl6ZS5cbiAqIEByZXR1cm5zIEZlbmNlIGFuYWx5c2lzIHJlc3VsdHMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYW5hbHlzaXMgPSBhbmFseXplRmVuY2VDb250ZW50KFwiYGBgdHlwZXNjcmlwdFxcbmNvbnN0IHZhbHVlID0gMTtcXG5gYGBcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYW5hbHl6ZUZlbmNlQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBGZW5jZUFuYWx5c2lzIHtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuL3UpO1xuICBsZXQgc3RhdGU6IEZlbmNlU3RhdGUgPSB7XG4gICAgY3VycmVudEZlbmNlSGFzQ29udGVudDogZmFsc2UsXG4gICAgaGFzRW1wdHlGZW5jZTogZmFsc2UsXG4gICAgaW5GZW5jZTogZmFsc2UsXG4gICAgbWlzc2luZ0xhbmd1YWdlOiBmYWxzZSxcbiAgICBzYXdGZW5jZTogZmFsc2UsXG4gIH07XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVGZW5jZVN0YXRlRm9yTGluZShzdGF0ZSwgbGluZSk7XG5cbiAgICBpZiAoc3RhdGUubWlzc2luZ0xhbmd1YWdlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUuaW5GZW5jZSAmJiAhc3RhdGUuY3VycmVudEZlbmNlSGFzQ29udGVudCkge1xuICAgIHN0YXRlID0geyAuLi5zdGF0ZSwgaGFzRW1wdHlGZW5jZTogdHJ1ZSB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNFbXB0eUZlbmNlOiBzdGF0ZS5oYXNFbXB0eUZlbmNlLFxuICAgIG1pc3NpbmdMYW5ndWFnZTogc3RhdGUubWlzc2luZ0xhbmd1YWdlLFxuICAgIHNhd0ZlbmNlOiBzdGF0ZS5zYXdGZW5jZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgZXhhbXBsZSBjb250ZW50IGZyb20gYW4gaW5saW5lIGhlYWRlciBhbmQgYm9keSBsaW5lcy5cbiAqIEBwYXJhbSBjb250ZXh0IEV4YW1wbGUgaGVhZGVyIGFuZCBib2R5IGxpbmVzLlxuICogQHJldHVybnMgQ29tYmluZWQgZXhhbXBsZSBjb250ZW50LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbnRlbnQgPSBidWlsZEV4YW1wbGVDb250ZW50KHsgYm9keTogXCIqIG9rXCIsIGhlYWRlcjogXCIqIEBleGFtcGxlXCIgfSk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYnVpbGRFeGFtcGxlQ29udGVudChjb250ZXh0OiBFeGFtcGxlQ29udGVudENvbnRleHQpOiBzdHJpbmcge1xuICBjb25zdCB7IGJvZHksIGhlYWRlciB9ID0gY29udGV4dDtcbiAgY29uc3QgaW5saW5lQ29udGVudCA9IGdldElubGluZUNvbnRlbnQoaGVhZGVyKTtcblxuICBpZiAoaW5saW5lQ29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAke2lubGluZUNvbnRlbnR9XFxuJHtib2R5fWA7XG4gIH1cblxuICByZXR1cm4gYm9keTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gRXhhbXBsZSBmcm9tIGEgcmVnZXggbWF0Y2ggYW5kIHJhdyBjb21tZW50IHZhbHVlLlxuICogQHBhcmFtIG1hdGNoIFJlZ2V4IG1hdGNoIGZyb20gdGhlIGV4YW1wbGUgcGF0dGVybi5cbiAqIEBwYXJhbSBjb21tZW50VmFsdWUgUmF3IGNvbW1lbnQgdmFsdWUuXG4gKiBAcmV0dXJucyBFeGFtcGxlIG1ldGFkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBtYXRjaC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleGFtcGxlID0gYnVpbGRFeGFtcGxlRnJvbU1hdGNoKG1hdGNoLCBjb21tZW50VmFsdWUpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRXhhbXBsZUZyb21NYXRjaChcbiAgbWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXksXG4gIGNvbW1lbnRWYWx1ZTogc3RyaW5nLFxuKTogRXhhbXBsZSB7XG4gIGNvbnN0IFtmdWxsXSA9IG1hdGNoO1xuICBjb25zdCBoZWFkZXIgPSBtYXRjaC5ncm91cHM/LltcImhlYWRlclwiXSA/PyBcIlwiO1xuICBjb25zdCBib2R5ID0gbWF0Y2guZ3JvdXBzPy5bXCJib2R5XCJdID8/IFwiXCI7XG4gIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gbWF0Y2guaW5kZXggPz8gMDtcbiAgY29uc3QgY29udGVudCA9IGJ1aWxkRXhhbXBsZUNvbnRlbnQoeyBib2R5LCBoZWFkZXIgfSk7XG4gIGNvbnN0IHByZWZpeCA9IGdldFByZWZpeChoZWFkZXIpO1xuICBjb25zdCB7IGVuZEluZGV4LCBlbmRPZmZzZXQsIGxpbmVJbmRleCB9ID0gZ2V0TGluZU1ldGEoe1xuICAgIGNvbW1lbnRWYWx1ZSxcbiAgICBmdWxsLFxuICAgIHN0YXJ0T2Zmc2V0LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnQudHJpbSgpLFxuICAgIGVuZEluZGV4LFxuICAgIGVuZE9mZnNldCxcbiAgICBsaW5lSW5kZXgsXG4gICAgcHJlZml4LFxuICAgIHN0YXJ0T2Zmc2V0LFxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyBleGFtcGxlIGNvbnRlbnQgZm9yIHJlcXVpcmVkIGZlbmNlcyBhbmQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0gY29udGVudCBFeGFtcGxlIGNvbnRlbnQgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFByb2JsZW0gaWRlbnRpZmllciB3aGVuIHRoZSBjb250ZW50IGlzIGludmFsaWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcHJvYmxlbSA9IGNoZWNrRXhhbXBsZUNvbnRlbnQoXCJgYGB0eXBlc2NyaXB0XFxuY29uc3Qgb2sgPSB0cnVlO1xcbmBgYFwiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBjaGVja0V4YW1wbGVDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IFByb2JsZW0gfCB1bmRlZmluZWQge1xuICBpZiAoY29udGVudC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiZW1wdHlFeGFtcGxlXCI7XG4gIH1cbiAgY29uc3QgeyBoYXNFbXB0eUZlbmNlLCBtaXNzaW5nTGFuZ3VhZ2UsIHNhd0ZlbmNlIH0gPVxuICAgIGFuYWx5emVGZW5jZUNvbnRlbnQoY29udGVudCk7XG5cbiAgaWYgKG1pc3NpbmdMYW5ndWFnZSkge1xuICAgIHJldHVybiBcIm1pc3NpbmdMYW5ndWFnZVwiO1xuICB9XG5cbiAgaWYgKHNhd0ZlbmNlICYmIGhhc0VtcHR5RmVuY2UpIHtcbiAgICByZXR1cm4gXCJlbXB0eUV4YW1wbGVcIjtcbiAgfVxuXG4gIGlmICghc2F3RmVuY2UpIHtcbiAgICByZXR1cm4gXCJtaXNzaW5nRmVuY2VcIjtcbiAgfVxuXG4gIHJldHVybiB2b2lkIDA7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYWxsIGBAZXhhbXBsZWAgZW50cmllcyBmcm9tIGEgSlNEb2MgY29tbWVudCB2YWx1ZS5cbiAqIFVzZXMgYSBtdWx0aWxpbmUgcmVnZXggdG8gY2FwdHVyZSB0aGUgaGVhZGVyIGFuZCBmb2xsb3dpbmcgbGluZXNcbiAqIHVudGlsIHRoZSBuZXh0IEpTRG9jIHRhZyBvciB0aGUgZW5kIG9mIHRoZSBjb21tZW50LlxuICogQHBhcmFtIGNvbW1lbnRWYWx1ZSBSYXcgY29tbWVudCB2YWx1ZS5cbiAqIEByZXR1cm5zIEV4dHJhY3RlZCBleGFtcGxlcy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleGFtcGxlcyA9IGdldEV4YW1wbGVzKFwiKiBAZXhhbXBsZVxcbiogYGBgdHlwZXNjcmlwdFxcbiogb2tcXG4qIGBgYFwiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRFeGFtcGxlcyhjb21tZW50VmFsdWU6IHN0cmluZyk6IEV4YW1wbGVbXSB7XG4gIGNvbnN0IGV4YW1wbGVzOiBFeGFtcGxlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvbW1lbnRWYWx1ZS5tYXRjaEFsbChleGFtcGxlUGF0dGVybikpIHtcbiAgICBleGFtcGxlcy5wdXNoKGJ1aWxkRXhhbXBsZUZyb21NYXRjaChtYXRjaCwgY29tbWVudFZhbHVlKSk7XG4gIH1cblxuICByZXR1cm4gZXhhbXBsZXM7XG59XG5cbmV4cG9ydCB7IGJ1aWxkRXhhbXBsZUZyb21NYXRjaCwgY2hlY2tFeGFtcGxlQ29udGVudCwgZ2V0RXhhbXBsZXMgfTtcbiJdfQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Rule } from "eslint";
|
|
2
|
+
import type { Example, Problem } from "./types";
|
|
3
|
+
/** Type definition for rule data. */
|
|
4
|
+
interface FixerContext {
|
|
5
|
+
/** AbsoluteEnd field value. */
|
|
6
|
+
absoluteEnd: number;
|
|
7
|
+
/** AbsoluteStart field value. */
|
|
8
|
+
absoluteStart: number;
|
|
9
|
+
/** Example field value. */
|
|
10
|
+
example: Example;
|
|
11
|
+
/** HasOtherExamples field value. */
|
|
12
|
+
hasOtherExamples: boolean;
|
|
13
|
+
/** Problem field value. */
|
|
14
|
+
problem: Problem;
|
|
15
|
+
/** SourceText field value. */
|
|
16
|
+
sourceText: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Builds a full example with a fenced block when missing entirely.
|
|
20
|
+
* @param example Example metadata.
|
|
21
|
+
* @returns Example text with a fenced block.
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const text = buildMissingFenceFix(example);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
declare function buildMissingFenceFix(example: Example): string;
|
|
28
|
+
/**
|
|
29
|
+
* Adds missing languages to existing fenced blocks.
|
|
30
|
+
* @param original Original comment text.
|
|
31
|
+
* @returns Updated comment text when changes are made.
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const updated = buildMissingLanguageFix("* ```\n* ok\n* ```");
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
declare function buildMissingLanguageFix(original: string): string | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Builds a fixer function for the report.
|
|
40
|
+
* @param context Fixer context details.
|
|
41
|
+
* @returns Fixer function for ESLint.
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const fixer = createFixer(context);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
declare function createFixer(context: FixerContext): (fixer: Rule.RuleFixer) => null | Rule.Fix;
|
|
48
|
+
export { buildMissingFenceFix, buildMissingLanguageFix, createFixer };
|
|
49
|
+
//# sourceMappingURL=fixes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixes.d.ts","sourceRoot":"","sources":["../../../src/docs/require-example-language/fixes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA8BhD,qCAAqC;AACrC,UAAU,YAAY;IACpB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AA2CD;;;;;;;;GAQG;AACH,iBAAS,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAgBtD;AAED;;;;;;;;GAQG;AACH,iBAAS,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBrE;AAED;;;;;;;;GAQG;AACH,iBAAS,WAAW,CAClB,OAAO,EAAE,YAAY,GACpB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC,GAAG,CAY5C;AAwHD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,WAAW,EAAE,CAAC"}
|