1
0
mirror of https://github.com/sasjs/lint.git synced 2025-12-11 01:44:36 +00:00

Compare commits

..

11 Commits

Author SHA1 Message Date
Allan Bowe
94d9d246eb Merge pull request #71 from sasjs/doxygen-header-enforces-double-asterisks
fix: doxygen header enforces double asterisks
2021-06-15 10:41:18 +03:00
Saad Jutt
95502647e8 fix: doxygen header requires to only start with double asterisks 2021-06-14 18:16:05 +05:00
Saad Jutt
be9d5b8e68 fix: doxygen header enforces double asterisks 2021-06-14 18:06:37 +05:00
Krishna Acondy
c2d368327b Merge pull request #68 from sasjs/dependabot/npm_and_yarn/sasjs/utils-2.19.0
chore(deps): bump @sasjs/utils from 2.18.0 to 2.19.0
2021-06-10 11:39:14 +01:00
dependabot[bot]
94a693e57d chore(deps): bump @sasjs/utils from 2.18.0 to 2.19.0
Bumps [@sasjs/utils](https://github.com/sasjs/utils) from 2.18.0 to 2.19.0.
- [Release notes](https://github.com/sasjs/utils/releases)
- [Commits](https://github.com/sasjs/utils/compare/v2.18.0...v2.19.0)

---
updated-dependencies:
- dependency-name: "@sasjs/utils"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-10 06:31:08 +00:00
Krishna Acondy
fec3372f92 Merge pull request #66 from sasjs/dependabot/npm_and_yarn/types/node-15.12.2
chore(deps-dev): bump @types/node from 15.0.2 to 15.12.2
2021-06-09 08:43:14 +01:00
dependabot[bot]
d5b38373d4 chore(deps-dev): bump @types/node from 15.0.2 to 15.12.2
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 15.0.2 to 15.12.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-09 07:41:42 +00:00
Krishna Acondy
21114e0a6f Merge pull request #59 from sasjs/dependabot/npm_and_yarn/typescript-4.3.2
chore(deps-dev): bump typescript from 4.2.4 to 4.3.2
2021-06-09 08:39:09 +01:00
dependabot[bot]
b52b3ac42f chore(deps-dev): bump typescript from 4.2.4 to 4.3.2
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.2.4 to 4.3.2.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v4.2.4...v4.3.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-09 07:24:53 +00:00
Krishna Acondy
7f4c389468 Merge pull request #67 from sasjs/dependabot/npm_and_yarn/sasjs/utils-2.18.0
chore(deps): bump @sasjs/utils from 2.12.0 to 2.18.0
2021-06-09 08:22:30 +01:00
dependabot[bot]
1fd4cd7ddc chore(deps): bump @sasjs/utils from 2.12.0 to 2.18.0
Bumps [@sasjs/utils](https://github.com/sasjs/utils) from 2.12.0 to 2.18.0.
- [Release notes](https://github.com/sasjs/utils/releases)
- [Commits](https://github.com/sasjs/utils/compare/v2.12.0...v2.18.0)

---
updated-dependencies:
- dependency-name: "@sasjs/utils"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-09 07:19:50 +00:00
4 changed files with 134 additions and 20 deletions

65
package-lock.json generated
View File

@@ -648,13 +648,15 @@
}
},
"@sasjs/utils": {
"version": "2.12.0",
"resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.12.0.tgz",
"integrity": "sha512-OnC/7R+nGI8tlSPCcI7fPyD7T97B+McnkXT0IuAYDNGbfwRPuseWq0I1h+kbAWThGT67H4hnp61N0qr8LkpHZQ==",
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.19.0.tgz",
"integrity": "sha512-b/NlIvTaISIFsllucetBwJjFUiM13I+bS06WtK3WN0G1EXzVrjJt+eXqgkQZbIZfoaeKo5oRigOtZUXth65duQ==",
"requires": {
"@types/prompts": "^2.0.13",
"chalk": "^4.1.1",
"cli-table": "^0.3.6",
"consola": "^2.15.0",
"fs-extra": "^10.0.0",
"prompts": "^2.4.1",
"valid-url": "^1.0.9"
},
@@ -782,10 +784,9 @@
}
},
"@types/node": {
"version": "15.0.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz",
"integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==",
"dev": true
"version": "15.12.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
"integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww=="
},
"@types/normalize-package-data": {
"version": "2.4.0",
@@ -799,6 +800,14 @@
"integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==",
"dev": true
},
"@types/prompts": {
"version": "2.0.13",
"resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.0.13.tgz",
"integrity": "sha512-jwMOIGy49VruR/gYehhJYgpVzB+EVpEE7t7j9m1oTo4HMpOe7KmsyqdBuoxAzA5B4caUgx0cKrWr7wUEqMXJ7Q==",
"requires": {
"@types/node": "*"
}
},
"@types/stack-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz",
@@ -1938,6 +1947,23 @@
"map-cache": "^0.2.2"
}
},
"fs-extra": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"dependencies": {
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
}
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -2022,8 +2048,7 @@
"graceful-fs": {
"version": "4.2.6",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
"dev": true
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
},
"growly": {
"version": "1.3.0",
@@ -3055,6 +3080,22 @@
"minimist": "^1.2.5"
}
},
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
},
"dependencies": {
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
}
}
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
@@ -4620,9 +4661,9 @@
}
},
"typescript": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
"integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==",
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz",
"integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==",
"dev": true
},
"union-value": {

View File

@@ -38,13 +38,13 @@
"homepage": "https://github.com/sasjs/lint#readme",
"devDependencies": {
"@types/jest": "^26.0.23",
"@types/node": "^15.0.2",
"@types/node": "^15.12.2",
"jest": "^26.6.3",
"rimraf": "^3.0.2",
"ts-jest": "^26.5.6",
"typescript": "^4.2.4"
"typescript": "^4.3.2"
},
"dependencies": {
"@sasjs/utils": "^2.12.0"
"@sasjs/utils": "^2.19.0"
}
}

