You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.8 KiB
57 lines
1.8 KiB
/**
|
|
* Lint an eidos component CSS against its morfo contract.
|
|
*
|
|
* Usage: npx tsx scripts/eidos-lint.ts <component-kebab>
|
|
* e.g. npx tsx scripts/eidos-lint.ts toggle
|
|
*
|
|
* Reads `src/uix/morfo/components/{name}.ts` + `src/uix/eidos/components/{name}.css`,
|
|
* compiles the morfo, and reports which selectors are morfo-backed,
|
|
* eidos-only design tokens, or invalid (value not in declared enum).
|
|
*/
|
|
|
|
import { readFileSync, existsSync } from 'node:fs'
|
|
import { resolve } from 'node:path'
|
|
|
|
import { compileMorfo } from '../src/uix/morfo/compile'
|
|
import { formatLintReport, lintEidosCss } from '../src/uix/eidos/lint'
|
|
import type { Morfo } from '../src/uix/morfo/types'
|
|
|
|
async function main() {
|
|
const name = process.argv[2]
|
|
if (!name) {
|
|
console.error('Usage: tsx scripts/eidos-lint.ts <component-kebab>')
|
|
process.exit(2)
|
|
}
|
|
|
|
const morfoPath = resolve(`src/uix/morfo/components/${name}.ts`)
|
|
const cssPath = resolve(`src/uix/eidos/components/${name}.css`)
|
|
if (!existsSync(morfoPath)) {
|
|
console.error(`No morfo file at ${morfoPath}`)
|
|
process.exit(2)
|
|
}
|
|
if (!existsSync(cssPath)) {
|
|
console.error(`No eidos CSS at ${cssPath}`)
|
|
process.exit(2)
|
|
}
|
|
|
|
const mod = (await import(`../src/uix/morfo/components/${name}`)) as Record<string, unknown>
|
|
const morfoExportName = `${name.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())}Morfo`
|
|
const morfo = mod[morfoExportName] as Morfo | undefined
|
|
if (!morfo) {
|
|
console.error(`Module exports ${Object.keys(mod).join(', ')}; expected ${morfoExportName}.`)
|
|
process.exit(2)
|
|
}
|
|
|
|
const compiled = compileMorfo(morfo)
|
|
const css = readFileSync(cssPath, 'utf-8')
|
|
const report = lintEidosCss(css, compiled)
|
|
console.log(formatLintReport(report))
|
|
|
|
if (report.counts.invalid > 0) process.exit(1)
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error(err)
|
|
process.exit(2)
|
|
})
|