@vitarx/plugin-vite 1.0.0 → 1.0.2-alpha.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.
Files changed (34) hide show
  1. package/dist/hmr-client/index.d.ts +15 -5
  2. package/dist/hmr-client/index.js +47 -25
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +2 -6
  5. package/dist/passes/hmr/inject-imports.d.ts +4 -1
  6. package/dist/passes/hmr/inject-imports.js +8 -1
  7. package/dist/passes/hmr/inject-state.d.ts +6 -1
  8. package/dist/passes/hmr/inject-state.js +58 -5
  9. package/dist/passes/hmr/inject.d.ts +1 -1
  10. package/dist/passes/hmr/inject.js +27 -2
  11. package/dist/passes/imports/collectImports.d.ts +4 -4
  12. package/dist/passes/imports/collectImports.js +20 -5
  13. package/dist/passes/imports/collectRefVariables.d.ts +2 -2
  14. package/dist/passes/imports/collectRefVariables.js +47 -3
  15. package/dist/passes/imports/injectImports.d.ts +1 -0
  16. package/dist/passes/imports/injectImports.js +28 -2
  17. package/dist/transform.js +11 -1
  18. package/dist/utils/ast-builders.d.ts +49 -41
  19. package/dist/utils/ast-builders.js +60 -41
  20. package/dist/utils/ast-guards.d.ts +2 -1
  21. package/dist/utils/ast-guards.js +4 -1
  22. package/dist/utils/collect-names.d.ts +13 -4
  23. package/dist/utils/collect-names.js +38 -4
  24. package/dist/utils/component-collect.d.ts +4 -2
  25. package/dist/utils/component-collect.js +181 -6
  26. package/dist/utils/generate.d.ts +3 -0
  27. package/dist/utils/generate.js +4 -0
  28. package/dist/utils/jsx-helpers.d.ts +14 -0
  29. package/dist/utils/jsx-helpers.js +21 -0
  30. package/dist/utils/pattern-helpers.d.ts +4 -4
  31. package/dist/utils/pattern-helpers.js +13 -4
  32. package/dist/utils/vif-helpers.d.ts +8 -0
  33. package/dist/utils/vif-helpers.js +36 -0
  34. package/package.json +2 -2
@@ -10,24 +10,31 @@ import { isWhitespaceJSXText } from './ast-guards.js';
10
10
  import { getDirectiveValue, hasDirective, isVElse, isVElseIf, isVIf, isVIfChain } from './jsx-helpers.js';
11
11
  /**
12
12
  * 验证 v-if 链的合法性
13
+ * 检查语法错误,如顺序不当、v-else 不是最后一个等
14
+ * @param children - v-if 链的元素数组
13
15
  */
