Repository: tailwindlabs/tailwindcss
Pull request #5526 (2021-09-17 10:38:22)

Improve public API
This PR introduces a `public` folder inside the `src` folder. The idea here is that the files inside the `./src/public` folder will eventually be "public" API. The files inside the `./src/public` folder are written in `ESM`. This means that internally if we need those public files, we can then include them from there.
The files in the root will include them from the compiled `./lib/public` folder.

The advantage here is:
- We don't need to compile/transpile the code before running tests anymore, we can just run them.
  - Little caveat: We do still need to generate the plugin list, but that's located in a `pretest` script now, so you don't need to think about that!
- There is a clear set of files that will be exposed for public use. The vscode extension for example uses a few of those files already. This means that we technically only have to worry about backwards compatibility for these files without looking at the entire internet to see who is using private API's.


Patch:
diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml
index 1352e8bf..3fdea06c 100644
--- a/.github/workflows/nodejs.yml
+++ b/.github/workflows/nodejs.yml
@@ -23,12 +23,13 @@ jobs:
         uses: actions/setup-node@v2
         with:
           node-version: ${{ matrix.node-version }}
+
       - name: Use cached node_modules
         id: cache
         uses: actions/cache@v2
         with:
           path: node_modules
-          key: nodeModules-${{ hashFiles('**/package-lock.json') }}-${{ matrix.node-version }}
+          key: nodeModules-${{ hashFiles('./package-lock.json') }}-${{ matrix.node-version }}
           restore-keys: |
             nodeModules-
       - name: Install dependencies
@@ -36,7 +37,8 @@ jobs:
         run: npm install
         env:
           CI: true
-      - run: npm run prepublishOnly
-      - run: npm test
+
+      - name: Test
+        run: npm test
         env:
           CI: true
diff --git a/.github/workflows/release-insiders.yml b/.github/workflows/release-insiders.yml
index 1b169de6..bc7b345b 100644
--- a/.github/workflows/release-insiders.yml
+++ b/.github/workflows/release-insiders.yml
@@ -36,9 +36,6 @@ jobs:
         env:
           CI: true
 
-      - name: Build
-        run: npm run prepublishOnly
-
       - name: Test
         run: npm test
         env:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 9264558c..a5bb7c2f 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -36,9 +36,6 @@ jobs:
         env:
           CI: true
 
-      - name: Build
-        run: npm run prepublishOnly
-
       - name: Test
         run: npm test
         env:
