123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- "use strict";
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
- }) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
- }));
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
- }) : function(o, v) {
- o["default"] = v;
- });
- var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- const t = __importStar(require("@babel/types"));
- const utils_1 = require("./utils");
- /**
- * Get JSX element type
- *
- * @param path Path<JSXOpeningElement>
- */
- const getType = (path) => {
- const typePath = path
- .get('attributes')
- .find((attribute) => {
- if (!t.isJSXAttribute(attribute)) {
- return false;
- }
- return t.isJSXIdentifier(attribute.get('name'))
- && attribute.get('name').node.name === 'type';
- });
- return typePath ? typePath.get('value').node : null;
- };
- const parseModifiers = (value) => (t.isArrayExpression(value)
- ? value.elements
- .map((el) => (t.isStringLiteral(el) ? el.value : ''))
- .filter(Boolean)
- : []);
- const parseDirectives = (params) => {
- var _a, _b;
- const { path, value, state, tag, isComponent, } = params;
- const args = [];
- const vals = [];
- const modifiersSet = [];
- let directiveName;
- let directiveArgument;
- let directiveModifiers;
- if ('namespace' in path.node.name) {
- [directiveName, directiveArgument] = params.name.split(':');
- directiveName = path.node.name.namespace.name;
- directiveArgument = path.node.name.name.name;
- directiveModifiers = directiveArgument.split('_').slice(1);
- }
- else {
- const underscoreModifiers = params.name.split('_');
- directiveName = underscoreModifiers.shift() || '';
- directiveModifiers = underscoreModifiers;
- }
- directiveName = directiveName
- .replace(/^v/, '')
- .replace(/^-/, '')
- .replace(/^\S/, (s) => s.toLowerCase());
- if (directiveArgument) {
- args.push(t.stringLiteral(directiveArgument));
- }
- const isVModels = directiveName === 'models';
- const isVModel = directiveName === 'model';
- if (isVModel && !t.isJSXExpressionContainer(path.get('value'))) {
- throw new Error('You have to use JSX Expression inside your v-model');
- }
- if (isVModels && !isComponent) {
- throw new Error('v-models can only use in custom components');
- }
- const shouldResolve = !['html', 'text', 'model', 'models'].includes(directiveName)
- || (isVModel && !isComponent);
- let modifiers = directiveModifiers;
- if (t.isArrayExpression(value)) {
- const elementsList = isVModels ? value.elements : [value];
- elementsList.forEach((element) => {
- if (isVModels && !t.isArrayExpression(element)) {
- throw new Error('You should pass a Two-dimensional Arrays to v-models');
- }
- const { elements } = element;
- const [first, second, third] = elements;
- if (second && !t.isArrayExpression(second) && !t.isSpreadElement(second)) {
- args.push(second);
- modifiers = parseModifiers(third);
- }
- else if (t.isArrayExpression(second)) {
- if (!shouldResolve) {
- args.push(t.nullLiteral());
- }
- modifiers = parseModifiers(second);
- }
- else if (!shouldResolve) {
- // work as v-model={[value]} or v-models={[[value]]}
- args.push(t.nullLiteral());
- }
- modifiersSet.push(new Set(modifiers));
- vals.push(first);
- });
- }
- else if (isVModel && !shouldResolve) {
- // work as v-model={value}
- args.push(t.nullLiteral());
- modifiersSet.push(new Set(directiveModifiers));
- }
- else {
- modifiersSet.push(new Set(directiveModifiers));
- }
- return {
- directiveName,
- modifiers: modifiersSet,
- values: vals.length ? vals : [value],
- args,
- directive: shouldResolve ? [
- resolveDirective(path, state, tag, directiveName),
- vals[0] || value,
- ((_a = modifiersSet[0]) === null || _a === void 0 ? void 0 : _a.size)
- ? args[0] || t.unaryExpression('void', t.numericLiteral(0), true)
- : args[0],
- !!((_b = modifiersSet[0]) === null || _b === void 0 ? void 0 : _b.size) && t.objectExpression([...modifiersSet[0]].map((modifier) => t.objectProperty(t.identifier(modifier), t.booleanLiteral(true)))),
- ].filter(Boolean) : undefined,
- };
- };
- const resolveDirective = (path, state, tag, directiveName) => {
- var _a;
- if (directiveName === 'show') {
- return (0, utils_1.createIdentifier)(state, 'vShow');
- }
- if (directiveName === 'model') {
- let modelToUse;
- const type = getType(path.parentPath);
- switch (tag.value) {
- case 'select':
- modelToUse = (0, utils_1.createIdentifier)(state, 'vModelSelect');
- break;
- case 'textarea':
- modelToUse = (0, utils_1.createIdentifier)(state, 'vModelText');
- break;
- default:
- if (t.isStringLiteral(type) || !type) {
- switch ((_a = type) === null || _a === void 0 ? void 0 : _a.value) {
- case 'checkbox':
- modelToUse = (0, utils_1.createIdentifier)(state, 'vModelCheckbox');
- break;
- case 'radio':
- modelToUse = (0, utils_1.createIdentifier)(state, 'vModelRadio');
- break;
- default:
- modelToUse = (0, utils_1.createIdentifier)(state, 'vModelText');
- }
- }
- else {
- modelToUse = (0, utils_1.createIdentifier)(state, 'vModelDynamic');
- }
- }
- return modelToUse;
- }
- return t.callExpression((0, utils_1.createIdentifier)(state, 'resolveDirective'), [
- t.stringLiteral(directiveName),
- ]);
- };
- exports.default = parseDirectives;
- //# sourceMappingURL=parseDirectives.js.map
|