Skip to content

Commit

Permalink
Support ESM and TS config files (#137)
Browse files Browse the repository at this point in the history
* add failing tests

* fix loading esm/ts configs

* Update ESM/TS support

---------

Co-authored-by: Brad Cornes <hello@bradley.dev>
  • Loading branch information
juliusmarminge and bradlc committed Mar 29, 2023
1 parent 6533049 commit 5cc0c7c
Show file tree
Hide file tree
Showing 22 changed files with 1,605 additions and 169 deletions.
419 changes: 262 additions & 157 deletions package-lock.json

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"build": "npm run _esbuild -- --minify",
"predev": "npm run _pre",
"dev": "npm run _esbuild -- --watch",
"pretest": "node scripts/install-fixture-deps.js",
"test": "jest",
"prepublishOnly": "npm run build && npm test && node scripts/copy-licenses.js",
"format": "prettier \"src/**/*.js\" \"scripts/**/*.js\" \"tests/test.js\" --write --print-width 100 --single-quote --no-semi --plugin-search-dir ./tests"
Expand All @@ -33,10 +34,10 @@
"@shufo/prettier-plugin-blade": "^1.8.4",
"@tailwindcss/line-clamp": "^0.3.0",
"@trivago/prettier-plugin-sort-imports": "^3.4.0",
"clear-module": "^4.1.2",
"cpy-cli": "^3.1.1",
"esbuild": "^0.14.11",
"escalade": "^3.1.1",
"import-fresh": "^3.3.0",
"import-from": "^4.0.0",
"import-sort-style-module": "^6.0.0",
"jest": "^27.4.7",
Expand All @@ -57,7 +58,7 @@
"recast": "^0.20.5",
"rimraf": "^3.0.2",
"svelte": "^3.55.0",
"tailwindcss": "^3.0.23"
"tailwindcss": "^3.3.0"
},
"peerDependencies": {
"@ianvs/prettier-plugin-sort-imports": "*",
Expand Down
12 changes: 12 additions & 0 deletions scripts/install-fixture-deps.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const fs = require('fs')
const path = require('path')
const { execSync } = require('child_process')

let fixturesDir = path.resolve(__dirname, '../tests/fixtures')
let fixtures = fs.readdirSync(fixturesDir).map((name) => path.join(fixturesDir, name))

for (let fixture of fixtures) {
if (fs.existsSync(path.join(fixture, 'package.json'))) {
execSync('npm install', { cwd: fixture })
}
}
39 changes: 29 additions & 10 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,16 @@ import prettierParserTypescript from 'prettier/parser-typescript'
import { createContext as createContextFallback } from 'tailwindcss/lib/lib/setupContextUtils'
import { generateRules as generateRulesFallback } from 'tailwindcss/lib/lib/generateRules'
import resolveConfigFallback from 'tailwindcss/resolveConfig'
import loadConfigFallback from 'tailwindcss/loadConfig'
import * as recast from 'recast'
import * as astTypes from 'ast-types'
import * as path from 'path'
import requireFrom from 'import-from'
import requireFresh from 'import-fresh'
import objectHash from 'object-hash'
import lineColumn from 'line-column'
import jsesc from 'jsesc'
import escalade from 'escalade/sync'
import clearModule from 'clear-module'

let base = getBasePlugins()

Expand Down Expand Up @@ -148,20 +149,36 @@ function createParser(parserFormat, transform) {
let resolveConfig = resolveConfigFallback
let createContext = createContextFallback
let generateRules = generateRulesFallback
let loadConfig = loadConfigFallback

let baseDir
let prettierConfigPath = prettier.resolveConfigFile.sync(options.filepath)

if (options.tailwindConfig) {
baseDir = prettierConfigPath ? path.dirname(prettierConfigPath) : process.cwd()
tailwindConfigPath = path.resolve(baseDir, options.tailwindConfig)
tailwindConfig = requireFresh(tailwindConfigPath)
} else {
baseDir = prettierConfigPath
? path.dirname(prettierConfigPath)
: options.filepath
? path.dirname(options.filepath)
: process.cwd()
}

try {
resolveConfig = requireFrom(baseDir, 'tailwindcss/resolveConfig')
createContext = requireFrom(baseDir, 'tailwindcss/lib/lib/setupContextUtils').createContext
generateRules = requireFrom(baseDir, 'tailwindcss/lib/lib/generateRules').generateRules

// Prior to `tailwindcss@3.3.0` this won't exist so we load it last
loadConfig = requireFrom(baseDir, 'tailwindcss/loadConfig')
} catch {}

if (options.tailwindConfig) {
tailwindConfigPath = path.resolve(baseDir, options.tailwindConfig)
clearModule(tailwindConfigPath)
const loadedConfig = loadConfig(tailwindConfigPath)
tailwindConfig = loadedConfig.default ?? loadedConfig
} else {
let configPath
try {
configPath = escalade(baseDir, (_dir, names) => {
Expand All @@ -171,20 +188,22 @@ function createParser(parserFormat, transform) {
if (names.includes('tailwind.config.cjs')) {
return 'tailwind.config.cjs'
}
if (names.includes('tailwind.config.mjs')) {
return 'tailwind.config.mjs'
}
if (names.includes('tailwind.config.ts')) {
return 'tailwind.config.ts'
}
})
} catch {}
if (configPath) {
tailwindConfigPath = configPath
tailwindConfig = requireFresh(configPath)
clearModule(tailwindConfigPath)
const loadedConfig = loadConfig(tailwindConfigPath)
tailwindConfig = loadedConfig.default ?? loadedConfig
}
}

try {
resolveConfig = requireFrom(baseDir, 'tailwindcss/resolveConfig')
createContext = requireFrom(baseDir, 'tailwindcss/lib/lib/setupContextUtils').createContext
generateRules = requireFrom(baseDir, 'tailwindcss/lib/lib/generateRules').generateRules
} catch {}

// suppress "empty content" warning
tailwindConfig.content = ['no-op']

Expand Down
9 changes: 9 additions & 0 deletions tests/fixtures/esm-explicit/config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export default {
theme: {
extend: {
colors: {
hotpink: "hotpink",
},
},
},
};
1 change: 1 addition & 0 deletions tests/fixtures/esm-explicit/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div class="sm:bg-hotpink bg-red-500"></div>
3 changes: 3 additions & 0 deletions tests/fixtures/esm-explicit/prettier.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
tailwindConfig: './config.mjs'
};
1 change: 1 addition & 0 deletions tests/fixtures/esm/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div class="sm:bg-hotpink bg-red-500"></div>
1 change: 1 addition & 0 deletions tests/fixtures/esm/prettier.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = {};
9 changes: 9 additions & 0 deletions tests/fixtures/esm/tailwind.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export default {
theme: {
extend: {
colors: {
hotpink: "hotpink",
},
},
},
};
12 changes: 12 additions & 0 deletions tests/fixtures/ts-explicit/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import type { Config } from "tailwindcss";

export default {
content: ["index.html"],
theme: {
extend: {
colors: {
hotpink: "hotpink",
},
},
},
} satisfies Config;
1 change: 1 addition & 0 deletions tests/fixtures/ts-explicit/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div class="sm:bg-hotpink bg-red-500"></div>
3 changes: 3 additions & 0 deletions tests/fixtures/ts-explicit/prettier.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
tailwindConfig: './config.ts'
};
1 change: 1 addition & 0 deletions tests/fixtures/ts/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div class="sm:bg-hotpink bg-red-500"></div>
1 change: 1 addition & 0 deletions tests/fixtures/ts/prettier.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = {};
12 changes: 12 additions & 0 deletions tests/fixtures/ts/tailwind.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import type { Config } from "tailwindcss";

export default {
content: ["index.html"],
theme: {
extend: {
colors: {
hotpink: "hotpink",
},
},
},
} satisfies Config;
1 change: 1 addition & 0 deletions tests/fixtures/v3-2/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div class="sm:bg-tomato bg-red-500"></div>

0 comments on commit 5cc0c7c

Please sign in to comment.