@sasjs/lint 2.1.3 → 2.2.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/.github/workflows/publish.yml +2 -2
- package/README.md +60 -1
- package/lint/shared.d.ts +2 -2
- package/lint/shared.js +8 -3
- package/lint/shared.js.map +1 -1
- package/package.json +8 -8
- package/rules/line/maxLineLength.js +14 -2
- package/rules/line/maxLineLength.js.map +1 -1
- package/rules/line/noGremlins.d.ts +1 -0
- package/rules/line/noGremlins.js +12 -6
- package/rules/line/noGremlins.js.map +1 -1
- package/sasjslint-schema.json +33 -0
- package/types/LintConfig.d.ts +3 -0
- package/types/LintConfig.js +24 -2
- package/types/LintConfig.js.map +1 -1
- package/types/LintRule.d.ts +5 -1
- package/utils/getDataSectionsDetail.d.ts +8 -0
- package/utils/getDataSectionsDetail.js +68 -0
- package/utils/getDataSectionsDetail.js.map +1 -0
- package/utils/getHeaderLinesCount.d.ts +6 -0
- package/utils/getHeaderLinesCount.js +45 -0
- package/utils/getHeaderLinesCount.js.map +1 -0
- package/utils/getLintConfig.d.ts +2 -0
- package/utils/getLintConfig.js +2 -0
- package/utils/getLintConfig.js.map +1 -1
- package/utils/index.d.ts +2 -0
- package/utils/index.js +2 -0
- package/utils/index.js.map +1 -1
|
@@ -13,7 +13,7 @@ jobs:
|
|
|
13
13
|
runs-on: ubuntu-latest
|
|
14
14
|
steps:
|
|
15
15
|
- name: Checkout
|
|
16
|
-
uses: actions/checkout@
|
|
16
|
+
uses: actions/checkout@v3
|
|
17
17
|
- name: Install Dependencies
|
|
18
18
|
run: npm ci
|
|
19
19
|
- name: Check Code Style
|
|
@@ -21,7 +21,7 @@ jobs:
|
|
|
21
21
|
- name: Build Project
|
|
22
22
|
run: npm run build
|
|
23
23
|
- name: Semantic Release
|
|
24
|
-
uses: cycjimmy/semantic-release-action@
|
|
24
|
+
uses: cycjimmy/semantic-release-action@v3
|
|
25
25
|
env:
|
|
26
26
|
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
|
|
27
27
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
package/README.md
CHANGED
|
@@ -26,6 +26,8 @@ Configuration is via a `.sasjslint` file with the following structure (these are
|
|
|
26
26
|
"ignoreList": ["sajsbuild/", "sasjsresults/"],
|
|
27
27
|
"indentationMultiple": 2,
|
|
28
28
|
"lowerCaseFileNames": true,
|
|
29
|
+
"maxDataLineLength": 80,
|
|
30
|
+
"maxHeaderLineLength": 80,
|
|
29
31
|
"maxLineLength": 80,
|
|
30
32
|
"noNestedMacros": true,
|
|
31
33
|
"noGremlins": true,
|
|
@@ -46,9 +48,22 @@ Each setting can have three states:
|
|
|
46
48
|
|
|
47
49
|
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.
|
|
48
50
|
|
|
51
|
+
### allowedGremlins
|
|
52
|
+
|
|
53
|
+
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`.
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"noGremlins": true,
|
|
60
|
+
"allowedGremlins": ["0x0080", "0x3000"]
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
49
64
|
### defaultHeader
|
|
50
65
|
|
|
51
|
-
This isn't
|
|
66
|
+
This isn't a rule, but a formatting setting, which applies to SAS program that do NOT begin with `/**`. It can be triggered by running `sasjs lint fix` in the SASjs CLI, or by hitting "save" when using the SASjs VS Code extension (with "formatOnSave" in place)
|
|
52
67
|
|
|
53
68
|
The default header is as follows:
|
|
54
69
|
|
|
@@ -114,6 +129,45 @@ On *nix systems, it is imperative that autocall macros are in lowercase. When sh
|
|
|
114
129
|
- Default: true
|
|
115
130
|
- Severity: WARNING
|
|
116
131
|
|
|
132
|
+
### maxDataLineLength
|
|
133
|
+
|
|
134
|
+
Datalines can be very wide, so to avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the data records only. On a related note, as a developer, you should also be aware that code submitted in batch may have a default line length limit which is lower than you expect. See this [usage note](https://support.sas.com/kb/15/883.html) (and thanks to [sasutils for reminding us](https://github.com/sasjs/lint/issues/47#issuecomment-1064340104)).
|
|
135
|
+
|
|
136
|
+
This feature will work for the following statements:
|
|
137
|
+
|
|
138
|
+
* cards
|
|
139
|
+
* cards4
|
|
140
|
+
* datalines
|
|
141
|
+
* datalines4
|
|
142
|
+
* parmcards
|
|
143
|
+
* parmcards4
|
|
144
|
+
|
|
145
|
+
The `maxDataLineLength` setting is always the _higher_ of `maxDataLineLength` and `maxLineLength` (if you set a lower number, it is ignored).
|
|
146
|
+
|
|
147
|
+
- Default: 80
|
|
148
|
+
- Severity: WARNING
|
|
149
|
+
|
|
150
|
+
See also:
|
|
151
|
+
|
|
152
|
+
* [hasDoxygenHeader](#hasdoxygenheader)
|
|
153
|
+
* [maxHeaderLineLength](#maxheaderlinelength)
|
|
154
|
+
* [maxLineLength](#maxlinelength)
|
|
155
|
+
|
|
156
|
+
### maxHeaderLineLength
|
|
157
|
+
|
|
158
|
+
In a program header it can be necessary to insert items such as URLs or markdown tables, that cannot be split over multiple lines. To avoid the need to increase `maxLineLength` for the entire project, it is possible to raise the line length limit for the header section only.
|
|
159
|
+
|
|
160
|
+
The `maxHeaderLineLength` setting is always the _higher_ of `maxHeaderLineLength` and `maxLineLength` (if you set a lower number, it is ignored).
|
|
161
|
+
|
|
162
|
+
- Default: 80
|
|
163
|
+
- Severity: WARNING
|
|
164
|
+
|
|
165
|
+
See also:
|
|
166
|
+
|
|
167
|
+
* [hasDoxygenHeader](#hasdoxygenheader)
|
|
168
|
+
* [maxDataLineLength](#maxdatalinelength)
|
|
169
|
+
* [maxLineLength](#maxlinelength)
|
|
170
|
+
|
|
117
171
|
### maxLineLength
|
|
118
172
|
|
|
119
173
|
Code becomes far more readable when line lengths are short. The most compelling reason for short line lengths is to avoid the need to scroll when performing a side-by-side 'compare' between two files (eg as part of a GIT feature branch review). A longer discussion on optimal code line length can be found [here](https://stackoverflow.com/questions/578059/studies-on-optimal-code-width)
|
|
@@ -125,6 +179,11 @@ We strongly recommend a line length limit, and set the bar at 80. To turn this f
|
|
|
125
179
|
- Default: 80
|
|
126
180
|
- Severity: WARNING
|
|
127
181
|
|
|
182
|
+
See also:
|
|
183
|
+
|
|
184
|
+
* [maxDataLineLength](#maxdatalinelength)
|
|
185
|
+
* [maxHeaderLineLength](#maxheaderlinelength)
|
|
186
|
+
|
|
128
187
|
### noGremlins
|
|
129
188
|
|
|
130
189
|
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.
|
package/lint/shared.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LintConfig, Diagnostic } from '../types';
|
|
1
|
+
import { LintConfig, Diagnostic, LineLintRuleOptions } from '../types';
|
|
2
2
|
export declare const processText: (text: string, config: LintConfig) => Diagnostic[];
|
|
3
3
|
export declare const processFile: (filePath: string, config: LintConfig) => Diagnostic[];
|
|
4
|
-
export declare const processLine: (config: LintConfig, line: string, lineNumber: number) => Diagnostic[];
|
|
4
|
+
export declare const processLine: (config: LintConfig, line: string, lineNumber: number, options: LineLintRuleOptions) => Diagnostic[];
|
package/lint/shared.js
CHANGED
|
@@ -23,12 +23,17 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
|
23
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
24
|
exports.processLine = exports.processFile = exports.processText = void 0;
|
|
25
25
|
var utils_1 = require("../utils");
|
|
26
|
+
var utils_2 = require("../utils");
|
|
26
27
|
var processText = function (text, config) {
|
|
27
28
|
var lines = utils_1.splitText(text, config);
|
|
29
|
+
var headerLinesCount = utils_1.getHeaderLinesCount(text, config);
|
|
30
|
+
var dataSections = utils_2.getDataSectionsDetail(text, config);
|
|
28
31
|
var diagnostics = [];
|
|
29
32
|
diagnostics.push.apply(diagnostics, __spreadArray([], __read(processContent(config, text))));
|
|
30
33
|
lines.forEach(function (line, index) {
|
|
31
|
-
|
|
34
|
+
var isHeaderLine = index + 1 <= headerLinesCount;
|
|
35
|
+
var isDataLine = utils_2.checkIsDataLine(dataSections, index);
|
|
36
|
+
diagnostics.push.apply(diagnostics, __spreadArray([], __read(exports.processLine(config, line, index + 1, { isHeaderLine: isHeaderLine, isDataLine: isDataLine }))));
|
|
32
37
|
});
|
|
33
38
|
return diagnostics;
|
|
34
39
|
};
|
|
@@ -48,10 +53,10 @@ var processContent = function (config, content) {
|
|
|
48
53
|
});
|
|
49
54
|
return diagnostics;
|
|
50
55
|
};
|
|
51
|
-
var processLine = function (config, line, lineNumber) {
|
|
56
|
+
var processLine = function (config, line, lineNumber, options) {
|
|
52
57
|
var diagnostics = [];
|
|
53
58
|
config.lineLintRules.forEach(function (rule) {
|
|
54
|
-
diagnostics.push.apply(diagnostics, __spreadArray([], __read(rule.test(line, lineNumber, config))));
|
|
59
|
+
diagnostics.push.apply(diagnostics, __spreadArray([], __read(rule.test(line, lineNumber, config, options))));
|
|
55
60
|
});
|
|
56
61
|
return diagnostics;
|
|
57
62
|
};
|
package/lint/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/lint/shared.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/lint/shared.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,kCAAyD;AACzD,kCAAiE;AAE1D,IAAM,WAAW,GAAG,UAAC,IAAY,EAAE,MAAkB;IAC1D,IAAM,KAAK,GAAG,iBAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACrC,IAAM,gBAAgB,GAAG,2BAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC1D,IAAM,YAAY,GAAG,6BAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACxD,IAAM,WAAW,GAAiB,EAAE,CAAA;IACpC,WAAW,CAAC,IAAI,OAAhB,WAAW,2BAAS,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,IAAC;IACjD,KAAK,CAAC,OAAO,CAAC,UAAC,IAAI,EAAE,KAAK;QACxB,IAAM,YAAY,GAAG,KAAK,GAAG,CAAC,IAAI,gBAAgB,CAAA;QAClD,IAAM,UAAU,GAAG,uBAAe,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;QACvD,WAAW,CAAC,IAAI,OAAhB,WAAW,2BACN,mBAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,YAAY,cAAA,EAAE,UAAU,YAAA,EAAE,CAAC,IACtE;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAfY,QAAA,WAAW,eAevB;AAEM,IAAM,WAAW,GAAG,UACzB,QAAgB,EAChB,MAAkB;IAElB,IAAM,WAAW,GAAiB,EAAE,CAAA;IACpC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,UAAC,IAAI;QAChC,WAAW,CAAC,IAAI,OAAhB,WAAW,2BAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAC;IAClD,CAAC,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAVY,QAAA,WAAW,eAUvB;AAED,IAAM,cAAc,GAAG,UAAC,MAAkB,EAAE,OAAe;IACzD,IAAM,WAAW,GAAiB,EAAE,CAAA;IACpC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,UAAC,IAAI;QAChC,WAAW,CAAC,IAAI,OAAhB,WAAW,2BAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAC;IACjD,CAAC,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAEM,IAAM,WAAW,GAAG,UACzB,MAAkB,EAClB,IAAY,EACZ,UAAkB,EAClB,OAA4B;IAE5B,IAAM,WAAW,GAAiB,EAAE,CAAA;IACpC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,UAAC,IAAI;QAChC,WAAW,CAAC,IAAI,OAAhB,WAAW,2BAAS,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,IAAC;IACnE,CAAC,CAAC,CAAA;IAEF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAZY,QAAA,WAAW,eAYvB"}
|
package/package.json
CHANGED
|
@@ -39,17 +39,17 @@
|
|
|
39
39
|
},
|
|
40
40
|
"homepage": "https://github.com/sasjs/lint#readme",
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@types/jest": "
|
|
43
|
-
"@types/node": "
|
|
44
|
-
"all-contributors-cli": "
|
|
45
|
-
"jest": "
|
|
42
|
+
"@types/jest": "29.2.5",
|
|
43
|
+
"@types/node": "18.11.18",
|
|
44
|
+
"all-contributors-cli": "6.24.0",
|
|
45
|
+
"jest": "29.3.1",
|
|
46
46
|
"rimraf": "^3.0.2",
|
|
47
|
-
"ts-jest": "
|
|
47
|
+
"ts-jest": "29.0.3",
|
|
48
48
|
"typescript": "^4.3.2"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@sasjs/utils": "
|
|
52
|
-
"ignore": "
|
|
51
|
+
"@sasjs/utils": "2.52.0",
|
|
52
|
+
"ignore": "5.2.4"
|
|
53
53
|
},
|
|
54
|
-
"version": "2.
|
|
54
|
+
"version": "2.2.0"
|
|
55
55
|
}
|
|
@@ -3,12 +3,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.maxLineLength = void 0;
|
|
4
4
|
var LintRuleType_1 = require("../../types/LintRuleType");
|
|
5
5
|
var Severity_1 = require("../../types/Severity");
|
|
6
|
+
var utils_1 = require("../../utils");
|
|
6
7
|
var name = 'maxLineLength';
|
|
7
8
|
var description = 'Restrict lines to the specified length.';
|
|
8
9
|
var message = 'Line exceeds maximum length';
|
|
9
|
-
var test = function (value, lineNumber, config) {
|
|
10
|
+
var test = function (value, lineNumber, config, options) {
|
|
10
11
|
var severity = (config === null || config === void 0 ? void 0 : config.severityLevel[name]) || Severity_1.Severity.Warning;
|
|
11
|
-
var maxLineLength =
|
|
12
|
+
var maxLineLength = utils_1.DefaultLintConfiguration.maxLineLength;
|
|
13
|
+
if (config) {
|
|
14
|
+
if (options === null || options === void 0 ? void 0 : options.isHeaderLine) {
|
|
15
|
+
maxLineLength = Math.max(config.maxLineLength, config.maxHeaderLineLength);
|
|
16
|
+
}
|
|
17
|
+
else if (options === null || options === void 0 ? void 0 : options.isDataLine) {
|
|
18
|
+
maxLineLength = Math.max(config.maxLineLength, config.maxDataLineLength);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
maxLineLength = config.maxLineLength;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
12
24
|
if (value.length <= maxLineLength)
|
|
13
25
|
return [];
|
|
14
26
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maxLineLength.js","sourceRoot":"","sources":["../../../src/rules/line/maxLineLength.ts"],"names":[],"mappings":";;;AAEA,yDAAuD;AACvD,iDAA+C;
|
|
1
|
+
{"version":3,"file":"maxLineLength.js","sourceRoot":"","sources":["../../../src/rules/line/maxLineLength.ts"],"names":[],"mappings":";;;AAEA,yDAAuD;AACvD,iDAA+C;AAC/C,qCAAsD;AAEtD,IAAM,IAAI,GAAG,eAAe,CAAA;AAC5B,IAAM,WAAW,GAAG,yCAAyC,CAAA;AAC7D,IAAM,OAAO,GAAG,6BAA6B,CAAA;AAE7C,IAAM,IAAI,GAAG,UACX,KAAa,EACb,UAAkB,EAClB,MAAmB,EACnB,OAA6B;IAE7B,IAAM,QAAQ,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,CAAC,IAAI,CAAC,KAAI,mBAAQ,CAAC,OAAO,CAAA;IAChE,IAAI,aAAa,GAAG,gCAAwB,CAAC,aAAa,CAAA;IAE1D,IAAI,MAAM,EAAE;QACV,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,EAAE;YACzB,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAA;SAC3E;aAAM,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,EAAE;YAC9B,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;SACzE;aAAM;YACL,aAAa,GAAG,MAAM,CAAC,aAAa,CAAA;SACrC;KACF;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,aAAa;QAAE,OAAO,EAAE,CAAA;IAC5C,OAAO;QACL;YACE,OAAO,EAAK,OAAO,aAAO,KAAK,CAAC,MAAM,GAAG,aAAa,iBAAa;YACnE,UAAU,YAAA;YACV,iBAAiB,EAAE,CAAC;YACpB,eAAe,EAAE,CAAC;YAClB,QAAQ,UAAA;SACT;KACF,CAAA;AACH,CAAC,CAAA;AAED;;GAEG;AACU,QAAA,aAAa,GAAiB;IACzC,IAAI,EAAE,2BAAY,CAAC,IAAI;IACvB,IAAI,MAAA;IACJ,WAAW,aAAA;IACX,OAAO,SAAA;IACP,IAAI,MAAA;CACL,CAAA"}
|
package/rules/line/noGremlins.js
CHANGED
|
@@ -27,7 +27,7 @@ var __read = (this && this.__read) || function (o, n) {
|
|
|
27
27
|
return ar;
|
|
28
28
|
};
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.noGremlins = void 0;
|
|
30
|
+
exports.charFromHex = exports.noGremlins = void 0;
|
|
31
31
|
var LintRuleType_1 = require("../../types/LintRuleType");
|
|
32
32
|
var Severity_1 = require("../../types/Severity");
|
|
33
33
|
var utils_1 = require("../../utils");
|
|
@@ -37,14 +37,17 @@ var message = 'Line contains a gremlin';
|
|
|
37
37
|
var test = function (value, lineNumber, config) {
|
|
38
38
|
var e_1, _a;
|
|
39
39
|
var severity = (config === null || config === void 0 ? void 0 : config.severityLevel[name]) || Severity_1.Severity.Warning;
|
|
40
|
+
var allowedGremlins = (config === null || config === void 0 ? void 0 : config.allowedGremlins) || [];
|
|
40
41
|
var diagnostics = [];
|
|
41
42
|
var gremlins = {};
|
|
42
43
|
try {
|
|
43
44
|
for (var _b = __values(Object.entries(utils_1.gremlinCharacters)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
44
|
-
var _d = __read(_c.value, 2), hexCode = _d[0],
|
|
45
|
-
|
|
46
|
-
hexCode
|
|
47
|
-
|
|
45
|
+
var _d = __read(_c.value, 2), hexCode = _d[0], gremlinConfig = _d[1];
|
|
46
|
+
if (!allowedGremlins.includes(hexCode)) {
|
|
47
|
+
gremlins[exports.charFromHex(hexCode)] = Object.assign({}, gremlinConfig, {
|
|
48
|
+
hexCode: hexCode
|
|
49
|
+
});
|
|
50
|
+
}
|
|
48
51
|
}
|
|
49
52
|
}
|
|
50
53
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -81,5 +84,8 @@ exports.noGremlins = {
|
|
|
81
84
|
message: message,
|
|
82
85
|
test: test
|
|
83
86
|
};
|
|
84
|
-
var charFromHex = function (hexCode) {
|
|
87
|
+
var charFromHex = function (hexCode) {
|
|
88
|
+
return String.fromCodePoint(parseInt(hexCode));
|
|
89
|
+
};
|
|
90
|
+
exports.charFromHex = charFromHex;
|
|
85
91
|
//# sourceMappingURL=noGremlins.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noGremlins.js","sourceRoot":"","sources":["../../../src/rules/line/noGremlins.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yDAAuD;AACvD,iDAA+C;AAC/C,qCAA+C;AAE/C,IAAM,IAAI,GAAG,YAAY,CAAA;AACzB,IAAM,WAAW,GAAG,iDAAiD,CAAA;AACrE,IAAM,OAAO,GAAG,yBAAyB,CAAA;AAEzC,IAAM,IAAI,GAAG,UAAC,KAAa,EAAE,UAAkB,EAAE,MAAmB;;IAClE,IAAM,QAAQ,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,CAAC,IAAI,CAAC,KAAI,mBAAQ,CAAC,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"noGremlins.js","sourceRoot":"","sources":["../../../src/rules/line/noGremlins.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yDAAuD;AACvD,iDAA+C;AAC/C,qCAA+C;AAE/C,IAAM,IAAI,GAAG,YAAY,CAAA;AACzB,IAAM,WAAW,GAAG,iDAAiD,CAAA;AACrE,IAAM,OAAO,GAAG,yBAAyB,CAAA;AAEzC,IAAM,IAAI,GAAG,UAAC,KAAa,EAAE,UAAkB,EAAE,MAAmB;;IAClE,IAAM,QAAQ,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,CAAC,IAAI,CAAC,KAAI,mBAAQ,CAAC,OAAO,CAAA;IAChE,IAAM,eAAe,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,KAAI,EAAE,CAAA;IAErD,IAAM,WAAW,GAAiB,EAAE,CAAA;IAEpC,IAAM,QAAQ,GAAQ,EAAE,CAAA;;QAExB,KAAuC,IAAA,KAAA,SAAA,MAAM,CAAC,OAAO,CAAC,yBAAiB,CAAC,CAAA,gBAAA,4BAAE;YAA/D,IAAA,KAAA,mBAAwB,EAAvB,OAAO,QAAA,EAAE,aAAa,QAAA;YAChC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBACtC,QAAQ,CAAC,mBAAW,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE;oBAChE,OAAO,SAAA;iBACR,CAAC,CAAA;aACH;SACF;;;;;;;;;IAED,IAAM,kBAAkB,GAAG,IAAI,MAAM,CACnC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;SAClB,GAAG,CAAC,UAAC,IAAI,IAAK,OAAG,IAAI,MAAG,EAAV,CAAU,CAAC;SACzB,IAAI,CAAC,GAAG,CAAC,EACZ,GAAG,CACJ,CAAA;IAED,IAAI,KAAK,CAAA;IACT,OAAO,CAAC,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;QAC/C,IAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,IAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAE1C,WAAW,CAAC,IAAI,CAAC;YACf,OAAO,EAAK,OAAO,UAAK,OAAO,CAAC,WAAW,kBAAa,OAAO,CAAC,OAAO,MAAG;YAC1E,UAAU,YAAA;YACV,iBAAiB,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC;YAClC,eAAe,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;YAClD,QAAQ,UAAA;SACT,CAAC,CAAA;KACH;IAED,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAED;;GAEG;AACU,QAAA,UAAU,GAAiB;IACtC,IAAI,EAAE,2BAAY,CAAC,IAAI;IACvB,IAAI,MAAA;IACJ,WAAW,aAAA;IACX,OAAO,SAAA;IACP,IAAI,MAAA;CACL,CAAA;AAEM,IAAM,WAAW,GAAG,UAAC,OAAe;IACzC,OAAA,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAAvC,CAAuC,CAAA;AAD5B,QAAA,WAAW,eACiB"}
|
package/sasjslint-schema.json
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
"indentationMultiple": 2,
|
|
14
14
|
"lowerCaseFileNames": true,
|
|
15
15
|
"maxLineLength": 80,
|
|
16
|
+
"maxHeaderLineLength": 80,
|
|
17
|
+
"maxDataLineLength": 80,
|
|
16
18
|
"noGremlins": true,
|
|
17
19
|
"noNestedMacros": true,
|
|
18
20
|
"noSpacesInFileNames": true,
|
|
@@ -30,7 +32,10 @@
|
|
|
30
32
|
"noSpacesInFileNames": true,
|
|
31
33
|
"lowerCaseFileNames": true,
|
|
32
34
|
"maxLineLength": 80,
|
|
35
|
+
"maxHeaderLineLength": 80,
|
|
36
|
+
"maxDataLineLength": 80,
|
|
33
37
|
"noGremlins": true,
|
|
38
|
+
"allowedGremlins": ["0x0080", "0x3000"],
|
|
34
39
|
"noTabs": true,
|
|
35
40
|
"indentationMultiple": 4,
|
|
36
41
|
"hasMacroNameInMend": true,
|
|
@@ -74,6 +79,18 @@
|
|
|
74
79
|
"default": [true],
|
|
75
80
|
"examples": [true, false]
|
|
76
81
|
},
|
|
82
|
+
"allowedGremlins": {
|
|
83
|
+
"$id": "#/properties/allowedGremlins",
|
|
84
|
+
"type": "array",
|
|
85
|
+
"items": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"pattern": "^0x[0-9A-Fa-f]{4}$"
|
|
88
|
+
},
|
|
89
|
+
"title": "allowedGremlins",
|
|
90
|
+
"description": "An array of hex codes that represents allowed gremlins.",
|
|
91
|
+
"default": [],
|
|
92
|
+
"examples": ["0x0080", "0x3000"]
|
|
93
|
+
},
|
|
77
94
|
"hasMacroNameInMend": {
|
|
78
95
|
"$id": "#/properties/hasMacroNameInMend",
|
|
79
96
|
"type": "boolean",
|
|
@@ -114,6 +131,22 @@
|
|
|
114
131
|
"default": 80,
|
|
115
132
|
"examples": [60, 80, 120]
|
|
116
133
|
},
|
|
134
|
+
"maxHeaderLineLength": {
|
|
135
|
+
"$id": "#/properties/maxHeaderLineLength",
|
|
136
|
+
"type": "number",
|
|
137
|
+
"title": "maxHeaderLineLength",
|
|
138
|
+
"description": "Enforces a configurable maximum line length for header section. Shows a warning for lines exceeding this length.",
|
|
139
|
+
"default": 80,
|
|
140
|
+
"examples": [60, 80, 120]
|
|
141
|
+
},
|
|
142
|
+
"maxDataLineLength": {
|
|
143
|
+
"$id": "#/properties/maxDataLineLength",
|
|
144
|
+
"type": "number",
|
|
145
|
+
"title": "maxDataLineLength",
|
|
146
|
+
"description": "Enforces a configurable maximum line length for data section. Shows a warning for lines exceeding this length.",
|
|
147
|
+
"default": 80,
|
|
148
|
+
"examples": [60, 80, 120]
|
|
149
|
+
},
|
|
117
150
|
"noNestedMacros": {
|
|
118
151
|
"$id": "#/properties/noNestedMacros",
|
|
119
152
|
"type": "boolean",
|
package/types/LintConfig.d.ts
CHANGED
|
@@ -10,10 +10,13 @@ import { Severity } from './Severity';
|
|
|
10
10
|
*/
|
|
11
11
|
export declare class LintConfig {
|
|
12
12
|
readonly ignoreList: string[];
|
|
13
|
+
readonly allowedGremlins: string[];
|
|
13
14
|
readonly lineLintRules: LineLintRule[];
|
|
14
15
|
readonly fileLintRules: FileLintRule[];
|
|
15
16
|
readonly pathLintRules: PathLintRule[];
|
|
16
17
|
readonly maxLineLength: number;
|
|
18
|
+
readonly maxHeaderLineLength: number;
|
|
19
|
+
readonly maxDataLineLength: number;
|
|
17
20
|
readonly indentationMultiple: number;
|
|
18
21
|
readonly lineEndings: LineEndings;
|
|
19
22
|
readonly defaultHeader: string;
|
package/types/LintConfig.js
CHANGED
|
@@ -46,10 +46,13 @@ var LintConfig = /** @class */ (function () {
|
|
|
46
46
|
var e_1, _a;
|
|
47
47
|
var _this = this;
|
|
48
48
|
this.ignoreList = [];
|
|
49
|
+
this.allowedGremlins = [];
|
|
49
50
|
this.lineLintRules = [];
|
|
50
51
|
this.fileLintRules = [];
|
|
51
52
|
this.pathLintRules = [];
|
|
52
53
|
this.maxLineLength = 80;
|
|
54
|
+
this.maxHeaderLineLength = 80;
|
|
55
|
+
this.maxDataLineLength = 80;
|
|
53
56
|
this.indentationMultiple = 2;
|
|
54
57
|
this.lineEndings = LineEndings_1.LineEndings.LF;
|
|
55
58
|
this.defaultHeader = utils_1.getDefaultHeader();
|
|
@@ -77,9 +80,15 @@ var LintConfig = /** @class */ (function () {
|
|
|
77
80
|
if ((json === null || json === void 0 ? void 0 : json.noTabs) === false || (json === null || json === void 0 ? void 0 : json.noTabIndentation) === false) {
|
|
78
81
|
this.lineLintRules.pop();
|
|
79
82
|
}
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
if ((json === null || json === void 0 ? void 0 : json.maxLineLength) > 0) {
|
|
84
|
+
this.lineLintRules.push(line_1.maxLineLength);
|
|
82
85
|
this.maxLineLength = json.maxLineLength;
|
|
86
|
+
if (!isNaN(json === null || json === void 0 ? void 0 : json.maxHeaderLineLength)) {
|
|
87
|
+
this.maxHeaderLineLength = json.maxHeaderLineLength;
|
|
88
|
+
}
|
|
89
|
+
if (!isNaN(json === null || json === void 0 ? void 0 : json.maxDataLineLength)) {
|
|
90
|
+
this.maxDataLineLength = json.maxDataLineLength;
|
|
91
|
+
}
|
|
83
92
|
}
|
|
84
93
|
this.fileLintRules.push(file_1.lineEndings);
|
|
85
94
|
if (json === null || json === void 0 ? void 0 : json.lineEndings) {
|
|
@@ -119,6 +128,19 @@ var LintConfig = /** @class */ (function () {
|
|
|
119
128
|
}
|
|
120
129
|
if ((json === null || json === void 0 ? void 0 : json.noGremlins) !== false) {
|
|
121
130
|
this.lineLintRules.push(line_1.noGremlins);
|
|
131
|
+
if (json === null || json === void 0 ? void 0 : json.allowedGremlins) {
|
|
132
|
+
if (Array.isArray(json.allowedGremlins)) {
|
|
133
|
+
json.allowedGremlins.forEach(function (item) {
|
|
134
|
+
if (typeof item === 'string' && /^0x[0-9a-f]{4}$/i.test(item))
|
|
135
|
+
_this.allowedGremlins.push(item);
|
|
136
|
+
else
|
|
137
|
+
throw new Error("Property \"allowedGremlins\" has invalid type of values. It can contain only strings of form hexcode like '[\"0x0080\", \"0x3000\"]'");
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
throw new Error("Property \"allowedGremlins\" can only be an array of strings of form hexcode like '[\"0x0080\", \"0x3000\"]'");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
122
144
|
}
|
|
123
145
|
if (json === null || json === void 0 ? void 0 : json.severityLevel) {
|
|
124
146
|
try {
|
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,sCAOsB;AACtB,sCAAuE;AACvE,6CAA2C;AAE3C,kCAA2C;AAC3C,uCAAqC;AAErC;;;;;;GAMG;AACH;
|
|
1
|
+
{"version":3,"file":"LintConfig.js","sourceRoot":"","sources":["../../src/types/LintConfig.ts"],"names":[],"mappings":"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"}
|
package/types/LintRule.d.ts
CHANGED
|
@@ -11,12 +11,16 @@ export interface LintRule {
|
|
|
11
11
|
description: string;
|
|
12
12
|
message: string;
|
|
13
13
|
}
|
|
14
|
+
export interface LineLintRuleOptions {
|
|
15
|
+
isHeaderLine?: boolean;
|
|
16
|
+
isDataLine?: boolean;
|
|
17
|
+
}
|
|
14
18
|
/**
|
|
15
19
|
* A LineLintRule is run once per line of text.
|
|
16
20
|
*/
|
|
17
21
|
export interface LineLintRule extends LintRule {
|
|
18
22
|
type: LintRuleType.Line;
|
|
19
|
-
test: (value: string, lineNumber: number, config?: LintConfig) => Diagnostic[];
|
|
23
|
+
test: (value: string, lineNumber: number, config?: LintConfig, options?: LineLintRuleOptions) => Diagnostic[];
|
|
20
24
|
fix?: (value: string, config?: LintConfig) => string;
|
|
21
25
|
}
|
|
22
26
|
/**
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LintConfig } from '../types';
|
|
2
|
+
interface DataSectionsDetail {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const getDataSectionsDetail: (text: string, config: LintConfig) => DataSectionsDetail[];
|
|
7
|
+
export declare const checkIsDataLine: (dataSections: DataSectionsDetail[], lineIndex: number) => boolean;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.checkIsDataLine = exports.getDataSectionsDetail = void 0;
|
|
15
|
+
var splitText_1 = require("./splitText");
|
|
16
|
+
var getDataSectionsDetail = function (text, config) {
|
|
17
|
+
var dataSections = [];
|
|
18
|
+
var lines = splitText_1.splitText(text, config);
|
|
19
|
+
var dataSectionStartRegex1 = new RegExp('^(datalines;)|(cards;)|(parmcards;)');
|
|
20
|
+
var dataSectionEndRegex1 = new RegExp(';');
|
|
21
|
+
var dataSectionStartRegex2 = new RegExp('^(datalines4;)|(cards4;)|(parmcards4;)');
|
|
22
|
+
var dataSectionEndRegex2 = new RegExp(';;;;');
|
|
23
|
+
var dataSectionStarted = false;
|
|
24
|
+
var dataSectionStartIndex = -1;
|
|
25
|
+
var dataSectionEndRegex = dataSectionEndRegex1;
|
|
26
|
+
lines.forEach(function (line, index) {
|
|
27
|
+
if (dataSectionStarted) {
|
|
28
|
+
if (dataSectionEndRegex.test(line)) {
|
|
29
|
+
dataSections.push({ start: dataSectionStartIndex, end: index });
|
|
30
|
+
dataSectionStarted = false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
if (dataSectionStartRegex1.test(line)) {
|
|
35
|
+
dataSectionStarted = true;
|
|
36
|
+
dataSectionStartIndex = index;
|
|
37
|
+
dataSectionEndRegex = dataSectionEndRegex1;
|
|
38
|
+
}
|
|
39
|
+
else if (dataSectionStartRegex2.test(line)) {
|
|
40
|
+
dataSectionStarted = true;
|
|
41
|
+
dataSectionStartIndex = index;
|
|
42
|
+
dataSectionEndRegex = dataSectionEndRegex2;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return dataSections;
|
|
47
|
+
};
|
|
48
|
+
exports.getDataSectionsDetail = getDataSectionsDetail;
|
|
49
|
+
var checkIsDataLine = function (dataSections, lineIndex) {
|
|
50
|
+
var e_1, _a;
|
|
51
|
+
try {
|
|
52
|
+
for (var dataSections_1 = __values(dataSections), dataSections_1_1 = dataSections_1.next(); !dataSections_1_1.done; dataSections_1_1 = dataSections_1.next()) {
|
|
53
|
+
var dataSection = dataSections_1_1.value;
|
|
54
|
+
if (lineIndex >= dataSection.start && lineIndex <= dataSection.end)
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
59
|
+
finally {
|
|
60
|
+
try {
|
|
61
|
+
if (dataSections_1_1 && !dataSections_1_1.done && (_a = dataSections_1.return)) _a.call(dataSections_1);
|
|
62
|
+
}
|
|
63
|
+
finally { if (e_1) throw e_1.error; }
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
};
|
|
67
|
+
exports.checkIsDataLine = checkIsDataLine;
|
|
68
|
+
//# sourceMappingURL=getDataSectionsDetail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDataSectionsDetail.js","sourceRoot":"","sources":["../../src/utils/getDataSectionsDetail.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,yCAAuC;AAOhC,IAAM,qBAAqB,GAAG,UAAC,IAAY,EAAE,MAAkB;IACpE,IAAM,YAAY,GAAyB,EAAE,CAAA;IAC7C,IAAM,KAAK,GAAG,qBAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAErC,IAAM,sBAAsB,GAAG,IAAI,MAAM,CACvC,qCAAqC,CACtC,CAAA;IACD,IAAM,oBAAoB,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAM,sBAAsB,GAAG,IAAI,MAAM,CACvC,wCAAwC,CACzC,CAAA;IACD,IAAM,oBAAoB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;IAE/C,IAAI,kBAAkB,GAAG,KAAK,CAAA;IAC9B,IAAI,qBAAqB,GAAG,CAAC,CAAC,CAAA;IAC9B,IAAI,mBAAmB,GAAG,oBAAoB,CAAA;IAE9C,KAAK,CAAC,OAAO,CAAC,UAAC,IAAI,EAAE,KAAK;QACxB,IAAI,kBAAkB,EAAE;YACtB,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAClC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;gBAC/D,kBAAkB,GAAG,KAAK,CAAA;aAC3B;SACF;aAAM;YACL,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACrC,kBAAkB,GAAG,IAAI,CAAA;gBACzB,qBAAqB,GAAG,KAAK,CAAA;gBAC7B,mBAAmB,GAAG,oBAAoB,CAAA;aAC3C;iBAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC5C,kBAAkB,GAAG,IAAI,CAAA;gBACzB,qBAAqB,GAAG,KAAK,CAAA;gBAC7B,mBAAmB,GAAG,oBAAoB,CAAA;aAC3C;SACF;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AArCY,QAAA,qBAAqB,yBAqCjC;AAEM,IAAM,eAAe,GAAG,UAC7B,YAAkC,EAClC,SAAiB;;;QAEjB,KAA0B,IAAA,iBAAA,SAAA,YAAY,CAAA,0CAAA,oEAAE;YAAnC,IAAM,WAAW,yBAAA;YACpB,IAAI,SAAS,IAAI,WAAW,CAAC,KAAK,IAAI,SAAS,IAAI,WAAW,CAAC,GAAG;gBAChE,OAAO,IAAI,CAAA;SACd;;;;;;;;;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAVY,QAAA,eAAe,mBAU3B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { LintConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* This function returns the number of lines the header spans upon.
|
|
4
|
+
* The file must start with "/*" and the header will finish with ⇙
|
|
5
|
+
*/
|
|
6
|
+
export declare const getHeaderLinesCount: (text: string, config: LintConfig) => number;
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.getHeaderLinesCount = void 0;
|
|
15
|
+
var splitText_1 = require("./splitText");
|
|
16
|
+
/**
|
|
17
|
+
* This function returns the number of lines the header spans upon.
|
|
18
|
+
* The file must start with "/*" and the header will finish with ⇙
|
|
19
|
+
*/
|
|
20
|
+
var getHeaderLinesCount = function (text, config) {
|
|
21
|
+
var e_1, _a;
|
|
22
|
+
var count = 0;
|
|
23
|
+
if (text.trimStart().startsWith('/*')) {
|
|
24
|
+
var lines = splitText_1.splitText(text, config);
|
|
25
|
+
try {
|
|
26
|
+
for (var lines_1 = __values(lines), lines_1_1 = lines_1.next(); !lines_1_1.done; lines_1_1 = lines_1.next()) {
|
|
27
|
+
var line = lines_1_1.value;
|
|
28
|
+
count++;
|
|
29
|
+
if (line.match(/\*\//)) {
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
35
|
+
finally {
|
|
36
|
+
try {
|
|
37
|
+
if (lines_1_1 && !lines_1_1.done && (_a = lines_1.return)) _a.call(lines_1);
|
|
38
|
+
}
|
|
39
|
+
finally { if (e_1) throw e_1.error; }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return count;
|
|
43
|
+
};
|
|
44
|
+
exports.getHeaderLinesCount = getHeaderLinesCount;
|
|
45
|
+
//# sourceMappingURL=getHeaderLinesCount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getHeaderLinesCount.js","sourceRoot":"","sources":["../../src/utils/getHeaderLinesCount.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,yCAAuC;AAEvC;;;GAGG;AACI,IAAM,mBAAmB,GAAG,UAAC,IAAY,EAAE,MAAkB;;IAClE,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QACrC,IAAM,KAAK,GAAG,qBAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;;YAErC,KAAmB,IAAA,UAAA,SAAA,KAAK,CAAA,4BAAA,+CAAE;gBAArB,IAAM,IAAI,kBAAA;gBACb,KAAK,EAAE,CAAA;gBACP,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;oBACtB,MAAK;iBACN;aACF;;;;;;;;;KACF;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAfY,QAAA,mBAAmB,uBAe/B"}
|
package/utils/getLintConfig.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export declare const DefaultLintConfiguration: {
|
|
|
10
10
|
noSpacesInFileNames: boolean;
|
|
11
11
|
lowerCaseFileNames: boolean;
|
|
12
12
|
maxLineLength: number;
|
|
13
|
+
maxHeaderLineLength: number;
|
|
14
|
+
maxDataLineLength: number;
|
|
13
15
|
noTabIndentation: boolean;
|
|
14
16
|
indentationMultiple: number;
|
|
15
17
|
hasMacroNameInMend: boolean;
|
package/utils/getLintConfig.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLintConfig.js","sourceRoot":"","sources":["../../src/utils/getLintConfig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAuB;AACvB,kDAAgD;AAChD,0CAA4C;AAC5C,mDAAiD;AAE1C,IAAM,gBAAgB,GAAG;IAC9B,OAAA,gHAAgH;AAAhH,CAAgH,CAAA;AADrG,QAAA,gBAAgB,oBACqF;AAElH;;GAEG;AACU,QAAA,wBAAwB,GAAG;IACtC,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,aAAa,EAAE,EAAE;IACjB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,CAAC;IACtB,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;IACpB,mBAAmB,EAAE,IAAI;IACzB,qBAAqB,EAAE,IAAI;IAC3B,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,wBAAgB,EAAE;CAClC,CAAA;AAED;;;;GAIG;AACH,SAAsB,aAAa;;;;;wBACb,qBAAM,+BAAc,EAAE,EAAA;;oBAApC,WAAW,GAAG,SAAsB;oBACpB,qBAAM,eAAQ,CAClC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CACrC,CAAC,KAAK,CAAC,UAAC,CAAC;4BACR,OAAO,IAAI,CAAC,SAAS,CAAC,gCAAwB,CAAC,CAAA;wBACjD,CAAC,CAAC,EAAA;;oBAJI,aAAa,GAAG,SAIpB;oBACF,sBAAO,IAAI,uBAAU,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAA;;;;CACjD;AARD,sCAQC"}
|
|
1
|
+
{"version":3,"file":"getLintConfig.js","sourceRoot":"","sources":["../../src/utils/getLintConfig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAuB;AACvB,kDAAgD;AAChD,0CAA4C;AAC5C,mDAAiD;AAE1C,IAAM,gBAAgB,GAAG;IAC9B,OAAA,gHAAgH;AAAhH,CAAgH,CAAA;AADrG,QAAA,gBAAgB,oBACqF;AAElH;;GAEG;AACU,QAAA,wBAAwB,GAAG;IACtC,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,aAAa,EAAE,EAAE;IACjB,mBAAmB,EAAE,EAAE;IACvB,iBAAiB,EAAE,EAAE;IACrB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,CAAC;IACtB,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;IACpB,mBAAmB,EAAE,IAAI;IACzB,qBAAqB,EAAE,IAAI;IAC3B,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,wBAAgB,EAAE;CAClC,CAAA;AAED;;;;GAIG;AACH,SAAsB,aAAa;;;;;wBACb,qBAAM,+BAAc,EAAE,EAAA;;oBAApC,WAAW,GAAG,SAAsB;oBACpB,qBAAM,eAAQ,CAClC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CACrC,CAAC,KAAK,CAAC,UAAC,CAAC;4BACR,OAAO,IAAI,CAAC,SAAS,CAAC,gCAAwB,CAAC,CAAA;wBACjD,CAAC,CAAC,EAAA;;oBAJI,aAAa,GAAG,SAIpB;oBACF,sBAAO,IAAI,uBAAU,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAA;;;;CACjD;AARD,sCAQC"}
|
package/utils/index.d.ts
CHANGED
package/utils/index.js
CHANGED
|
@@ -18,4 +18,6 @@ __exportStar(require("./isIgnored"), exports);
|
|
|
18
18
|
__exportStar(require("./listSasFiles"), exports);
|
|
19
19
|
__exportStar(require("./splitText"), exports);
|
|
20
20
|
__exportStar(require("./getIndicesOf"), exports);
|
|
21
|
+
__exportStar(require("./getHeaderLinesCount"), exports);
|
|
22
|
+
__exportStar(require("./getDataSectionsDetail"), exports);
|
|
21
23
|
//# sourceMappingURL=index.js.map
|
package/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAA8B;AAC9B,kDAA+B;AAC/B,mDAAgC;AAChC,sDAAmC;AACnC,8CAA2B;AAC3B,iDAA8B;AAC9B,8CAA2B;AAC3B,iDAA8B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAA8B;AAC9B,kDAA+B;AAC/B,mDAAgC;AAChC,sDAAmC;AACnC,8CAA2B;AAC3B,iDAA8B;AAC9B,8CAA2B;AAC3B,iDAA8B;AAC9B,wDAAqC;AACrC,0DAAuC"}
|