isml-linter 5.39.1 → 5.40.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/CHANGELOG.md +1177 -1142
- package/LICENSE +21 -21
- package/README.md +245 -245
- package/bin/isml-linter.js +32 -32
- package/ismllinter.config.js +33 -33
- package/package.json +53 -53
- package/scaffold_files/ismllinter.config.js +47 -47
- package/src/Builder.js +15 -15
- package/src/Constants.js +139 -139
- package/src/IsmlLinter.js +255 -255
- package/src/enums/ParseStatus.js +5 -5
- package/src/enums/SfccTagContainer.js +287 -287
- package/src/isml_tree/ContainerNode.js +38 -38
- package/src/isml_tree/IsmlNode.js +692 -658
- package/src/isml_tree/MaskUtils.js +421 -419
- package/src/isml_tree/ParseUtils.js +515 -434
- package/src/isml_tree/TreeBuilder.js +273 -271
- package/src/publicApi.js +24 -24
- package/src/rules/line_by_line/enforce-isprint.js +53 -53
- package/src/rules/line_by_line/enforce-require.js +35 -35
- package/src/rules/line_by_line/lowercase-filename.js +29 -29
- package/src/rules/line_by_line/max-lines.js +37 -37
- package/src/rules/line_by_line/no-br.js +36 -36
- package/src/rules/line_by_line/no-git-conflict.js +43 -43
- package/src/rules/line_by_line/no-import-package.js +34 -34
- package/src/rules/line_by_line/no-inline-style.js +34 -34
- package/src/rules/line_by_line/no-isscript.js +34 -34
- package/src/rules/line_by_line/no-space-only-lines.js +47 -47
- package/src/rules/line_by_line/no-tabs.js +38 -38
- package/src/rules/line_by_line/no-trailing-spaces.js +52 -52
- package/src/rules/prototypes/RulePrototype.js +79 -79
- package/src/rules/prototypes/SingleLineRulePrototype.js +47 -47
- package/src/rules/prototypes/TreeRulePrototype.js +84 -84
- package/src/rules/tree/align-isset.js +87 -87
- package/src/rules/tree/contextual-attrs.js +105 -105
- package/src/rules/tree/custom-tags.js +54 -54
- package/src/rules/tree/disallow-tags.js +39 -39
- package/src/rules/tree/empty-eof.js +66 -66
- package/src/rules/tree/enforce-security.js +85 -85
- package/src/rules/tree/eslint-to-isscript.js +179 -179
- package/src/rules/tree/indent.js +856 -853
- package/src/rules/tree/leading-iscache.js +39 -43
- package/src/rules/tree/leading-iscontent.js +35 -39
- package/src/rules/tree/max-depth.js +54 -54
- package/src/rules/tree/no-deprecated-attrs.js +67 -67
- package/src/rules/tree/no-embedded-isml.js +17 -17
- package/src/rules/tree/no-hardcode.js +51 -51
- package/src/rules/tree/no-iselse-slash.js +35 -35
- package/src/rules/tree/no-redundant-context.js +134 -134
- package/src/rules/tree/no-require-in-loop.js +63 -63
- package/src/rules/tree/one-element-per-line.js +82 -76
- package/src/util/CommandLineUtils.js +19 -19
- package/src/util/ConfigUtils.js +219 -219
- package/src/util/ConsoleUtils.js +327 -327
- package/src/util/CustomTagContainer.js +45 -45
- package/src/util/ExceptionUtils.js +149 -136
- package/src/util/FileUtils.js +79 -79
- package/src/util/GeneralUtils.js +60 -60
- package/src/util/NativeExtensionUtils.js +6 -6
- package/src/util/RuleUtils.js +295 -295
- package/src/util/TempRuleUtils.js +232 -232
|
@@ -1,179 +1,179 @@
|
|
|
1
|
-
const TreeRulePrototype = require('../prototypes/TreeRulePrototype');
|
|
2
|
-
const ParseUtils = require('../../isml_tree/ParseUtils');
|
|
3
|
-
const Constants = require('../../Constants');
|
|
4
|
-
const ConfigUtils = require('../../util/ConfigUtils');
|
|
5
|
-
const GeneralUtils = require('../../util/GeneralUtils');
|
|
6
|
-
|
|
7
|
-
const ruleId = require('path').basename(__filename).slice(0, -3);
|
|
8
|
-
const description = 'Not eslint-valid';
|
|
9
|
-
const notFoundMessage = 'No eslint configuration file found: ' + ConfigUtils.getEslintConfigFilePath();
|
|
10
|
-
|
|
11
|
-
const Rule = Object.create(TreeRulePrototype);
|
|
12
|
-
|
|
13
|
-
let isscriptContentArray = [];
|
|
14
|
-
|
|
15
|
-
Rule.init(ruleId, description);
|
|
16
|
-
|
|
17
|
-
Rule.addError = function(node, eslintError, ismlOffset, linter, data) {
|
|
18
|
-
const errorLine = linter.getSourceCode() ?
|
|
19
|
-
linter.getSourceCode().lines[eslintError.line - 1] :
|
|
20
|
-
node.head.split('\n')[eslintError.line - 1];
|
|
21
|
-
|
|
22
|
-
const duplicatedOffset = ParseUtils.getNextNonEmptyCharPos(node.head);
|
|
23
|
-
const errorLocalPos = node.head.indexOf(errorLine.trimStart()) - duplicatedOffset;
|
|
24
|
-
let errorGlobalPos = node.globalPos;
|
|
25
|
-
let columnNumber = node.columnNumber;
|
|
26
|
-
let length = errorLine.trimStart().length;
|
|
27
|
-
let message;
|
|
28
|
-
|
|
29
|
-
errorGlobalPos += data.isCrlfLineBreak ?
|
|
30
|
-
errorLocalPos + eslintError.line - 2 :
|
|
31
|
-
node.head.trimStart().indexOf(errorLine.trimStart());
|
|
32
|
-
|
|
33
|
-
if (eslintError.ruleId === 'indent') {
|
|
34
|
-
length = getIndentErrorLength(eslintError, ismlOffset);
|
|
35
|
-
message = getIsmlIdentMessage(eslintError, ismlOffset);
|
|
36
|
-
errorGlobalPos -= length;
|
|
37
|
-
columnNumber = length + 1;
|
|
38
|
-
|
|
39
|
-
} else {
|
|
40
|
-
message = eslintError.message;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const error = this.getError(
|
|
44
|
-
ismlOffset + errorLine,
|
|
45
|
-
node.lineNumber + eslintError.line - 2,
|
|
46
|
-
columnNumber,
|
|
47
|
-
errorGlobalPos,
|
|
48
|
-
length,
|
|
49
|
-
message
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
return error;
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
Rule.check = function(node, data) {
|
|
56
|
-
let eslintConfig = null;
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
eslintConfig = ConfigUtils.loadEslintConfig();
|
|
60
|
-
} catch (err) {
|
|
61
|
-
const error = this.getError(null, 0, 1, 0, 1, notFoundMessage);
|
|
62
|
-
return { occurrenceList : [error] };
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
this.checkChildren(node, data);
|
|
66
|
-
|
|
67
|
-
if (node.isIsscriptContent()) {
|
|
68
|
-
isscriptContentArray.push(node);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (node.isRoot()) {
|
|
72
|
-
const ESLinter = require('eslint').Linter;
|
|
73
|
-
const ruleConfig = this.getConfigs();
|
|
74
|
-
const eslinter = new ESLinter();
|
|
75
|
-
const occurrenceList = [];
|
|
76
|
-
|
|
77
|
-
for (let index = 0; index < isscriptContentArray.length; index++) {
|
|
78
|
-
const jsContentNode = isscriptContentArray[index];
|
|
79
|
-
let content = jsContentNode.head;
|
|
80
|
-
|
|
81
|
-
const ismlOffset = getIsmlOffset(jsContentNode);
|
|
82
|
-
|
|
83
|
-
content = unindent(content, ismlOffset.length);
|
|
84
|
-
|
|
85
|
-
const errorArray = eslinter.verify(content, eslintConfig);
|
|
86
|
-
|
|
87
|
-
for (let i = 0; i < errorArray.length; i++) {
|
|
88
|
-
const error = this.addError(jsContentNode, errorArray[i], ismlOffset, eslinter, data);
|
|
89
|
-
occurrenceList.push(error);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
isscriptContentArray = [];
|
|
94
|
-
|
|
95
|
-
return this.return(node, occurrenceList, ruleConfig);
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
Rule.getFixedContent = function(node) {
|
|
100
|
-
let eslintConfig = null;
|
|
101
|
-
|
|
102
|
-
try {
|
|
103
|
-
eslintConfig = ConfigUtils.loadEslintConfig();
|
|
104
|
-
} catch (err) {
|
|
105
|
-
const error = this.getError(null, 0, 1, 0, 1, notFoundMessage);
|
|
106
|
-
return { occurrenceList : [error] };
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
for (let i = 0; i < node.children.length; i++) {
|
|
110
|
-
this.getFixedContent(node.children[i]);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (node.isIsscriptContent()) {
|
|
114
|
-
const Linter = require('eslint').Linter;
|
|
115
|
-
const linter = new Linter();
|
|
116
|
-
let content = node.head;
|
|
117
|
-
const ismlOffset = getIsmlOffset(node);
|
|
118
|
-
|
|
119
|
-
this.result.fixedContent = content = linter.verifyAndFix(content, eslintConfig).output;
|
|
120
|
-
|
|
121
|
-
node.head = reIndent(content, ismlOffset);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return GeneralUtils.applyActiveLineBreaks(node.toString());
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
const unindent = (content, indentSize) => {
|
|
128
|
-
const lineArray = content.split(Constants.EOL);
|
|
129
|
-
const result = [];
|
|
130
|
-
|
|
131
|
-
for (let i = 0; i < lineArray.length; i++) {
|
|
132
|
-
const line = lineArray[i];
|
|
133
|
-
|
|
134
|
-
result.push(line.substring(indentSize));
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return result.join(Constants.EOL);
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
const reIndent = (content, ismlIndentation) => {
|
|
141
|
-
const lineArray = content.split(Constants.EOL);
|
|
142
|
-
const result = [];
|
|
143
|
-
|
|
144
|
-
for (let i = 0; i < lineArray.length; i++) {
|
|
145
|
-
const line = lineArray[i];
|
|
146
|
-
|
|
147
|
-
result.push(line.trim() ? ismlIndentation + line : '');
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return result.join(Constants.EOL);
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
const getIsmlOffset = node => {
|
|
154
|
-
const indentSize = (node.depth - 1) * 4;
|
|
155
|
-
let ismlIndentation = '';
|
|
156
|
-
|
|
157
|
-
for (let i = 0; i < indentSize; i = i + 1) {
|
|
158
|
-
ismlIndentation += ' ';
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return ismlIndentation;
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
const getIndentErrorLength = (eslintError, ismlOffset) => {
|
|
165
|
-
const messageWordList = eslintError.message.split(' ');
|
|
166
|
-
|
|
167
|
-
return Number(messageWordList[7].slice(0, -1)) + ismlOffset.length;
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
const getIsmlIdentMessage = (eslintError, ismlOffset) => {
|
|
171
|
-
const messageWordList = eslintError.message.split(' ');
|
|
172
|
-
|
|
173
|
-
messageWordList[3] = Number(messageWordList[3]) + ismlOffset.length;
|
|
174
|
-
messageWordList[7] = Number(messageWordList[7].slice(0, -1)) + ismlOffset.length + '.';
|
|
175
|
-
|
|
176
|
-
return messageWordList.join(' ');
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
module.exports = Rule;
|
|
1
|
+
const TreeRulePrototype = require('../prototypes/TreeRulePrototype');
|
|
2
|
+
const ParseUtils = require('../../isml_tree/ParseUtils');
|
|
3
|
+
const Constants = require('../../Constants');
|
|
4
|
+
const ConfigUtils = require('../../util/ConfigUtils');
|
|
5
|
+
const GeneralUtils = require('../../util/GeneralUtils');
|
|
6
|
+
|
|
7
|
+
const ruleId = require('path').basename(__filename).slice(0, -3);
|
|
8
|
+
const description = 'Not eslint-valid';
|
|
9
|
+
const notFoundMessage = 'No eslint configuration file found: ' + ConfigUtils.getEslintConfigFilePath();
|
|
10
|
+
|
|
11
|
+
const Rule = Object.create(TreeRulePrototype);
|
|
12
|
+
|
|
13
|
+
let isscriptContentArray = [];
|
|
14
|
+
|
|
15
|
+
Rule.init(ruleId, description);
|
|
16
|
+
|
|
17
|
+
Rule.addError = function(node, eslintError, ismlOffset, linter, data) {
|
|
18
|
+
const errorLine = linter.getSourceCode() ?
|
|
19
|
+
linter.getSourceCode().lines[eslintError.line - 1] :
|
|
20
|
+
node.head.split('\n')[eslintError.line - 1];
|
|
21
|
+
|
|
22
|
+
const duplicatedOffset = ParseUtils.getNextNonEmptyCharPos(node.head);
|
|
23
|
+
const errorLocalPos = node.head.indexOf(errorLine.trimStart()) - duplicatedOffset;
|
|
24
|
+
let errorGlobalPos = node.globalPos;
|
|
25
|
+
let columnNumber = node.columnNumber;
|
|
26
|
+
let length = errorLine.trimStart().length;
|
|
27
|
+
let message;
|
|
28
|
+
|
|
29
|
+
errorGlobalPos += data.isCrlfLineBreak ?
|
|
30
|
+
errorLocalPos + eslintError.line - 2 :
|
|
31
|
+
node.head.trimStart().indexOf(errorLine.trimStart());
|
|
32
|
+
|
|
33
|
+
if (eslintError.ruleId === 'indent') {
|
|
34
|
+
length = getIndentErrorLength(eslintError, ismlOffset);
|
|
35
|
+
message = getIsmlIdentMessage(eslintError, ismlOffset);
|
|
36
|
+
errorGlobalPos -= length;
|
|
37
|
+
columnNumber = length + 1;
|
|
38
|
+
|
|
39
|
+
} else {
|
|
40
|
+
message = eslintError.message;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const error = this.getError(
|
|
44
|
+
ismlOffset + errorLine,
|
|
45
|
+
node.lineNumber + eslintError.line - 2,
|
|
46
|
+
columnNumber,
|
|
47
|
+
errorGlobalPos,
|
|
48
|
+
length,
|
|
49
|
+
message
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
return error;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
Rule.check = function(node, data) {
|
|
56
|
+
let eslintConfig = null;
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
eslintConfig = ConfigUtils.loadEslintConfig();
|
|
60
|
+
} catch (err) {
|
|
61
|
+
const error = this.getError(null, 0, 1, 0, 1, notFoundMessage);
|
|
62
|
+
return { occurrenceList : [error] };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
this.checkChildren(node, data);
|
|
66
|
+
|
|
67
|
+
if (node.isIsscriptContent()) {
|
|
68
|
+
isscriptContentArray.push(node);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (node.isRoot()) {
|
|
72
|
+
const ESLinter = require('eslint').Linter;
|
|
73
|
+
const ruleConfig = this.getConfigs();
|
|
74
|
+
const eslinter = new ESLinter();
|
|
75
|
+
const occurrenceList = [];
|
|
76
|
+
|
|
77
|
+
for (let index = 0; index < isscriptContentArray.length; index++) {
|
|
78
|
+
const jsContentNode = isscriptContentArray[index];
|
|
79
|
+
let content = jsContentNode.head;
|
|
80
|
+
|
|
81
|
+
const ismlOffset = getIsmlOffset(jsContentNode);
|
|
82
|
+
|
|
83
|
+
content = unindent(content, ismlOffset.length);
|
|
84
|
+
|
|
85
|
+
const errorArray = eslinter.verify(content, eslintConfig);
|
|
86
|
+
|
|
87
|
+
for (let i = 0; i < errorArray.length; i++) {
|
|
88
|
+
const error = this.addError(jsContentNode, errorArray[i], ismlOffset, eslinter, data);
|
|
89
|
+
occurrenceList.push(error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
isscriptContentArray = [];
|
|
94
|
+
|
|
95
|
+
return this.return(node, occurrenceList, ruleConfig);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
Rule.getFixedContent = function(node) {
|
|
100
|
+
let eslintConfig = null;
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
eslintConfig = ConfigUtils.loadEslintConfig();
|
|
104
|
+
} catch (err) {
|
|
105
|
+
const error = this.getError(null, 0, 1, 0, 1, notFoundMessage);
|
|
106
|
+
return { occurrenceList : [error] };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
110
|
+
this.getFixedContent(node.children[i]);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (node.isIsscriptContent()) {
|
|
114
|
+
const Linter = require('eslint').Linter;
|
|
115
|
+
const linter = new Linter();
|
|
116
|
+
let content = node.head;
|
|
117
|
+
const ismlOffset = getIsmlOffset(node);
|
|
118
|
+
|
|
119
|
+
this.result.fixedContent = content = linter.verifyAndFix(content, eslintConfig).output;
|
|
120
|
+
|
|
121
|
+
node.head = reIndent(content, ismlOffset);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return GeneralUtils.applyActiveLineBreaks(node.toString());
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const unindent = (content, indentSize) => {
|
|
128
|
+
const lineArray = content.split(Constants.EOL);
|
|
129
|
+
const result = [];
|
|
130
|
+
|
|
131
|
+
for (let i = 0; i < lineArray.length; i++) {
|
|
132
|
+
const line = lineArray[i];
|
|
133
|
+
|
|
134
|
+
result.push(line.substring(indentSize));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return result.join(Constants.EOL);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const reIndent = (content, ismlIndentation) => {
|
|
141
|
+
const lineArray = content.split(Constants.EOL);
|
|
142
|
+
const result = [];
|
|
143
|
+
|
|
144
|
+
for (let i = 0; i < lineArray.length; i++) {
|
|
145
|
+
const line = lineArray[i];
|
|
146
|
+
|
|
147
|
+
result.push(line.trim() ? ismlIndentation + line : '');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return result.join(Constants.EOL);
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const getIsmlOffset = node => {
|
|
154
|
+
const indentSize = (node.depth - 1) * 4;
|
|
155
|
+
let ismlIndentation = '';
|
|
156
|
+
|
|
157
|
+
for (let i = 0; i < indentSize; i = i + 1) {
|
|
158
|
+
ismlIndentation += ' ';
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return ismlIndentation;
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const getIndentErrorLength = (eslintError, ismlOffset) => {
|
|
165
|
+
const messageWordList = eslintError.message.split(' ');
|
|
166
|
+
|
|
167
|
+
return Number(messageWordList[7].slice(0, -1)) + ismlOffset.length;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const getIsmlIdentMessage = (eslintError, ismlOffset) => {
|
|
171
|
+
const messageWordList = eslintError.message.split(' ');
|
|
172
|
+
|
|
173
|
+
messageWordList[3] = Number(messageWordList[3]) + ismlOffset.length;
|
|
174
|
+
messageWordList[7] = Number(messageWordList[7].slice(0, -1)) + ismlOffset.length + '.';
|
|
175
|
+
|
|
176
|
+
return messageWordList.join(' ');
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
module.exports = Rule;
|