1
0
mirror of https://github.com/sasjs/lint.git synced 2026-01-04 11:20:04 +00:00

fix: check tab indentation in whole line

This commit is contained in:
2022-12-09 16:36:09 +05:00
parent 8be59ac591
commit 3701253302
8 changed files with 163 additions and 116 deletions

View File

@@ -1,5 +1,5 @@
export { indentationMultiple } from './indentationMultiple'
export { maxLineLength } from './maxLineLength'
export { noEncodedPasswords } from './noEncodedPasswords'
export { noTabIndentation } from './noTabIndentation'
export { noTabs } from './noTabs'
export { noTrailingSpaces } from './noTrailingSpaces'

View File

@@ -1,15 +1,15 @@
import { Severity } from '../../types/Severity'
import { noTabIndentation } from './noTabIndentation'
import { noTabs } from './noTabs'
describe('noTabs', () => {
it('should return an empty array when the line is not indented with a tab', () => {
const line = "%put 'hello';"
expect(noTabIndentation.test(line, 1)).toEqual([])
expect(noTabs.test(line, 1)).toEqual([])
})
it('should return an array with a single diagnostic when the line is indented with a tab', () => {
const line = "\t%put 'hello';"
expect(noTabIndentation.test(line, 1)).toEqual([
expect(noTabs.test(line, 1)).toEqual([
{
message: 'Line is indented with a tab',
lineNumber: 1,

View File

@@ -2,29 +2,34 @@ import { LintConfig } from '../../types'
import { LineLintRule } from '../../types/LintRule'
import { LintRuleType } from '../../types/LintRuleType'
import { Severity } from '../../types/Severity'
import { getIndicesOf } from '../../utils'
const name = 'noTabs'
const alias = 'noTabIndentation'
const description = 'Disallow indenting with tabs.'
const message = 'Line is indented with a tab'
const message = 'Line contains tab indentation'
const test = (value: string, lineNumber: number, config?: LintConfig) => {
const severity = config?.severityLevel[name] || Severity.Warning
if (!value.startsWith('\t')) return []
return [
{
message,
lineNumber,
startColumnNumber: 1,
endColumnNumber: 1,
severity
}
]
const severity =
config?.severityLevel[name] ||
config?.severityLevel[alias] ||
Severity.Warning
const indices = getIndicesOf('\t', value)
return indices.map((index) => ({
message,
lineNumber,
startColumnNumber: index + 1,
endColumnNumber: index + 2,
severity
}))
}
/**
* Lint rule that checks if a given line of text is indented with a tab.
*/
export const noTabIndentation: LineLintRule = {
export const noTabs: LineLintRule = {
type: LintRuleType.Line,
name,
description,

View File

@@ -10,7 +10,7 @@ import {
indentationMultiple,
maxLineLength,
noEncodedPasswords,
noTabIndentation,
noTabs,
noTrailingSpaces
} from '../rules/line'
import { lowerCaseFileNames, noSpacesInFileNames } from '../rules/path'
@@ -60,8 +60,8 @@ export class LintConfig {
this.lineLintRules.push(noEncodedPasswords)
}
if (json?.noTabIndentation) {
this.lineLintRules.push(noTabIndentation)
if (json?.noTabs || json?.noTabIndentation) {
this.lineLintRules.push(noTabs)
}
if (json?.maxLineLength) {

26
src/utils/getIndicesOf.ts Normal file
View File

@@ -0,0 +1,26 @@
export const getIndicesOf = (
searchStr: string,
str: string,
caseSensitive: boolean = true
) => {
const searchStrLen = searchStr.length
if (searchStrLen === 0) {
return []
}
let startIndex = 0,
index,
indices = []
if (!caseSensitive) {
str = str.toLowerCase()
searchStr = searchStr.toLowerCase()
}
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
indices.push(index)
startIndex = index + searchStrLen
}
return indices
}

View File

@@ -4,3 +4,4 @@ export * from './getProjectRoot'
export * from './isIgnored'
export * from './listSasFiles'
export * from './splitText'
export * from './getIndicesOf'