tailwindcss 0.0.0-insiders.bda8421 → 0.0.0-insiders.bdcd708

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/README.md +7 -11
  2. package/dist/chunk-5JIJA4QV.mjs +1 -0
  3. package/dist/chunk-C2OYBFIH.mjs +1 -0
  4. package/dist/chunk-DCG7AFIE.mjs +1 -0
  5. package/dist/colors-C__qRT83.d.ts +347 -0
  6. package/dist/colors.d.mts +347 -0
  7. package/dist/colors.d.ts +5 -0
  8. package/dist/colors.js +1 -0
  9. package/dist/colors.mjs +1 -0
  10. package/dist/default-theme.d.mts +1199 -0
  11. package/dist/default-theme.d.ts +1199 -0
  12. package/dist/default-theme.js +1 -0
  13. package/dist/default-theme.mjs +1 -0
  14. package/dist/flatten-color-palette.d.mts +6 -0
  15. package/dist/flatten-color-palette.d.ts +6 -0
  16. package/dist/flatten-color-palette.js +1 -0
  17. package/dist/flatten-color-palette.mjs +1 -0
  18. package/dist/lib.d.mts +379 -0
  19. package/dist/lib.d.ts +3 -0
  20. package/dist/lib.js +38 -0
  21. package/dist/lib.mjs +38 -0
  22. package/dist/plugin.d.mts +11 -0
  23. package/dist/plugin.d.ts +134 -0
  24. package/dist/plugin.js +1 -0
  25. package/dist/plugin.mjs +1 -0
  26. package/dist/resolve-config-B4yBzhca.d.ts +29 -0
  27. package/dist/resolve-config-QUZ9b-Gn.d.mts +190 -0
  28. package/dist/types-DWdTiksJ.d.mts +128 -0
  29. package/index.css +950 -0
  30. package/package.json +76 -105
  31. package/preflight.css +398 -0
  32. package/theme.css +510 -0
  33. package/base.css +0 -1
  34. package/colors.d.ts +0 -3
  35. package/colors.js +0 -2
  36. package/components.css +0 -1
  37. package/defaultConfig.d.ts +0 -3
  38. package/defaultConfig.js +0 -2
  39. package/defaultTheme.d.ts +0 -4
  40. package/defaultTheme.js +0 -2
  41. package/lib/cli/build/deps.js +0 -62
  42. package/lib/cli/build/index.js +0 -54
  43. package/lib/cli/build/plugin.js +0 -371
  44. package/lib/cli/build/utils.js +0 -88
  45. package/lib/cli/build/watching.js +0 -182
  46. package/lib/cli/help/index.js +0 -73
  47. package/lib/cli/index.js +0 -230
  48. package/lib/cli/init/index.js +0 -63
  49. package/lib/cli-peer-dependencies.js +0 -36
  50. package/lib/cli.js +0 -3
  51. package/lib/corePluginList.js +0 -191
  52. package/lib/corePlugins.js +0 -4311
  53. package/lib/css/LICENSE +0 -25
  54. package/lib/css/preflight.css +0 -386
  55. package/lib/featureFlags.js +0 -79
  56. package/lib/index.js +0 -2
  57. package/lib/lib/cacheInvalidation.js +0 -92
  58. package/lib/lib/collapseAdjacentRules.js +0 -61
  59. package/lib/lib/collapseDuplicateDeclarations.js +0 -85
  60. package/lib/lib/content.js +0 -214
  61. package/lib/lib/defaultExtractor.js +0 -251
  62. package/lib/lib/evaluateTailwindFunctions.js +0 -238
  63. package/lib/lib/expandApplyAtRules.js +0 -553
  64. package/lib/lib/expandTailwindAtRules.js +0 -279
  65. package/lib/lib/findAtConfigPath.js +0 -46
  66. package/lib/lib/generateRules.js +0 -904
  67. package/lib/lib/getModuleDependencies.js +0 -99
  68. package/lib/lib/load-config.js +0 -57
  69. package/lib/lib/normalizeTailwindDirectives.js +0 -89
  70. package/lib/lib/offsets.js +0 -355
  71. package/lib/lib/partitionApplyAtRules.js +0 -58
  72. package/lib/lib/regex.js +0 -74
  73. package/lib/lib/remap-bitfield.js +0 -89
  74. package/lib/lib/resolveDefaultsAtRules.js +0 -167
  75. package/lib/lib/setupContextUtils.js +0 -1298
  76. package/lib/lib/setupTrackingContext.js +0 -166
  77. package/lib/lib/sharedState.js +0 -79
  78. package/lib/lib/substituteScreenAtRules.js +0 -31
  79. package/lib/plugin.js +0 -48
  80. package/lib/postcss-plugins/nesting/README.md +0 -42
  81. package/lib/postcss-plugins/nesting/index.js +0 -21
  82. package/lib/postcss-plugins/nesting/plugin.js +0 -89
  83. package/lib/processTailwindFeatures.js +0 -62
  84. package/lib/public/colors.js +0 -355
  85. package/lib/public/create-plugin.js +0 -17
  86. package/lib/public/default-config.js +0 -18
  87. package/lib/public/default-theme.js +0 -18
  88. package/lib/public/load-config.js +0 -12
  89. package/lib/public/resolve-config.js +0 -24
  90. package/lib/util/applyImportantSelector.js +0 -36
  91. package/lib/util/bigSign.js +0 -13
  92. package/lib/util/buildMediaQuery.js +0 -27
  93. package/lib/util/cloneDeep.js +0 -22
  94. package/lib/util/cloneNodes.js +0 -54
  95. package/lib/util/color.js +0 -116
  96. package/lib/util/colorNames.js +0 -752
  97. package/lib/util/configurePlugins.js +0 -23
  98. package/lib/util/createPlugin.js +0 -32
  99. package/lib/util/createUtilityPlugin.js +0 -53
  100. package/lib/util/dataTypes.js +0 -415
  101. package/lib/util/defaults.js +0 -27
  102. package/lib/util/escapeClassName.js +0 -24
  103. package/lib/util/escapeCommas.js +0 -13
  104. package/lib/util/flattenColorPalette.js +0 -18
  105. package/lib/util/formatVariantSelector.js +0 -270
  106. package/lib/util/getAllConfigs.js +0 -50
  107. package/lib/util/hashConfig.js +0 -21
  108. package/lib/util/isKeyframeRule.js +0 -13
  109. package/lib/util/isPlainObject.js +0 -17
  110. package/lib/util/isSyntacticallyValidPropertyValue.js +0 -74
  111. package/lib/util/log.js +0 -61
  112. package/lib/util/nameClass.js +0 -49
  113. package/lib/util/negateValue.js +0 -36
  114. package/lib/util/normalizeConfig.js +0 -282
  115. package/lib/util/normalizeScreens.js +0 -178
  116. package/lib/util/parseAnimationValue.js +0 -93
  117. package/lib/util/parseBoxShadowValue.js +0 -88
  118. package/lib/util/parseDependency.js +0 -47
  119. package/lib/util/parseGlob.js +0 -36
  120. package/lib/util/parseObjectStyles.js +0 -36
  121. package/lib/util/pluginUtils.js +0 -289
  122. package/lib/util/prefixSelector.js +0 -39
  123. package/lib/util/pseudoElements.js +0 -212
  124. package/lib/util/removeAlphaVariables.js +0 -31
  125. package/lib/util/resolveConfig.js +0 -256
  126. package/lib/util/resolveConfigPath.js +0 -70
  127. package/lib/util/responsive.js +0 -24
  128. package/lib/util/splitAtTopLevelOnly.js +0 -51
  129. package/lib/util/tap.js +0 -14
  130. package/lib/util/toColorValue.js +0 -13
  131. package/lib/util/toPath.js +0 -32
  132. package/lib/util/transformThemeValue.js +0 -73
  133. package/lib/util/validateConfig.js +0 -37
  134. package/lib/util/validateFormalSyntax.js +0 -26
  135. package/lib/util/withAlphaVariable.js +0 -79
  136. package/lib/value-parser/LICENSE +0 -22
  137. package/lib/value-parser/README.md +0 -3
  138. package/lib/value-parser/index.d.js +0 -2
  139. package/lib/value-parser/index.js +0 -22
  140. package/lib/value-parser/parse.js +0 -259
  141. package/lib/value-parser/stringify.js +0 -38
  142. package/lib/value-parser/unit.js +0 -86
  143. package/lib/value-parser/walk.js +0 -16
  144. package/loadConfig.d.ts +0 -4
  145. package/loadConfig.js +0 -2
  146. package/nesting/index.d.ts +0 -4
  147. package/nesting/index.js +0 -2
  148. package/peers/index.js +0 -96503
  149. package/plugin.d.ts +0 -11
  150. package/plugin.js +0 -2
  151. package/prettier.config.js +0 -19
  152. package/resolveConfig.d.ts +0 -31
  153. package/resolveConfig.js +0 -2
  154. package/screens.css +0 -1
  155. package/scripts/create-plugin-list.js +0 -10
  156. package/scripts/generate-types.js +0 -104
  157. package/scripts/release-channel.js +0 -18
  158. package/scripts/release-notes.js +0 -21
  159. package/scripts/type-utils.js +0 -27
  160. package/src/cli/build/deps.js +0 -56
  161. package/src/cli/build/index.js +0 -49
  162. package/src/cli/build/plugin.js +0 -437
  163. package/src/cli/build/utils.js +0 -76
  164. package/src/cli/build/watching.js +0 -229
  165. package/src/cli/help/index.js +0 -70
  166. package/src/cli/index.js +0 -216
  167. package/src/cli/init/index.js +0 -79
  168. package/src/cli-peer-dependencies.js +0 -15
  169. package/src/cli.js +0 -3
  170. package/src/corePluginList.js +0 -1
  171. package/src/corePlugins.js +0 -2965
  172. package/src/css/LICENSE +0 -25
  173. package/src/css/preflight.css +0 -386
  174. package/src/featureFlags.js +0 -62
  175. package/src/index.js +0 -1
  176. package/src/lib/cacheInvalidation.js +0 -52
  177. package/src/lib/collapseAdjacentRules.js +0 -58
  178. package/src/lib/collapseDuplicateDeclarations.js +0 -93
  179. package/src/lib/content.js +0 -249
  180. package/src/lib/defaultExtractor.js +0 -230
  181. package/src/lib/evaluateTailwindFunctions.js +0 -272
  182. package/src/lib/expandApplyAtRules.js +0 -637
  183. package/src/lib/expandTailwindAtRules.js +0 -282
  184. package/src/lib/findAtConfigPath.js +0 -48
  185. package/src/lib/generateRules.js +0 -951
  186. package/src/lib/getModuleDependencies.js +0 -79
  187. package/src/lib/load-config.ts +0 -44
  188. package/src/lib/normalizeTailwindDirectives.js +0 -84
  189. package/src/lib/offsets.js +0 -432
  190. package/src/lib/partitionApplyAtRules.js +0 -52
  191. package/src/lib/regex.js +0 -74
  192. package/src/lib/remap-bitfield.js +0 -82
  193. package/src/lib/resolveDefaultsAtRules.js +0 -167
  194. package/src/lib/setupContextUtils.js +0 -1371
  195. package/src/lib/setupTrackingContext.js +0 -169
  196. package/src/lib/sharedState.js +0 -57
  197. package/src/lib/substituteScreenAtRules.js +0 -19
  198. package/src/plugin.js +0 -47
  199. package/src/postcss-plugins/nesting/README.md +0 -42
  200. package/src/postcss-plugins/nesting/index.js +0 -13
  201. package/src/postcss-plugins/nesting/plugin.js +0 -80
  202. package/src/processTailwindFeatures.js +0 -56
  203. package/src/public/colors.js +0 -322
  204. package/src/public/create-plugin.js +0 -2
  205. package/src/public/default-config.js +0 -4
  206. package/src/public/default-theme.js +0 -4
  207. package/src/public/load-config.js +0 -2
  208. package/src/public/resolve-config.js +0 -7
  209. package/src/util/applyImportantSelector.js +0 -27
  210. package/src/util/bigSign.js +0 -3
  211. package/src/util/buildMediaQuery.js +0 -22
  212. package/src/util/cloneDeep.js +0 -11
  213. package/src/util/cloneNodes.js +0 -49
  214. package/src/util/color.js +0 -88
  215. package/src/util/colorNames.js +0 -150
  216. package/src/util/configurePlugins.js +0 -23
  217. package/src/util/createPlugin.js +0 -27
  218. package/src/util/createUtilityPlugin.js +0 -37
  219. package/src/util/dataTypes.js +0 -406
  220. package/src/util/defaults.js +0 -17
  221. package/src/util/escapeClassName.js +0 -8
  222. package/src/util/escapeCommas.js +0 -3
  223. package/src/util/flattenColorPalette.js +0 -13
  224. package/src/util/formatVariantSelector.js +0 -324
  225. package/src/util/getAllConfigs.js +0 -38
  226. package/src/util/hashConfig.js +0 -5
  227. package/src/util/isKeyframeRule.js +0 -3
  228. package/src/util/isPlainObject.js +0 -8
  229. package/src/util/isSyntacticallyValidPropertyValue.js +0 -61
  230. package/src/util/log.js +0 -29
  231. package/src/util/nameClass.js +0 -30
  232. package/src/util/negateValue.js +0 -24
  233. package/src/util/normalizeConfig.js +0 -301
  234. package/src/util/normalizeScreens.js +0 -140
  235. package/src/util/parseAnimationValue.js +0 -68
  236. package/src/util/parseBoxShadowValue.js +0 -72
  237. package/src/util/parseDependency.js +0 -44
  238. package/src/util/parseGlob.js +0 -24
  239. package/src/util/parseObjectStyles.js +0 -19
  240. package/src/util/pluginUtils.js +0 -307
  241. package/src/util/prefixSelector.js +0 -33
  242. package/src/util/pseudoElements.js +0 -171
  243. package/src/util/removeAlphaVariables.js +0 -24
  244. package/src/util/resolveConfig.js +0 -277
  245. package/src/util/resolveConfigPath.js +0 -66
  246. package/src/util/responsive.js +0 -10
  247. package/src/util/splitAtTopLevelOnly.js +0 -52
  248. package/src/util/tap.js +0 -4
  249. package/src/util/toColorValue.js +0 -3
  250. package/src/util/toPath.js +0 -26
  251. package/src/util/transformThemeValue.js +0 -62
  252. package/src/util/validateConfig.js +0 -26
  253. package/src/util/validateFormalSyntax.js +0 -34
  254. package/src/util/withAlphaVariable.js +0 -49
  255. package/src/value-parser/LICENSE +0 -22
  256. package/src/value-parser/README.md +0 -3
  257. package/src/value-parser/index.d.ts +0 -177
  258. package/src/value-parser/index.js +0 -28
  259. package/src/value-parser/parse.js +0 -303
  260. package/src/value-parser/stringify.js +0 -41
  261. package/src/value-parser/unit.js +0 -118
  262. package/src/value-parser/walk.js +0 -18
  263. package/stubs/.gitignore +0 -1
  264. package/stubs/.prettierrc.json +0 -6
  265. package/stubs/config.full.js +0 -1062
  266. package/stubs/config.simple.js +0 -7
  267. package/stubs/postcss.config.cjs +0 -6
  268. package/stubs/postcss.config.js +0 -6
  269. package/stubs/tailwind.config.cjs +0 -2
  270. package/stubs/tailwind.config.js +0 -2
  271. package/stubs/tailwind.config.ts +0 -3
  272. package/tailwind.css +0 -5
  273. package/types/config.d.ts +0 -376
  274. package/types/generated/.gitkeep +0 -0
  275. package/types/generated/colors.d.ts +0 -298
  276. package/types/generated/corePluginList.d.ts +0 -1
  277. package/types/generated/default-theme.d.ts +0 -397
  278. package/types/index.d.ts +0 -11
  279. package/variants.css +0 -1