View File

@@ -17,6 +17,32 @@ describe('hasDoxygenHeader - test', () => {
expect(hasDoxygenHeader.test(content)).toEqual([])
})
it('should return an empty array when the file starts with a doxygen header', () => {
const content = `
/*
@file
@brief Returns an unused libref
*/
%macro mf_getuniquelibref(prefix=mclib,maxtries=1000);
%local x libref;
%let x={SAS002};
%do x=0 %to &maxtries;`
expect(hasDoxygenHeader.test(content)).toEqual([
{
message:
'File not following Doxygen header style, use double asterisks',
lineNumber: 4,
startColumnNumber: 1,
endColumnNumber: 1,
severity: Severity.Warning
}
])
})
it('should return an array with a single diagnostic when the file has no header', () => {
const content = `
%macro mf_getuniquelibref(prefix=mclib,maxtries=1000);
@@ -86,7 +112,33 @@ describe('hasDoxygenHeader - fix', () => {
expect(hasDoxygenHeader.fix!(content)).toEqual(content)
})
it('should should add a doxygen header if not present', () => {
it('should update single asterisks to double if a doxygen header is already present', () => {
const contentOriginal = `
/*
@file
@brief Returns an unused libref
*/
%macro mf_getuniquelibref(prefix=mclib,maxtries=1000);
%local x libref;
%let x={SAS002};
%do x=0 %to &maxtries;`
const contentExpected = `
/**
@file
@brief Returns an unused libref
*/
%macro mf_getuniquelibref(prefix=mclib,maxtries=1000);
%local x libref;
%let x={SAS002};
%do x=0 %to &maxtries;`
expect(hasDoxygenHeader.fix!(contentOriginal)).toEqual(contentExpected)
})
it('should add a doxygen header if not present', () => {
const content = `%macro mf_getuniquelibref(prefix=mclib,maxtries=1000);
%local x libref;
%let x={SAS002};

View File

@@ -10,10 +10,28 @@ const name = 'hasDoxygenHeader'
const description =
'Enforce the presence of a Doxygen header at the start of each file.'
const message = 'File missing Doxygen header'
const test = (value: string) => {
const messageForSingleAsterisk =
'File not following Doxygen header style, use double asterisks'
const test = (value: string, config?: LintConfig) => {
const lineEnding = config?.lineEndings === LineEndings.CRLF ? '\r\n' : '\n'
try {
const hasFileHeader = value.trimStart().startsWith('/*')
const hasFileHeader = value.trimStart().startsWith('/**')
if (hasFileHeader) return []
const hasFileHeaderWithSingleAsterisk = value.trimStart().startsWith('/*')
if (hasFileHeaderWithSingleAsterisk)
return [
{
message: messageForSingleAsterisk,
lineNumber:
(value.split('/*')![0]!.match(new RegExp(lineEnding, 'g')) ?? [])
.length + 1,
startColumnNumber: 1,
endColumnNumber: 1,
severity: Severity.Warning
}
]
return [
{
message,
@@ -37,9 +55,12 @@ const test = (value: string) => {
}
const fix = (value: string, config?: LintConfig): string => {
if (test(value).length === 0) {
const result = test(value, config)
if (result.length === 0) {
return value
}
} else if (result[0].message == messageForSingleAsterisk)
return value.replace('/*', '/**')
const lineEndingConfig = config?.lineEndings || LineEndings.LF
const lineEnding = lineEndingConfig === LineEndings.LF ? '\n' : '\r\n'