@vue-jsx-vapor/compiler 2.6.4 → 2.6.7

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/dist/index.cjs CHANGED
@@ -23,11 +23,64 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
23
  //#endregion
24
24
  const __babel_parser = __toESM(require("@babel/parser"));
25
25
  const __vue_shared = __toESM(require("@vue/shared"));
26
- const __vue_compiler_dom = __toESM(require("@vue/compiler-dom"));
27
- const ast_kit = __toESM(require("ast-kit"));
28
- const __babel_types = __toESM(require("@babel/types"));
29
26
  const source_map_js = __toESM(require("source-map-js"));
27
+ const ast_kit = __toESM(require("ast-kit"));
28
+
29
+ //#region src/utils/error.ts
30
+ let ErrorCodes = /* @__PURE__ */ function(ErrorCodes$1) {
31
+ ErrorCodes$1[ErrorCodes$1["X_V_IF_NO_EXPRESSION"] = 28] = "X_V_IF_NO_EXPRESSION";
32
+ ErrorCodes$1[ErrorCodes$1["X_V_ELSE_NO_ADJACENT_IF"] = 30] = "X_V_ELSE_NO_ADJACENT_IF";
33
+ ErrorCodes$1[ErrorCodes$1["X_V_FOR_NO_EXPRESSION"] = 31] = "X_V_FOR_NO_EXPRESSION";
34
+ ErrorCodes$1[ErrorCodes$1["X_V_FOR_MALFORMED_EXPRESSION"] = 32] = "X_V_FOR_MALFORMED_EXPRESSION";
35
+ ErrorCodes$1[ErrorCodes$1["X_V_ON_NO_EXPRESSION"] = 35] = "X_V_ON_NO_EXPRESSION";
36
+ ErrorCodes$1[ErrorCodes$1["X_V_SLOT_MIXED_SLOT_USAGE"] = 37] = "X_V_SLOT_MIXED_SLOT_USAGE";
37
+ ErrorCodes$1[ErrorCodes$1["X_V_SLOT_DUPLICATE_SLOT_NAMES"] = 38] = "X_V_SLOT_DUPLICATE_SLOT_NAMES";
38
+ ErrorCodes$1[ErrorCodes$1["X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN"] = 39] = "X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN";
39
+ ErrorCodes$1[ErrorCodes$1["X_V_SLOT_MISPLACED"] = 40] = "X_V_SLOT_MISPLACED";
40
+ ErrorCodes$1[ErrorCodes$1["X_V_MODEL_NO_EXPRESSION"] = 41] = "X_V_MODEL_NO_EXPRESSION";
41
+ ErrorCodes$1[ErrorCodes$1["X_V_MODEL_MALFORMED_EXPRESSION"] = 42] = "X_V_MODEL_MALFORMED_EXPRESSION";
42
+ ErrorCodes$1[ErrorCodes$1["X_V_HTML_NO_EXPRESSION"] = 53] = "X_V_HTML_NO_EXPRESSION";
43
+ ErrorCodes$1[ErrorCodes$1["X_V_HTML_WITH_CHILDREN"] = 54] = "X_V_HTML_WITH_CHILDREN";
44
+ ErrorCodes$1[ErrorCodes$1["X_V_TEXT_NO_EXPRESSION"] = 55] = "X_V_TEXT_NO_EXPRESSION";
45
+ ErrorCodes$1[ErrorCodes$1["X_V_TEXT_WITH_CHILDREN"] = 56] = "X_V_TEXT_WITH_CHILDREN";
46
+ ErrorCodes$1[ErrorCodes$1["X_V_MODEL_ON_INVALID_ELEMENT"] = 57] = "X_V_MODEL_ON_INVALID_ELEMENT";
47
+ ErrorCodes$1[ErrorCodes$1["X_V_MODEL_ARG_ON_ELEMENT"] = 58] = "X_V_MODEL_ARG_ON_ELEMENT";
48
+ ErrorCodes$1[ErrorCodes$1["X_V_MODEL_ON_FILE_INPUT_ELEMENT"] = 59] = "X_V_MODEL_ON_FILE_INPUT_ELEMENT";
49
+ ErrorCodes$1[ErrorCodes$1["X_V_MODEL_UNNECESSARY_VALUE"] = 60] = "X_V_MODEL_UNNECESSARY_VALUE";
50
+ ErrorCodes$1[ErrorCodes$1["X_V_SHOW_NO_EXPRESSION"] = 61] = "X_V_SHOW_NO_EXPRESSION";
51
+ return ErrorCodes$1;
52
+ }({});
53
+ const errorMessages = {
54
+ [ErrorCodes.X_V_IF_NO_EXPRESSION]: `v-if/v-else-if is missing expression.`,
55
+ [ErrorCodes.X_V_ELSE_NO_ADJACENT_IF]: `v-else/v-else-if has no adjacent v-if or v-else-if.`,
56
+ [ErrorCodes.X_V_FOR_NO_EXPRESSION]: `v-for is missing expression.`,
57
+ [ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION]: `v-for has invalid expression.`,
58
+ [ErrorCodes.X_V_ON_NO_EXPRESSION]: `v-on is missing expression.`,
59
+ [ErrorCodes.X_V_SLOT_MIXED_SLOT_USAGE]: "Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.",
60
+ [ErrorCodes.X_V_SLOT_DUPLICATE_SLOT_NAMES]: `Duplicate slot names found. `,
61
+ [ErrorCodes.X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN]: "Extraneous children found when component already has explicitly named default slot. These children will be ignored.",
62
+ [ErrorCodes.X_V_MODEL_NO_EXPRESSION]: `v-model is missing expression.`,
63
+ [ErrorCodes.X_V_MODEL_MALFORMED_EXPRESSION]: `v-model value must be a valid JavaScript member expression.`,
64
+ [ErrorCodes.X_V_SLOT_MISPLACED]: `v-slot can only be used on components or <template> tags.`,
65
+ [ErrorCodes.X_V_HTML_NO_EXPRESSION]: `v-html is missing expression.`,
66
+ [ErrorCodes.X_V_HTML_WITH_CHILDREN]: `v-html will override element children.`,
67
+ [ErrorCodes.X_V_TEXT_NO_EXPRESSION]: `v-text is missing expression.`,
68
+ [ErrorCodes.X_V_TEXT_WITH_CHILDREN]: `v-text will override element children.`,
69
+ [ErrorCodes.X_V_MODEL_ARG_ON_ELEMENT]: `v-model argument is not supported on plain elements.`,
70
+ [ErrorCodes.X_V_MODEL_ON_INVALID_ELEMENT]: `v-model can only be used on <input>, <textarea> and <select> elements.`,
71
+ [ErrorCodes.X_V_MODEL_ON_FILE_INPUT_ELEMENT]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,
72
+ [ErrorCodes.X_V_MODEL_UNNECESSARY_VALUE]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,
73
+ [ErrorCodes.X_V_SHOW_NO_EXPRESSION]: `v-show is missing expression.`
74
+ };
75
+ function createCompilerError(code, loc, messages, additionalMessage) {
76
+ const msg = (messages || errorMessages)[code] + (additionalMessage || ``);
77
+ const error = new SyntaxError(String(msg));
78
+ error.code = code;
79
+ error.loc = loc;
80
+ return error;
81
+ }
30
82
 
83
+ //#endregion
31
84
  //#region src/ir/component.ts
