): string {
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'sek-label-guard-'))
tempDirs.push(root)
for (const [relPath, text] of Object.entries(files)) {
const full = path.join(root, relPath)
fs.mkdirSync(path.dirname(full), { recursive: true })
fs.writeFileSync(full, text)
}
return root
}
function run(root: string): { status: number; findings: { where: string; expr: string }[] } {
try {
const stdout = execFileSync('node', [GUARD, root, '--json'], { encoding: 'utf8' })
return { status: 0, findings: JSON.parse(stdout) }
} catch (e) {
const err = e as { status: number; stdout: string }
return { status: err.status, findings: JSON.parse(err.stdout) }
}
}
const CLEAN = `
export function SupplierInvoiceRow({ invoice }: { invoice: SupplierInvoice }) {
return | {formatCurrency(invoice.total, invoice.currency)} |
}
`
const OFFENDING = `
export function SupplierInvoiceRow({ invoice }: { invoice: SupplierInvoice }) {
if (invoice.currency !== 'SEK') return null
return {formatCurrency(invoice.total)} |
}
`
it('exits 0 on a tree with only correct calls', () => {
const result = run(fixtureTree({ 'components/suppliers/Row.tsx': CLEAN }))
expect(result.findings).toEqual([])
expect(result.status).toBe(0)
})
it('exits 1 and names the site once the offending call is introduced', () => {
const result = run(fixtureTree({ 'components/suppliers/Row.tsx': OFFENDING }))
expect(result.status).toBe(1)
expect(result.findings).toHaveLength(1)
expect(result.findings[0].where).toBe('components/suppliers/Row.tsx:4')
expect(result.findings[0].expr).toBe('invoice.total')
})
it('ignores test files, so a fixture in a spec cannot fail the build', () => {
const result = run(fixtureTree({ 'components/suppliers/__tests__/Row.test.tsx': OFFENDING }))
expect(result.findings).toEqual([])
expect(result.status).toBe(0)
})
})