/** * 扫描结果:按页面维度的选择器映射 */ export interface ScanResult { /** 页面路径 -> 选择器列表 */ pages: Record; /** 扫描统计信息 */ stats: ScanStats; } export interface PageSelectors { /** 根节点选择器(最外层元素的 class) */ root: string[]; /** 关键内容节点选择器 */ content: string[]; /** 注入的标记选择器(原本没有 class 的节点) */ injected: string[]; } export interface ScanStats { /** 扫描的模板文件总数 */ totalFiles: number; /** 有可用选择器(id 或 class)的节点数 */ nodesWithSelector: number; /** 注入 class 的节点数 */ nodesInjected: number; /** 扫描耗时(ms) */ duration: number; } /** * 注入记录:用于 restore 还原 */ export interface InjectRecord { /** 文件路径 */ filePath: string; /** 原始文件内容 */ originalContent: string; /** 注入后的文件内容 */ injectedContent: string; } export interface InjectManifest { /** 注入时间戳 */ timestamp: number; /** 注入记录列表 */ records: InjectRecord[]; } /** * 扫描配置 */ export interface ScannerConfig { /** 小程序项目根目录 */ projectRoot: string; /** 扫描模式:wxml(默认)或 taro(扫描 src 页面源码) */ mode?: 'wxml' | 'taro'; /** app.json 路径(相对于 projectRoot),默认 'app.json' */ appJsonPath?: string; /** Taro app.config 路径(相对于 projectRoot),默认 'src/app.config.ts' */ taroAppConfigPath?: string; /** Taro 源码根目录(相对于 projectRoot),默认 'src' */ taroSourceRoot?: string; /** 关键内容标签名(这些标签上的 class 或注入的 class 会被收集) */ contentTags?: string[]; /** 注入 class 的前缀,默认 '__aegis' */ injectPrefix?: string; /** 是否只扫描不注入,默认 true(需显式传 --inject 才注入) */ scanOnly?: boolean; /** 输出的选择器配置文件路径,默认 'aegis-selectors.js' */ outputPath?: string; /** 输出格式:'js'(默认)、'json'、'all'(同时输出 js 和 json) */ outputFormat?: 'js' | 'json' | 'all'; /** 模板后缀列表,默认 ['.wxml', '.axml', '.ttml'] */ templateExtensions?: string[]; /** 注入清单文件路径(用于 restore),默认 '.aegis-inject-manifest.json' */ manifestPath?: string; } /** * WXML 解析出的节点信息 */ export interface WxmlNode { /** 标签名 */ tagName: string; /** class 属性值(可能为空) */ className: string; /** id 属性值(可能为空) */ idName: string; /** 是否是根节点(最外层元素) */ isRoot: boolean; /** 在原始文件中的起始位置 */ startOffset: number; /** 标签开始部分的结束位置( '>' 的位置) */ tagEndOffset: number; /** 原始标签文本 */ rawTag: string; }