parseDirectives.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. "use strict";
  2. var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
  3. if (k2 === undefined) k2 = k;
  4. Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
  5. }) : (function(o, m, k, k2) {
  6. if (k2 === undefined) k2 = k;
  7. o[k2] = m[k];
  8. }));
  9. var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
  10. Object.defineProperty(o, "default", { enumerable: true, value: v });
  11. }) : function(o, v) {
  12. o["default"] = v;
  13. });
  14. var __importStar = (this && this.__importStar) || function (mod) {
  15. if (mod && mod.__esModule) return mod;
  16. var result = {};
  17. if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
  18. __setModuleDefault(result, mod);
  19. return result;
  20. };
  21. Object.defineProperty(exports, "__esModule", { value: true });
  22. const t = __importStar(require("@babel/types"));
  23. const utils_1 = require("./utils");
  24. /**
  25. * Get JSX element type
  26. *
  27. * @param path Path<JSXOpeningElement>
  28. */
  29. const getType = (path) => {
  30. const typePath = path
  31. .get('attributes')
  32. .find((attribute) => {
  33. if (!t.isJSXAttribute(attribute)) {
  34. return false;
  35. }
  36. return t.isJSXIdentifier(attribute.get('name'))
  37. && attribute.get('name').node.name === 'type';
  38. });
  39. return typePath ? typePath.get('value').node : null;
  40. };
  41. const parseModifiers = (value) => {
  42. let modifiers = [];
  43. if (t.isArrayExpression(value)) {
  44. modifiers = value.elements
  45. .map((el) => (t.isStringLiteral(el) ? el.value : '')).filter(Boolean);
  46. }
  47. return modifiers;
  48. };
  49. const parseDirectives = (args) => {
  50. var _a;
  51. const { name, path, value, state, tag, isComponent, } = args;
  52. let modifiers = name.split('_');
  53. let arg;
  54. let val;
  55. const directiveName = ((_a = modifiers.shift()) === null || _a === void 0 ? void 0 : _a.replace(/^v/, '').replace(/^-/, '').replace(/^\S/, (s) => s.toLowerCase())) || '';
  56. if (directiveName === 'model' && !t.isJSXExpressionContainer(path.get('value'))) {
  57. throw new Error('You have to use JSX Expression inside your v-model');
  58. }
  59. const shouldResolve = !['html', 'text', 'model'].includes(directiveName)
  60. || (directiveName === 'model' && !isComponent);
  61. if (t.isArrayExpression(value)) {
  62. const { elements } = value;
  63. const [first, second, third] = elements;
  64. if (t.isStringLiteral(second)) {
  65. arg = second;
  66. modifiers = parseModifiers(third);
  67. }
  68. else if (second) {
  69. modifiers = parseModifiers(second);
  70. }
  71. val = first;
  72. }
  73. const modifiersSet = new Set(modifiers);
  74. return {
  75. directiveName,
  76. modifiers: modifiersSet,
  77. value: val || value,
  78. arg,
  79. directive: shouldResolve ? [
  80. resolveDirective(path, state, tag, directiveName),
  81. val || value,
  82. !!modifiersSet.size && t.unaryExpression('void', t.numericLiteral(0), true),
  83. !!modifiersSet.size && t.objectExpression([...modifiersSet].map((modifier) => t.objectProperty(t.identifier(modifier), t.booleanLiteral(true)))),
  84. ].filter(Boolean) : undefined,
  85. };
  86. };
  87. const resolveDirective = (path, state, tag, directiveName) => {
  88. var _a;
  89. if (directiveName === 'show') {
  90. return utils_1.createIdentifier(state, 'vShow');
  91. }
  92. if (directiveName === 'model') {
  93. let modelToUse;
  94. const type = getType(path.parentPath);
  95. switch (tag.value) {
  96. case 'select':
  97. modelToUse = utils_1.createIdentifier(state, 'vModelSelect');
  98. break;
  99. case 'textarea':
  100. modelToUse = utils_1.createIdentifier(state, 'vModelText');
  101. break;
  102. default:
  103. if (t.isStringLiteral(type) || !type) {
  104. switch ((_a = type) === null || _a === void 0 ? void 0 : _a.value) {
  105. case 'checkbox':
  106. modelToUse = utils_1.createIdentifier(state, 'vModelCheckbox');
  107. break;
  108. case 'radio':
  109. modelToUse = utils_1.createIdentifier(state, 'vModelRadio');
  110. break;
  111. default:
  112. modelToUse = utils_1.createIdentifier(state, 'vModelText');
  113. }
  114. }
  115. else {
  116. modelToUse = utils_1.createIdentifier(state, 'vModelDynamic');
  117. }
  118. }
  119. return modelToUse;
  120. }
  121. return t.callExpression(utils_1.createIdentifier(state, 'resolveDirective'), [
  122. t.stringLiteral(directiveName),
  123. ]);
  124. };
  125. exports.default = parseDirectives;