@vue/compiler-dom 3.2.47 → 3.3.0-alpha.1
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/compiler-dom.cjs.js +671 -768
- package/dist/compiler-dom.cjs.prod.js +617 -715
- package/dist/compiler-dom.d.ts +43 -66
- package/dist/compiler-dom.esm-browser.js +4692 -4971
- package/dist/compiler-dom.esm-browser.prod.js +1 -1
- package/dist/compiler-dom.esm-bundler.js +414 -411
- package/dist/compiler-dom.global.js +4693 -4974
- package/dist/compiler-dom.global.prod.js +1 -1
- package/package.json +3 -3
|
@@ -16,16 +16,16 @@ const V_SHOW = Symbol(``);
|
|
|
16
16
|
const TRANSITION = Symbol(``);
|
|
17
17
|
const TRANSITION_GROUP = Symbol(``);
|
|
18
18
|
compilerCore.registerRuntimeHelpers({
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
[V_MODEL_RADIO]: `vModelRadio`,
|
|
20
|
+
[V_MODEL_CHECKBOX]: `vModelCheckbox`,
|
|
21
|
+
[V_MODEL_TEXT]: `vModelText`,
|
|
22
|
+
[V_MODEL_SELECT]: `vModelSelect`,
|
|
23
|
+
[V_MODEL_DYNAMIC]: `vModelDynamic`,
|
|
24
|
+
[V_ON_WITH_MODIFIERS]: `withModifiers`,
|
|
25
|
+
[V_ON_WITH_KEYS]: `withKeys`,
|
|
26
|
+
[V_SHOW]: `vShow`,
|
|
27
|
+
[TRANSITION]: `Transition`,
|
|
28
|
+
[TRANSITION_GROUP]: `TransitionGroup`
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
var namedCharacterReferences = {
|
|
@@ -2262,799 +2262,701 @@ var namedCharacterReferences = {
|
|
|
2262
2262
|
"CounterClockwiseContourIntegral;": "∳"
|
|
2263
2263
|
};
|
|
2264
2264
|
|
|
2265
|
-
// lazy compute this to make this file tree-shakable for browser
|
|
2266
2265
|
let maxCRNameLength;
|
|
2267
2266
|
const decodeHtml = (rawText, asAttr) => {
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2267
|
+
let offset = 0;
|
|
2268
|
+
const end = rawText.length;
|
|
2269
|
+
let decodedText = "";
|
|
2270
|
+
function advance(length) {
|
|
2271
|
+
offset += length;
|
|
2272
|
+
rawText = rawText.slice(length);
|
|
2273
|
+
}
|
|
2274
|
+
while (offset < end) {
|
|
2275
|
+
const head = /&(?:#x?)?/i.exec(rawText);
|
|
2276
|
+
if (!head || offset + head.index >= end) {
|
|
2277
|
+
const remaining = end - offset;
|
|
2278
|
+
decodedText += rawText.slice(0, remaining);
|
|
2279
|
+
advance(remaining);
|
|
2280
|
+
break;
|
|
2274
2281
|
}
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
+
decodedText += rawText.slice(0, head.index);
|
|
2283
|
+
advance(head.index);
|
|
2284
|
+
if (head[0] === "&") {
|
|
2285
|
+
let name = "";
|
|
2286
|
+
let value = void 0;
|
|
2287
|
+
if (/[0-9a-z]/i.test(rawText[1])) {
|
|
2288
|
+
if (!maxCRNameLength) {
|
|
2289
|
+
maxCRNameLength = Object.keys(namedCharacterReferences).reduce(
|
|
2290
|
+
(max, name2) => Math.max(max, name2.length),
|
|
2291
|
+
0
|
|
2292
|
+
);
|
|
2282
2293
|
}
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
if (head[0] === '&') {
|
|
2287
|
-
// Named character reference.
|
|
2288
|
-
let name = '';
|
|
2289
|
-
let value = undefined;
|
|
2290
|
-
if (/[0-9a-z]/i.test(rawText[1])) {
|
|
2291
|
-
if (!maxCRNameLength) {
|
|
2292
|
-
maxCRNameLength = Object.keys(namedCharacterReferences).reduce((max, name) => Math.max(max, name.length), 0);
|
|
2293
|
-
}
|
|
2294
|
-
for (let length = maxCRNameLength; !value && length > 0; --length) {
|
|
2295
|
-
name = rawText.slice(1, 1 + length);
|
|
2296
|
-
value = namedCharacterReferences[name];
|
|
2297
|
-
}
|
|
2298
|
-
if (value) {
|
|
2299
|
-
const semi = name.endsWith(';');
|
|
2300
|
-
if (asAttr &&
|
|
2301
|
-
!semi &&
|
|
2302
|
-
/[=a-z0-9]/i.test(rawText[name.length + 1] || '')) {
|
|
2303
|
-
decodedText += '&' + name;
|
|
2304
|
-
advance(1 + name.length);
|
|
2305
|
-
}
|
|
2306
|
-
else {
|
|
2307
|
-
decodedText += value;
|
|
2308
|
-
advance(1 + name.length);
|
|
2309
|
-
}
|
|
2310
|
-
}
|
|
2311
|
-
else {
|
|
2312
|
-
decodedText += '&' + name;
|
|
2313
|
-
advance(1 + name.length);
|
|
2314
|
-
}
|
|
2315
|
-
}
|
|
2316
|
-
else {
|
|
2317
|
-
decodedText += '&';
|
|
2318
|
-
advance(1);
|
|
2319
|
-
}
|
|
2294
|
+
for (let length = maxCRNameLength; !value && length > 0; --length) {
|
|
2295
|
+
name = rawText.slice(1, 1 + length);
|
|
2296
|
+
value = namedCharacterReferences[name];
|
|
2320
2297
|
}
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
if (cp === 0) {
|
|
2334
|
-
cp = 0xfffd;
|
|
2335
|
-
}
|
|
2336
|
-
else if (cp > 0x10ffff) {
|
|
2337
|
-
cp = 0xfffd;
|
|
2338
|
-
}
|
|
2339
|
-
else if (cp >= 0xd800 && cp <= 0xdfff) {
|
|
2340
|
-
cp = 0xfffd;
|
|
2341
|
-
}
|
|
2342
|
-
else if ((cp >= 0xfdd0 && cp <= 0xfdef) || (cp & 0xfffe) === 0xfffe) ;
|
|
2343
|
-
else if ((cp >= 0x01 && cp <= 0x08) ||
|
|
2344
|
-
cp === 0x0b ||
|
|
2345
|
-
(cp >= 0x0d && cp <= 0x1f) ||
|
|
2346
|
-
(cp >= 0x7f && cp <= 0x9f)) {
|
|
2347
|
-
cp = CCR_REPLACEMENTS[cp] || cp;
|
|
2348
|
-
}
|
|
2349
|
-
decodedText += String.fromCodePoint(cp);
|
|
2350
|
-
advance(body[0].length);
|
|
2351
|
-
}
|
|
2298
|
+
if (value) {
|
|
2299
|
+
const semi = name.endsWith(";");
|
|
2300
|
+
if (asAttr && !semi && /[=a-z0-9]/i.test(rawText[name.length + 1] || "")) {
|
|
2301
|
+
decodedText += "&" + name;
|
|
2302
|
+
advance(1 + name.length);
|
|
2303
|
+
} else {
|
|
2304
|
+
decodedText += value;
|
|
2305
|
+
advance(1 + name.length);
|
|
2306
|
+
}
|
|
2307
|
+
} else {
|
|
2308
|
+
decodedText += "&" + name;
|
|
2309
|
+
advance(1 + name.length);
|
|
2352
2310
|
}
|
|
2311
|
+
} else {
|
|
2312
|
+
decodedText += "&";
|
|
2313
|
+
advance(1);
|
|
2314
|
+
}
|
|
2315
|
+
} else {
|
|
2316
|
+
const hex = head[0] === "&#x";
|
|
2317
|
+
const pattern = hex ? /^&#x([0-9a-f]+);?/i : /^&#([0-9]+);?/;
|
|
2318
|
+
const body = pattern.exec(rawText);
|
|
2319
|
+
if (!body) {
|
|
2320
|
+
decodedText += head[0];
|
|
2321
|
+
advance(head[0].length);
|
|
2322
|
+
} else {
|
|
2323
|
+
let cp = Number.parseInt(body[1], hex ? 16 : 10);
|
|
2324
|
+
if (cp === 0) {
|
|
2325
|
+
cp = 65533;
|
|
2326
|
+
} else if (cp > 1114111) {
|
|
2327
|
+
cp = 65533;
|
|
2328
|
+
} else if (cp >= 55296 && cp <= 57343) {
|
|
2329
|
+
cp = 65533;
|
|
2330
|
+
} else if (cp >= 64976 && cp <= 65007 || (cp & 65534) === 65534) ; else if (cp >= 1 && cp <= 8 || cp === 11 || cp >= 13 && cp <= 31 || cp >= 127 && cp <= 159) {
|
|
2331
|
+
cp = CCR_REPLACEMENTS[cp] || cp;
|
|
2332
|
+
}
|
|
2333
|
+
decodedText += String.fromCodePoint(cp);
|
|
2334
|
+
advance(body[0].length);
|
|
2335
|
+
}
|
|
2353
2336
|
}
|
|
2354
|
-
|
|
2337
|
+
}
|
|
2338
|
+
return decodedText;
|
|
2355
2339
|
};
|
|
2356
|
-
// https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-end-state
|
|
2357
2340
|
const CCR_REPLACEMENTS = {
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2341
|
+
128: 8364,
|
|
2342
|
+
130: 8218,
|
|
2343
|
+
131: 402,
|
|
2344
|
+
132: 8222,
|
|
2345
|
+
133: 8230,
|
|
2346
|
+
134: 8224,
|
|
2347
|
+
135: 8225,
|
|
2348
|
+
136: 710,
|
|
2349
|
+
137: 8240,
|
|
2350
|
+
138: 352,
|
|
2351
|
+
139: 8249,
|
|
2352
|
+
140: 338,
|
|
2353
|
+
142: 381,
|
|
2354
|
+
145: 8216,
|
|
2355
|
+
146: 8217,
|
|
2356
|
+
147: 8220,
|
|
2357
|
+
148: 8221,
|
|
2358
|
+
149: 8226,
|
|
2359
|
+
150: 8211,
|
|
2360
|
+
151: 8212,
|
|
2361
|
+
152: 732,
|
|
2362
|
+
153: 8482,
|
|
2363
|
+
154: 353,
|
|
2364
|
+
155: 8250,
|
|
2365
|
+
156: 339,
|
|
2366
|
+
158: 382,
|
|
2367
|
+
159: 376
|
|
2385
2368
|
};
|
|
2386
2369
|
|
|
2387
|
-
const isRawTextContainer =
|
|
2370
|
+
const isRawTextContainer = /* @__PURE__ */ shared.makeMap(
|
|
2371
|
+
"style,iframe,script,noscript",
|
|
2372
|
+
true
|
|
2373
|
+
);
|
|
2388
2374
|
const parserOptions = {
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
return 1 /* DOMNamespaces.SVG */;
|
|
2408
|
-
}
|
|
2409
|
-
if (parent.props.some(a => a.type === 6 /* NodeTypes.ATTRIBUTE */ &&
|
|
2410
|
-
a.name === 'encoding' &&
|
|
2411
|
-
a.value != null &&
|
|
2412
|
-
(a.value.content === 'text/html' ||
|
|
2413
|
-
a.value.content === 'application/xhtml+xml'))) {
|
|
2414
|
-
ns = 0 /* DOMNamespaces.HTML */;
|
|
2415
|
-
}
|
|
2416
|
-
}
|
|
2417
|
-
else if (/^m(?:[ions]|text)$/.test(parent.tag) &&
|
|
2418
|
-
tag !== 'mglyph' &&
|
|
2419
|
-
tag !== 'malignmark') {
|
|
2420
|
-
ns = 0 /* DOMNamespaces.HTML */;
|
|
2421
|
-
}
|
|
2422
|
-
}
|
|
2423
|
-
else if (parent && ns === 1 /* DOMNamespaces.SVG */) {
|
|
2424
|
-
if (parent.tag === 'foreignObject' ||
|
|
2425
|
-
parent.tag === 'desc' ||
|
|
2426
|
-
parent.tag === 'title') {
|
|
2427
|
-
ns = 0 /* DOMNamespaces.HTML */;
|
|
2428
|
-
}
|
|
2429
|
-
}
|
|
2430
|
-
if (ns === 0 /* DOMNamespaces.HTML */) {
|
|
2431
|
-
if (tag === 'svg') {
|
|
2432
|
-
return 1 /* DOMNamespaces.SVG */;
|
|
2433
|
-
}
|
|
2434
|
-
if (tag === 'math') {
|
|
2435
|
-
return 2 /* DOMNamespaces.MATH_ML */;
|
|
2436
|
-
}
|
|
2375
|
+
isVoidTag: shared.isVoidTag,
|
|
2376
|
+
isNativeTag: (tag) => shared.isHTMLTag(tag) || shared.isSVGTag(tag),
|
|
2377
|
+
isPreTag: (tag) => tag === "pre",
|
|
2378
|
+
decodeEntities: decodeHtml,
|
|
2379
|
+
isBuiltInComponent: (tag) => {
|
|
2380
|
+
if (compilerCore.isBuiltInType(tag, `Transition`)) {
|
|
2381
|
+
return TRANSITION;
|
|
2382
|
+
} else if (compilerCore.isBuiltInType(tag, `TransitionGroup`)) {
|
|
2383
|
+
return TRANSITION_GROUP;
|
|
2384
|
+
}
|
|
2385
|
+
},
|
|
2386
|
+
// https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher
|
|
2387
|
+
getNamespace(tag, parent) {
|
|
2388
|
+
let ns = parent ? parent.ns : 0;
|
|
2389
|
+
if (parent && ns === 2) {
|
|
2390
|
+
if (parent.tag === "annotation-xml") {
|
|
2391
|
+
if (tag === "svg") {
|
|
2392
|
+
return 1;
|
|
2437
2393
|
}
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
if (ns === 0 /* DOMNamespaces.HTML */) {
|
|
2443
|
-
if (tag === 'textarea' || tag === 'title') {
|
|
2444
|
-
return 1 /* TextModes.RCDATA */;
|
|
2445
|
-
}
|
|
2446
|
-
if (isRawTextContainer(tag)) {
|
|
2447
|
-
return 2 /* TextModes.RAWTEXT */;
|
|
2448
|
-
}
|
|
2394
|
+
if (parent.props.some(
|
|
2395
|
+
(a) => a.type === 6 && a.name === "encoding" && a.value != null && (a.value.content === "text/html" || a.value.content === "application/xhtml+xml")
|
|
2396
|
+
)) {
|
|
2397
|
+
ns = 0;
|
|
2449
2398
|
}
|
|
2450
|
-
|
|
2399
|
+
} else if (/^m(?:[ions]|text)$/.test(parent.tag) && tag !== "mglyph" && tag !== "malignmark") {
|
|
2400
|
+
ns = 0;
|
|
2401
|
+
}
|
|
2402
|
+
} else if (parent && ns === 1) {
|
|
2403
|
+
if (parent.tag === "foreignObject" || parent.tag === "desc" || parent.tag === "title") {
|
|
2404
|
+
ns = 0;
|
|
2405
|
+
}
|
|
2406
|
+
}
|
|
2407
|
+
if (ns === 0) {
|
|
2408
|
+
if (tag === "svg") {
|
|
2409
|
+
return 1;
|
|
2410
|
+
}
|
|
2411
|
+
if (tag === "math") {
|
|
2412
|
+
return 2;
|
|
2413
|
+
}
|
|
2451
2414
|
}
|
|
2415
|
+
return ns;
|
|
2416
|
+
},
|
|
2417
|
+
// https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments
|
|
2418
|
+
getTextMode({ tag, ns }) {
|
|
2419
|
+
if (ns === 0) {
|
|
2420
|
+
if (tag === "textarea" || tag === "title") {
|
|
2421
|
+
return 1;
|
|
2422
|
+
}
|
|
2423
|
+
if (isRawTextContainer(tag)) {
|
|
2424
|
+
return 2;
|
|
2425
|
+
}
|
|
2426
|
+
}
|
|
2427
|
+
return 0;
|
|
2428
|
+
}
|
|
2452
2429
|
};
|
|
2453
2430
|
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
exp: parseInlineCSS(p.value.content, p.loc),
|
|
2470
|
-
modifiers: [],
|
|
2471
|
-
loc: p.loc
|
|
2472
|
-
};
|
|
2473
|
-
}
|
|
2474
|
-
});
|
|
2475
|
-
}
|
|
2431
|
+
const transformStyle = (node) => {
|
|
2432
|
+
if (node.type === "element") {
|
|
2433
|
+
node.props.forEach((p, i) => {
|
|
2434
|
+
if (p.type === 6 && p.name === "style" && p.value) {
|
|
2435
|
+
node.props[i] = {
|
|
2436
|
+
type: 7,
|
|
2437
|
+
name: `bind`,
|
|
2438
|
+
arg: compilerCore.createSimpleExpression(`style`, true, p.loc),
|
|
2439
|
+
exp: parseInlineCSS(p.value.content, p.loc),
|
|
2440
|
+
modifiers: [],
|
|
2441
|
+
loc: p.loc
|
|
2442
|
+
};
|
|
2443
|
+
}
|
|
2444
|
+
});
|
|
2445
|
+
}
|
|
2476
2446
|
};
|
|
2477
2447
|
const parseInlineCSS = (cssText, loc) => {
|
|
2478
|
-
|
|
2479
|
-
|
|
2448
|
+
const normalized = shared.parseStringStyle(cssText);
|
|
2449
|
+
return compilerCore.createSimpleExpression(
|
|
2450
|
+
JSON.stringify(normalized),
|
|
2451
|
+
false,
|
|
2452
|
+
loc,
|
|
2453
|
+
3
|
|
2454
|
+
);
|
|
2480
2455
|
};
|
|
2481
2456
|
|
|
2482
2457
|
function createDOMCompilerError(code, loc) {
|
|
2483
|
-
|
|
2458
|
+
return compilerCore.createCompilerError(
|
|
2459
|
+
code,
|
|
2460
|
+
loc,
|
|
2461
|
+
DOMErrorMessages
|
|
2462
|
+
);
|
|
2484
2463
|
}
|
|
2485
2464
|
const DOMErrorMessages = {
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2465
|
+
[51]: `v-html is missing expression.`,
|
|
2466
|
+
[52]: `v-html will override element children.`,
|
|
2467
|
+
[53]: `v-text is missing expression.`,
|
|
2468
|
+
[54]: `v-text will override element children.`,
|
|
2469
|
+
[55]: `v-model can only be used on <input>, <textarea> and <select> elements.`,
|
|
2470
|
+
[56]: `v-model argument is not supported on plain elements.`,
|
|
2471
|
+
[57]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`,
|
|
2472
|
+
[58]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`,
|
|
2473
|
+
[59]: `v-show is missing expression.`,
|
|
2474
|
+
[60]: `<Transition> expects exactly one child element or component.`,
|
|
2475
|
+
[61]: `Tags with side effect (<script> and <style>) are ignored in client component templates.`
|
|
2497
2476
|
};
|
|
2498
2477
|
|
|
2499
2478
|
const transformVHtml = (dir, node, context) => {
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2479
|
+
const { exp, loc } = dir;
|
|
2480
|
+
if (!exp) {
|
|
2481
|
+
context.onError(
|
|
2482
|
+
createDOMCompilerError(51, loc)
|
|
2483
|
+
);
|
|
2484
|
+
}
|
|
2485
|
+
if (node.children.length) {
|
|
2486
|
+
context.onError(
|
|
2487
|
+
createDOMCompilerError(52, loc)
|
|
2488
|
+
);
|
|
2489
|
+
node.children.length = 0;
|
|
2490
|
+
}
|
|
2491
|
+
return {
|
|
2492
|
+
props: [
|
|
2493
|
+
compilerCore.createObjectProperty(
|
|
2494
|
+
compilerCore.createSimpleExpression(`innerHTML`, true, loc),
|
|
2495
|
+
exp || compilerCore.createSimpleExpression("", true)
|
|
2496
|
+
)
|
|
2497
|
+
]
|
|
2498
|
+
};
|
|
2513
2499
|
};
|
|
2514
2500
|
|
|
2515
2501
|
const transformVText = (dir, node, context) => {
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2502
|
+
const { exp, loc } = dir;
|
|
2503
|
+
if (!exp) {
|
|
2504
|
+
context.onError(
|
|
2505
|
+
createDOMCompilerError(53, loc)
|
|
2506
|
+
);
|
|
2507
|
+
}
|
|
2508
|
+
if (node.children.length) {
|
|
2509
|
+
context.onError(
|
|
2510
|
+
createDOMCompilerError(54, loc)
|
|
2511
|
+
);
|
|
2512
|
+
node.children.length = 0;
|
|
2513
|
+
}
|
|
2514
|
+
return {
|
|
2515
|
+
props: [
|
|
2516
|
+
compilerCore.createObjectProperty(
|
|
2517
|
+
compilerCore.createSimpleExpression(`textContent`, true),
|
|
2518
|
+
exp ? compilerCore.getConstantType(exp, context) > 0 ? exp : compilerCore.createCallExpression(
|
|
2519
|
+
context.helperString(compilerCore.TO_DISPLAY_STRING),
|
|
2520
|
+
[exp],
|
|
2521
|
+
loc
|
|
2522
|
+
) : compilerCore.createSimpleExpression("", true)
|
|
2523
|
+
)
|
|
2524
|
+
]
|
|
2525
|
+
};
|
|
2533
2526
|
};
|
|
2534
2527
|
|
|
2535
2528
|
const transformModel = (dir, node, context) => {
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
// "type".
|
|
2577
|
-
directiveToUse = V_MODEL_DYNAMIC;
|
|
2578
|
-
}
|
|
2579
|
-
else ;
|
|
2580
|
-
}
|
|
2581
|
-
else if (tag === 'select') {
|
|
2582
|
-
directiveToUse = V_MODEL_SELECT;
|
|
2583
|
-
}
|
|
2584
|
-
else ;
|
|
2585
|
-
// inject runtime directive
|
|
2586
|
-
// by returning the helper symbol via needRuntime
|
|
2587
|
-
// the import will replaced a resolveDirective call.
|
|
2588
|
-
if (!isInvalidType) {
|
|
2589
|
-
baseResult.needRuntime = context.helper(directiveToUse);
|
|
2529
|
+
const baseResult = compilerCore.transformModel(dir, node, context);
|
|
2530
|
+
if (!baseResult.props.length || node.tagType === 1) {
|
|
2531
|
+
return baseResult;
|
|
2532
|
+
}
|
|
2533
|
+
if (dir.arg) {
|
|
2534
|
+
context.onError(
|
|
2535
|
+
createDOMCompilerError(
|
|
2536
|
+
56,
|
|
2537
|
+
dir.arg.loc
|
|
2538
|
+
)
|
|
2539
|
+
);
|
|
2540
|
+
}
|
|
2541
|
+
const { tag } = node;
|
|
2542
|
+
const isCustomElement = context.isCustomElement(tag);
|
|
2543
|
+
if (tag === "input" || tag === "textarea" || tag === "select" || isCustomElement) {
|
|
2544
|
+
let directiveToUse = V_MODEL_TEXT;
|
|
2545
|
+
let isInvalidType = false;
|
|
2546
|
+
if (tag === "input" || isCustomElement) {
|
|
2547
|
+
const type = compilerCore.findProp(node, `type`);
|
|
2548
|
+
if (type) {
|
|
2549
|
+
if (type.type === 7) {
|
|
2550
|
+
directiveToUse = V_MODEL_DYNAMIC;
|
|
2551
|
+
} else if (type.value) {
|
|
2552
|
+
switch (type.value.content) {
|
|
2553
|
+
case "radio":
|
|
2554
|
+
directiveToUse = V_MODEL_RADIO;
|
|
2555
|
+
break;
|
|
2556
|
+
case "checkbox":
|
|
2557
|
+
directiveToUse = V_MODEL_CHECKBOX;
|
|
2558
|
+
break;
|
|
2559
|
+
case "file":
|
|
2560
|
+
isInvalidType = true;
|
|
2561
|
+
context.onError(
|
|
2562
|
+
createDOMCompilerError(
|
|
2563
|
+
57,
|
|
2564
|
+
dir.loc
|
|
2565
|
+
)
|
|
2566
|
+
);
|
|
2567
|
+
break;
|
|
2568
|
+
}
|
|
2590
2569
|
}
|
|
2570
|
+
} else if (compilerCore.hasDynamicKeyVBind(node)) {
|
|
2571
|
+
directiveToUse = V_MODEL_DYNAMIC;
|
|
2572
|
+
} else ;
|
|
2573
|
+
} else if (tag === "select") {
|
|
2574
|
+
directiveToUse = V_MODEL_SELECT;
|
|
2575
|
+
} else ;
|
|
2576
|
+
if (!isInvalidType) {
|
|
2577
|
+
baseResult.needRuntime = context.helper(directiveToUse);
|
|
2591
2578
|
}
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2579
|
+
} else {
|
|
2580
|
+
context.onError(
|
|
2581
|
+
createDOMCompilerError(
|
|
2582
|
+
55,
|
|
2583
|
+
dir.loc
|
|
2584
|
+
)
|
|
2585
|
+
);
|
|
2586
|
+
}
|
|
2587
|
+
baseResult.props = baseResult.props.filter(
|
|
2588
|
+
(p) => !(p.key.type === 4 && p.key.content === "modelValue")
|
|
2589
|
+
);
|
|
2590
|
+
return baseResult;
|
|
2600
2591
|
};
|
|
2601
2592
|
|
|
2602
|
-
const isEventOptionModifier =
|
|
2603
|
-
const isNonKeyModifier =
|
|
2604
|
-
// event propagation management
|
|
2605
|
-
`stop,prevent,self
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
const isKeyboardEvent = /*#__PURE__*/ shared.makeMap(`onkeyup,onkeydown,onkeypress`, true);
|
|
2593
|
+
const isEventOptionModifier = /* @__PURE__ */ shared.makeMap(`passive,once,capture`);
|
|
2594
|
+
const isNonKeyModifier = /* @__PURE__ */ shared.makeMap(
|
|
2595
|
+
// event propagation management
|
|
2596
|
+
`stop,prevent,self,ctrl,shift,alt,meta,exact,middle`
|
|
2597
|
+
);
|
|
2598
|
+
const maybeKeyModifier = /* @__PURE__ */ shared.makeMap("left,right");
|
|
2599
|
+
const isKeyboardEvent = /* @__PURE__ */ shared.makeMap(
|
|
2600
|
+
`onkeyup,onkeydown,onkeypress`,
|
|
2601
|
+
true
|
|
2602
|
+
);
|
|
2613
2603
|
const resolveModifiers = (key, modifiers, context, loc) => {
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2604
|
+
const keyModifiers = [];
|
|
2605
|
+
const nonKeyModifiers = [];
|
|
2606
|
+
const eventOptionModifiers = [];
|
|
2607
|
+
for (let i = 0; i < modifiers.length; i++) {
|
|
2608
|
+
const modifier = modifiers[i];
|
|
2609
|
+
if (modifier === "native" && compilerCore.checkCompatEnabled(
|
|
2610
|
+
"COMPILER_V_ON_NATIVE",
|
|
2611
|
+
context,
|
|
2612
|
+
loc
|
|
2613
|
+
)) {
|
|
2614
|
+
eventOptionModifiers.push(modifier);
|
|
2615
|
+
} else if (isEventOptionModifier(modifier)) {
|
|
2616
|
+
eventOptionModifiers.push(modifier);
|
|
2617
|
+
} else {
|
|
2618
|
+
if (maybeKeyModifier(modifier)) {
|
|
2619
|
+
if (compilerCore.isStaticExp(key)) {
|
|
2620
|
+
if (isKeyboardEvent(key.content)) {
|
|
2621
|
+
keyModifiers.push(modifier);
|
|
2622
|
+
} else {
|
|
2623
|
+
nonKeyModifiers.push(modifier);
|
|
2624
|
+
}
|
|
2625
|
+
} else {
|
|
2626
|
+
keyModifiers.push(modifier);
|
|
2627
|
+
nonKeyModifiers.push(modifier);
|
|
2622
2628
|
}
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
else {
|
|
2629
|
-
// runtimeModifiers: modifiers that needs runtime guards
|
|
2630
|
-
if (maybeKeyModifier(modifier)) {
|
|
2631
|
-
if (compilerCore.isStaticExp(key)) {
|
|
2632
|
-
if (isKeyboardEvent(key.content)) {
|
|
2633
|
-
keyModifiers.push(modifier);
|
|
2634
|
-
}
|
|
2635
|
-
else {
|
|
2636
|
-
nonKeyModifiers.push(modifier);
|
|
2637
|
-
}
|
|
2638
|
-
}
|
|
2639
|
-
else {
|
|
2640
|
-
keyModifiers.push(modifier);
|
|
2641
|
-
nonKeyModifiers.push(modifier);
|
|
2642
|
-
}
|
|
2643
|
-
}
|
|
2644
|
-
else {
|
|
2645
|
-
if (isNonKeyModifier(modifier)) {
|
|
2646
|
-
nonKeyModifiers.push(modifier);
|
|
2647
|
-
}
|
|
2648
|
-
else {
|
|
2649
|
-
keyModifiers.push(modifier);
|
|
2650
|
-
}
|
|
2651
|
-
}
|
|
2629
|
+
} else {
|
|
2630
|
+
if (isNonKeyModifier(modifier)) {
|
|
2631
|
+
nonKeyModifiers.push(modifier);
|
|
2632
|
+
} else {
|
|
2633
|
+
keyModifiers.push(modifier);
|
|
2652
2634
|
}
|
|
2635
|
+
}
|
|
2653
2636
|
}
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2637
|
+
}
|
|
2638
|
+
return {
|
|
2639
|
+
keyModifiers,
|
|
2640
|
+
nonKeyModifiers,
|
|
2641
|
+
eventOptionModifiers
|
|
2642
|
+
};
|
|
2659
2643
|
};
|
|
2660
2644
|
const transformClick = (key, event) => {
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
key,
|
|
2670
|
-
`)`
|
|
2671
|
-
])
|
|
2672
|
-
: key;
|
|
2645
|
+
const isStaticClick = compilerCore.isStaticExp(key) && key.content.toLowerCase() === "onclick";
|
|
2646
|
+
return isStaticClick ? compilerCore.createSimpleExpression(event, true) : key.type !== 4 ? compilerCore.createCompoundExpression([
|
|
2647
|
+
`(`,
|
|
2648
|
+
key,
|
|
2649
|
+
`) === "onClick" ? "${event}" : (`,
|
|
2650
|
+
key,
|
|
2651
|
+
`)`
|
|
2652
|
+
]) : key;
|
|
2673
2653
|
};
|
|
2674
2654
|
const transformOn = (dir, node, context) => {
|
|
2675
|
-
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
const modifierPostfix = eventOptionModifiers.map(shared.capitalize).join('');
|
|
2704
|
-
key = compilerCore.isStaticExp(key)
|
|
2705
|
-
? compilerCore.createSimpleExpression(`${key.content}${modifierPostfix}`, true)
|
|
2706
|
-
: compilerCore.createCompoundExpression([`(`, key, `) + "${modifierPostfix}"`]);
|
|
2707
|
-
}
|
|
2708
|
-
return {
|
|
2709
|
-
props: [compilerCore.createObjectProperty(key, handlerExp)]
|
|
2710
|
-
};
|
|
2711
|
-
});
|
|
2712
|
-
};
|
|
2713
|
-
|
|
2714
|
-
const transformShow = (dir, node, context) => {
|
|
2715
|
-
const { exp, loc } = dir;
|
|
2716
|
-
if (!exp) {
|
|
2717
|
-
context.onError(createDOMCompilerError(59 /* DOMErrorCodes.X_V_SHOW_NO_EXPRESSION */, loc));
|
|
2655
|
+
return compilerCore.transformOn(dir, node, context, (baseResult) => {
|
|
2656
|
+
const { modifiers } = dir;
|
|
2657
|
+
if (!modifiers.length)
|
|
2658
|
+
return baseResult;
|
|
2659
|
+
let { key, value: handlerExp } = baseResult.props[0];
|
|
2660
|
+
const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc);
|
|
2661
|
+
if (nonKeyModifiers.includes("right")) {
|
|
2662
|
+
key = transformClick(key, `onContextmenu`);
|
|
2663
|
+
}
|
|
2664
|
+
if (nonKeyModifiers.includes("middle")) {
|
|
2665
|
+
key = transformClick(key, `onMouseup`);
|
|
2666
|
+
}
|
|
2667
|
+
if (nonKeyModifiers.length) {
|
|
2668
|
+
handlerExp = compilerCore.createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [
|
|
2669
|
+
handlerExp,
|
|
2670
|
+
JSON.stringify(nonKeyModifiers)
|
|
2671
|
+
]);
|
|
2672
|
+
}
|
|
2673
|
+
if (keyModifiers.length && // if event name is dynamic, always wrap with keys guard
|
|
2674
|
+
(!compilerCore.isStaticExp(key) || isKeyboardEvent(key.content))) {
|
|
2675
|
+
handlerExp = compilerCore.createCallExpression(context.helper(V_ON_WITH_KEYS), [
|
|
2676
|
+
handlerExp,
|
|
2677
|
+
JSON.stringify(keyModifiers)
|
|
2678
|
+
]);
|
|
2679
|
+
}
|
|
2680
|
+
if (eventOptionModifiers.length) {
|
|
2681
|
+
const modifierPostfix = eventOptionModifiers.map(shared.capitalize).join("");
|
|
2682
|
+
key = compilerCore.isStaticExp(key) ? compilerCore.createSimpleExpression(`${key.content}${modifierPostfix}`, true) : compilerCore.createCompoundExpression([`(`, key, `) + "${modifierPostfix}"`]);
|
|
2718
2683
|
}
|
|
2719
2684
|
return {
|
|
2720
|
-
|
|
2721
|
-
needRuntime: context.helper(V_SHOW)
|
|
2685
|
+
props: [compilerCore.createObjectProperty(key, handlerExp)]
|
|
2722
2686
|
};
|
|
2687
|
+
});
|
|
2688
|
+
};
|
|
2689
|
+
|
|
2690
|
+
const transformShow = (dir, node, context) => {
|
|
2691
|
+
const { exp, loc } = dir;
|
|
2692
|
+
if (!exp) {
|
|
2693
|
+
context.onError(
|
|
2694
|
+
createDOMCompilerError(59, loc)
|
|
2695
|
+
);
|
|
2696
|
+
}
|
|
2697
|
+
return {
|
|
2698
|
+
props: [],
|
|
2699
|
+
needRuntime: context.helper(V_SHOW)
|
|
2700
|
+
};
|
|
2723
2701
|
};
|
|
2724
2702
|
|
|
2725
|
-
/**
|
|
2726
|
-
* This module is Node-only.
|
|
2727
|
-
*/
|
|
2728
|
-
/**
|
|
2729
|
-
* Regex for replacing placeholders for embedded constant variables
|
|
2730
|
-
* (e.g. import URL string constants generated by compiler-sfc)
|
|
2731
|
-
*/
|
|
2732
2703
|
const expReplaceRE = /__VUE_EXP_START__(.*?)__VUE_EXP_END__/g;
|
|
2733
|
-
/**
|
|
2734
|
-
* Turn eligible hoisted static trees into stringified static nodes, e.g.
|
|
2735
|
-
*
|
|
2736
|
-
* ```js
|
|
2737
|
-
* const _hoisted_1 = createStaticVNode(`<div class="foo">bar</div>`)
|
|
2738
|
-
* ```
|
|
2739
|
-
*
|
|
2740
|
-
* A single static vnode can contain stringified content for **multiple**
|
|
2741
|
-
* consecutive nodes (element and plain text), called a "chunk".
|
|
2742
|
-
* `@vue/runtime-dom` will create the content via innerHTML in a hidden
|
|
2743
|
-
* container element and insert all the nodes in place. The call must also
|
|
2744
|
-
* provide the number of nodes contained in the chunk so that during hydration
|
|
2745
|
-
* we can know how many nodes the static vnode should adopt.
|
|
2746
|
-
*
|
|
2747
|
-
* The optimization scans a children list that contains hoisted nodes, and
|
|
2748
|
-
* tries to find the largest chunk of consecutive hoisted nodes before running
|
|
2749
|
-
* into a non-hoisted node or the end of the list. A chunk is then converted
|
|
2750
|
-
* into a single static vnode and replaces the hoisted expression of the first
|
|
2751
|
-
* node in the chunk. Other nodes in the chunk are considered "merged" and
|
|
2752
|
-
* therefore removed from both the hoist list and the children array.
|
|
2753
|
-
*
|
|
2754
|
-
* This optimization is only performed in Node.js.
|
|
2755
|
-
*/
|
|
2756
2704
|
const stringifyStatic = (children, context, parent) => {
|
|
2757
|
-
|
|
2758
|
-
|
|
2759
|
-
|
|
2760
|
-
|
|
2761
|
-
|
|
2762
|
-
|
|
2763
|
-
|
|
2764
|
-
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
for (let i = 1; i < currentChunk.length; i++) {
|
|
2778
|
-
// for the merged nodes, set their hoisted expression to null
|
|
2779
|
-
replaceHoist(currentChunk[i], null, context);
|
|
2780
|
-
}
|
|
2781
|
-
// also remove merged nodes from children
|
|
2782
|
-
const deleteCount = currentChunk.length - 1;
|
|
2783
|
-
children.splice(currentIndex - currentChunk.length + 1, deleteCount);
|
|
2784
|
-
return deleteCount;
|
|
2785
|
-
}
|
|
2786
|
-
}
|
|
2787
|
-
return 0;
|
|
2788
|
-
};
|
|
2789
|
-
let i = 0;
|
|
2790
|
-
for (; i < children.length; i++) {
|
|
2791
|
-
const child = children[i];
|
|
2792
|
-
const hoisted = getHoistedNode(child);
|
|
2793
|
-
if (hoisted) {
|
|
2794
|
-
// presence of hoisted means child must be a stringifiable node
|
|
2795
|
-
const node = child;
|
|
2796
|
-
const result = analyzeNode(node);
|
|
2797
|
-
if (result) {
|
|
2798
|
-
// node is stringifiable, record state
|
|
2799
|
-
nc += result[0];
|
|
2800
|
-
ec += result[1];
|
|
2801
|
-
currentChunk.push(node);
|
|
2802
|
-
continue;
|
|
2803
|
-
}
|
|
2705
|
+
if (context.scopes.vSlot > 0) {
|
|
2706
|
+
return;
|
|
2707
|
+
}
|
|
2708
|
+
let nc = 0;
|
|
2709
|
+
let ec = 0;
|
|
2710
|
+
const currentChunk = [];
|
|
2711
|
+
const stringifyCurrentChunk = (currentIndex) => {
|
|
2712
|
+
if (nc >= 20 || ec >= 5) {
|
|
2713
|
+
const staticCall = compilerCore.createCallExpression(context.helper(compilerCore.CREATE_STATIC), [
|
|
2714
|
+
JSON.stringify(
|
|
2715
|
+
currentChunk.map((node) => stringifyNode(node, context)).join("")
|
|
2716
|
+
).replace(expReplaceRE, `" + $1 + "`),
|
|
2717
|
+
// the 2nd argument indicates the number of DOM nodes this static vnode
|
|
2718
|
+
// will insert / hydrate
|
|
2719
|
+
String(currentChunk.length)
|
|
2720
|
+
]);
|
|
2721
|
+
replaceHoist(currentChunk[0], staticCall, context);
|
|
2722
|
+
if (currentChunk.length > 1) {
|
|
2723
|
+
for (let i2 = 1; i2 < currentChunk.length; i2++) {
|
|
2724
|
+
replaceHoist(currentChunk[i2], null, context);
|
|
2804
2725
|
}
|
|
2805
|
-
|
|
2806
|
-
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
|
|
2812
|
-
|
|
2726
|
+
const deleteCount = currentChunk.length - 1;
|
|
2727
|
+
children.splice(currentIndex - currentChunk.length + 1, deleteCount);
|
|
2728
|
+
return deleteCount;
|
|
2729
|
+
}
|
|
2730
|
+
}
|
|
2731
|
+
return 0;
|
|
2732
|
+
};
|
|
2733
|
+
let i = 0;
|
|
2734
|
+
for (; i < children.length; i++) {
|
|
2735
|
+
const child = children[i];
|
|
2736
|
+
const hoisted = getHoistedNode(child);
|
|
2737
|
+
if (hoisted) {
|
|
2738
|
+
const node = child;
|
|
2739
|
+
const result = analyzeNode(node);
|
|
2740
|
+
if (result) {
|
|
2741
|
+
nc += result[0];
|
|
2742
|
+
ec += result[1];
|
|
2743
|
+
currentChunk.push(node);
|
|
2744
|
+
continue;
|
|
2745
|
+
}
|
|
2813
2746
|
}
|
|
2814
|
-
|
|
2815
|
-
|
|
2747
|
+
i -= stringifyCurrentChunk(i);
|
|
2748
|
+
nc = 0;
|
|
2749
|
+
ec = 0;
|
|
2750
|
+
currentChunk.length = 0;
|
|
2751
|
+
}
|
|
2752
|
+
stringifyCurrentChunk(i);
|
|
2816
2753
|
};
|
|
2817
|
-
const getHoistedNode = (node) => (
|
|
2818
|
-
node.type == 12 /* NodeTypes.TEXT_CALL */) &&
|
|
2819
|
-
node.codegenNode &&
|
|
2820
|
-
node.codegenNode.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&
|
|
2821
|
-
node.codegenNode.hoisted;
|
|
2754
|
+
const getHoistedNode = (node) => (node.type === "element" && node.tagType === 0 || node.type == 12) && node.codegenNode && node.codegenNode.type === 4 && node.codegenNode.hoisted;
|
|
2822
2755
|
const dataAriaRE = /^(data|aria)-/;
|
|
2823
2756
|
const isStringifiableAttr = (name, ns) => {
|
|
2824
|
-
|
|
2825
|
-
? shared.isKnownHtmlAttr(name)
|
|
2826
|
-
: ns === 1 /* DOMNamespaces.SVG */
|
|
2827
|
-
? shared.isKnownSvgAttr(name)
|
|
2828
|
-
: false) || dataAriaRE.test(name));
|
|
2757
|
+
return (ns === 0 ? shared.isKnownHtmlAttr(name) : ns === 1 ? shared.isKnownSvgAttr(name) : false) || dataAriaRE.test(name);
|
|
2829
2758
|
};
|
|
2830
2759
|
const replaceHoist = (node, replacement, context) => {
|
|
2831
|
-
|
|
2832
|
-
|
|
2760
|
+
const hoistToReplace = node.codegenNode.hoisted;
|
|
2761
|
+
context.hoists[context.hoists.indexOf(hoistToReplace)] = replacement;
|
|
2833
2762
|
};
|
|
2834
|
-
const isNonStringifiable =
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
* - false: bailed (contains non-stringifiable props or runtime constant)
|
|
2838
|
-
* - [nc, ec] where
|
|
2839
|
-
* - nc is the number of nodes inside
|
|
2840
|
-
* - ec is the number of element with bindings inside
|
|
2841
|
-
*/
|
|
2763
|
+
const isNonStringifiable = /* @__PURE__ */ shared.makeMap(
|
|
2764
|
+
`caption,thead,tr,th,tbody,td,tfoot,colgroup,col`
|
|
2765
|
+
);
|
|
2842
2766
|
function analyzeNode(node) {
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2767
|
+
if (node.type === "element" && isNonStringifiable(node.tag)) {
|
|
2768
|
+
return false;
|
|
2769
|
+
}
|
|
2770
|
+
if (node.type === 12) {
|
|
2771
|
+
return [1, 0];
|
|
2772
|
+
}
|
|
2773
|
+
let nc = 1;
|
|
2774
|
+
let ec = node.props.length > 0 ? 1 : 0;
|
|
2775
|
+
let bailed = false;
|
|
2776
|
+
const bail = () => {
|
|
2777
|
+
bailed = true;
|
|
2778
|
+
return false;
|
|
2779
|
+
};
|
|
2780
|
+
function walk(node2) {
|
|
2781
|
+
for (let i = 0; i < node2.props.length; i++) {
|
|
2782
|
+
const p = node2.props[i];
|
|
2783
|
+
if (p.type === 6 && !isStringifiableAttr(p.name, node2.ns)) {
|
|
2784
|
+
return bail();
|
|
2785
|
+
}
|
|
2786
|
+
if (p.type === 7 && p.name === "bind") {
|
|
2787
|
+
if (p.arg && (p.arg.type === 8 || p.arg.isStatic && !isStringifiableAttr(p.arg.content, node2.ns))) {
|
|
2788
|
+
return bail();
|
|
2789
|
+
}
|
|
2790
|
+
if (p.exp && (p.exp.type === 8 || p.exp.constType < 3)) {
|
|
2791
|
+
return bail();
|
|
2792
|
+
}
|
|
2793
|
+
}
|
|
2848
2794
|
}
|
|
2849
|
-
let
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
};
|
|
2856
|
-
// TODO: check for cases where using innerHTML will result in different
|
|
2857
|
-
// output compared to imperative node insertions.
|
|
2858
|
-
// probably only need to check for most common case
|
|
2859
|
-
// i.e. non-phrasing-content tags inside `<p>`
|
|
2860
|
-
function walk(node) {
|
|
2861
|
-
for (let i = 0; i < node.props.length; i++) {
|
|
2862
|
-
const p = node.props[i];
|
|
2863
|
-
// bail on non-attr bindings
|
|
2864
|
-
if (p.type === 6 /* NodeTypes.ATTRIBUTE */ &&
|
|
2865
|
-
!isStringifiableAttr(p.name, node.ns)) {
|
|
2866
|
-
return bail();
|
|
2867
|
-
}
|
|
2868
|
-
if (p.type === 7 /* NodeTypes.DIRECTIVE */ && p.name === 'bind') {
|
|
2869
|
-
// bail on non-attr bindings
|
|
2870
|
-
if (p.arg &&
|
|
2871
|
-
(p.arg.type === 8 /* NodeTypes.COMPOUND_EXPRESSION */ ||
|
|
2872
|
-
(p.arg.isStatic && !isStringifiableAttr(p.arg.content, node.ns)))) {
|
|
2873
|
-
return bail();
|
|
2874
|
-
}
|
|
2875
|
-
if (p.exp &&
|
|
2876
|
-
(p.exp.type === 8 /* NodeTypes.COMPOUND_EXPRESSION */ ||
|
|
2877
|
-
p.exp.constType < 3 /* ConstantTypes.CAN_STRINGIFY */)) {
|
|
2878
|
-
return bail();
|
|
2879
|
-
}
|
|
2880
|
-
}
|
|
2795
|
+
for (let i = 0; i < node2.children.length; i++) {
|
|
2796
|
+
nc++;
|
|
2797
|
+
const child = node2.children[i];
|
|
2798
|
+
if (child.type === "element") {
|
|
2799
|
+
if (child.props.length > 0) {
|
|
2800
|
+
ec++;
|
|
2881
2801
|
}
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
if (child.type === 1 /* NodeTypes.ELEMENT */) {
|
|
2886
|
-
if (child.props.length > 0) {
|
|
2887
|
-
ec++;
|
|
2888
|
-
}
|
|
2889
|
-
walk(child);
|
|
2890
|
-
if (bailed) {
|
|
2891
|
-
return false;
|
|
2892
|
-
}
|
|
2893
|
-
}
|
|
2802
|
+
walk(child);
|
|
2803
|
+
if (bailed) {
|
|
2804
|
+
return false;
|
|
2894
2805
|
}
|
|
2895
|
-
|
|
2806
|
+
}
|
|
2896
2807
|
}
|
|
2897
|
-
return
|
|
2808
|
+
return true;
|
|
2809
|
+
}
|
|
2810
|
+
return walk(node) ? [nc, ec] : false;
|
|
2898
2811
|
}
|
|
2899
2812
|
function stringifyNode(node, context) {
|
|
2900
|
-
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
}
|
|
2813
|
+
if (shared.isString(node)) {
|
|
2814
|
+
return node;
|
|
2815
|
+
}
|
|
2816
|
+
if (shared.isSymbol(node)) {
|
|
2817
|
+
return ``;
|
|
2818
|
+
}
|
|
2819
|
+
switch (node.type) {
|
|
2820
|
+
case "element":
|
|
2821
|
+
return stringifyElement(node, context);
|
|
2822
|
+
case "text":
|
|
2823
|
+
return shared.escapeHtml(node.content);
|
|
2824
|
+
case "comment":
|
|
2825
|
+
return `<!--${shared.escapeHtml(node.content)}-->`;
|
|
2826
|
+
case 5:
|
|
2827
|
+
return shared.escapeHtml(shared.toDisplayString(evaluateConstant(node.content)));
|
|
2828
|
+
case 8:
|
|
2829
|
+
return shared.escapeHtml(evaluateConstant(node));
|
|
2830
|
+
case 12:
|
|
2831
|
+
return stringifyNode(node.content, context);
|
|
2832
|
+
default:
|
|
2833
|
+
return "";
|
|
2834
|
+
}
|
|
2923
2835
|
}
|
|
2924
2836
|
function stringifyElement(node, context) {
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2837
|
+
let res = `<${node.tag}`;
|
|
2838
|
+
let innerHTML = "";
|
|
2839
|
+
for (let i = 0; i < node.props.length; i++) {
|
|
2840
|
+
const p = node.props[i];
|
|
2841
|
+
if (p.type === 6) {
|
|
2842
|
+
res += ` ${p.name}`;
|
|
2843
|
+
if (p.value) {
|
|
2844
|
+
res += `="${shared.escapeHtml(p.value.content)}"`;
|
|
2845
|
+
}
|
|
2846
|
+
} else if (p.type === 7) {
|
|
2847
|
+
if (p.name === "bind") {
|
|
2848
|
+
const exp = p.exp;
|
|
2849
|
+
if (exp.content[0] === "_") {
|
|
2850
|
+
res += ` ${p.arg.content}="__VUE_EXP_START__${exp.content}__VUE_EXP_END__"`;
|
|
2851
|
+
continue;
|
|
2934
2852
|
}
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
const exp = p.exp;
|
|
2938
|
-
if (exp.content[0] === '_') {
|
|
2939
|
-
// internally generated string constant references
|
|
2940
|
-
// e.g. imported URL strings via compiler-sfc transformAssetUrl plugin
|
|
2941
|
-
res += ` ${p.arg.content}="__VUE_EXP_START__${exp.content}__VUE_EXP_END__"`;
|
|
2942
|
-
continue;
|
|
2943
|
-
}
|
|
2944
|
-
// #6568
|
|
2945
|
-
if (shared.isBooleanAttr(p.arg.content) &&
|
|
2946
|
-
exp.content === 'false') {
|
|
2947
|
-
continue;
|
|
2948
|
-
}
|
|
2949
|
-
// constant v-bind, e.g. :foo="1"
|
|
2950
|
-
let evaluated = evaluateConstant(exp);
|
|
2951
|
-
if (evaluated != null) {
|
|
2952
|
-
const arg = p.arg && p.arg.content;
|
|
2953
|
-
if (arg === 'class') {
|
|
2954
|
-
evaluated = shared.normalizeClass(evaluated);
|
|
2955
|
-
}
|
|
2956
|
-
else if (arg === 'style') {
|
|
2957
|
-
evaluated = shared.stringifyStyle(shared.normalizeStyle(evaluated));
|
|
2958
|
-
}
|
|
2959
|
-
res += ` ${p.arg.content}="${shared.escapeHtml(evaluated)}"`;
|
|
2960
|
-
}
|
|
2961
|
-
}
|
|
2962
|
-
else if (p.name === 'html') {
|
|
2963
|
-
// #5439 v-html with constant value
|
|
2964
|
-
// not sure why would anyone do this but it can happen
|
|
2965
|
-
innerHTML = evaluateConstant(p.exp);
|
|
2966
|
-
}
|
|
2967
|
-
else if (p.name === 'text') {
|
|
2968
|
-
innerHTML = shared.escapeHtml(shared.toDisplayString(evaluateConstant(p.exp)));
|
|
2969
|
-
}
|
|
2853
|
+
if (shared.isBooleanAttr(p.arg.content) && exp.content === "false") {
|
|
2854
|
+
continue;
|
|
2970
2855
|
}
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
|
|
2977
|
-
|
|
2978
|
-
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
|
|
2856
|
+
let evaluated = evaluateConstant(exp);
|
|
2857
|
+
if (evaluated != null) {
|
|
2858
|
+
const arg = p.arg && p.arg.content;
|
|
2859
|
+
if (arg === "class") {
|
|
2860
|
+
evaluated = shared.normalizeClass(evaluated);
|
|
2861
|
+
} else if (arg === "style") {
|
|
2862
|
+
evaluated = shared.stringifyStyle(shared.normalizeStyle(evaluated));
|
|
2863
|
+
}
|
|
2864
|
+
res += ` ${p.arg.content}="${shared.escapeHtml(
|
|
2865
|
+
evaluated
|
|
2866
|
+
)}"`;
|
|
2982
2867
|
}
|
|
2868
|
+
} else if (p.name === "html") {
|
|
2869
|
+
innerHTML = evaluateConstant(p.exp);
|
|
2870
|
+
} else if (p.name === "text") {
|
|
2871
|
+
innerHTML = shared.escapeHtml(
|
|
2872
|
+
shared.toDisplayString(evaluateConstant(p.exp))
|
|
2873
|
+
);
|
|
2874
|
+
}
|
|
2983
2875
|
}
|
|
2984
|
-
|
|
2985
|
-
|
|
2876
|
+
}
|
|
2877
|
+
if (context.scopeId) {
|
|
2878
|
+
res += ` ${context.scopeId}`;
|
|
2879
|
+
}
|
|
2880
|
+
res += `>`;
|
|
2881
|
+
if (innerHTML) {
|
|
2882
|
+
res += innerHTML;
|
|
2883
|
+
} else {
|
|
2884
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
2885
|
+
res += stringifyNode(node.children[i], context);
|
|
2986
2886
|
}
|
|
2987
|
-
|
|
2887
|
+
}
|
|
2888
|
+
if (!shared.isVoidTag(node.tag)) {
|
|
2889
|
+
res += `</${node.tag}>`;
|
|
2890
|
+
}
|
|
2891
|
+
return res;
|
|
2988
2892
|
}
|
|
2989
|
-
// __UNSAFE__
|
|
2990
|
-
// Reason: eval.
|
|
2991
|
-
// It's technically safe to eval because only constant expressions are possible
|
|
2992
|
-
// here, e.g. `{{ 1 }}` or `{{ 'foo' }}`
|
|
2993
|
-
// in addition, constant exps bail on presence of parens so you can't even
|
|
2994
|
-
// run JSFuck in here. But we mark it unsafe for security review purposes.
|
|
2995
|
-
// (see compiler-core/src/transforms/transformExpression)
|
|
2996
2893
|
function evaluateConstant(exp) {
|
|
2997
|
-
|
|
2998
|
-
|
|
2999
|
-
|
|
3000
|
-
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
|
|
3008
|
-
|
|
3009
|
-
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
|
-
|
|
3014
|
-
|
|
3015
|
-
}
|
|
3016
|
-
});
|
|
3017
|
-
return res;
|
|
3018
|
-
}
|
|
2894
|
+
if (exp.type === 4) {
|
|
2895
|
+
return new Function(`return ${exp.content}`)();
|
|
2896
|
+
} else {
|
|
2897
|
+
let res = ``;
|
|
2898
|
+
exp.children.forEach((c) => {
|
|
2899
|
+
if (shared.isString(c) || shared.isSymbol(c)) {
|
|
2900
|
+
return;
|
|
2901
|
+
}
|
|
2902
|
+
if (c.type === "text") {
|
|
2903
|
+
res += c.content;
|
|
2904
|
+
} else if (c.type === 5) {
|
|
2905
|
+
res += shared.toDisplayString(evaluateConstant(c.content));
|
|
2906
|
+
} else {
|
|
2907
|
+
res += evaluateConstant(c);
|
|
2908
|
+
}
|
|
2909
|
+
});
|
|
2910
|
+
return res;
|
|
2911
|
+
}
|
|
3019
2912
|
}
|
|
3020
2913
|
|
|
3021
2914
|
const ignoreSideEffectTags = (node, context) => {
|
|
3022
|
-
|
|
3023
|
-
|
|
3024
|
-
|
|
3025
|
-
|
|
3026
|
-
|
|
3027
|
-
|
|
2915
|
+
if (node.type === "element" && node.tagType === 0 && (node.tag === "script" || node.tag === "style")) {
|
|
2916
|
+
context.onError(
|
|
2917
|
+
createDOMCompilerError(61, node.loc)
|
|
2918
|
+
);
|
|
2919
|
+
context.removeNode();
|
|
2920
|
+
}
|
|
3028
2921
|
};
|
|
3029
2922
|
|
|
3030
2923
|
const DOMNodeTransforms = [
|
|
3031
|
-
|
|
3032
|
-
|
|
2924
|
+
transformStyle,
|
|
2925
|
+
...[]
|
|
3033
2926
|
];
|
|
3034
2927
|
const DOMDirectiveTransforms = {
|
|
3035
|
-
|
|
3036
|
-
|
|
3037
|
-
|
|
3038
|
-
|
|
3039
|
-
|
|
3040
|
-
|
|
2928
|
+
cloak: compilerCore.noopDirectiveTransform,
|
|
2929
|
+
html: transformVHtml,
|
|
2930
|
+
text: transformVText,
|
|
2931
|
+
model: transformModel,
|
|
2932
|
+
// override compiler-core
|
|
2933
|
+
on: transformOn,
|
|
2934
|
+
// override compiler-core
|
|
2935
|
+
show: transformShow
|
|
3041
2936
|
};
|
|
3042
2937
|
function compile(template, options = {}) {
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3047
|
-
|
|
3048
|
-
|
|
3049
|
-
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
2938
|
+
return compilerCore.baseCompile(
|
|
2939
|
+
template,
|
|
2940
|
+
shared.extend({}, parserOptions, options, {
|
|
2941
|
+
nodeTransforms: [
|
|
2942
|
+
// ignore <script> and <tag>
|
|
2943
|
+
// this is not put inside DOMNodeTransforms because that list is used
|
|
2944
|
+
// by compiler-ssr to generate vnode fallback branches
|
|
2945
|
+
ignoreSideEffectTags,
|
|
2946
|
+
...DOMNodeTransforms,
|
|
2947
|
+
...options.nodeTransforms || []
|
|
2948
|
+
],
|
|
2949
|
+
directiveTransforms: shared.extend(
|
|
2950
|
+
{},
|
|
2951
|
+
DOMDirectiveTransforms,
|
|
2952
|
+
options.directiveTransforms || {}
|
|
2953
|
+
),
|
|
2954
|
+
transformHoist: stringifyStatic
|
|
2955
|
+
})
|
|
2956
|
+
);
|
|
3055
2957
|
}
|
|
3056
2958
|
function parse(template, options = {}) {
|
|
3057
|
-
|
|
2959
|
+
return compilerCore.baseParse(template, shared.extend({}, parserOptions, options));
|
|
3058
2960
|
}
|
|
3059
2961
|
|
|
3060
2962
|
exports.DOMDirectiveTransforms = DOMDirectiveTransforms;
|