{"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"]}