mirror of
https://gitee.com/newgateway/vtj.git
synced 2026-06-24 12:38:20 +08:00
- 新增 compositionPatch 功能,实现 <script setup> 代码中标识符到 this.xxx 的自动转换 - 扩展全局 API map,新增 pinia 和 vue-i18n 相关全局变量支持与合并声明 - 增加 ScriptSetup 解析模块,完整解析 refs、reactives、computed、methods 等组成部分 - 修改 parseVue 实现,单点分流支持 Composition API 和 Options API 两种模式解析 - 修正工具函数,调整 props 替换逻辑,避免不必要的 this.props 访问替换 - 扩展 Vitest 测试用例,覆盖 Composition API 使用场景 - 增加对 defineProps、defineEmits、inject、provide 等新语法的支持与提取 - 优化 AST 遍历,准确识别 setup 函数内容及生命周期函数映射 - 添加全局 @vueuse/core 和自定义 composable 支持逻辑 - 规范代码结构,拆分解析细节并提升整体可维护性与扩展性
69 lines
2.3 KiB
TypeScript
69 lines
2.3 KiB
TypeScript
import { expect, test, describe } from 'vitest';
|
|
import { parseTemplate } from '../src/vue/template';
|
|
|
|
describe('parseTemplate', () => {
|
|
test('should parse basic elements', () => {
|
|
const result = parseTemplate('test-id', 'test.vue', '<div>Hello</div>');
|
|
expect(result.nodes.length).toBe(1);
|
|
expect(result.nodes[0].name).toBe('div');
|
|
});
|
|
|
|
test('should parse interpolation expressions', () => {
|
|
const result = parseTemplate('test-id', 'test.vue', '<p>{{ message }}</p>');
|
|
expect(result.nodes.length).toBe(1);
|
|
const node = result.nodes[0];
|
|
expect(node.name).toBe('p');
|
|
});
|
|
|
|
test('should parse slot elements', () => {
|
|
const result = parseTemplate(
|
|
'test-id',
|
|
'test.vue',
|
|
'<slot name="header"></slot>'
|
|
);
|
|
expect(result.slots.length).toBe(1);
|
|
expect(result.slots[0].name).toBe('header');
|
|
});
|
|
|
|
test('should parse default slot', () => {
|
|
const result = parseTemplate('test-id', 'test.vue', '<slot></slot>');
|
|
expect(result.slots.length).toBe(1);
|
|
expect(result.slots[0].name).toBe('default');
|
|
});
|
|
|
|
test('should handle empty template', () => {
|
|
const result = parseTemplate('test-id', 'test.vue', '');
|
|
expect(result.nodes.length).toBe(0);
|
|
expect(result.slots.length).toBe(0);
|
|
});
|
|
|
|
test('should parse component usage with styles', () => {
|
|
const styles = {
|
|
'.mycomp_abc123': { color: 'red' }
|
|
};
|
|
const content =
|
|
'<my-component class="mycomp_abc123 other-class">Content</my-component>';
|
|
const result = parseTemplate('test-id', 'test.vue', content, {
|
|
platform: 'web',
|
|
styles
|
|
});
|
|
expect(result.nodes.length).toBe(1);
|
|
const node = result.nodes[0];
|
|
expect(node.name).toBe('MyComponent');
|
|
expect(node.props!.style).toBeDefined();
|
|
});
|
|
|
|
test('should track context for v-for', () => {
|
|
const content = '<div v-for="item in list" :key="item.id">{{ item }}</div>';
|
|
const result = parseTemplate('test-id', 'test.vue', content);
|
|
expect(result.nodes.length).toBe(1);
|
|
});
|
|
|
|
test('should track context for slots', () => {
|
|
const content = '<slot name="item" v-bind="{ item, index }"></slot>';
|
|
const result = parseTemplate('test-id', 'test.vue', content);
|
|
expect(result.slots.length).toBe(1);
|
|
expect(result.slots[0].name).toBe('item');
|
|
});
|
|
});
|