@vue-jsx-vapor/compiler 0.2.4 → 0.2.6
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 +365 -158
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +369 -162
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
@@ -66,40 +66,6 @@ var DynamicFlag = /* @__PURE__ */ ((DynamicFlag2) => {
|
|
66
66
|
|
67
67
|
|
68
68
|
var _types = require('@babel/types');
|
69
|
-
function newDynamic() {
|
70
|
-
return {
|
71
|
-
flags: 1 /* REFERENCED */,
|
72
|
-
children: []
|
73
|
-
};
|
74
|
-
}
|
75
|
-
function newBlock(node) {
|
76
|
-
return {
|
77
|
-
type: 1,
|
78
|
-
node,
|
79
|
-
dynamic: newDynamic(),
|
80
|
-
effect: [],
|
81
|
-
operation: [],
|
82
|
-
returns: [],
|
83
|
-
expressions: [],
|
84
|
-
tempId: 0
|
85
|
-
};
|
86
|
-
}
|
87
|
-
function createBranch(node, context, isVFor) {
|
88
|
-
context.node = node = wrapFragment(node);
|
89
|
-
const branch = newBlock(node);
|
90
|
-
const exitBlock = context.enterBlock(branch, isVFor);
|
91
|
-
context.reference();
|
92
|
-
return [branch, exitBlock];
|
93
|
-
}
|
94
|
-
function wrapFragment(node) {
|
95
|
-
if (node.type === "JSXFragment") {
|
96
|
-
return node;
|
97
|
-
}
|
98
|
-
return _types.jsxFragment.call(void 0, _types.jsxOpeningFragment.call(void 0, ), _types.jsxClosingFragment.call(void 0, ), [
|
99
|
-
node.type === "JSXElement" ? node : _types.jsxExpressionContainer.call(void 0, node)
|
100
|
-
]);
|
101
|
-
}
|
102
|
-
var EMPTY_EXPRESSION = _compilerdom.createSimpleExpression.call(void 0, "", true);
|
103
69
|
|
104
70
|
// src/utils.ts
|
105
71
|
|
@@ -114,6 +80,7 @@ var EMPTY_EXPRESSION = _compilerdom.createSimpleExpression.call(void 0, "", true
|
|
114
80
|
|
115
81
|
|
116
82
|
|
83
|
+
|
117
84
|
function propToExpression(prop, context) {
|
118
85
|
return prop.type === "JSXAttribute" && _optionalChain([prop, 'access', _2 => _2.value, 'optionalAccess', _3 => _3.type]) === "JSXExpressionContainer" ? resolveExpression(prop.value.expression, context) : EMPTY_EXPRESSION;
|
119
86
|
}
|
@@ -170,6 +137,15 @@ function resolveJSXText(node) {
|
|
170
137
|
function isEmptyText(node) {
|
171
138
|
return node.type === "JSXText" && EMPTY_TEXT_REGEX.test(`${_optionalChain([node, 'access', _6 => _6.extra, 'optionalAccess', _7 => _7.raw])}`) || node.type === "JSXExpressionContainer" && node.expression.type === "JSXEmptyExpression";
|
172
139
|
}
|
140
|
+
function resolveSimpleExpressionNode(exp) {
|
141
|
+
if (!exp.isStatic) {
|
142
|
+
const value = getLiteralExpressionValue(exp);
|
143
|
+
if (value !== null) {
|
144
|
+
return _compilerdom.createSimpleExpression.call(void 0, `${value}`, true, exp.loc);
|
145
|
+
}
|
146
|
+
}
|
147
|
+
return exp;
|
148
|
+
}
|
173
149
|
function resolveExpression(node, context, effect = false) {
|
174
150
|
node = _optionalChain([node, 'optionalAccess', _8 => _8.type]) === "JSXExpressionContainer" ? node.expression : node;
|
175
151
|
const isStatic = !!node && (node.type === "StringLiteral" || node.type === "JSXText" || node.type === "JSXIdentifier");
|
@@ -269,23 +245,54 @@ function resolveNode(node, context) {
|
|
269
245
|
codegenNode: void 0
|
270
246
|
};
|
271
247
|
}
|
272
|
-
|
248
|
+
var namespaceRE = /^(?:\$([\w-]+)\$)?([\w-]+)?/;
|
249
|
+
function resolveDirectiveNode(node, context, withFn = false) {
|
273
250
|
const { value, name } = node;
|
274
|
-
const nameString = name.type === "JSXIdentifier" ? name.name : "";
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
251
|
+
const nameString = name.type === "JSXNamespacedName" ? name.namespace.name : name.type === "JSXIdentifier" ? name.name : "";
|
252
|
+
let argString = name.type === "JSXNamespacedName" ? name.name.name : "";
|
253
|
+
if (name.type !== "JSXNamespacedName" && !argString) {
|
254
|
+
const [, modifiers2] = nameString.split("_");
|
255
|
+
argString = `_${modifiers2}`;
|
256
|
+
}
|
257
|
+
let modifiers = [];
|
258
|
+
let isStatic = true;
|
259
|
+
const result = argString.match(namespaceRE);
|
260
|
+
if (result) {
|
261
|
+
let modifierString = "";
|
262
|
+
[, argString, modifierString] = result;
|
263
|
+
if (argString) {
|
264
|
+
argString = argString.replaceAll("_", ".");
|
265
|
+
isStatic = false;
|
266
|
+
if (modifierString && modifierString.startsWith("_"))
|
267
|
+
modifiers = modifierString.slice(1).split("_");
|
268
|
+
} else if (modifierString) {
|
269
|
+
;
|
270
|
+
[argString, ...modifiers] = modifierString.split("_");
|
271
|
+
}
|
272
|
+
}
|
273
|
+
const arg = argString && name.type === "JSXNamespacedName" ? resolveSimpleExpression(argString, isStatic, name.name.loc) : void 0;
|
274
|
+
const exp = value ? withFn && value.type === "JSXExpressionContainer" ? resolveExpressionWithFn(value.expression, context) : resolveExpression(value, context) : void 0;
|
279
275
|
return {
|
280
276
|
type: _compilerdom.NodeTypes.DIRECTIVE,
|
281
277
|
name: nameString,
|
282
|
-
rawName: `${
|
278
|
+
rawName: `${nameString}:${argString}`,
|
283
279
|
exp,
|
284
280
|
arg,
|
285
281
|
loc: resolveLocation(node.loc, context),
|
286
282
|
modifiers: modifiers.map((modifier) => _compilerdom.createSimpleExpression.call(void 0, modifier))
|
287
283
|
};
|
288
284
|
}
|
285
|
+
function resolveExpressionWithFn(node, context) {
|
286
|
+
const text = getText(node, context);
|
287
|
+
return node.type === "Identifier" ? resolveSimpleExpression(text, false, node.loc) : resolveSimpleExpression(
|
288
|
+
text,
|
289
|
+
false,
|
290
|
+
node.loc,
|
291
|
+
_parser.parseExpression.call(void 0, `(${text})=>{}`, {
|
292
|
+
plugins: ["typescript"]
|
293
|
+
})
|
294
|
+
);
|
295
|
+
}
|
289
296
|
function isJSXComponent(node) {
|
290
297
|
if (node.type !== "JSXElement") return false;
|
291
298
|
const { openingElement } = node;
|
@@ -299,7 +306,8 @@ function isJSXComponent(node) {
|
|
299
306
|
function findProp(expression, key) {
|
300
307
|
if (_optionalChain([expression, 'optionalAccess', _9 => _9.type]) === "JSXElement") {
|
301
308
|
for (const attr of expression.openingElement.attributes) {
|
302
|
-
|
309
|
+
const name = attr.type === "JSXAttribute" && (attr.name.type === "JSXIdentifier" ? attr.name.name : attr.name.type === "JSXNamespacedName" ? attr.name.namespace.name : "").split("_")[0];
|
310
|
+
if (name && (_shared.isString.call(void 0, key) ? name === key : key.test(name))) {
|
303
311
|
return attr;
|
304
312
|
}
|
305
313
|
}
|
@@ -308,6 +316,47 @@ function findProp(expression, key) {
|
|
308
316
|
function getText(node, content) {
|
309
317
|
return content.ir.source.slice(node.start, node.end);
|
310
318
|
}
|
319
|
+
function isTemplate(node) {
|
320
|
+
if (node.type === "JSXElement" && node.openingElement.name.type === "JSXIdentifier") {
|
321
|
+
return node.openingElement.name.name === "template";
|
322
|
+
}
|
323
|
+
}
|
324
|
+
|
325
|
+
// src/transforms/utils.ts
|
326
|
+
function newDynamic() {
|
327
|
+
return {
|
328
|
+
flags: 1 /* REFERENCED */,
|
329
|
+
children: []
|
330
|
+
};
|
331
|
+
}
|
332
|
+
function newBlock(node) {
|
333
|
+
return {
|
334
|
+
type: 1,
|
335
|
+
node,
|
336
|
+
dynamic: newDynamic(),
|
337
|
+
effect: [],
|
338
|
+
operation: [],
|
339
|
+
returns: [],
|
340
|
+
expressions: [],
|
341
|
+
tempId: 0
|
342
|
+
};
|
343
|
+
}
|
344
|
+
function createBranch(node, context, isVFor) {
|
345
|
+
context.node = node = wrapFragment(node);
|
346
|
+
const branch = newBlock(node);
|
347
|
+
const exitBlock = context.enterBlock(branch, isVFor);
|
348
|
+
context.reference();
|
349
|
+
return [branch, exitBlock];
|
350
|
+
}
|
351
|
+
function wrapFragment(node) {
|
352
|
+
if (node.type === "JSXFragment" || isTemplate(node)) {
|
353
|
+
return node;
|
354
|
+
}
|
355
|
+
return _types.jsxFragment.call(void 0, _types.jsxOpeningFragment.call(void 0, ), _types.jsxClosingFragment.call(void 0, ), [
|
356
|
+
node.type === "JSXElement" ? node : _types.jsxExpressionContainer.call(void 0, node)
|
357
|
+
]);
|
358
|
+
}
|
359
|
+
var EMPTY_EXPRESSION = _compilerdom.createSimpleExpression.call(void 0, "", true);
|
311
360
|
|
312
361
|
// src/transform.ts
|
313
362
|
var defaultOptions = {
|
@@ -471,9 +520,9 @@ function createStructuralDirectiveTransform(name, fn) {
|
|
471
520
|
return (node, context) => {
|
472
521
|
if (node.type === "JSXElement") {
|
473
522
|
const {
|
474
|
-
openingElement: { attributes
|
523
|
+
openingElement: { attributes }
|
475
524
|
} = node;
|
476
|
-
if (
|
525
|
+
if (isTemplate(node) && findProp(node, "v-slot")) {
|
477
526
|
return;
|
478
527
|
}
|
479
528
|
const exitFns = [];
|
@@ -507,7 +556,7 @@ var transformElement = (node, context) => {
|
|
507
556
|
return function postTransformElement() {
|
508
557
|
;
|
509
558
|
({ node } = context);
|
510
|
-
if (node.type !== "JSXElement") return;
|
559
|
+
if (node.type !== "JSXElement" || isTemplate(node)) return;
|
511
560
|
const {
|
512
561
|
openingElement: { name }
|
513
562
|
} = node;
|
@@ -518,7 +567,11 @@ var transformElement = (node, context) => {
|
|
518
567
|
context,
|
519
568
|
isComponent
|
520
569
|
);
|
521
|
-
|
570
|
+
let { parent } = context;
|
571
|
+
while (parent && parent.parent && parent.node.type === "JSXElement" && isTemplate(parent.node)) {
|
572
|
+
parent = parent.parent;
|
573
|
+
}
|
574
|
+
const singleRoot = context.root === parent && parent.node.children.filter((child) => !isJSXComponent(child)).length === 1;
|
522
575
|
(isComponent ? transformComponentElement : transformNativeElement)(
|
523
576
|
tag,
|
524
577
|
propsResult,
|
@@ -653,6 +706,7 @@ function buildProps(node, context, isComponent) {
|
|
653
706
|
function transformProp(prop, node, context) {
|
654
707
|
if (prop.type === "JSXSpreadAttribute") return;
|
655
708
|
let name = prop.name.type === "JSXIdentifier" ? prop.name.name : prop.name.type === "JSXNamespacedName" ? prop.name.namespace.name : "";
|
709
|
+
name = name.split("_")[0];
|
656
710
|
if (!isDirectiveRegex.test(name) && (!prop.value || prop.value.type === "StringLiteral")) {
|
657
711
|
if (isReservedProp(name)) return;
|
658
712
|
return {
|
@@ -709,7 +763,7 @@ function mergePropValues(existing, incoming) {
|
|
709
763
|
|
710
764
|
// src/transforms/transformChildren.ts
|
711
765
|
var transformChildren = (node, context) => {
|
712
|
-
const isFragment = node.type === 0 /* ROOT */ || node.type === "JSXFragment" || isJSXComponent(node);
|
766
|
+
const isFragment = node.type === 0 /* ROOT */ || node.type === "JSXFragment" || node.type === "JSXElement" && (isTemplate(node) || isJSXComponent(node));
|
713
767
|
if (node.type !== "JSXElement" && !isFragment) return;
|
714
768
|
for (const [i, child] of node.children.entries()) {
|
715
769
|
const childContext = context.create(child, i);
|
@@ -868,7 +922,7 @@ var transformText = (node, context) => {
|
|
868
922
|
context.dynamic.flags |= 2 /* NON_TEMPLATE */;
|
869
923
|
return;
|
870
924
|
}
|
871
|
-
if (node.type === "JSXElement" && !isJSXComponent(node) && isAllTextLike(node.children)) {
|
925
|
+
if (node.type === "JSXElement" && !isTemplate(node) && !isJSXComponent(node) && isAllTextLike(node.children)) {
|
872
926
|
processTextLikeContainer(
|
873
927
|
node.children,
|
874
928
|
context
|
@@ -894,11 +948,13 @@ function processTextLike(context) {
|
|
894
948
|
const nexts = _optionalChain([context, 'access', _11 => _11.parent, 'access', _12 => _12.node, 'access', _13 => _13.children, 'optionalAccess', _14 => _14.slice, 'call', _15 => _15(context.index)]);
|
895
949
|
const idx = nexts.findIndex((n) => !isTextLike(n));
|
896
950
|
const nodes = idx > -1 ? nexts.slice(0, idx) : nexts;
|
951
|
+
const id = context.reference();
|
952
|
+
const values = createTextLikeExpressions(nodes, context);
|
897
953
|
context.dynamic.flags |= 4 /* INSERT */ | 2 /* NON_TEMPLATE */;
|
898
954
|
context.registerOperation({
|
899
955
|
type: 11 /* CREATE_TEXT_NODE */,
|
900
|
-
id
|
901
|
-
values
|
956
|
+
id,
|
957
|
+
values,
|
902
958
|
jsx: true
|
903
959
|
});
|
904
960
|
}
|
@@ -921,7 +977,7 @@ function createTextLikeExpressions(nodes, context) {
|
|
921
977
|
for (const node of nodes) {
|
922
978
|
seen.get(context.root).add(node);
|
923
979
|
if (isEmptyText(node)) continue;
|
924
|
-
values.push(resolveExpression(node, context,
|
980
|
+
values.push(resolveExpression(node, context, !context.inVOnce));
|
925
981
|
}
|
926
982
|
return values;
|
927
983
|
}
|
@@ -1037,42 +1093,211 @@ var transformVOn = (dir, node, context) => {
|
|
1037
1093
|
};
|
1038
1094
|
|
1039
1095
|
// src/transforms/vSlot.ts
|
1040
|
-
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
1046
|
-
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
|
1052
|
-
|
1053
|
-
|
1096
|
+
|
1097
|
+
|
1098
|
+
|
1099
|
+
|
1100
|
+
|
1101
|
+
// src/transforms/vFor.ts
|
1102
|
+
|
1103
|
+
|
1104
|
+
|
1105
|
+
|
1106
|
+
|
1107
|
+
var transformVFor = createStructuralDirectiveTransform(
|
1108
|
+
"for",
|
1109
|
+
processFor
|
1110
|
+
);
|
1111
|
+
function processFor(node, dir, context) {
|
1112
|
+
const { value, index, key, source } = getForParseResult(dir, context);
|
1113
|
+
if (!source) {
|
1114
|
+
context.options.onError(
|
1115
|
+
_compilerdom.createCompilerError.call(void 0,
|
1116
|
+
_compilerdom.ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION,
|
1117
|
+
resolveLocation(dir.loc, context)
|
1118
|
+
)
|
1119
|
+
);
|
1120
|
+
return;
|
1121
|
+
}
|
1122
|
+
const keyProp = findProp(node, "key");
|
1123
|
+
const keyProperty = keyProp && propToExpression(keyProp, context);
|
1124
|
+
const isComponent = isJSXComponent(node);
|
1125
|
+
const id = context.reference();
|
1126
|
+
context.dynamic.flags |= 2 /* NON_TEMPLATE */ | 4 /* INSERT */;
|
1127
|
+
const [render, exitBlock] = createBranch(node, context, true);
|
1128
|
+
return () => {
|
1129
|
+
exitBlock();
|
1130
|
+
const { parent } = context;
|
1131
|
+
const isOnlyChild = parent && parent.block.node !== parent.node && parent.node.children.length === 1;
|
1132
|
+
context.registerOperation({
|
1133
|
+
type: 17 /* FOR */,
|
1134
|
+
id,
|
1135
|
+
source,
|
1136
|
+
value,
|
1137
|
+
key,
|
1138
|
+
index,
|
1139
|
+
keyProp: keyProperty,
|
1140
|
+
render,
|
1141
|
+
once: context.inVOnce || !!(source.ast && _compilerdom.isConstantNode.call(void 0, source.ast, {})),
|
1142
|
+
component: isComponent,
|
1143
|
+
onlyChild: !!isOnlyChild
|
1144
|
+
});
|
1145
|
+
};
|
1146
|
+
}
|
1147
|
+
function getForParseResult(dir, context) {
|
1148
|
+
let value, index, key, source;
|
1149
|
+
if (dir.value) {
|
1150
|
+
if (dir.value.type === "JSXExpressionContainer" && dir.value.expression.type === "BinaryExpression") {
|
1151
|
+
if (dir.value.expression.left.type === "SequenceExpression") {
|
1152
|
+
const expressions = dir.value.expression.left.expressions;
|
1153
|
+
value = expressions[0] && resolveExpressionWithFn(expressions[0], context);
|
1154
|
+
key = expressions[1] && resolveExpression(expressions[1], context);
|
1155
|
+
index = expressions[2] && resolveExpression(expressions[2], context);
|
1156
|
+
} else {
|
1157
|
+
value = resolveExpressionWithFn(dir.value.expression.left, context);
|
1054
1158
|
}
|
1055
|
-
|
1159
|
+
source = resolveExpression(dir.value.expression.right, context);
|
1160
|
+
}
|
1161
|
+
} else {
|
1162
|
+
context.options.onError(
|
1163
|
+
_compilerdom.createCompilerError.call(void 0,
|
1164
|
+
_compilerdom.ErrorCodes.X_V_FOR_NO_EXPRESSION,
|
1165
|
+
resolveLocation(dir.loc, context)
|
1166
|
+
)
|
1167
|
+
);
|
1056
1168
|
}
|
1057
|
-
|
1058
|
-
|
1169
|
+
return {
|
1170
|
+
value,
|
1171
|
+
index,
|
1172
|
+
key,
|
1173
|
+
source
|
1174
|
+
};
|
1175
|
+
}
|
1176
|
+
|
1177
|
+
// src/transforms/vSlot.ts
|
1178
|
+
var transformVSlot = (node, context) => {
|
1179
|
+
if (node.type !== "JSXElement") return;
|
1180
|
+
const { children } = node;
|
1181
|
+
const dir = findProp(node, "v-slot");
|
1182
|
+
const resolvedDirective = dir ? resolveDirectiveNode(dir, context, true) : void 0;
|
1183
|
+
const { parent } = context;
|
1184
|
+
const isComponent = isJSXComponent(node);
|
1185
|
+
const isSlotTemplate = isTemplate(node) && parent && parent.node.type === "JSXElement" && isJSXComponent(parent.node);
|
1186
|
+
if (isComponent && children.length) {
|
1187
|
+
return transformComponentSlot(node, resolvedDirective, context);
|
1188
|
+
} else if (isSlotTemplate && resolvedDirective) {
|
1189
|
+
return transformTemplateSlot(node, resolvedDirective, context);
|
1190
|
+
} else if (!isComponent && dir) {
|
1191
|
+
context.options.onError(
|
1192
|
+
_compilerdom.createCompilerError.call(void 0,
|
1193
|
+
_compilerdom.ErrorCodes.X_V_SLOT_MISPLACED,
|
1194
|
+
resolveLocation(dir.loc, context)
|
1195
|
+
)
|
1196
|
+
);
|
1059
1197
|
}
|
1060
1198
|
};
|
1061
|
-
function transformComponentSlot(node, context) {
|
1199
|
+
function transformComponentSlot(node, dir, context) {
|
1062
1200
|
const { children } = node;
|
1063
|
-
const
|
1064
|
-
|
1201
|
+
const arg = dir && dir.arg;
|
1202
|
+
const nonSlotTemplateChildren = children.filter(
|
1203
|
+
(n) => isNonWhitespaceContent(n) && !(n.type === "JSXElement" && findProp(n, "v-slot"))
|
1065
1204
|
);
|
1066
|
-
const [block, onExit] = createSlotBlock(node, context);
|
1205
|
+
const [block, onExit] = createSlotBlock(node, dir, context);
|
1067
1206
|
const { slots } = context;
|
1068
1207
|
return () => {
|
1069
1208
|
onExit();
|
1070
|
-
|
1071
|
-
|
1209
|
+
const hasOtherSlots = !!slots.length;
|
1210
|
+
if (dir && hasOtherSlots) {
|
1211
|
+
context.options.onError(
|
1212
|
+
_compilerdom.createCompilerError.call(void 0, _compilerdom.ErrorCodes.X_V_SLOT_MIXED_SLOT_USAGE, dir.loc)
|
1213
|
+
);
|
1214
|
+
return;
|
1215
|
+
}
|
1216
|
+
if (nonSlotTemplateChildren.length) {
|
1217
|
+
if (hasStaticSlot(slots, "default")) {
|
1218
|
+
context.options.onError(
|
1219
|
+
_compilerdom.createCompilerError.call(void 0,
|
1220
|
+
_compilerdom.ErrorCodes.X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN,
|
1221
|
+
resolveLocation(nonSlotTemplateChildren[0].loc, context)
|
1222
|
+
)
|
1223
|
+
);
|
1224
|
+
} else {
|
1225
|
+
registerSlot(slots, arg, block);
|
1226
|
+
context.slots = slots;
|
1227
|
+
}
|
1228
|
+
} else if (hasOtherSlots) {
|
1072
1229
|
context.slots = slots;
|
1073
1230
|
}
|
1074
1231
|
};
|
1075
1232
|
}
|
1233
|
+
var elseIfRE = /^else(-if)?$/;
|
1234
|
+
function transformTemplateSlot(node, dir, context) {
|
1235
|
+
context.dynamic.flags |= 2 /* NON_TEMPLATE */;
|
1236
|
+
const arg = dir.arg && resolveSimpleExpressionNode(dir.arg);
|
1237
|
+
const vFor = findProp(node, "v-for");
|
1238
|
+
const vIf = findProp(node, "v-if");
|
1239
|
+
const vElse = findProp(node, elseIfRE);
|
1240
|
+
const { slots } = context;
|
1241
|
+
const [block, onExit] = createSlotBlock(node, dir, context);
|
1242
|
+
if (!vFor && !vIf && !vElse) {
|
1243
|
+
const slotName = arg ? arg.isStatic && arg.content : "default";
|
1244
|
+
if (slotName && hasStaticSlot(slots, slotName)) {
|
1245
|
+
context.options.onError(
|
1246
|
+
_compilerdom.createCompilerError.call(void 0, _compilerdom.ErrorCodes.X_V_SLOT_DUPLICATE_SLOT_NAMES, dir.loc)
|
1247
|
+
);
|
1248
|
+
} else {
|
1249
|
+
registerSlot(slots, arg, block);
|
1250
|
+
}
|
1251
|
+
} else if (vIf) {
|
1252
|
+
const vIfDir = resolveDirectiveNode(vIf, context);
|
1253
|
+
registerDynamicSlot(slots, {
|
1254
|
+
slotType: 3 /* CONDITIONAL */,
|
1255
|
+
condition: vIfDir.exp,
|
1256
|
+
positive: {
|
1257
|
+
slotType: 1 /* DYNAMIC */,
|
1258
|
+
name: arg,
|
1259
|
+
fn: block
|
1260
|
+
}
|
1261
|
+
});
|
1262
|
+
} else if (vElse) {
|
1263
|
+
const vElseDir = resolveDirectiveNode(vElse, context);
|
1264
|
+
const vIfSlot = slots.at(-1);
|
1265
|
+
if (vIfSlot.slotType === 3 /* CONDITIONAL */) {
|
1266
|
+
let ifNode = vIfSlot;
|
1267
|
+
while (ifNode.negative && ifNode.negative.slotType === 3 /* CONDITIONAL */)
|
1268
|
+
ifNode = ifNode.negative;
|
1269
|
+
const negative = vElseDir.exp ? {
|
1270
|
+
slotType: 3 /* CONDITIONAL */,
|
1271
|
+
condition: vElseDir.exp,
|
1272
|
+
positive: {
|
1273
|
+
slotType: 1 /* DYNAMIC */,
|
1274
|
+
name: arg,
|
1275
|
+
fn: block
|
1276
|
+
}
|
1277
|
+
} : {
|
1278
|
+
slotType: 1 /* DYNAMIC */,
|
1279
|
+
name: arg,
|
1280
|
+
fn: block
|
1281
|
+
};
|
1282
|
+
ifNode.negative = negative;
|
1283
|
+
} else {
|
1284
|
+
context.options.onError(
|
1285
|
+
_compilerdom.createCompilerError.call(void 0, _compilerdom.ErrorCodes.X_V_ELSE_NO_ADJACENT_IF, vElseDir.loc)
|
1286
|
+
);
|
1287
|
+
}
|
1288
|
+
} else if (vFor) {
|
1289
|
+
const forParseResult = getForParseResult(vFor, context);
|
1290
|
+
if (forParseResult.source) {
|
1291
|
+
registerDynamicSlot(slots, {
|
1292
|
+
slotType: 2 /* LOOP */,
|
1293
|
+
name: arg,
|
1294
|
+
fn: block,
|
1295
|
+
loop: forParseResult
|
1296
|
+
});
|
1297
|
+
}
|
1298
|
+
}
|
1299
|
+
return onExit;
|
1300
|
+
}
|
1076
1301
|
function ensureStaticSlots(slots) {
|
1077
1302
|
let lastSlots = slots.at(-1);
|
1078
1303
|
if (!slots.length || lastSlots.slotType !== 0 /* STATIC */) {
|
@@ -1083,14 +1308,32 @@ function ensureStaticSlots(slots) {
|
|
1083
1308
|
}
|
1084
1309
|
);
|
1085
1310
|
}
|
1086
|
-
return lastSlots;
|
1311
|
+
return lastSlots.slots;
|
1087
1312
|
}
|
1088
|
-
function registerSlot(slots, block) {
|
1089
|
-
const
|
1090
|
-
|
1313
|
+
function registerSlot(slots, name, block) {
|
1314
|
+
const isStatic = !name || name.isStatic;
|
1315
|
+
if (isStatic) {
|
1316
|
+
const staticSlots = ensureStaticSlots(slots);
|
1317
|
+
staticSlots[name ? name.content : "default"] = block;
|
1318
|
+
} else {
|
1319
|
+
slots.push({
|
1320
|
+
slotType: 1 /* DYNAMIC */,
|
1321
|
+
name,
|
1322
|
+
fn: block
|
1323
|
+
});
|
1324
|
+
}
|
1325
|
+
}
|
1326
|
+
function registerDynamicSlot(allSlots, dynamic) {
|
1327
|
+
allSlots.push(dynamic);
|
1091
1328
|
}
|
1092
|
-
function
|
1329
|
+
function hasStaticSlot(slots, name) {
|
1330
|
+
return slots.some(
|
1331
|
+
(slot) => slot.slotType === 0 /* STATIC */ ? !!slot.slots[name] : false
|
1332
|
+
);
|
1333
|
+
}
|
1334
|
+
function createSlotBlock(slotNode, dir, context) {
|
1093
1335
|
const block = newBlock(slotNode);
|
1336
|
+
block.props = dir && dir.exp;
|
1094
1337
|
const exitBlock = context.enterBlock(block);
|
1095
1338
|
return [block, exitBlock];
|
1096
1339
|
}
|
@@ -1099,6 +1342,37 @@ function isNonWhitespaceContent(node) {
|
|
1099
1342
|
return !!node.value.trim();
|
1100
1343
|
}
|
1101
1344
|
|
1345
|
+
// src/transforms/vSlots.ts
|
1346
|
+
|
1347
|
+
var transformVSlots = (node, context) => {
|
1348
|
+
if (node.type !== "JSXElement" || !isJSXComponent(node)) return;
|
1349
|
+
const {
|
1350
|
+
openingElement: { attributes },
|
1351
|
+
children
|
1352
|
+
} = node;
|
1353
|
+
const vSlotsIndex = attributes.findIndex(
|
1354
|
+
(attr) => attr.type === "JSXAttribute" && attr.name.name.toString() === "v-slots"
|
1355
|
+
);
|
1356
|
+
const vSlotsDir = attributes[vSlotsIndex];
|
1357
|
+
if (vSlotsDir && _optionalChain([vSlotsDir, 'access', _16 => _16.value, 'optionalAccess', _17 => _17.type]) === "JSXExpressionContainer") {
|
1358
|
+
attributes.splice(vSlotsIndex, 1);
|
1359
|
+
context.slots = [
|
1360
|
+
{
|
1361
|
+
slotType: 4 /* EXPRESSION */,
|
1362
|
+
slots: resolveExpression(vSlotsDir.value.expression, context)
|
1363
|
+
}
|
1364
|
+
];
|
1365
|
+
if (children.length) {
|
1366
|
+
context.options.onError(
|
1367
|
+
_compilerdom.createCompilerError.call(void 0,
|
1368
|
+
_compilerdom.ErrorCodes.X_V_SLOT_MIXED_SLOT_USAGE,
|
1369
|
+
resolveLocation(children[0].loc, context)
|
1370
|
+
)
|
1371
|
+
);
|
1372
|
+
}
|
1373
|
+
}
|
1374
|
+
};
|
1375
|
+
|
1102
1376
|
// src/transforms/vModel.ts
|
1103
1377
|
|
1104
1378
|
var transformVModel = (dir, node, context) => {
|
@@ -1129,85 +1403,15 @@ var transformVHtml = (dir, node, context) => {
|
|
1129
1403
|
);
|
1130
1404
|
};
|
1131
1405
|
|
1132
|
-
// src/transforms/
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
var transformVFor = createStructuralDirectiveTransform(
|
1141
|
-
"for",
|
1142
|
-
processFor
|
1143
|
-
);
|
1144
|
-
function processFor(node, dir, context) {
|
1145
|
-
if (!dir.value) {
|
1146
|
-
context.options.onError(
|
1147
|
-
_compilerdom.createCompilerError.call(void 0,
|
1148
|
-
_compilerdom.ErrorCodes.X_V_FOR_NO_EXPRESSION,
|
1149
|
-
resolveLocation(dir.loc, context)
|
1150
|
-
)
|
1151
|
-
);
|
1152
|
-
return;
|
1406
|
+
// src/transforms/vOnce.ts
|
1407
|
+
var transformVOnce = (node, context) => {
|
1408
|
+
if (
|
1409
|
+
// !context.inSSR &&
|
1410
|
+
node.type === "JSXElement" && findProp(node, "v-once")
|
1411
|
+
) {
|
1412
|
+
context.inVOnce = true;
|
1153
1413
|
}
|
1154
|
-
|
1155
|
-
context.options.onError(
|
1156
|
-
_compilerdom.createCompilerError.call(void 0,
|
1157
|
-
_compilerdom.ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION,
|
1158
|
-
resolveLocation(dir.loc, context)
|
1159
|
-
)
|
1160
|
-
);
|
1161
|
-
return;
|
1162
|
-
}
|
1163
|
-
let value, index, key, source;
|
1164
|
-
if (dir.value.type === "JSXExpressionContainer" && dir.value.expression.type === "BinaryExpression") {
|
1165
|
-
if (dir.value.expression.left.type === "SequenceExpression") {
|
1166
|
-
const expressions = dir.value.expression.left.expressions;
|
1167
|
-
value = expressions[0] && resolveValueExpression(expressions[0], context);
|
1168
|
-
key = expressions[1] && resolveExpression(expressions[1], context);
|
1169
|
-
index = expressions[2] && resolveExpression(expressions[2], context);
|
1170
|
-
} else {
|
1171
|
-
value = resolveValueExpression(dir.value.expression.left, context);
|
1172
|
-
}
|
1173
|
-
source = resolveExpression(dir.value.expression.right, context);
|
1174
|
-
}
|
1175
|
-
const keyProp = findProp(node, "key");
|
1176
|
-
const keyProperty = keyProp && propToExpression(keyProp, context);
|
1177
|
-
const isComponent = isJSXComponent(node);
|
1178
|
-
const id = context.reference();
|
1179
|
-
context.dynamic.flags |= 2 /* NON_TEMPLATE */ | 4 /* INSERT */;
|
1180
|
-
const [render, exitBlock] = createBranch(node, context, true);
|
1181
|
-
return () => {
|
1182
|
-
exitBlock();
|
1183
|
-
const { parent } = context;
|
1184
|
-
const isOnlyChild = parent && parent.block.node !== parent.node && parent.node.children.length === 1;
|
1185
|
-
context.registerOperation({
|
1186
|
-
type: 17 /* FOR */,
|
1187
|
-
id,
|
1188
|
-
source,
|
1189
|
-
value,
|
1190
|
-
key,
|
1191
|
-
index,
|
1192
|
-
keyProp: keyProperty,
|
1193
|
-
render,
|
1194
|
-
once: context.inVOnce || !!(source.ast && _compilerdom.isConstantNode.call(void 0, source.ast, {})),
|
1195
|
-
component: isComponent,
|
1196
|
-
onlyChild: !!isOnlyChild
|
1197
|
-
});
|
1198
|
-
};
|
1199
|
-
}
|
1200
|
-
function resolveValueExpression(node, context) {
|
1201
|
-
const text = getText(node, context);
|
1202
|
-
return node.type === "Identifier" ? resolveSimpleExpression(text, false, node.loc) : resolveSimpleExpression(
|
1203
|
-
text,
|
1204
|
-
false,
|
1205
|
-
node.loc,
|
1206
|
-
_parser.parseExpression.call(void 0, `(${text})=>{}`, {
|
1207
|
-
plugins: ["typescript"]
|
1208
|
-
})
|
1209
|
-
);
|
1210
|
-
}
|
1414
|
+
};
|
1211
1415
|
|
1212
1416
|
// src/compile.ts
|
1213
1417
|
function compile(source, options = {}) {
|
@@ -1260,10 +1464,12 @@ function compile(source, options = {}) {
|
|
1260
1464
|
function getBaseTransformPreset() {
|
1261
1465
|
return [
|
1262
1466
|
[
|
1467
|
+
transformVOnce,
|
1263
1468
|
transformVFor,
|
1264
1469
|
transformTemplateRef,
|
1265
1470
|
transformText,
|
1266
1471
|
transformElement,
|
1472
|
+
transformVSlots,
|
1267
1473
|
transformVSlot,
|
1268
1474
|
transformChildren
|
1269
1475
|
],
|
@@ -1300,4 +1506,5 @@ function getBaseTransformPreset() {
|
|
1300
1506
|
|
1301
1507
|
|
1302
1508
|
|
1303
|
-
|
1509
|
+
|
1510
|
+
exports.DynamicFlag = DynamicFlag; exports.IRDynamicPropsKind = IRDynamicPropsKind; exports.IRNodeTypes = IRNodeTypes; exports.IRSlotType = IRSlotType; exports.TransformContext = TransformContext; exports.compile = compile; exports.createStructuralDirectiveTransform = createStructuralDirectiveTransform; exports.generate = _compilervapor.generate; exports.resolveDirectiveNode = resolveDirectiveNode; exports.resolveNode = resolveNode; exports.transform = transform; exports.transformChildren = transformChildren; exports.transformElement = transformElement; exports.transformNode = transformNode; exports.transformTemplateRef = transformTemplateRef; exports.transformText = transformText; exports.transformVBind = transformVBind; exports.transformVFor = transformVFor; exports.transformVHtml = transformVHtml; exports.transformVModel = transformVModel; exports.transformVOn = transformVOn; exports.transformVShow = transformVShow; exports.transformVSlot = transformVSlot; exports.transformVSlots = transformVSlots;
|