1
0
mirror of https://github.com/sasjs/lint.git synced 2025-12-10 17:34:36 +00:00

feat(format-diagnostics): add diagnostic information to format result payload

This commit is contained in:
Krishna Acondy
2021-05-04 08:27:06 +01:00
parent 984915fe47
commit dce9453680
5 changed files with 72 additions and 6 deletions

View File

@@ -1,4 +1,6 @@
import { createFile, readFile } from '@sasjs/utils/file'
import { lintFile } from '../lint'
import { FormatResult } from '../types'
import { LintConfig } from '../types/LintConfig'
import { getLintConfig } from '../utils/getLintConfig'
import { processText } from './shared'
@@ -7,16 +9,37 @@ import { processText } from './shared'
* Applies automatic formatting to the file at the given path.
* @param {string} filePath - the path to the file to be formatted.
* @param {LintConfig} configuration - an optional configuration. When not passed in, this is read from the .sasjslint file.
* @returns {Promise<void>} Resolves successfully when the file has been formatted.
* @returns {Promise<FormatResult>} Resolves successfully when the file has been formatted.
*/
export const formatFile = async (
filePath: string,
configuration?: LintConfig
) => {
): Promise<FormatResult> => {
const config = configuration || (await getLintConfig())
const diagnosticsBeforeFormat = await lintFile(filePath)
const diagnosticsCountBeforeFormat = diagnosticsBeforeFormat.length
const text = await readFile(filePath)
const formattedText = processText(text, config)
await createFile(filePath, formattedText)
const diagnosticsAfterFormat = await lintFile(filePath)
const diagnosticsCountAfterFormat = diagnosticsAfterFormat.length
const fixedDiagnosticsCount =
diagnosticsCountBeforeFormat - diagnosticsCountAfterFormat
const updatedFilePaths: string[] = []
if (fixedDiagnosticsCount) {
updatedFilePaths.push(filePath)
}
return {
updatedFilePaths,
fixedDiagnosticsCount,
unfixedDiagnostics: diagnosticsAfterFormat
}
}

View File

@@ -1,5 +1,7 @@
import { listSubFoldersInFolder } from '@sasjs/utils/file'
import path from 'path'
import { lintFolder } from '../lint'
import { FormatResult } from '../types'
import { LintConfig } from '../types/LintConfig'
import { asyncForEach } from '../utils/asyncForEach'
import { getLintConfig } from '../utils/getLintConfig'
@@ -19,13 +21,18 @@ const excludeFolders = [
* Automatically formats all SAS files in the folder at the given path.
* @param {string} folderPath - the path to the folder to be formatted.
* @param {LintConfig} configuration - an optional configuration. When not passed in, this is read from the .sasjslint file.
* @returns {Promise<void>} Resolves successfully when all SAS files in the given folder have been formatted.
* @returns {Promise<FormatResult>} Resolves successfully when all SAS files in the given folder have been formatted.
*/
export const formatFolder = async (
folderPath: string,
configuration?: LintConfig
) => {
): Promise<FormatResult> => {
const config = configuration || (await getLintConfig())
const diagnosticsBeforeFormat = await lintFolder(folderPath)
const diagnosticsCountBeforeFormat = Array.from(
diagnosticsBeforeFormat.values()
).reduce((a, b) => a + b.length, 0)
const fileNames = await listSasFiles(folderPath)
await asyncForEach(fileNames, async (fileName) => {
const filePath = path.join(folderPath, fileName)
@@ -39,4 +46,29 @@ export const formatFolder = async (
await asyncForEach(subFolders, async (subFolder) => {
await formatFolder(path.join(folderPath, subFolder), config)
})
const diagnosticsAfterFormat = await lintFolder(folderPath)
const diagnosticsCountAfterFormat = Array.from(
diagnosticsAfterFormat.values()
).reduce((a, b) => a + b.length, 0)
const fixedDiagnosticsCount =
diagnosticsCountBeforeFormat - diagnosticsCountAfterFormat
const updatedFilePaths: string[] = []
Array.from(diagnosticsBeforeFormat.keys()).forEach((filePath) => {
const diagnosticsBefore = diagnosticsBeforeFormat.get(filePath) || []
const diagnosticsAfter = diagnosticsAfterFormat.get(filePath) || []
if (diagnosticsBefore.length !== diagnosticsAfter.length) {
updatedFilePaths.push(filePath)
}
})
return {
updatedFilePaths,
fixedDiagnosticsCount,
unfixedDiagnostics: diagnosticsAfterFormat
}
}

View File

@@ -1,15 +1,18 @@
import { lintFolder } from '../lint/lintFolder'
import { FormatResult } from '../types/FormatResult'
import { getProjectRoot } from '../utils/getProjectRoot'
import { formatFolder } from './formatFolder'
/**
* Automatically formats all SAS files in the current project.
* @returns {Promise<void>} Resolves successfully when all SAS files in the current project have been formatted.
* @returns {Promise<FormatResult>} Resolves successfully when all SAS files in the current project have been formatted.
*/
export const formatProject = async () => {
export const formatProject = async (): Promise<FormatResult> => {
const projectRoot =
(await getProjectRoot()) || process.projectDir || process.currentDir
if (!projectRoot) {
throw new Error('SASjs Project Root was not found.')
}
return await formatFolder(projectRoot)
}

View File

@@ -0,0 +1,7 @@
import { Diagnostic } from './Diagnostic'
export interface FormatResult {
updatedFilePaths: string[]
fixedDiagnosticsCount: number
unfixedDiagnostics: Map<string, Diagnostic[]> | Diagnostic[]
}

View File

@@ -1,4 +1,5 @@
export * from './Diagnostic'
export * from './FormatResult'
export * from './LintConfig'
export * from './LintRule'
export * from './LintRuleType'