@@ -2,8 +2,6 @@ import extractClassNames from './extractClassNames'
2
2
import Hook from './hook'
3
3
import dlv from 'dlv'
4
4
import dset from 'dset'
5
- import resolveFrom from 'resolve-from'
6
- import importFrom from 'import-from'
7
5
import chokidar from 'chokidar'
8
6
import semver from 'semver'
9
7
import invariant from 'tiny-invariant'
@@ -15,6 +13,7 @@ import * as fs from 'fs'
15
13
import { getUtilityConfigMap } from './getUtilityConfigMap'
16
14
import glob from 'fast-glob'
17
15
import normalizePath from 'normalize-path'
16
+ import { withUserEnvironment } from './environment'
18
17
19
18
function arraysEqual ( arr1 , arr2 ) {
20
19
return (
@@ -31,12 +30,6 @@ export default async function getClassNames(
31
30
{ onChange = ( ) => { } } = { }
32
31
) {
33
32
async function run ( ) {
34
- let postcss
35
- let tailwindcss
36
- let browserslistModule
37
- let version
38
- let featureFlags = { future : [ ] , experimental : [ ] }
39
-
40
33
const configPaths = (
41
34
await glob ( CONFIG_GLOB , {
42
35
cwd,
@@ -53,21 +46,10 @@ export default async function getClassNames(
53
46
invariant ( configPaths . length > 0 , 'No Tailwind CSS config found.' )
54
47
const configPath = configPaths [ 0 ]
55
48
const configDir = path . dirname ( configPath )
56
- const tailwindBase = path . dirname (
57
- resolveFrom ( configDir , 'tailwindcss/package.json' )
58
- )
59
- postcss = importFrom ( tailwindBase , 'postcss' )
60
- tailwindcss = importFrom ( configDir , 'tailwindcss' )
61
- version = importFrom ( configDir , 'tailwindcss/package.json' ) . version
62
-
63
- try {
64
- // this is not required
65
- browserslistModule = importFrom ( tailwindBase , 'browserslist' )
66
- } catch ( _ ) { }
67
-
68
- try {
69
- featureFlags = importFrom ( tailwindBase , './lib/featureFlags.js' ) . default
70
- } catch ( _ ) { }
49
+ const {
50
+ version,
51
+ featureFlags = { future : [ ] , experimental : [ ] } ,
52
+ } = loadMeta ( configDir )
71
53
72
54
const sepLocation = semver . gte ( version , '0.99.0' )
73
55
? [ 'separator' ]
@@ -94,45 +76,68 @@ export default async function getClassNames(
94
76
95
77
hook . unwatch ( )
96
78
97
- let postcssResult
98
-
99
- try {
100
- postcssResult = await Promise . all (
101
- [
102
- semver . gte ( version , '0.99.0' ) ? 'base' : 'preflight' ,
103
- 'components' ,
104
- 'utilities' ,
105
- ] . map ( ( group ) =>
106
- postcss ( [ tailwindcss ( configPath ) ] ) . process ( `@tailwind ${ group } ;` , {
107
- from : undefined ,
108
- } )
109
- )
110
- )
111
- } catch ( error ) {
112
- throw error
113
- } finally {
114
- hook . unhook ( )
115
- }
116
-
117
- const [ base , components , utilities ] = postcssResult
118
-
119
- if ( typeof userSeperator !== 'undefined' ) {
120
- dset ( config , sepLocation , userSeperator )
121
- } else {
122
- delete config [ sepLocation ]
123
- }
124
- if ( typeof userPurge !== 'undefined' ) {
125
- config . purge = userPurge
126
- } else {
127
- delete config . purge
128
- }
129
-
130
- const resolvedConfig = resolveConfig ( { cwd : configDir , config } )
131
- const browserslist = browserslistModule
132
- ? browserslistModule ( undefined , {
133
- path : configDir ,
134
- } )
135
- : [ ]
79
+ const {
80
+ base,
81
+ components,
82
+ utilities,
83
+ resolvedConfig,
84
+ browserslist,
85
+ postcss,
86
+ } = await withPackages (
87
+ configDir ,
88
+ async ( { postcss, tailwindcss, browserslistModule } ) => {
89
+ let postcssResult
90
+ try {
91
+ postcssResult = await Promise . all (
92
+ [
93
+ semver . gte ( version , '0.99.0' ) ? 'base' : 'preflight' ,
94
+ 'components' ,
95
+ 'utilities' ,
96
+ ] . map ( ( group ) =>
97
+ postcss ( [ tailwindcss ( configPath ) ] ) . process (
98
+ `@tailwind ${ group } ;` ,
99
+ {
100
+ from : undefined ,
101
+ }
102
+ )
103
+ )
104
+ )
105
+ } catch ( error ) {
106
+ throw error
107
+ } finally {
108
+ hook . unhook ( )
109
+ }
110
+
111
+ const [ base , components , utilities ] = postcssResult
112
+
113
+ if ( typeof userSeperator !== 'undefined' ) {
114
+ dset ( config , sepLocation , userSeperator )
115
+ } else {
116
+ delete config [ sepLocation ]
117
+ }
118
+ if ( typeof userPurge !== 'undefined' ) {
119
+ config . purge = userPurge
120
+ } else {
121
+ delete config . purge
122
+ }
123
+
124
+ const resolvedConfig = resolveConfig ( { cwd : configDir , config } )
125
+ const browserslist = browserslistModule
126
+ ? browserslistModule ( undefined , {
127
+ path : configDir ,
128
+ } )
129
+ : [ ]
130
+
131
+ return {
132
+ base,
133
+ components,
134
+ utilities,
135
+ resolvedConfig,
136
+ postcss,
137
+ browserslist,
138
+ }
139
+ }
140
+ )
136
141
137
142
return {
138
143
version,
@@ -154,7 +159,6 @@ export default async function getClassNames(
154
159
browserslist,
155
160
} ) ,
156
161
modules : {
157
- tailwindcss,
158
162
postcss,
159
163
} ,
160
164
featureFlags,
@@ -193,11 +197,41 @@ export default async function getClassNames(
193
197
let result
194
198
try {
195
199
result = await run ( )
196
- } catch ( _ ) {
200
+ } catch ( e ) {
201
+ console . log ( e )
197
202
return null
198
203
}
199
204
200
205
watch ( [ result . configPath , ...result . dependencies ] )
201
206
202
207
return result
203
208
}
209
+
210
+ function loadMeta ( configDir ) {
211
+ return withUserEnvironment ( configDir , ( { require, resolve } ) => {
212
+ const version = require ( 'tailwindcss/package.json' ) . version
213
+ let featureFlags
214
+
215
+ try {
216
+ const tailwindBase = path . dirname ( resolve ( 'tailwindcss/package.json' ) )
217
+ featureFlags = require ( './lib/featureFlags.js' , tailwindBase ) . default
218
+ } catch ( _ ) { }
219
+
220
+ return { version, featureFlags }
221
+ } )
222
+ }
223
+
224
+ function withPackages ( configDir , cb ) {
225
+ return withUserEnvironment ( configDir , async ( { require, resolve } ) => {
226
+ const tailwindBase = path . dirname ( resolve ( 'tailwindcss/package.json' ) )
227
+ const postcss = require ( 'postcss' , tailwindBase )
228
+ const tailwindcss = require ( 'tailwindcss' )
229
+ let browserslistModule
230
+ try {
231
+ // this is not required
232
+ browserslistModule = require ( 'browserslist' , tailwindBase )
233
+ } catch ( _ ) { }
234
+
235
+ return cb ( { postcss, tailwindcss, browserslistModule } )
236
+ } )
237
+ }
0 commit comments