diff --git a/colors.js b/colors.js
index e609e381..90e56afe 100644
--- a/colors.js
+++ b/colors.js
@@ -1,304 +1,1 @@
-const log = require('./lib/util/log').default
-
-let warned = []
-
-function warn({ version, from, to }) {
-  if (!warned.includes(from)) {
-    log.warn([
-      `As of Tailwind CSS ${version}, \`${from}\` has been renamed to \`${to}\`.`,
-      'Please update your color palette to eliminate this warning.',
-    ])
-    warned.push(from)
-  }
-}
-
-module.exports = {
-  transparent: 'transparent',
-  current: 'currentColor',
-  black: '#000',
-  white: '#fff',
-  slate: {
-    50: '#f8fafc',
-    100: '#f1f5f9',
-    200: '#e2e8f0',
-    300: '#cbd5e1',
-    400: '#94a3b8',
-    500: '#64748b',
-    600: '#475569',
-    700: '#334155',
-    800: '#1e293b',
-    900: '#0f172a',
-  },
-  gray: {
-    50: '#f9fafb',
-    100: '#f3f4f6',
-    200: '#e5e7eb',
-    300: '#d1d5db',
-    400: '#9ca3af',
-    500: '#6b7280',
-    600: '#4b5563',
-    700: '#374151',
-    800: '#1f2937',
-    900: '#111827',
-  },
-  zinc: {
-    50: '#fafafa',
-    100: '#f4f4f5',
-    200: '#e4e4e7',
-    300: '#d4d4d8',
-    400: '#a1a1aa',
-    500: '#71717a',
-    600: '#52525b',
-    700: '#3f3f46',
-    800: '#27272a',
-    900: '#18181b',
-  },
-  neutral: {
-    50: '#fafafa',
-    100: '#f5f5f5',
-    200: '#e5e5e5',
-    300: '#d4d4d4',
-    400: '#a3a3a3',
-    500: '#737373',
-    600: '#525252',
-    700: '#404040',
-    800: '#262626',
-    900: '#171717',
-  },
-  stone: {
-    50: '#fafaf9',
-    100: '#f5f5f4',
-    200: '#e7e5e4',
-    300: '#d6d3d1',
-    400: '#a8a29e',
-    500: '#78716c',
-    600: '#57534e',
-    700: '#44403c',
-    800: '#292524',
-    900: '#1c1917',
-  },
-  red: {
-    50: '#fef2f2',
-    100: '#fee2e2',
-    200: '#fecaca',
-    300: '#fca5a5',
-    400: '#f87171',
-    500: '#ef4444',
-    600: '#dc2626',
-    700: '#b91c1c',
-    800: '#991b1b',
-    900: '#7f1d1d',
-  },
-  orange: {
-    50: '#fff7ed',
-    100: '#ffedd5',
-    200: '#fed7aa',
-    300: '#fdba74',
-    400: '#fb923c',
-    500: '#f97316',
-    600: '#ea580c',
-    700: '#c2410c',
-    800: '#9a3412',
-    900: '#7c2d12',
-  },
-  amber: {
-    50: '#fffbeb',
-    100: '#fef3c7',
-    200: '#fde68a',
-    300: '#fcd34d',
-    400: '#fbbf24',
-    500: '#f59e0b',
-    600: '#d97706',
-    700: '#b45309',
-    800: '#92400e',
-    900: '#78350f',
-  },
-  yellow: {
-    50: '#fefce8',
-    100: '#fef9c3',
-    200: '#fef08a',
-    300: '#fde047',
-    400: '#facc15',
-    500: '#eab308',
-    600: '#ca8a04',
-    700: '#a16207',
-    800: '#854d0e',
-    900: '#713f12',
-  },
-  lime: {
-    50: '#f7fee7',
-    100: '#ecfccb',
-    200: '#d9f99d',
-    300: '#bef264',
-    400: '#a3e635',
-    500: '#84cc16',
-    600: '#65a30d',
-    700: '#4d7c0f',
-    800: '#3f6212',
-    900: '#365314',
-  },
-  green: {
-    50: '#f0fdf4',
-    100: '#dcfce7',
-    200: '#bbf7d0',
-    300: '#86efac',
-    400: '#4ade80',
-    500: '#22c55e',
-    600: '#16a34a',
-    700: '#15803d',
-    800: '#166534',
-    900: '#14532d',
-  },
-  emerald: {
-    50: '#ecfdf5',
-    100: '#d1fae5',
-    200: '#a7f3d0',
-    300: '#6ee7b7',
-    400: '#34d399',
-    500: '#10b981',
-    600: '#059669',
-    700: '#047857',
-    800: '#065f46',
-    900: '#064e3b',
-  },
-  teal: {
-    50: '#f0fdfa',
-    100: '#ccfbf1',
-    200: '#99f6e4',
-    300: '#5eead4',
-    400: '#2dd4bf',
-    500: '#14b8a6',
-    600: '#0d9488',
-    700: '#0f766e',
-    800: '#115e59',
-    900: '#134e4a',
-  },
-  cyan: {
-    50: '#ecfeff',
-    100: '#cffafe',
-    200: '#a5f3fc',
-    300: '#67e8f9',
-    400: '#22d3ee',
-    500: '#06b6d4',
-    600: '#0891b2',
-    700: '#0e7490',
-    800: '#155e75',
-    900: '#164e63',
-  },
-  sky: {
-    50: '#f0f9ff',
-    100: '#e0f2fe',
-    200: '#bae6fd',
-    300: '#7dd3fc',
-    400: '#38bdf8',
-    500: '#0ea5e9',
-    600: '#0284c7',
-    700: '#0369a1',
-    800: '#075985',
-    900: '#0c4a6e',
-  },
-  blue: {
-    50: '#eff6ff',
-    100: '#dbeafe',
-    200: '#bfdbfe',
-    300: '#93c5fd',
-    400: '#60a5fa',
-    500: '#3b82f6',
-    600: '#2563eb',
-    700: '#1d4ed8',
-    800: '#1e40af',
-    900: '#1e3a8a',
-  },
-  indigo: {
-    50: '#eef2ff',
-    100: '#e0e7ff',
-    200: '#c7d2fe',
-    300: '#a5b4fc',
-    400: '#818cf8',
-    500: '#6366f1',
-    600: '#4f46e5',
-    700: '#4338ca',
-    800: '#3730a3',
-    900: '#312e81',
-  },
-  violet: {
-    50: '#f5f3ff',
-    100: '#ede9fe',
-    200: '#ddd6fe',
-    300: '#c4b5fd',
-    400: '#a78bfa',
-    500: '#8b5cf6',
-    600: '#7c3aed',
-    700: '#6d28d9',
-    800: '#5b21b6',
-    900: '#4c1d95',
-  },
-  purple: {
-    50: '#faf5ff',
-    100: '#f3e8ff',
-    200: '#e9d5ff',
-    300: '#d8b4fe',
-    400: '#c084fc',
-    500: '#a855f7',
-    600: '#9333ea',
-    700: '#7e22ce',
-    800: '#6b21a8',
-    900: '#581c87',
-  },
-  fuchsia: {
-    50: '#fdf4ff',
-    100: '#fae8ff',
-    200: '#f5d0fe',
-    300: '#f0abfc',
-    400: '#e879f9',
-    500: '#d946ef',
-    600: '#c026d3',
-    700: '#a21caf',
-    800: '#86198f',
-    900: '#701a75',
-  },
-  pink: {
-    50: '#fdf2f8',
-    100: '#fce7f3',
-    200: '#fbcfe8',
-    300: '#f9a8d4',
-    400: '#f472b6',
-    500: '#ec4899',
-    600: '#db2777',
-    700: '#be185d',
-    800: '#9d174d',
-    900: '#831843',
-  },
-  rose: {
-    50: '#fff1f2',
-    100: '#ffe4e6',
-    200: '#fecdd3',
-    300: '#fda4af',
-    400: '#fb7185',
-    500: '#f43f5e',
-    600: '#e11d48',
-    700: '#be123c',
-    800: '#9f1239',
-    900: '#881337',
-  },
-  get lightBlue() {
-    warn({ version: 'v2.2', from: 'lightBlue', to: 'sky' })
-    return this.sky
-  },
-  get warmGray() {
-    warn({ version: 'v3.0', from: 'warmGray', to: 'stone' })
-    return this.stone
-  },
-  get trueGray() {
-    warn({ version: 'v3.0', from: 'trueGray', to: 'neutral' })
-    return this.neutral
-  },
-  get coolGray() {
-    warn({ version: 'v3.0', from: 'coolGray', to: 'gray' })
-    return this.gray
-  },
-  get blueGray() {
-    warn({ version: 'v3.0', from: 'blueGray', to: 'slate' })
-    return this.slate
-  },
-}
+module.exports = require('./lib/public/colors').default
diff --git a/defaultConfig.js b/defaultConfig.js
index fb691d3a..2e5ac68d 100644
--- a/defaultConfig.js
+++ b/defaultConfig.js
@@ -1,4 +1,1 @@
-let { cloneDeep } = require('./lib/util/cloneDeep')
-let defaultConfig = require('./stubs/defaultConfig.stub.js')
-
-module.exports = cloneDeep(defaultConfig)
+module.exports = require('./lib/public/default-config').default
diff --git a/defaultTheme.js b/defaultTheme.js
index ee7282c1..491e6437 100644
--- a/defaultTheme.js
+++ b/defaultTheme.js
@@ -1,4 +1,1 @@
-let { cloneDeep } = require('./lib/util/cloneDeep')
-let defaultConfig = require('./stubs/defaultConfig.stub.js')
-
-module.exports = cloneDeep(defaultConfig.theme)
+module.exports = require('./lib/public/default-theme').default
diff --git a/package-lock.json b/package-lock.json
index ed3f4363..b48b53a1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -40,7 +40,6 @@
         "@swc/core": "^1.2.90",
         "@swc/jest": "^0.1.5",
         "@swc/register": "^0.1.7",
