utils.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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.VIRTUAL_HOST_CLASS = exports.VIRTUAL_HOST_STYLE = 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. exports.VIRTUAL_HOST_STYLE = 'virtualHostStyle';
  20. exports.VIRTUAL_HOST_CLASS = 'virtualHostClass';
  21. function rewriteSpreadElement(name, expr, loc, context) {
  22. return rewirteWithHelper(name, expr.argument, loc, context);
  23. }
  24. exports.rewriteSpreadElement = rewriteSpreadElement;
  25. function rewirteWithHelper(name, expr, loc, context) {
  26. return parseExprWithRewrite(context.helperString(name) + '(' + (0, codegen_1.genBabelExpr)(expr) + ')', loc, context);
  27. }
  28. exports.rewirteWithHelper = rewirteWithHelper;
  29. function parseExprWithRewrite(code, loc, context, node) {
  30. return (0, ast_1.parseExpr)(rewriteExpression((0, compiler_core_1.createSimpleExpression)(code, false, loc), context, node), context);
  31. }
  32. exports.parseExprWithRewrite = parseExprWithRewrite;
  33. function parseExprWithRewriteClass(code, loc, context, node) {
  34. // a?1:0
  35. return (0, ast_1.parseExpr)(rewriteExpression((0, compiler_core_1.createSimpleExpression)(code, false, loc), context, !(0, ast_1.isUndefined)(node)
  36. ? (0, types_1.conditionalExpression)(node, (0, types_1.numericLiteral)(1), (0, types_1.stringLiteral)(''))
  37. : node), context);
  38. }
  39. exports.parseExprWithRewriteClass = parseExprWithRewriteClass;
  40. function rewriteExpressionWithoutProperty(node, context, babelNode, scope = context.currentScope) {
  41. return rewriteExpression(node, context, babelNode, scope, {
  42. property: false,
  43. ignoreLiteral: false,
  44. });
  45. }
  46. exports.rewriteExpressionWithoutProperty = rewriteExpressionWithoutProperty;
  47. function rewriteExpression(node, context, babelNode, scope = context.currentScope, { property, ignoreLiteral, referencedScope, } = {
  48. property: true,
  49. ignoreLiteral: false,
  50. }) {
  51. if (node.type === 4 /* NodeTypes.SIMPLE_EXPRESSION */ && node.isStatic) {
  52. return node;
  53. }
  54. if (!babelNode) {
  55. const code = (0, codegen_1.genExpr)(node);
  56. babelNode = (0, ast_1.parseExpr)(code, context, node);
  57. if (!babelNode) {
  58. return (0, compiler_core_1.createSimpleExpression)(code);
  59. }
  60. }
  61. if (!ignoreLiteral && isStaticLiteral(babelNode)) {
  62. return node;
  63. }
  64. if ((0, ast_1.isUndefined)(babelNode)) {
  65. return (0, compiler_core_1.createSimpleExpression)('undefined', false, node.loc);
  66. }
  67. // wxs 等表达式
  68. if (context.filters?.length) {
  69. if (isReferencedByIds(babelNode, context.filters)) {
  70. return (0, compiler_core_1.createSimpleExpression)((0, codegen_1.genExpr)(node), false, node.loc);
  71. }
  72. }
  73. referencedScope = referencedScope || findReferencedScope(babelNode, scope);
  74. const id = referencedScope.id.next();
  75. if (property) {
  76. referencedScope.properties.push((0, types_1.objectProperty)((0, types_1.identifier)(id), babelNode));
  77. }
  78. // 在 v-for 中包含的 v-if 块,所有变量需要补充当前 v-for value 前缀
  79. if ((0, transform_1.isVIfScope)(referencedScope)) {
  80. if ((0, transform_1.isVForScope)(referencedScope.parentScope)) {
  81. return (0, compiler_core_1.createSimpleExpression)(referencedScope.parentScope.valueAlias + '.' + id);
  82. }
  83. return (0, compiler_core_1.createSimpleExpression)(id);
  84. }
  85. else if ((0, transform_1.isVForScope)(referencedScope)) {
  86. return (0, compiler_core_1.createSimpleExpression)(referencedScope.valueAlias + '.' + id);
  87. }
  88. return (0, compiler_core_1.createSimpleExpression)(id);
  89. }
  90. exports.rewriteExpression = rewriteExpression;
  91. function findReferencedScope(node, scope, findReferenced = true) {
  92. if ((0, transform_1.isVIfScope)(scope)) {
  93. return scope;
  94. }
  95. else if ((0, transform_1.isVForScope)(scope)) {
  96. if (!findReferenced) {
  97. return scope;
  98. }
  99. if (isReferencedByIds(node, scope.locals)) {
  100. return scope;
  101. }
  102. return findReferencedScope(node, scope.parent, findReferenced);
  103. }
  104. return scope;
  105. }
  106. exports.findReferencedScope = findReferencedScope;
  107. function isReferencedByIds(node, knownIds) {
  108. let referenced = false;
  109. (0, estree_walker_1.walk)(node, {
  110. enter(node, parent) {
  111. if (referenced) {
  112. return this.skip();
  113. }
  114. if (!(0, types_1.isIdentifier)(node)) {
  115. return;
  116. }
  117. if (knownIds.includes(node.name) &&
  118. (!parent || (0, types_1.isReferenced)(node, parent))) {
  119. referenced = true;
  120. return this.skip();
  121. }
  122. },
  123. });
  124. return referenced;
  125. }
  126. exports.isReferencedByIds = isReferencedByIds;
  127. function isStaticLiteral(value) {
  128. return (0, types_1.isLiteral)(value) && !(0, types_1.isTemplateLiteral)(value);
  129. }
  130. exports.isStaticLiteral = isStaticLiteral;
  131. function removeAttribute(node, name) {
  132. const index = node.props.findIndex((prop) => prop.name === name);
  133. if (index > -1) {
  134. node.props.splice(index, 1);
  135. }
  136. }
  137. exports.removeAttribute = removeAttribute;