37 lines
1.5 KiB
TypeScript
37 lines
1.5 KiB
TypeScript
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([])
|
|
})
|