@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.
@@ -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 '../../interface/IStyleAst';
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("../../translate/vela/utils/ExtendedBoxStyle"));
9
- var _UxUtil = _interopRequireDefault(require("../../utils/UxUtil"));
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 verification of attribute`, {
1349
- word: attributeName
1350
- }, `failed.`, ...validResult.message];
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 = [`The length value is`, {
1367
- word: value.value || 'null'
1368
- }, `, unit is`, {
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 = [`Error parsing the value of attribute`, {
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 = [`Error parsing the value length`, `of`, {
1557
- word: `'${attributeName}'`
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.push(...validResult.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
  }
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * IStyleError
3
3
  */
4
+ import { StyleMessage } from '@aiot-toolkit/shared-utils';
4
5
  export interface IStyleError {
5
- message: string;
6
+ messages: StyleMessage[];
6
7
  details: string;
7
8
  startLine: number;
8
9
  startCol: number;
@@ -14,7 +14,8 @@ class ScriptParser {
14
14
  parser(content) {
15
15
  // const { onLog } = this.options
16
16
  const ast = {
17
- content
17
+ // 判断content是否包含有效js内容,若只包含\n\r\t空白符,则content为''
18
+ content: content.trim() ? content : ''
18
19
  };
19
20
  return {
20
21
  ast
@@ -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 { RawSourceMap, SourceMapConsumer } from 'source-map';
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: RawSourceMap | string;
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://${filePath}`;
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 (id.startsWith(key)) {
226
- return id.replace(key, value);
235
+ if (filePath.startsWith(key)) {
236
+ return filePath.replace(key, value);
227
237
  }
228
238
  }
229
- return id;
239
+ return filePath;
230
240
  }
231
241
  }), _postcssUrl.default]).process(sourceContent, {
232
- from: filePath,
242
+ from: newFilePath,
233
243
  map: {
234
244
  prev: this.nodeMap,
235
245
  inline: false,
236
- annotation: true
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 [];
@@ -20,6 +20,7 @@ declare class UxParser implements IParser<IUxAst> {
20
20
  * 1. template:
21
21
  * a. 最多1个
22
22
  * b. 子元素有且仅有1个,不能是 block
23
+ * 2. 必须有闭合标签, 示例: `<script>....</script>`正确, `<script>aaaa`错误
23
24
  */
24
25
  private validateContent;
25
26
  /**
@@ -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
- // if (scriptCount !== 1) {
253
- // onLog({
254
- // level: Loglevel.THROW,
255
- // filePath,
256
- // message: [
257
- // { word: '<script>' },
258
- // `There are`,
259
- // { word: scriptCount },
260
- // `, but expect to have`,
261
- // { word: 1 }
262
- // ]
263
- // })
264
- // result = false
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
- const sourceCode = sourceTree.content ? sourceTree.content : `""`;
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 => `"${item.trim()}"`).filter(Boolean).join(',')}]`;
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 consumer 经过解析器获取的map信息生成的consumer对象
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 consumer 经过解析器获取的map信息生成的consumer对象
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 nodeRelativePath = '';
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
- nodeRelativePath = _path.default.relative(projectPath, decodeStr).replaceAll(_path.default.sep, _path.default.posix.sep);
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: nodeRelativePath
67
+ source: nodePath
67
68
  };
68
69
  }
69
70
  }
@@ -226,5 +226,6 @@ declare class StyleUtil {
226
226
  * @returns
227
227
  */
228
228
  static translateToNormalValue(value: any): any;
229
+ private static translateError;
229
230
  }
230
231
  export default StyleUtil;
@@ -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
- message: name,
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
- if (message.includes('Unknown property') && _StyleAttributeConfig.STYLE_ATTRIBUTE_LIST.includes(_sharedUtils.StringUtil.hyphenedToCamel(error.property)) || message.includes('Invalid value for `@media` prelude')) {
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
- message,
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
- message,
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
- onLog({
598
- level: _sharedUtils.Loglevel.THROW,
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 = _StyleAttributeConfig.STYLE_ATTRIBUTE_CONFIG[name];
644
+ const config = _StyleBaseConfig.STYLE_ATTRIBUTE_CONFIG[name];
637
645
  if (config?.validate) {
638
- const validateResult = config.validate(sourceNode);
639
- if (validateResult.message.length > 0) {
640
- const {
641
- onLog,
642
- filePath
643
- } = options;
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.2",
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.2",
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.2",
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": "d0057f9e62ac191d21445787667217cfa4aff1e9"
63
+ "gitHead": "1acc8279ba3c5995aebe3a97a6b33154086f09d6"
64
64
  }