14
16
  export function validateVIfChain(children) {
15
17
  if (children.length === 0)
16
18
  return;
19
+ // 第一个元素必须有 v-if 指令
17
20
  if (!hasDirective(children[0], 'v-if')) {
18
21
  throw createError('E008', children[0], 'First element must have v-if directive');
19
22
  }
23
+ // 验证后续元素
20
24
  for (let i = 1; i < children.length; i++) {
21
25
  const child = children[i];
22
26
  const prevChild = children[i - 1];
23
27
  const hasVElseIf = hasDirective(child, 'v-else-if');
24
28
  const hasVElse = hasDirective(child, 'v-else');
29
+ // 后续元素必须是 v-else-if 或 v-else
25
30
  if (!hasVElseIf && !hasVElse) {
26
31
  throw createError('E008', child, 'Elements after v-if must have v-else-if or v-else directive');
27
32
  }
33
+ // v-else 必须是最后一个元素
28
34
  if (hasVElse && i !== children.length - 1) {
29
35
  throw createError('E008', child, 'v-else must be the last element');
30
36
  }
37
+ // v-else-if 不能接在 v-else 后面
31
38
  if (hasVElseIf && hasDirective(prevChild, 'v-else')) {
32
39
  throw createError('E008', child, 'v-else-if cannot follow v-else');
33
40
  }
@@ -35,54 +42,72 @@ export function validateVIfChain(children) {
35
42
  }
36
43
  /**
37
44
  * 从 JSX 元素数组收集 v-if 链信息
45
+ * 要求所有元素都属于 v-if 链(之前已验证)
46
+ * @param nodes - JSX 元素数组
47
+ * @returns v-if 链信息对象
38
48
  */
39
49
  export function collectVIfChainInfo(nodes) {
40
50
  const conditions = [];
51
+ // 遍历每个节点,收集对应的条件
41
52
  for (const node of nodes) {
42
53
  const vIfValue = getDirectiveValue(node, 'v-if');
43
54
  if (vIfValue) {
55
+ // v-if 直接使用其条件表达式
44
56
  conditions.push(vIfValue);
45
57
  continue;
46
58
  }
47
59
  const vElseIfValue = getDirectiveValue(node, 'v-else-if');
48
60
  if (vElseIfValue) {
61
+ // v-else-if 直接使用其条件表达式
49
62
  conditions.push(vElseIfValue);
50
63
  continue;
51
64
  }
52
65
  if (hasDirective(node, 'v-else')) {
66
+ // v-else 使用 true 作为条件(默认情况)
53
67
  conditions.push(t.booleanLiteral(true));
54
68
  continue;
55
69
  }
70
+ // 理论上不会走到这里,因为之前已验证
56
71
  throw createError('E008', node, 'Element missing v-if/v-else-if/v-else directive');
57
72
  }
58
73
  return { nodes, conditions, startIndex: 0, endIndex: nodes.length - 1 };
59
74
  }
60
75
  /**
61
76
  * 收集 Fragment 中的 v-if 链
77
+ * 从 Fragment 的子元素中识别多个独立的 v-if 链
78
+ * @param children - Fragment 的子节点数组
79
+ * @returns v-if 链信息数组
62
80
  */
63
81
  export function collectFragmentVIfChains(children) {
64
82
  const chains = [];
65
83
  let i = 0;
84
+ // 遍历所有子节点
66
85
  while (i < children.length) {
67
86
  const child = children[i];
87
+ // 跳过文本节点
68
88
  if (isJSXText(child)) {
69
89
  i++;
70
90
  continue;
71
91
  }
92
+ // 跳过非 JSXElement 节点
72
93
  if (!isJSXElement(child)) {
73
94
  i++;
74
95
  continue;
75
96
  }
97
+ // 跳过不属于 v-if 链的元素
76
98
  if (!isVIfChain(child)) {
77
99
  i++;
78
100
  continue;
79
101
  }
102
+ // 处理 v-if 开头的链
80
103
  if (isVIf(child)) {
81
104
  const chain = collectSingleChainFromFragment(children, i);
82
105
  chains.push(chain);
106
+ // 跳到链结束的下一个位置
83
107
  i = chain.endIndex + 1;
84
108
  }
85
109
  else if (isVElseIf(child) || isVElse(child)) {
110
+ // v-else-if 或 v-else 不能单独出现
86
111
  throw createError(isVElse(child) ? 'E003' : 'E004', child);
87
112
  }
88
113
  else {
@@ -93,33 +118,44 @@ export function collectFragmentVIfChains(children) {
93
118
  }
94
119
  /**
95
120
  * 从 Fragment 收集单个 v-if 链
121
+ * 从 v-if 开始,收集后续连续的 v-else-if 和 v-else
122
+ * @param children - Fragment 的子节点数组
123
+ * @param startIndex - v-if 起始索引
124
+ * @returns 单个 v-if 链信息
96
125
  */
97
126
  function collectSingleChainFromFragment(children, startIndex) {
98
127
  const nodes = [children[startIndex]];
99
128
  const conditions = [getDirectiveValue(nodes[0], 'v-if')];
100
129
  let j = startIndex + 1;
130
+ // 继续收集后续的 v-else-if 和 v-else
101
131
  while (j < children.length) {
102
132
  const nextChild = children[j];
133
+ // 跳过空白文本节点(允许链元素间有空白)
103
134
  if (isJSXText(nextChild) && isWhitespaceJSXText(nextChild)) {
104
135
  j++;
105
136
  continue;
106
137
  }
138
+ // 遇到非 JSXElement,链结束
107
139
  if (!isJSXElement(nextChild))
108
140
  break;
141
+ // 遇到不属于 v-if 链的元素,链结束
109
142
  if (!isVIfChain(nextChild))
110
143
  break;
111
144
  if (isVElseIf(nextChild)) {
145
+ // 收集 v-else-if
112
146
  nodes.push(nextChild);
113
147
  conditions.push(getDirectiveValue(nextChild, 'v-else-if'));
114
148
  j++;
115
149
  }
116
150
  else if (isVElse(nextChild)) {
151
+ // 收集 v-else 并结束链
117
152
  nodes.push(nextChild);
118
153
  conditions.push(t.booleanLiteral(true));
119
154
  j++;
120
155
  break;
121
156
  }
122
157
  else {
158
+ // 其他情况,链结束
123
159
  break;
124
160
  }
125
161
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitarx/plugin-vite",
3
- "version": "1.0.0",
3
+ "version": "1.0.2-alpha.0",
4
4
  "description": "The official plugin for Vitarx support in Vite.",
5
5
  "author": "ZhuChongLin <8210856@qq.com>",
6
6
  "license": "MIT",
@@ -67,6 +67,6 @@
67
67
  "build": "vitest run && rimraf dist && tsc -p tsconfig.build.json",
68
68
  "test": "vitest run",
69
69
  "typecheck": "tsc --noEmit",
70
- "release": "release-cli"
70
+ "release": "npx change-push"
71
71
  }
72
72
  }