import { describe, it, expect } from 'vitest'; import { transformVueSfcTemplate } from '../../packages/plugin/src/core/vueSfcTransformer'; import type { DesignModeOptions } from '../../packages/plugin/src/types'; const options: Required = { enabled: true, enableInProduction: false, attributePrefix: 'data-source', verbose: false, exclude: ['node_modules'], include: ['src/**/*.{js,jsx,ts,tsx,vue}'], enableBackup: false, enableHistory: false, framework: 'auto', }; function decodeHtmlAttr(value: string): string { return value .replace(/"/g, '"') .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>'); } describe('vueSfcTransformer', () => { it('injects normalized source info fields with legacy compatibility aliases', () => { const source = ` `; const transformed = transformVueSfcTemplate(source, 'src/pages/Home.vue', options); const attrMatch = transformed.match(/data-source-info="([^"]+)"/); expect(attrMatch).toBeTruthy(); const sourceInfo = JSON.parse(decodeHtmlAttr(attrMatch![1])) as Record; expect(sourceInfo.fileName).toBe('src/pages/Home.vue'); expect(sourceInfo.lineNumber).toBeTypeOf('number'); expect(sourceInfo.columnNumber).toBeTypeOf('number'); expect(sourceInfo.line).toBe(sourceInfo.lineNumber); expect(sourceInfo.column).toBe(sourceInfo.columnNumber); }); it('removes stale mapping attrs before reinjection', () => { const source = ``; const transformed = transformVueSfcTemplate(source, 'src/pages/Home.vue', options); const infoAttrs = transformed.match(/data-source-info=/g) ?? []; expect(infoAttrs.length).toBe(1); expect(transformed).not.toContain('old.vue'); }); });