@sasjs/lint 2.0.1 → 2.1.0
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/README.md +10 -0
- package/package.json +1 -1
- package/rules/line/index.d.ts +1 -0
- package/rules/line/index.js +3 -1
- package/rules/line/index.js.map +1 -1
- package/rules/line/noGremlins.d.ts +5 -0
- package/rules/line/noGremlins.js +153 -0
- package/rules/line/noGremlins.js.map +1 -0
- package/sasjslint-schema.json +17 -0
- package/types/LintConfig.js +3 -0
- package/types/LintConfig.js.map +1 -1
package/README.md
CHANGED
|
@@ -29,6 +29,7 @@ Configuration is via a `.sasjslint` file with the following structure (these are
|
|
|
29
29
|
"lowerCaseFileNames": true,
|
|
30
30
|
"maxLineLength": 80,
|
|
31
31
|
"noNestedMacros": true,
|
|
32
|
+
"noGremlins": true,
|
|
32
33
|
"noSpacesInFileNames": true,
|
|
33
34
|
"noTabs": true,
|
|
34
35
|
"noTrailingSpaces": true,
|
|
@@ -125,6 +126,15 @@ We strongly recommend a line length limit, and set the bar at 80. To turn this f
|
|
|
125
126
|
- Default: 80
|
|
126
127
|
- Severity: WARNING
|
|
127
128
|
|
|
129
|
+
### noGremlins
|
|
130
|
+
|
|
131
|
+
Capture zero-width whitespace and other non-standard characters. The logic is borrowed from the [VSCode Gremlins Extension](https://github.com/nhoizey/vscode-gremlins) - if you are looking for more advanced gremlin zapping capabilities, we highly recommend to use their extension instead.
|
|
132
|
+
|
|
133
|
+
The list of characters can be found in this file: [https://github.com/sasjs/lint/blob/main/src/rules/line/noGremlins.ts](https://github.com/sasjs/lint/blob/main/src/rules/line/noGremlins.ts)
|
|
134
|
+
|
|
135
|
+
- Default: true
|
|
136
|
+
- Severity: WARNING
|
|
137
|
+
|
|
128
138
|
### noNestedMacros
|
|
129
139
|
|
|
130
140
|
Where macros are defined inside other macros, they are recompiled every time the outer macro is invoked. Hence, it is widely considered inefficient, and bad practice, to nest macro definitions.
|
package/package.json
CHANGED
package/rules/line/index.d.ts
CHANGED
package/rules/line/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.noTrailingSpaces = exports.noTabs = exports.noEncodedPasswords = exports.maxLineLength = exports.indentationMultiple = void 0;
|
|
3
|
+
exports.noTrailingSpaces = exports.noTabs = exports.noEncodedPasswords = exports.maxLineLength = exports.indentationMultiple = exports.noGremlins = void 0;
|
|
4
|
+
var noGremlins_1 = require("./noGremlins");
|
|
5
|
+
Object.defineProperty(exports, "noGremlins", { enumerable: true, get: function () { return noGremlins_1.noGremlins; } });
|
|
4
6
|
var indentationMultiple_1 = require("./indentationMultiple");
|
|
5
7
|
Object.defineProperty(exports, "indentationMultiple", { enumerable: true, get: function () { return indentationMultiple_1.indentationMultiple; } });
|
|
6
8
|
var maxLineLength_1 = require("./maxLineLength");
|
package/rules/line/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/line/index.ts"],"names":[],"mappings":";;;AAAA,6DAA2D;AAAlD,0HAAA,mBAAmB,OAAA;AAC5B,iDAA+C;AAAtC,8GAAA,aAAa,OAAA;AACtB,2DAAyD;AAAhD,wHAAA,kBAAkB,OAAA;AAC3B,mCAAiC;AAAxB,gGAAA,MAAM,OAAA;AACf,uDAAqD;AAA5C,oHAAA,gBAAgB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/line/index.ts"],"names":[],"mappings":";;;AAAA,2CAAyC;AAAhC,wGAAA,UAAU,OAAA;AACnB,6DAA2D;AAAlD,0HAAA,mBAAmB,OAAA;AAC5B,iDAA+C;AAAtC,8GAAA,aAAa,OAAA;AACtB,2DAAyD;AAAhD,wHAAA,kBAAkB,OAAA;AAC3B,mCAAiC;AAAxB,gGAAA,MAAM,OAAA;AACf,uDAAqD;AAA5C,oHAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __values = (this && this.__values) || function(o) {
|
|
3
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
4
|
+
if (m) return m.call(o);
|
|
5
|
+
if (o && typeof o.length === "number") return {
|
|
6
|
+
next: function () {
|
|
7
|
+
if (o && i >= o.length) o = void 0;
|
|
8
|
+
return { value: o && o[i++], done: !o };
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.noGremlins = void 0;
|
|
31
|
+
var LintRuleType_1 = require("../../types/LintRuleType");
|
|
32
|
+
var Severity_1 = require("../../types/Severity");
|
|
33
|
+
var name = 'noGremlins';
|
|
34
|
+
var description = 'Disallow characters specified in gremlins array';
|
|
35
|
+
var message = 'Line contains a gremlin';
|
|
36
|
+
var test = function (value, lineNumber, config) {
|
|
37
|
+
var e_1, _a;
|
|
38
|
+
var severity = (config === null || config === void 0 ? void 0 : config.severityLevel[name]) || Severity_1.Severity.Warning;
|
|
39
|
+
var diagnostics = [];
|
|
40
|
+
var gremlins = {};
|
|
41
|
+
try {
|
|
42
|
+
for (var _b = __values(Object.entries(gremlinCharacters)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
43
|
+
var _d = __read(_c.value, 2), hexCode = _d[0], config_1 = _d[1];
|
|
44
|
+
gremlins[charFromHex(hexCode)] = Object.assign({}, config_1, {
|
|
45
|
+
hexCode: hexCode
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
50
|
+
finally {
|
|
51
|
+
try {
|
|
52
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
53
|
+
}
|
|
54
|
+
finally { if (e_1) throw e_1.error; }
|
|
55
|
+
}
|
|
56
|
+
var regexpWithAllChars = new RegExp(Object.keys(gremlins)
|
|
57
|
+
.map(function (char) { return char + "+"; })
|
|
58
|
+
.join('|'), 'g');
|
|
59
|
+
var match;
|
|
60
|
+
while ((match = regexpWithAllChars.exec(value))) {
|
|
61
|
+
var matchedCharacter = match[0][0];
|
|
62
|
+
var gremlin = gremlins[matchedCharacter];
|
|
63
|
+
diagnostics.push({
|
|
64
|
+
message: message + ": " + gremlin.description + ", hexCode(" + gremlin.hexCode + ")",
|
|
65
|
+
lineNumber: lineNumber,
|
|
66
|
+
startColumnNumber: match.index + 1,
|
|
67
|
+
endColumnNumber: match.index + 1 + match[0].length,
|
|
68
|
+
severity: severity
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return diagnostics;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Lint rule that checks if a given line of text contains any gremlins.
|
|
75
|
+
*/
|
|
76
|
+
exports.noGremlins = {
|
|
77
|
+
type: LintRuleType_1.LintRuleType.Line,
|
|
78
|
+
name: name,
|
|
79
|
+
description: description,
|
|
80
|
+
message: message,
|
|
81
|
+
test: test
|
|
82
|
+
};
|
|
83
|
+
var charFromHex = function (hexCode) { return String.fromCodePoint(parseInt(hexCode)); };
|
|
84
|
+
var gremlinCharacters = {
|
|
85
|
+
'0x2013': {
|
|
86
|
+
description: 'en dash'
|
|
87
|
+
},
|
|
88
|
+
'0x2018': {
|
|
89
|
+
description: 'left single quotation mark'
|
|
90
|
+
},
|
|
91
|
+
'0x2019': {
|
|
92
|
+
description: 'right single quotation mark'
|
|
93
|
+
},
|
|
94
|
+
'0x2029': {
|
|
95
|
+
zeroWidth: true,
|
|
96
|
+
description: 'paragraph separator'
|
|
97
|
+
},
|
|
98
|
+
'0x2066': {
|
|
99
|
+
zeroWidth: true,
|
|
100
|
+
description: 'Left to right'
|
|
101
|
+
},
|
|
102
|
+
'0x2069': {
|
|
103
|
+
zeroWidth: true,
|
|
104
|
+
description: 'Pop directional'
|
|
105
|
+
},
|
|
106
|
+
'0x0003': {
|
|
107
|
+
description: 'end of text'
|
|
108
|
+
},
|
|
109
|
+
'0x000b': {
|
|
110
|
+
description: 'line tabulation'
|
|
111
|
+
},
|
|
112
|
+
'0x00a0': {
|
|
113
|
+
description: 'non breaking space'
|
|
114
|
+
},
|
|
115
|
+
'0x00ad': {
|
|
116
|
+
description: 'soft hyphen'
|
|
117
|
+
},
|
|
118
|
+
'0x200b': {
|
|
119
|
+
zeroWidth: true,
|
|
120
|
+
description: 'zero width space'
|
|
121
|
+
},
|
|
122
|
+
'0x200c': {
|
|
123
|
+
zeroWidth: true,
|
|
124
|
+
description: 'zero width non-joiner'
|
|
125
|
+
},
|
|
126
|
+
'0x200e': {
|
|
127
|
+
zeroWidth: true,
|
|
128
|
+
description: 'left-to-right mark'
|
|
129
|
+
},
|
|
130
|
+
'0x201c': {
|
|
131
|
+
description: 'left double quotation mark'
|
|
132
|
+
},
|
|
133
|
+
'0x201d': {
|
|
134
|
+
description: 'right double quotation mark'
|
|
135
|
+
},
|
|
136
|
+
'0x202c': {
|
|
137
|
+
zeroWidth: true,
|
|
138
|
+
description: 'pop directional formatting'
|
|
139
|
+
},
|
|
140
|
+
'0x202d': {
|
|
141
|
+
zeroWidth: true,
|
|
142
|
+
description: 'left-to-right override'
|
|
143
|
+
},
|
|
144
|
+
'0x202e': {
|
|
145
|
+
zeroWidth: true,
|
|
146
|
+
description: 'right-to-left override'
|
|
147
|
+
},
|
|
148
|
+
'0xfffc': {
|
|
149
|
+
zeroWidth: true,
|
|
150
|
+
description: 'object replacement character'
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=noGremlins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noGremlins.js","sourceRoot":"","sources":["../../../src/rules/line/noGremlins.ts"],"names":[],"mappings":"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"}
|
package/sasjslint-schema.json
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"indentationMultiple": 2,
|
|
14
14
|
"lowerCaseFileNames": true,
|
|
15
15
|
"maxLineLength": 80,
|
|
16
|
+
"noGremlins": true,
|
|
16
17
|
"noNestedMacros": true,
|
|
17
18
|
"noSpacesInFileNames": true,
|
|
18
19
|
"noTabs": true,
|
|
@@ -29,6 +30,7 @@
|
|
|
29
30
|
"noSpacesInFileNames": true,
|
|
30
31
|
"lowerCaseFileNames": true,
|
|
31
32
|
"maxLineLength": 80,
|
|
33
|
+
"noGremlins": true,
|
|
32
34
|
"noTabs": true,
|
|
33
35
|
"indentationMultiple": 4,
|
|
34
36
|
"hasMacroNameInMend": true,
|
|
@@ -64,6 +66,14 @@
|
|
|
64
66
|
"default": "/**{lineEnding} @file{lineEnding} @brief <Your brief here>{lineEnding} <h4> SAS Macros </h4>{lineEnding}**/",
|
|
65
67
|
"examples": []
|
|
66
68
|
},
|
|
69
|
+
"noGremlins": {
|
|
70
|
+
"$id": "#/properties/noGremlins",
|
|
71
|
+
"type": "array",
|
|
72
|
+
"title": "noGremlins",
|
|
73
|
+
"description": "Captures problematic characters such as zero-width whitespace and others that look valid but usually are not (such as the en dash)",
|
|
74
|
+
"default": [true],
|
|
75
|
+
"examples": [true, false]
|
|
76
|
+
},
|
|
67
77
|
"hasMacroNameInMend": {
|
|
68
78
|
"$id": "#/properties/hasMacroNameInMend",
|
|
69
79
|
"type": "boolean",
|
|
@@ -193,6 +203,13 @@
|
|
|
193
203
|
"enum": ["error", "warn"],
|
|
194
204
|
"default": "warn"
|
|
195
205
|
},
|
|
206
|
+
"noGremlins": {
|
|
207
|
+
"$id": "#/properties/severityLevel/noGremlins",
|
|
208
|
+
"title": "noGremlins",
|
|
209
|
+
"type": "string",
|
|
210
|
+
"enum": ["error", "warn"],
|
|
211
|
+
"default": "warn"
|
|
212
|
+
},
|
|
196
213
|
"hasMacroNameInMend": {
|
|
197
214
|
"$id": "#/properties/severityLevel/hasMacroNameInMend",
|
|
198
215
|
"title": "hasMacroNameInMend",
|
package/types/LintConfig.js
CHANGED
|
@@ -116,6 +116,9 @@ var LintConfig = /** @class */ (function () {
|
|
|
116
116
|
if (json === null || json === void 0 ? void 0 : json.strictMacroDefinition) {
|
|
117
117
|
this.fileLintRules.push(file_1.strictMacroDefinition);
|
|
118
118
|
}
|
|
119
|
+
if (json === null || json === void 0 ? void 0 : json.noGremlins) {
|
|
120
|
+
this.lineLintRules.push(line_1.noGremlins);
|
|
121
|
+
}
|
|
119
122
|
if (json === null || json === void 0 ? void 0 : json.severityLevel) {
|
|
120
123
|
try {
|
|
121
124
|
for (var _b = __values(Object.entries(json.severityLevel)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
package/types/LintConfig.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LintConfig.js","sourceRoot":"","sources":["../../src/types/LintConfig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAOsB;AACtB,
|
|
1
|
+
{"version":3,"file":"LintConfig.js","sourceRoot":"","sources":["../../src/types/LintConfig.ts"],"names":[],"mappings":"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"}
|