parent
5662f1aa94
commit
f815dd95ac
@ -0,0 +1,62 @@
|
|||||||
|
import { readFileSync } from 'node:fs'
|
||||||
|
import { join } from 'node:path'
|
||||||
|
import { describe, expect, it } from 'vitest'
|
||||||
|
|
||||||
|
const COMPONENTS_DIR = 'src/uix/eidos/components'
|
||||||
|
|
||||||
|
const VISUAL_ATTRS = [
|
||||||
|
['accordion/accordion.svelte', ['data-size', 'data-variant']],
|
||||||
|
['accordion/accordion-content.svelte', ['data-size']],
|
||||||
|
['accordion/accordion-header.svelte', ['data-size']],
|
||||||
|
['accordion/accordion-trigger.svelte', ['data-size', 'data-indicator-placement']],
|
||||||
|
['avatar/avatar.svelte', ['data-size', 'data-variant', 'data-color']],
|
||||||
|
['checkbox/checkbox.svelte', ['data-size', 'data-variant', 'data-color']],
|
||||||
|
['checkbox/checkbox-group.svelte', ['data-columns']],
|
||||||
|
['dialog/dialog-close.svelte', ['data-position', 'data-icon-only']],
|
||||||
|
['dialog/dialog-content.svelte', ['data-size', 'data-position', 'data-sheet']],
|
||||||
|
['drawer/drawer-close.svelte', ['data-icon-only']],
|
||||||
|
['drawer/drawer-content.svelte', ['data-size']],
|
||||||
|
['popover/popover-close.svelte', ['data-icon-only']],
|
||||||
|
['popover/popover-content.svelte', ['data-size']],
|
||||||
|
['radio-group/radio-group.svelte', ['data-size', 'data-variant', 'data-color', 'data-columns']],
|
||||||
|
['switch/switch.svelte', ['data-size']],
|
||||||
|
['tabs/tabs.svelte', ['data-size', 'data-variant', 'data-fitted', 'data-collapsed', 'data-motion']],
|
||||||
|
['tabs/tabs-content.svelte', ['data-motion']],
|
||||||
|
['tabs/tabs-indicator.svelte', ['data-ready']],
|
||||||
|
['toast/toast-viewport.svelte', ['data-position']],
|
||||||
|
['toggle/toggle.svelte', ['data-size', 'data-variant', 'data-block', 'data-icon-only']],
|
||||||
|
['tooltip/tooltip-content.svelte', ['data-size', 'data-variant']],
|
||||||
|
['svg/svg-check.svelte', ['data-svg']],
|
||||||
|
['svg/svg-chevron.svelte', ['data-svg', 'data-svg-direction']],
|
||||||
|
['svg/svg-dash.svelte', ['data-svg']],
|
||||||
|
['svg/svg-dot.svelte', ['data-svg']]
|
||||||
|
] as const
|
||||||
|
|
||||||
|
function stripComments(source: string): string {
|
||||||
|
return source.replace(/\/\*[\s\S]*?\*\//g, '').replace(/(^|[^:])\/\/.*$/gm, '$1')
|
||||||
|
}
|
||||||
|
|
||||||
|
function readComponentSource(relativePath: string): string {
|
||||||
|
return stripComments(readFileSync(join(COMPONENTS_DIR, relativePath), 'utf8'))
|
||||||
|
}
|
||||||
|
|
||||||
|
function attrPattern(attr: string): RegExp {
|
||||||
|
return new RegExp(`${attr.replaceAll('-', '\\-')}\\s*=`)
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('Eidos component visual attrs', () => {
|
||||||
|
it('keeps visual recipe attrs wired in their wrappers', () => {
|
||||||
|
const missing: string[] = []
|
||||||
|
|
||||||
|
for (const [relativePath, attrs] of VISUAL_ATTRS) {
|
||||||
|
const source = readComponentSource(relativePath)
|
||||||
|
for (const attr of attrs) {
|
||||||
|
if (!attrPattern(attr).test(source)) {
|
||||||
|
missing.push(`${relativePath}: ${attr}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(missing).toEqual([])
|
||||||
|
})
|
||||||
|
})
|
||||||
Loading…
Reference in new issue