@dcloudio/uni-mp-compiler 0.0.1-nvue3.3030820220125001
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/LICENSE +202 -0
- package/dist/ast.d.ts +16 -0
- package/dist/ast.js +91 -0
- package/dist/codegen.d.ts +14 -0
- package/dist/codegen.js +322 -0
- package/dist/compile.d.ts +13 -0
- package/dist/compile.js +108 -0
- package/dist/decodeHtml.d.ts +2 -0
- package/dist/decodeHtml.js +131 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +19 -0
- package/dist/identifier.d.ts +7 -0
- package/dist/identifier.js +35 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +40 -0
- package/dist/namedChars.json +2233 -0
- package/dist/options.d.ts +88 -0
- package/dist/options.js +2 -0
- package/dist/parserOptions.d.ts +7 -0
- package/dist/parserOptions.js +63 -0
- package/dist/runtimeHelpers.d.ts +13 -0
- package/dist/runtimeHelpers.js +32 -0
- package/dist/template/codegen.d.ts +19 -0
- package/dist/template/codegen.js +381 -0
- package/dist/transform.d.ts +73 -0
- package/dist/transform.js +518 -0
- package/dist/transforms/transformClass.d.ts +5 -0
- package/dist/transforms/transformClass.js +162 -0
- package/dist/transforms/transformComponent.d.ts +11 -0
- package/dist/transforms/transformComponent.js +179 -0
- package/dist/transforms/transformElement.d.ts +9 -0
- package/dist/transforms/transformElement.js +191 -0
- package/dist/transforms/transformExpression.d.ts +5 -0
- package/dist/transforms/transformExpression.js +283 -0
- package/dist/transforms/transformIdentifier.d.ts +2 -0
- package/dist/transforms/transformIdentifier.js +95 -0
- package/dist/transforms/transformKey.d.ts +4 -0
- package/dist/transforms/transformKey.js +18 -0
- package/dist/transforms/transformRef.d.ts +3 -0
- package/dist/transforms/transformRef.js +126 -0
- package/dist/transforms/transformRoot.d.ts +2 -0
- package/dist/transforms/transformRoot.js +42 -0
- package/dist/transforms/transformSlot.d.ts +3 -0
- package/dist/transforms/transformSlot.js +144 -0
- package/dist/transforms/transformStyle.d.ts +5 -0
- package/dist/transforms/transformStyle.js +156 -0
- package/dist/transforms/transformTag.d.ts +2 -0
- package/dist/transforms/transformTag.js +15 -0
- package/dist/transforms/utils.d.ts +25 -0
- package/dist/transforms/utils.js +133 -0
- package/dist/transforms/vBind.d.ts +2 -0
- package/dist/transforms/vBind.js +49 -0
- package/dist/transforms/vFor.d.ts +35 -0
- package/dist/transforms/vFor.js +299 -0
- package/dist/transforms/vHtml.d.ts +2 -0
- package/dist/transforms/vHtml.js +35 -0
- package/dist/transforms/vIf.d.ts +13 -0
- package/dist/transforms/vIf.js +139 -0
- package/dist/transforms/vModel.d.ts +2 -0
- package/dist/transforms/vModel.js +178 -0
- package/dist/transforms/vOn.d.ts +8 -0
- package/dist/transforms/vOn.js +166 -0
- package/dist/transforms/vSlot.d.ts +16 -0
- package/dist/transforms/vSlot.js +274 -0
- package/package.json +36 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeAttribute = exports.isStaticLiteral = exports.isReferencedByIds = exports.findReferencedScope = exports.rewriteExpression = exports.rewriteExpressionWithoutProperty = exports.parseExprWithRewriteClass = exports.parseExprWithRewrite = exports.rewirteWithHelper = exports.rewriteSpreadElement = exports.SCOPED_SLOT_IDENTIFIER = exports.ATTR_COM_TYPE = exports.ATTR_VUE_REF_IN_FOR = exports.ATTR_VUE_REF = exports.ATTR_VUE_PROPS = exports.ATTR_VUE_SLOTS = exports.ATTR_VUE_ID = void 0;
|
|
4
|
+
const types_1 = require("@babel/types");
|
|
5
|
+
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
|
|
6
|
+
const compiler_core_1 = require("@vue/compiler-core");
|
|
7
|
+
const estree_walker_1 = require("estree-walker");
|
|
8
|
+
const ast_1 = require("../ast");
|
|
9
|
+
const codegen_1 = require("../codegen");
|
|
10
|
+
const transform_1 = require("../transform");
|
|
11
|
+
// v-i,v-s 不能在 quickapp-webview 中使用,估计是内部处理成了指令之类的
|
|
12
|
+
exports.ATTR_VUE_ID = 'u-i';
|
|
13
|
+
exports.ATTR_VUE_SLOTS = 'u-s';
|
|
14
|
+
exports.ATTR_VUE_PROPS = 'u-p';
|
|
15
|
+
exports.ATTR_VUE_REF = 'u-' + uni_cli_shared_1.VUE_REF;
|
|
16
|
+
exports.ATTR_VUE_REF_IN_FOR = 'u-' + uni_cli_shared_1.VUE_REF_IN_FOR;
|
|
17
|
+
exports.ATTR_COM_TYPE = 'u-t';
|
|
18
|
+
exports.SCOPED_SLOT_IDENTIFIER = '__SCOPED_SLOT__';
|
|
19
|
+
function rewriteSpreadElement(name, expr, loc, context) {
|
|
20
|
+
return rewirteWithHelper(name, expr.argument, loc, context);
|
|
21
|
+
}
|
|
22
|
+
exports.rewriteSpreadElement = rewriteSpreadElement;
|
|
23
|
+
function rewirteWithHelper(name, expr, loc, context) {
|
|
24
|
+
return parseExprWithRewrite(context.helperString(name) + '(' + (0, codegen_1.genBabelExpr)(expr) + ')', loc, context);
|
|
25
|
+
}
|
|
26
|
+
exports.rewirteWithHelper = rewirteWithHelper;
|
|
27
|
+
function parseExprWithRewrite(code, loc, context, node) {
|
|
28
|
+
return (0, ast_1.parseExpr)(rewriteExpression((0, compiler_core_1.createSimpleExpression)(code, false, loc), context, node), context);
|
|
29
|
+
}
|
|
30
|
+
exports.parseExprWithRewrite = parseExprWithRewrite;
|
|
31
|
+
function parseExprWithRewriteClass(code, loc, context, node) {
|
|
32
|
+
// a?1:0
|
|
33
|
+
return (0, ast_1.parseExpr)(rewriteExpression((0, compiler_core_1.createSimpleExpression)(code, false, loc), context, !(0, ast_1.isUndefined)(node)
|
|
34
|
+
? (0, types_1.conditionalExpression)(node, (0, types_1.numericLiteral)(1), (0, types_1.stringLiteral)(''))
|
|
35
|
+
: node), context);
|
|
36
|
+
}
|
|
37
|
+
exports.parseExprWithRewriteClass = parseExprWithRewriteClass;
|
|
38
|
+
function rewriteExpressionWithoutProperty(node, context, babelNode, scope = context.currentScope) {
|
|
39
|
+
return rewriteExpression(node, context, babelNode, scope, {
|
|
40
|
+
property: false,
|
|
41
|
+
ignoreLiteral: false,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
exports.rewriteExpressionWithoutProperty = rewriteExpressionWithoutProperty;
|
|
45
|
+
function rewriteExpression(node, context, babelNode, scope = context.currentScope, { property, ignoreLiteral, referencedScope, } = {
|
|
46
|
+
property: true,
|
|
47
|
+
ignoreLiteral: false,
|
|
48
|
+
}) {
|
|
49
|
+
var _a;
|
|
50
|
+
if (node.type === 4 /* SIMPLE_EXPRESSION */ && node.isStatic) {
|
|
51
|
+
return node;
|
|
52
|
+
}
|
|
53
|
+
if (!babelNode) {
|
|
54
|
+
const code = (0, codegen_1.genExpr)(node);
|
|
55
|
+
babelNode = (0, ast_1.parseExpr)(code, context, node);
|
|
56
|
+
if (!babelNode) {
|
|
57
|
+
return (0, compiler_core_1.createSimpleExpression)(code);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!ignoreLiteral && isStaticLiteral(babelNode)) {
|
|
61
|
+
return node;
|
|
62
|
+
}
|
|
63
|
+
if ((0, ast_1.isUndefined)(babelNode)) {
|
|
64
|
+
return (0, compiler_core_1.createSimpleExpression)('undefined', false, node.loc);
|
|
65
|
+
}
|
|
66
|
+
// wxs 等表达式
|
|
67
|
+
if ((_a = context.filters) === null || _a === void 0 ? void 0 : _a.length) {
|
|
68
|
+
if (isReferencedByIds(babelNode, context.filters)) {
|
|
69
|
+
return (0, compiler_core_1.createSimpleExpression)((0, codegen_1.genExpr)(node), false, node.loc);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
referencedScope = referencedScope || findReferencedScope(babelNode, scope);
|
|
73
|
+
const id = referencedScope.id.next();
|
|
74
|
+
if (property) {
|
|
75
|
+
referencedScope.properties.push((0, types_1.objectProperty)((0, types_1.identifier)(id), babelNode));
|
|
76
|
+
}
|
|
77
|
+
// 在 v-for 中包含的 v-if 块,所有变量需要补充当前 v-for value 前缀
|
|
78
|
+
if ((0, transform_1.isVIfScope)(referencedScope)) {
|
|
79
|
+
if ((0, transform_1.isVForScope)(referencedScope.parentScope)) {
|
|
80
|
+
return (0, compiler_core_1.createSimpleExpression)(referencedScope.parentScope.valueAlias + '.' + id);
|
|
81
|
+
}
|
|
82
|
+
return (0, compiler_core_1.createSimpleExpression)(id);
|
|
83
|
+
}
|
|
84
|
+
else if ((0, transform_1.isVForScope)(referencedScope)) {
|
|
85
|
+
return (0, compiler_core_1.createSimpleExpression)(referencedScope.valueAlias + '.' + id);
|
|
86
|
+
}
|
|
87
|
+
return (0, compiler_core_1.createSimpleExpression)(id);
|
|
88
|
+
}
|
|
89
|
+
exports.rewriteExpression = rewriteExpression;
|
|
90
|
+
function findReferencedScope(node, scope) {
|
|
91
|
+
if ((0, transform_1.isVIfScope)(scope)) {
|
|
92
|
+
return scope;
|
|
93
|
+
}
|
|
94
|
+
else if ((0, transform_1.isVForScope)(scope)) {
|
|
95
|
+
if (isReferencedByIds(node, scope.locals)) {
|
|
96
|
+
return scope;
|
|
97
|
+
}
|
|
98
|
+
return findReferencedScope(node, scope.parent);
|
|
99
|
+
}
|
|
100
|
+
return scope;
|
|
101
|
+
}
|
|
102
|
+
exports.findReferencedScope = findReferencedScope;
|
|
103
|
+
function isReferencedByIds(node, knownIds) {
|
|
104
|
+
let referenced = false;
|
|
105
|
+
(0, estree_walker_1.walk)(node, {
|
|
106
|
+
enter(node, parent) {
|
|
107
|
+
if (referenced) {
|
|
108
|
+
return this.skip();
|
|
109
|
+
}
|
|
110
|
+
if (!(0, types_1.isIdentifier)(node)) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (knownIds.includes(node.name) &&
|
|
114
|
+
(!parent || (0, types_1.isReferenced)(node, parent))) {
|
|
115
|
+
referenced = true;
|
|
116
|
+
return this.skip();
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
return referenced;
|
|
121
|
+
}
|
|
122
|
+
exports.isReferencedByIds = isReferencedByIds;
|
|
123
|
+
function isStaticLiteral(value) {
|
|
124
|
+
return (0, types_1.isLiteral)(value) && !(0, types_1.isTemplateLiteral)(value);
|
|
125
|
+
}
|
|
126
|
+
exports.isStaticLiteral = isStaticLiteral;
|
|
127
|
+
function removeAttribute(node, name) {
|
|
128
|
+
const index = node.props.findIndex((prop) => prop.name === name);
|
|
129
|
+
if (index > -1) {
|
|
130
|
+
node.props.splice(index, 1);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.removeAttribute = removeAttribute;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transformBind = void 0;
|
|
4
|
+
const shared_1 = require("@vue/shared");
|
|
5
|
+
const compiler_core_1 = require("@vue/compiler-core");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
const transformBind = (dir, _node, context) => {
|
|
8
|
+
const { exp, modifiers, loc } = dir;
|
|
9
|
+
const arg = dir.arg;
|
|
10
|
+
if (arg.type !== 4 /* SIMPLE_EXPRESSION */) {
|
|
11
|
+
arg.children.unshift(`(`);
|
|
12
|
+
arg.children.push(`) || ""`);
|
|
13
|
+
}
|
|
14
|
+
else if (!arg.isStatic) {
|
|
15
|
+
arg.content = `${arg.content} || ""`;
|
|
16
|
+
}
|
|
17
|
+
// .sync is replaced by v-model:arg
|
|
18
|
+
if (modifiers.includes('camel')) {
|
|
19
|
+
if (arg.type === 4 /* SIMPLE_EXPRESSION */) {
|
|
20
|
+
if (arg.isStatic) {
|
|
21
|
+
arg.content = (0, shared_1.camelize)(arg.content);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// arg.children.unshift(`${context.helperString(CAMELIZE)}(`)
|
|
29
|
+
// arg.children.push(`)`)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (modifiers.includes('prop')) {
|
|
33
|
+
context.onWarn((0, errors_1.createMPCompilerError)(4 /* X_V_BIND_MODIFIER_PROP */, loc));
|
|
34
|
+
}
|
|
35
|
+
if (modifiers.includes('attr')) {
|
|
36
|
+
context.onWarn((0, errors_1.createMPCompilerError)(5 /* X_V_BIND_MODIFIER_ATTR */, loc));
|
|
37
|
+
}
|
|
38
|
+
if (!exp ||
|
|
39
|
+
(exp.type === 4 /* SIMPLE_EXPRESSION */ && !exp.content.trim())) {
|
|
40
|
+
context.onError((0, compiler_core_1.createCompilerError)(34 /* X_V_BIND_NO_EXPRESSION */, loc));
|
|
41
|
+
return {
|
|
42
|
+
props: [(0, compiler_core_1.createObjectProperty)(arg, (0, compiler_core_1.createSimpleExpression)('', true, loc))],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
props: [(0, compiler_core_1.createObjectProperty)(arg, exp)],
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
exports.transformBind = transformBind;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ExpressionNode, SimpleExpressionNode, ElementTypes, ElementNode } from '@vue/compiler-core';
|
|
2
|
+
import { NodeTransform, TransformContext } from '../transform';
|
|
3
|
+
import { Expression, Identifier, Pattern, RestElement } from '@babel/types';
|
|
4
|
+
import { CodegenVForScope } from '../options';
|
|
5
|
+
export declare type VForOptions = Omit<ForParseResult, 'tagType'> & {
|
|
6
|
+
sourceExpr?: Expression;
|
|
7
|
+
sourceAlias: string;
|
|
8
|
+
sourceCode: string;
|
|
9
|
+
valueCode: string;
|
|
10
|
+
valueExpr: Identifier | Pattern | RestElement;
|
|
11
|
+
valueAlias: string;
|
|
12
|
+
keyCode: string;
|
|
13
|
+
keyExpr: Identifier | Pattern | RestElement;
|
|
14
|
+
keyAlias: string;
|
|
15
|
+
indexCode: string;
|
|
16
|
+
indexExpr: Identifier | Pattern | RestElement;
|
|
17
|
+
indexAlias: string;
|
|
18
|
+
};
|
|
19
|
+
export declare type ForElementNode = ElementNode & {
|
|
20
|
+
vFor: VForOptions & {
|
|
21
|
+
source: ExpressionNode;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export declare function isForElementNode(node: unknown): node is ForElementNode;
|
|
25
|
+
export declare const transformFor: NodeTransform;
|
|
26
|
+
export interface ForParseResult {
|
|
27
|
+
source: ExpressionNode;
|
|
28
|
+
value: ExpressionNode;
|
|
29
|
+
key: ExpressionNode;
|
|
30
|
+
index: ExpressionNode;
|
|
31
|
+
tagType: ElementTypes;
|
|
32
|
+
}
|
|
33
|
+
export declare function parseForExpression(input: SimpleExpressionNode, context: TransformContext): ForParseResult | undefined;
|
|
34
|
+
export declare function createForLoopParams({ value, key, index }: ForParseResult, memoArgs?: ExpressionNode[]): ExpressionNode[];
|
|
35
|
+
export declare function createVForArrowFunctionExpression({ valueExpr, keyExpr, indexExpr, properties, }: CodegenVForScope): import("@babel/types").ArrowFunctionExpression;
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createVForArrowFunctionExpression = exports.createForLoopParams = exports.parseForExpression = exports.transformFor = exports.isForElementNode = void 0;
|
|
4
|
+
const shared_1 = require("@vue/shared");
|
|
5
|
+
const compiler_core_1 = require("@vue/compiler-core");
|
|
6
|
+
const ast_1 = require("../ast");
|
|
7
|
+
const transform_1 = require("../transform");
|
|
8
|
+
const transformExpression_1 = require("./transformExpression");
|
|
9
|
+
const codegen_1 = require("../codegen");
|
|
10
|
+
const types_1 = require("@babel/types");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
const runtimeHelpers_1 = require("../runtimeHelpers");
|
|
13
|
+
const vSlot_1 = require("./vSlot");
|
|
14
|
+
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
|
|
15
|
+
function isForElementNode(node) {
|
|
16
|
+
return !!node.vFor;
|
|
17
|
+
}
|
|
18
|
+
exports.isForElementNode = isForElementNode;
|
|
19
|
+
exports.transformFor = (0, transform_1.createStructuralDirectiveTransform)('for', (node, dir, context) => {
|
|
20
|
+
if (!dir.exp) {
|
|
21
|
+
context.onError((0, compiler_core_1.createCompilerError)(31 /* X_V_FOR_NO_EXPRESSION */, dir.loc));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const parseResult = parseForExpression(dir.exp, context);
|
|
25
|
+
if (!parseResult) {
|
|
26
|
+
context.onError((0, compiler_core_1.createCompilerError)(32 /* X_V_FOR_MALFORMED_EXPRESSION */, dir.loc));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
parseResult.tagType = node.tagType;
|
|
30
|
+
const { addIdentifiers, removeIdentifiers } = context;
|
|
31
|
+
const { source, value, key, index } = parseResult;
|
|
32
|
+
if (context.prefixIdentifiers) {
|
|
33
|
+
addIdentifiers(value);
|
|
34
|
+
addIdentifiers(key);
|
|
35
|
+
addIdentifiers(index);
|
|
36
|
+
}
|
|
37
|
+
const { currentScope: parentScope, scopes, popScope } = context;
|
|
38
|
+
const sourceExpr = (0, ast_1.parseExpr)(source, context);
|
|
39
|
+
const valueCode = (0, codegen_1.genExpr)(value);
|
|
40
|
+
const valueExpr = (0, ast_1.parseParam)(valueCode, context, value);
|
|
41
|
+
const valueAlias = parseAlias(valueExpr, valueCode, 'v' + scopes.vFor);
|
|
42
|
+
const keyCode = (0, codegen_1.genExpr)(key);
|
|
43
|
+
const keyExpr = (0, ast_1.parseParam)(keyCode, context, key);
|
|
44
|
+
const keyAlias = parseAlias(keyExpr, keyCode, 'k' + scopes.vFor);
|
|
45
|
+
const indexCode = (0, codegen_1.genExpr)(index);
|
|
46
|
+
const indexExpr = (0, ast_1.parseParam)(indexCode, context, index);
|
|
47
|
+
const indexAlias = parseAlias(indexExpr, indexCode, 'i' + scopes.vFor);
|
|
48
|
+
// 先占位 vFor,后续更新 cloneSourceExpr 为 CallExpression
|
|
49
|
+
const cloneSourceExpr = (0, types_1.cloneNode)(sourceExpr, false);
|
|
50
|
+
const sourceAliasReferencedScope = (0, utils_1.findReferencedScope)(cloneSourceExpr, context.currentScope);
|
|
51
|
+
// 寻找子节点中 if 指令作用域
|
|
52
|
+
const vIfReferencedScope = findVIfReferencedScope(node, context.currentScope, context);
|
|
53
|
+
// 取最近的作用域
|
|
54
|
+
const referencedScope = vIfReferencedScope &&
|
|
55
|
+
context.getScopeIndex(vIfReferencedScope) >
|
|
56
|
+
context.getScopeIndex(sourceAliasReferencedScope)
|
|
57
|
+
? vIfReferencedScope
|
|
58
|
+
: sourceAliasReferencedScope;
|
|
59
|
+
const sourceAlias = (0, utils_1.rewriteExpression)(source, context, cloneSourceExpr, parentScope,
|
|
60
|
+
// 强制 rewrite,因为即使是字符串,数字,也要走 vFor 函数
|
|
61
|
+
{
|
|
62
|
+
property: true,
|
|
63
|
+
ignoreLiteral: true,
|
|
64
|
+
referencedScope,
|
|
65
|
+
}).content;
|
|
66
|
+
const sourceCode = `{{${sourceAlias}}}`;
|
|
67
|
+
const vForData = {
|
|
68
|
+
source,
|
|
69
|
+
sourceExpr,
|
|
70
|
+
sourceAlias,
|
|
71
|
+
sourceCode,
|
|
72
|
+
value,
|
|
73
|
+
valueCode,
|
|
74
|
+
valueExpr,
|
|
75
|
+
valueAlias,
|
|
76
|
+
key,
|
|
77
|
+
keyCode,
|
|
78
|
+
keyExpr,
|
|
79
|
+
keyAlias,
|
|
80
|
+
index,
|
|
81
|
+
indexCode,
|
|
82
|
+
indexExpr,
|
|
83
|
+
indexAlias,
|
|
84
|
+
};
|
|
85
|
+
const vForScope = context.addVForScope({
|
|
86
|
+
...vForData,
|
|
87
|
+
locals: findVForLocals(parseResult),
|
|
88
|
+
});
|
|
89
|
+
const vFor = {
|
|
90
|
+
...vForData,
|
|
91
|
+
};
|
|
92
|
+
const isScopedSlot = (0, transform_1.isScopedSlotVFor)(vForScope);
|
|
93
|
+
node.vFor = vFor;
|
|
94
|
+
scopes.vFor++;
|
|
95
|
+
return () => {
|
|
96
|
+
scopes.vFor--;
|
|
97
|
+
if ((0, compiler_core_1.isTemplateNode)(node)) {
|
|
98
|
+
node.children.some((c) => {
|
|
99
|
+
if (c.type === 1 /* ELEMENT */ && !isForElementNode(c)) {
|
|
100
|
+
const key = (0, compiler_core_1.findProp)(c, 'key');
|
|
101
|
+
if (key) {
|
|
102
|
+
context.onError((0, compiler_core_1.createCompilerError)(33 /* X_V_FOR_TEMPLATE_KEY_PLACEMENT */, key.loc));
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (context.prefixIdentifiers) {
|
|
109
|
+
value && removeIdentifiers(value);
|
|
110
|
+
key && removeIdentifiers(key);
|
|
111
|
+
index && removeIdentifiers(index);
|
|
112
|
+
}
|
|
113
|
+
(0, shared_1.extend)(clearExpr(cloneSourceExpr), isScopedSlot
|
|
114
|
+
? (0, vSlot_1.createVSlotCallExpression)(node
|
|
115
|
+
.slotComponent, vForScope, context)
|
|
116
|
+
: createVForCallExpression(vForScope, context));
|
|
117
|
+
popScope();
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
function clearExpr(expr) {
|
|
121
|
+
Object.keys(expr).forEach((key) => {
|
|
122
|
+
delete expr[key];
|
|
123
|
+
});
|
|
124
|
+
return expr;
|
|
125
|
+
}
|
|
126
|
+
function parseAlias(babelExpr, exprCode, fallback) {
|
|
127
|
+
if ((0, types_1.isIdentifier)(babelExpr)) {
|
|
128
|
+
return exprCode;
|
|
129
|
+
}
|
|
130
|
+
return fallback;
|
|
131
|
+
}
|
|
132
|
+
function parseVForScope(currentScope) {
|
|
133
|
+
while (currentScope) {
|
|
134
|
+
if ((0, transform_1.isVForScope)(currentScope) && !(0, transform_1.isScopedSlotVFor)(currentScope)) {
|
|
135
|
+
return currentScope;
|
|
136
|
+
}
|
|
137
|
+
currentScope = currentScope.parent;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function findVIfReferencedScope(node, currentScope, context) {
|
|
141
|
+
if (!currentScope) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const vForScope = parseVForScope(currentScope);
|
|
145
|
+
if (!vForScope) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (!node.children.find((item) => checkVIfReferenced(item, vForScope, context))) {
|
|
149
|
+
return findVIfReferencedScope(node, currentScope.parent, context);
|
|
150
|
+
}
|
|
151
|
+
return vForScope;
|
|
152
|
+
}
|
|
153
|
+
function checkVIfReferenced(node, vForScope, context) {
|
|
154
|
+
if (!(0, uni_cli_shared_1.isElementNode)(node)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
// 嵌套 for 不查找
|
|
158
|
+
if ((0, compiler_core_1.findDir)(node, 'for')) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
const ifDir = (0, compiler_core_1.findDir)(node, 'if');
|
|
162
|
+
if (ifDir) {
|
|
163
|
+
return checkDirReferenced(ifDir.exp, vForScope, context);
|
|
164
|
+
}
|
|
165
|
+
const elseIfDir = (0, compiler_core_1.findDir)(node, 'else-if');
|
|
166
|
+
if (elseIfDir) {
|
|
167
|
+
return checkDirReferenced(elseIfDir.exp, vForScope, context);
|
|
168
|
+
}
|
|
169
|
+
return !!node.children.find((item) => checkVIfReferenced(item, vForScope, context));
|
|
170
|
+
}
|
|
171
|
+
function checkDirReferenced(node, vForScope, context) {
|
|
172
|
+
if (node) {
|
|
173
|
+
const babelNode = (0, ast_1.parseExpr)(node, context);
|
|
174
|
+
if (babelNode && (0, utils_1.isReferencedByIds)(babelNode, vForScope.locals)) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
function findVForLocals({ value, key, index }) {
|
|
181
|
+
const ids = [];
|
|
182
|
+
if (value) {
|
|
183
|
+
findIds(value, ids);
|
|
184
|
+
}
|
|
185
|
+
if (key) {
|
|
186
|
+
findIds(key, ids);
|
|
187
|
+
}
|
|
188
|
+
if (index) {
|
|
189
|
+
findIds(index, ids);
|
|
190
|
+
}
|
|
191
|
+
return ids;
|
|
192
|
+
}
|
|
193
|
+
function findIds(exp, ids) {
|
|
194
|
+
if ((0, shared_1.isString)(exp)) {
|
|
195
|
+
ids.push(exp);
|
|
196
|
+
}
|
|
197
|
+
else if (exp.identifiers) {
|
|
198
|
+
exp.identifiers.forEach((id) => ids.push(id));
|
|
199
|
+
}
|
|
200
|
+
else if (exp.type === 4 /* SIMPLE_EXPRESSION */) {
|
|
201
|
+
ids.push(exp.content);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
|
|
205
|
+
const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
|
|
206
|
+
const stripParensRE = /^\(|\)$/g;
|
|
207
|
+
function parseForExpression(input, context) {
|
|
208
|
+
const loc = input.loc;
|
|
209
|
+
const exp = input.content;
|
|
210
|
+
const inMatch = exp.match(forAliasRE);
|
|
211
|
+
if (!inMatch)
|
|
212
|
+
return;
|
|
213
|
+
const [, LHS, RHS] = inMatch;
|
|
214
|
+
const result = {
|
|
215
|
+
source: createAliasExpression(loc, RHS.trim(), exp.indexOf(RHS, LHS.length)),
|
|
216
|
+
value: (0, compiler_core_1.createSimpleExpression)('v' + context.scopes.vFor),
|
|
217
|
+
key: (0, compiler_core_1.createSimpleExpression)('k' + context.scopes.vFor),
|
|
218
|
+
index: (0, compiler_core_1.createSimpleExpression)('i' + context.scopes.vFor),
|
|
219
|
+
tagType: 0 /* ELEMENT */,
|
|
220
|
+
};
|
|
221
|
+
if (context.prefixIdentifiers) {
|
|
222
|
+
result.source = (0, transformExpression_1.processExpression)(result.source, context);
|
|
223
|
+
}
|
|
224
|
+
let valueContent = LHS.trim().replace(stripParensRE, '').trim();
|
|
225
|
+
const trimmedOffset = LHS.indexOf(valueContent);
|
|
226
|
+
const iteratorMatch = valueContent.match(forIteratorRE);
|
|
227
|
+
if (iteratorMatch) {
|
|
228
|
+
valueContent = valueContent.replace(forIteratorRE, '').trim();
|
|
229
|
+
const keyContent = iteratorMatch[1].trim();
|
|
230
|
+
let keyOffset;
|
|
231
|
+
if (keyContent) {
|
|
232
|
+
keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length);
|
|
233
|
+
result.key = createAliasExpression(loc, keyContent, keyOffset);
|
|
234
|
+
if (context.prefixIdentifiers) {
|
|
235
|
+
result.key = (0, transformExpression_1.processExpression)(result.key, context, true);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (iteratorMatch[2]) {
|
|
239
|
+
const indexContent = iteratorMatch[2].trim();
|
|
240
|
+
if (indexContent) {
|
|
241
|
+
result.index = createAliasExpression(loc, indexContent, exp.indexOf(indexContent, result.key
|
|
242
|
+
? keyOffset + keyContent.length
|
|
243
|
+
: trimmedOffset + valueContent.length));
|
|
244
|
+
if (context.prefixIdentifiers) {
|
|
245
|
+
result.index = (0, transformExpression_1.processExpression)(result.index, context, true);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (valueContent) {
|
|
251
|
+
result.value = createAliasExpression(loc, valueContent, trimmedOffset);
|
|
252
|
+
if (context.prefixIdentifiers) {
|
|
253
|
+
result.value = (0, transformExpression_1.processExpression)(result.value, context, true);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return result;
|
|
257
|
+
}
|
|
258
|
+
exports.parseForExpression = parseForExpression;
|
|
259
|
+
function createAliasExpression(range, content, offset) {
|
|
260
|
+
return (0, compiler_core_1.createSimpleExpression)(content, false, (0, compiler_core_1.getInnerRange)(range, offset, content.length));
|
|
261
|
+
}
|
|
262
|
+
function createForLoopParams({ value, key, index }, memoArgs = []) {
|
|
263
|
+
return createParamsList([value, key, index, ...memoArgs]);
|
|
264
|
+
}
|
|
265
|
+
exports.createForLoopParams = createForLoopParams;
|
|
266
|
+
function createParamsList(args) {
|
|
267
|
+
let i = args.length;
|
|
268
|
+
while (i--) {
|
|
269
|
+
if (args[i])
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
return args
|
|
273
|
+
.slice(0, i + 1)
|
|
274
|
+
.map((arg, i) => arg || (0, compiler_core_1.createSimpleExpression)(`_`.repeat(i + 1), false));
|
|
275
|
+
}
|
|
276
|
+
function createVForCallExpression(vForScope, context) {
|
|
277
|
+
// let sourceExpr: Expression = vForScope.sourceExpr!
|
|
278
|
+
// if (isNumericLiteral(sourceExpr)) {
|
|
279
|
+
// sourceExpr = numericLiteralToArrayExpr((sourceExpr as NumericLiteral).value)
|
|
280
|
+
// }
|
|
281
|
+
return (0, types_1.callExpression)((0, types_1.identifier)(context.helperString(runtimeHelpers_1.V_FOR)), [
|
|
282
|
+
vForScope.sourceExpr,
|
|
283
|
+
createVForArrowFunctionExpression(vForScope),
|
|
284
|
+
]);
|
|
285
|
+
}
|
|
286
|
+
function createVForArrowFunctionExpression({ valueExpr, keyExpr, indexExpr, properties, }) {
|
|
287
|
+
const params = [];
|
|
288
|
+
if (valueExpr) {
|
|
289
|
+
params.push(valueExpr);
|
|
290
|
+
}
|
|
291
|
+
if (keyExpr) {
|
|
292
|
+
params.push(keyExpr);
|
|
293
|
+
}
|
|
294
|
+
if (indexExpr) {
|
|
295
|
+
params.push(indexExpr);
|
|
296
|
+
}
|
|
297
|
+
return (0, types_1.arrowFunctionExpression)(params, (0, types_1.blockStatement)([(0, types_1.returnStatement)((0, types_1.objectExpression)(properties))]));
|
|
298
|
+
}
|
|
299
|
+
exports.createVForArrowFunctionExpression = createVForArrowFunctionExpression;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transformHtml = void 0;
|
|
4
|
+
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
|
|
5
|
+
const compiler_core_1 = require("@vue/compiler-core");
|
|
6
|
+
const transformHtml = (node, _) => {
|
|
7
|
+
if (!(0, uni_cli_shared_1.isElementNode)(node)) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const dir = (0, compiler_core_1.findDir)(node, 'html');
|
|
11
|
+
if (!dir) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// remove v-html
|
|
15
|
+
node.props.splice(node.props.indexOf(dir), 1);
|
|
16
|
+
if (node.tagType !== 0 /* ELEMENT */) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
node.isSelfClosing = false;
|
|
20
|
+
node.children = [createRichText(node, dir)];
|
|
21
|
+
};
|
|
22
|
+
exports.transformHtml = transformHtml;
|
|
23
|
+
function createRichText(node, dir) {
|
|
24
|
+
return {
|
|
25
|
+
tag: 'rich-text',
|
|
26
|
+
type: 1 /* ELEMENT */,
|
|
27
|
+
tagType: 0 /* ELEMENT */,
|
|
28
|
+
props: [(0, uni_cli_shared_1.createBindDirectiveNode)('nodes', dir.exp || '')],
|
|
29
|
+
isSelfClosing: true,
|
|
30
|
+
children: [],
|
|
31
|
+
codegenNode: undefined,
|
|
32
|
+
ns: node.ns,
|
|
33
|
+
loc: node.loc,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DirectiveNode, ElementNode, IfNode } from '@vue/compiler-core';
|
|
2
|
+
import { NodeTransform, TransformContext } from '../transform';
|
|
3
|
+
interface IfOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
condition?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare type IfElementNode = ElementNode & {
|
|
8
|
+
vIf: IfOptions;
|
|
9
|
+
};
|
|
10
|
+
export declare function isIfElementNode(node: unknown): node is IfElementNode;
|
|
11
|
+
export declare const transformIf: NodeTransform;
|
|
12
|
+
export declare function processIf(node: ElementNode, dir: DirectiveNode, context: TransformContext, processCodegen?: (node: IfNode, branch: IfElementNode, isRoot: boolean) => (() => void) | undefined): (() => void) | undefined;
|
|
13
|
+
export {};
|