import { run, html, css } from './util/run' let warn beforeEach(() => { warn = jest.spyOn(require('../src/util/log').default, 'warn') }) afterEach(() => warn.mockClear()) it('can block classes matched literally', () => { let config = { content: [ { raw: html`
`, }, ], blocklist: ['font', 'uppercase', 'hover:text-sm', 'bg-red-500/50', 'my-custom-class'], } let input = css` @tailwind utilities; .my-custom-class { color: red; } ` return run(input, config).then((result) => { return expect(result.css).toMatchCss(css` .font-bold { font-weight: 700; } .my-custom-class { color: red; } @media (min-width: 640px) { .sm\:hover\:text-sm:hover { font-size: 0.875rem; line-height: 1.25rem; } } `) }) }) it('can block classes inside @layer', () => { let config = { content: [ { raw: html``, }, ], blocklist: ['my-custom-class'], } let input = css` @tailwind utilities; @layer utilities { .my-custom-class { color: red; } } ` return run(input, config).then((result) => { return expect(result.css).toMatchCss(css` .font-bold { font-weight: 700; } `) }) }) it('blocklists do NOT support regexes', async () => { let config = { content: [{ raw: html`` }], blocklist: [/^bg-\[[^]+\]$/], } let result = await run('@tailwind utilities', config) expect(result.css).toMatchCss(css` .bg-\[\#f00d1e\] { --tw-bg-opacity: 1; background-color: rgb(240 13 30 / var(--tw-bg-opacity)); } .font-bold { font-weight: 700; } `) expect(warn).toHaveBeenCalledTimes(1) expect(warn.mock.calls.map((x) => x[0])).toEqual(['blocklist-invalid']) }) it('can block classes generated by the safelist', () => { let config = { content: [{ raw: html`` }], safelist: [{ pattern: /^bg-red-(400|500)$/ }], blocklist: ['bg-red-500'], } return run('@tailwind utilities', config).then((result) => { return expect(result.css).toMatchCss(css` .bg-red-400 { --tw-bg-opacity: 1; background-color: rgb(248 113 113 / var(--tw-bg-opacity)); } .font-bold { font-weight: 700; } `) }) })