{"version":3,"file":"vite.mjs","sources":["../src/jsx.ts","../src/vue.ts","../src/vite.ts"],"sourcesContent":["import fPath from 'path';\nimport * as babelParser from '@babel/parser';\nimport traverseModle from '@babel/traverse';\nimport type { NodePath } from '@babel/traverse';\nimport generateModule from '@babel/generator';\nimport * as t from '@babel/types';\nimport type { TTransformer } from './type';\nimport {\n  createJsxLocatorAttributes,\n  getJSXTagName,\n  hasInjectedDataAttributes,\n  isFragmentElement,\n  isSvgChild,\n  shouldInjectTag,\n} from './jsx-locator';\nimport { findWorkspaceRoot } from './utils';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst traverse = (traverseModle.default || traverseModle) as typeof traverseModle;\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst generate = (generateModule.default || generateModule) as typeof generateModule;\n\n// --- JSX/TSX 处理 ---\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const transformJsx: TTransformer = (code: string, id: string, prefix: string, opts?: { attributes?: any; filterTag?: any }) => {\n  const ast = babelParser.parse(code, {\n    sourceType: 'module',\n    plugins: ['jsx', 'typescript', 'classProperties', 'decorators-legacy'],\n  });\n\n  // 向上查找，直到找到名为 workspace 的目录\n  const projectRoot = findWorkspaceRoot(process.cwd());\n  const relativePath = fPath.relative(projectRoot, id);\n\n  traverse(ast, {\n    JSXOpeningElement(path) {\n      const line = path.node.loc?.start.line;\n      const startColumn = path.node.loc?.start.column;\n      if (!line || startColumn === undefined) return;\n      if (hasInjectedDataAttributes(path, prefix)) return;\n      if (isFragmentElement(path)) return;\n      if (isSvgChild(path)) return;\n\n      const tagName = getJSXTagName(path.node.name);\n      if (!shouldInjectTag(tagName, opts?.filterTag)) return;\n\n      const attrResult = createJsxLocatorAttributes({\n        code,\n        path,\n        prefix,\n        relativePath,\n        attributes: opts?.attributes,\n      });\n      if (!attrResult) return;\n\n      // Find the index of the first spread attribute (e.g., {...props})\n      // We insert our data attributes BEFORE the spread so that parent-passed\n      // data attributes can override these defaults (enabling proper source tracking\n      // for shared/common components)\n      const spreadIndex = path.node.attributes.findIndex((attr) => t.isJSXSpreadAttribute(attr));\n\n      const newAttrs = Object.entries(attrResult.attrs).map(([key, value]) => t.jsxAttribute(t.jsxIdentifier(key), t.stringLiteral(value)));\n\n      if (spreadIndex === -1) {\n        // No spread attribute found, append to the end as usual\n        path.node.attributes.push(...newAttrs);\n      } else {\n        // Insert before the first spread attribute so parent attributes can override\n        path.node.attributes.splice(spreadIndex, 0, ...newAttrs);\n      }\n    },\n  });\n\n  const output = generate(ast, {}, code);\n\n  return {\n    code: output.code,\n    map: output.map,\n  };\n};\n","import path from 'path';\nimport MagicString from 'magic-string';\nimport { parse as parseSFC } from '@vue/compiler-sfc';\nimport { parse as parseTemplate, NodeTypes, ElementNode } from '@vue/compiler-dom';\nimport { TTransformer } from './type';\nimport { EDITABLE_ELEMENT, HTML_TAGS } from './constants';\nimport { findWorkspaceRoot } from './utils';\n\n// Helper function to check if current element is a child of SVG\nconst isSvgChild = (node: ElementNode, parentStack: ElementNode[] = []): boolean => {\n  // 如果当前元素是svg本身，返回false\n  if (node?.tag?.toLowerCase() === 'svg') return false;\n\n  // 检查父节点栈中是否有svg元素\n  return parentStack.some((parent) => parent?.tag?.toLowerCase() === 'svg');\n};\n\n// --- Vue 处理 ---\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const transformVue: TTransformer = (code: string, id: string, prefix: string, opts?: { attributes?: any; filterTag?: any }) => {\n  // 向上查找，直到找到名为 workspace 的目录\n  const projectRoot = findWorkspaceRoot(process.cwd());\n  const relativePath = path.relative(projectRoot, id);\n\n  const { descriptor } = parseSFC(code, {\n    filename: id,\n    sourceMap: true,\n  });\n  const { template } = descriptor;\n  if (!template) return { code, map: null };\n\n  const startOffset = template.loc.start.offset;\n  const ms = new MagicString(code);\n\n  const ast = parseTemplate(template.content, {\n    comments: false,\n    isNativeTag: (tag) => true,\n  });\n\n  const injectAttributes = (node: ElementNode, parentStack: ElementNode[] = []) => {\n    if (node.type === NodeTypes.ELEMENT) {\n      // 跳过已经注入过属性的元素\n      const hasLocatorAttr = node.props.some(\n        (prop) => prop.type === NodeTypes.ATTRIBUTE && (prop.name === `data-${prefix}-path` || prop.name === `data-${prefix}-line`)\n      );\n      if (hasLocatorAttr) {\n        return;\n      }\n\n      // 跳过 <template> 标签\n      if (node.tag === 'template') return;\n\n      // 检查是否是SVG的子节点\n      if (isSvgChild(node, parentStack)) return;\n\n      // 过滤标签\n      let shouldInject = true;\n      if (opts?.filterTag) {\n        if (Array.isArray(opts.filterTag)) {\n          shouldInject = opts.filterTag.includes(node.tag);\n        } else if (typeof opts.filterTag === 'function') {\n          shouldInject = opts.filterTag(node.tag);\n        }\n      } else {\n        shouldInject = HTML_TAGS.includes(node.tag);\n      }\n      if (!shouldInject) return;\n\n      const insertOffset = startOffset + node.loc.start.offset + node.tag.length + 1;\n      const line = template.loc.start.line + node.loc.start.line - 1;\n\n      const StartColumn = node.loc.start.column - 1;\n\n      let attrs: string[] = [];\n      if (opts?.attributes) {\n        const customAttrs = opts.attributes({ relativePath, line, column: StartColumn, tag: node.tag });\n        attrs = Object.entries(customAttrs).map(([k, v]) => ` ${k}=\"${v}\" `);\n      } else {\n        // 获取静态文本内容\n        const isTextElement = EDITABLE_ELEMENT.includes(node?.tag?.toLowerCase());\n        let staticText = '';\n\n        if (isTextElement && node.children) {\n          const hasDynamicContent = node.children.some(\n            (child) => child.type === NodeTypes.INTERPOLATION || child.type === NodeTypes.COMPOUND_EXPRESSION\n          );\n\n          if (!hasDynamicContent) {\n            staticText = node.children\n              .filter((child) => child.type === NodeTypes.TEXT)\n              // eslint-disable-next-line @typescript-eslint/no-explicit-any\n              .map((child) => (child as any).content)\n              .join('');\n          }\n        }\n\n        attrs = [\n          ` data-${prefix}-path=\"${relativePath}\" `,\n          ` data-${prefix}-line=\"${line}\" `,\n          ` data-${prefix}-start-column=\"${StartColumn}\" `,\n          ` data-${prefix}-tag=\"${node.tag}\" `,\n          ` data-${prefix}-component=\"${encodeURIComponent(template.content.split('\\n')[line - 1]?.trim() || '')}\" `,\n          ` data-${prefix}-id=\"${relativePath}:${line}:${StartColumn}\" `,\n          ` data-${prefix}-text=\"${encodeURIComponent(staticText)}\" `,\n        ];\n      }\n\n      if (HTML_TAGS.includes(node.tag)) {\n        ms.appendLeft(insertOffset, attrs.join(' '));\n      }\n    }\n\n    if (node.children) {\n      node.children.forEach((child) => {\n        if (child.type === NodeTypes.ELEMENT) {\n          injectAttributes(child, [...parentStack, node]);\n        }\n      });\n    }\n  };\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  injectAttributes(ast as any);\n\n  return {\n    code: ms.toString(),\n    map: ms.generateMap({ hires: true }),\n  };\n};\n","import path from 'path';\nimport * as pluginInfo from '../package.json';\nimport { transformJsx } from './jsx';\nimport { transformVue } from './vue';\nimport type { PluginOptions, TTransformer } from './type';\nimport crypto from 'node:crypto';\nimport { isIncludedFile } from './utils';\n\nconst transformerFileTypes: Record<string, string[]> = {\n  vue: ['vue'],\n  jsx: ['jsx', 'tsx', 'js', 'ts'],\n};\n\nconst transformers: Record<string, TTransformer> = {\n  vue: transformVue,\n  jsx: transformJsx,\n};\n\nconst PREFIX = 'locator';\nconst DEFAULT_INCLUDE = ['src/**/*.{vue,jsx,tsx,js,ts}'];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst cache = new Map<string, { code: string; map?: any }>();\n\nfunction getHash(code: string) {\n  return crypto.createHash('md5').update(code).digest('hex');\n}\n\nexport function viteSourceLocator(options: PluginOptions = {}) {\n  const { include = DEFAULT_INCLUDE, exclude = [], prefix = PREFIX, enable = true, attributes, filterTag } = options;\n\n  return {\n    name: pluginInfo.name,\n    enforce: 'pre' as const,\n    apply: 'serve' as const,\n    version: pluginInfo.version,\n    async transform(code: string, id: string) {\n      if (!enable) return;\n      const relativePath = path.relative(process.cwd(), id);\n\n      if (!isIncludedFile(relativePath, include, exclude)) return;\n\n      const hash = getHash(code);\n      const cacheKey = `${id}:${hash}`;\n      if (cache.has(cacheKey)) {\n        const value = cache.get(cacheKey);\n        return value;\n      }\n\n      const transformer = Object.keys(transformers).find((key) => {\n        const fileTypes = transformerFileTypes[key];\n        return fileTypes.some((type) => id.endsWith(`.${type}`));\n      });\n\n      if (!transformer) {\n        return;\n      }\n\n      const result = transformers[transformer]?.(code, id, prefix, { attributes, filterTag });\n\n      cache.set(cacheKey, result);\n      return result;\n    },\n  };\n}\n"],"names":["_optionalChain","ops","lastAccessLHS","value","i","length","op","fn","args","call","undefined","traverse","traverseModle","default","generate","generateModule","transformerFileTypes","vue","jsx","transformers","code","id","prefix","opts","projectRoot","findWorkspaceRoot","process","cwd","relativePath","path","relative","descriptor","parseSFC","filename","sourceMap","template","map","startOffset","loc","start","offset","ms","MagicString","ast","parseTemplate","content","comments","isNativeTag","tag","injectAttributes","node","parentStack","type","NodeTypes","ELEMENT","props","some","prop","ATTRIBUTE","name","_","_2","toLowerCase","_3","parent","_4","_5","isSvgChild","shouldInject","_7","filterTag","Array","isArray","includes","HTML_TAGS","insertOffset","line","StartColumn","column","attrs","_8","attributes","customAttrs","Object","entries","k","v","staticText","EDITABLE_ELEMENT","_9","_10","_11","children","child","INTERPOLATION","COMPOUND_EXPRESSION","filter","TEXT","join","encodeURIComponent","_12","split","_14","_15","_16","trim","_17","appendLeft","forEach","toString","generateMap","hires","babelParser","parse","sourceType","plugins","fPath","JSXOpeningElement","startColumn","_6","hasInjectedDataAttributes","isFragmentElement","tagName","getJSXTagName","shouldInjectTag","attrResult","createJsxLocatorAttributes","spreadIndex","findIndex","attr","t","isJSXSpreadAttribute","newAttrs","key","jsxAttribute","jsxIdentifier","stringLiteral","push","splice","output","PREFIX","DEFAULT_INCLUDE","cache","Map","viteSourceLocator","options","include","exclude","enable","enforce","apply","version","transform","isIncludedFile","hash","crypto","createHash","update","digest","getHash","cacheKey","has","get","transformer","keys","find","endsWith","result","set"],"mappings":"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"}