import { readdirSync, readFileSync } from 'node:fs' import { join, relative } from 'node:path' import { parse } from 'vue/compiler-sfc' import { expect, it } from 'vitest' /** 持续检查后台业务模板,避免再次用原生日期控件替代 Element 公共控件。 */ it('uses Element date and time pickers throughout Admin business templates', () => { const root = join(process.cwd(), 'src/modules') const violations: string[] = [] function inspect(content: DocumentFragment, file: string) { for (const input of content.querySelectorAll('input, el-input')) { const type = input.getAttribute('type') || '' if (/^(date|time|month|week|datetime-local)$/.test(type)) { violations.push(`${relative(root, file)} ${input.tagName.toLowerCase()} type=${type}`) } } // 条件和插槽模板的内容位于独立的 DocumentFragment 中。 for (const template of content.querySelectorAll('template')) inspect(template.content, file) } function visit(directory: string) { for (const entry of readdirSync(directory, { withFileTypes: true })) { const file = join(directory, entry.name) if (entry.isDirectory()) visit(file) else if (entry.name.endsWith('.vue')) { const source = parse(readFileSync(file, 'utf8')).descriptor.template?.content if (source) { const template = document.createElement('template') template.innerHTML = source inspect(template.content, file) } } } } visit(root) expect(violations).toEqual([]) })