Repository: tailwindlabs/tailwindcss
Pull request #5379 (2021-09-03 12:18:14)

Port `@layer` tests from AOT to JIT mode


Patch:
diff --git a/src/util/resolveConfig.js b/src/util/resolveConfig.js
index ffb94d1a..c031b0ee 100644
--- a/src/util/resolveConfig.js
+++ b/src/util/resolveConfig.js
@@ -123,6 +123,12 @@ function resolveFunctionKeys(object) {
     return val === undefined ? defaultValue : val
   }
 
+  resolvePath.theme = resolvePath
+
+  for (let key in configUtils) {
+    resolvePath[key] = configUtils[key]
+  }
+
   return Object.keys(object).reduce((resolved, key) => {
     return {
       ...resolved,


Test patch:
diff --git a/tests/layer-at-rules.test.js b/tests/layer-at-rules.test.js
index ac89d178..2cb7c11b 100644
--- a/tests/layer-at-rules.test.js
+++ b/tests/layer-at-rules.test.js
@@ -49,3 +49,134 @@ test('custom user-land utilities', () => {
     `)
   })
 })
+
+test('layers are grouped and inserted at the matching @tailwind rule', () => {
+  let config = {
+    content: [
+      { raw: html`<div class="input btn card float-squirrel align-banana align-sandwich"></div>` },
+    ],
+    plugins: [
+      function ({ addBase, addComponents, addUtilities }) {
+        addBase({ body: { margin: 0 } })
+
+        addComponents({
+          '.input': { background: 'white' },
+        })
+
+        addUtilities({
+          '.float-squirrel': { float: 'squirrel' },
+        })
+      },
+    ],
+    corePlugins: { preflight: false },
+  }
+
+  let input = css`
+    @layer vanilla {
+      strong {
+        font-weight: medium;
+      }
+    }
+
+    @tailwind base;
+    @tailwind components;
+    @tailwind utilities;
+
+    @layer components {
+      .btn {
+        background: blue;
+      }
+    }
+
+    @layer utilities {
+      .align-banana {
+        text-align: banana;
+      }
+    }
+
+    @layer base {
+      h1 {
+        font-weight: bold;
+      }
+    }
+
+    @layer components {
+      .card {
+        border-radius: 12px;
+      }
+    }
+
+    @layer base {
+      p {
+        font-weight: normal;
+      }
+    }
+
+    @layer utilities {
+      .align-sandwich {
+        text-align: sandwich;
+      }
+    }
+
+    @layer chocolate {
+      a {
+        text-decoration: underline;
+      }
+    }
+  `
+
+  expect.assertions(2)
+
+  return run(input, config).then((result) => {
+    expect(result.warnings().length).toBe(0)
+    expect(result.css).toMatchFormattedCss(css`
+      @layer vanilla {
+        strong {
+          font-weight: medium;
+        }
+      }
+
+      body {
+        margin: 0;
+      }
+
+      h1 {
+        font-weight: bold;
+      }
+
+      p {
+        font-weight: normal;
+      }
+
+      .input {
+        background: white;
+      }
+
+      .btn {
+        background: blue;
+      }
+
+      .card {
+        border-radius: 12px;
+      }
+
+      .float-squirrel {
+        float: squirrel;
+      }
+
+      .align-banana {
+        text-align: banana;
+      }
+
+      .align-sandwich {
+        text-align: sandwich;
+      }
+
+      @layer chocolate {
+        a {
+          text-decoration: underline;
+        }
+      }
+    `)
+  })
+})
diff --git a/tests/resolveConfig.test.js b/tests/resolveConfig.test.js
index 0be4482f..bcba03bd 100644
--- a/tests/resolveConfig.test.js
+++ b/tests/resolveConfig.test.js
@@ -2215,3 +2215,62 @@ test('plugins are merged', () => {
     plugins: ['1', '2', '3'],
   })
 })
+
+test('all helpers can be destructured from the first function argument', () => {
+  const userConfig = {
+    theme: {
+      example: ({ theme, colors, negative, breakpoints }) => ({
+        weight: theme('fontWeight.bold'),
+        black: colors.black,
+        white: colors.white,
+        ...negative(theme('spacing')),
+        ...breakpoints(theme('screens')),
+      }),
+    },
+  }
+
+  const defaultConfig = {
+    prefix: '-',
+    important: false,
+    separator: ':',
+    theme: {
+      screens: {
+        sm: '640px',
+        md: '768px',
+      },
+      fontWeight: {
+        bold: 700,
+      },
+      spacing: {
+        0: '0px',
+        1: '1px',
+        2: '2px',
+        3: '3px',
+        4: '4px',
+      },
+    },
+    variants: {},
+  }
+
+  const result = resolveConfig([userConfig, defaultConfig])
+
+  expect(result).toMatchObject({
+    prefix: '-',
+    important: false,
+    separator: ':',
+    theme: {
+      example: {
+        weight: 700,
+        black: '#000',
+        white: '#fff',
+        '-1': '-1px',
+        '-2': '-2px',
+        '-3': '-3px',
+        '-4': '-4px',
+        'screen-sm': '640px',
+        'screen-md': '768px',
+      },
+    },
+    variants: {},
+  })
+})