@sasjs/lint 2.4.0 → 2.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.all-contributorsrc +11 -1
- package/.github/dependabot.yml +1 -1
- package/.github/reviewer-lottery.yml +0 -2
- package/.github/workflows/assign-reviewer.yml +2 -2
- package/README.md +41 -37
- package/format/formatFile.d.ts +1 -1
- package/format/formatFile.js +24 -72
- package/format/formatFile.js.map +1 -1
- package/format/formatFolder.d.ts +1 -1
- package/format/formatFolder.js +36 -104
- package/format/formatFolder.js.map +1 -1
- package/format/formatProject.js +10 -45
- package/format/formatProject.js.map +1 -1
- package/format/formatText.d.ts +1 -1
- package/format/formatText.js +6 -46
- package/format/formatText.js.map +1 -1
- package/format/index.js +5 -1
- package/format/index.js.map +1 -1
- package/format/shared.js +16 -16
- package/format/shared.js.map +1 -1
- package/formatExample.js +10 -6
- package/formatExample.js.map +1 -1
- package/index.js +5 -1
- package/index.js.map +1 -1
- package/lint/index.js +5 -1
- package/lint/index.js.map +1 -1
- package/lint/lintFile.d.ts +1 -1
- package/lint/lintFile.js +12 -76
- package/lint/lintFile.js.map +1 -1
- package/lint/lintFolder.d.ts +1 -1
- package/lint/lintFolder.js +23 -114
- package/lint/lintFolder.js.map +1 -1
- package/lint/lintProject.js +10 -45
- package/lint/lintProject.js.map +1 -1
- package/lint/lintText.js +6 -40
- package/lint/lintText.js.map +1 -1
- package/lint/shared.js +24 -45
- package/lint/shared.js.map +1 -1
- package/lintExample.js +45 -5
- package/lintExample.js.map +1 -1
- package/package.json +3 -3
- package/rules/file/hasDoxygenHeader.js +29 -29
- package/rules/file/hasDoxygenHeader.js.map +1 -1
- package/rules/file/hasMacroNameInMend.js +59 -59
- package/rules/file/hasMacroNameInMend.js.map +1 -1
- package/rules/file/hasMacroParentheses.js +25 -27
- package/rules/file/hasMacroParentheses.js.map +1 -1
- package/rules/file/hasRequiredMacroOptions.js +20 -20
- package/rules/file/hasRequiredMacroOptions.js.map +1 -1
- package/rules/file/lineEndings.js +27 -27
- package/rules/file/lineEndings.js.map +1 -1
- package/rules/file/noNestedMacros.js +23 -23
- package/rules/file/noNestedMacros.js.map +1 -1
- package/rules/file/strictMacroDefinition.js +52 -57
- package/rules/file/strictMacroDefinition.js.map +1 -1
- package/rules/line/indentationMultiple.js +16 -16
- package/rules/line/indentationMultiple.js.map +1 -1
- package/rules/line/maxLineLength.js +16 -16
- package/rules/line/maxLineLength.js.map +1 -1
- package/rules/line/noEncodedPasswords.js +18 -18
- package/rules/line/noEncodedPasswords.js.map +1 -1
- package/rules/line/noGremlins.js +29 -69
- package/rules/line/noGremlins.js.map +1 -1
- package/rules/line/noTabs.js +19 -19
- package/rules/line/noTabs.js.map +1 -1
- package/rules/line/noTrailingSpaces.js +16 -16
- package/rules/line/noTrailingSpaces.js.map +1 -1
- package/rules/path/lowerCaseFileNames.js +15 -15
- package/rules/path/lowerCaseFileNames.js.map +1 -1
- package/rules/path/noSpacesInFileNames.js +15 -15
- package/rules/path/noSpacesInFileNames.js.map +1 -1
- package/types/LintConfig.js +28 -68
- package/types/LintConfig.js.map +1 -1
- package/types/index.js +5 -1
- package/types/index.js.map +1 -1
- package/utils/asyncForEach.js +4 -46
- package/utils/asyncForEach.js.map +1 -1
- package/utils/getColumnNumber.js +3 -3
- package/utils/getColumnNumber.js.map +1 -1
- package/utils/getDataSectionsDetail.js +16 -38
- package/utils/getDataSectionsDetail.js.map +1 -1
- package/utils/getHeaderLinesCount.js +8 -30
- package/utils/getHeaderLinesCount.js.map +1 -1
- package/utils/getIndicesOf.js +3 -4
- package/utils/getIndicesOf.js.map +1 -1
- package/utils/getLintConfig.js +14 -52
- package/utils/getLintConfig.js.map +1 -1
- package/utils/getProjectRoot.js +22 -59
- package/utils/getProjectRoot.js.map +1 -1
- package/utils/index.js +5 -1
- package/utils/index.js.map +1 -1
- package/utils/isIgnored.d.ts +1 -1
- package/utils/isIgnored.js +20 -67
- package/utils/isIgnored.js.map +1 -1
- package/utils/listSasFiles.js +5 -39
- package/utils/listSasFiles.js.map +1 -1
- package/utils/parseMacros.d.ts +1 -1
- package/utils/parseMacros.js +29 -50
- package/utils/parseMacros.js.map +1 -1
- package/utils/splitText.js +4 -4
- package/utils/splitText.js.map +1 -1
- package/utils/trimComments.js +8 -10
- package/utils/trimComments.js.map +1 -1
package/lint/lintText.js
CHANGED
|
@@ -8,52 +8,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
12
|
exports.lintText = void 0;
|
|
40
|
-
|
|
41
|
-
|
|
13
|
+
const getLintConfig_1 = require("../utils/getLintConfig");
|
|
14
|
+
const shared_1 = require("./shared");
|
|
42
15
|
/**
|
|
43
16
|
* Analyses and produces a set of diagnostics for the given text content.
|
|
44
17
|
* @param {string} text - the text content to be linted.
|
|
45
18
|
* @returns {Diagnostic[]} array of diagnostic objects, each containing a warning, line number and column number.
|
|
46
19
|
*/
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return
|
|
50
|
-
|
|
51
|
-
case 0: return [4 /*yield*/, getLintConfig_1.getLintConfig()];
|
|
52
|
-
case 1:
|
|
53
|
-
config = _a.sent();
|
|
54
|
-
return [2 /*return*/, shared_1.processText(text, config)];
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
}); };
|
|
20
|
+
const lintText = (text) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
const config = yield (0, getLintConfig_1.getLintConfig)();
|
|
22
|
+
return (0, shared_1.processText)(text, config);
|
|
23
|
+
});
|
|
58
24
|
exports.lintText = lintText;
|
|
59
25
|
//# sourceMappingURL=lintText.js.map
|
package/lint/lintText.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lintText.js","sourceRoot":"","sources":["../../src/lint/lintText.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lintText.js","sourceRoot":"","sources":["../../src/lint/lintText.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0DAAsD;AACtD,qCAAsC;AAEtC;;;;GAIG;AACI,MAAM,QAAQ,GAAG,CAAO,IAAY,EAAE,EAAE;IAC7C,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAa,GAAE,CAAA;IACpC,OAAO,IAAA,oBAAW,EAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAClC,CAAC,CAAA,CAAA;AAHY,QAAA,QAAQ,YAGpB"}
|
package/lint/shared.js
CHANGED
|
@@ -1,62 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
-
if (!m) return o;
|
|
5
|
-
var i = m.call(o), r, ar = [], e;
|
|
6
|
-
try {
|
|
7
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
-
}
|
|
9
|
-
catch (error) { e = { error: error }; }
|
|
10
|
-
finally {
|
|
11
|
-
try {
|
|
12
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
-
}
|
|
14
|
-
finally { if (e) throw e.error; }
|
|
15
|
-
}
|
|
16
|
-
return ar;
|
|
17
|
-
};
|
|
18
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
19
|
-
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
|
20
|
-
to[j] = from[i];
|
|
21
|
-
return to;
|
|
22
|
-
};
|
|
23
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
3
|
exports.processLine = exports.processFile = exports.processText = void 0;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
diagnostics.push
|
|
33
|
-
lines.forEach(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
diagnostics.push
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const utils_2 = require("../utils");
|
|
6
|
+
const processText = (text, config) => {
|
|
7
|
+
const lines = (0, utils_1.splitText)(text, config);
|
|
8
|
+
const headerLinesCount = (0, utils_1.getHeaderLinesCount)(text, config);
|
|
9
|
+
const dataSections = (0, utils_2.getDataSectionsDetail)(text, config);
|
|
10
|
+
const diagnostics = [];
|
|
11
|
+
diagnostics.push(...processContent(config, text));
|
|
12
|
+
lines.forEach((line, index) => {
|
|
13
|
+
const isHeaderLine = index + 1 <= headerLinesCount;
|
|
14
|
+
const isDataLine = (0, utils_2.checkIsDataLine)(dataSections, index);
|
|
15
|
+
diagnostics.push(...(0, exports.processLine)(config, line, index + 1, { isHeaderLine, isDataLine }));
|
|
37
16
|
});
|
|
38
17
|
return diagnostics;
|
|
39
18
|
};
|
|
40
19
|
exports.processText = processText;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
config.pathLintRules.forEach(
|
|
44
|
-
diagnostics.push
|
|
20
|
+
const processFile = (filePath, config) => {
|
|
21
|
+
const diagnostics = [];
|
|
22
|
+
config.pathLintRules.forEach((rule) => {
|
|
23
|
+
diagnostics.push(...rule.test(filePath, config));
|
|
45
24
|
});
|
|
46
25
|
return diagnostics;
|
|
47
26
|
};
|
|
48
27
|
exports.processFile = processFile;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
config.fileLintRules.forEach(
|
|
52
|
-
diagnostics.push
|
|
28
|
+
const processContent = (config, content) => {
|
|
29
|
+
const diagnostics = [];
|
|
30
|
+
config.fileLintRules.forEach((rule) => {
|
|
31
|
+
diagnostics.push(...rule.test(content, config));
|
|
53
32
|
});
|
|
54
33
|
return diagnostics;
|
|
55
34
|
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
config.lineLintRules.forEach(
|
|
59
|
-
diagnostics.push
|
|
35
|
+
const processLine = (config, line, lineNumber, options) => {
|
|
36
|
+
const diagnostics = [];
|
|
37
|
+
config.lineLintRules.forEach((rule) => {
|
|
38
|
+
diagnostics.push(...rule.test(line, lineNumber, config, options));
|
|
60
39
|
});
|
|
61
40
|
return diagnostics;
|
|
62
41
|
};
|
package/lint/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/lint/shared.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/lint/shared.ts"],"names":[],"mappings":";;;AACA,oCAAyD;AACzD,oCAAiE;AAE1D,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,MAAkB,EAAE,EAAE;IAC9D,MAAM,KAAK,GAAG,IAAA,iBAAS,EAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACrC,MAAM,gBAAgB,GAAG,IAAA,2BAAmB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC1D,MAAM,YAAY,GAAG,IAAA,6BAAqB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACxD,MAAM,WAAW,GAAiB,EAAE,CAAA;IACpC,WAAW,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;IACjD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,IAAI,gBAAgB,CAAA;QAClD,MAAM,UAAU,GAAG,IAAA,uBAAe,EAAC,YAAY,EAAE,KAAK,CAAC,CAAA;QACvD,WAAW,CAAC,IAAI,CACd,GAAG,IAAA,mBAAW,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CACtE,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAfY,QAAA,WAAW,eAevB;AAEM,MAAM,WAAW,GAAG,CACzB,QAAgB,EAChB,MAAkB,EACJ,EAAE;IAChB,MAAM,WAAW,GAAiB,EAAE,CAAA;IACpC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAVY,QAAA,WAAW,eAUvB;AAED,MAAM,cAAc,GAAG,CAAC,MAAkB,EAAE,OAAe,EAAgB,EAAE;IAC3E,MAAM,WAAW,GAAiB,EAAE,CAAA;IACpC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAEM,MAAM,WAAW,GAAG,CACzB,MAAkB,EAClB,IAAY,EACZ,UAAkB,EAClB,OAA4B,EACd,EAAE;IAChB,MAAM,WAAW,GAAiB,EAAE,CAAA;IACpC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAZY,QAAA,WAAW,eAYvB"}
|
package/lintExample.js
CHANGED
|
@@ -3,17 +3,57 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const lint_1 = require("./lint");
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
8
|
/**
|
|
9
9
|
* Example which tests a piece of text with all known violations.
|
|
10
10
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const text = `/**
|
|
12
|
+
@file
|
|
13
|
+
@brief Returns an unused libref
|
|
14
|
+
@details Use as follows:
|
|
15
|
+
|
|
16
|
+
libname mclib0 (work);
|
|
17
|
+
libname mclib1 (work);
|
|
18
|
+
libname mclib2 (work);
|
|
19
|
+
|
|
20
|
+
%let libref=%mf_getuniquelibref({SAS001});
|
|
21
|
+
%put &=libref;
|
|
22
|
+
|
|
23
|
+
which returns:
|
|
24
|
+
|
|
25
|
+
> mclib3
|
|
26
|
+
|
|
27
|
+
@param prefix= first part of libref. Remember that librefs can only be 8 characters,
|
|
28
|
+
so a 7 letter prefix would mean that maxtries should be 10.
|
|
29
|
+
@param maxtries= the last part of the libref. Provide an integer value.
|
|
30
|
+
|
|
31
|
+
@version 9.2
|
|
32
|
+
@author Allan Bowe
|
|
33
|
+
**/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
%macro mf_getuniquelibref(prefix=mclib,maxtries=1000);
|
|
37
|
+
%local x libref;
|
|
38
|
+
%let x={SAS002};
|
|
39
|
+
%do x=0 %to &maxtries;
|
|
40
|
+
%if %sysfunc(libref(&prefix&x)) ne 0 %then %do;
|
|
41
|
+
%let libref=&prefix&x;
|
|
42
|
+
%let rc=%sysfunc(libname(&libref,%sysfunc(pathname(work))));
|
|
43
|
+
%if &rc %then %put %sysfunc(sysmsg());
|
|
44
|
+
&prefix&x
|
|
45
|
+
%*put &sysmacroname: Libref &libref assigned as WORK and returned;
|
|
46
|
+
%return;
|
|
47
|
+
%end;
|
|
48
|
+
%end;
|
|
49
|
+
%put unable to find available libref in range &prefix.0-&maxtries;
|
|
50
|
+
%mend;
|
|
51
|
+
`;
|
|
52
|
+
(0, lint_1.lintText)(text).then((diagnostics) => {
|
|
13
53
|
console.log('Text lint results:');
|
|
14
54
|
console.table(diagnostics);
|
|
15
55
|
});
|
|
16
|
-
lint_1.lintFile(path_1.default.join(__dirname, 'Example File.sas')).then(
|
|
56
|
+
(0, lint_1.lintFile)(path_1.default.join(__dirname, 'Example File.sas')).then((diagnostics) => {
|
|
17
57
|
console.log('File lint results:');
|
|
18
58
|
console.table(diagnostics);
|
|
19
59
|
});
|
package/lintExample.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lintExample.js","sourceRoot":"","sources":["../src/lintExample.ts"],"names":[],"mappings":";;;;;AAAA
|
|
1
|
+
{"version":3,"file":"lintExample.js","sourceRoot":"","sources":["../src/lintExample.ts"],"names":[],"mappings":";;;;;AAAA,iCAA2C;AAC3C,gDAAuB;AAEvB;;GAEG;AAEH,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCZ,CAAA;AAED,IAAA,eAAQ,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;IAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IACjC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,IAAA,eAAQ,EAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;IACtE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IACjC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -43,13 +43,13 @@
|
|
|
43
43
|
"@types/node": "18.11.18",
|
|
44
44
|
"all-contributors-cli": "6.24.0",
|
|
45
45
|
"jest": "29.3.1",
|
|
46
|
-
"rimraf": "^
|
|
46
|
+
"rimraf": "^5.0.10",
|
|
47
47
|
"ts-jest": "29.0.3",
|
|
48
48
|
"typescript": "^4.3.2"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@sasjs/utils": "
|
|
51
|
+
"@sasjs/utils": "3.5.0",
|
|
52
52
|
"ignore": "5.2.4"
|
|
53
53
|
},
|
|
54
|
-
"version": "2.4.
|
|
54
|
+
"version": "2.4.2"
|
|
55
55
|
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.hasDoxygenHeader = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
const types_1 = require("../../types");
|
|
5
|
+
const LineEndings_1 = require("../../types/LineEndings");
|
|
6
|
+
const LintRuleType_1 = require("../../types/LintRuleType");
|
|
7
|
+
const Severity_1 = require("../../types/Severity");
|
|
8
|
+
const getLintConfig_1 = require("../../utils/getLintConfig");
|
|
9
|
+
const name = 'hasDoxygenHeader';
|
|
10
|
+
const description = 'Enforce the presence of a Doxygen header at the start of each file.';
|
|
11
|
+
const message = 'File missing Doxygen header';
|
|
12
|
+
const messageForSingleAsterisk = 'File not following Doxygen header style, use double asterisks';
|
|
13
|
+
const test = (value, config) => {
|
|
14
14
|
var _a;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
const lineEnding = (config === null || config === void 0 ? void 0 : config.lineEndings) === LineEndings_1.LineEndings.CRLF ? '\r\n' : '\n';
|
|
16
|
+
const severity = (config === null || config === void 0 ? void 0 : config.severityLevel[name]) || Severity_1.Severity.Warning;
|
|
17
17
|
try {
|
|
18
|
-
|
|
18
|
+
const hasFileHeader = value.trimStart().startsWith('/**');
|
|
19
19
|
if (hasFileHeader)
|
|
20
20
|
return [];
|
|
21
|
-
|
|
21
|
+
const hasFileHeaderWithSingleAsterisk = value.trimStart().startsWith('/*');
|
|
22
22
|
if (hasFileHeaderWithSingleAsterisk)
|
|
23
23
|
return [
|
|
24
24
|
{
|
|
@@ -27,52 +27,52 @@ var test = function (value, config) {
|
|
|
27
27
|
.length + 1,
|
|
28
28
|
startColumnNumber: 1,
|
|
29
29
|
endColumnNumber: 1,
|
|
30
|
-
severity
|
|
30
|
+
severity
|
|
31
31
|
}
|
|
32
32
|
];
|
|
33
33
|
return [
|
|
34
34
|
{
|
|
35
|
-
message
|
|
35
|
+
message,
|
|
36
36
|
lineNumber: 1,
|
|
37
37
|
startColumnNumber: 1,
|
|
38
38
|
endColumnNumber: 1,
|
|
39
|
-
severity
|
|
39
|
+
severity
|
|
40
40
|
}
|
|
41
41
|
];
|
|
42
42
|
}
|
|
43
43
|
catch (e) {
|
|
44
44
|
return [
|
|
45
45
|
{
|
|
46
|
-
message
|
|
46
|
+
message,
|
|
47
47
|
lineNumber: 1,
|
|
48
48
|
startColumnNumber: 1,
|
|
49
49
|
endColumnNumber: 1,
|
|
50
|
-
severity
|
|
50
|
+
severity
|
|
51
51
|
}
|
|
52
52
|
];
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
const fix = (value, config) => {
|
|
56
|
+
const result = test(value, config);
|
|
57
57
|
if (result.length === 0) {
|
|
58
58
|
return value;
|
|
59
59
|
}
|
|
60
60
|
else if (result[0].message == messageForSingleAsterisk)
|
|
61
61
|
return value.replace('/*', '/**');
|
|
62
62
|
config = config || new types_1.LintConfig(getLintConfig_1.DefaultLintConfiguration);
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return
|
|
63
|
+
const lineEndingConfig = (config === null || config === void 0 ? void 0 : config.lineEndings) || LineEndings_1.LineEndings.LF;
|
|
64
|
+
const lineEnding = lineEndingConfig === LineEndings_1.LineEndings.LF ? '\n' : '\r\n';
|
|
65
|
+
return `${config === null || config === void 0 ? void 0 : config.defaultHeader.replace(/{lineEnding}/g, lineEnding)}${lineEnding}${value}`;
|
|
66
66
|
};
|
|
67
67
|
/**
|
|
68
68
|
* Lint rule that checks for the presence of a Doxygen header in a given file.
|
|
69
69
|
*/
|
|
70
70
|
exports.hasDoxygenHeader = {
|
|
71
71
|
type: LintRuleType_1.LintRuleType.File,
|
|
72
|
-
name
|
|
73
|
-
description
|
|
74
|
-
message
|
|
75
|
-
test
|
|
76
|
-
fix
|
|
72
|
+
name,
|
|
73
|
+
description,
|
|
74
|
+
message,
|
|
75
|
+
test,
|
|
76
|
+
fix
|
|
77
77
|
};
|
|
78
78
|
//# sourceMappingURL=hasDoxygenHeader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasDoxygenHeader.js","sourceRoot":"","sources":["../../../src/rules/file/hasDoxygenHeader.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"hasDoxygenHeader.js","sourceRoot":"","sources":["../../../src/rules/file/hasDoxygenHeader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,78 +1,78 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.hasMacroNameInMend = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
macros.forEach(
|
|
4
|
+
const LintRuleType_1 = require("../../types/LintRuleType");
|
|
5
|
+
const Severity_1 = require("../../types/Severity");
|
|
6
|
+
const getColumnNumber_1 = require("../../utils/getColumnNumber");
|
|
7
|
+
const LineEndings_1 = require("../../types/LineEndings");
|
|
8
|
+
const parseMacros_1 = require("../../utils/parseMacros");
|
|
9
|
+
const name = 'hasMacroNameInMend';
|
|
10
|
+
const description = 'Enforces the presence of the macro name in each %mend statement.';
|
|
11
|
+
const message = '%mend statement has missing or incorrect macro name';
|
|
12
|
+
const test = (value, config) => {
|
|
13
|
+
const lineEnding = (config === null || config === void 0 ? void 0 : config.lineEndings) === LineEndings_1.LineEndings.CRLF ? '\r\n' : '\n';
|
|
14
|
+
const lines = value ? value.split(lineEnding) : [];
|
|
15
|
+
const macros = (0, parseMacros_1.parseMacros)(value, config);
|
|
16
|
+
const severity = (config === null || config === void 0 ? void 0 : config.severityLevel[name]) || Severity_1.Severity.Warning;
|
|
17
|
+
const diagnostics = [];
|
|
18
|
+
macros.forEach((macro) => {
|
|
19
19
|
if (macro.startLineNumbers.length === 0 && macro.endLineNumber !== null) {
|
|
20
|
-
|
|
20
|
+
const endLine = lines[macro.endLineNumber - 1];
|
|
21
21
|
diagnostics.push({
|
|
22
|
-
message:
|
|
22
|
+
message: `%mend statement is redundant`,
|
|
23
23
|
lineNumber: macro.endLineNumber,
|
|
24
|
-
startColumnNumber: getColumnNumber_1.getColumnNumber(endLine, '%mend'),
|
|
25
|
-
endColumnNumber: getColumnNumber_1.getColumnNumber(endLine, '%mend') + macro.termination.length,
|
|
26
|
-
severity
|
|
24
|
+
startColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend'),
|
|
25
|
+
endColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend') + macro.termination.length,
|
|
26
|
+
severity
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
else if (macro.endLineNumber === null &&
|
|
30
30
|
macro.startLineNumbers.length !== 0) {
|
|
31
31
|
diagnostics.push({
|
|
32
|
-
message:
|
|
32
|
+
message: `Missing %mend statement for macro - ${macro.name}`,
|
|
33
33
|
lineNumber: macro.startLineNumbers[0],
|
|
34
34
|
startColumnNumber: 1,
|
|
35
35
|
endColumnNumber: 1,
|
|
36
|
-
severity
|
|
36
|
+
severity
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
else if (macro.mismatchedMendMacroName) {
|
|
40
|
-
|
|
40
|
+
const endLine = lines[macro.endLineNumber - 1];
|
|
41
41
|
diagnostics.push({
|
|
42
|
-
message:
|
|
42
|
+
message: `%mend statement has mismatched macro name, it should be '${macro.name}'`,
|
|
43
43
|
lineNumber: macro.endLineNumber,
|
|
44
|
-
startColumnNumber: getColumnNumber_1.getColumnNumber(endLine, macro.mismatchedMendMacroName),
|
|
45
|
-
endColumnNumber: getColumnNumber_1.getColumnNumber(endLine, macro.mismatchedMendMacroName) +
|
|
44
|
+
startColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, macro.mismatchedMendMacroName),
|
|
45
|
+
endColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, macro.mismatchedMendMacroName) +
|
|
46
46
|
macro.mismatchedMendMacroName.length -
|
|
47
47
|
1,
|
|
48
|
-
severity
|
|
48
|
+
severity
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
else if (!macro.hasMacroNameInMend) {
|
|
52
|
-
|
|
52
|
+
const endLine = lines[macro.endLineNumber - 1];
|
|
53
53
|
diagnostics.push({
|
|
54
|
-
message:
|
|
54
|
+
message: `%mend statement is missing macro name - ${macro.name}`,
|
|
55
55
|
lineNumber: macro.endLineNumber,
|
|
56
|
-
startColumnNumber: getColumnNumber_1.getColumnNumber(endLine, '%mend'),
|
|
57
|
-
endColumnNumber: getColumnNumber_1.getColumnNumber(endLine, '%mend') + 6,
|
|
58
|
-
severity
|
|
56
|
+
startColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend'),
|
|
57
|
+
endColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend') + 6,
|
|
58
|
+
severity
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
});
|
|
62
62
|
return diagnostics;
|
|
63
63
|
};
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
macros.forEach(
|
|
64
|
+
const fix = (value, config) => {
|
|
65
|
+
const lineEnding = (config === null || config === void 0 ? void 0 : config.lineEndings) === LineEndings_1.LineEndings.CRLF ? '\r\n' : '\n';
|
|
66
|
+
const lines = value ? value.split(lineEnding) : [];
|
|
67
|
+
const macros = (0, parseMacros_1.parseMacros)(value, config);
|
|
68
|
+
macros.forEach((macro) => {
|
|
69
69
|
if (macro.startLineNumbers.length === 0 && macro.endLineNumber !== null) {
|
|
70
70
|
// %mend statement is redundant
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
71
|
+
const endLine = lines[macro.endLineNumber - 1];
|
|
72
|
+
const startColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend');
|
|
73
|
+
const endColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend') + macro.termination.length;
|
|
74
|
+
const beforeStatement = endLine.slice(0, startColumnNumber - 1);
|
|
75
|
+
const afterStatement = endLine.slice(endColumnNumber);
|
|
76
76
|
lines[macro.endLineNumber - 1] = beforeStatement + afterStatement;
|
|
77
77
|
}
|
|
78
78
|
else if (macro.endLineNumber === null &&
|
|
@@ -81,28 +81,28 @@ var fix = function (value, config) {
|
|
|
81
81
|
}
|
|
82
82
|
else if (macro.mismatchedMendMacroName) {
|
|
83
83
|
// mismatched macro name
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
const endLine = lines[macro.endLineNumber - 1];
|
|
85
|
+
const startColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, macro.mismatchedMendMacroName);
|
|
86
|
+
const endColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, macro.mismatchedMendMacroName) +
|
|
87
87
|
macro.mismatchedMendMacroName.length -
|
|
88
88
|
1;
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
const beforeMacroName = endLine.slice(0, startColumnNumber - 1);
|
|
90
|
+
const afterMacroName = endLine.slice(endColumnNumber);
|
|
91
91
|
lines[macro.endLineNumber - 1] =
|
|
92
92
|
beforeMacroName + macro.name + afterMacroName;
|
|
93
93
|
}
|
|
94
94
|
else if (!macro.hasMacroNameInMend) {
|
|
95
95
|
// %mend statement is missing macro name
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
96
|
+
const endLine = lines[macro.endLineNumber - 1];
|
|
97
|
+
const startColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend');
|
|
98
|
+
const endColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend') + 4;
|
|
99
|
+
const beforeStatement = endLine.slice(0, startColumnNumber - 1);
|
|
100
|
+
const afterStatement = endLine.slice(endColumnNumber);
|
|
101
101
|
lines[macro.endLineNumber - 1] =
|
|
102
|
-
beforeStatement +
|
|
102
|
+
beforeStatement + `%mend ${macro.name}` + afterStatement;
|
|
103
103
|
}
|
|
104
104
|
});
|
|
105
|
-
|
|
105
|
+
const formattedText = lines.join(lineEnding);
|
|
106
106
|
return formattedText;
|
|
107
107
|
};
|
|
108
108
|
/**
|
|
@@ -110,10 +110,10 @@ var fix = function (value, config) {
|
|
|
110
110
|
*/
|
|
111
111
|
exports.hasMacroNameInMend = {
|
|
112
112
|
type: LintRuleType_1.LintRuleType.File,
|
|
113
|
-
name
|
|
114
|
-
description
|
|
115
|
-
message
|
|
116
|
-
test
|
|
117
|
-
fix
|
|
113
|
+
name,
|
|
114
|
+
description,
|
|
115
|
+
message,
|
|
116
|
+
test,
|
|
117
|
+
fix
|
|
118
118
|
};
|
|
119
119
|
//# sourceMappingURL=hasMacroNameInMend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasMacroNameInMend.js","sourceRoot":"","sources":["../../../src/rules/file/hasMacroNameInMend.ts"],"names":[],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"hasMacroNameInMend.js","sourceRoot":"","sources":["../../../src/rules/file/hasMacroNameInMend.ts"],"names":[],"mappings":"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"}
|