@aiot-toolkit/parser 2.0.6-beta.3 → 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
@@ -628,9 +628,7 @@ class StyleParser {
628
628
  level: sourceCodeStyle,
629
629
  filePath,
630
630
  position,
631
- message: [{
632
- word: error.message
633
- }, ...sourceCode]
631
+ message: [...error.messages, ...sourceCode]
634
632
  });
635
633
  });
636
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节点
@@ -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,
@@ -567,10 +584,6 @@ class StyleUtil {
567
584
  * @returns
568
585
  */
569
586
  static translateKeyFramesRule(rule, options) {
570
- const {
571
- onLog,
572
- filePath
573
- } = options;
574
587
  const {
575
588
  prelude,
576
589
  block,
@@ -593,12 +606,8 @@ class StyleUtil {
593
606
  result.time = 100;
594
607
  break;
595
608
  default:
596
- onLog({
597
- level: _sharedUtils.Loglevel.THROW,
598
- message: `${firstName} is not a valid time value`,
599
- filePath,
600
- position
601
- });
609
+ const errorMessage = [`${firstName} is not a valid time value`];
610
+ StyleUtil.translateError(_sharedUtils.Loglevel.THROW, errorMessage, options, position);
602
611
  break;
603
612
  }
604
613
  }
@@ -632,20 +641,14 @@ class StyleUtil {
632
641
  value: valueNode
633
642
  } = sourceNode;
634
643
  // 属性校验
635
- const config = _StyleAttributeConfig.STYLE_ATTRIBUTE_CONFIG[name];
644
+ const config = _StyleBaseConfig.STYLE_ATTRIBUTE_CONFIG[name];
636
645
  if (config?.validate) {
637
- const validateResult = config.validate(sourceNode);
638
- if (validateResult.message.length > 0) {
639
- const {
640
- onLog,
641
- filePath
642
- } = options;
643
- onLog({
644
- filePath: filePath,
645
- level: validateResult.level,
646
- position: sourceNode.position,
647
- message: [`Attribute verification failed,`, ...validateResult.message]
648
- });
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);
649
652
  }
650
653
  }
651
654
  if (config?.translate) {
@@ -769,5 +772,26 @@ class StyleUtil {
769
772
  }
770
773
  return value;
771
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
+ }
772
796
  }
773
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",
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.3",
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.3",
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": "2e2ba4b1d293218736343237d963fe93c5fb27a8"
63
+ "gitHead": "1acc8279ba3c5995aebe3a97a6b33154086f09d6"
64
64
  }