let $ = require('../../execute') let { css, html, javascript } = require('../../syntax') let { readOutputFile, appendToInputFile, writeInputFile, waitForOutputFileCreation, waitForOutputFileChange, } = require('../../io')({ output: 'dist', input: 'src' }) describe('static build', () => { it('should be possible to generate tailwind output', async () => { await writeInputFile('index.html', html`
`) await $('node ../../lib/cli.js -i ./src/index.css -o ./dist/main.css', { env: { NODE_ENV: 'production' }, }) expect(await readOutputFile('main.css')).toIncludeCss( css` .font-bold { font-weight: 700; } ` ) }) it('should safelist a list of classes to always include', async () => { await writeInputFile('index.html', html``) await writeInputFile( '../tailwind.config.js', javascript` module.exports = { content: { content: ['./src/index.html'], safelist: ['bg-red-500','bg-red-600'] }, theme: { extend: { }, }, corePlugins: { preflight: false, }, plugins: [], } ` ) $('node ../../lib/cli.js -i ./src/index.css -o ./dist/main.css', { env: { NODE_ENV: 'production' }, }) await waitForOutputFileCreation('main.css') expect(await readOutputFile('main.css')).toIncludeCss( css` .bg-red-500 { --tw-bg-opacity: 1; background-color: rgba(239, 68, 68, var(--tw-bg-opacity)); } .bg-red-600 { --tw-bg-opacity: 1; background-color: rgba(220, 38, 38, var(--tw-bg-opacity)); } .font-bold { font-weight: 700; } ` ) }) }) describe('watcher', () => { test('classes are generated when the html file changes', async () => { await writeInputFile('index.html', html``) let runningProcess = $('node ../../lib/cli.js -i ./src/index.css -o ./dist/main.css -w') await waitForOutputFileCreation('main.css') expect(await readOutputFile('main.css')).toIncludeCss( css` .font-bold { font-weight: 700; } ` ) await waitForOutputFileChange('main.css', async () => { await appendToInputFile('index.html', html``) }) expect(await readOutputFile('main.css')).toIncludeCss( css` .font-bold { font-weight: 700; } .font-normal { font-weight: 400; } ` ) await waitForOutputFileChange('main.css', async () => { await appendToInputFile('index.html', html``) }) expect(await readOutputFile('main.css')).toIncludeCss( css` .bg-red-500 { --tw-bg-opacity: 1; background-color: rgba(239, 68, 68, var(--tw-bg-opacity)); } .font-bold { font-weight: 700; } .font-normal { font-weight: 400; } ` ) return runningProcess.stop() }) test('@layers are replaced and cleaned when the html file changes', async () => { await writeInputFile('index.html', html``) await writeInputFile( 'index.css', css` @tailwind base; @tailwind components; @tailwind utilities; @layer base { html { scroll-behavior: smooth; } } ` ) let runningProcess = $('node ../../lib/cli.js -i ./src/index.css -o ./dist/main.css -w') await waitForOutputFileCreation('main.css') expect(await readOutputFile('main.css')).toIncludeCss( css` .font-bold { font-weight: 700; } ` ) await waitForOutputFileChange('main.css', async () => { await appendToInputFile('index.html', html``) }) expect(await readOutputFile('main.css')).not.toIncludeCss(css` @layer base { html { scroll-behavior: smooth; } } `) expect(await readOutputFile('main.css')).toIncludeCss( css` .font-bold { font-weight: 700; } .font-normal { font-weight: 400; } ` ) return runningProcess.stop() }) test('classes are generated when the tailwind.config.js file changes', async () => { await writeInputFile('index.html', html``) let runningProcess = $('node ../../lib/cli.js -i ./src/index.css -o ./dist/main.css -w') await waitForOutputFileCreation('main.css') expect(await readOutputFile('main.css')).toIncludeCss( css` .font-bold { font-weight: 700; } @media (min-width: 768px) { .md\\:font-medium { font-weight: 500; } } ` ) await waitForOutputFileChange('main.css', async () => { await writeInputFile( '../tailwind.config.js', javascript` module.exports = { content: ['./src/index.html'], theme: { extend: { screens: { md: '800px' }, fontWeight: { bold: 'bold' } }, }, corePlugins: { preflight: false, }, plugins: [], } ` ) }) expect(await readOutputFile('main.css')).toIncludeCss( css` .font-bold { font-weight: bold; } @media (min-width: 800px) { .md\\:font-medium { font-weight: 500; } } ` ) return runningProcess.stop() }) test('classes are generated when the index.css file changes', async () => { await writeInputFile('index.html', html``) let runningProcess = $('node ../../lib/cli.js -i ./src/index.css -o ./dist/main.css -w') await waitForOutputFileCreation('main.css') expect(await readOutputFile('main.css')).toIncludeCss( css` .font-bold { font-weight: 700; } ` ) await waitForOutputFileChange('main.css', async () => { await writeInputFile( 'index.css', css` @tailwind base; @tailwind components; @tailwind utilities; @layer components { .btn { @apply px-2 py-1 rounded; } } ` ) }) expect(await readOutputFile('main.css')).toIncludeCss( css` .btn { border-radius: 0.25rem; padding-left: 0.5rem; padding-right: 0.5rem; padding-top: 0.25rem; padding-bottom: 0.25rem; } .font-bold { font-weight: 700; } ` ) await waitForOutputFileChange('main.css', async () => { await writeInputFile( 'index.css', css` @tailwind base; @tailwind components; @tailwind utilities; @layer components { .btn { @apply px-2 py-1 rounded bg-red-500; } } ` ) }) expect(await readOutputFile('main.css')).toIncludeCss( css` .btn { border-radius: 0.25rem; --tw-bg-opacity: 1; background-color: rgba(239, 68, 68, var(--tw-bg-opacity)); padding-left: 0.5rem; padding-right: 0.5rem; padding-top: 0.25rem; padding-bottom: 0.25rem; } .font-bold { font-weight: 700; } ` ) return runningProcess.stop() }) })