-        "@tailwindcss/aspect-ratio": "^0.2.1",
         "autoprefixer": "^10.3.3",
         "cross-env": "^7.0.3",
         "cssnano": "^5.0.8",
@@ -1738,15 +1737,6 @@
         "@swc/core": "^1.0.46"
       }
     },
-    "node_modules/@tailwindcss/aspect-ratio": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.2.1.tgz",
-      "integrity": "sha512-aDFi80aHQ3JM3symJ5iKU70lm151ugIGFCI0yRZGpyjgQSDS+Fbe93QwypC1tCEllQE8p0S7TUu20ih1b9IKLA==",
-      "dev": true,
-      "peerDependencies": {
-        "tailwindcss": ">=2.0.0"
-      }
-    },
     "node_modules/@tootallnate/once": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
@@ -8752,13 +8742,6 @@
         "source-map-support": "^0.5.13"
       }
     },
-    "@tailwindcss/aspect-ratio": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.2.1.tgz",
-      "integrity": "sha512-aDFi80aHQ3JM3symJ5iKU70lm151ugIGFCI0yRZGpyjgQSDS+Fbe93QwypC1tCEllQE8p0S7TUu20ih1b9IKLA==",
-      "dev": true,
-      "requires": {}
-    },
     "@tootallnate/once": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
