@aiot-toolkit/parser 2.0.6-beta.2 → 2.0.6-beta.4
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/lib/ux/config/{vela/StyleAttributeConfig.d.ts → StyleBaseConfig.d.ts} +1 -1
- package/lib/ux/config/{vela/StyleAttributeConfig.js → StyleBaseConfig.js} +16 -24
- package/lib/ux/interface/IStyleError.d.ts +2 -1
- package/lib/ux/parser/ScriptParser.js +2 -1
- package/lib/ux/parser/StyleParser.d.ts +3 -2
- package/lib/ux/parser/StyleParser.js +27 -18
- package/lib/ux/parser/UxParser.d.ts +1 -0
- package/lib/ux/parser/UxParser.js +17 -15
- package/lib/ux/translate/vela/ScriptToTypescript.js +4 -1
- package/lib/ux/translate/vela/StyleToTypescript.js +7 -1
- package/lib/ux/translate/vela/utils/AttributeConfig.js +1 -1
- package/lib/ux/utils/StyleMapUtil.d.ts +2 -3
- package/lib/ux/utils/StyleMapUtil.js +6 -5
- package/lib/ux/utils/StyleUtil.d.ts +1 -0
- package/lib/ux/utils/StyleUtil.js +53 -30
- package/package.json +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Dictionary, Loglevel } from '@aiot-toolkit/shared-utils';
|
|
2
2
|
import { StyleMessage } from '@aiot-toolkit/shared-utils';
|
|
3
|
-
import { BlockItem, StyleItem } from '
|
|
3
|
+
import { BlockItem, StyleItem } from '../interface/IStyleAst';
|
|
4
4
|
type ValidateInfo = {
|
|
5
5
|
level: Loglevel;
|
|
6
6
|
message: StyleMessage[];
|
|
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.STYLE_ATTRIBUTE_LIST = exports.STYLE_ATTRIBUTE_CONFIG = void 0;
|
|
7
7
|
var _sharedUtils = require("@aiot-toolkit/shared-utils");
|
|
8
|
-
var _ExtendedBoxStyle = _interopRequireDefault(require("
|
|
9
|
-
var _UxUtil = _interopRequireDefault(require("
|
|
8
|
+
var _ExtendedBoxStyle = _interopRequireDefault(require("../translate/vela/utils/ExtendedBoxStyle"));
|
|
9
|
+
var _UxUtil = _interopRequireDefault(require("../utils/UxUtil"));
|
|
10
10
|
var _cssTree = _interopRequireDefault(require("css-tree"));
|
|
11
11
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
12
|
const REGEXP_NAME = /^([a-zA-Z_]+[a-zA-Z0-9]*\s*,\s*)*[a-zA-Z_]+[a-zA-Z0-9]*$/;
|
|
@@ -1345,9 +1345,9 @@ function validateLengthNode(sourceNode) {
|
|
|
1345
1345
|
value[0] = value[0];
|
|
1346
1346
|
const validResult = validLength(value[0]);
|
|
1347
1347
|
if (validResult.message.length > 0) {
|
|
1348
|
-
validateInfo.message = [`The value
|
|
1349
|
-
word: attributeName
|
|
1350
|
-
},
|
|
1348
|
+
validateInfo.message = [`The value of attribute`, {
|
|
1349
|
+
word: `${attributeName}:`
|
|
1350
|
+
}, ...validResult.message];
|
|
1351
1351
|
}
|
|
1352
1352
|
}
|
|
1353
1353
|
return validateInfo;
|
|
@@ -1363,11 +1363,9 @@ function validLength(value) {
|
|
|
1363
1363
|
message: []
|
|
1364
1364
|
};
|
|
1365
1365
|
if (_cssTree.default.lexer.matchType('length', value.value + value.unit).error !== null) {
|
|
1366
|
-
validateInfo.message = [
|
|
1367
|
-
word: value.value
|
|
1368
|
-
},
|
|
1369
|
-
word: value.unit || 'null'
|
|
1370
|
-
}, `, which does not meet the length standard.`];
|
|
1366
|
+
validateInfo.message = [{
|
|
1367
|
+
word: `${value.value}${value.unit}`
|
|
1368
|
+
}, `is invalid.`];
|
|
1371
1369
|
}
|
|
1372
1370
|
return validateInfo;
|
|
1373
1371
|
}
|
|
@@ -1549,30 +1547,24 @@ function validPosition(sourceNode) {
|
|
|
1549
1547
|
name: attributeName
|
|
1550
1548
|
} = sourceNode;
|
|
1551
1549
|
if (value.length <= 0) {
|
|
1552
|
-
validateInfo.message = [`
|
|
1550
|
+
validateInfo.message = [`The value of attribute`, {
|
|
1553
1551
|
word: `${attributeName}`
|
|
1554
|
-
}];
|
|
1552
|
+
}, 'is invalid.'];
|
|
1555
1553
|
} else if (value.length > 3) {
|
|
1556
|
-
validateInfo.message = [`
|
|
1557
|
-
word:
|
|
1558
|
-
}, `is
|
|
1559
|
-
word: value.length
|
|
1560
|
-
}, `, which does not meet the requirement.`];
|
|
1554
|
+
validateInfo.message = [`The value length`, `of attribute`, {
|
|
1555
|
+
word: `${attributeName}: ${value.length}`
|
|
1556
|
+
}, `is invalid.`];
|
|
1561
1557
|
} else {
|
|
1562
1558
|
value.forEach(v => {
|
|
1563
1559
|
v = v;
|
|
1564
1560
|
const validResult = validLength(v);
|
|
1565
1561
|
// 有报错
|
|
1566
1562
|
if (validResult.message.length > 0) {
|
|
1567
|
-
validateInfo.message
|
|
1563
|
+
validateInfo.message = [`The value of attribute`, {
|
|
1564
|
+
word: `${attributeName}:`
|
|
1565
|
+
}, ...validResult.message];
|
|
1568
1566
|
}
|
|
1569
1567
|
});
|
|
1570
|
-
// 如果有报错,添加一下属性名
|
|
1571
|
-
if (validateInfo.message.length > 0) {
|
|
1572
|
-
validateInfo.message.unshift(`The value verification of attribute `, {
|
|
1573
|
-
word: attributeName
|
|
1574
|
-
}, `failed.`);
|
|
1575
|
-
}
|
|
1576
1568
|
}
|
|
1577
1569
|
return validateInfo;
|
|
1578
1570
|
}
|
|
@@ -3,7 +3,7 @@ import IOptions from '../config/IOptions';
|
|
|
3
3
|
import { IStyleAst } from '../interface/IStyleAst';
|
|
4
4
|
import ITranslateOption from '../interface/ITranslateOption';
|
|
5
5
|
import { IImageFunction } from '../interface/IImageResource';
|
|
6
|
-
import {
|
|
6
|
+
import { SourceMapConsumer } from 'source-map';
|
|
7
7
|
/**
|
|
8
8
|
* StyleParser
|
|
9
9
|
* 1. 根据语言类型分别转为CSS样式
|
|
@@ -15,9 +15,10 @@ declare class StyleParser implements IParser<IStyleAst> {
|
|
|
15
15
|
readonly compilerOption: ITranslateOption;
|
|
16
16
|
collectImageResource: IImageFunction;
|
|
17
17
|
readonly styleLineOffset: number;
|
|
18
|
-
nodeMap:
|
|
18
|
+
nodeMap: string;
|
|
19
19
|
sourceMapConsumer: SourceMapConsumer;
|
|
20
20
|
private styleMapUtil;
|
|
21
|
+
private isCss;
|
|
21
22
|
readonly QUICKAPP_CONFIG = "quickapp.config.js";
|
|
22
23
|
constructor(options: IOptions, compilerOption: ITranslateOption, collectImageResource: IImageFunction, styleLineOffset: number);
|
|
23
24
|
parser(content: string, fileName: string): Promise<ParserResult<IStyleAst>>;
|
|
@@ -32,19 +32,21 @@ const {
|
|
|
32
32
|
* 3. 把解析结果转换为目标格式
|
|
33
33
|
*/
|
|
34
34
|
class StyleParser {
|
|
35
|
+
// 是否是css样式代码
|
|
36
|
+
isCss = true;
|
|
35
37
|
QUICKAPP_CONFIG = 'quickapp.config.js';
|
|
36
38
|
constructor(options, compilerOption, collectImageResource, styleLineOffset) {
|
|
37
39
|
this.options = options;
|
|
38
40
|
this.compilerOption = compilerOption;
|
|
39
41
|
this.collectImageResource = collectImageResource;
|
|
40
42
|
this.styleLineOffset = styleLineOffset;
|
|
41
|
-
this.nodeMap = {
|
|
43
|
+
this.nodeMap = JSON.stringify({
|
|
42
44
|
version: 3,
|
|
43
45
|
sources: [],
|
|
44
46
|
names: [],
|
|
45
47
|
mappings: '',
|
|
46
48
|
file: ''
|
|
47
|
-
};
|
|
49
|
+
});
|
|
48
50
|
}
|
|
49
51
|
async parser(content, fileName) {
|
|
50
52
|
const {
|
|
@@ -147,7 +149,8 @@ class StyleParser {
|
|
|
147
149
|
relativeUrls: true,
|
|
148
150
|
sourceMap: {
|
|
149
151
|
sourceMapURL: `${baseName}.map`,
|
|
150
|
-
outputSourceFiles: true
|
|
152
|
+
outputSourceFiles: true,
|
|
153
|
+
sourceMapRootpath: 'file:///'
|
|
151
154
|
}
|
|
152
155
|
}, (error, output) => {
|
|
153
156
|
if (error) {
|
|
@@ -161,6 +164,7 @@ class StyleParser {
|
|
|
161
164
|
CSSCode = output?.css ? output.css : '';
|
|
162
165
|
if (output?.map) {
|
|
163
166
|
this.nodeMap = output.map;
|
|
167
|
+
this.isCss && (this.isCss = false);
|
|
164
168
|
}
|
|
165
169
|
resolve(CSSCode);
|
|
166
170
|
}
|
|
@@ -177,7 +181,7 @@ class StyleParser {
|
|
|
177
181
|
onLog,
|
|
178
182
|
filePath
|
|
179
183
|
} = this.options;
|
|
180
|
-
const url = `file
|
|
184
|
+
const url = `file:///${filePath}`;
|
|
181
185
|
const alias = this.getAlias();
|
|
182
186
|
|
|
183
187
|
// sass 的 alias 处理依赖当前文件路径
|
|
@@ -196,6 +200,7 @@ class StyleParser {
|
|
|
196
200
|
});
|
|
197
201
|
if (Result.sourceMap) {
|
|
198
202
|
this.nodeMap = JSON.stringify(Result.sourceMap);
|
|
203
|
+
this.isCss && (this.isCss = false);
|
|
199
204
|
}
|
|
200
205
|
return Result.css;
|
|
201
206
|
} catch (error) {
|
|
@@ -217,23 +222,29 @@ class StyleParser {
|
|
|
217
222
|
onLog,
|
|
218
223
|
filePath
|
|
219
224
|
} = this.options;
|
|
225
|
+
const newFilePath = this.isCss ? filePath : `file:///${filePath}`;
|
|
220
226
|
const alias = this.getAlias();
|
|
221
227
|
try {
|
|
222
228
|
const result = await (0, _postcss.default)([(0, _postcssImport.default)({
|
|
223
|
-
resolve: id => {
|
|
229
|
+
resolve: (id, basedir) => {
|
|
230
|
+
// 处理所有路径中的 file:/// 前缀
|
|
231
|
+
const cleanId = id.replace(/^file:\/\/\//, '');
|
|
232
|
+
const cleanBase = basedir.replace(/^file:\/\/\//, '');
|
|
233
|
+
const filePath = _path.default.resolve(cleanBase, cleanId);
|
|
224
234
|
for (const [key, value] of Object.entries(alias)) {
|
|
225
|
-
if (
|
|
226
|
-
return
|
|
235
|
+
if (filePath.startsWith(key)) {
|
|
236
|
+
return filePath.replace(key, value);
|
|
227
237
|
}
|
|
228
238
|
}
|
|
229
|
-
return
|
|
239
|
+
return filePath;
|
|
230
240
|
}
|
|
231
241
|
}), _postcssUrl.default]).process(sourceContent, {
|
|
232
|
-
from:
|
|
242
|
+
from: newFilePath,
|
|
233
243
|
map: {
|
|
234
244
|
prev: this.nodeMap,
|
|
235
245
|
inline: false,
|
|
236
|
-
|
|
246
|
+
sourcesContent: true,
|
|
247
|
+
absolute: this.isCss
|
|
237
248
|
}
|
|
238
249
|
});
|
|
239
250
|
this.nodeMap = result.map.toString();
|
|
@@ -307,7 +318,7 @@ class StyleParser {
|
|
|
307
318
|
type: '',
|
|
308
319
|
prelude: [],
|
|
309
320
|
block: [],
|
|
310
|
-
position: sourceNode.loc ? this.styleMapUtil.transfromLocToPosition(sourceNode.loc) : undefined
|
|
321
|
+
position: sourceNode.loc ? this.styleMapUtil.transfromLocToPosition(sourceNode.loc, false) : undefined
|
|
311
322
|
};
|
|
312
323
|
const {
|
|
313
324
|
type,
|
|
@@ -330,7 +341,7 @@ class StyleParser {
|
|
|
330
341
|
name: '',
|
|
331
342
|
prelude: [],
|
|
332
343
|
rules: [],
|
|
333
|
-
position: sourceNode.loc ? this.styleMapUtil.transfromLocToPosition(sourceNode.loc) : undefined
|
|
344
|
+
position: sourceNode.loc ? this.styleMapUtil.transfromLocToPosition(sourceNode.loc, false) : undefined
|
|
334
345
|
};
|
|
335
346
|
const {
|
|
336
347
|
type,
|
|
@@ -376,7 +387,7 @@ class StyleParser {
|
|
|
376
387
|
type: '',
|
|
377
388
|
name: '',
|
|
378
389
|
block: [],
|
|
379
|
-
position: sourceNode.loc ? this.styleMapUtil.transfromLocToPosition(sourceNode.loc) : undefined
|
|
390
|
+
position: sourceNode.loc ? this.styleMapUtil.transfromLocToPosition(sourceNode.loc, false) : undefined
|
|
380
391
|
};
|
|
381
392
|
const {
|
|
382
393
|
type,
|
|
@@ -494,7 +505,7 @@ class StyleParser {
|
|
|
494
505
|
let value = '';
|
|
495
506
|
nodeValue.children.map(v => {
|
|
496
507
|
let tempTargetValue;
|
|
497
|
-
const tempPosition = v.loc ? this.styleMapUtil.transfromLocToPosition(v.loc) : undefined;
|
|
508
|
+
const tempPosition = v.loc ? this.styleMapUtil.transfromLocToPosition(v.loc, false) : undefined;
|
|
498
509
|
switch (v.type) {
|
|
499
510
|
case 'Operator':
|
|
500
511
|
value = _cssTree.default.generate(v);
|
|
@@ -578,7 +589,7 @@ class StyleParser {
|
|
|
578
589
|
targetList.push({
|
|
579
590
|
name: nodeName,
|
|
580
591
|
value: valueList,
|
|
581
|
-
position: node.loc ? this.styleMapUtil.transfromLocToPosition(node.loc) : undefined
|
|
592
|
+
position: node.loc ? this.styleMapUtil.transfromLocToPosition(node.loc, false) : undefined
|
|
582
593
|
});
|
|
583
594
|
}
|
|
584
595
|
return targetList;
|
|
@@ -617,9 +628,7 @@ class StyleParser {
|
|
|
617
628
|
level: sourceCodeStyle,
|
|
618
629
|
filePath,
|
|
619
630
|
position,
|
|
620
|
-
message: [
|
|
621
|
-
word: error.message
|
|
622
|
-
}, ...sourceCode]
|
|
631
|
+
message: [...error.messages, ...sourceCode]
|
|
623
632
|
});
|
|
624
633
|
});
|
|
625
634
|
return [];
|
|
@@ -201,6 +201,7 @@ class UxParser {
|
|
|
201
201
|
* 1. template:
|
|
202
202
|
* a. 最多1个
|
|
203
203
|
* b. 子元素有且仅有1个,不能是 block
|
|
204
|
+
* 2. 必须有闭合标签, 示例: `<script>....</script>`正确, `<script>aaaa`错误
|
|
204
205
|
*/
|
|
205
206
|
validateContent(childNodes) {
|
|
206
207
|
let result = true;
|
|
@@ -249,21 +250,22 @@ class UxParser {
|
|
|
249
250
|
}
|
|
250
251
|
|
|
251
252
|
// 2
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
253
|
+
childNodes.forEach(node => {
|
|
254
|
+
if (_TemplateUtil.default.isElement(node)) {
|
|
255
|
+
const {
|
|
256
|
+
sourceCodeLocation
|
|
257
|
+
} = node;
|
|
258
|
+
if (sourceCodeLocation && !sourceCodeLocation.endTag) {
|
|
259
|
+
onLog({
|
|
260
|
+
level: _sharedUtils.Loglevel.ERROR,
|
|
261
|
+
filePath,
|
|
262
|
+
position: _TemplateUtil.default.parse5LocationToPosition(sourceCodeLocation.startTag),
|
|
263
|
+
message: [`<${node.nodeName}>`, 'must have an end tag']
|
|
264
|
+
});
|
|
265
|
+
result = false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
});
|
|
267
269
|
return result;
|
|
268
270
|
}
|
|
269
271
|
/**
|
|
@@ -51,7 +51,10 @@ class ScriptToTypescript {
|
|
|
51
51
|
* @returns
|
|
52
52
|
*/
|
|
53
53
|
babelScript(sourceTree) {
|
|
54
|
-
|
|
54
|
+
if (sourceTree.content === '') {
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
const sourceCode = sourceTree.content;
|
|
55
58
|
const relativePath = _path.default.relative(this.options.projectPath, this.options.filePath);
|
|
56
59
|
const plugins = [
|
|
57
60
|
// 替换所有的require节点
|
|
@@ -94,8 +94,14 @@ class StyleToTypescript {
|
|
|
94
94
|
const selector = node[i];
|
|
95
95
|
const {
|
|
96
96
|
type,
|
|
97
|
-
name
|
|
97
|
+
name: orgName
|
|
98
98
|
} = selector;
|
|
99
|
+
|
|
100
|
+
// 去除名称中的转义符,例如 源码是 .w-20\% {}, 希望生成 w-20%
|
|
101
|
+
// 注意:此处的反转义不能用 JSON.parse
|
|
102
|
+
// 原因:js中 % 不需要转义,但css选择器中%需要转义,两者规则不一样,所以不能使用 JSON.parse
|
|
103
|
+
// 示例:js可以写'abc%', 但css选择器中必须写'abc\%'
|
|
104
|
+
const name = orgName.replace(/\\(.{1})/g, '$1');
|
|
99
105
|
// 选择器类型转为数字
|
|
100
106
|
const selectorIndex = (0, _StyleSelectorType.findSelectorIndex)(type);
|
|
101
107
|
if (type === _StyleSelectorType.Selector.COMBINATOR) {
|
|
@@ -29,7 +29,7 @@ const ATTRIBUTE_CONFIG = {
|
|
|
29
29
|
return $classValue$;
|
|
30
30
|
}`;
|
|
31
31
|
}
|
|
32
|
-
return `[${JSON.parse(result).split(' ').map(item =>
|
|
32
|
+
return `[${JSON.parse(result).split(' ').map(item => item.trim()).filter(Boolean).map(item => JSON.stringify(item)).join(',')}]`;
|
|
33
33
|
}
|
|
34
34
|
},
|
|
35
35
|
style: {
|
|
@@ -18,11 +18,10 @@ declare class StyleMapUtil {
|
|
|
18
18
|
* 3.4 原始位置的endColumn根据map结果,发现存在1个位置的差异,所以-1
|
|
19
19
|
* 3.5 source存储来源的文件
|
|
20
20
|
* @param location 生成结果中节点的位置信息
|
|
21
|
-
* @param
|
|
22
|
-
* @param offset 当前样式代码在ux文件中的偏移量
|
|
21
|
+
* @param useAbsolutePath 是否生成绝对路径
|
|
23
22
|
* @returns
|
|
24
23
|
*/
|
|
25
|
-
transfromLocToPosition(location: CssLocation): {
|
|
24
|
+
transfromLocToPosition(location: CssLocation, useAbsolutePath?: boolean): {
|
|
26
25
|
pos: number;
|
|
27
26
|
end: number;
|
|
28
27
|
startLine: number;
|
|
@@ -25,11 +25,11 @@ class StyleMapUtil {
|
|
|
25
25
|
* 3.4 原始位置的endColumn根据map结果,发现存在1个位置的差异,所以-1
|
|
26
26
|
* 3.5 source存储来源的文件
|
|
27
27
|
* @param location 生成结果中节点的位置信息
|
|
28
|
-
* @param
|
|
29
|
-
* @param offset 当前样式代码在ux文件中的偏移量
|
|
28
|
+
* @param useAbsolutePath 是否生成绝对路径
|
|
30
29
|
* @returns
|
|
31
30
|
*/
|
|
32
31
|
transfromLocToPosition(location) {
|
|
32
|
+
let useAbsolutePath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
33
33
|
const {
|
|
34
34
|
projectPath
|
|
35
35
|
} = this.options;
|
|
@@ -41,7 +41,7 @@ class StyleMapUtil {
|
|
|
41
41
|
line: location.end.line,
|
|
42
42
|
column: location.end.column
|
|
43
43
|
});
|
|
44
|
-
let
|
|
44
|
+
let nodePath = '';
|
|
45
45
|
if (nodeStartPosition.source?.endsWith('.ux') && nodeStartPosition.line) {
|
|
46
46
|
nodeStartPosition.line = nodeStartPosition.line - 1 + this.lineOffset;
|
|
47
47
|
}
|
|
@@ -54,7 +54,8 @@ class StyleMapUtil {
|
|
|
54
54
|
if (decodeStr.startsWith('file://')) {
|
|
55
55
|
decodeStr = (0, _url.fileURLToPath)(decodeStr);
|
|
56
56
|
}
|
|
57
|
-
|
|
57
|
+
// useAbsolutePath为false,返回相对路径
|
|
58
|
+
nodePath = (useAbsolutePath ? decodeStr : _path.default.relative(projectPath, decodeStr)).replaceAll(_path.default.sep, _path.default.posix.sep);
|
|
58
59
|
}
|
|
59
60
|
return {
|
|
60
61
|
pos: 0,
|
|
@@ -63,7 +64,7 @@ class StyleMapUtil {
|
|
|
63
64
|
startColumn: nodeStartPosition.column || 0,
|
|
64
65
|
endLine: nodeEndPosition.line || 0,
|
|
65
66
|
endColumn: nodeEndPosition.column || 0,
|
|
66
|
-
source:
|
|
67
|
+
source: nodePath
|
|
67
68
|
};
|
|
68
69
|
}
|
|
69
70
|
}
|
|
@@ -11,8 +11,8 @@ var _lodash = _interopRequireDefault(require("lodash"));
|
|
|
11
11
|
var _path = _interopRequireDefault(require("path"));
|
|
12
12
|
var _CompressConfig = require("../config/CompressConfig");
|
|
13
13
|
var _StyleSelectorType = require("../enum/StyleSelectorType");
|
|
14
|
-
var _StyleAttributeConfig = require("../config/vela/StyleAttributeConfig");
|
|
15
14
|
var _tinycolor = _interopRequireDefault(require("tinycolor2"));
|
|
15
|
+
var _StyleBaseConfig = require("../config/StyleBaseConfig");
|
|
16
16
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
17
|
/**
|
|
18
18
|
* StyleUtil
|
|
@@ -291,7 +291,9 @@ class StyleUtil {
|
|
|
291
291
|
loc
|
|
292
292
|
} = fallbackNode;
|
|
293
293
|
parserError = {
|
|
294
|
-
|
|
294
|
+
messages: [{
|
|
295
|
+
word: name
|
|
296
|
+
}],
|
|
295
297
|
details: message,
|
|
296
298
|
startLine: loc?.start?.line || loc?.start?.startLine || 0,
|
|
297
299
|
startCol: loc?.start?.column || loc?.start?.startCol || 0,
|
|
@@ -321,14 +323,29 @@ class StyleUtil {
|
|
|
321
323
|
message,
|
|
322
324
|
details,
|
|
323
325
|
loc,
|
|
324
|
-
css
|
|
326
|
+
css,
|
|
327
|
+
property
|
|
325
328
|
} = error;
|
|
326
|
-
|
|
329
|
+
let messages = [];
|
|
330
|
+
if (message.includes('Unknown property') && _StyleBaseConfig.STYLE_ATTRIBUTE_LIST.includes(_sharedUtils.StringUtil.hyphenedToCamel(error.property)) || message.includes('Invalid value for `@media` prelude')) {
|
|
327
331
|
continue;
|
|
328
332
|
}
|
|
333
|
+
// 优化值报错的信息,csstree-validator值报错时为Invalida value for
|
|
334
|
+
if (message.includes('Invalid value for')) {
|
|
335
|
+
// 请检查属性的值是否符合要求
|
|
336
|
+
messages = [`The value of attribute`, {
|
|
337
|
+
word: `${property}: ${css}`
|
|
338
|
+
}, 'is invalid.'];
|
|
339
|
+
css = '';
|
|
340
|
+
} else {
|
|
341
|
+
// 高亮原始报错信息
|
|
342
|
+
messages = [{
|
|
343
|
+
word: message
|
|
344
|
+
}];
|
|
345
|
+
}
|
|
329
346
|
if (loc) {
|
|
330
347
|
syntaxErrors.push({
|
|
331
|
-
|
|
348
|
+
messages,
|
|
332
349
|
details,
|
|
333
350
|
startLine: loc?.start?.line || 0,
|
|
334
351
|
startCol: loc?.start?.column || 1,
|
|
@@ -341,7 +358,7 @@ class StyleUtil {
|
|
|
341
358
|
} else {
|
|
342
359
|
const propertyLength = error?.property?.length || 0;
|
|
343
360
|
syntaxErrors.push({
|
|
344
|
-
|
|
361
|
+
messages,
|
|
345
362
|
details,
|
|
346
363
|
startLine: error.line || 0,
|
|
347
364
|
startCol: error.column || 0,
|
|
@@ -351,7 +368,6 @@ class StyleUtil {
|
|
|
351
368
|
endOffset: (error.offset || 0) + propertyLength,
|
|
352
369
|
source: css
|
|
353
370
|
});
|
|
354
|
-
continue;
|
|
355
371
|
}
|
|
356
372
|
}
|
|
357
373
|
return syntaxErrors;
|
|
@@ -568,10 +584,6 @@ class StyleUtil {
|
|
|
568
584
|
* @returns
|
|
569
585
|
*/
|
|
570
586
|
static translateKeyFramesRule(rule, options) {
|
|
571
|
-
const {
|
|
572
|
-
onLog,
|
|
573
|
-
filePath
|
|
574
|
-
} = options;
|
|
575
587
|
const {
|
|
576
588
|
prelude,
|
|
577
589
|
block,
|
|
@@ -594,12 +606,8 @@ class StyleUtil {
|
|
|
594
606
|
result.time = 100;
|
|
595
607
|
break;
|
|
596
608
|
default:
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
message: `${firstName} is not a valid time value`,
|
|
600
|
-
filePath,
|
|
601
|
-
position
|
|
602
|
-
});
|
|
609
|
+
const errorMessage = [`${firstName} is not a valid time value`];
|
|
610
|
+
StyleUtil.translateError(_sharedUtils.Loglevel.THROW, errorMessage, options, position);
|
|
603
611
|
break;
|
|
604
612
|
}
|
|
605
613
|
}
|
|
@@ -633,20 +641,14 @@ class StyleUtil {
|
|
|
633
641
|
value: valueNode
|
|
634
642
|
} = sourceNode;
|
|
635
643
|
// 属性校验
|
|
636
|
-
const config =
|
|
644
|
+
const config = _StyleBaseConfig.STYLE_ATTRIBUTE_CONFIG[name];
|
|
637
645
|
if (config?.validate) {
|
|
638
|
-
const
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
onLog({
|
|
645
|
-
filePath: filePath,
|
|
646
|
-
level: validateResult.level,
|
|
647
|
-
position: sourceNode.position,
|
|
648
|
-
message: [`Attribute verification failed,`, ...validateResult.message]
|
|
649
|
-
});
|
|
646
|
+
const {
|
|
647
|
+
message: validMessages,
|
|
648
|
+
level: validInfoLevel
|
|
649
|
+
} = config.validate(sourceNode);
|
|
650
|
+
if (validMessages.length > 0) {
|
|
651
|
+
StyleUtil.translateError(validInfoLevel, validMessages, options, sourceNode.position);
|
|
650
652
|
}
|
|
651
653
|
}
|
|
652
654
|
if (config?.translate) {
|
|
@@ -770,5 +772,26 @@ class StyleUtil {
|
|
|
770
772
|
}
|
|
771
773
|
return value;
|
|
772
774
|
}
|
|
775
|
+
static translateError(errorLevel, messages, options, position) {
|
|
776
|
+
const {
|
|
777
|
+
onLog,
|
|
778
|
+
filePath,
|
|
779
|
+
projectPath
|
|
780
|
+
} = options;
|
|
781
|
+
// position.source存储的是相对路径,报错时要用绝对路径
|
|
782
|
+
let updatedPosition;
|
|
783
|
+
if (position) {
|
|
784
|
+
updatedPosition = {
|
|
785
|
+
...position,
|
|
786
|
+
source: position.source && _path.default.resolve(projectPath, position.source)
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
onLog({
|
|
790
|
+
level: errorLevel,
|
|
791
|
+
message: messages,
|
|
792
|
+
filePath,
|
|
793
|
+
position: updatedPosition
|
|
794
|
+
});
|
|
795
|
+
}
|
|
773
796
|
}
|
|
774
797
|
var _default = exports.default = StyleUtil;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiot-toolkit/parser",
|
|
3
|
-
"version": "2.0.6-beta.
|
|
3
|
+
"version": "2.0.6-beta.4",
|
|
4
4
|
"description": "Parse the source code of aiot and convert it to the AST (Abstract Syntax Tree) of the target code.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"aiot",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"test": "node ./__tests__/parser.test.js"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@aiot-toolkit/shared-utils": "2.0.6-beta.
|
|
23
|
+
"@aiot-toolkit/shared-utils": "2.0.6-beta.4",
|
|
24
24
|
"@babel/core": "^7.23.6",
|
|
25
25
|
"@babel/generator": "^7.24.10",
|
|
26
26
|
"@babel/parser": "^7.24.8",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"css-tree": "npm:aiot-css-tree@^2.3.1",
|
|
32
32
|
"csstree-validator": "^3.0.0",
|
|
33
33
|
"eslint": "^8.46.0",
|
|
34
|
-
"file-lane": "2.0.6-beta.
|
|
34
|
+
"file-lane": "2.0.6-beta.4",
|
|
35
35
|
"fs-extra": "^11.2.0",
|
|
36
36
|
"google-protobuf": "^3.21.2",
|
|
37
37
|
"less": "^4.2.0",
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
"@types/tinycolor2": "^1.4.6",
|
|
61
61
|
"babel-plugin-tester": "^11.0.4"
|
|
62
62
|
},
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "1acc8279ba3c5995aebe3a97a6b33154086f09d6"
|
|
64
64
|
}
|