mirror of
https://github.com/sasjs/lint.git
synced 2025-12-10 17:34:36 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
04cfa454f8 | ||
| 2cb73da0eb | |||
|
|
22cc42446c | ||
|
|
0fe79273e0 | ||
|
|
3d7f88aacb | ||
|
|
1677eca957 |
13
README.md
13
README.md
@@ -23,7 +23,7 @@ Configuration is via a `.sasjslint` file with the following structure (these are
|
||||
"hasDoxygenHeader": true,
|
||||
"hasMacroNameInMend": true,
|
||||
"hasMacroParentheses": true,
|
||||
"ignoreList": ["sajsbuild/", "sasjsresults/"],
|
||||
"ignoreList": ["sasjsbuild/", "sasjsresults/"],
|
||||
"indentationMultiple": 2,
|
||||
"lineEndings": "off",
|
||||
"lowerCaseFileNames": true,
|
||||
@@ -49,9 +49,11 @@ Each setting can have three states:
|
||||
|
||||
For more details, and the default state, see the description of each rule below. It is also possible to change whether a rule returns ERROR or WARN using the `severityLevels` object.
|
||||
|
||||
Configuring a non-zero return code (ERROR) is helpful when running `sasjs lint` as part of a git pre-commit hook. An example is available [here](https://github.com/sasjs/template_jobs/blob/main/.git-hooks/pre-commit).
|
||||
|
||||
### 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`. The full gremlin list is [here](https://github.com/sasjs/lint/blob/main/src/utils/gremlinCharacters.ts).
|
||||
|
||||
Example:
|
||||
|
||||
@@ -228,6 +230,13 @@ In addition, when such files are used in URLs, they are often padded with a mess
|
||||
- Default: true
|
||||
- Severity: WARNING
|
||||
|
||||
As an alternative (or in addition) to using a lint rule, you can also set the following in your `.gitignore` file to prevent files with spaces from being committed:
|
||||
|
||||
```
|
||||
# prevent files/folders with spaces
|
||||
**\ **
|
||||
```
|
||||
|
||||
### noTabs
|
||||
|
||||
Whilst there are some arguments for using tabs (such as the ability to set your own indentation width, and to reduce character count) there are many, many, many developers who think otherwise. We're in that camp. Sorry (not sorry).
|
||||
|
||||
@@ -8,11 +8,12 @@ import { formatFolder } from './formatFolder'
|
||||
* @returns {Promise<FormatResult>} Resolves successfully when all SAS files in the current project have been formatted.
|
||||
*/
|
||||
export const formatProject = async (): Promise<FormatResult> => {
|
||||
const projectRoot =
|
||||
(await getProjectRoot()) || process.projectDir || process.currentDir
|
||||
const projectRoot = (await getProjectRoot()) || process.currentDir
|
||||
if (!projectRoot) {
|
||||
throw new Error('SASjs Project Root was not found.')
|
||||
}
|
||||
|
||||
console.info(`Formatting all .sas files under ${projectRoot}`)
|
||||
|
||||
return await formatFolder(projectRoot)
|
||||
}
|
||||
|
||||
@@ -6,10 +6,12 @@ import { lintFolder } from './lintFolder'
|
||||
* @returns {Promise<Map<string, Diagnostic[]>>} Resolves with a map with array of diagnostic objects, each containing a warning, line number and column number, and grouped by file path.
|
||||
*/
|
||||
export const lintProject = async () => {
|
||||
const projectRoot =
|
||||
(await getProjectRoot()) || process.projectDir || process.currentDir
|
||||
const projectRoot = (await getProjectRoot()) || process.currentDir
|
||||
if (!projectRoot) {
|
||||
throw new Error('SASjs Project Root was not found.')
|
||||
}
|
||||
|
||||
console.info(`Linting all .sas files under ${projectRoot}`)
|
||||
|
||||
return await lintFolder(projectRoot)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import path from 'path'
|
||||
import os from 'os'
|
||||
import { LintConfig } from '../types/LintConfig'
|
||||
import { readFile } from '@sasjs/utils/file'
|
||||
import { getProjectRoot } from './getProjectRoot'
|
||||
@@ -31,14 +32,15 @@ export const DefaultLintConfiguration = {
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the config from the .sasjslint file and creates a LintConfig object.
|
||||
* Fetches the config from the .sasjslint file (at project root or home directory) and creates a LintConfig object.
|
||||
* Returns the default configuration when a .sasjslint file is unavailable.
|
||||
* @returns {Promise<LintConfig>} resolves with an object representing the current lint configuration.
|
||||
*/
|
||||
export async function getLintConfig(): Promise<LintConfig> {
|
||||
const projectRoot = await getProjectRoot()
|
||||
const lintFileLocation = projectRoot || os.homedir()
|
||||
const configuration = await readFile(
|
||||
path.join(projectRoot, '.sasjslint')
|
||||
path.join(lintFileLocation, '.sasjslint')
|
||||
).catch((_) => {
|
||||
return JSON.stringify(DefaultLintConfiguration)
|
||||
})
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import path from 'path'
|
||||
import os from 'os'
|
||||
import { fileExists } from '@sasjs/utils/file'
|
||||
|
||||
/**
|
||||
@@ -11,10 +12,11 @@ export async function getProjectRoot(): Promise<string> {
|
||||
let rootFound = false
|
||||
let i = 1
|
||||
let currentLocation = process.cwd()
|
||||
const homeDir = os.homedir()
|
||||
|
||||
const maxLevels = currentLocation.split(path.sep).length
|
||||
|
||||
while (i <= maxLevels && !rootFound) {
|
||||
while (i <= maxLevels && !rootFound && currentLocation !== homeDir) {
|
||||
const isRoot = await fileExists(path.join(currentLocation, '.sasjslint'))
|
||||
|
||||
if (isRoot) {
|
||||
|
||||
Reference in New Issue
Block a user