diff --git a/package.json b/package.json
index 9e59b222..eb3d9b33 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
     "rebuild-fixtures": "npm run swcify && node -r @swc/register scripts/rebuildFixtures.js",
     "prepublishOnly": "npm install --force && npm run swcify",
     "style": "eslint .",
+    "pretest": "npm run generate:plugin-list",
     "test": "cross-env TAILWIND_MODE=build jest",
     "test:integrations": "npm run test --prefix ./integrations",
     "install:integrations": "node scripts/install-integrations.js",
@@ -46,7 +47,6 @@
     "@swc/core": "^1.2.90",
     "@swc/jest": "^0.1.5",
     "@swc/register": "^0.1.7",
-    "@tailwindcss/aspect-ratio": "^0.2.1",
     "autoprefixer": "^10.3.3",
     "cross-env": "^7.0.3",
     "cssnano": "^5.0.8",
diff --git a/plugin.js b/plugin.js
index 5ed54695..7c2db080 100644
--- a/plugin.js
+++ b/plugin.js
@@ -1,3 +1,1 @@
-const createPlugin = require('./lib/util/createPlugin')
-
-module.exports = (createPlugin.__esModule ? createPlugin : { default: createPlugin }).default
+module.exports = require('./lib/public/create-plugin').default
diff --git a/resolveConfig.js b/resolveConfig.js
index 6fb5c15f..222e4ed4 100644
--- a/resolveConfig.js
+++ b/resolveConfig.js
@@ -1,7 +1,1 @@
-const resolveConfigObjects = require('./lib/util/resolveConfig').default
-const getAllConfigs = require('./lib/util/getAllConfigs').default
-
-module.exports = function resolveConfig(...configs) {
-  const [, ...defaultConfigs] = getAllConfigs(configs[0])
-  return resolveConfigObjects([...configs, ...defaultConfigs])
-}
+module.exports = require('./lib/public/resolve-config').default
diff --git a/src/lib/setupTrackingContext.js b/src/lib/setupTrackingContext.js
index 9b1e71ec..3144dd48 100644
--- a/src/lib/setupTrackingContext.js
+++ b/src/lib/setupTrackingContext.js
@@ -8,7 +8,7 @@ import normalizePath from 'normalize-path'
 import hash from '../util/hashConfig'
 import getModuleDependencies from '../lib/getModuleDependencies'
 
-import resolveConfig from '../../resolveConfig'
+import resolveConfig from '../public/resolve-config'
 
 import resolveConfigPath from '../util/resolveConfigPath'
 
diff --git a/src/lib/setupWatchingContext.js b/src/lib/setupWatchingContext.js
index 1eeeb11c..e55eee90 100644
--- a/src/lib/setupWatchingContext.js
+++ b/src/lib/setupWatchingContext.js
@@ -10,7 +10,7 @@ import normalizePath from 'normalize-path'
 import hash from '../util/hashConfig'
 import log from '../util/log'
 import getModuleDependencies from '../lib/getModuleDependencies'