32
85
  let IRDynamicPropsKind = /* @__PURE__ */ function(IRDynamicPropsKind$1) {
33
86
  IRDynamicPropsKind$1[IRDynamicPropsKind$1["EXPRESSION"] = 0] = "EXPRESSION";
@@ -90,62 +143,104 @@ function isBlockOperation(op) {
90
143
  }
91
144
 
92
145
  //#endregion
93
- //#region src/transforms/utils.ts
94
- function newDynamic() {
95
- return {
96
- flags: DynamicFlag.REFERENCED,
97
- children: []
98
- };
99
- }
100
- function newBlock(node) {
101
- return {
102
- type: 1,
103
- node,
104
- dynamic: newDynamic(),
105
- effect: [],
106
- operation: [],
107
- returns: [],
108
- tempId: 0
109
- };
146
+ //#region src/utils/ast.ts
147
+ function findProp(expression, key) {
148
+ if (expression?.type === "JSXElement") for (const attr of expression.openingElement.attributes) {
149
+ const name = attr.type === "JSXAttribute" && (attr.name.type === "JSXIdentifier" ? attr.name.name : attr.name.type === "JSXNamespacedName" ? attr.name.namespace.name : "").split("_")[0];
150
+ if (name && ((0, __vue_shared.isString)(key) ? name === key : key.test(name))) return attr;
151
+ }
110
152
  }
111
- function createBranch(node, context, isVFor) {
112
- context.node = node = wrapFragment(node);
113
- const branch = newBlock(node);
114
- const exitBlock = context.enterBlock(branch, isVFor);
115
- context.reference();
116
- return [branch, exitBlock];
153
+ const TS_NODE_TYPES = [
154
+ "TSAsExpression",
155
+ "TSTypeAssertion",
156
+ "TSNonNullExpression",
157
+ "TSInstantiationExpression",
158
+ "TSSatisfiesExpression"
159
+ ];
160
+ function unwrapTSNode(node) {
161
+ if (TS_NODE_TYPES.includes(node.type)) return unwrapTSNode(node.expression);
162
+ else return node;
117
163
  }
118
- function wrapFragment(node) {
119
- if (node.type === "JSXFragment" || isTemplate(node)) return node;
120
- return (0, __babel_types.jsxFragment)((0, __babel_types.jsxOpeningFragment)(), (0, __babel_types.jsxClosingFragment)(), [node.type === "JSXElement" ? node : (0, __babel_types.jsxExpressionContainer)(node)]);
164
+ function isJSXComponent(node) {
165
+ if (node.type !== "JSXElement") return false;
166
+ const { openingElement } = node;
167
+ if (openingElement.name.type === "JSXIdentifier") {
168
+ const name = openingElement.name.name;
169
+ return !(0, __vue_shared.isHTMLTag)(name) && !(0, __vue_shared.isSVGTag)(name);
170
+ } else return openingElement.name.type === "JSXMemberExpression";
121
171
  }
122
- const EMPTY_EXPRESSION = (0, __vue_compiler_dom.createSimpleExpression)("", true);
123
- const isFragmentNode = (node) => node.type === IRNodeTypes.ROOT || node.type === "JSXFragment" || node.type === "JSXElement" && !!isTemplate(node);
124
-
125
- //#endregion
126
- //#region src/utils.ts
127
- function propToExpression(prop, context) {
128
- return prop.type === "JSXAttribute" && prop.value?.type === "JSXExpressionContainer" ? resolveExpression(prop.value.expression, context) : EMPTY_EXPRESSION;
172
+ function isMemberExpression(exp) {
173
+ if (!exp.ast) return;
174
+ const ret = unwrapTSNode(exp.ast);
175
+ return ret.type === "MemberExpression" || ret.type === "OptionalMemberExpression" || ret.type === "Identifier" && ret.name !== "undefined";
129
176
  }
130
- function isConstantExpression(exp) {
131
- return (0, __vue_compiler_dom.isLiteralWhitelisted)(exp.content) || (0, __vue_shared.isGloballyAllowed)(exp.content) || getLiteralExpressionValue(exp) !== null;
177
+ function isTemplate(node) {
178
+ if (node.type === "JSXElement" && node.openingElement.name.type === "JSXIdentifier") return node.openingElement.name.name === "template";
132
179
  }
133
- function getLiteralExpressionValue(exp) {
134
- if (exp.ast) {
135
- if ([
136
- "StringLiteral",
137
- "NumericLiteral",
138
- "BigIntLiteral"
139
- ].includes(exp.ast.type)) return exp.ast.value;
140
- else if (exp.ast.type === "TemplateLiteral" && exp.ast.expressions.length === 0) return exp.ast.quasis[0].value.cooked;
180
+ function isStaticNode(node) {
181
+ node = unwrapTSNode(node);
182
+ switch (node.type) {
183
+ case "UnaryExpression": return isStaticNode(node.argument);
184
+ case "LogicalExpression":
185
+ case "BinaryExpression": return isStaticNode(node.left) && isStaticNode(node.right);
186
+ case "ConditionalExpression": return isStaticNode(node.test) && isStaticNode(node.consequent) && isStaticNode(node.alternate);
187
+ case "SequenceExpression":
188
+ case "TemplateLiteral": return node.expressions.every((expr) => isStaticNode(expr));
189
+ case "ParenthesizedExpression": return isStaticNode(node.expression);
190
+ case "StringLiteral":
191
+ case "NumericLiteral":
192
+ case "BooleanLiteral":
193
+ case "NullLiteral":
194
+ case "BigIntLiteral": return true;
195
+ }
196
+ return false;
197
+ }
198
+ function isConstantNode(node) {
199
+ if (isStaticNode(node)) return true;
200
+ node = unwrapTSNode(node);
201
+ switch (node.type) {
202
+ case "Identifier": return node.name === "undefined" || (0, __vue_shared.isGloballyAllowed)(node.name);
203
+ case "RegExpLiteral": return true;
204
+ case "ObjectExpression": return node.properties.every((prop) => {
205
+ if (prop.type === "ObjectMethod") return false;
206
+ if (prop.type === "SpreadElement") return isConstantNode(prop.argument);
207
+ return (!prop.computed || isConstantNode(prop.key)) && isConstantNode(prop.value);
208
+ });
209
+ case "ArrayExpression": return node.elements.every((element) => {
210
+ if (element === null) return true;
211
+ if (element.type === "SpreadElement") return isConstantNode(element.argument);
212
+ return isConstantNode(element);
213
+ });
141
214
  }
142
- return exp.isStatic ? exp.content : null;
215
+ return false;
143
216
  }
144
- const isConstant = (node) => {
145
- if (!node) return false;
146
- if (node.type === "Identifier") return node.name === "undefined" || (0, __vue_shared.isGloballyAllowed)(node.name);
147
- return (0, __vue_compiler_dom.isConstantNode)(node, {});
217
+ const isFnExpression = (exp) => {
218
+ try {
219
+ if (!exp.ast) return false;
220
+ let ret = exp.ast;
221
+ if (ret.type === "Program") {
222
+ ret = ret.body[0];
223
+ if (ret.type === "ExpressionStatement") ret = ret.expression;
224
+ }
225
+ ret = unwrapTSNode(ret);
226
+ return ret.type === "FunctionExpression" || ret.type === "ArrowFunctionExpression";
227
+ } catch {
228
+ return false;
229
+ }
148
230
  };
231
+ const isFragmentNode = (node) => node.type === IRNodeTypes.ROOT || node.type === "JSXFragment" || node.type === "JSXElement" && !!isTemplate(node);
232
+ const isStaticProperty = (node) => !!node && (node.type === "ObjectProperty" || node.type === "ObjectMethod") && !node.computed;
233
+ const nonIdentifierRE = /^$|^\d|[^$\w\u00A0-\uFFFF]/;
234
+ const isSimpleIdentifier = (name) => !nonIdentifierRE.test(name);
235
+ function getTextLikeValue(node, excludeNumber) {
236
+ node = node.type === "JSXExpressionContainer" ? node.expression : node;
237
+ if (node.type === "StringLiteral") return node.value;
238
+ else if (!excludeNumber && (node.type === "NumericLiteral" || node.type === "BigIntLiteral")) return String(node.value);
239
+ else if (node.type === "TemplateLiteral" && node.expressions.length === 0) return node.quasis[0].value.cooked;
240
+ }
241
+
242
+ //#endregion
243
+ //#region src/utils/text.ts
149
244
  const EMPTY_TEXT_REGEX = /^[\t\v\f \u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]*[\n\r]\s*$/;
150
245
  const START_EMPTY_TEXT_REGEX = /^\s*[\n\r]/;
151
246
  const END_EMPTY_TEXT_REGEX = /[\n\r]\s*$/;
@@ -159,59 +254,61 @@ function resolveJSXText(node) {
159
254
  function isEmptyText(node) {
160
255
  return node.type === "JSXText" && EMPTY_TEXT_REGEX.test(String(node.extra?.raw)) || node.type === "JSXExpressionContainer" && node.expression.type === "JSXEmptyExpression";
161
256
  }
162
- function resolveSimpleExpressionNode(exp) {
163
- if (!exp.isStatic) {
164
- const value = getLiteralExpressionValue(exp);
165
- if (value !== null) return (0, __vue_compiler_dom.createSimpleExpression)(String(value), true, exp.loc);
257
+ function getText(node, content) {
258
+ return content.ir.source.slice(node.start, node.end);
259
+ }
260
+
261
+ //#endregion
262
+ //#region src/utils/expression.ts
263
+ const locStub = {
264
+ start: {
265
+ line: 1,
266
+ column: 0,
267
+ index: 0
268
+ },
269
+ end: {
270
+ line: 1,
271
+ column: 0,
272
+ index: 0
273
+ },
274
+ filename: "",
275
+ identifierName: void 0
276
+ };
277
+ function createSimpleExpression(content, isStatic = false, ast) {
278
+ return {
279
+ loc: ast ? ast.loc : locStub,
280
+ content,
281
+ isStatic,
282
+ ast
283
+ };
284
+ }
285
+ const isLiteralWhitelisted = /* @__PURE__ */ (0, __vue_shared.makeMap)("true,false,null,this");
286
+ function isConstantExpression(exp) {
287
+ return isLiteralWhitelisted(exp.content) || (0, __vue_shared.isGloballyAllowed)(exp.content) || getLiteralExpressionValue(exp) !== null;
288
+ }
289
+ function getLiteralExpressionValue(exp) {
290
+ if (exp.ast) {
291
+ const res = getTextLikeValue(exp.ast);
292
+ if (res != null) return res;
166
293
  }
167
- return exp;
294
+ return exp.isStatic ? exp.content : null;
168
295
  }
169
- function resolveExpression(node, context, effect = false) {
170
- if (!node) return (0, __vue_compiler_dom.createSimpleExpression)("", true);
171
- node = (0, __vue_compiler_dom.unwrapTSNode)(node.type === "JSXExpressionContainer" ? node.expression : node);
296
+ const EMPTY_EXPRESSION = createSimpleExpression("", true);
297
+ function resolveExpression(node, context) {
298
+ if (!node) return EMPTY_EXPRESSION;
299
+ node = unwrapTSNode(node.type === "JSXExpressionContainer" ? node.expression : node);
172
300
  const isStatic = node.type === "StringLiteral" || node.type === "JSXText" || node.type === "JSXIdentifier";
173
- let source = node.type === "JSXEmptyExpression" ? "" : node.type === "JSXIdentifier" ? node.name : node.type === "StringLiteral" ? node.value : node.type === "JSXText" ? resolveJSXText(node) : node.type === "Identifier" ? node.name : context.ir.source.slice(node.start, node.end);
174
- const location = node.loc;
175
- if (source && !isStatic && effect && !isConstant(node)) {
176
- source = `() => (${source})`;
177
- node._offset = 7;
178
- }
179
- return resolveSimpleExpression(source, isStatic, location, isStatic ? void 0 : node);
180
- }
181
- function resolveSimpleExpression(source, isStatic, location, ast) {
182
- const result = (0, __vue_compiler_dom.createSimpleExpression)(source, isStatic, resolveLocation(location, source));
183
- result.ast = ast ?? null;
184
- return result;
185
- }
186
- function resolveLocation(location, context) {
187
- return location ? {
188
- start: {
189
- line: location.start.line,
190
- column: location.start.column + 1,
191
- offset: location.start.index
192
- },
193
- end: {
194
- line: location.end.line,
195
- column: location.end.column + 1,
196
- offset: location.end.index
197
- },
198
- source: (0, __vue_shared.isString)(context) ? context : context.ir.source.slice(location.start.index, location.end.index)
199
- } : {
200
- start: {
201
- line: 1,
202
- column: 1,
203
- offset: 0
204
- },
205
- end: {
206
- line: 1,
207
- column: 1,
208
- offset: 0
209
- },
210
- source: ""
211
- };
301
+ const source = node.type === "JSXEmptyExpression" ? "" : node.type === "JSXIdentifier" ? node.name : node.type === "StringLiteral" ? node.value : node.type === "JSXText" ? resolveJSXText(node) : node.type === "Identifier" ? node.name : context.ir.source.slice(node.start, node.end);
302
+ return createSimpleExpression(source, isStatic, node);
303
+ }
304
+ function propToExpression(prop, context) {
305
+ return prop.type === "JSXAttribute" && prop.value?.type === "JSXExpressionContainer" ? resolveExpression(prop.value.expression, context) : EMPTY_EXPRESSION;
212
306
  }
307
+
308
+ //#endregion
309
+ //#region src/utils/directive.ts
213
310
  const namespaceRE = /^(?:\$([\w-]+)\$)?([\w-]+)?/;
214
- function resolveDirective(node, context, withFn = false) {
311
+ function resolveDirective(node, context) {
215
312
  const { value, name } = node;
216
313
  let nameString = name.type === "JSXNamespacedName" ? name.namespace.name : name.type === "JSXIdentifier" ? name.name : "";
217
314
  const isDirective = nameString.startsWith("v-");
@@ -231,48 +328,73 @@ function resolveDirective(node, context, withFn = false) {
231
328
  } else if (modifierString) [argString, ...modifiers] = modifierString.split("_");
232
329
  }
233
330
  }
234
- const arg = isDirective ? argString && name.type === "JSXNamespacedName" ? resolveSimpleExpression(argString, isStatic, name.name.loc) : void 0 : resolveSimpleExpression(nameString, true, name.loc);
235
- const exp = value ? withFn && value.type === "JSXExpressionContainer" ? resolveExpressionWithFn(value.expression, context) : resolveExpression(value, context) : void 0;
331
+ const arg = isDirective ? argString && name.type === "JSXNamespacedName" ? createSimpleExpression(argString, isStatic, name.name) : void 0 : createSimpleExpression(nameString, true, name);
332
+ const exp = value ? resolveExpression(value, context) : void 0;
236
333
  return {
237
- type: __vue_compiler_dom.NodeTypes.DIRECTIVE,
238
334
  name: isDirective ? nameString.slice(2) : "bind",
239
335
  rawName: getText(name, context),
240
336
  exp,
241
337
  arg,
242
- loc: resolveLocation(node.loc, context),
243
- modifiers: modifiers.map((modifier) => (0, __vue_compiler_dom.createSimpleExpression)(modifier))
338
+ loc: node.loc,
339
+ modifiers: modifiers.map((modifier) => createSimpleExpression(modifier))
244
340
  };
245
341
  }
246
- function resolveExpressionWithFn(node, context) {
247
- const text = getText(node, context);
248
- return node.type === "Identifier" ? resolveSimpleExpression(text, false, node.loc) : resolveSimpleExpression(text, false, node.loc, (0, __babel_parser.parseExpression)(`(${text})=>{}`, { plugins: context.options.expressionPlugins }));
249
- }
250
- function isJSXComponent(node) {
251
- if (node.type !== "JSXElement") return false;
252
- const { openingElement } = node;
253
- if (openingElement.name.type === "JSXIdentifier") {
254
- const name = openingElement.name.name;
255
- return !(0, __vue_shared.isHTMLTag)(name) && !(0, __vue_shared.isSVGTag)(name);
256
- } else return openingElement.name.type === "JSXMemberExpression";
342
+
343
+ //#endregion
344
+ //#region src/utils/transform.ts
345
+ function newDynamic() {
346
+ return {
347
+ flags: DynamicFlag.REFERENCED,
348
+ children: []
349
+ };
257
350
  }
258
- function findProp(expression, key) {
259
- if (expression?.type === "JSXElement") for (const attr of expression.openingElement.attributes) {
260
- const name = attr.type === "JSXAttribute" && (attr.name.type === "JSXIdentifier" ? attr.name.name : attr.name.type === "JSXNamespacedName" ? attr.name.namespace.name : "").split("_")[0];
261
- if (name && ((0, __vue_shared.isString)(key) ? name === key : key.test(name))) return attr;
262
- }
351
+ function newBlock(node) {
352
+ return {
353
+ type: 1,
354
+ node,
355
+ dynamic: newDynamic(),
356
+ effect: [],
357
+ operation: [],
358
+ returns: [],
359
+ tempId: 0
360
+ };
263
361
  }
264
- function getText(node, content) {
265
- return content.ir.source.slice(node.start, node.end);
362
+ function createBranch(node, context, isVFor) {
363
+ context.node = node = wrapFragment(node);
364
+ const branch = newBlock(node);
365
+ const exitBlock = context.enterBlock(branch, isVFor);
366
+ context.reference();
367
+ return [branch, exitBlock];
266
368
  }
267
- function isTemplate(node) {
268
- if (node.type === "JSXElement" && node.openingElement.name.type === "JSXIdentifier") return node.openingElement.name.name === "template";
369
+ function wrapFragment(node) {
370
+ if (node.type === "JSXFragment" || isTemplate(node)) return node;
371
+ return {
372
+ type: "JSXFragment",
373
+ openingFragment: { type: "JSXOpeningFragment" },
374
+ closingFragment: { type: "JSXClosingFragment" },
375
+ children: [node.type === "JSXElement" ? node : {
376
+ type: "JSXExpressionContainer",
377
+ expression: node
378
+ }]
379
+ };
269
380
  }
270
381
 
271
382
  //#endregion
272
- //#region src/generators/utils.ts
383
+ //#region src/utils/generate.ts
273
384
  const NEWLINE = Symbol(`newline`);
274
385
  const INDENT_START = Symbol(`indent start`);
275
386
  const INDENT_END = Symbol(`indent end`);
387
+ let NewlineType = /* @__PURE__ */ function(NewlineType$1) {
388
+ /** Start with `\n` */
389
+ NewlineType$1[NewlineType$1["Start"] = 0] = "Start";
390
+ /** Ends with `\n` */
391
+ NewlineType$1[NewlineType$1["End"] = -1] = "End";
392
+ /** No `\n` included */
393
+ NewlineType$1[NewlineType$1["None"] = -2] = "None";
394
+ /** Don't know, calc it */
395
+ NewlineType$1[NewlineType$1["Unknown"] = -3] = "Unknown";
396
+ return NewlineType$1;
397
+ }({});
276
398
  function buildCodeFragment(...frag) {
277
399
  const push = frag.push.bind(frag);
278
400
  const unshift = frag.unshift.bind(frag);
@@ -358,13 +480,13 @@ function codeFragmentToString(code, context) {
358
480
  let codegen = "";
359
481
  const pos = {
360
482
  line: 1,
361
- column: 1,
362
- offset: 0
483
+ column: 0,
484
+ index: 0
363
485
  };
364
486
  let indentLevel = 0;
365
487
  for (let frag of code) {
366
488
  if (!frag) continue;
367
- if (frag === NEWLINE) frag = [`\n${` `.repeat(indentLevel)}`, __vue_compiler_dom.NewlineType.Start];
489
+ if (frag === NEWLINE) frag = [`\n${` `.repeat(indentLevel)}`, NewlineType.Start];
368
490
  else if (frag === INDENT_START) {
369
491
  indentLevel++;
370
492
  continue;
@@ -373,21 +495,21 @@ function codeFragmentToString(code, context) {
373
495
  continue;
374
496
  }
375
497
  if ((0, __vue_shared.isString)(frag)) frag = [frag];
376
- let [code$1, newlineIndex = __vue_compiler_dom.NewlineType.None, loc, name] = frag;
498
+ let [code$1, newlineIndex = NewlineType.None, loc, name] = frag;
377
499
  codegen += code$1;
378
500
  if (map) {
379
501
  if (loc) addMapping(loc.start, name);
380
- if (newlineIndex === __vue_compiler_dom.NewlineType.Unknown) (0, __vue_compiler_dom.advancePositionWithMutation)(pos, code$1);
502
+ if (newlineIndex === NewlineType.Unknown) advancePositionWithMutation(pos, code$1);
381
503
  else {
382
- pos.offset += code$1.length;
383
- if (newlineIndex === __vue_compiler_dom.NewlineType.None) pos.column += code$1.length;
504
+ pos.index += code$1.length;
505
+ if (newlineIndex === NewlineType.None) pos.column += code$1.length;
384
506
  else {
385
- if (newlineIndex === __vue_compiler_dom.NewlineType.End) newlineIndex = code$1.length - 1;
507
+ if (newlineIndex === NewlineType.End) newlineIndex = code$1.length - 1;
386
508
  pos.line++;
387
509
  pos.column = code$1.length - newlineIndex;
388
510
  }
389
511
  }
390
- if (loc && loc !== __vue_compiler_dom.locStub) addMapping(loc.end);
512
+ if (loc && loc !== locStub) addMapping(loc.end);
391
513
  }
392
514
  }
393
515
  return [codegen, map];
@@ -396,7 +518,7 @@ function codeFragmentToString(code, context) {
396
518
  if (name !== null && !_names.has(name)) _names.add(name);
397
519
  _mappings.add({
398
520
  originalLine: loc.line,
399
- originalColumn: loc.column - 1,
521
+ originalColumn: loc.column,
400
522
  generatedLine: pos.line,
401
523
  generatedColumn: pos.column - 1,
402
524
  source: filename,
@@ -404,22 +526,234 @@ function codeFragmentToString(code, context) {
404
526
  });
405
527
  }
406
528
  }
529
+ function advancePositionWithMutation(pos, source, numberOfCharacters = source.length) {
530
+ let linesCount = 0;
531
+ let lastNewLinePos = -1;
532
+ for (let i = 0; i < numberOfCharacters; i++) if (source.charCodeAt(i) === 10) {
533
+ linesCount++;
534
+ lastNewLinePos = i;
535
+ }
536
+ pos.index += numberOfCharacters;
537
+ pos.line += linesCount;
538
+ pos.column = lastNewLinePos === -1 ? pos.column + numberOfCharacters : numberOfCharacters - lastNewLinePos;
539
+ return pos;
540
+ }
541
+ function advancePositionWithClone(pos, source, numberOfCharacters = source.length) {
542
+ return advancePositionWithMutation({
543
+ index: pos.index,
544
+ line: pos.line,
545
+ column: pos.column
546
+ }, source, numberOfCharacters);
547
+ }
548
+
549
+ //#endregion
550
+ //#region src/utils/dom.ts
551
+ /**
552
+ * Copied from https://github.com/MananTank/validate-html-nesting
553
+ * with ISC license
554
+ *
555
+ * To avoid runtime dependency on validate-html-nesting
556
+ * This file should not change very often in the original repo
557
+ * but we may need to keep it up-to-date from time to time.
558
+ */
559
+ /**
560
+ * returns true if given parent-child nesting is valid HTML
561
+ */
562
+ function isValidHTMLNesting(parent, child) {
563
+ if (parent === "template") return true;
564
+ if (parent in onlyValidChildren) return onlyValidChildren[parent].has(child);
565
+ if (child in onlyValidParents) return onlyValidParents[child].has(parent);
566
+ if (parent in knownInvalidChildren && knownInvalidChildren[parent].has(child)) return false;
567
+ if (child in knownInvalidParents && knownInvalidParents[child].has(parent)) return false;
568
+ return true;
569
+ }
570
+ const headings = new Set([
571
+ "h1",
572
+ "h2",
573
+ "h3",
574
+ "h4",
575
+ "h5",
576
+ "h6"
577
+ ]);
578
+ const emptySet = new Set([]);
579
+ /**
580
+ * maps element to set of elements that can be it's children, no other */
581
+ const onlyValidChildren = {
582
+ head: new Set([
583
+ "base",
584
+ "basefront",
585
+ "bgsound",
586
+ "link",
587
+ "meta",
588
+ "title",
589
+ "noscript",
590
+ "noframes",
591
+ "style",
592
+ "script",
593
+ "template"
594
+ ]),
595
+ optgroup: new Set(["option"]),
596
+ select: new Set([
597
+ "optgroup",
598
+ "option",
599
+ "hr"
600
+ ]),
601
+ table: new Set([
602
+ "caption",
603
+ "colgroup",
604
+ "tbody",
605
+ "tfoot",
606
+ "thead"
607
+ ]),
608
+ tr: new Set(["td", "th"]),
609
+ colgroup: new Set(["col"]),
610
+ tbody: new Set(["tr"]),
611
+ thead: new Set(["tr"]),
612
+ tfoot: new Set(["tr"]),
613
+ script: emptySet,
614
+ iframe: emptySet,
615
+ option: emptySet,
616
+ textarea: emptySet,
617
+ style: emptySet,
618
+ title: emptySet
619
+ };
620
+ /** maps elements to set of elements which can be it's parent, no other */
621
+ const onlyValidParents = {
622
+ html: emptySet,
623
+ body: new Set(["html"]),
624
+ head: new Set(["html"]),
625
+ td: new Set(["tr"]),
626
+ colgroup: new Set(["table"]),
627
+ caption: new Set(["table"]),
628
+ tbody: new Set(["table"]),
629
+ tfoot: new Set(["table"]),
630
+ col: new Set(["colgroup"]),
631
+ th: new Set(["tr"]),
632
+ thead: new Set(["table"]),
633
+ tr: new Set([
634
+ "tbody",
635
+ "thead",
636
+ "tfoot"
637
+ ]),
638
+ dd: new Set(["dl", "div"]),
639
+ dt: new Set(["dl", "div"]),
640
+ figcaption: new Set(["figure"]),
641
+ summary: new Set(["details"]),
642
+ area: new Set(["map"])
643
+ };
644
+ /** maps element to set of elements that can not be it's children, others can */
645
+ const knownInvalidChildren = {
646
+ p: new Set([
647
+ "address",
648
+ "article",
649
+ "aside",
650
+ "blockquote",
651
+ "center",
652
+ "details",
653
+ "dialog",
654
+ "dir",
655
+ "div",
656
+ "dl",
657
+ "fieldset",
658
+ "figure",
659
+ "footer",
660
+ "form",
661
+ "h1",
662
+ "h2",
663
+ "h3",
664
+ "h4",
665
+ "h5",
666
+ "h6",
667
+ "header",
668
+ "hgroup",
669
+ "hr",
670
+ "li",
671
+ "main",
672
+ "nav",
673
+ "menu",
674
+ "ol",
675
+ "p",
676
+ "pre",
677
+ "section",
678
+ "table",
679
+ "ul"
680
+ ]),
681
+ svg: new Set([
682
+ "b",
683
+ "blockquote",
684
+ "br",
685
+ "code",
686
+ "dd",
687
+ "div",
688
+ "dl",
689
+ "dt",
690
+ "em",
691
+ "embed",
692
+ "h1",
693
+ "h2",
694
+ "h3",
695
+ "h4",
696
+ "h5",
697
+ "h6",
698
+ "hr",
699
+ "i",
700
+ "img",
701
+ "li",
702
+ "menu",
703
+ "meta",
704
+ "ol",
705
+ "p",
706
+ "pre",
707
+ "ruby",
708
+ "s",
709
+ "small",
710
+ "span",
711
+ "strong",
712
+ "sub",
713
+ "sup",
714
+ "table",
715
+ "u",
716
+ "ul",
717
+ "var"
718
+ ])
719
+ };
720
+ /** maps element to set of elements that can not be it's parent, others can */
721
+ const knownInvalidParents = {
722
+ a: new Set(["a"]),
723
+ button: new Set(["button"]),
724
+ dd: new Set(["dd", "dt"]),
725
+ dt: new Set(["dd", "dt"]),
726
+ form: new Set(["form"]),
727
+ li: new Set(["li"]),
728
+ h1: headings,
729
+ h2: headings,
730
+ h3: headings,
731
+ h4: headings,
732
+ h5: headings,
733
+ h6: headings
734
+ };
735
+ function toValidAssetId(name, type) {
736
+ return `_${type}_${name.replaceAll(/\W/g, (searchValue, replaceValue) => {
737
+ return searchValue === "-" ? "_" : name.charCodeAt(replaceValue).toString();
738
+ })}`;
739
+ }
407
740
 
408
741
  //#endregion
409
742
  //#region src/generators/expression.ts
410
- function genExpression(node, context, assignment) {
411
- const { content, ast, isStatic, loc } = node;
743
+ function genExpression(node, context, assignment, needWrap = false) {
744
+ let { content, ast, isStatic, loc } = node;
745
+ if (needWrap) content = `() => (${content})`;
412
746
  if (isStatic) return [[
413
747
  JSON.stringify(content),
414
- __vue_compiler_dom.NewlineType.None,
748
+ NewlineType.None,
415
749
  loc
416
750
  ]];
417
- if (!node.content.trim() || ast === false || isConstantExpression(node)) return [[
751
+ if (!node.content.trim() || isConstantExpression(node)) return [[
418
752
  content,
419
- __vue_compiler_dom.NewlineType.None,
753
+ NewlineType.None,
420
754
  loc
421
755
  ], assignment && ` = ${assignment}`];
422
- if (ast === null) return genIdentifier(content, context, loc, assignment);
756
+ if (!ast) return genIdentifier(content, context, loc, assignment);
423
757
  const ids = [];
424
758
  const parentStackMap = /* @__PURE__ */ new Map();
425
759
  const parentStack = [];
@@ -430,32 +764,33 @@ function genExpression(node, context, assignment) {
430
764
  let hasMemberExpression = false;
431
765
  if (ids.length) {
432
766
  const [frag, push] = buildCodeFragment();
433
- const isTSNode = ast && __vue_compiler_dom.TS_NODE_TYPES.includes(ast.type);
434
- const offset = (ast?.start ? ast.start - 1 : 0) - (ast._offset || 0);
767
+ const isTSNode = ast && TS_NODE_TYPES.includes(ast.type);
768
+ const offset = (ast?.start ? ast.start - 1 : 0) - (needWrap ? 7 : 0);
435
769
  ids.sort((a, b) => a.start - b.start).forEach((id, i) => {
436
770
  const start = id.start - 1 - offset;
437
771
  const end = id.end - 1 - offset;
438
772
  const last = ids[i - 1];
439
773
  if (!isTSNode || i !== 0) {
440
774
  const leadingText = content.slice(last ? last.end - 1 - offset : 0, start);
441
- if (leadingText.length) push([leadingText, __vue_compiler_dom.NewlineType.Unknown]);
775
+ if (leadingText.length) push([leadingText, NewlineType.Unknown]);
442
776
  }
443
777
  const source = content.slice(start, end);
444
778
  const parentStack$1 = parentStackMap.get(id);
445
779
  const parent = parentStack$1.at(-1);
446
780
  hasMemberExpression ||= !!parent && (parent.type === "MemberExpression" || parent.type === "OptionalMemberExpression");
447
781
  push(...genIdentifier(source, context, {
448
- start: (0, __vue_compiler_dom.advancePositionWithClone)(node.loc.start, source, start),
449
- end: (0, __vue_compiler_dom.advancePositionWithClone)(node.loc.start, source, end),
450
- source
782
+ start: advancePositionWithClone(node.loc.start, source, start),
783
+ end: advancePositionWithClone(node.loc.start, source, end),
784
+ filename: "",
785
+ identifierName: void 0
451
786
  }, hasMemberExpression ? void 0 : assignment, parent));
452
- if (i === ids.length - 1 && end < content.length && !isTSNode) push([content.slice(end), __vue_compiler_dom.NewlineType.Unknown]);
787
+ if (i === ids.length - 1 && end < content.length && !isTSNode) push([content.slice(end), NewlineType.Unknown]);
453
788
  });
454
789
  if (assignment && hasMemberExpression) push(` = ${assignment}`);
455
790
  return frag;
456
791
  } else return [[
457
792
  content,
458
- __vue_compiler_dom.NewlineType.Unknown,
793
+ NewlineType.Unknown,
459
794
  loc
460
795
  ]];
461
796
  }
@@ -467,22 +802,22 @@ function genIdentifier(raw, context, loc, assignment, parent) {
467
802
  const replacement = idMap[0];
468
803
  if ((0, __vue_shared.isString)(replacement)) if (parent && parent.type === "ObjectProperty" && parent.shorthand) return [[
469
804
  `${name}: ${replacement}`,
470
- __vue_compiler_dom.NewlineType.None,
805
+ NewlineType.None,
471
806
  loc
472
807
  ]];
473
808
  else return [[
474
809
  replacement,
475
- __vue_compiler_dom.NewlineType.None,
810
+ NewlineType.None,
476
811
  loc
477
812
  ]];
478
813
  else return genExpression(replacement, context, assignment);
479
814
  }
480
815
  let prefix;
481
- if ((0, __vue_compiler_dom.isStaticProperty)(parent) && parent.shorthand) prefix = `${raw}: `;
816
+ if (isStaticProperty(parent) && parent.shorthand) prefix = `${raw}: `;
482
817
  raw = withAssignment(raw);
483
818
  return [prefix, [
484
819
  raw,
485
- __vue_compiler_dom.NewlineType.None,
820
+ NewlineType.None,
486
821
  loc,
487
822
  name
488
823
  ]];
@@ -510,7 +845,7 @@ function genVModel(oper, context) {
510
845
  }
511
846
  function genModelHandler(exp, context) {
512
847
  return [
513
- `${context.options.isTS ? `(_value: any)` : `_value`} => (`,
848
+ "_value => (",
514
849
  ...genExpression(exp, context, "_value"),
515
850
  ")"
516
851
  ];
@@ -551,7 +886,7 @@ function genCustomDirectives(opers, context) {
551
886
  const directives = genMulti(DELIMITERS_ARRAY, ...directiveItems);
552
887
  return [NEWLINE, ...genCall(helper("withVaporDirectives"), element, directives)];
553
888
  function genDirectiveItem({ dir, name, asset }) {
554
- const directiveVar = asset ? (0, __vue_compiler_dom.toValidAssetId)(name, "directive") : genExpression((0, __vue_shared.extend)((0, __vue_compiler_dom.createSimpleExpression)(name, false), { ast: null }), context);
889
+ const directiveVar = asset ? toValidAssetId(name, "directive") : genExpression(createSimpleExpression(name), context);
555
890
  const value = dir.exp && ["() => ", ...genExpression(dir.exp, context)];
556
891
  const argument = dir.arg && genExpression(dir.arg, context);
557
892
  const modifiers = !!dir.modifiers.length && [
@@ -563,7 +898,7 @@ function genCustomDirectives(opers, context) {
563
898
  }
564
899
  }
565
900
  function genDirectiveModifiers(modifiers) {
566
- return modifiers.map((value) => `${(0, __vue_compiler_dom.isSimpleIdentifier)(value) ? value : JSON.stringify(value)}: true`).join(", ");
901
+ return modifiers.map((value) => `${isSimpleIdentifier(value) ? value : JSON.stringify(value)}: true`).join(", ");
567
902
  }
568
903
  function filterCustomDirectives(id, operations) {
569
904
  return operations.filter((oper) => oper.type === IRNodeTypes.DIRECTIVE && oper.element === id && !oper.builtin);
@@ -621,22 +956,20 @@ function genEventHandler(context, value, modifiers = {
621
956
  keys: []
622
957
  }, extraWrap = false) {
623
958
  let handlerExp = [`() => {}`];
624
- if (value && value.content.trim()) if ((0, __vue_compiler_dom.isMemberExpression)(value, context.options)) {
959
+ if (value && value.content.trim()) if (isMemberExpression(value)) {
625
960
  handlerExp = genExpression(value, context);
626
961
  if (!extraWrap) handlerExp = [
627
962
  `e => `,
628
963
  ...handlerExp,
629
964
  `(e)`
630
965
  ];
631
- } else if ((0, __vue_compiler_dom.isFnExpression)(value, context.options)) handlerExp = genExpression(value, context);
966
+ } else if (isFnExpression(value)) handlerExp = genExpression(value, context);
632
967
  else {
633
- const referencesEvent = value.content.includes("$event");
634
968
  const hasMultipleStatements = value.content.includes(`;`);
635
- const expr = referencesEvent ? context.withId(() => genExpression(value, context), { $event: null }) : genExpression(value, context);
636
969
  handlerExp = [
637
- referencesEvent ? "$event => " : "() => ",
970
+ "() => ",
638
971
  hasMultipleStatements ? "{" : "(",
639
- ...expr,
972
+ ...genExpression(value, context),
640
973
  hasMultipleStatements ? "}" : ")"
641
974
  ];
642
975
  }
@@ -700,8 +1033,8 @@ function genPropKey({ key: node, modifier, runtimeCamelize, handler, handlerModi
700
1033
  if (node.isStatic) {
701
1034
  const keyName = (handler ? (0, __vue_shared.toHandlerKey)(node.content) : node.content) + handlerModifierPostfix;
702
1035
  return [[
703
- (0, __vue_compiler_dom.isSimpleIdentifier)(keyName) ? keyName : JSON.stringify(keyName),
704
- __vue_compiler_dom.NewlineType.None,
1036
+ isSimpleIdentifier(keyName) ? keyName : JSON.stringify(keyName),
1037
+ NewlineType.None,
705
1038
  node.loc
706
1039
  ]];
707
1040
  }
@@ -760,8 +1093,8 @@ function genCreateComponent(operation, context) {
760
1093
  ...genExpression(operation.dynamic, context),
761
1094
  ")"
762
1095
  ];
763
- else if (operation.asset) return (0, __vue_compiler_dom.toValidAssetId)(operation.tag, "component");
764
- else return genExpression((0, __vue_shared.extend)((0, __vue_compiler_dom.createSimpleExpression)(operation.tag, false), { ast: null }), context);
1096
+ else if (operation.asset) return toValidAssetId(operation.tag, "component");
1097
+ else return genExpression(createSimpleExpression(operation.tag), context);
765
1098
  }
766
1099
  }
767
1100
  function genRawProps(props, context) {
@@ -930,8 +1263,8 @@ function genSlotBlockWithProps(oper, context) {
930
1263
  if (isDestructureAssignment = !!props.ast) {
931
1264
  [depth, exitScope] = context.enterScope();
932
1265
  propsName = `_slotProps${depth}`;
933
- (0, ast_kit.walkIdentifiers)(props.ast, (id, _, __, ___, isLocal) => {
934
- if (isLocal) idsOfProps.add(id.name);
1266
+ (0, ast_kit.walkIdentifiers)(props.ast, (id, _, __, isReference, isLocal) => {
1267
+ if (isReference && !isLocal) idsOfProps.add(id.name);
935
1268
  }, true);
936
1269
  } else idsOfProps.add(propsName = rawProps);
937
1270
  }
@@ -1000,9 +1333,8 @@ function genFor(oper, context) {
1000
1333
  path = `${pathInfo.helper}(${path}, ${pathInfo.helperArgs})`;
1001
1334
  }
1002
1335
  if (pathInfo.dynamic) {
1003
- const node = idMap[id$1] = (0, __vue_compiler_dom.createSimpleExpression)(path);
1004
- const plugins = context.options.expressionPlugins;
1005
- node.ast = (0, __babel_parser.parseExpression)(`(${path})`, { plugins: plugins ? [...plugins, "typescript"] : ["typescript"] });
1336
+ const node = idMap[id$1] = createSimpleExpression(path);
1337
+ node.ast = (0, __babel_parser.parseExpression)(`(${path})`, { plugins: context.options.expressionPlugins });
1006
1338
  } else idMap[id$1] = path;
1007
1339
  } else idMap[id$1] = path;
1008
1340
  });
@@ -1019,7 +1351,7 @@ function genFor(oper, context) {
1019
1351
  idMap[rawIndex] = `${indexVar}.value`;
1020
1352
  idMap[indexVar] = null;
1021
1353
  }
1022
- const { selectorPatterns, keyOnlyBindingPatterns } = matchPatterns(render, keyProp, idMap);
1354
+ const { selectorPatterns, keyOnlyBindingPatterns } = matchPatterns(render, keyProp, idMap, context.ir.source);
1023
1355
  const selectorDeclarations = [];
1024
1356
  const selectorSetup = [];
1025
1357
  for (const [i, { selector }] of selectorPatterns.entries()) {
@@ -1061,8 +1393,8 @@ function genFor(oper, context) {
1061
1393
  const map = /* @__PURE__ */ new Map();
1062
1394
  if (value) {
1063
1395
  rawValue = value && value.content;
1064
- if (value.ast) (0, __vue_compiler_dom.walkIdentifiers)(value.ast, (id$1, _, parentStack, ___, isLocal) => {
1065
- if (isLocal) {
1396
+ if (value.ast && value.ast.type !== "Identifier") (0, ast_kit.walkIdentifiers)(value.ast, (id$1, _, parentStack, isReference, isLocal) => {
1397
+ if (isReference && !isLocal) {
1066
1398
  let path = "";
1067
1399
  let isDynamic = false;
1068
1400
  let helper$1;
@@ -1075,11 +1407,11 @@ function genFor(oper, context) {
1075
1407
  isDynamic = true;
1076
1408
  path += `[${value.content.slice(parent.key.start - 1, parent.key.end - 1)}]`;
1077
1409
  } else path += `.${parent.key.name}`;
1078
- else if (parent.type === "ArrayPattern") {
1410
+ else if (parent.type === "ArrayExpression") {
1079
1411
  const index$1 = parent.elements.indexOf(child);
1080
- if (child.type === "RestElement") path += `.slice(${index$1})`;
1412
+ if (child.type === "SpreadElement") path += `.slice(${index$1})`;
1081
1413
  else path += `[${index$1}]`;
1082
- } else if (parent.type === "ObjectPattern" && child.type === "RestElement") {
1414
+ } else if (parent.type === "ObjectExpression" && child.type === "SpreadElement") {
1083
1415
  helper$1 = context.helper("getRestElement");
1084
1416
  helperArgs = `[${parent.properties.filter((p) => p.type === "ObjectProperty").map((p) => {
1085
1417
  if (p.key.type === "StringLiteral") return JSON.stringify(p.key.value);
@@ -1089,11 +1421,6 @@ function genFor(oper, context) {
1089
1421
  } else return JSON.stringify(p.key.name);
1090
1422
  }).join(", ")}]`;
1091
1423
  }
1092
- if (child.type === "AssignmentPattern" && (parent.type === "ObjectProperty" || parent.type === "ArrayPattern")) {
1093
- isDynamic = true;
1094
- helper$1 = context.helper("getDefaultValue");
1095
- helperArgs = value.content.slice(child.right.start - 1, child.right.end - 1);
1096
- }
1097
1424
  }
1098
1425
  map.set(id$1.name, {
1099
1426
  path,
@@ -1129,17 +1456,17 @@ function genFor(oper, context) {
1129
1456
  return idMap$1;
1130
1457
  }
1131
1458
  }
1132
- function matchPatterns(render, keyProp, idMap) {
1459
+ function matchPatterns(render, keyProp, idMap, source) {
1133
1460
  const selectorPatterns = [];
1134
1461
  const keyOnlyBindingPatterns = [];
1135
1462
  render.effect = render.effect.filter((effect) => {
1136
1463
  if (keyProp !== void 0) {
1137
- const selector = matchSelectorPattern(effect, keyProp.ast, idMap);
1464
+ const selector = matchSelectorPattern(effect, keyProp.content, idMap, source);
1138
1465
  if (selector) {
1139
1466
  selectorPatterns.push(selector);
1140
1467
  return false;
1141
1468
  }
1142
- const keyOnly = matchKeyOnlyBindingPattern(effect, keyProp.ast);
1469
+ const keyOnly = matchKeyOnlyBindingPattern(effect, keyProp.content, source);
1143
1470
  if (keyOnly) {
1144
1471
  keyOnlyBindingPatterns.push(keyOnly);
1145
1472
  return false;
@@ -1152,37 +1479,37 @@ function matchPatterns(render, keyProp, idMap) {
1152
1479
  selectorPatterns
1153
1480
  };
1154
1481
  }
1155
- function matchKeyOnlyBindingPattern(effect, keyAst) {
1482
+ function matchKeyOnlyBindingPattern(effect, key, source) {
1156
1483
  if (effect.expressions.length === 1) {
1157
1484
  const ast = effect.expressions[0].ast;
1158
- if (typeof ast === "object" && ast !== null && isKeyOnlyBinding(ast, keyAst)) return { effect };
1485
+ if (typeof ast === "object" && ast !== null && isKeyOnlyBinding(ast, key, source)) return { effect };
1159
1486
  }
1160
1487
  }
1161
- function matchSelectorPattern(effect, keyAst, idMap) {
1488
+ function matchSelectorPattern(effect, key, idMap, source) {
1162
1489
  if (effect.expressions.length === 1) {
1163
1490
  const ast = effect.expressions[0].ast;
1164
- const offset = effect.expressions[0].loc.start.offset;
1491
+ const offset = effect.expressions[0].loc.start.index;
1165
1492
  if (typeof ast === "object" && ast) {
1166
1493
  const matcheds = [];
1167
1494
  (0, ast_kit.walkAST)(ast, { enter(node) {
1168
1495
  if (typeof node === "object" && node && node.type === "BinaryExpression" && node.operator === "===" && node.left.type !== "PrivateName") {
1169
1496
  const { left, right } = node;
1170
1497
  for (const [a, b] of [[left, right], [right, left]]) {
1171
- const aIsKey = isKeyOnlyBinding(a, keyAst);
1172
- const bIsKey = isKeyOnlyBinding(b, keyAst);
1498
+ const aIsKey = isKeyOnlyBinding(a, key, source);
1499
+ const bIsKey = isKeyOnlyBinding(b, key, source);
1173
1500
  const bVars = analyzeVariableScopes(b, idMap);
1174
1501
  if (aIsKey && !bIsKey && !bVars.locals.length) matcheds.push([a, b]);
1175
1502
  }
1176
1503
  }
1177
1504
  } });
1178
1505
  if (matcheds.length === 1) {
1179
- const [key, selector] = matcheds[0];
1506
+ const [key$1, selector] = matcheds[0];
1180
1507
  const content$1 = effect.expressions[0].content;
1181
1508
  let hasExtraId = false;
1182
1509
  const parentStackMap = /* @__PURE__ */ new Map();
1183
1510
  const parentStack = [];
1184
- (0, __vue_compiler_dom.walkIdentifiers)(ast, (id) => {
1185
- if (id.start !== key.start && id.start !== selector.start) hasExtraId = true;
1511
+ (0, ast_kit.walkIdentifiers)(ast, (id) => {
1512
+ if (id.start !== key$1.start && id.start !== selector.start) hasExtraId = true;
1186
1513
  parentStackMap.set(id, parentStack.slice());
1187
1514
  }, false, parentStack);
1188
1515
  if (!hasExtraId) {
@@ -1203,12 +1530,12 @@ function matchSelectorPattern(effect, keyAst, idMap) {
1203
1530
  }
1204
1531
  }
1205
1532
  const content = effect.expressions[0].content;
1206
- if (typeof ast === "object" && ast && ast.type === "ConditionalExpression" && ast.test.type === "BinaryExpression" && ast.test.operator === "===" && ast.test.left.type !== "PrivateName" && isConstant(ast.consequent) && isConstant(ast.alternate)) {
1533
+ if (typeof ast === "object" && ast && ast.type === "ConditionalExpression" && ast.test.type === "BinaryExpression" && ast.test.operator === "===" && ast.test.left.type !== "PrivateName" && isConstantNode(ast.consequent) && isConstantNode(ast.alternate)) {
1207
1534
  const left = ast.test.left;
1208
1535
  const right = ast.test.right;
1209
1536
  for (const [a, b] of [[left, right], [right, left]]) {
1210
- const aIsKey = isKeyOnlyBinding(a, keyAst);
1211
- const bIsKey = isKeyOnlyBinding(b, keyAst);
1537
+ const aIsKey = isKeyOnlyBinding(a, key, source);
1538
+ const bIsKey = isKeyOnlyBinding(b, key, source);
1212
1539
  const bVars = analyzeVariableScopes(b, idMap);
1213
1540
  if (aIsKey && !bIsKey && !bVars.locals.length) return {
1214
1541
  effect,
@@ -1229,7 +1556,7 @@ function analyzeVariableScopes(ast, idMap) {
1229
1556
  const ids = [];
1230
1557
  const parentStackMap = /* @__PURE__ */ new Map();
1231
1558
  const parentStack = [];
1232
- (0, __vue_compiler_dom.walkIdentifiers)(ast, (id) => {
1559
+ (0, ast_kit.walkIdentifiers)(ast, (id) => {
1233
1560
  ids.push(id);
1234
1561
  parentStackMap.set(id, parentStack.slice());
1235
1562
  }, false, parentStack);
@@ -1243,10 +1570,10 @@ function analyzeVariableScopes(ast, idMap) {
1243
1570
  locals
1244
1571
  };
1245
1572
  }
1246
- function isKeyOnlyBinding(expr, keyAst) {
1573
+ function isKeyOnlyBinding(expr, key, source) {
1247
1574
  let only = true;
1248
1575
  (0, ast_kit.walkAST)(expr, { enter(node) {
1249
- if ((0, __babel_types.isNodesEquivalent)(node, keyAst)) {
1576
+ if (source.slice(node.start, node.end) === key) {
1250
1577
  this.skip();
1251
1578
  return;
1252
1579
  }
@@ -1302,7 +1629,7 @@ function genDeclareOldRef(oper) {
1302
1629
  function genSetText(oper, context) {
1303
1630
  const { helper } = context;
1304
1631
  const { element, values, generated } = oper;
1305
- const texts = combineValues(values, context, true);
1632
+ const texts = combineValues(values, context, true, true);
1306
1633
  return [NEWLINE, ...genCall(helper("setText"), `${generated ? "x" : "n"}${element}`, texts)];
1307
1634
  }
1308
1635
  function genGetTextChild(oper, context) {
@@ -1310,21 +1637,22 @@ function genGetTextChild(oper, context) {
1310
1637
  }
1311
1638
  function genSetNodes(oper, context) {
1312
1639
  const { helper } = context;
1313
- const { element, values, generated } = oper;
1314
- return [NEWLINE, ...genCall(helper("setNodes"), `${generated ? "x" : "n"}${element}`, combineValues(values, context))];
1640
+ const { element, values, generated, once } = oper;
1641
+ return [NEWLINE, ...genCall(helper("setNodes"), `${generated ? "x" : "n"}${element}`, combineValues(values, context, once))];
1315
1642
  }
1316
1643
  function genCreateNodes(oper, context) {
1317
1644
  const { helper } = context;
1318
- const { id, values } = oper;
1645
+ const { id, values, once } = oper;
1319
1646
  return [
1320
1647
  NEWLINE,
1321
1648
  `const n${id} = `,
1322
- ...genCall(helper("createNodes"), values && combineValues(values, context))
1649
+ ...genCall(helper("createNodes"), values && combineValues(values, context, once))
1323
1650
  ];
1324
1651
  }
1325
- function combineValues(values, context, setText) {
1652
+ function combineValues(values, context, once, setText) {
1326
1653
  return values.flatMap((value, i) => {
1327
- let exp = genExpression(value, context);
1654
+ const { content, isStatic, ast } = value;
1655
+ let exp = genExpression(value, context, void 0, !once && !setText && !!content && !isStatic && !!ast && !isConstantNode(ast));
1328
1656
  if (setText && getLiteralExpressionValue(value) == null) exp = genCall(context.helper("toDisplayString"), exp);
1329
1657
  if (i > 0) exp.unshift(setText ? " + " : ", ");
1330
1658
  return exp;
@@ -1474,7 +1802,7 @@ function genBlockContent(block, context, root, genEffectsExtraFrag) {
1474
1802
  const resetBlock = context.enterBlock(block);
1475
1803
  if (root) {
1476
1804
  for (let name of context.ir.component) {
1477
- const id = (0, __vue_compiler_dom.toValidAssetId)(name, "component");
1805
+ const id = toValidAssetId(name, "component");
1478
1806
  const maybeSelfReference = name.endsWith("__self");
1479
1807
  if (maybeSelfReference) name = name.slice(0, -6);
1480
1808
  push(NEWLINE, `const ${id} = `, ...genCall(context.helper("resolveComponent"), JSON.stringify(name), maybeSelfReference ? "true" : void 0));
@@ -1492,7 +1820,7 @@ function genBlockContent(block, context, root, genEffectsExtraFrag) {
1492
1820
  resetBlock();
1493
1821
  return frag;
1494
1822
  function genResolveAssets(kind, helper) {
1495
- for (const name of context.ir[kind]) push(NEWLINE, `const ${(0, __vue_compiler_dom.toValidAssetId)(name, kind)} = `, ...genCall(context.helper(helper), JSON.stringify(name)));
1823
+ for (const name of context.ir[kind]) push(NEWLINE, `const ${toValidAssetId(name, kind)} = `, ...genCall(context.helper(helper), JSON.stringify(name)));
1496
1824
  }
1497
1825
  }
1498
1826
 
@@ -1531,18 +1859,10 @@ var CodegenContext = class {
1531
1859
  constructor(ir, options) {
1532
1860
  this.ir = ir;
1533
1861
  const defaultOptions$1 = {
1534
- mode: "module",
1535
1862
  sourceMap: false,
1536
- filename: `template.vue.html`,
1537
- scopeId: null,
1538
- runtimeGlobalName: `Vue`,
1539
- runtimeModuleName: `vue`,
1540
- ssrRuntimeModuleName: "vue/server-renderer",
1541
- ssr: false,
1542
- isTS: false,
1543
- inSSR: false,
1544
- templates: [],
1545
- expressionPlugins: []
1863
+ filename: `index.jsx`,
1864
+ expressionPlugins: ["jsx"],
1865
+ templates: []
1546
1866
  };
1547
1867
  this.options = (0, __vue_shared.extend)(defaultOptions$1, options);
1548
1868
  this.block = ir.block;
@@ -1573,26 +1893,18 @@ function generate(ir, options = {}) {
1573
1893
  //#region src/transform.ts
1574
1894
  const defaultOptions = {
1575
1895
  source: "",
1576
- filename: "",
1577
- hoistStatic: false,
1578
- hmr: false,
1579
- cacheHandlers: false,
1896
+ sourceMap: false,
1897
+ filename: "index.jsx",
1580
1898
  nodeTransforms: [],
1581
1899
  directiveTransforms: {},
1582
1900
  templates: [],
1583
- transformHoist: null,
1584
- isBuiltInComponent: __vue_shared.NOOP,
1585
1901
  isCustomElement: __vue_shared.NOOP,
1586
1902
  expressionPlugins: [],
1587
- scopeId: null,
1588
- slotted: true,
1589
- ssr: false,
1590
- inSSR: false,
1591
- ssrCssVars: ``,
1592
1903
  isTS: false,
1593
1904
  withFallback: false,
1594
- onError: __vue_compiler_dom.defaultOnError,
1595
- onWarn: __vue_compiler_dom.defaultOnWarn
1905
+ onError: (error) => {
1906
+ throw error;
1907
+ }
1596
1908
  };
1597
1909
  var TransformContext = class TransformContext {
1598
1910
  parent = null;
@@ -1605,7 +1917,6 @@ var TransformContext = class TransformContext {
1605
1917
  dynamic;
1606
1918
  inVOnce = false;
1607
1919
  inVFor = 0;
1608
- comment = [];
1609
1920
  component;
1610
1921
  directive;
1611
1922
  slots = [];
@@ -1658,7 +1969,7 @@ var TransformContext = class TransformContext {
1658
1969
  registerEffect(expressions, operation, getEffectIndex = () => this.block.effect.length, getOperationIndex = () => this.block.operation.length) {
1659
1970
  const operations = [operation].flat();
1660
1971
  expressions = expressions.filter((exp) => !isConstantExpression(exp));
1661
- if (this.inVOnce || expressions.length === 0 || expressions.every((e) => e.ast && isConstant(e.ast))) return this.registerOperation(operations, getOperationIndex);
1972
+ if (this.inVOnce || expressions.length === 0 || expressions.every((e) => e.ast && isConstantNode(e.ast))) return this.registerOperation(operations, getOperationIndex);
1662
1973
  this.block.effect.splice(getEffectIndex(), 0, {
1663
1974
  expressions,
1664
1975
  operations
@@ -1830,10 +2141,8 @@ function transformComponentElement(tag, propsResult, singleRoot, context) {
1830
2141
  context.slots = [];
1831
2142
  }
1832
2143
  function transformNativeElement(tag, propsResult, singleRoot, context, getEffectIndex, getOperationIndex) {
1833
- const { scopeId } = context.options;
1834
2144
  let template = "";
1835
2145
  template += `<${tag}`;
1836
- if (scopeId) template += ` ${scopeId}`;
1837
2146
  const dynamicProps = [];
1838
2147
  if (propsResult[0]) {
1839
2148
  const [, dynamicArgs, expressions] = propsResult;
@@ -1862,7 +2171,7 @@ function transformNativeElement(tag, propsResult, singleRoot, context, getEffect
1862
2171
  template += `>${context.childrenTemplate.join("")}`;
1863
2172
  if (!(0, __vue_shared.isVoidTag)(tag)) template += `</${tag}>`;
1864
2173
  if (singleRoot) context.ir.rootTemplateIndex = context.ir.templates.length;
1865
- if (context.parent && context.parent.node.type === "JSXElement" && context.parent.node.openingElement.name.type === "JSXIdentifier" && !(0, __vue_compiler_dom.isValidHTMLNesting)(context.parent.node.openingElement.name.name, tag)) {
2174
+ if (context.parent && context.parent.node.type === "JSXElement" && context.parent.node.openingElement.name.type === "JSXIdentifier" && !isValidHTMLNesting(context.parent.node.openingElement.name.name, tag)) {
1866
2175
  context.reference();
1867
2176
  context.dynamic.template = context.pushTemplate(template);
1868
2177
  context.dynamic.flags |= DynamicFlag.INSERT | DynamicFlag.NON_TEMPLATE;
@@ -1891,7 +2200,7 @@ function buildProps(node, context, isComponent) {
1891
2200
  });
1892
2201
  continue;
1893
2202
  }
1894
- const result = transformProp(prop, node, context);
2203
+ const result = transformProp(prop, node, isComponent, context);
1895
2204
  if (result) {
1896
2205
  dynamicExpr.push(result.key, result.value);
1897
2206
  if (isComponent && !result.key.isStatic) {
@@ -1911,15 +2220,16 @@ function buildProps(node, context, isComponent) {
1911
2220
  const irProps = dedupeProperties(results);
1912
2221
  return [false, irProps];
1913
2222
  }
1914
- function transformProp(prop, node, context) {
2223
+ function transformProp(prop, node, isComponent, context) {
1915
2224
  if (prop.type === "JSXSpreadAttribute") return;
1916
2225
  let name = prop.name.type === "JSXIdentifier" ? prop.name.name : prop.name.type === "JSXNamespacedName" ? prop.name.namespace.name : "";
1917
2226
  name = name.split("_")[0];
1918
- if (!isDirectiveRegex.test(name) && !isEventRegex.test(name) && (!prop.value || prop.value.type === "StringLiteral")) {
2227
+ let value;
2228
+ if (!isDirectiveRegex.test(name) && !isEventRegex.test(name) && (!prop.value || (value = getTextLikeValue(prop.value, isComponent)) != null)) {
1919
2229
  if (isReservedProp(name)) return;
1920
2230
  return {
1921
- key: resolveSimpleExpression(name, true, prop.name.loc),
1922
- value: prop.value && prop.value.type === "StringLiteral" ? resolveSimpleExpression(prop.value.value, true, prop.value.loc) : (0, __vue_compiler_dom.createSimpleExpression)("true", false)
2231
+ key: createSimpleExpression(name, true, prop.name),
2232
+ value: prop.value ? createSimpleExpression(value, true, prop.value) : createSimpleExpression("true")
1923
2233
  };
1924
2234
  }
1925
2235
  name = isEventRegex.test(name) ? "on" : isDirectiveRegex.test(name) ? name.slice(2) : "bind";
@@ -2000,7 +2310,7 @@ function processConditionalExpression(node, context) {
2000
2310
  id,
2001
2311
  condition,
2002
2312
  positive: branch,
2003
- once: context.inVOnce || isConstant(test)
2313
+ once: context.inVOnce || isConstantNode(test)
2004
2314
  };
2005
2315
  return [() => {
2006
2316
  onExit();
@@ -2066,7 +2376,7 @@ const transformText = (node, context) => {
2066
2376
  else processInterpolation(context);
2067
2377
  else if (node.type === "JSXText") {
2068
2378
  const value = resolveJSXText(node);
2069
- if (value) context.template += value;
2379
+ if (value) context.template += (0, __vue_shared.escapeHtml)(value);
2070
2380
  else context.dynamic.flags |= DynamicFlag.NON_TEMPLATE;
2071
2381
  }
2072
2382
  };
@@ -2087,6 +2397,7 @@ function processInterpolation(context) {
2087
2397
  if (isFragmentNode(parent) || findProp(parent, "v-slot")) context.registerOperation({
2088
2398
  type: IRNodeTypes.CREATE_NODES,
2089
2399
  id,
2400
+ once: context.inVOnce,
2090
2401
  values
2091
2402
  });
2092
2403
  else {
@@ -2094,6 +2405,7 @@ function processInterpolation(context) {
2094
2405
  context.registerOperation({
2095
2406
  type: IRNodeTypes.SET_NODES,
2096
2407
  element: id,
2408
+ once: context.inVOnce,
2097
2409
  values
2098
2410
  });
2099
2411
  }
@@ -2101,7 +2413,7 @@ function processInterpolation(context) {
2101
2413
  function processTextContainer(children, context) {
2102
2414
  const values = createTextLikeExpressions(children, context);
2103
2415
  const literals = values.map(getLiteralExpressionValue);
2104
- if (literals.every((l) => l != null)) context.childrenTemplate = literals.map((l) => String(l));
2416
+ if (literals.every((l) => l != null)) context.childrenTemplate = literals;
2105
2417
  else {
2106
2418
  context.childrenTemplate = [" "];
2107
2419
  context.registerOperation({
@@ -2111,6 +2423,7 @@ function processTextContainer(children, context) {
2111
2423
  context.registerOperation({
2112
2424
  type: IRNodeTypes.SET_NODES,
2113
2425
  element: context.reference(),
2426
+ once: context.inVOnce,
2114
2427
  values,
2115
2428
  generated: true
2116
2429
  });
@@ -2121,7 +2434,7 @@ function createTextLikeExpressions(nodes, context) {
2121
2434
  for (const node of nodes) {
2122
2435
  markNonTemplate(node, context);
2123
2436
  if (isEmptyText(node)) continue;
2124
- values.push(resolveExpression(node, context, !context.inVOnce));
2437
+ values.push(resolveExpression(node, context));
2125
2438
  }
2126
2439
  return values;
2127
2440
  }
@@ -2136,7 +2449,7 @@ const transformVBind = (dir, node, context) => {
2136
2449
  if (!loc || name.type === "JSXNamespacedName") return;
2137
2450
  const [nameString, ...modifiers] = name.name.split("_");
2138
2451
  const exp = resolveExpression(value, context);
2139
- let arg = resolveSimpleExpression(nameString, true, dir.name.loc);
2452
+ let arg = createSimpleExpression(nameString, true, dir.name);
2140
2453
  if (arg.isStatic && isReservedProp(arg.content)) return;
2141
2454
  let camel = false;
2142
2455
  if (modifiers.includes("camel")) if (arg.isStatic) arg = (0, __vue_shared.extend)({}, arg, { content: (0, __vue_shared.camelize)(arg.content) });
@@ -2156,12 +2469,12 @@ const transformVFor = createStructuralDirectiveTransform("for", processFor);
2156
2469
  function processFor(node, dir, context) {
2157
2470
  const { value, index, key, source } = getForParseResult(dir, context);
2158
2471
  if (!source) {
2159
- context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION, resolveLocation(dir.loc, context)));
2472
+ context.options.onError(createCompilerError(ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION, dir.loc));
2160
2473
  return;
2161
2474
  }
2162
2475
  const keyProp = findProp(node, "key");
2163
2476
  const keyProperty = keyProp && propToExpression(keyProp, context);
2164
- const isComponent = isJSXComponent(node);
2477
+ const isComponent = isJSXComponent(node) || isTemplateWithSingleComponent(node);
2165
2478
  const id = context.reference();
2166
2479
  context.dynamic.flags |= DynamicFlag.NON_TEMPLATE | DynamicFlag.INSERT;
2167
2480
  const [render, exitBlock] = createBranch(node, context, true);
@@ -2178,7 +2491,7 @@ function processFor(node, dir, context) {
2178
2491
  index,
2179
2492
  keyProp: keyProperty,
2180
2493
  render,
2181
- once: context.inVOnce || !!(source.ast && isConstant(source.ast)),
2494
+ once: context.inVOnce || !!(source.ast && isConstantNode(source.ast)),
2182
2495
  component: isComponent,
2183
2496
  onlyChild: !!isOnlyChild
2184
2497
  };
@@ -2190,13 +2503,13 @@ function getForParseResult(dir, context) {
2190
2503
  if (dir.value.type === "JSXExpressionContainer" && dir.value.expression.type === "BinaryExpression") {
2191
2504
  if (dir.value.expression.left.type === "SequenceExpression") {
2192
2505
  const expressions = dir.value.expression.left.expressions;
2193
- value = expressions[0] && resolveExpressionWithFn(expressions[0], context);
2506
+ value = expressions[0] && resolveExpression(expressions[0], context);
2194
2507
  key = expressions[1] && resolveExpression(expressions[1], context);
2195
2508
  index = expressions[2] && resolveExpression(expressions[2], context);
2196
- } else value = resolveExpressionWithFn(dir.value.expression.left, context);
2509
+ } else value = resolveExpression(dir.value.expression.left, context);
2197
2510
  source = resolveExpression(dir.value.expression.right, context);
2198
2511
  }
2199
- } else context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_FOR_NO_EXPRESSION, resolveLocation(dir.loc, context)));
2512
+ } else context.options.onError(createCompilerError(ErrorCodes.X_V_FOR_NO_EXPRESSION, dir.loc));
2200
2513
  return {
2201
2514
  value,
2202
2515
  index,
@@ -2204,18 +2517,21 @@ function getForParseResult(dir, context) {
2204
2517
  source
2205
2518
  };
2206
2519
  }
2520
+ function isTemplateWithSingleComponent(node) {
2521
+ const nonCommentChildren = node.children.filter((c) => !isEmptyText(c));
2522
+ return nonCommentChildren.length === 1 && isJSXComponent(nonCommentChildren[0]);
2523
+ }
2207
2524
 
2208
2525
  //#endregion
2209
2526
  //#region src/transforms/vHtml.ts
2210
2527
  const transformVHtml = (dir, node, context) => {
2211
2528
  let exp;
2212
- const loc = resolveLocation(dir.loc, context);
2213
2529
  if (!dir.value) {
2214
- context.options.onError((0, __vue_compiler_dom.createDOMCompilerError)(__vue_compiler_dom.DOMErrorCodes.X_V_HTML_NO_EXPRESSION, loc));
2530
+ context.options.onError(createCompilerError(ErrorCodes.X_V_HTML_NO_EXPRESSION, dir.loc));
2215
2531
  exp = EMPTY_EXPRESSION;
2216
2532
  } else exp = resolveExpression(dir.value, context);
2217
2533
  if (node.children.length) {
2218
- context.options.onError((0, __vue_compiler_dom.createDOMCompilerError)(__vue_compiler_dom.DOMErrorCodes.X_V_HTML_WITH_CHILDREN, loc));
2534
+ context.options.onError(createCompilerError(ErrorCodes.X_V_HTML_WITH_CHILDREN, dir.loc));
2219
2535
  context.childrenTemplate.length = 0;
2220
2536
  }
2221
2537
  context.registerEffect([exp], {
@@ -2236,9 +2552,8 @@ const transformedIfNode = /* @__PURE__ */ new WeakMap();
2236
2552
  function processIf(node, attribute, context) {
2237
2553
  const dir = resolveDirective(attribute, context);
2238
2554
  if (dir.name !== "else" && (!dir.exp || !dir.exp.content.trim())) {
2239
- const loc = dir.exp ? dir.exp.loc : resolveLocation(node.loc, context);
2240
- context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_IF_NO_EXPRESSION, dir.loc));
2241
- dir.exp = (0, __vue_compiler_dom.createSimpleExpression)(`true`, false, loc);
2555
+ context.options.onError(createCompilerError(ErrorCodes.X_V_IF_NO_EXPRESSION, dir.loc));
2556
+ dir.exp = createSimpleExpression(`true`, false, dir.exp ? dir.exp.ast : node);
2242
2557
  }
2243
2558
  context.dynamic.flags |= DynamicFlag.NON_TEMPLATE;
2244
2559
  transformedIfNode.set(node, dir);
@@ -2253,7 +2568,7 @@ function processIf(node, attribute, context) {
2253
2568
  id,
2254
2569
  condition: dir.exp,
2255
2570
  positive: branch,
2256
- once: context.inVOnce || isConstant(attribute.value)
2571
+ once: context.inVOnce || isConstantNode(attribute.value)
2257
2572
  };
2258
2573
  };
2259
2574
  } else {
@@ -2268,12 +2583,11 @@ function processIf(node, attribute, context) {
2268
2583
  }
2269
2584
  }
2270
2585
  if (!siblingIf || !lastIfNode || lastIfNode.type !== IRNodeTypes.IF) {
2271
- context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_ELSE_NO_ADJACENT_IF, resolveLocation(node.loc, context)));
2586
+ context.options.onError(createCompilerError(ErrorCodes.X_V_ELSE_NO_ADJACENT_IF, node.loc));
2272
2587
  return;
2273
2588
  }
2274
2589
  while (lastIfNode.negative && lastIfNode.negative.type === IRNodeTypes.IF) lastIfNode = lastIfNode.negative;
2275
- if (dir.name === "else-if" && lastIfNode.negative) context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_ELSE_NO_ADJACENT_IF, resolveLocation(node.loc, context)));
2276
- context.root.comment = [];
2590
+ if (dir.name === "else-if" && lastIfNode.negative) context.options.onError(createCompilerError(ErrorCodes.X_V_ELSE_NO_ADJACENT_IF, node.loc));
2277
2591
  const [branch, onExit] = createBranch(node, context);
2278
2592
  if (dir.name === "else") lastIfNode.negative = branch;
2279
2593
  else lastIfNode.negative = {
@@ -2305,22 +2619,22 @@ const transformVModel = (_dir, node, context) => {
2305
2619
  const dir = resolveDirective(_dir, context);
2306
2620
  const { exp, arg } = dir;
2307
2621
  if (!exp) {
2308
- context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_MODEL_NO_EXPRESSION, dir.loc));
2622
+ context.options.onError(createCompilerError(ErrorCodes.X_V_MODEL_NO_EXPRESSION, dir.loc));
2309
2623
  return;
2310
2624
  }
2311
2625
  const expString = exp.content;
2312
- if (!expString.trim() || !(0, __vue_compiler_dom.isMemberExpression)(exp, context.options)) {
2313
- context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_MODEL_MALFORMED_EXPRESSION, exp.loc));
2626
+ if (!expString.trim() || !isMemberExpression(exp)) {
2627
+ context.options.onError(createCompilerError(ErrorCodes.X_V_MODEL_MALFORMED_EXPRESSION, exp.loc));
2314
2628
  return;
2315
2629
  }
2316
2630
  const isComponent = isJSXComponent(node);
2317
2631
  if (isComponent) return {
2318
- key: arg ? arg : (0, __vue_compiler_dom.createSimpleExpression)("modelValue", true),
2632
+ key: arg ? arg : createSimpleExpression("modelValue", true),
2319
2633
  value: exp,
2320
2634
  model: true,
2321
2635
  modelModifiers: dir.modifiers.map((m) => m.content)
2322
2636
  };
2323
- if (dir.arg) context.options.onError((0, __vue_compiler_dom.createDOMCompilerError)(__vue_compiler_dom.DOMErrorCodes.X_V_MODEL_ARG_ON_ELEMENT, dir.arg.loc));
2637
+ if (dir.arg) context.options.onError(createCompilerError(ErrorCodes.X_V_MODEL_ARG_ON_ELEMENT, dir.arg.loc));
2324
2638
  const tag = getText(node.openingElement.name, context);
2325
2639
  const isCustomElement = context.options.isCustomElement(tag);
2326
2640
  let modelType = "text";
@@ -2337,7 +2651,7 @@ const transformVModel = (_dir, node, context) => {
2337
2651
  break;
2338
2652
  case "file":
2339
2653
  modelType = void 0;
2340
- context.options.onError((0, __vue_compiler_dom.createDOMCompilerError)(__vue_compiler_dom.DOMErrorCodes.X_V_MODEL_ON_FILE_INPUT_ELEMENT, dir.loc));
2654
+ context.options.onError(createCompilerError(ErrorCodes.X_V_MODEL_ON_FILE_INPUT_ELEMENT, dir.loc));
2341
2655
  break;
2342
2656
  default:
2343
2657
  checkDuplicatedValue();
@@ -2347,7 +2661,7 @@ const transformVModel = (_dir, node, context) => {
2347
2661
  else checkDuplicatedValue();
2348
2662
  } else if (tag === "select") modelType = "select";
2349
2663
  else checkDuplicatedValue();
2350
- else context.options.onError((0, __vue_compiler_dom.createDOMCompilerError)(__vue_compiler_dom.DOMErrorCodes.X_V_MODEL_ON_INVALID_ELEMENT, dir.loc));
2664
+ else context.options.onError(createCompilerError(ErrorCodes.X_V_MODEL_ON_INVALID_ELEMENT, dir.loc));
2351
2665
  if (modelType) context.registerOperation({
2352
2666
  type: IRNodeTypes.DIRECTIVE,
2353
2667
  element: context.reference(),
@@ -2358,7 +2672,7 @@ const transformVModel = (_dir, node, context) => {
2358
2672
  });
2359
2673
  function checkDuplicatedValue() {
2360
2674
  const value = findProp(node, "value");
2361
- if (value && value.value?.type !== "StringLiteral") context.options.onError((0, __vue_compiler_dom.createDOMCompilerError)(__vue_compiler_dom.DOMErrorCodes.X_V_MODEL_UNNECESSARY_VALUE, resolveLocation(value.loc, context)));
2675
+ if (value && value.value?.type !== "StringLiteral") context.options.onError(createCompilerError(ErrorCodes.X_V_MODEL_UNNECESSARY_VALUE, value.loc));
2362
2676
  }
2363
2677
  };
2364
2678
  function hasDynamicKeyVBind(node) {
@@ -2373,10 +2687,10 @@ const transformVOn = (dir, node, context) => {
2373
2687
  if (!name) return;
2374
2688
  const isComponent = isJSXComponent(node);
2375
2689
  const [nameString, ...modifiers] = context.ir.source.slice(name.start, name.end).replace(/^on([A-Z])/, (_, $1) => $1.toLowerCase()).split("_");
2376
- if (!value && !modifiers.length) context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_ON_NO_EXPRESSION, resolveLocation(loc, context)));
2377
- let arg = resolveSimpleExpression(nameString, true, dir.name.loc);
2690
+ if (!value && !modifiers.length) context.options.onError(createCompilerError(ErrorCodes.X_V_ON_NO_EXPRESSION, loc));
2691
+ let arg = createSimpleExpression(nameString, true, dir.name);
2378
2692
  const exp = resolveExpression(dir.value, context);
2379
- const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = (0, __vue_compiler_dom.resolveModifiers)(arg.isStatic ? `on${nameString}` : arg, modifiers.map((modifier) => (0, __vue_compiler_dom.createSimpleExpression)(modifier)), null, resolveLocation(loc, context));
2693
+ const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(arg.isStatic ? `on${nameString}` : arg, modifiers.map((modifier) => createSimpleExpression(modifier)));
2380
2694
  let keyOverride;
2381
2695
  const isStaticClick = arg.isStatic && arg.content.toLowerCase() === "click";
2382
2696
  if (nonKeyModifiers.includes("middle")) {
@@ -2418,6 +2732,35 @@ const transformVOn = (dir, node, context) => {
2418
2732
  };
2419
2733
  context.registerEffect([arg], operation);
2420
2734
  };
2735
+ const isEventOptionModifier = /* @__PURE__ */ (0, __vue_shared.makeMap)(`passive,once,capture`);
2736
+ const isNonKeyModifier = /* @__PURE__ */ (0, __vue_shared.makeMap)("stop,prevent,self,ctrl,shift,alt,meta,exact,middle");
2737
+ const maybeKeyModifier = /* @__PURE__ */ (0, __vue_shared.makeMap)("left,right");
2738
+ const isKeyboardEvent = /* @__PURE__ */ (0, __vue_shared.makeMap)(`onkeyup,onkeydown,onkeypress`);
2739
+ const resolveModifiers = (key, modifiers) => {
2740
+ const keyModifiers = [];
2741
+ const nonKeyModifiers = [];
2742
+ const eventOptionModifiers = [];
2743
+ for (const modifier_ of modifiers) {
2744
+ const modifier = modifier_.content;
2745
+ if (isEventOptionModifier(modifier)) eventOptionModifiers.push(modifier);
2746
+ else {
2747
+ const keyString = (0, __vue_shared.isString)(key) ? key : key.isStatic ? key.content : null;
2748
+ if (maybeKeyModifier(modifier)) if (keyString) if (isKeyboardEvent(keyString.toLowerCase())) keyModifiers.push(modifier);
2749
+ else nonKeyModifiers.push(modifier);
2750
+ else {
2751
+ keyModifiers.push(modifier);
2752
+ nonKeyModifiers.push(modifier);
2753
+ }
2754
+ else if (isNonKeyModifier(modifier)) nonKeyModifiers.push(modifier);
2755
+ else keyModifiers.push(modifier);
2756
+ }
2757
+ }
2758
+ return {
2759
+ keyModifiers,
2760
+ nonKeyModifiers,
2761
+ eventOptionModifiers
2762
+ };
2763
+ };
2421
2764
 
2422
2765
  //#endregion
2423
2766
  //#region src/transforms/vOnce.ts
@@ -2431,7 +2774,7 @@ const transformVShow = (_dir, node, context) => {
2431
2774
  const dir = resolveDirective(_dir, context);
2432
2775
  const { exp, loc } = dir;
2433
2776
  if (!exp) {
2434
- context.options.onError((0, __vue_compiler_dom.createDOMCompilerError)(__vue_compiler_dom.DOMErrorCodes.X_V_SHOW_NO_EXPRESSION, loc));
2777
+ context.options.onError(createCompilerError(ErrorCodes.X_V_SHOW_NO_EXPRESSION, loc));
2435
2778
  return;
2436
2779
  }
2437
2780
  context.registerOperation({
@@ -2449,13 +2792,13 @@ const transformVSlot = (node, context) => {
2449
2792
  if (node.type !== "JSXElement") return;
2450
2793
  const { children } = node;
2451
2794
  const dir = findProp(node, "v-slot");
2452
- const resolvedDirective = dir ? resolveDirective(dir, context, true) : void 0;
2795
+ const resolvedDirective = dir ? resolveDirective(dir, context) : void 0;
2453
2796
  const { parent } = context;
2454
2797
  const isComponent = isJSXComponent(node);
2455
2798
  const isSlotTemplate = isTemplate(node) && parent && parent.node.type === "JSXElement" && isJSXComponent(parent.node);
2456
2799
  if (isComponent && children.length) return transformComponentSlot(node, resolvedDirective, context);
2457
2800
  else if (isSlotTemplate && resolvedDirective) return transformTemplateSlot(node, resolvedDirective, context);
2458
- else if (!isComponent && dir) context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_SLOT_MISPLACED, resolveLocation(dir.loc, context)));
2801
+ else if (!isComponent && dir) context.options.onError(createCompilerError(ErrorCodes.X_V_SLOT_MISPLACED, dir.loc));
2459
2802
  };
2460
2803
  function transformComponentSlot(node, dir, context) {
2461
2804
  const { children } = node;
@@ -2467,10 +2810,10 @@ function transformComponentSlot(node, dir, context) {
2467
2810
  onExit();
2468
2811
  const hasOtherSlots = !!slots.length;
2469
2812
  if (dir && hasOtherSlots) {
2470
- context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_SLOT_MIXED_SLOT_USAGE, dir.loc));
2813
+ context.options.onError(createCompilerError(ErrorCodes.X_V_SLOT_MIXED_SLOT_USAGE, dir.loc));
2471
2814
  return;
2472
2815
  }
2473
- if (nonSlotTemplateChildren.length) if (hasStaticSlot(slots, "default")) context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN, resolveLocation(nonSlotTemplateChildren[0].loc, context)));
2816
+ if (nonSlotTemplateChildren.length) if (hasStaticSlot(slots, "default")) context.options.onError(createCompilerError(ErrorCodes.X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN, nonSlotTemplateChildren[0].loc));
2474
2817
  else {
2475
2818
  registerSlot(slots, arg, block);
2476
2819
  context.slots = slots;
@@ -2481,7 +2824,7 @@ function transformComponentSlot(node, dir, context) {
2481
2824
  const elseIfRE = /^v-else(-if)?$/;
2482
2825
  function transformTemplateSlot(node, dir, context) {
2483
2826
  context.dynamic.flags |= DynamicFlag.NON_TEMPLATE;
2484
- const arg = dir.arg && resolveSimpleExpressionNode(dir.arg);
2827
+ const arg = dir.arg;
2485
2828
  const vFor = findProp(node, "v-for");
2486
2829
  const vIf = findProp(node, "v-if");
2487
2830
  const vElse = findProp(node, elseIfRE);
@@ -2489,7 +2832,7 @@ function transformTemplateSlot(node, dir, context) {
2489
2832
  const [block, onExit] = createSlotBlock(node, dir, context);
2490
2833
  if (!vFor && !vIf && !vElse) {
2491
2834
  const slotName = arg ? arg.isStatic && arg.content : "default";
2492
- if (slotName && hasStaticSlot(slots, slotName)) context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_SLOT_DUPLICATE_SLOT_NAMES, dir.loc));
2835
+ if (slotName && hasStaticSlot(slots, slotName)) context.options.onError(createCompilerError(ErrorCodes.X_V_SLOT_DUPLICATE_SLOT_NAMES, dir.loc));
2493
2836
  else registerSlot(slots, arg, block);
2494
2837
  } else if (vIf) {
2495
2838
  const vIfDir = resolveDirective(vIf, context);
@@ -2522,7 +2865,7 @@ function transformTemplateSlot(node, dir, context) {
2522
2865
  fn: block
2523
2866
  };
2524
2867
  ifNode.negative = negative;
2525
- } else context.options.onError((0, __vue_compiler_dom.createCompilerError)(__vue_compiler_dom.ErrorCodes.X_V_ELSE_NO_ADJACENT_IF, vElseDir.loc));
2868
+ } else context.options.onError(createCompilerError(ErrorCodes.X_V_ELSE_NO_ADJACENT_IF, vElseDir.loc));
2526
2869
  } else if (vFor) {
2527
2870
  const forParseResult = getForParseResult(vFor, context);
2528
2871
  if (forParseResult.source) registerDynamicSlot(slots, {
@@ -2580,18 +2923,17 @@ const transformVSlots = (dir, node, context) => {
2580
2923
  //#region src/transforms/vText.ts
2581
2924
  const transformVText = (dir, node, context) => {
2582
2925
  let exp;
2583
- const loc = resolveLocation(dir.loc, context);
2584
2926
  if (!dir.value) {
2585
- context.options.onError((0, __vue_compiler_dom.createDOMCompilerError)(__vue_compiler_dom.DOMErrorCodes.X_V_TEXT_NO_EXPRESSION, loc));
2927
+ context.options.onError(createCompilerError(ErrorCodes.X_V_TEXT_NO_EXPRESSION, dir.loc));
2586
2928
  exp = EMPTY_EXPRESSION;
2587
2929
  } else exp = resolveExpression(dir.value, context);
2588
2930
  if (node.children.length) {
2589
- context.options.onError((0, __vue_compiler_dom.createDOMCompilerError)(__vue_compiler_dom.DOMErrorCodes.X_V_TEXT_WITH_CHILDREN, loc));
2931
+ context.options.onError(createCompilerError(ErrorCodes.X_V_TEXT_WITH_CHILDREN, dir.loc));
2590
2932
  context.childrenTemplate.length = 0;
2591
2933
  }
2592
2934
  if ((0, __vue_shared.isVoidTag)(getText(node.openingElement.name, context))) return;
2593
2935
  const literal = getLiteralExpressionValue(exp);
2594
- if (literal != null) context.childrenTemplate = [String(literal)];
2936
+ if (literal != null) context.childrenTemplate = [(0, __vue_shared.escapeHtml)(String(literal))];
2595
2937
  else {
2596
2938
  context.childrenTemplate = [" "];
2597
2939
  context.registerOperation({