vite-plugin-vue-css-module
Version:
css-module syntactic sugar for vue3
1 lines • 43.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/utils/parseVue.ts","../src/utils/tool.ts","../src/utils/parseHtml.ts","../src/utils/parsePug.ts"],"sourcesContent":["import type { Plugin } from 'vite'\nimport type { PluginOptions } from './utils/types'\nimport { MagicString, type SFCTemplateBlock } from 'vue/compiler-sfc'\nimport { parseVue } from './utils/parseVue'\nimport { parseHtml } from './utils/parseHtml'\nimport { parsePug } from './utils/parsePug'\n\nexport default function vueCssModule(userOptions: Partial<PluginOptions> = {}): Plugin {\n const options = {\n attrName: 'cls', // 默认属性名\n pugClassLiterals: false,\n ...userOptions\n }\n\n const cache = new Map<\n string,\n {\n code: string\n template: SFCTemplateBlock | null\n cssModule?: string | boolean\n mustTransform?: boolean\n }\n >()\n\n async function transformTemplate({\n code,\n template,\n cssModule\n }: {\n code: string\n template: SFCTemplateBlock\n cssModule: string | true\n }) {\n const cssModuleName = cssModule === true ? '$style' : cssModule\n const s = new MagicString(code)\n\n if (template.lang === 'pug') {\n const result = await parsePug(template.content, options, cssModuleName)\n s.update(template.loc.start.offset, template.loc.end.offset, result)\n return s\n } else if (template.ast?.children.length) {\n parseHtml(template.ast.children, s, options.attrName, cssModuleName)\n return s\n }\n }\n\n return {\n name: 'vite-plugin-vue-css-module',\n enforce: 'pre',\n async transform(code: string, id: string) {\n const [file, queryString] = id.split('?')\n if (file.endsWith('.vue')) {\n const params = new URLSearchParams(queryString)\n const type = params.get('type')\n if (id === file) {\n // Full SFC transform\n const cached = cache.get(file)\n const { template, cssModule } = cached?.code === code ? cached : parseVue(code)\n cache.set(file, { code, template, cssModule })\n if (template && cssModule) {\n const s = await transformTemplate({ code, template, cssModule })\n if (s) {\n return { code: s.toString(), map: s.generateMap() }\n }\n }\n } else if (type === 'template') {\n // Template transform (for HMR)\n const cached = cache.get(file)\n if (cached?.mustTransform) {\n cached.mustTransform = false\n const { code, template, cssModule } = cached\n if (template && cssModule) {\n const s0 = await transformTemplate({ code, template, cssModule })\n if (s0) {\n const s = s0.snip(template.loc.start.offset, template.loc.end.offset)\n return { code: s.toString(), map: s.generateMap() }\n }\n }\n }\n }\n }\n },\n async handleHotUpdate({ file, read }) {\n if (file.endsWith('.vue')) {\n const cached = cache.get(file)\n if (cached) {\n const code = await read()\n const { template, cssModule } = parseVue(code)\n if (template) {\n const mustTransform = !(\n cached.template &&\n cached.template.content === template.content &&\n cached.template.lang === template.lang &&\n cached.cssModule === cssModule\n )\n cache.set(file, { code, template, cssModule, mustTransform })\n }\n }\n }\n }\n }\n}\n","import { parse } from 'vue/compiler-sfc'\n\n/**\n * 获取.vue文件中的 cssModule的值 和 template的AST\n * @param code vue文件\n * @returns Object\n */\nexport function parseVue(code: string) {\n const descriptor = parse(code).descriptor\n // 获取 <style module> 或 <style module=\"blog\">的值\n const cssModule = descriptor.styles.find((style) => style.module !== undefined)?.module\n return {\n cssModule,\n template: descriptor.template\n }\n}\n","// 引号类型\ntype Quote = \"'\" | '\"'\n\n/**\n * 判断是否是 对象表达式 字符串\n * @param code String\n * @returns Boolean\n */\nexport function isObjectExp(code: string) {\n return code.startsWith('{') && code.endsWith('}')\n}\n\n/**\n * 判断是否是 数组表达式 字符串\n * @param code String\n * @returns Boolean\n */\nexport function isArrayExp(code: string) {\n return code.startsWith('[') && code.endsWith(']')\n}\n\n/**\n * 获取 对象/数组表达式字符串 中间的内容\n * @param code String -- { a: 1, } [ 'a', true && 'b', 1 < 2 ? 'c' : 'd']\n * @returns String -- a: 1\n */\nexport function getObjectOrArrayExpressionContent(code: string) {\n let str = trimString(code.substring(1, code.length - 1))\n return str.endsWith(',') ? str.substring(0, str.length - 1) : str\n}\n\n/**\n * 去除字符串前后空格\n * @param code String\n * @returns String\n */\nexport function trimString(code: string) {\n return code.trim()\n}\n\n/**\n *\n * @param code String a b c d--e\n * @returns ['a', 'b', 'c', 'd--e']\n */\nexport function transformString2Array(code: string) {\n return code.split(' ').filter((str) => str)\n}\n\n/**\n * 将 字符串 转为 对象中的key:value 字符串。eg: type && $style[`red`] -> [type && $style[`red`]]:type && $style[`red`]\n * @param code String\n * @param quote Quote 字符串中的分号\n * @returns String\n */\nexport function transformString2ObjectString(code: string, quote: Quote): string {\n if (!code) return ''\n // fix: 修复字符串中非分割意义的,也被切割的问题\n return splitStr2Arr(code, quote)\n .map((val) => {\n const _val = trimString(val)\n if (isObjectExp(_val)) {\n return _val.substring(1, _val.length - 1)\n }\n // 如果是数组,要递归\n else if (isArrayExp(_val)) {\n return transformString2ObjectString(_val.substring(1, _val.length - 1), quote)\n } else {\n return `[${_val}]:${_val}`\n }\n })\n .join(',')\n}\n\n/**\n * 将 表达式中的 类名 转换为 [cssModuleName][`类名`],如:$style[`类名`]\n * @param code String\n * @param cssModuleName 模块名\n * @param quote 引号类型\n * @param keepReturnType 返回值是否保留原类型,true: {***} => {***}, false: {***} => ***\n * @returns String\n */\nexport function transformExp(\n code: string,\n cssModuleName: string,\n quote: Quote,\n keepReturnType: Boolean = false\n): string {\n // :[attrName]=\"{}\" :[attrName]='{}'\n if (isObjectExp(code)) {\n return transformObject(code, cssModuleName, quote, keepReturnType)\n }\n // :[attrName]=\"[]\" :[attrName]='[]'\n else if (isArrayExp(code)) {\n return transformArray(code, cssModuleName, quote, keepReturnType)\n }\n // :[attrName]=\"type\" :[attrName]='type === \"add\" && \"red\"' :[attrName]=\"type === 'add' ? 'red' : 'green'\"\n else {\n return transformString(code, cssModuleName)\n }\n}\n\n/**\n * 将字符串根据英文逗号, 切割成数组。其中 {}, [] 是一个整体\n * eg: 'red', ['green', { red: type === ' red{, '}, {type}], {}\n * =>\n * [\n * 'red',\n * ['green', { red: type === ' red{, '}, {type}],\n * {}\n * ]\n *\n * red: type === ' red{, ', type\n * =>\n * [\n * red: type === ' red{, ',\n * type\n * ]\n * @param code 字符串\n * @param quote 字符串内用到的引号\n * @returns 切割后的数组\n */\nfunction splitStr2Arr(code: string, quote: Quote) {\n // 切割后的数组\n const result = []\n // 缓存的字符\n let buffer = ''\n // 栈,存放 [ { '\n let stack: string[] = []\n\n for (let i = 0; i < code.length; i++) {\n const char = code[i]\n if (char === '{' || char === '[') {\n // 如果stack的顶部是引号, 则不用进栈,理解为普通字符。否则进栈\n if (stack.length > 0 && stack[stack.length - 1] === quote) {\n buffer += char\n } else {\n stack.push(char)\n buffer += char\n }\n } else if (char === '}') {\n // 如果stack的顶部是{, 则{出栈\n if (stack.length > 0 && stack[stack.length - 1] === '{') {\n stack.pop()\n buffer += char\n } else {\n buffer += char\n }\n } else if (char === ']') {\n // 如果stack的顶部是[, 则[出栈\n if (stack.length > 0 && stack[stack.length - 1] === '[') {\n stack.pop()\n buffer += char\n } else {\n buffer += char\n }\n } else if (char === quote) {\n // 如果stack的顶部是引号,则引号出栈。否则引号要入栈,用于后续判断{[}]是 普通字符 还是 对象、数组的起止符号\n if (stack.length > 0 && stack[stack.length - 1] === quote) {\n stack.pop()\n buffer += char\n } else {\n stack.push(quote)\n buffer += char\n }\n } else if (char === ',') {\n // 碰到逗号,当栈为空了,则将缓存字符作为数组的一项,如果栈不是空的,那逗号就只是一个普通字符\n if (stack.length === 0) {\n result.push(trimString(buffer))\n buffer = ''\n } else {\n buffer += char\n }\n } else {\n buffer += char\n }\n }\n\n if (trimString(buffer) !== '') {\n result.push(trimString(buffer))\n }\n\n return result\n}\n\n/**\n * 将 {} 中的类名换为 $style[`类名`]\n * @param code String\n * @param cssModuleName 模块名\n * @param quote 引号类型\n * @param keepReturnType 返回值是否保留原类型,true: {***} => {***}, false: {***} => ***\n * @returns 转换后去除{}的字符串\n */\nfunction transformObject(\n code: string,\n cssModuleName: string,\n quote: Quote,\n keepReturnType: Boolean\n): string {\n const content = getObjectOrArrayExpressionContent(code)\n if (!content) return ''\n const contentArr = splitStr2Arr(content, quote)\n const result = contentArr\n .map((item) => {\n // 没有冒号时,即 { selected } 这种情况,则直接取 selected\n let key: string = item,\n value: string = item\n // fix: type: type === 'a:b' 这里取第一个冒号进行切割\n let firstColonIndex = item.indexOf(':')\n if (firstColonIndex !== -1) {\n key = item.slice(0, firstColonIndex)\n value = item.slice(firstColonIndex + 1)\n }\n let _key = trimString(key)\n // { [type]: true } => [$style[type]]: true;\n // { type: true} => [$style[\"type\"]]: true 需要加\"\"\n if (isLegalVariate(_key)) {\n _key = `${quote}${_key}${quote}`\n }\n return `[${cssModuleName}[${_key}]]:${trimString(value)}`\n })\n .join(',')\n return keepReturnType ? '{' + result + '}' : result\n}\n\n/**\n * 将 [] 中的类名换为 $style[`类名`]\n * @param code String\n * @param cssModuleName 模块名\n * @param quote 引号类型\n * @param keepType 返回值是否保留原类型,true: [***] => [***], false: [***] => ***\n * @returns 转换后去除[]的字符串\n */\nfunction transformArray(\n code: string,\n cssModuleName: string,\n quote: Quote,\n keepReturnType: Boolean\n): string {\n const content = getObjectOrArrayExpressionContent(code)\n if (!content) return ''\n\n const contentArr = splitStr2Arr(content, quote)\n const result = contentArr\n .map((item) => {\n /**\n * 数组中可以是各种表达式:数组,对象,表达式,字符串\n * 保持返回类型\n */\n return transformExp(item, cssModuleName, quote, true)\n })\n .join(',')\n return keepReturnType ? '[' + result + ']' : result\n}\n\n/**\n * 直接将表达式加上模块名\n * @param code String\n * @param cssModuleName 模块名\n * @returns 表达式外部加上模块名\n */\nfunction transformString(code: string, cssModuleName: string): string {\n if (!code) return ''\n return `${cssModuleName}[${code}]`\n}\n\n/**\n * 判断是否是合法变量名\n * @param variableName string\n * @returns boolean\n */\nexport function isLegalVariate(variableName: string) {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(variableName)\n}\n\n/**\n * 判断是表达式是单引号还是双引号格式\n * @param code String\n * @returns '--单引号 \"--双引号 `--模版符号\n */\nexport function getQuote(code: string) {\n for (let i = 0; i < code.length; i++) {\n if (code[i] === '\"') {\n return '\"'\n }\n if (code[i] === \"'\") {\n return \"'\"\n }\n if (code[i] === '`') {\n return '`'\n }\n }\n return ''\n}\n\n/**\n * 将单引号转为双引号,双引号转为单引号\n * @param code string\n * @returns string\n */\nexport function swapQuotes(code: string) {\n let result: string\n const placeholder = '__QUOTE__'\n // 将单引号替换为 __QUOTE__\n result = code.replace(/'/g, placeholder)\n // 将双引号替换为单引号\n result = result.replace(/\"/g, \"'\")\n // 将占位符替换为双引号\n result = result.replace(new RegExp(placeholder, 'g'), '\"')\n return result\n}\n\n/**\n * 将代码中的双引号改为单引号\n * @param code string\n * @returns string\n */\nexport function transform2SingleQuotes(code: string) {\n return code.replace(/\"/g, \"'\")\n}\n\n/**\n * 获取pug属性节点的val值,去除前后符号和空格\n * @param code pug的attrs的节点\n * @returns string\n */\nexport function getPugVal(code: string | boolean) {\n if (typeof code === 'boolean') return ''\n return trimString(code.substring(1, code.length - 1))\n}\n","import type { AttributeNode, DirectiveNode, TemplateChildNode } from '@vue/compiler-core'\nimport { MagicString } from 'vue/compiler-sfc'\nimport {\n trimString,\n isObjectExp,\n isArrayExp,\n getObjectOrArrayExpressionContent,\n transformString2Array,\n transformExp,\n transformString2ObjectString,\n getQuote,\n swapQuotes\n} from './tool'\n\nexport function parseHtml(\n childNode: TemplateChildNode[],\n s: MagicString,\n attrName: string,\n cssModuleName: string\n) {\n childNode.forEach((node) => {\n if ('props' in node) {\n let bindClassNode: DirectiveNode | undefined,\n attrNameNode: AttributeNode | undefined,\n bindAttrNameNode: DirectiveNode | undefined\n node.props.forEach((prop) => {\n if (prop.name === 'bind' && 'arg' in prop && prop.arg && 'content' in prop.arg) {\n // :class\n if (prop.arg.content === 'class') {\n bindClassNode = prop\n }\n // 如果 attrName = cls, 则是 :cls=\"\"\n else if (prop.arg.content === attrName) {\n bindAttrNameNode = prop\n }\n }\n // 如果 attrName = cls, 则是 cls=\"\"\n else if (prop.name === attrName && 'value' in prop) {\n attrNameNode = prop\n }\n })\n\n // 如果 attrName = cls,处理 cls 内容\n if (attrNameNode) {\n const attrNameQuote = getQuote(attrNameNode.loc.source)\n let attrNameArr = transformString2Array(attrNameNode.value?.content || '')\n // 没有值,删除 attrName 属性\n if (attrNameArr.length === 0) {\n s.update(attrNameNode.loc.start.offset, attrNameNode.loc.end.offset, '')\n return\n }\n // :class\n if (bindClassNode && bindClassNode.exp && 'content' in bindClassNode.exp) {\n const bindClassQuote = getQuote(bindClassNode.loc.source)\n const strQuote = bindClassQuote === \"'\" ? '\"' : \"'\"\n const bindClassContent = trimString(bindClassNode.exp.content)\n\n let result: string\n // :class=\"{}\" :class='{}'\n if (isObjectExp(bindClassContent)) {\n // 获取{}中间的内容\n let objectContent = getObjectOrArrayExpressionContent(bindClassContent)\n /** fix: :class=\"{}\" 和 :class=\"[]\" 报错 */\n if (objectContent) {\n objectContent += ','\n }\n result = `:class=${bindClassQuote}{${objectContent}${attrNameArr\n .map((val) => `[${cssModuleName}[${strQuote}${val}${strQuote}]]:true`)\n .join(',')}}${bindClassQuote}`\n }\n // :class=\"[]\" :class='[]'\n else if (isArrayExp(bindClassContent)) {\n let arrayContent = getObjectOrArrayExpressionContent(bindClassContent)\n if (arrayContent) {\n arrayContent += ','\n }\n result = `:class=${bindClassQuote}[${arrayContent}${attrNameArr\n .map((val) => `${cssModuleName}[${strQuote}${val}${strQuote}]`)\n .join(',')}]${bindClassQuote}`\n }\n // :class=\"type\" :class='type === \"add\" && \"red\"' :class=\"type === 'add' ? 'red' : 'green'\"\n else {\n result = `:class=${bindClassQuote}[${bindClassContent},${attrNameArr\n .map((val) => `${cssModuleName}[${strQuote}${val}${strQuote}]`)\n .join(',')}]${bindClassQuote}`\n }\n // 修改 :class 属性\n s.update(bindClassNode.loc.start.offset, bindClassNode.loc.end.offset, result)\n // 删除 attrName 属性\n s.update(attrNameNode.loc.start.offset, attrNameNode.loc.end.offset, '')\n }\n // 只存在 或 不存在 class\n else {\n const strQuote = attrNameQuote === \"'\" ? '\"' : \"'\"\n // 将 attrName 属性 改为 :class\n s.update(\n attrNameNode.loc.start.offset,\n attrNameNode.loc.end.offset,\n `:class=${attrNameQuote}[${attrNameArr\n .map((val) => `${cssModuleName}[${strQuote}${val}${strQuote}]`)\n .join(',')}]${attrNameQuote}`\n )\n }\n }\n // 如果 attrName = cls, 且 :cls=\"\" 存在,处理 :cls 内容\n if (bindAttrNameNode && bindAttrNameNode.exp && 'content' in bindAttrNameNode.exp) {\n // 返回表达式的引号 :cls='' -> ' :cls=\"\" -> \"\n const bindAttrNameQuote = getQuote(bindAttrNameNode.loc.source)\n const bindAttrNameContent = trimString(bindAttrNameNode.exp.content)\n // 将:cls=\"\"中的类名加上cssModuleName.\n let bindAttrNameContent2CssModuleNameStr: string = transformExp(\n bindAttrNameContent,\n cssModuleName,\n bindAttrNameQuote === \"'\" ? '\"' : \"'\"\n )\n if (!bindAttrNameContent2CssModuleNameStr) {\n s.update(bindAttrNameNode.loc.start.offset, bindAttrNameNode.loc.end.offset, '')\n return\n }\n // :class exist\n if (bindClassNode && bindClassNode.exp && 'content' in bindClassNode.exp) {\n const bindClassQuote = getQuote(bindClassNode.loc.source)\n const bindClassContent = trimString(bindClassNode.exp.content)\n // :class 和 :cls 用的引号不一致(源代码不规范的情况可能出现)\n if (bindAttrNameQuote !== bindClassQuote) {\n bindAttrNameContent2CssModuleNameStr = swapQuotes(bindAttrNameContent2CssModuleNameStr)\n }\n let result: string\n // :class=\"{}\"\n if (isObjectExp(bindClassContent)) {\n // 获取{}中间的内容\n let objectContent = getObjectOrArrayExpressionContent(bindClassContent)\n /** fix: :class=\"{}\" 和 :class=\"[]\" 报错 */\n if (objectContent) {\n objectContent += ','\n }\n // :class=\"{}\" :cls=\"{}\"\n if (isObjectExp(bindAttrNameContent)) {\n result = `:class=${bindClassQuote}{${objectContent}${bindAttrNameContent2CssModuleNameStr}}${bindClassQuote}`\n }\n // :class=\"{}\" :cls=\"[]\" 或 :cls=\"exp\"\n else {\n result = `:class=${bindClassQuote}{${objectContent}${transformString2ObjectString(\n bindAttrNameContent2CssModuleNameStr,\n bindClassQuote === '\"' ? \"'\" : '\"'\n )}}${bindClassQuote}`\n }\n }\n // :class=\"[]\"\n else if (isArrayExp(bindClassContent)) {\n // 获取[]中间的内容\n let arrayContent = getObjectOrArrayExpressionContent(bindClassContent)\n // :class=\"[]\" :cls=\"{}\"\n if (isObjectExp(bindAttrNameContent)) {\n arrayContent = transformString2ObjectString(\n arrayContent,\n bindClassQuote === '\"' ? \"'\" : '\"'\n )\n /** fix: :class=\"{}\" 和 :class=\"[]\" 报错 */\n if (arrayContent) {\n arrayContent += ','\n }\n result = `:class=${bindClassQuote}{${arrayContent}${bindAttrNameContent2CssModuleNameStr}}${bindClassQuote}`\n }\n // :class=\"[]\" :cls=\"[]\" 或 :cls=\"exp\"\n else {\n result = `:class=${bindClassQuote}[${arrayContent},${bindAttrNameContent2CssModuleNameStr}]${bindClassQuote}`\n }\n }\n // :class=\"exp\"\n else {\n // :class=\"exp\" :cls=\"{}\"\n if (isObjectExp(bindAttrNameContent)) {\n result = `:class=${bindClassQuote}{${transformString2ObjectString(\n bindClassContent,\n bindClassQuote === '\"' ? \"'\" : '\"'\n )},${bindAttrNameContent2CssModuleNameStr}}${bindClassQuote}`\n }\n // :class=\"exp\" :cls=\"[]\" 或 :cls=\"exp\"\n else {\n result = `:class=${bindClassQuote}[${bindClassContent},${bindAttrNameContent2CssModuleNameStr}]${bindClassQuote}`\n }\n }\n // 修改 :class 属性\n s.update(bindClassNode.loc.start.offset, bindClassNode.loc.end.offset, result)\n // 删除 attrName 属性\n s.update(bindAttrNameNode.loc.start.offset, bindAttrNameNode.loc.end.offset, '')\n } else {\n // :cls=\"{}\"\n if (isObjectExp(bindAttrNameContent)) {\n s.update(\n bindAttrNameNode.loc.start.offset,\n bindAttrNameNode.loc.end.offset,\n `:class=${bindAttrNameQuote}{${bindAttrNameContent2CssModuleNameStr}}${bindAttrNameQuote}`\n )\n } else {\n s.update(\n bindAttrNameNode.loc.start.offset,\n bindAttrNameNode.loc.end.offset,\n `:class=${bindAttrNameQuote}[${bindAttrNameContent2CssModuleNameStr}]${bindAttrNameQuote}`\n )\n }\n }\n }\n node.children && parseHtml(node.children, s, attrName, cssModuleName)\n }\n })\n}\n","import {\n getObjectOrArrayExpressionContent,\n getPugVal,\n isArrayExp,\n isObjectExp,\n transform2SingleQuotes,\n transformExp,\n transformString2Array,\n transformString2ObjectString\n} from './tool'\nimport { PluginOptions } from './types'\n\n// 属性节点\ninterface Attr {\n name: string\n val: string\n line: number\n column: number\n mustEscape: boolean\n}\n\n// 标签节点\ninterface Node {\n attrs: undefined | Array<Attr>\n}\n\n// pug包,用于动态导入,避免不是用pug模板的项目报错\nlet pugPackage:\n | {\n parse: typeof import('pug-parser').default\n lexer: typeof import('pug-lexer').default\n walk: typeof import('pug-walk').default\n generate: typeof import('pug-source-gen').default\n }\n | undefined\n\nconst setPugPackage = async () => {\n pugPackage = {\n parse: (await import('pug-parser')).default,\n lexer: (await import('pug-lexer')).default,\n walk: (await import('pug-walk')).default,\n generate: (await import('pug-source-gen')).default\n }\n}\n\nexport async function parsePug(source: string, options: PluginOptions, cssModuleName: string) {\n const { attrName, pugClassLiterals } = options\n /** fix: 非使用pug模板的项目报缺少pug的相关依赖 */\n if (!pugPackage) await setPugPackage()\n const { parse, lexer, walk, generate } = pugPackage!\n const ast = parse(lexer(source))\n walk(ast, (node: Node) => {\n if (node.attrs?.length) {\n let bindClassNode: Attr | undefined,\n bindAttrNameNode: Attr | undefined,\n attrNameNodes: Attr[] = []\n node.attrs.forEach((attr) => {\n switch (attr.name) {\n case ':class':\n case 'v-bind:class':\n bindClassNode = attr\n break\n case `:${attrName}`:\n case `v-bind:${attrName}`:\n bindAttrNameNode = attr\n break\n case attrName:\n attrNameNodes.push(attr)\n break\n case 'class':\n // Class literals are known to have mustEscape false.\n if (pugClassLiterals && attr.mustEscape === false) {\n attrNameNodes.push(attr)\n }\n }\n })\n\n if (attrNameNodes.length) {\n const attrNameArr = transformString2Array(\n attrNameNodes.map((node) => getPugVal(node.val)).join(' ')\n )\n if (attrNameArr.length) {\n // :class\n if (bindClassNode) {\n let result: string\n const bindClassContent = transform2SingleQuotes(getPugVal(bindClassNode.val))\n // :class=\"{}\" :class='{}'\n if (isObjectExp(bindClassContent)) {\n // 获取{}中间的内容\n let objectContent = getObjectOrArrayExpressionContent(bindClassContent)\n /** fix: :class=\"{}\" 和 :class=\"[]\" 报错 */\n if (objectContent) {\n objectContent += ','\n }\n result = `\"{${objectContent}${attrNameArr\n .map((cls) => `[${cssModuleName}['${cls}']]:true`)\n .join(',')}}\"`\n }\n // :class=\"[]\" :class='[]'\n else if (isArrayExp(bindClassContent)) {\n const arrayContent = getObjectOrArrayExpressionContent(bindClassContent)\n result = `\"[${arrayContent}, ${attrNameArr\n .map((cls) => `${cssModuleName}['${cls}']`)\n .join(',')}]\"`\n }\n // :class=\"type\" :class='type === \"add\" && \"red\"' :class=\"type === 'add' ? 'red' : 'green'\"\n else {\n result = `\"[${bindClassContent},${attrNameArr\n .map((cls) => `${cssModuleName}['${cls}']`)\n .join(',')}]\"`\n }\n // 修改 :class的值\n bindClassNode.val = result\n }\n // 只存在 或 不存在 class\n else {\n // Convert the first class attribute to :class.\n const attrNameNode = attrNameNodes.shift()!\n attrNameNode.mustEscape = true\n attrNameNode.name = `:class`\n attrNameNode.val = `\"[${attrNameArr\n .map((cls) => `${cssModuleName}['${cls}']`)\n .join(',')}]\"`\n\n /**\n * fix: Duplicate :class\n */\n bindClassNode = attrNameNode\n }\n }\n // 删除 attrName 属性\n if (attrNameNodes.length) {\n node.attrs = node.attrs.filter((attr) => !attrNameNodes.includes(attr))\n }\n }\n // 如果 attrName = cls, 且 :cls=\"\" 存在\n if (bindAttrNameNode) {\n const bindAttrNameContent = transform2SingleQuotes(getPugVal(bindAttrNameNode.val))\n const bindAttrNameContent2CssModuleNameStr = transformExp(\n bindAttrNameContent,\n cssModuleName,\n \"'\"\n )\n // :cls的值为空、空数组、空对象,删除该属性\n if (!bindAttrNameContent2CssModuleNameStr) {\n node.attrs = node.attrs.filter((attr) => attr !== bindAttrNameNode)\n return\n }\n // :class 存在\n if (bindClassNode) {\n // 双引号转为单引号\n const bindClassContent = transform2SingleQuotes(getPugVal(bindClassNode.val))\n let result: string\n // :class=\"{}\"\n if (isObjectExp(bindClassContent)) {\n // 获取{}中间的内容\n let objectContent = getObjectOrArrayExpressionContent(bindClassContent)\n /** fix: :class=\"{}\" 和 :class=\"[]\" 报错 */\n if (objectContent) {\n objectContent += ','\n }\n // :class=\"{}\" :cls=\"{}\"\n if (isObjectExp(bindAttrNameContent)) {\n result = `\"{${objectContent}${bindAttrNameContent2CssModuleNameStr}}\"`\n }\n // :class=\"{}\" :cls=\"[]\" 或 :cls=\"exp\"\n else {\n result = `\"{${objectContent}${transformString2ObjectString(\n bindAttrNameContent2CssModuleNameStr,\n \"'\"\n )}}\"`\n }\n }\n // :class=\"[]\"\n else if (isArrayExp(bindClassContent)) {\n // 获取[]中间的内容\n let arrayContent = getObjectOrArrayExpressionContent(bindClassContent)\n // :class=\"[]\" :cls=\"{}\"\n if (isObjectExp(bindAttrNameContent)) {\n arrayContent = transformString2ObjectString(arrayContent, \"'\")\n /** fix: :class=\"{}\" 和 :class=\"[]\" 报错 */\n if (arrayContent) {\n arrayContent += ','\n }\n result = `\"{${arrayContent}${bindAttrNameContent2CssModuleNameStr}}\"`\n }\n // :class=\"[]\" :cls=\"[]\" 或 :cls=\"exp\"\n else {\n result = `\"[${arrayContent},${bindAttrNameContent2CssModuleNameStr}]\"`\n }\n }\n // :class=\"exp\"\n else {\n // :class=\"exp\" :cls=\"{}\"\n if (isObjectExp(bindAttrNameContent)) {\n result = `\"{${transformString2ObjectString(\n bindClassContent,\n \"'\"\n )},${bindAttrNameContent2CssModuleNameStr}}\"`\n }\n // :class=\"exp\" :cls=\"[]\" 或 :cls=\"exp\"\n else {\n result = `\"[${bindClassContent},${bindAttrNameContent2CssModuleNameStr}]\"`\n }\n }\n bindClassNode.val = result\n // 删除 :cls节点\n node.attrs = node.attrs.filter((attr) => attr !== bindAttrNameNode)\n } else {\n bindAttrNameNode.name = ':class'\n // :cls=\"{}\"\n if (isObjectExp(bindAttrNameContent)) {\n bindAttrNameNode.val = `\"{${bindAttrNameContent2CssModuleNameStr}}\"`\n } else {\n bindAttrNameNode.val = `\"[${bindAttrNameContent2CssModuleNameStr}]\"`\n }\n }\n }\n }\n })\n return generate(ast)\n}\n"],"mappings":"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","names":["import_compiler_sfc","parse","node","code"]}