-import resolveConfig from '../../resolveConfig'
+import resolveConfig from '../public/resolve-config'
 import resolveConfigPath from '../util/resolveConfigPath'
 import { getContext } from './setupContextUtils'
 
diff --git a/src/public/colors.js b/src/public/colors.js
new file mode 100644
index 00000000..89f7136d
--- /dev/null
+++ b/src/public/colors.js
@@ -0,0 +1,304 @@
+import log from '../util/log'
+
+let warned = []
+
+function warn({ version, from, to }) {
+  if (!warned.includes(from)) {
+    log.warn([
+      `As of Tailwind CSS ${version}, \`${from}\` has been renamed to \`${to}\`.`,
+      'Please update your color palette to eliminate this warning.',
+    ])
+    warned.push(from)
+  }
+}
+
+export default {
+  transparent: 'transparent',
+  current: 'currentColor',
+  black: '#000',
+  white: '#fff',
+  slate: {
+    50: '#f8fafc',
+    100: '#f1f5f9',
+    200: '#e2e8f0',
+    300: '#cbd5e1',
+    400: '#94a3b8',
+    500: '#64748b',
+    600: '#475569',
+    700: '#334155',
+    800: '#1e293b',
+    900: '#0f172a',
+  },
+  gray: {
+    50: '#f9fafb',
+    100: '#f3f4f6',
+    200: '#e5e7eb',
+    300: '#d1d5db',
+    400: '#9ca3af',
+    500: '#6b7280',
+    600: '#4b5563',
+    700: '#374151',
+    800: '#1f2937',
+    900: '#111827',
+  },
+  zinc: {
+    50: '#fafafa',
+    100: '#f4f4f5',
+    200: '#e4e4e7',
+    300: '#d4d4d8',
+    400: '#a1a1aa',
+    500: '#71717a',
+    600: '#52525b',
+    700: '#3f3f46',
+    800: '#27272a',
+    900: '#18181b',
+  },
+  neutral: {
+    50: '#fafafa',
+    100: '#f5f5f5',
+    200: '#e5e5e5',
+    300: '#d4d4d4',
+    400: '#a3a3a3',
+    500: '#737373',
+    600: '#525252',
+    700: '#404040',
+    800: '#262626',
+    900: '#171717',
+  },
+  stone: {
+    50: '#fafaf9',
+    100: '#f5f5f4',
+    200: '#e7e5e4',
+    300: '#d6d3d1',
+    400: '#a8a29e',
+    500: '#78716c',
+    600: '#57534e',
+    700: '#44403c',
+    800: '#292524',
+    900: '#1c1917',
+  },
+  red: {
+    50: '#fef2f2',
+    100: '#fee2e2',
+    200: '#fecaca',
+    300: '#fca5a5',
+    400: '#f87171',
+    500: '#ef4444',
+    600: '#dc2626',
+    700: '#b91c1c',
+    800: '#991b1b',
+    900: '#7f1d1d',
+  },
+  orange: {
+    50: '#fff7ed',
+    100: '#ffedd5',
+    200: '#fed7aa',
+    300: '#fdba74',
+    400: '#fb923c',
+    500: '#f97316',
+    600: '#ea580c',
+    700: '#c2410c',
+    800: '#9a3412',
+    900: '#7c2d12',
+  },
+  amber: {
+    50: '#fffbeb',
+    100: '#fef3c7',
+    200: '#fde68a',
+    300: '#fcd34d',
+    400: '#fbbf24',
+    500: '#f59e0b',
+    600: '#d97706',
+    700: '#b45309',
+    800: '#92400e',
+    900: '#78350f',
+  },
+  yellow: {
+    50: '#fefce8',
+    100: '#fef9c3',
+    200: '#fef08a',
+    300: '#fde047',
+    400: '#facc15',
+    500: '#eab308',
+    600: '#ca8a04',
+    700: '#a16207',
+    800: '#854d0e',
+    900: '#713f12',
+  },
+  lime: {
+    50: '#f7fee7',
+    100: '#ecfccb',
+    200: '#d9f99d',
+    300: '#bef264',
+    400: '#a3e635',
+    500: '#84cc16',
+    600: '#65a30d',
+    700: '#4d7c0f',
+    800: '#3f6212',
+    900: '#365314',
+  },
+  green: {
+    50: '#f0fdf4',
+    100: '#dcfce7',
+    200: '#bbf7d0',
+    300: '#86efac',
+    400: '#4ade80',
+    500: '#22c55e',
+    600: '#16a34a',
+    700: '#15803d',
+    800: '#166534',
+    900: '#14532d',
+  },
+  emerald: {
+    50: '#ecfdf5',
+    100: '#d1fae5',
+    200: '#a7f3d0',
+    300: '#6ee7b7',
+    400: '#34d399',
+    500: '#10b981',
+    600: '#059669',
+    700: '#047857',
+    800: '#065f46',
+    900: '#064e3b',
+  },
+  teal: {
+    50: '#f0fdfa',
+    100: '#ccfbf1',
+    200: '#99f6e4',
+    300: '#5eead4',
+    400: '#2dd4bf',
+    500: '#14b8a6',
+    600: '#0d9488',
+    700: '#0f766e',
+    800: '#115e59',
+    900: '#134e4a',
+  },
+  cyan: {
+    50: '#ecfeff',
+    100: '#cffafe',
+    200: '#a5f3fc',
+    300: '#67e8f9',
+    400: '#22d3ee',
+    500: '#06b6d4',
+    600: '#0891b2',
+    700: '#0e7490',
+    800: '#155e75',
+    900: '#164e63',
+  },
+  sky: {
+    50: '#f0f9ff',
+    100: '#e0f2fe',
+    200: '#bae6fd',
+    300: '#7dd3fc',
+    400: '#38bdf8',
+    500: '#0ea5e9',
+    600: '#0284c7',
+    700: '#0369a1',
+    800: '#075985',
+    900: '#0c4a6e',
+  },
+  blue: {
+    50: '#eff6ff',
+    100: '#dbeafe',
+    200: '#bfdbfe',
+    300: '#93c5fd',
+    400: '#60a5fa',
+    500: '#3b82f6',
+    600: '#2563eb',
+    700: '#1d4ed8',
+    800: '#1e40af',
+    900: '#1e3a8a',
+  },
+  indigo: {
+    50: '#eef2ff',
+    100: '#e0e7ff',
+    200: '#c7d2fe',
+    300: '#a5b4fc',
+    400: '#818cf8',
+    500: '#6366f1',
+    600: '#4f46e5',
+    700: '#4338ca',
+    800: '#3730a3',
+    900: '#312e81',
+  },
+  violet: {
+    50: '#f5f3ff',
+    100: '#ede9fe',
+    200: '#ddd6fe',
+    300: '#c4b5fd',
+    400: '#a78bfa',
+    500: '#8b5cf6',
+    600: '#7c3aed',
+    700: '#6d28d9',
+    800: '#5b21b6',
+    900: '#4c1d95',
+  },
+  purple: {
+    50: '#faf5ff',
+    100: '#f3e8ff',
+    200: '#e9d5ff',
+    300: '#d8b4fe',
+    400: '#c084fc',
+    500: '#a855f7',
+    600: '#9333ea',
+    700: '#7e22ce',
+    800: '#6b21a8',
+    900: '#581c87',
+  },
+  fuchsia: {
+    50: '#fdf4ff',
+    100: '#fae8ff',
+    200: '#f5d0fe',
+    300: '#f0abfc',
+    400: '#e879f9',
+    500: '#d946ef',
+    600: '#c026d3',
+    700: '#a21caf',
+    800: '#86198f',
+    900: '#701a75',
+  },
+  pink: {
+    50: '#fdf2f8',
+    100: '#fce7f3',
+    200: '#fbcfe8',
+    300: '#f9a8d4',
+    400: '#f472b6',
+    500: '#ec4899',
+    600: '#db2777',
+    700: '#be185d',
+    800: '#9d174d',
+    900: '#831843',
+  },
+  rose: {
+    50: '#fff1f2',
+    100: '#ffe4e6',
+    200: '#fecdd3',
+    300: '#fda4af',
+    400: '#fb7185',
+    500: '#f43f5e',
+    600: '#e11d48',
+    700: '#be123c',
+    800: '#9f1239',
+    900: '#881337',
+  },
+  get lightBlue() {
+    warn({ version: 'v2.2', from: 'lightBlue', to: 'sky' })
+    return this.sky
+  },
+  get warmGray() {
+    warn({ version: 'v3.0', from: 'warmGray', to: 'stone' })
+    return this.stone
+  },
+  get trueGray() {
+    warn({ version: 'v3.0', from: 'trueGray', to: 'neutral' })
+    return this.neutral
+  },
+  get coolGray() {
+    warn({ version: 'v3.0', from: 'coolGray', to: 'gray' })
+    return this.gray
+  },
+  get blueGray() {
+    warn({ version: 'v3.0', from: 'blueGray', to: 'slate' })
+    return this.slate
+  },
+}
diff --git a/src/public/create-plugin.js b/src/public/create-plugin.js
new file mode 100644
index 00000000..4124fc38
--- /dev/null
+++ b/src/public/create-plugin.js
@@ -0,0 +1,2 @@
+import createPlugin from '../util/createPlugin'
+export default createPlugin
diff --git a/src/public/default-config.js b/src/public/default-config.js
new file mode 100644
index 00000000..78dc69c1
--- /dev/null
+++ b/src/public/default-config.js
@@ -0,0 +1,4 @@
+import { cloneDeep } from '../util/cloneDeep'
+import defaultConfig from '../../stubs/defaultConfig.stub'
+
+export default cloneDeep(defaultConfig)
diff --git a/src/public/default-theme.js b/src/public/default-theme.js
new file mode 100644
index 00000000..dc2400c3
--- /dev/null
+++ b/src/public/default-theme.js
@@ -0,0 +1,4 @@
+import { cloneDeep } from '../util/cloneDeep'
+import defaultConfig from '../../stubs/defaultConfig.stub'
+
+export default cloneDeep(defaultConfig.theme)
diff --git a/src/public/resolve-config.js b/src/public/resolve-config.js
new file mode 100644
index 00000000..891d90a9
--- /dev/null
+++ b/src/public/resolve-config.js
@@ -0,0 +1,7 @@
+import resolveConfigObjects from '../util/resolveConfig'
+import getAllConfigs from '../util/getAllConfigs'
+
+export default function resolveConfig(...configs) {
+  let [, ...defaultConfigs] = getAllConfigs(configs[0])
+  return resolveConfigObjects([...configs, ...defaultConfigs])
+}
diff --git a/src/util/resolveConfig.js b/src/util/resolveConfig.js
index 27132b48..f3781f54 100644
--- a/src/util/resolveConfig.js
+++ b/src/util/resolveConfig.js
@@ -2,7 +2,7 @@ import negateValue from './negateValue'
 import corePluginList from '../corePluginList'
 import configurePlugins from './configurePlugins'
 import defaultConfig from '../../stubs/defaultConfig.stub'