@@ -1,437 +0,0 @@
1
- // @ts-check
2
-
3
- import path from 'path'
4
- import fs from 'fs'
5
- import postcssrc from 'postcss-load-config'
6
- import { lilconfig } from 'lilconfig'
7
- import loadPlugins from 'postcss-load-config/src/plugins' // Little bit scary, looking at private/internal API
8
- import loadOptions from 'postcss-load-config/src/options' // Little bit scary, looking at private/internal API
9
-
10
- import tailwind from '../../processTailwindFeatures'
11
- import { loadAutoprefixer, loadCssNano, loadPostcss, loadPostcssImport } from './deps'
12
- import { formatNodes, drainStdin, outputFile } from './utils'
13
- import { env } from '../../lib/sharedState'
14
- import resolveConfig from '../../../resolveConfig.js'
15
- import { parseCandidateFiles } from '../../lib/content.js'
16
- import { createWatcher } from './watching.js'
17
- import fastGlob from 'fast-glob'
18
- import { findAtConfigPath } from '../../lib/findAtConfigPath.js'
19
- import log from '../../util/log'
20
- import { loadConfig } from '../../lib/load-config'
21
- import getModuleDependencies from '../../lib/getModuleDependencies'
22
-
23
- /**
24
- *
25
- * @param {string} [customPostCssPath ]
26
- * @returns
27
- */
28
- async function loadPostCssPlugins(customPostCssPath) {
29
- let config = customPostCssPath
30
- ? await (async () => {
31
- let file = path.resolve(customPostCssPath)
32
-
33
- // Implementation, see: https://unpkg.com/browse/postcss-load-config@3.1.0/src/index.js
34
- // @ts-ignore
35
- let { config = {} } = await lilconfig('postcss').load(file)
36
- if (typeof config === 'function') {
37
- config = config()
38
- } else {
39
- config = Object.assign({}, config)
40
- }
41
-
42
- if (!config.plugins) {
43
- config.plugins = []
44
- }
45
-
46
- return {
47
- file,
48
- plugins: loadPlugins(config, file),
49
- options: loadOptions(config, file),
50
- }
51
- })()
52
- : await postcssrc()
53
-
54
- let configPlugins = config.plugins
55
-
56
- let configPluginTailwindIdx = configPlugins.findIndex((plugin) => {
57
- if (typeof plugin === 'function' && plugin.name === 'tailwindcss') {
58
- return true
59
- }
60
-
61
- if (typeof plugin === 'object' && plugin !== null && plugin.postcssPlugin === 'tailwindcss') {
62
- return true
63
- }
64
-
65
- return false
66
- })
67
-
68
- let beforePlugins =
69
- configPluginTailwindIdx === -1 ? [] : configPlugins.slice(0, configPluginTailwindIdx)
70
- let afterPlugins =
71
- configPluginTailwindIdx === -1
72
- ? configPlugins
73
- : configPlugins.slice(configPluginTailwindIdx + 1)
74
-
75
- return [beforePlugins, afterPlugins, config.options]
76
- }
77
-
78
- function loadBuiltinPostcssPlugins() {
79
- let postcss = loadPostcss()
80
- let IMPORT_COMMENT = '__TAILWIND_RESTORE_IMPORT__: '
81
- return [
82
- [
83
- (root) => {
84
- root.walkAtRules('import', (rule) => {
85
- if (rule.params.slice(1).startsWith('tailwindcss/')) {
86
- rule.after(postcss.comment({ text: IMPORT_COMMENT + rule.params }))
87
- rule.remove()
88
- }
89
- })
90
- },
91
- loadPostcssImport(),
92
- (root) => {
93
- root.walkComments((rule) => {
94
- if (rule.text.startsWith(IMPORT_COMMENT)) {
95
- rule.after(
96
- postcss.atRule({
97
- name: 'import',
98
- params: rule.text.replace(IMPORT_COMMENT, ''),
99
- })
100
- )
101
- rule.remove()
102
- }
103
- })
104
- },
105
- ],
106
- [],
107
- {},
108
- ]
109
- }
110
-
111
- let state = {
112
- /** @type {any} */
113
- context: null,
114
-
115
- /** @type {ReturnType<typeof createWatcher> | null} */
116
- watcher: null,
117
-
118
- /** @type {{content: string, extension: string}[]} */
119
- changedContent: [],
120
-
121
- /** @type {ReturnType<typeof load> | null} */
122
- configBag: null,
123
-
124
- contextDependencies: new Set(),
125
-
126
- /** @type {import('../../lib/content.js').ContentPath[]} */
127
- contentPaths: [],
128
-
129
- refreshContentPaths() {
130
- this.contentPaths = parseCandidateFiles(this.context, this.context?.tailwindConfig)
131
- },
132
-
133
- get config() {
134
- return this.context.tailwindConfig
135
- },
136
-
137
- get contentPatterns() {
138
- return {
139
- all: this.contentPaths.map((contentPath) => contentPath.pattern),
140
- dynamic: this.contentPaths
141
- .filter((contentPath) => contentPath.glob !== undefined)
142
- .map((contentPath) => contentPath.pattern),
143
- }
144
- },
145
-
146
- loadConfig(configPath, content) {
147
- if (this.watcher && configPath) {
148
- this.refreshConfigDependencies()
149
- }
150
-
151
- let config = loadConfig(configPath)
152
- let dependencies = getModuleDependencies(configPath)
153
- this.configBag = {
154
- config,
155
- dependencies,
156
- dispose() {
157
- for (let file of dependencies) {
158
- delete require.cache[require.resolve(file)]
159
- }
160
- },
161
- }
162
-
163
- // @ts-ignore
164
- this.configBag.config = resolveConfig(this.configBag.config, { content: { files: [] } })
165
-
166
- // Override content files if `--content` has been passed explicitly
167
- if (content?.length > 0) {
168
- this.configBag.config.content.files = content
169
- }
170
-
171
- return this.configBag.config
172
- },
173
-
174
- refreshConfigDependencies() {
175
- env.DEBUG && console.time('Module dependencies')
176
- this.configBag?.dispose()
177
- env.DEBUG && console.timeEnd('Module dependencies')
178
- },
179
-
180
- readContentPaths() {
181
- let content = []
182
-
183
- // Resolve globs from the content config
184
- // TODO: When we make the postcss plugin async-capable this can become async
185
- let files = fastGlob.sync(this.contentPatterns.all)
186
-
187
- for (let file of files) {
188
- content.push({
189
- content: fs.readFileSync(path.resolve(file), 'utf8'),
190
- extension: path.extname(file).slice(1),
191
- })
192
- }
193
-
194
- // Resolve raw content in the tailwind config
195
- let rawContent = this.config.content.files.filter((file) => {
196
- return file !== null && typeof file === 'object'
197
- })
198
-
199
- for (let { raw: htmlContent, extension = 'html' } of rawContent) {
200
- content.push({ content: htmlContent, extension })
201
- }
202
-
203
- return content
204
- },
205
-
206
- getContext({ createContext, cliConfigPath, root, result, content }) {
207
- env.DEBUG && console.time('Searching for config')
208
- let configPath = findAtConfigPath(root, result) ?? cliConfigPath
209
- env.DEBUG && console.timeEnd('Searching for config')
210
-
211
- if (this.context) {
212
- this.context.changedContent = this.changedContent.splice(0)
213
-
214
- return this.context
215
- }
216
-
217
- env.DEBUG && console.time('Loading config')
218
- let config = this.loadConfig(configPath, content)
219
- env.DEBUG && console.timeEnd('Loading config')
220
-
221
- env.DEBUG && console.time('Creating context')
222
- this.context = createContext(config, [])
223
- Object.assign(this.context, {
224
- userConfigPath: configPath,
225
- })
226
- env.DEBUG && console.timeEnd('Creating context')
227
-
228
- env.DEBUG && console.time('Resolving content paths')
229
- this.refreshContentPaths()
230
- env.DEBUG && console.timeEnd('Resolving content paths')
231
-
232
- if (this.watcher) {
233
- env.DEBUG && console.time('Watch new files')
234
- this.watcher.refreshWatchedFiles()
235
- env.DEBUG && console.timeEnd('Watch new files')
236
- }
237
-
238
- for (let file of this.readContentPaths()) {
239
- this.context.changedContent.push(file)
240
- }
241
-
242
- return this.context
243
- },
244
- }
245
-
246
- export async function createProcessor(args, cliConfigPath) {
247
- let postcss = loadPostcss()
248
-
249
- let input = args['--input']
250
- let output = args['--output']
251
- let includePostCss = args['--postcss']
252
- let customPostCssPath = typeof args['--postcss'] === 'string' ? args['--postcss'] : undefined
253
-
254
- let [beforePlugins, afterPlugins, postcssOptions] = includePostCss
255
- ? await loadPostCssPlugins(customPostCssPath)
256
- : loadBuiltinPostcssPlugins()
257
-
258
- if (args['--purge']) {
259
- log.warn('purge-flag-deprecated', [
260
- 'The `--purge` flag has been deprecated.',
261
- 'Please use `--content` instead.',
262
- ])
263
-
264
- if (!args['--content']) {
265
- args['--content'] = args['--purge']
266
- }
267
- }
268
-
269
- let content = args['--content']?.split(/(?<!{[^}]+),/) ?? []
270
-
271
- let tailwindPlugin = () => {
272
- return {
273
- postcssPlugin: 'tailwindcss',
274
- async Once(root, { result }) {
275
- env.DEBUG && console.time('Compiling CSS')
276
- await tailwind(({ createContext }) => {
277
- console.error()
278
- console.error('Rebuilding...')
279
-
280
- return () => {
281
- return state.getContext({
282
- createContext,
283
- cliConfigPath,
284
- root,
285
- result,
286
- content,
287
- })
288
- }
289
- })(root, result)
290
- env.DEBUG && console.timeEnd('Compiling CSS')
291
- },
292
- }
293
- }
294
-
295
- tailwindPlugin.postcss = true
296
-
297
- let plugins = [
298
- ...beforePlugins,
299
- tailwindPlugin,
300
- !args['--minify'] && formatNodes,
301
- ...afterPlugins,
302
- !args['--no-autoprefixer'] && loadAutoprefixer(),
303
- args['--minify'] && loadCssNano(),
304
- ].filter(Boolean)
305
-
306
- /** @type {import('postcss').Processor} */
307
- // @ts-ignore
308
- let processor = postcss(plugins)
309
-
310
- async function readInput() {
311
- // Piping in data, let's drain the stdin
312
- if (input === '-') {
313
- return drainStdin()
314
- }
315
-
316
- // Input file has been provided
317
- if (input) {
318
- return fs.promises.readFile(path.resolve(input), 'utf8')
319
- }
320
-
321
- // No input file provided, fallback to default atrules
322
- return '@tailwind base; @tailwind components; @tailwind utilities'
323
- }
324
-
325
- async function build() {
326
- let start = process.hrtime.bigint()
327
-
328
- return readInput()
329
- .then((css) => processor.process(css, { ...postcssOptions, from: input, to: output }))
330
- .then((result) => {
331
- if (!state.watcher) {
332
- return result
333
- }
334
-
335
- env.DEBUG && console.time('Recording PostCSS dependencies')
336
- for (let message of result.messages) {
337
- if (message.type === 'dependency') {
338
- state.contextDependencies.add(message.file)
339
- }
340
- }
341
- env.DEBUG && console.timeEnd('Recording PostCSS dependencies')
342
-
343
- // TODO: This needs to be in a different spot
344
- env.DEBUG && console.time('Watch new files')
345
- state.watcher.refreshWatchedFiles()
346
- env.DEBUG && console.timeEnd('Watch new files')
347
-
348
- return result
349
- })
350
- .then((result) => {
351
- if (!output) {
352
- process.stdout.write(result.css)
353
- return
354
- }
355
-
356
- return Promise.all([
357
- outputFile(result.opts.to, result.css),
358
- result.map && outputFile(result.opts.to + '.map', result.map.toString()),
359
- ])
360
- })
361
- .then(() => {
362
- let end = process.hrtime.bigint()
363
- console.error()
364
- console.error('Done in', (end - start) / BigInt(1e6) + 'ms.')
365
- })
366
- .then(
367
- () => {},
368
- (err) => {
369
- // TODO: If an initial build fails we can't easily pick up any PostCSS dependencies
370
- // that were collected before the error occurred
371
- // The result is not stored on the error so we have to store it externally
372
- // and pull the messages off of it here somehow
373
-
374
- // This results in a less than ideal DX because the watcher will not pick up
375
- // changes to imported CSS if one of them caused an error during the initial build
376
- // If you fix it and then save the main CSS file so there's no error
377
- // The watcher will start watching the imported CSS files and will be
378
- // resilient to future errors.
379
-
380
- if (state.watcher) {
381
- console.error(err)
382
- } else {
383
- return Promise.reject(err)
384
- }
385
- }
386
- )
387
- }
388
-
389
- /**
390
- * @param {{file: string, content(): Promise<string>, extension: string}[]} changes
391
- */
392
- async function parseChanges(changes) {
393
- return Promise.all(
394
- changes.map(async (change) => ({
395
- content: await change.content(),
396
- extension: change.extension,
397
- }))
398
- )
399
- }
400
-
401
- if (input !== undefined && input !== '-') {
402
- state.contextDependencies.add(path.resolve(input))
403
- }
404
-
405
- return {
406
- build,
407
- watch: async () => {
408
- state.watcher = createWatcher(args, {
409
- state,
410
-
411
- /**
412
- * @param {{file: string, content(): Promise<string>, extension: string}[]} changes
413
- */
414
- async rebuild(changes) {
415
- let needsNewContext = changes.some((change) => {
416
- return (
417
- state.configBag?.dependencies.has(change.file) ||
418
- state.contextDependencies.has(change.file)
419
- )
420
- })
421
-
422
- if (needsNewContext) {
423
- state.context = null
424
- } else {
425
- for (let change of await parseChanges(changes)) {
426
- state.changedContent.push(change)
427
- }
428
- }
429
-
430
- return build()
431
- },
432
- })
433
-
434
- await build()
435
- },
436
- }
437
- }
@@ -1,76 +0,0 @@
1
- // @ts-check
2
-
3
- import fs from 'fs'
4
- import path from 'path'
5
-
6
- export function indentRecursive(node, indent = 0) {
7
- node.each &&
8
- node.each((child, i) => {
9
- if (!child.raws.before || !child.raws.before.trim() || child.raws.before.includes('\n')) {
10
- child.raws.before = `\n${node.type !== 'rule' && i > 0 ? '\n' : ''}${' '.repeat(indent)}`
11
- }
12
- child.raws.after = `\n${' '.repeat(indent)}`
13
- indentRecursive(child, indent + 1)
14
- })
15
- }
16
-
17
- export function formatNodes(root) {
18
- indentRecursive(root)
19
- if (root.first) {
20
- root.first.raws.before = ''
21
- }
22
- }
23
-
24
- /**
25
- * When rapidly saving files atomically a couple of situations can happen:
26
- * - The file is missing since the external program has deleted it by the time we've gotten around to reading it from the earlier save.
27
- * - The file is being written to by the external program by the time we're going to read it and is thus treated as busy because a lock is held.
28
- *
29
- * To work around this we retry reading the file a handful of times with a delay between each attempt
30
- *
31
- * @param {string} path
32
- * @param {number} tries
33
- * @returns {Promise<string | undefined>}
34
- * @throws {Error} If the file is still missing or busy after the specified number of tries
35
- */
36
- export async function readFileWithRetries(path, tries = 5) {
37
- for (let n = 0; n <= tries; n++) {
38
- try {
39
- return await fs.promises.readFile(path, 'utf8')
40
- } catch (err) {
41
- if (n !== tries) {
42
- if (err.code === 'ENOENT' || err.code === 'EBUSY') {
43
- await new Promise((resolve) => setTimeout(resolve, 10))
44
-
45
- continue
46
- }
47
- }
48
-
49
- throw err
50
- }
51
- }
52
- }
53
-
54
- export function drainStdin() {
55
- return new Promise((resolve, reject) => {
56
- let result = ''
57
- process.stdin.on('data', (chunk) => {
58
- result += chunk
59
- })
60
- process.stdin.on('end', () => resolve(result))
61
- process.stdin.on('error', (err) => reject(err))
62
- })
63
- }
64
-
65
- export async function outputFile(file, newContents) {
66
- try {
67
- let currentContents = await fs.promises.readFile(file, 'utf8')
68
- if (currentContents === newContents) {
69
- return // Skip writing the file
70
- }
71
- } catch {}
72
-
73
- // Write the file
74
- await fs.promises.mkdir(path.dirname(file), { recursive: true })
75
- await fs.promises.writeFile(file, newContents, 'utf8')
76
- }