mirror of
https://github.com/sasjs/lint.git
synced 2025-12-10 17:34:36 +00:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a1ebb51230 | ||
| 496e0bc8fc | |||
|
|
f8b15c7d4d | ||
|
|
74e8df2a7b | ||
|
|
12e4eeb287 | ||
| bc7a7a7645 | |||
|
|
40e90995f8 | ||
|
|
80d0b39637 | ||
| c3a466f485 | |||
| 38656e9e89 | |||
| 386d0f5ff3 |
49
README.md
49
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,
|
||||
@@ -122,6 +123,21 @@ 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).
|
||||
|
||||
- Default: "off"
|
||||
- Severity: WARNING
|
||||
|
||||
Example (to enforce unix line endings):
|
||||
|
||||
```json
|
||||
{
|
||||
"lineEndings": "lf"
|
||||
}
|
||||
```
|
||||
|
||||
### 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.
|
||||
@@ -135,12 +151,12 @@ Datalines can be very wide, so to avoid the need to increase `maxLineLength` for
|
||||
|
||||
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,9 +165,9 @@ 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
|
||||
|
||||
@@ -164,9 +180,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,8 +197,8 @@ 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
|
||||
|
||||
@@ -247,11 +263,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.
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"noSpacesInFileNames": true,
|
||||
"noTabs": true,
|
||||
"noTrailingSpaces": true,
|
||||
"lineEndings": "lf",
|
||||
"lineEndings": "off",
|
||||
"strictMacroDefinition": true,
|
||||
"ignoreList": ["sajsbuild", "sasjsresults"]
|
||||
},
|
||||
@@ -182,9 +182,10 @@
|
||||
"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",
|
||||
"default": "off",
|
||||
"examples": ["lf", "crlf"]
|
||||
},
|
||||
"strictMacroDefinition": {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
export enum LineEndings {
|
||||
LF = 'lf',
|
||||
CRLF = 'crlf'
|
||||
CRLF = 'crlf',
|
||||
OFF = 'off'
|
||||
}
|
||||
|
||||
@@ -168,7 +168,8 @@ describe('LintConfig', () => {
|
||||
hasMacroNameInMend: true,
|
||||
noNestedMacros: true,
|
||||
hasMacroParentheses: true,
|
||||
noGremlins: true
|
||||
noGremlins: true,
|
||||
lineEndings: 'lf'
|
||||
})
|
||||
|
||||
expect(config).toBeTruthy()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ import path from 'path'
|
||||
import { LintConfig } from '../types/LintConfig'
|
||||
import { readFile } from '@sasjs/utils/file'
|
||||
import { getProjectRoot } from './getProjectRoot'
|
||||
import { LineEndings } from '../types/LineEndings'
|
||||
|
||||
export const getDefaultHeader = () =>
|
||||
`/**{lineEnding} @file{lineEnding} @brief <Your brief here>{lineEnding} <h4> SAS Macros </h4>{lineEnding}**/`
|
||||
@@ -10,6 +11,7 @@ export const getDefaultHeader = () =>
|
||||
* Default configuration that is used when a .sasjslint file is not found
|
||||
*/
|
||||
export const DefaultLintConfiguration = {
|
||||
lineEndings: LineEndings.OFF,
|
||||
noTrailingSpaces: true,
|
||||
noEncodedPasswords: true,
|
||||
hasDoxygenHeader: true,
|
||||
|
||||
Reference in New Issue
Block a user