diff --git a/README.md b/README.md index 33b9443..d4ac942 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Configuration is via a `.sasjslint` file with the following structure (these are "hasMacroParentheses": true, "ignoreList": ["sajsbuild/", "sasjsresults/"], "indentationMultiple": 2, + "lineEndings": "off", "lowerCaseFileNames": true, "maxDataLineLength": 80, "maxHeaderLineLength": 80, @@ -50,14 +51,14 @@ For more details, and the default state, see the description of each rule below. ### allowedGremlins -An array of hex codes that represents allowed gremlins (invisible / undesirable characters). To allow all gremlins, you can also set the `noGremlins` rule to `false`. +An array of hex codes that represents allowed gremlins (invisible / undesirable characters). To allow all gremlins, you can also set the `noGremlins` rule to `false`. Example: ```json { - "noGremlins": true, - "allowedGremlins": ["0x0080", "0x3000"] + "noGremlins": true, + "allowedGremlins": ["0x0080", "0x3000"] } ``` @@ -122,6 +123,12 @@ This will check each line to ensure that the count of leading spaces can be divi - Default: 2 - Severity: WARNING +### lineEndings + +This setting ensures the line endings in a file to conform the configured type. Possible values are `lf`, `crlf` and `off` (off means rule is set to be off). If the value is missing, null or undefined then the check would also be switched off (no default applied). + +- Severity: WARNING + ### lowerCaseFileNames On *nix systems, it is imperative that autocall macros are in lowercase. When sharing code between windows and *nix systems, the difference in case sensitivity can also be a cause of lost developer time. For this reason, we recommend that sas filenames are always lowercase. @@ -131,16 +138,16 @@ On *nix systems, it is imperative that autocall macros are in lowercase. When sh ### maxDataLineLength -Datalines can be very wide, so to avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the data records only. On a related note, as a developer, you should also be aware that code submitted in batch may have a default line length limit which is lower than you expect. See this [usage note](https://support.sas.com/kb/15/883.html) (and thanks to [sasutils for reminding us](https://github.com/sasjs/lint/issues/47#issuecomment-1064340104)). +Datalines can be very wide, so to avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the data records only. On a related note, as a developer, you should also be aware that code submitted in batch may have a default line length limit which is lower than you expect. See this [usage note](https://support.sas.com/kb/15/883.html) (and thanks to [sasutils for reminding us](https://github.com/sasjs/lint/issues/47#issuecomment-1064340104)). This feature will work for the following statements: -* cards -* cards4 -* datalines -* datalines4 -* parmcards -* parmcards4 +- cards +- cards4 +- datalines +- datalines4 +- parmcards +- parmcards4 The `maxDataLineLength` setting is always the _higher_ of `maxDataLineLength` and `maxLineLength` (if you set a lower number, it is ignored). @@ -149,13 +156,13 @@ The `maxDataLineLength` setting is always the _higher_ of `maxDataLineLength` an See also: - * [hasDoxygenHeader](#hasdoxygenheader) - * [maxHeaderLineLength](#maxheaderlinelength) - * [maxLineLength](#maxlinelength) +- [hasDoxygenHeader](#hasdoxygenheader) +- [maxHeaderLineLength](#maxheaderlinelength) +- [maxLineLength](#maxlinelength) ### maxHeaderLineLength -In a program header it can be necessary to insert items such as URLs or markdown tables, that cannot be split over multiple lines. To avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the header section only. +In a program header it can be necessary to insert items such as URLs or markdown tables, that cannot be split over multiple lines. To avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the header section only. The `maxHeaderLineLength` setting is always the _higher_ of `maxHeaderLineLength` and `maxLineLength` (if you set a lower number, it is ignored). @@ -164,9 +171,9 @@ The `maxHeaderLineLength` setting is always the _higher_ of `maxHeaderLineLength See also: - * [hasDoxygenHeader](#hasdoxygenheader) - * [maxDataLineLength](#maxdatalinelength) - * [maxLineLength](#maxlinelength) +- [hasDoxygenHeader](#hasdoxygenheader) +- [maxDataLineLength](#maxdatalinelength) +- [maxLineLength](#maxlinelength) ### maxLineLength @@ -181,12 +188,12 @@ We strongly recommend a line length limit, and set the bar at 80. To turn this f See also: - * [maxDataLineLength](#maxdatalinelength) - * [maxHeaderLineLength](#maxheaderlinelength) +- [maxDataLineLength](#maxdatalinelength) +- [maxHeaderLineLength](#maxheaderlinelength) ### noGremlins -Capture zero-width whitespace and other non-standard characters. The logic is borrowed from the [VSCode Gremlins Extension](https://github.com/nhoizey/vscode-gremlins) - if you are looking for more advanced gremlin zapping capabilities, we highly recommend to use their extension instead. +Capture zero-width whitespace and other non-standard characters. The logic is borrowed from the [VSCode Gremlins Extension](https://github.com/nhoizey/vscode-gremlins) - if you are looking for more advanced gremlin zapping capabilities, we highly recommend to use their extension instead. The list of characters can be found in this file: [https://github.com/sasjs/lint/blob/main/src/utils/gremlinCharacters.ts](https://github.com/sasjs/lint/blob/main/src/utils/gremlinCharacters.ts) @@ -247,11 +254,6 @@ This setting allows the default severity to be adjusted. This is helpful when ru - "warn" - show warning in the log (doesn’t affect exit code) - "error" - show error in the log (exit code is 1 when triggered) -## Upcoming Linting Rules: - -- `noGremlins` -> identifies all invisible characters, other than spaces / tabs / line endings. If you really need that bell character, use a hex literal! -- `lineEndings` -> set a standard line ending, such as LF or CRLF - # SAS Formatter A formatter will automatically apply rules when you hit SAVE, which can save a LOT of time. diff --git a/sasjslint-schema.json b/sasjslint-schema.json index d533a3b..0736bbb 100644 --- a/sasjslint-schema.json +++ b/sasjslint-schema.json @@ -182,6 +182,7 @@ "lineEndings": { "$id": "#/properties/lineEndings", "type": "string", + "enum": ["lf", "crlf", "off"], "title": "lineEndings", "description": "Enforces the configured terminating character for each line. Shows a warning when incorrect line endings are present.", "default": "lf", diff --git a/src/types/LineEndings.ts b/src/types/LineEndings.ts index e40f19b..aa17edd 100644 --- a/src/types/LineEndings.ts +++ b/src/types/LineEndings.ts @@ -1,4 +1,5 @@ export enum LineEndings { LF = 'lf', - CRLF = 'crlf' + CRLF = 'crlf', + OFF = 'off' } diff --git a/src/types/LintConfig.spec.ts b/src/types/LintConfig.spec.ts index 5586f22..c7abef8 100644 --- a/src/types/LintConfig.spec.ts +++ b/src/types/LintConfig.spec.ts @@ -168,7 +168,8 @@ describe('LintConfig', () => { hasMacroNameInMend: true, noNestedMacros: true, hasMacroParentheses: true, - noGremlins: true + noGremlins: true, + lineEndings: 'lf' }) expect(config).toBeTruthy() diff --git a/src/types/LintConfig.ts b/src/types/LintConfig.ts index 9a0800e..e77f7c5 100644 --- a/src/types/LintConfig.ts +++ b/src/types/LintConfig.ts @@ -82,8 +82,7 @@ export class LintConfig { } } - this.fileLintRules.push(lineEndings) - if (json?.lineEndings) { + if (json?.lineEndings && json.lineEndings !== LineEndings.OFF) { if ( json.lineEndings !== LineEndings.LF && json.lineEndings !== LineEndings.CRLF @@ -92,6 +91,7 @@ export class LintConfig { `Invalid value for lineEndings: can be ${LineEndings.LF} or ${LineEndings.CRLF}` ) } + this.fileLintRules.push(lineEndings) this.lineEndings = json.lineEndings } diff --git a/src/utils/getLintConfig.spec.ts b/src/utils/getLintConfig.spec.ts index 7843ad8..82da01d 100644 --- a/src/utils/getLintConfig.spec.ts +++ b/src/utils/getLintConfig.spec.ts @@ -2,7 +2,7 @@ import * as fileModule from '@sasjs/utils/file' import { LintConfig } from '../types/LintConfig' import { getLintConfig } from './getLintConfig' -const expectedFileLintRulesCount = 6 +const expectedFileLintRulesCount = 5 const expectedLineLintRulesCount = 6 const expectedPathLintRulesCount = 2