-import colors from '../../colors'
+import colors from '../public/colors'
 import log from './log'
 import { defaults } from './defaults'
 import { toPath } from './toPath'


Test patch:
diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index 7e314924..d2651532 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -27,7 +27,7 @@ jobs:
         uses: actions/cache@v2
         with:
           path: node_modules
-          key: nodeModules-${{ hashFiles('**/package-lock.json') }}-${{ matrix.node-version }}-tailwindcss
+          key: nodeModules-${{ hashFiles('./package-lock.json') }}-${{ matrix.node-version }}-tailwindcss
           restore-keys: |
             nodeModules-
 
@@ -45,7 +45,7 @@ jobs:
         uses: actions/cache@v2
         with:
           path: ./integrations/**/node_modules
-          key: nodeModules-${{ hashFiles('**/package-lock.json') }}-${{ matrix.node-version }}-${{ matrix.integration }}-integrations
+          key: nodeModules-${{ hashFiles('./integrations/**/package-lock.json') }}-${{ matrix.node-version }}-${{ matrix.integration }}-integrations
           restore-keys: |
             nodeModules-
 
diff --git a/tests/completions.test.js b/tests/completions.test.js
index b854f7b5..0a259c8e 100644
--- a/tests/completions.test.js
+++ b/tests/completions.test.js
@@ -1,4 +1,4 @@
-import resolveConfig from '../resolveConfig'
+import resolveConfig from '../src/public/resolve-config'
 import { createContext } from '../src/lib/setupContextUtils'
 
 it('should generate completions for every possible class, without variants', () => {
diff --git a/tests/custom-plugins.test.js b/tests/custom-plugins.test.js
index 4d52cd5f..7609a0fd 100644
--- a/tests/custom-plugins.test.js
+++ b/tests/custom-plugins.test.js
@@ -1,4 +1,4 @@
-import createPlugin from './../plugin'
+import createPlugin from '../src/public/create-plugin'
 import { run, html, css } from './util/run'
 
 test('plugins can create utilities with object syntax', () => {
diff --git a/tests/defaultConfig.test.js b/tests/defaultConfig.test.js
index c6ce1a6f..c52c51d3 100644
--- a/tests/defaultConfig.test.js
+++ b/tests/defaultConfig.test.js
@@ -1,4 +1,4 @@
-import config from '../defaultConfig.js'
+import config from '../src/public/default-config'
 import configStub from '../stubs/defaultConfig.stub.js'
 
 test('the default config matches the stub', () => {
diff --git a/tests/defaultTheme.test.js b/tests/defaultTheme.test.js
index b9091484..05efddaa 100644
--- a/tests/defaultTheme.test.js
+++ b/tests/defaultTheme.test.js
@@ -1,4 +1,4 @@
-import theme from '../defaultTheme.js'
+import theme from '../src/public/default-theme'
 import configStub from '../stubs/defaultConfig.stub.js'
 
 test('the default theme matches the stub', () => {
diff --git a/tests/kitchen-sink.test.css b/tests/kitchen-sink.test.css
index 22ec76eb..6de98168 100644
--- a/tests/kitchen-sink.test.css
+++ b/tests/kitchen-sink.test.css
@@ -188,61 +188,6 @@ div {
     max-width: 1536px;
   }
 }
-.aspect-w-1,
-.aspect-w-2,
-.aspect-w-3,
-.aspect-w-4,
-.aspect-w-5,
-.aspect-w-6,
-.aspect-w-7,
-.aspect-w-8,
-.aspect-w-9,
-.aspect-w-10,
-.aspect-w-11,
-.aspect-w-12,
-.aspect-w-13,
-.aspect-w-14,
-.aspect-w-15,
-.aspect-w-16 {
-  position: relative;
-  padding-bottom: calc(var(--tw-aspect-h) / var(--tw-aspect-w) * 100%);
-}
-.aspect-w-1 > *,
-.aspect-w-2 > *,
-.aspect-w-3 > *,
-.aspect-w-4 > *,
-.aspect-w-5 > *,
-.aspect-w-6 > *,
-.aspect-w-7 > *,
-.aspect-w-8 > *,
-.aspect-w-9 > *,
-.aspect-w-10 > *,
-.aspect-w-11 > *,
-.aspect-w-12 > *,
-.aspect-w-13 > *,
-.aspect-w-14 > *,
-.aspect-w-15 > *,
-.aspect-w-16 > * {
-  position: absolute;
-  height: 100%;
-  width: 100%;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-.aspect-w-1 {
-  --tw-aspect-w: 1;
-}
-.aspect-w-3 {
-  --tw-aspect-w: 3;
-}
-.aspect-h-2 {
-  --tw-aspect-h: 2;
-}
-.aspect-h-4 {
-  --tw-aspect-h: 4;
-}
 .test-apply-font-variant {
   --tw-ordinal: var(--tw-empty, /*!*/ /*!*/);
   --tw-slashed-zero: var(--tw-empty, /*!*/ /*!*/);
diff --git a/tests/kitchen-sink.test.js b/tests/kitchen-sink.test.js
index 1c4d5ec0..6fcbe0be 100644
--- a/tests/kitchen-sink.test.js
+++ b/tests/kitchen-sink.test.js
@@ -24,7 +24,6 @@ test('it works', () => {
       },
     },
     plugins: [
-      require('@tailwindcss/aspect-ratio'),
       function ({ addVariant }) {
         addVariant(
           'foo',