@redocly/recheck 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1006 -56
- package/dist/cli.js +27 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/markdoc-schema.d.ts +17 -0
- package/dist/commands/markdoc-schema.d.ts.map +1 -0
- package/dist/commands/markdoc-schema.js +127 -0
- package/dist/commands/markdoc-schema.js.map +1 -0
- package/dist/commands/run.d.ts +0 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +68 -5
- package/dist/commands/run.js.map +1 -1
- package/dist/config/load.d.ts +11 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +12 -2
- package/dist/config/load.js.map +1 -1
- package/dist/config/presets/google.d.ts +3 -0
- package/dist/config/presets/google.d.ts.map +1 -0
- package/dist/config/presets/google.js +1671 -0
- package/dist/config/presets/google.js.map +1 -0
- package/dist/config/presets/inclusive-language.d.ts +3 -0
- package/dist/config/presets/inclusive-language.d.ts.map +1 -0
- package/dist/config/presets/inclusive-language.js +321 -0
- package/dist/config/presets/inclusive-language.js.map +1 -0
- package/dist/config/presets/index.d.ts +67 -0
- package/dist/config/presets/index.d.ts.map +1 -0
- package/dist/config/presets/index.js +137 -0
- package/dist/config/presets/index.js.map +1 -0
- package/dist/config/presets/markdoc.d.ts +21 -0
- package/dist/config/presets/markdoc.d.ts.map +1 -0
- package/dist/config/presets/markdoc.js +101 -0
- package/dist/config/presets/markdoc.js.map +1 -0
- package/dist/config/presets/markdown-relaxed.d.ts +3 -0
- package/dist/config/presets/markdown-relaxed.d.ts.map +1 -0
- package/dist/config/presets/markdown-relaxed.js +98 -0
- package/dist/config/presets/markdown-relaxed.js.map +1 -0
- package/dist/config/presets/markdown.d.ts +43 -0
- package/dist/config/presets/markdown.d.ts.map +1 -0
- package/dist/config/presets/markdown.js +132 -0
- package/dist/config/presets/markdown.js.map +1 -0
- package/dist/config/presets/microsoft.d.ts +3 -0
- package/dist/config/presets/microsoft.d.ts.map +1 -0
- package/dist/config/presets/microsoft.js +2268 -0
- package/dist/config/presets/microsoft.js.map +1 -0
- package/dist/config/presets/minimal.d.ts +3 -0
- package/dist/config/presets/minimal.d.ts.map +1 -0
- package/dist/config/presets/minimal.js +21 -0
- package/dist/config/presets/minimal.js.map +1 -0
- package/dist/config/presets/plain-language.d.ts +3 -0
- package/dist/config/presets/plain-language.d.ts.map +1 -0
- package/dist/config/presets/plain-language.js +351 -0
- package/dist/config/presets/plain-language.js.map +1 -0
- package/dist/config/presets/prose.d.ts +52 -0
- package/dist/config/presets/prose.d.ts.map +1 -0
- package/dist/config/presets/prose.js +138 -0
- package/dist/config/presets/prose.js.map +1 -0
- package/dist/config/schema.d.ts +128 -22
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +105 -21
- package/dist/config/schema.js.map +1 -1
- package/dist/config/validate.d.ts +12 -2
- package/dist/config/validate.d.ts.map +1 -1
- package/dist/config/validate.js +1200 -44
- package/dist/config/validate.js.map +1 -1
- package/dist/core/auto-fix.d.ts +8 -13
- package/dist/core/auto-fix.d.ts.map +1 -1
- package/dist/core/auto-fix.js +94 -75
- package/dist/core/auto-fix.js.map +1 -1
- package/dist/core/case-preserve.d.ts +46 -0
- package/dist/core/case-preserve.d.ts.map +1 -0
- package/dist/core/case-preserve.js +57 -0
- package/dist/core/case-preserve.js.map +1 -0
- package/dist/core/directives.d.ts +9 -0
- package/dist/core/directives.d.ts.map +1 -0
- package/dist/core/directives.js +73 -0
- package/dist/core/directives.js.map +1 -0
- package/dist/core/files.d.ts +63 -0
- package/dist/core/files.d.ts.map +1 -1
- package/dist/core/files.js +185 -0
- package/dist/core/files.js.map +1 -1
- package/dist/core/inline-code.d.ts +87 -0
- package/dist/core/inline-code.d.ts.map +1 -0
- package/dist/core/inline-code.js +104 -0
- package/dist/core/inline-code.js.map +1 -0
- package/dist/core/line-endings.d.ts +32 -0
- package/dist/core/line-endings.d.ts.map +1 -0
- package/dist/core/line-endings.js +65 -0
- package/dist/core/line-endings.js.map +1 -0
- package/dist/core/markdoc-tags.d.ts +79 -0
- package/dist/core/markdoc-tags.d.ts.map +1 -0
- package/dist/core/markdoc-tags.js +131 -0
- package/dist/core/markdoc-tags.js.map +1 -0
- package/dist/core/runner.d.ts +92 -3
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +348 -110
- package/dist/core/runner.js.map +1 -1
- package/dist/core/timing.d.ts.map +1 -1
- package/dist/data/markdoc-realm-schema.d.ts +3 -0
- package/dist/data/markdoc-realm-schema.d.ts.map +1 -0
- package/dist/data/markdoc-realm-schema.js +760 -0
- package/dist/data/markdoc-realm-schema.js.map +1 -0
- package/dist/data/proper-nouns.d.ts +2 -0
- package/dist/data/proper-nouns.d.ts.map +1 -0
- package/dist/data/proper-nouns.js +208 -0
- package/dist/data/proper-nouns.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/formulas.d.ts +17 -0
- package/dist/metrics/formulas.d.ts.map +1 -0
- package/dist/metrics/formulas.js +70 -0
- package/dist/metrics/formulas.js.map +1 -0
- package/dist/metrics/index.d.ts +5 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/statistics.d.ts +27 -0
- package/dist/metrics/statistics.d.ts.map +1 -0
- package/dist/metrics/statistics.js +56 -0
- package/dist/metrics/statistics.js.map +1 -0
- package/dist/parser/index.d.ts +18 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +168 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/markdoc/extract-statics.d.ts +45 -0
- package/dist/parser/markdoc/extract-statics.d.ts.map +1 -0
- package/dist/parser/markdoc/extract-statics.js +139 -0
- package/dist/parser/markdoc/extract-statics.js.map +1 -0
- package/dist/parser/markdoc/pairing.d.ts +63 -0
- package/dist/parser/markdoc/pairing.d.ts.map +1 -0
- package/dist/parser/markdoc/pairing.js +94 -0
- package/dist/parser/markdoc/pairing.js.map +1 -0
- package/dist/parser/markdoc/schema.d.ts +85 -0
- package/dist/parser/markdoc/schema.d.ts.map +1 -0
- package/dist/parser/markdoc/schema.js +86 -0
- package/dist/parser/markdoc/schema.js.map +1 -0
- package/dist/parser/markdoc/span.d.ts +64 -0
- package/dist/parser/markdoc/span.d.ts.map +1 -0
- package/dist/parser/markdoc/span.js +729 -0
- package/dist/parser/markdoc/span.js.map +1 -0
- package/dist/parser/markdoc/structure.d.ts +28 -0
- package/dist/parser/markdoc/structure.d.ts.map +1 -0
- package/dist/parser/markdoc/structure.js +153 -0
- package/dist/parser/markdoc/structure.js.map +1 -0
- package/dist/parser/markdoc/syntax.d.ts +44 -0
- package/dist/parser/markdoc/syntax.d.ts.map +1 -0
- package/dist/parser/markdoc/syntax.js +317 -0
- package/dist/parser/markdoc/syntax.js.map +1 -0
- package/dist/parser/types.d.ts +18 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/reporter/fixes.d.ts.map +1 -1
- package/dist/reporter/fixes.js +22 -1
- package/dist/reporter/fixes.js.map +1 -1
- package/dist/reporter/statistics.d.ts +1 -8
- package/dist/reporter/statistics.d.ts.map +1 -1
- package/dist/reporter/statistics.js.map +1 -1
- package/dist/rules/registry.d.ts +15 -0
- package/dist/rules/registry.d.ts.map +1 -0
- package/dist/rules/registry.js +81 -0
- package/dist/rules/registry.js.map +1 -0
- package/dist/rules/scope/capitalization.d.ts +3 -0
- package/dist/rules/scope/capitalization.d.ts.map +1 -0
- package/dist/rules/scope/capitalization.js +161 -0
- package/dist/rules/scope/capitalization.js.map +1 -0
- package/dist/rules/scope/conditional.d.ts +3 -0
- package/dist/rules/scope/conditional.d.ts.map +1 -0
- package/dist/rules/scope/conditional.js +112 -0
- package/dist/rules/scope/conditional.js.map +1 -0
- package/dist/rules/scope/consistency.d.ts +3 -0
- package/dist/rules/scope/consistency.d.ts.map +1 -0
- package/dist/rules/scope/consistency.js +178 -0
- package/dist/rules/scope/consistency.js.map +1 -0
- package/dist/rules/scope/length.d.ts +3 -0
- package/dist/rules/scope/length.d.ts.map +1 -0
- package/dist/rules/scope/length.js +69 -0
- package/dist/rules/scope/length.js.map +1 -0
- package/dist/rules/scope/max-image-size.d.ts +3 -0
- package/dist/rules/scope/max-image-size.d.ts.map +1 -0
- package/dist/rules/scope/max-image-size.js +65 -0
- package/dist/rules/scope/max-image-size.js.map +1 -0
- package/dist/rules/scope/metric.d.ts +17 -0
- package/dist/rules/scope/metric.d.ts.map +1 -0
- package/dist/rules/scope/metric.js +216 -0
- package/dist/rules/scope/metric.js.map +1 -0
- package/dist/rules/scope/occurrence.d.ts +3 -0
- package/dist/rules/scope/occurrence.d.ts.map +1 -0
- package/dist/rules/scope/occurrence.js +48 -0
- package/dist/rules/scope/occurrence.js.map +1 -0
- package/dist/rules/scope/pattern.d.ts +3 -0
- package/dist/rules/scope/pattern.d.ts.map +1 -0
- package/dist/rules/scope/pattern.js +75 -0
- package/dist/rules/scope/pattern.js.map +1 -0
- package/dist/rules/scope/repetition.d.ts +3 -0
- package/dist/rules/scope/repetition.d.ts.map +1 -0
- package/dist/rules/scope/repetition.js +139 -0
- package/dist/rules/scope/repetition.js.map +1 -0
- package/dist/rules/scope/semantic-line-breaks.d.ts +3 -0
- package/dist/rules/scope/semantic-line-breaks.d.ts.map +1 -0
- package/dist/rules/scope/semantic-line-breaks.js +213 -0
- package/dist/rules/scope/semantic-line-breaks.js.map +1 -0
- package/dist/rules/scope/spelling.d.ts +27 -0
- package/dist/rules/scope/spelling.d.ts.map +1 -0
- package/dist/rules/scope/spelling.js +227 -0
- package/dist/rules/scope/spelling.js.map +1 -0
- package/dist/rules/scope/swap.d.ts +3 -0
- package/dist/rules/scope/swap.d.ts.map +1 -0
- package/dist/rules/scope/swap.js +149 -0
- package/dist/rules/scope/swap.js.map +1 -0
- package/dist/rules/scope/title-case.d.ts +42 -0
- package/dist/rules/scope/title-case.d.ts.map +1 -0
- package/dist/rules/scope/title-case.js +264 -0
- package/dist/rules/scope/title-case.js.map +1 -0
- package/dist/rules/token/blanks-around-fences.d.ts +3 -0
- package/dist/rules/token/blanks-around-fences.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-fences.js +44 -0
- package/dist/rules/token/blanks-around-fences.js.map +1 -0
- package/dist/rules/token/blanks-around-headings.d.ts +3 -0
- package/dist/rules/token/blanks-around-headings.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-headings.js +108 -0
- package/dist/rules/token/blanks-around-headings.js.map +1 -0
- package/dist/rules/token/blanks-around-lists.d.ts +3 -0
- package/dist/rules/token/blanks-around-lists.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-lists.js +56 -0
- package/dist/rules/token/blanks-around-lists.js.map +1 -0
- package/dist/rules/token/blanks-around-tables.d.ts +3 -0
- package/dist/rules/token/blanks-around-tables.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-tables.js +42 -0
- package/dist/rules/token/blanks-around-tables.js.map +1 -0
- package/dist/rules/token/code-block-style.d.ts +3 -0
- package/dist/rules/token/code-block-style.d.ts.map +1 -0
- package/dist/rules/token/code-block-style.js +30 -0
- package/dist/rules/token/code-block-style.js.map +1 -0
- package/dist/rules/token/code-fence-style.d.ts +3 -0
- package/dist/rules/token/code-fence-style.d.ts.map +1 -0
- package/dist/rules/token/code-fence-style.js +35 -0
- package/dist/rules/token/code-fence-style.js.map +1 -0
- package/dist/rules/token/commands-show-output.d.ts +3 -0
- package/dist/rules/token/commands-show-output.d.ts.map +1 -0
- package/dist/rules/token/commands-show-output.js +38 -0
- package/dist/rules/token/commands-show-output.js.map +1 -0
- package/dist/rules/token/descriptive-link-text.d.ts +3 -0
- package/dist/rules/token/descriptive-link-text.d.ts.map +1 -0
- package/dist/rules/token/descriptive-link-text.js +53 -0
- package/dist/rules/token/descriptive-link-text.js.map +1 -0
- package/dist/rules/token/emphasis-style.d.ts +3 -0
- package/dist/rules/token/emphasis-style.d.ts.map +1 -0
- package/dist/rules/token/emphasis-style.js +51 -0
- package/dist/rules/token/emphasis-style.js.map +1 -0
- package/dist/rules/token/fenced-code-language.d.ts +3 -0
- package/dist/rules/token/fenced-code-language.d.ts.map +1 -0
- package/dist/rules/token/fenced-code-language.js +35 -0
- package/dist/rules/token/fenced-code-language.js.map +1 -0
- package/dist/rules/token/first-line-h1.d.ts +3 -0
- package/dist/rules/token/first-line-h1.d.ts.map +1 -0
- package/dist/rules/token/first-line-h1.js +107 -0
- package/dist/rules/token/first-line-h1.js.map +1 -0
- package/dist/rules/token/heading-increment.d.ts +3 -0
- package/dist/rules/token/heading-increment.d.ts.map +1 -0
- package/dist/rules/token/heading-increment.js +27 -0
- package/dist/rules/token/heading-increment.js.map +1 -0
- package/dist/rules/token/heading-start-left.d.ts +3 -0
- package/dist/rules/token/heading-start-left.d.ts.map +1 -0
- package/dist/rules/token/heading-start-left.js +31 -0
- package/dist/rules/token/heading-start-left.js.map +1 -0
- package/dist/rules/token/heading-style.d.ts +3 -0
- package/dist/rules/token/heading-style.d.ts.map +1 -0
- package/dist/rules/token/heading-style.js +41 -0
- package/dist/rules/token/heading-style.js.map +1 -0
- package/dist/rules/token/helpers.d.ts +313 -0
- package/dist/rules/token/helpers.d.ts.map +1 -0
- package/dist/rules/token/helpers.js +746 -0
- package/dist/rules/token/helpers.js.map +1 -0
- package/dist/rules/token/hr-style.d.ts +3 -0
- package/dist/rules/token/hr-style.d.ts.map +1 -0
- package/dist/rules/token/hr-style.js +28 -0
- package/dist/rules/token/hr-style.js.map +1 -0
- package/dist/rules/token/index.d.ts +75 -0
- package/dist/rules/token/index.d.ts.map +1 -0
- package/dist/rules/token/index.js +226 -0
- package/dist/rules/token/index.js.map +1 -0
- package/dist/rules/token/line-length.d.ts +3 -0
- package/dist/rules/token/line-length.d.ts.map +1 -0
- package/dist/rules/token/line-length.js +120 -0
- package/dist/rules/token/line-length.js.map +1 -0
- package/dist/rules/token/link-fragments.d.ts +3 -0
- package/dist/rules/token/link-fragments.d.ts.map +1 -0
- package/dist/rules/token/link-fragments.js +145 -0
- package/dist/rules/token/link-fragments.js.map +1 -0
- package/dist/rules/token/link-image-reference-definitions.d.ts +3 -0
- package/dist/rules/token/link-image-reference-definitions.d.ts.map +1 -0
- package/dist/rules/token/link-image-reference-definitions.js +50 -0
- package/dist/rules/token/link-image-reference-definitions.js.map +1 -0
- package/dist/rules/token/link-image-style.d.ts +3 -0
- package/dist/rules/token/link-image-style.d.ts.map +1 -0
- package/dist/rules/token/link-image-style.js +131 -0
- package/dist/rules/token/link-image-style.js.map +1 -0
- package/dist/rules/token/list-indent.d.ts +3 -0
- package/dist/rules/token/list-indent.d.ts.map +1 -0
- package/dist/rules/token/list-indent.js +60 -0
- package/dist/rules/token/list-indent.js.map +1 -0
- package/dist/rules/token/list-length.d.ts +3 -0
- package/dist/rules/token/list-length.d.ts.map +1 -0
- package/dist/rules/token/list-length.js +55 -0
- package/dist/rules/token/list-length.js.map +1 -0
- package/dist/rules/token/list-marker-space.d.ts +3 -0
- package/dist/rules/token/list-marker-space.d.ts.map +1 -0
- package/dist/rules/token/list-marker-space.js +52 -0
- package/dist/rules/token/list-marker-space.js.map +1 -0
- package/dist/rules/token/markdoc-attributes.d.ts +3 -0
- package/dist/rules/token/markdoc-attributes.d.ts.map +1 -0
- package/dist/rules/token/markdoc-attributes.js +269 -0
- package/dist/rules/token/markdoc-attributes.js.map +1 -0
- package/dist/rules/token/markdoc-pairing.d.ts +3 -0
- package/dist/rules/token/markdoc-pairing.d.ts.map +1 -0
- package/dist/rules/token/markdoc-pairing.js +73 -0
- package/dist/rules/token/markdoc-pairing.js.map +1 -0
- package/dist/rules/token/markdoc-syntax.d.ts +3 -0
- package/dist/rules/token/markdoc-syntax.d.ts.map +1 -0
- package/dist/rules/token/markdoc-syntax.js +119 -0
- package/dist/rules/token/markdoc-syntax.js.map +1 -0
- package/dist/rules/token/markdoc-unknown-tag.d.ts +3 -0
- package/dist/rules/token/markdoc-unknown-tag.d.ts.map +1 -0
- package/dist/rules/token/markdoc-unknown-tag.js +64 -0
- package/dist/rules/token/markdoc-unknown-tag.js.map +1 -0
- package/dist/rules/token/messages.d.ts +4 -0
- package/dist/rules/token/messages.d.ts.map +1 -0
- package/dist/rules/token/messages.js +20 -0
- package/dist/rules/token/messages.js.map +1 -0
- package/dist/rules/token/no-alt-text.d.ts +3 -0
- package/dist/rules/token/no-alt-text.d.ts.map +1 -0
- package/dist/rules/token/no-alt-text.js +47 -0
- package/dist/rules/token/no-alt-text.js.map +1 -0
- package/dist/rules/token/no-bare-urls.d.ts +3 -0
- package/dist/rules/token/no-bare-urls.d.ts.map +1 -0
- package/dist/rules/token/no-bare-urls.js +88 -0
- package/dist/rules/token/no-bare-urls.js.map +1 -0
- package/dist/rules/token/no-blanks-blockquote.d.ts +3 -0
- package/dist/rules/token/no-blanks-blockquote.d.ts.map +1 -0
- package/dist/rules/token/no-blanks-blockquote.js +39 -0
- package/dist/rules/token/no-blanks-blockquote.js.map +1 -0
- package/dist/rules/token/no-duplicate-heading.d.ts +3 -0
- package/dist/rules/token/no-duplicate-heading.d.ts.map +1 -0
- package/dist/rules/token/no-duplicate-heading.js +101 -0
- package/dist/rules/token/no-duplicate-heading.js.map +1 -0
- package/dist/rules/token/no-duplicate-link-destinations.d.ts +3 -0
- package/dist/rules/token/no-duplicate-link-destinations.d.ts.map +1 -0
- package/dist/rules/token/no-duplicate-link-destinations.js +65 -0
- package/dist/rules/token/no-duplicate-link-destinations.js.map +1 -0
- package/dist/rules/token/no-emphasis-as-heading.d.ts +3 -0
- package/dist/rules/token/no-emphasis-as-heading.d.ts.map +1 -0
- package/dist/rules/token/no-emphasis-as-heading.js +44 -0
- package/dist/rules/token/no-emphasis-as-heading.js.map +1 -0
- package/dist/rules/token/no-empty-headings.d.ts +3 -0
- package/dist/rules/token/no-empty-headings.d.ts.map +1 -0
- package/dist/rules/token/no-empty-headings.js +28 -0
- package/dist/rules/token/no-empty-headings.js.map +1 -0
- package/dist/rules/token/no-empty-links.d.ts +3 -0
- package/dist/rules/token/no-empty-links.d.ts.map +1 -0
- package/dist/rules/token/no-empty-links.js +67 -0
- package/dist/rules/token/no-empty-links.js.map +1 -0
- package/dist/rules/token/no-hard-tabs.d.ts +3 -0
- package/dist/rules/token/no-hard-tabs.d.ts.map +1 -0
- package/dist/rules/token/no-hard-tabs.js +76 -0
- package/dist/rules/token/no-hard-tabs.js.map +1 -0
- package/dist/rules/token/no-inline-html.d.ts +3 -0
- package/dist/rules/token/no-inline-html.d.ts.map +1 -0
- package/dist/rules/token/no-inline-html.js +45 -0
- package/dist/rules/token/no-inline-html.js.map +1 -0
- package/dist/rules/token/no-missing-space-atx.d.ts +3 -0
- package/dist/rules/token/no-missing-space-atx.d.ts.map +1 -0
- package/dist/rules/token/no-missing-space-atx.js +36 -0
- package/dist/rules/token/no-missing-space-atx.js.map +1 -0
- package/dist/rules/token/no-missing-space-closed-atx.d.ts +3 -0
- package/dist/rules/token/no-missing-space-closed-atx.d.ts.map +1 -0
- package/dist/rules/token/no-missing-space-closed-atx.js +45 -0
- package/dist/rules/token/no-missing-space-closed-atx.js.map +1 -0
- package/dist/rules/token/no-multiple-blanks.d.ts +3 -0
- package/dist/rules/token/no-multiple-blanks.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-blanks.js +35 -0
- package/dist/rules/token/no-multiple-blanks.js.map +1 -0
- package/dist/rules/token/no-multiple-space-atx.d.ts +13 -0
- package/dist/rules/token/no-multiple-space-atx.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-space-atx.js +50 -0
- package/dist/rules/token/no-multiple-space-atx.js.map +1 -0
- package/dist/rules/token/no-multiple-space-blockquote.d.ts +3 -0
- package/dist/rules/token/no-multiple-space-blockquote.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-space-blockquote.js +43 -0
- package/dist/rules/token/no-multiple-space-blockquote.js.map +1 -0
- package/dist/rules/token/no-multiple-space-closed-atx.d.ts +3 -0
- package/dist/rules/token/no-multiple-space-closed-atx.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-space-closed-atx.js +19 -0
- package/dist/rules/token/no-multiple-space-closed-atx.js.map +1 -0
- package/dist/rules/token/no-reversed-links.d.ts +3 -0
- package/dist/rules/token/no-reversed-links.d.ts.map +1 -0
- package/dist/rules/token/no-reversed-links.js +52 -0
- package/dist/rules/token/no-reversed-links.js.map +1 -0
- package/dist/rules/token/no-space-in-code.d.ts +3 -0
- package/dist/rules/token/no-space-in-code.d.ts.map +1 -0
- package/dist/rules/token/no-space-in-code.js +75 -0
- package/dist/rules/token/no-space-in-code.js.map +1 -0
- package/dist/rules/token/no-space-in-emphasis.d.ts +3 -0
- package/dist/rules/token/no-space-in-emphasis.d.ts.map +1 -0
- package/dist/rules/token/no-space-in-emphasis.js +79 -0
- package/dist/rules/token/no-space-in-emphasis.js.map +1 -0
- package/dist/rules/token/no-space-in-links.d.ts +3 -0
- package/dist/rules/token/no-space-in-links.d.ts.map +1 -0
- package/dist/rules/token/no-space-in-links.js +48 -0
- package/dist/rules/token/no-space-in-links.js.map +1 -0
- package/dist/rules/token/no-trailing-punctuation.d.ts +3 -0
- package/dist/rules/token/no-trailing-punctuation.d.ts.map +1 -0
- package/dist/rules/token/no-trailing-punctuation.js +38 -0
- package/dist/rules/token/no-trailing-punctuation.js.map +1 -0
- package/dist/rules/token/no-trailing-spaces.d.ts +3 -0
- package/dist/rules/token/no-trailing-spaces.d.ts.map +1 -0
- package/dist/rules/token/no-trailing-spaces.js +89 -0
- package/dist/rules/token/no-trailing-spaces.js.map +1 -0
- package/dist/rules/token/ol-prefix.d.ts +3 -0
- package/dist/rules/token/ol-prefix.d.ts.map +1 -0
- package/dist/rules/token/ol-prefix.js +70 -0
- package/dist/rules/token/ol-prefix.js.map +1 -0
- package/dist/rules/token/proper-names.d.ts +3 -0
- package/dist/rules/token/proper-names.d.ts.map +1 -0
- package/dist/rules/token/proper-names.js +93 -0
- package/dist/rules/token/proper-names.js.map +1 -0
- package/dist/rules/token/reference-links-images.d.ts +3 -0
- package/dist/rules/token/reference-links-images.d.ts.map +1 -0
- package/dist/rules/token/reference-links-images.js +36 -0
- package/dist/rules/token/reference-links-images.js.map +1 -0
- package/dist/rules/token/required-headings.d.ts +3 -0
- package/dist/rules/token/required-headings.d.ts.map +1 -0
- package/dist/rules/token/required-headings.js +83 -0
- package/dist/rules/token/required-headings.js.map +1 -0
- package/dist/rules/token/single-h1.d.ts +3 -0
- package/dist/rules/token/single-h1.d.ts.map +1 -0
- package/dist/rules/token/single-h1.js +56 -0
- package/dist/rules/token/single-h1.js.map +1 -0
- package/dist/rules/token/single-trailing-newline.d.ts +3 -0
- package/dist/rules/token/single-trailing-newline.d.ts.map +1 -0
- package/dist/rules/token/single-trailing-newline.js +25 -0
- package/dist/rules/token/single-trailing-newline.js.map +1 -0
- package/dist/rules/token/strong-style.d.ts +3 -0
- package/dist/rules/token/strong-style.d.ts.map +1 -0
- package/dist/rules/token/strong-style.js +51 -0
- package/dist/rules/token/strong-style.js.map +1 -0
- package/dist/rules/token/table-column-count.d.ts +3 -0
- package/dist/rules/token/table-column-count.d.ts.map +1 -0
- package/dist/rules/token/table-column-count.js +44 -0
- package/dist/rules/token/table-column-count.js.map +1 -0
- package/dist/rules/token/table-column-style.d.ts +3 -0
- package/dist/rules/token/table-column-style.d.ts.map +1 -0
- package/dist/rules/token/table-column-style.js +179 -0
- package/dist/rules/token/table-column-style.js.map +1 -0
- package/dist/rules/token/table-pipe-style.d.ts +3 -0
- package/dist/rules/token/table-pipe-style.d.ts.map +1 -0
- package/dist/rules/token/table-pipe-style.js +54 -0
- package/dist/rules/token/table-pipe-style.js.map +1 -0
- package/dist/rules/token/ul-indent.d.ts +3 -0
- package/dist/rules/token/ul-indent.d.ts.map +1 -0
- package/dist/rules/token/ul-indent.js +72 -0
- package/dist/rules/token/ul-indent.js.map +1 -0
- package/dist/rules/token/ul-style.d.ts +3 -0
- package/dist/rules/token/ul-style.d.ts.map +1 -0
- package/dist/rules/token/ul-style.js +80 -0
- package/dist/rules/token/ul-style.js.map +1 -0
- package/dist/rules/types.d.ts +81 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/utils.d.ts +29 -0
- package/dist/rules/utils.d.ts.map +1 -0
- package/dist/{assertions → rules}/utils.js +27 -0
- package/dist/rules/utils.js.map +1 -0
- package/dist/scopes/extractor.d.ts +7 -0
- package/dist/scopes/extractor.d.ts.map +1 -0
- package/dist/scopes/extractor.js +475 -0
- package/dist/scopes/extractor.js.map +1 -0
- package/dist/scopes/selector.d.ts +51 -0
- package/dist/scopes/selector.d.ts.map +1 -0
- package/dist/scopes/selector.js +121 -0
- package/dist/scopes/selector.js.map +1 -0
- package/dist/scopes/sentences.d.ts +7 -0
- package/dist/scopes/sentences.d.ts.map +1 -0
- package/dist/scopes/sentences.js +115 -0
- package/dist/scopes/sentences.js.map +1 -0
- package/dist/scopes/types.d.ts +44 -0
- package/dist/scopes/types.d.ts.map +1 -0
- package/dist/scopes/types.js +2 -0
- package/dist/scopes/types.js.map +1 -0
- package/dist/scopes/vocabulary.d.ts +16 -0
- package/dist/scopes/vocabulary.d.ts.map +1 -0
- package/dist/scopes/vocabulary.js +70 -0
- package/dist/scopes/vocabulary.js.map +1 -0
- package/dist/types/assertions.d.ts +95 -32
- package/dist/types/assertions.d.ts.map +1 -1
- package/dist/types/problems.d.ts +4 -5
- package/dist/types/problems.d.ts.map +1 -1
- package/dist/types/rules.d.ts +4 -6
- package/dist/types/rules.d.ts.map +1 -1
- package/examples/appendices/google.appendix.yaml +91 -0
- package/examples/appendices/inclusive-language.appendix.yaml +61 -0
- package/examples/appendices/microsoft.appendix.yaml +99 -0
- package/examples/appendices/plain-language.appendix.yaml +88 -0
- package/examples/google.yaml +1525 -0
- package/examples/inclusive-language.yaml +304 -0
- package/examples/microsoft.yaml +1542 -0
- package/examples/plain-language.yaml +325 -0
- package/package.json +49 -16
- package/presets/google/PROVENANCE.md +1022 -0
- package/presets/google/sources.json +192 -0
- package/presets/inclusive-language/PROVENANCE.md +174 -0
- package/presets/inclusive-language/sources.json +107 -0
- package/presets/microsoft/PROVENANCE.md +1555 -0
- package/presets/microsoft/sources.json +494 -0
- package/presets/plain-language/PROVENANCE.md +364 -0
- package/presets/plain-language/sources.json +108 -0
- package/dist/assertions/bullet-style.d.ts +0 -3
- package/dist/assertions/bullet-style.d.ts.map +0 -1
- package/dist/assertions/bullet-style.js +0 -60
- package/dist/assertions/bullet-style.js.map +0 -1
- package/dist/assertions/index.d.ts +0 -21
- package/dist/assertions/index.d.ts.map +0 -1
- package/dist/assertions/index.js +0 -30
- package/dist/assertions/index.js.map +0 -1
- package/dist/assertions/max-image-size.d.ts +0 -3
- package/dist/assertions/max-image-size.d.ts.map +0 -1
- package/dist/assertions/max-image-size.js +0 -73
- package/dist/assertions/max-image-size.js.map +0 -1
- package/dist/assertions/max-line-length.d.ts +0 -3
- package/dist/assertions/max-line-length.d.ts.map +0 -1
- package/dist/assertions/max-line-length.js +0 -68
- package/dist/assertions/max-line-length.js.map +0 -1
- package/dist/assertions/no-broken-fragment-links.d.ts +0 -3
- package/dist/assertions/no-broken-fragment-links.d.ts.map +0 -1
- package/dist/assertions/no-broken-fragment-links.js +0 -79
- package/dist/assertions/no-broken-fragment-links.js.map +0 -1
- package/dist/assertions/no-duplicate-headings.d.ts +0 -3
- package/dist/assertions/no-duplicate-headings.d.ts.map +0 -1
- package/dist/assertions/no-duplicate-headings.js +0 -66
- package/dist/assertions/no-duplicate-headings.js.map +0 -1
- package/dist/assertions/no-hard-tabs.d.ts +0 -3
- package/dist/assertions/no-hard-tabs.d.ts.map +0 -1
- package/dist/assertions/no-hard-tabs.js +0 -63
- package/dist/assertions/no-hard-tabs.js.map +0 -1
- package/dist/assertions/no-trailing-spaces.d.ts +0 -3
- package/dist/assertions/no-trailing-spaces.d.ts.map +0 -1
- package/dist/assertions/no-trailing-spaces.js +0 -72
- package/dist/assertions/no-trailing-spaces.js.map +0 -1
- package/dist/assertions/pattern.d.ts +0 -3
- package/dist/assertions/pattern.d.ts.map +0 -1
- package/dist/assertions/pattern.js +0 -39
- package/dist/assertions/pattern.js.map +0 -1
- package/dist/assertions/semantic-line-breaks.d.ts +0 -3
- package/dist/assertions/semantic-line-breaks.d.ts.map +0 -1
- package/dist/assertions/semantic-line-breaks.js +0 -152
- package/dist/assertions/semantic-line-breaks.js.map +0 -1
- package/dist/assertions/swap.d.ts +0 -3
- package/dist/assertions/swap.d.ts.map +0 -1
- package/dist/assertions/swap.js +0 -39
- package/dist/assertions/swap.js.map +0 -1
- package/dist/assertions/utils.d.ts +0 -8
- package/dist/assertions/utils.d.ts.map +0 -1
- package/dist/assertions/utils.js.map +0 -1
- package/dist/core/scope-parser.d.ts +0 -26
- package/dist/core/scope-parser.d.ts.map +0 -1
- package/dist/core/scope-parser.js +0 -110
- package/dist/core/scope-parser.js.map +0 -1
- package/dist/files.d.ts +0 -2
- package/dist/files.d.ts.map +0 -1
- package/dist/files.js +0 -39
- package/dist/files.js.map +0 -1
- package/dist/load-config.d.ts +0 -25
- package/dist/load-config.d.ts.map +0 -1
- package/dist/load-config.js +0 -104
- package/dist/load-config.js.map +0 -1
- package/dist/load.d.ts +0 -25
- package/dist/load.d.ts.map +0 -1
- package/dist/load.js +0 -112
- package/dist/load.js.map +0 -1
- package/dist/scope.d.ts +0 -26
- package/dist/scope.d.ts.map +0 -1
- package/dist/scope.js +0 -110
- package/dist/scope.js.map +0 -1
- package/dist/types.d.ts +0 -109
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/validate.d.ts +0 -31
- package/dist/validate.d.ts.map +0 -1
- package/dist/validate.js +0 -154
- package/dist/validate.js.map +0 -1
- /package/dist/{types.js → parser/types.js} +0 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { formatTemplate } from '../token/messages.js';
|
|
4
|
+
import { newLineRe, offsetToLineColumn } from '../../core/line-endings.js';
|
|
5
|
+
import { maskInlineCode } from '../../core/inline-code.js';
|
|
6
|
+
import { isAllCapsWord } from './title-case.js';
|
|
7
|
+
import { TECHNICAL_PROPER_NOUNS } from '../../data/proper-nouns.js';
|
|
8
|
+
// Module-level cache, keyed by dictionary source: parsing a Hunspell
|
|
9
|
+
// dictionary is expensive (the bundled English `.dic` alone is 500+KB), so
|
|
10
|
+
// one speller instance is reused for the lifetime of the process. A cached
|
|
11
|
+
// PROMISE (not a resolved value) so concurrent first callers await the same
|
|
12
|
+
// in-flight load instead of racing separate ones.
|
|
13
|
+
const DEFAULT_DICTIONARY_KEY = '\0default';
|
|
14
|
+
const spellerCache = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Resolves a `dictionary` option value (the shared base path WITHOUT the
|
|
17
|
+
* `.aff`/`.dic` extension) to its two file paths. Resolved relative to
|
|
18
|
+
* `process.cwd()`, not the config file's directory — consistent with every
|
|
19
|
+
* other file-shaped config value in this package; an absolute path is used
|
|
20
|
+
* as-is.
|
|
21
|
+
*
|
|
22
|
+
* Exported so `../../config/validate.ts`'s dictionary-file-existence check
|
|
23
|
+
* (see `checkSpellingPeerDependencies` there) shares this EXACT resolution
|
|
24
|
+
* rule instead of re-implementing it — a config that validates cleanly must
|
|
25
|
+
* always name the same files `readCustomDictionary` below actually reads at
|
|
26
|
+
* lint time, or validate() and the runtime could silently disagree about
|
|
27
|
+
* which files a `dictionary` path names.
|
|
28
|
+
*/
|
|
29
|
+
export function resolveDictionaryPaths(dictionaryPath) {
|
|
30
|
+
const resolved = path.isAbsolute(dictionaryPath)
|
|
31
|
+
? dictionaryPath
|
|
32
|
+
: path.join(process.cwd(), dictionaryPath);
|
|
33
|
+
return { aff: `${resolved}.aff`, dic: `${resolved}.dic` };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Reads a custom Hunspell `.aff`/`.dic` pair from disk. `dictionaryPath` is
|
|
37
|
+
* the shared base path WITHOUT the extension (e.g. `'./dict/custom'` reads
|
|
38
|
+
* `./dict/custom.aff` and `./dict/custom.dic`) — see `resolveDictionaryPaths`
|
|
39
|
+
* for the resolution rule.
|
|
40
|
+
*/
|
|
41
|
+
async function readCustomDictionary(dictionaryPath) {
|
|
42
|
+
const { aff: affPath, dic: dicPath } = resolveDictionaryPaths(dictionaryPath);
|
|
43
|
+
const [aff, dic] = await Promise.all([fs.readFile(affPath), fs.readFile(dicPath)]);
|
|
44
|
+
return { aff, dic };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Loads the `{aff, dic}` pair `nspell` needs: a custom pair from disk when
|
|
48
|
+
* `options.dictionary` is set, otherwise the bundled default English
|
|
49
|
+
* dictionary. `dictionary-en@4` exports a plain `{ aff, dic }` object as
|
|
50
|
+
* its ESM default — NOT the v3 Node-style callback API some nspell examples
|
|
51
|
+
* still show — so there is no callback to bridge, just a destructure.
|
|
52
|
+
*/
|
|
53
|
+
async function loadDictionary(options) {
|
|
54
|
+
if (options.dictionary)
|
|
55
|
+
return readCustomDictionary(options.dictionary);
|
|
56
|
+
const mod = (await import('dictionary-en'));
|
|
57
|
+
return mod.default;
|
|
58
|
+
}
|
|
59
|
+
function loadSpeller(options) {
|
|
60
|
+
const cacheKey = options.dictionary && options.dictionary.length > 0
|
|
61
|
+
? options.dictionary
|
|
62
|
+
: DEFAULT_DICTIONARY_KEY;
|
|
63
|
+
const cached = spellerCache.get(cacheKey);
|
|
64
|
+
if (cached)
|
|
65
|
+
return cached;
|
|
66
|
+
const loading = (async () => {
|
|
67
|
+
const [{ default: nspell }, dictionary] = await Promise.all([
|
|
68
|
+
import('nspell'),
|
|
69
|
+
loadDictionary(options),
|
|
70
|
+
]);
|
|
71
|
+
return nspell(dictionary);
|
|
72
|
+
})();
|
|
73
|
+
spellerCache.set(cacheKey, loading);
|
|
74
|
+
// Evict on rejection: a failed load (missing peer, unreadable/missing
|
|
75
|
+
// custom dictionary file, etc.) must not poison this cache key for the
|
|
76
|
+
// rest of the process — a later call after the failure clears (peer
|
|
77
|
+
// installed, file becomes readable) should retry cleanly instead of
|
|
78
|
+
// forever replaying the same dead rejection (the High-severity finding
|
|
79
|
+
// this fixes). Attached as a SEPARATE `.catch` subscriber on `loading`
|
|
80
|
+
// itself, never reassigning `loading` or the cached map value — every
|
|
81
|
+
// real caller awaiting the SAME cached promise (via this function's own
|
|
82
|
+
// `return loading` below, or a concurrent in-flight caller that read
|
|
83
|
+
// `cached` above) still observes and handles the original rejection
|
|
84
|
+
// themselves; this handler only ever additionally deletes the now-dead
|
|
85
|
+
// cache entry alongside them, so it can never swallow the rejection a
|
|
86
|
+
// consumer sees.
|
|
87
|
+
loading.catch(() => {
|
|
88
|
+
// Only remove the entry if it's STILL this exact rejected promise — a
|
|
89
|
+
// concurrent caller could in principle have already evicted and
|
|
90
|
+
// replaced it with a newer, unrelated load, which this must never clobber.
|
|
91
|
+
if (spellerCache.get(cacheKey) === loading) {
|
|
92
|
+
spellerCache.delete(cacheKey);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
return loading;
|
|
96
|
+
}
|
|
97
|
+
// -- Tokenization -----------------------------------------------------------
|
|
98
|
+
// Letter runs, with an optional apostrophe-joined suffix so contractions
|
|
99
|
+
// ("don't") tokenize as one word. `\p{L}` can never match a digit, so
|
|
100
|
+
// "skip tokens containing digits" is true by construction — but a
|
|
101
|
+
// digit-adjacent identifier like 'sha256' still tokenizes to its letter-only
|
|
102
|
+
// fragments ('sha'), which nspell would flag as misspellings. The
|
|
103
|
+
// `isDigitAdjacent` guard below skips those.
|
|
104
|
+
const WORD_RE = /\p{L}+(?:['’]\p{L}+)?/gu;
|
|
105
|
+
// True when the character immediately before `start` or after `end` is a
|
|
106
|
+
// digit — used to skip a WORD_RE match that is really a truncated fragment
|
|
107
|
+
// of a digit-bearing identifier ('sha256' -> 'sha', 'log4j' -> 'log' and
|
|
108
|
+
// 'j') rather than a standalone word.
|
|
109
|
+
function isDigitAdjacent(text, start, end) {
|
|
110
|
+
const before = text[start - 1];
|
|
111
|
+
const after = text[end];
|
|
112
|
+
return /\d/.test(before ?? '') || /\d/.test(after ?? '');
|
|
113
|
+
}
|
|
114
|
+
// Backtick-delimited inline code spans (extractScopes keeps them as raw
|
|
115
|
+
// text in prose segment content) are masked out with the shared,
|
|
116
|
+
// length-preserving maskInlineCode (core/inline-code.ts) so every remaining
|
|
117
|
+
// token's offset stays aligned with `segment.content` -- see there for the
|
|
118
|
+
// CommonMark span-recognition contract. Fenced/indented CODE BLOCKS need no
|
|
119
|
+
// handling here: they are their own `scope: 'code'` segment, so a
|
|
120
|
+
// prose-scoped rule never sees one (a rule explicitly scoped to `all`/`code`
|
|
121
|
+
// still does -- see the README's `spelling` section).
|
|
122
|
+
// On the segment's first line, segment.content starts mid-source-line (e.g.
|
|
123
|
+
// a heading's content excludes the '## ' marker), so segment.startColumn
|
|
124
|
+
// must be added — see pattern.ts's toSourceColumn.
|
|
125
|
+
function toSourceColumn(segment, lineNumber, column) {
|
|
126
|
+
return lineNumber === 1 ? segment.startColumn + (column - 1) : column;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Formats the fallback message's second `%s` slot: `''` for zero
|
|
130
|
+
* suggestions, or `' — did you mean: a, b, c?'` for one to three.
|
|
131
|
+
* Exported for direct unit testing.
|
|
132
|
+
*/
|
|
133
|
+
export function formatSuggestionSuffix(suggestions) {
|
|
134
|
+
if (suggestions.length === 0)
|
|
135
|
+
return '';
|
|
136
|
+
return ` — did you mean: ${suggestions.join(', ')}?`;
|
|
137
|
+
}
|
|
138
|
+
// Fallback when a programmatically-built rule has no `message` (validate()
|
|
139
|
+
// requires one). %s slots: the unrecognized word, then
|
|
140
|
+
// formatSuggestionSuffix's output.
|
|
141
|
+
const FALLBACK_MESSAGE = 'Unknown word "%s"%s';
|
|
142
|
+
// The built-in vocabulary's multi-token entries ('Node.js', 'VS Code') are
|
|
143
|
+
// split into their individual word-level parts up front: unlike
|
|
144
|
+
// `capitalization`'s whole-phrase matching (title-case.ts's
|
|
145
|
+
// buildExceptionPlan/recaseWords), this rule's WORD_RE (below)
|
|
146
|
+
// tokenizes per word, so a phrase entry must contribute EACH of its parts
|
|
147
|
+
// ('Node', 'js', 'VS', 'Code') to the accepted-word set rather than the
|
|
148
|
+
// phrase as a whole -- the correct behavior for a per-word spell check, and
|
|
149
|
+
// a deliberate, documented asymmetry with `capitalization` (see
|
|
150
|
+
// SpellingAssertion's `builtinVocabulary` doc comment in ../../types/index.js).
|
|
151
|
+
const BUILTIN_VOCAB_WORDS = TECHNICAL_PROPER_NOUNS.flatMap((entry) => entry.split(/[\s.]+/).filter((part) => part.length > 0)).map((word) => word.toLowerCase());
|
|
152
|
+
const execute = async (rule, file, ctx) => {
|
|
153
|
+
const options = (rule.assertions['spelling'] ?? {});
|
|
154
|
+
let speller;
|
|
155
|
+
try {
|
|
156
|
+
speller = await loadSpeller(options);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
// The optional peer (or a custom dictionary file) failed to load.
|
|
160
|
+
// validate()'s peer-availability + dictionary-file-existence checks
|
|
161
|
+
// (see checkSpellingPeerDependencies in ../../config/validate.ts)
|
|
162
|
+
// normally catch this ahead of time with an actionable error — but a
|
|
163
|
+
// caller that reaches execute() directly (bypassing validate()), or a
|
|
164
|
+
// TOCTOU where the dictionary file disappears/breaks between validate()
|
|
165
|
+
// and this run, must NOT fail closed with zero problems here: that used
|
|
166
|
+
// to silently disable spelling for the rest of the process (the
|
|
167
|
+
// rejected promise stayed cached — see spellerCache/loadSpeller above —
|
|
168
|
+
// and every later call replayed it). Rethrow instead, so runner.ts's own
|
|
169
|
+
// internalError catch (core/runner.ts) surfaces exactly ONE visible
|
|
170
|
+
// problem for this file/rule rather than a silent [].
|
|
171
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
172
|
+
throw new Error(`spelling: failed to load dictionary — ${detail}`);
|
|
173
|
+
}
|
|
174
|
+
const vocab = new Set((options.vocab ?? []).map((word) => word.toLowerCase()));
|
|
175
|
+
// Unioned in unless explicitly opted out -- same `builtinVocabulary` flag
|
|
176
|
+
// and union-not-replace reasoning as `capitalization` (see
|
|
177
|
+
// rules/scope/capitalization.ts's `collectSites`), so a config's own
|
|
178
|
+
// `vocab` composes with the built-ins rather than overriding them.
|
|
179
|
+
if (options.builtinVocabulary !== false) {
|
|
180
|
+
for (const word of BUILTIN_VOCAB_WORDS)
|
|
181
|
+
vocab.add(word);
|
|
182
|
+
}
|
|
183
|
+
const ignorePatterns = [];
|
|
184
|
+
for (const pattern of options.ignore ?? []) {
|
|
185
|
+
try {
|
|
186
|
+
ignorePatterns.push(new RegExp(pattern));
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// ignore invalid regex
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const problems = [];
|
|
193
|
+
for (const segment of ctx.segments) {
|
|
194
|
+
const masked = maskInlineCode(segment.content);
|
|
195
|
+
// newLineRe, not '\n': a bare split leaves a trailing '\r' on CRLF content.
|
|
196
|
+
const contentLines = segment.content.split(newLineRe);
|
|
197
|
+
for (const match of masked.matchAll(WORD_RE)) {
|
|
198
|
+
const word = match[0];
|
|
199
|
+
const offset = match.index ?? 0;
|
|
200
|
+
if (vocab.has(word.toLowerCase()))
|
|
201
|
+
continue;
|
|
202
|
+
if (ignorePatterns.some((re) => re.test(word)))
|
|
203
|
+
continue;
|
|
204
|
+
if (isAllCapsWord(word))
|
|
205
|
+
continue;
|
|
206
|
+
if (isDigitAdjacent(masked, offset, offset + word.length))
|
|
207
|
+
continue;
|
|
208
|
+
if (speller.correct(word))
|
|
209
|
+
continue;
|
|
210
|
+
const { line: lineNumber, column } = offsetToLineColumn(segment.content, offset);
|
|
211
|
+
const suggestions = speller.suggest(word).slice(0, 3);
|
|
212
|
+
problems.push({
|
|
213
|
+
file,
|
|
214
|
+
line: segment.startLine + lineNumber - 1,
|
|
215
|
+
column: toSourceColumn(segment, lineNumber, column),
|
|
216
|
+
text: contentLines[lineNumber - 1] ?? '',
|
|
217
|
+
match: word,
|
|
218
|
+
ruleName: rule.name,
|
|
219
|
+
severity: rule.severity,
|
|
220
|
+
message: formatTemplate(rule.message ?? FALLBACK_MESSAGE, word, formatSuggestionSuffix(suggestions)),
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return problems;
|
|
225
|
+
};
|
|
226
|
+
export const spelling = { id: 'spelling', fixable: false, execute };
|
|
227
|
+
//# sourceMappingURL=spelling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spelling.js","sourceRoot":"","sources":["../../../src/rules/scope/spelling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../../src/rules/scope/swap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AAgL/D,eAAO,MAAM,IAAI,EAAE,SAAuD,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { offsetToLineColumn } from '../../core/line-endings.js';
|
|
2
|
+
import { overlapsAnyRange } from '../../core/inline-code.js';
|
|
3
|
+
import { nonProseRanges } from '../utils.js';
|
|
4
|
+
import { applyMatchCase } from '../../core/case-preserve.js';
|
|
5
|
+
// De-overlap matches from DIFFERENT pairs by source span: when two matches
|
|
6
|
+
// overlap, keep the LONGER one (ties: the earlier-starting one; identical
|
|
7
|
+
// spans: first pair in config order, via the sort's stability). Without
|
|
8
|
+
// this, a compound pair like 'he/she' overlapping standalone keys ('he',
|
|
9
|
+
// 'she') emitted all three matches and --fix corrupted 'he/she' to
|
|
10
|
+
// 'they/they'. Zero-width matches have an empty span, so they never
|
|
11
|
+
// overlap anything and pass through unchanged.
|
|
12
|
+
function dropOverlappedShorterMatches(raw) {
|
|
13
|
+
const byPriority = [...raw].sort((a, b) => b.match.length - a.match.length || a.index - b.index);
|
|
14
|
+
const kept = [];
|
|
15
|
+
for (const candidate of byPriority) {
|
|
16
|
+
const overlapsKept = kept.some((winner) => candidate.index < winner.index + winner.match.length &&
|
|
17
|
+
winner.index < candidate.index + candidate.match.length);
|
|
18
|
+
if (!overlapsKept)
|
|
19
|
+
kept.push(candidate);
|
|
20
|
+
}
|
|
21
|
+
return kept.sort((a, b) => a.index - b.index);
|
|
22
|
+
}
|
|
23
|
+
// Prose rules must not lint code: a swap like master -> primary would fire
|
|
24
|
+
// inside `git checkout master`, the usage Google's guide explicitly
|
|
25
|
+
// sanctions in code font. The same goes for a markdoc tag's span, which is
|
|
26
|
+
// markup, not prose.
|
|
27
|
+
//
|
|
28
|
+
// `content` is the original segment content -- the regex always runs against it
|
|
29
|
+
// directly, never against a masked stand-in, because an arbitrary user regex
|
|
30
|
+
// such as a negated-class `keysAreRegex` key like `[^\s,]+` can match straight
|
|
31
|
+
// through a masked run. A match whose span overlaps an `excluded` entry (inline
|
|
32
|
+
// code spans and masked markdoc tag spans -- see `nonProseRanges`) is skipped
|
|
33
|
+
// below rather than recorded.
|
|
34
|
+
function findMatches(content, excluded, options) {
|
|
35
|
+
const raw = [];
|
|
36
|
+
const pairs = options.pairs || {};
|
|
37
|
+
for (const [from, to] of Object.entries(pairs)) {
|
|
38
|
+
// An empty pair key (only reachable when a caller bypasses validate())
|
|
39
|
+
// would escape to a zero-width pattern matching nearly every position,
|
|
40
|
+
// flooding every segment with problems. Skip it, same as
|
|
41
|
+
// consistency.ts's empty-variant skip.
|
|
42
|
+
if (String(from).length === 0)
|
|
43
|
+
continue;
|
|
44
|
+
const escaped = options.keysAreRegex
|
|
45
|
+
? from
|
|
46
|
+
: String(from).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
47
|
+
const pattern = options.wordBoundary ? `\\b${escaped}\\b` : escaped;
|
|
48
|
+
const flags = options.ignoreCase ? 'gi' : 'g';
|
|
49
|
+
let regex;
|
|
50
|
+
try {
|
|
51
|
+
regex = new RegExp(pattern, flags);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// ignore an invalid regex key (reachable via keysAreRegex) -- this
|
|
55
|
+
// pair only, so the rule's other pairs still run.
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
let match;
|
|
59
|
+
while ((match = regex.exec(content)) !== null) {
|
|
60
|
+
// A zero-width match (e.g. a `keysAreRegex` pattern like `a*`) never
|
|
61
|
+
// advances lastIndex on its own -- bump it or the loop hangs. It's
|
|
62
|
+
// also semantically meaningless for swap (there's no text to find or
|
|
63
|
+
// replace), so skip recording it too -- otherwise --fix would turn
|
|
64
|
+
// every such position into a zero-length insert, rewriting the file
|
|
65
|
+
// at every character offset the pattern passes through.
|
|
66
|
+
if (match[0].length === 0) {
|
|
67
|
+
regex.lastIndex++;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const matchEnd = match.index + match[0].length;
|
|
71
|
+
if (overlapsAnyRange(match.index, matchEnd, excluded)) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
raw.push({
|
|
75
|
+
index: match.index,
|
|
76
|
+
match: content.slice(match.index, match.index + match[0].length),
|
|
77
|
+
replacement: String(to),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return dropOverlappedShorterMatches(raw).map(({ index, match, replacement }) => {
|
|
82
|
+
// offsetToLineColumn (never a bare '\n' split): on a CR-only file a
|
|
83
|
+
// '\n'-based mapping kept every match on line 1 with a column
|
|
84
|
+
// counted from the start of the content, so --fix edited the wrong
|
|
85
|
+
// position entirely.
|
|
86
|
+
const { line, column } = offsetToLineColumn(content, index);
|
|
87
|
+
return { line, column, match, replacement };
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// A match's `column` from findMatches() is relative to its own line within
|
|
91
|
+
// segment.content. On the segment's first line, segment.content starts
|
|
92
|
+
// mid-source-line (e.g. a heading segment's content excludes the '## '
|
|
93
|
+
// marker), so segment.startColumn must be added to get the true source
|
|
94
|
+
// column. Matches on later lines start at source column 1, so they're
|
|
95
|
+
// unaffected.
|
|
96
|
+
function toSourceColumn(segment, localLine, localColumn) {
|
|
97
|
+
return localLine === 1 ? segment.startColumn + (localColumn - 1) : localColumn;
|
|
98
|
+
}
|
|
99
|
+
const execute = async (rule, file, ctx) => {
|
|
100
|
+
const options = rule.assertions['swap'];
|
|
101
|
+
const problems = [];
|
|
102
|
+
for (const segment of ctx.segments) {
|
|
103
|
+
const excluded = nonProseRanges(segment, options.includeCode);
|
|
104
|
+
for (const found of findMatches(segment.content, excluded, options)) {
|
|
105
|
+
problems.push({
|
|
106
|
+
file,
|
|
107
|
+
line: segment.startLine + found.line - 1,
|
|
108
|
+
column: toSourceColumn(segment, found.line, found.column),
|
|
109
|
+
// Legacy convention (text === match), kept as-is to avoid changing
|
|
110
|
+
// swap's reported output.
|
|
111
|
+
text: found.match,
|
|
112
|
+
match: found.match,
|
|
113
|
+
ruleName: rule.name,
|
|
114
|
+
severity: rule.severity,
|
|
115
|
+
message: (rule.message ?? '').replace('%s', found.replacement).replace('%s', found.match),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return problems;
|
|
120
|
+
};
|
|
121
|
+
const fix = async (rule, file, ctx) => {
|
|
122
|
+
const options = rule.assertions['swap'];
|
|
123
|
+
const fixes = [];
|
|
124
|
+
for (const segment of ctx.segments) {
|
|
125
|
+
const excluded = nonProseRanges(segment, options.includeCode);
|
|
126
|
+
for (const found of findMatches(segment.content, excluded, options)) {
|
|
127
|
+
fixes.push({
|
|
128
|
+
file,
|
|
129
|
+
ruleName: rule.name,
|
|
130
|
+
lineNumber: segment.startLine + found.line - 1,
|
|
131
|
+
editColumn: toSourceColumn(segment, found.line, found.column),
|
|
132
|
+
deleteCount: found.match.length,
|
|
133
|
+
// Apply the MATCHED text's observed casing to the replacement,
|
|
134
|
+
// not the configured replacement literally: with `ignoreCase:
|
|
135
|
+
// true`, a sentence-initial "Behaviour" would otherwise be
|
|
136
|
+
// replaced by literal "behavior", silently lowercasing the start
|
|
137
|
+
// of the sentence. Works the same for a `keysAreRegex` key --
|
|
138
|
+
// applyMatchCase reads the MATCHED string, not the key -- though a
|
|
139
|
+
// regex key whose match has internal mixed case (e.g. "bEhAvIoUr")
|
|
140
|
+
// falls into the "no confident inference" branch and inserts the
|
|
141
|
+
// replacement exactly as configured, no guessing.
|
|
142
|
+
insertText: applyMatchCase(found.match, found.replacement),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return fixes;
|
|
147
|
+
};
|
|
148
|
+
export const swap = { id: 'swap', fixable: true, execute, fix };
|
|
149
|
+
//# sourceMappingURL=swap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../../src/rules/scope/swap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAe7D,2EAA2E;AAC3E,0EAA0E;AAC1E,wEAAwE;AACxE,yEAAyE;AACzE,mEAAmE;AACnE,oEAAoE;AACpE,+CAA+C;AAC/C,SAAS,4BAA4B,CAAC,GAAmB;IACvD,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACjG,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,CAAC,MAAM,EAAE,EAAE,CACT,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;YACpD,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAC1D,CAAC;QACF,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,2EAA2E;AAC3E,oEAAoE;AACpE,2EAA2E;AAC3E,qBAAqB;AACrB,EAAE;AACF,gFAAgF;AAChF,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,8EAA8E;AAC9E,8BAA8B;AAC9B,SAAS,WAAW,CAClB,OAAe,EACf,QAA+C,EAC/C,OAAsB;IAEtB,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,uEAAuE;QACvE,uEAAuE;QACvE,yDAAyD;QACzD,uCAAuC;QACvC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAExC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY;YAClC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACpE,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9C,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;YACnE,kDAAkD;YAClD,SAAS;QACX,CAAC;QACD,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,qEAAqE;YACrE,mEAAmE;YACnE,qEAAqE;YACrE,mEAAmE;YACnE,oEAAoE;YACpE,wDAAwD;YACxD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,SAAS,EAAE,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/C,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACtD,SAAS;YACX,CAAC;YACD,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAChE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,4BAA4B,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7E,oEAAoE;QACpE,8DAA8D;QAC9D,mEAAmE;QACnE,qBAAqB;QACrB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2EAA2E;AAC3E,uEAAuE;AACvE,uEAAuE;AACvE,uEAAuE;AACvE,sEAAsE;AACtE,cAAc;AACd,SAAS,cAAc,CAAC,OAAgC,EAAE,SAAiB,EAAE,WAAmB;IAC9F,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACjF,CAAC;AAED,MAAM,OAAO,GAAG,KAAK,EACnB,IAAoB,EACpB,IAAY,EACZ,GAAqB,EACD,EAAE;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAkB,CAAC;IACzD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAC9D,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YACpE,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,IAAI,EAAE,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC;gBACxC,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;gBACzD,mEAAmE;gBACnE,0BAA0B;gBAC1B,IAAI,EAAE,KAAK,CAAC,KAAK;gBACjB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;aAC1F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,GAAG,GAAG,KAAK,EAAE,IAAoB,EAAE,IAAY,EAAE,GAAqB,EAAkB,EAAE;IAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAkB,CAAC;IACzD,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAC9D,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YACpE,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI;gBACJ,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,UAAU,EAAE,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC;gBAC9C,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;gBAC7D,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;gBAC/B,+DAA+D;gBAC/D,8DAA8D;gBAC9D,2DAA2D;gBAC3D,iEAAiE;gBACjE,8DAA8D;gBAC9D,mEAAmE;gBACnE,mEAAmE;gBACnE,iEAAiE;gBACjE,kDAAkD;gBAClD,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC;aAC3D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAc,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True for a word that's already an ALL-CAPS acronym (2+ letters, e.g.
|
|
3
|
+
* 'API', 'HTML5') -- both styles leave these exactly as written rather
|
|
4
|
+
* than lowercasing or capitalizing them. Non-letter characters (digits)
|
|
5
|
+
* don't count toward the length or case check.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isAllCapsWord(word: string): boolean;
|
|
8
|
+
export interface ExceptionPlan {
|
|
9
|
+
wordMap: Map<string, string>;
|
|
10
|
+
phrases: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function buildExceptionPlan(exceptions: string[]): ExceptionPlan;
|
|
13
|
+
/**
|
|
14
|
+
* Rebuilds `text` with every word re-cased by `caseWord`, which receives the
|
|
15
|
+
* word plus its `index` in the token sequence and that sequence's `total`
|
|
16
|
+
* length -- so `index === 0` is the real first word and `index === total - 1`
|
|
17
|
+
* the real last one. Separators between tokens are copied through verbatim.
|
|
18
|
+
*
|
|
19
|
+
* A phrase-exception token is emitted as-written and never passed to
|
|
20
|
+
* `caseWord`, but it DOES occupy an index. That is the whole point: a leading
|
|
21
|
+
* or trailing phrase no longer hands its first/last position to a neighbour
|
|
22
|
+
* (#25610).
|
|
23
|
+
*
|
|
24
|
+
* Shared by this module's apTitleCase/chicagoTitleCase and by
|
|
25
|
+
* capitalization.ts's sentenceCase, so all three `$`-styles agree on
|
|
26
|
+
* tokenization and phrase protection, not merely on the exception plan.
|
|
27
|
+
* Length-preserving whenever `caseWord` is.
|
|
28
|
+
*/
|
|
29
|
+
export declare function recaseWords(text: string, phrases: string[], caseWord: (word: string, index: number, total: number) => string): string;
|
|
30
|
+
/**
|
|
31
|
+
* AP style: lowercases articles, coordinating conjunctions, and
|
|
32
|
+
* prepositions of 3 letters or fewer -- everything else is capitalized,
|
|
33
|
+
* except `exceptions` (kept as-written) and ALL-CAPS words (left alone).
|
|
34
|
+
* The first and last word are always capitalized.
|
|
35
|
+
*/
|
|
36
|
+
export declare function apTitleCase(text: string, exceptions?: string[]): string;
|
|
37
|
+
/**
|
|
38
|
+
* Chicago style: like AP, but lowercases EVERY preposition regardless of
|
|
39
|
+
* length (not just the 3-letters-or-fewer ones AP lowercases).
|
|
40
|
+
*/
|
|
41
|
+
export declare function chicagoTitleCase(text: string, exceptions?: string[]): string;
|
|
42
|
+
//# sourceMappingURL=title-case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"title-case.d.ts","sourceRoot":"","sources":["../../../src/rules/scope/title-case.ts"],"names":[],"mappings":"AA+EA;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAuBD,MAAM,WAAW,aAAa;IAG5B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI7B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,aAAa,CAStE;AAoHD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAC/D,MAAM,CAYR;AAqED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,MAAM,CAE3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,MAAM,CAEhF"}
|