tailwindcss 0.0.0-insiders.d2bb6f1 → 0.0.0-insiders.d2fdddf

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 (278) hide show
  1. package/README.md +5 -6
  2. package/dist/chunk-G32FJCSR.mjs +1 -0
  3. package/dist/chunk-HTB5LLOP.mjs +1 -0
  4. package/dist/chunk-IPWY7FQ4.mjs +35 -0
  5. package/dist/colors-b_6i0Oi7.d.ts +295 -0
  6. package/dist/colors.d.mts +295 -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 +1147 -0
  11. package/dist/default-theme.d.ts +1147 -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 +3 -0
  17. package/dist/flatten-color-palette.mjs +1 -0
  18. package/dist/lib.d.mts +377 -0
  19. package/dist/lib.d.ts +3 -0
  20. package/dist/lib.js +35 -0
  21. package/dist/lib.mjs +1 -0
  22. package/dist/plugin.d.mts +11 -0
  23. package/dist/plugin.d.ts +104 -0
  24. package/dist/plugin.js +1 -0
  25. package/dist/plugin.mjs +1 -0
  26. package/dist/resolve-config-BIFUA2FY.d.ts +29 -0
  27. package/dist/resolve-config-QUZ9b-Gn.d.mts +190 -0
  28. package/dist/types-B254mqw1.d.mts +98 -0
  29. package/index.css +886 -3
  30. package/package.json +76 -101
  31. package/preflight.css +385 -0
  32. package/theme.css +462 -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/index.js +0 -57
  42. package/lib/cli/build/plugin.js +0 -429
  43. package/lib/cli/build/utils.js +0 -88
  44. package/lib/cli/build/watching.js +0 -182
  45. package/lib/cli/help/index.js +0 -73
  46. package/lib/cli/index.js +0 -231
  47. package/lib/cli/init/index.js +0 -63
  48. package/lib/cli.js +0 -3
  49. package/lib/corePluginList.js +0 -190
  50. package/lib/corePlugins.js +0 -4237
  51. package/lib/css/LICENSE +0 -25
  52. package/lib/css/preflight.css +0 -386
  53. package/lib/featureFlags.js +0 -84
  54. package/lib/index.js +0 -2
  55. package/lib/lib/cacheInvalidation.js +0 -94
  56. package/lib/lib/collapseAdjacentRules.js +0 -63
  57. package/lib/lib/collapseDuplicateDeclarations.js +0 -85
  58. package/lib/lib/content.js +0 -207
  59. package/lib/lib/defaultExtractor.js +0 -249
  60. package/lib/lib/detectNesting.js +0 -45
  61. package/lib/lib/evaluateTailwindFunctions.js +0 -238
  62. package/lib/lib/expandApplyAtRules.js +0 -540
  63. package/lib/lib/expandTailwindAtRules.js +0 -316
  64. package/lib/lib/findAtConfigPath.js +0 -46
  65. package/lib/lib/generateRules.js +0 -896
  66. package/lib/lib/getModuleDependencies.js +0 -99
  67. package/lib/lib/handleImportAtRules.js +0 -50
  68. package/lib/lib/load-config.js +0 -53
  69. package/lib/lib/normalizeTailwindDirectives.js +0 -74
  70. package/lib/lib/offsets.js +0 -306
  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 -165
  75. package/lib/lib/setupContextUtils.js +0 -1268
  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 -166
  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 -64
  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 -407
  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 -78
  112. package/lib/util/nameClass.js +0 -49
  113. package/lib/util/negateValue.js +0 -36
  114. package/lib/util/normalizeConfig.js +0 -310
  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 -287
  122. package/lib/util/prefixSelector.js +0 -39
  123. package/lib/util/pseudoElements.js +0 -209
  124. package/lib/util/removeAlphaVariables.js +0 -31
  125. package/lib/util/resolveConfig.js +0 -263
  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 -48
  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/plugin.d.ts +0 -11
  149. package/plugin.js +0 -2
  150. package/prettier.config.js +0 -19
  151. package/resolveConfig.d.ts +0 -31
  152. package/resolveConfig.js +0 -2
  153. package/screens.css +0 -1
  154. package/scripts/create-plugin-list.js +0 -10
  155. package/scripts/generate-types.js +0 -104
  156. package/scripts/release-channel.js +0 -18
  157. package/scripts/release-notes.js +0 -21
  158. package/scripts/type-utils.js +0 -27
  159. package/src/cli/build/index.js +0 -53
  160. package/src/cli/build/plugin.js +0 -466
  161. package/src/cli/build/utils.js +0 -76
  162. package/src/cli/build/watching.js +0 -229
  163. package/src/cli/help/index.js +0 -70
  164. package/src/cli/index.js +0 -217
  165. package/src/cli/init/index.js +0 -79
  166. package/src/cli.js +0 -3
  167. package/src/corePluginList.js +0 -1
  168. package/src/corePlugins.js +0 -2895
  169. package/src/css/LICENSE +0 -25
  170. package/src/css/preflight.css +0 -386
  171. package/src/featureFlags.js +0 -64
  172. package/src/index.js +0 -1
  173. package/src/lib/cacheInvalidation.js +0 -52
  174. package/src/lib/collapseAdjacentRules.js +0 -58
  175. package/src/lib/collapseDuplicateDeclarations.js +0 -93
  176. package/src/lib/content.js +0 -240
  177. package/src/lib/defaultExtractor.js +0 -225
  178. package/src/lib/detectNesting.js +0 -47
  179. package/src/lib/evaluateTailwindFunctions.js +0 -272
  180. package/src/lib/expandApplyAtRules.js +0 -620
  181. package/src/lib/expandTailwindAtRules.js +0 -326
  182. package/src/lib/findAtConfigPath.js +0 -48
  183. package/src/lib/generateRules.js +0 -936
  184. package/src/lib/getModuleDependencies.js +0 -79
  185. package/src/lib/handleImportAtRules.js +0 -34
  186. package/src/lib/load-config.ts +0 -39
  187. package/src/lib/normalizeTailwindDirectives.js +0 -57
  188. package/src/lib/offsets.js +0 -373
  189. package/src/lib/partitionApplyAtRules.js +0 -52
  190. package/src/lib/regex.js +0 -74
  191. package/src/lib/remap-bitfield.js +0 -82
  192. package/src/lib/resolveDefaultsAtRules.js +0 -163
  193. package/src/lib/setupContextUtils.js +0 -1334
  194. package/src/lib/setupTrackingContext.js +0 -169
  195. package/src/lib/sharedState.js +0 -57
  196. package/src/lib/substituteScreenAtRules.js +0 -19
  197. package/src/plugin.js +0 -133
  198. package/src/postcss-plugins/nesting/README.md +0 -42
  199. package/src/postcss-plugins/nesting/index.js +0 -13
  200. package/src/postcss-plugins/nesting/plugin.js +0 -80
  201. package/src/processTailwindFeatures.js +0 -59
  202. package/src/public/colors.js +0 -322
  203. package/src/public/create-plugin.js +0 -2
  204. package/src/public/default-config.js +0 -4
  205. package/src/public/default-theme.js +0 -4
  206. package/src/public/load-config.js +0 -2
  207. package/src/public/resolve-config.js +0 -7
  208. package/src/util/applyImportantSelector.js +0 -27
  209. package/src/util/bigSign.js +0 -3
  210. package/src/util/buildMediaQuery.js +0 -22
  211. package/src/util/cloneDeep.js +0 -11
  212. package/src/util/cloneNodes.js +0 -49
  213. package/src/util/color.js +0 -88
  214. package/src/util/colorNames.js +0 -150
  215. package/src/util/configurePlugins.js +0 -23
  216. package/src/util/createPlugin.js +0 -27
  217. package/src/util/createUtilityPlugin.js +0 -37
  218. package/src/util/dataTypes.js +0 -392
  219. package/src/util/defaults.js +0 -17
  220. package/src/util/escapeClassName.js +0 -8
  221. package/src/util/escapeCommas.js +0 -3
  222. package/src/util/flattenColorPalette.js +0 -13
  223. package/src/util/formatVariantSelector.js +0 -324
  224. package/src/util/getAllConfigs.js +0 -38
  225. package/src/util/hashConfig.js +0 -5
  226. package/src/util/isKeyframeRule.js +0 -3
  227. package/src/util/isPlainObject.js +0 -8
  228. package/src/util/isSyntacticallyValidPropertyValue.js +0 -61
  229. package/src/util/log.js +0 -53
  230. package/src/util/nameClass.js +0 -30
  231. package/src/util/negateValue.js +0 -24
  232. package/src/util/normalizeConfig.js +0 -328
  233. package/src/util/normalizeScreens.js +0 -140
  234. package/src/util/parseAnimationValue.js +0 -68
  235. package/src/util/parseBoxShadowValue.js +0 -72
  236. package/src/util/parseDependency.js +0 -44
  237. package/src/util/parseGlob.js +0 -24
  238. package/src/util/parseObjectStyles.js +0 -19
  239. package/src/util/pluginUtils.js +0 -303
  240. package/src/util/prefixSelector.js +0 -33
  241. package/src/util/pseudoElements.js +0 -167
  242. package/src/util/removeAlphaVariables.js +0 -24
  243. package/src/util/resolveConfig.js +0 -295
  244. package/src/util/resolveConfigPath.js +0 -66
  245. package/src/util/responsive.js +0 -10
  246. package/src/util/splitAtTopLevelOnly.js +0 -52
  247. package/src/util/tap.js +0 -4
  248. package/src/util/toColorValue.js +0 -3
  249. package/src/util/toPath.js +0 -26
  250. package/src/util/transformThemeValue.js +0 -62
  251. package/src/util/validateConfig.js +0 -36
  252. package/src/util/validateFormalSyntax.js +0 -34
  253. package/src/util/withAlphaVariable.js +0 -49
  254. package/src/value-parser/LICENSE +0 -22
  255. package/src/value-parser/README.md +0 -3
  256. package/src/value-parser/index.d.ts +0 -177
  257. package/src/value-parser/index.js +0 -28
  258. package/src/value-parser/parse.js +0 -303
  259. package/src/value-parser/stringify.js +0 -41
  260. package/src/value-parser/unit.js +0 -118
  261. package/src/value-parser/walk.js +0 -18
  262. package/stubs/.gitignore +0 -1
  263. package/stubs/.prettierrc.json +0 -6
  264. package/stubs/config.full.js +0 -1062
  265. package/stubs/config.simple.js +0 -7
  266. package/stubs/postcss.config.cjs +0 -5
  267. package/stubs/postcss.config.js +0 -5
  268. package/stubs/tailwind.config.cjs +0 -2
  269. package/stubs/tailwind.config.js +0 -2
  270. package/stubs/tailwind.config.ts +0 -3
  271. package/tailwind.css +0 -5
  272. package/types/config.d.ts +0 -372
  273. package/types/generated/.gitkeep +0 -0
  274. package/types/generated/colors.d.ts +0 -298
  275. package/types/generated/corePluginList.d.ts +0 -1
  276. package/types/generated/default-theme.d.ts +0 -397
  277. package/types/index.d.ts +0 -11
  278. package/variants.css +0 -1
@@ -1,104 +0,0 @@
1
- import prettier from 'prettier'
2
- import { corePlugins } from '../src/corePlugins'
3
- import colors from '../src/public/colors'
4
- import defaultTheme from '../src/public/default-theme'
5
- import fs from 'fs'
6
- import path from 'path'
7
- import * as types from './type-utils'
8
-
9
- fs.writeFileSync(
10
- path.join(process.cwd(), 'types', 'generated', 'corePluginList.d.ts'),
11
- `export type CorePluginList = ${Object.keys(corePlugins)
12
- .map((p) => `'${p}'`)
13
- .join(' | ')}`
14
- )
15
-
16
- let colorsWithoutDeprecatedColors = Object.fromEntries(
17
- Object.entries(Object.getOwnPropertyDescriptors(colors))
18
- .filter(([_, { value }]) => {
19
- return typeof value !== 'undefined'
20
- })
21
- .map(([name, definition]) => [name, definition.value])
22
- )
23
-
24
- let deprecatedColors = Object.entries(Object.getOwnPropertyDescriptors(colors))
25
- .filter(([_, { value }]) => {
26
- return typeof value === 'undefined'
27
- })
28
- .map(([name, definition]) => {
29
- let warn = console.warn
30
- let messages = []
31
- console.warn = (...args) => messages.push(args.pop())
32
- definition.get()
33
- console.warn = warn
34
- let message = messages.join(' ').trim()
35
- let newColor = message.match(/renamed to `(.*)`/)[1]
36
- return `/** @deprecated ${message} */${name}: DefaultColors['${newColor}'],`
37
- })
38
- .join('\n')
39
-
40
- fs.writeFileSync(
41
- path.join(process.cwd(), 'types', 'generated', 'colors.d.ts'),
42
- prettier.format(
43
- `export interface DefaultColors { ${JSON.stringify(colorsWithoutDeprecatedColors).slice(
44
- 1,
45
- -1
46
- )}\n${deprecatedColors}\n}`,
47
- {
48
- semi: false,
49
- singleQuote: true,
50
- printWidth: 100,
51
- parser: 'typescript',
52
- }
53
- )
54
- )
55
-
56
- const defaultThemeTypes = Object.entries(defaultTheme)
57
- .map(([name, value]) => {
58
- // Special cases for slightly more accurate types
59
- if (name === 'keyframes') {
60
- return [name, `Record<${types.forKeys(value)}, Record<string, CSSDeclarationList>>`]
61
- }
62
-
63
- if (name === 'fontSize') {
64
- return [name, `Record<${types.forKeys(value)}, [string, { lineHeight: string }]>`]
65
- }
66
-
67
- // General cases
68
- if (typeof value === 'string') {
69
- return [name, `string`]
70
- }
71
-
72
- if (typeof value === 'function') {
73
- return [name, null]
74
- }
75
-
76
- if (typeof value === 'object') {
77
- if (Object.keys(value).length === 0) {
78
- return [name, null]
79
- }
80
-
81
- return [name, types.forValue(value)]
82
- }
83
-
84
- return [name, `unknown`]
85
- })
86
- .filter(([, type]) => type !== null)
87
- .map(([name, type]) => `${name}: ${type}`)
88
- .join('\n')
89
-
90
- fs.writeFileSync(
91
- path.join(process.cwd(), 'types', 'generated', 'default-theme.d.ts'),
92
- prettier.format(
93
- `
94
- type CSSDeclarationList = Record<string, string>
95
- export type DefaultTheme = { ${defaultThemeTypes} }
96
- `,
97
- {
98
- semi: false,
99
- singleQuote: true,
100
- printWidth: 100,
101
- parser: 'typescript',
102
- }
103
- )
104
- )
@@ -1,18 +0,0 @@
1
- // Given a version, figure out what the release channel is so that we can publish to the correct
2
- // channel on npm.
3
- //
4
- // E.g.:
5
- //
6
- // 1.2.3 -> latest (default)
7
- // 0.0.0-insiders.ffaa88 -> insiders
8
- // 4.1.0-alpha.4 -> alpha
9
-
10
- let version =
11
- process.argv[2] || process.env.npm_package_version || require('../package.json').version
12
-
13
- let match = /\d+\.\d+\.\d+-(.*)\.\d+/g.exec(version)
14
- if (match) {
15
- console.log(match[1])
16
- } else {
17
- console.log('latest')
18
- }
@@ -1,21 +0,0 @@
1
- // Given a version, figure out what the release notes are so that we can use this to pre-fill the
2
- // release notes on a GitHub release for the current version.
3
-
4
- let path = require('path')
5
- let fs = require('fs')
6
-
7
- let version =
8
- process.argv[2] || process.env.npm_package_version || require('../package.json').version
9
-
10
- let changelog = fs.readFileSync(path.resolve(__dirname, '..', 'CHANGELOG.md'), 'utf8')
11
- let match = new RegExp(
12
- `## \\[${version}\\] - (.*)\\n\\n([\\s\\S]*?)\\n(?:(?:##\\s)|(?:\\[))`,
13
- 'g'
14
- ).exec(changelog)
15
-
16
- if (match) {
17
- let [, , notes] = match
18
- console.log(notes.trim())
19
- } else {
20
- console.log(`Placeholder release notes for version: v${version}`)
21
- }
@@ -1,27 +0,0 @@
1
- export function union(types) {
2
- return [...new Set(types)].join(' | ')
3
- }
4
-
5
- export function unionValues(values) {
6
- return union(values.map(forValue))
7
- }
8
-
9
- export function forKeys(value) {
10
- return union(Object.keys(value).map((key) => `'${key}'`))
11
- }
12
-
13
- export function forValue(value) {
14
- if (Array.isArray(value)) {
15
- return `(${unionValues(value)})[]`
16
- }
17
-
18
- if (typeof value === 'object') {
19
- return `Record<${forKeys(value)}, ${unionValues(Object.values(value))}>`
20
- }
21
-
22
- if (typeof value === 'string') {
23
- return `string`
24
- }
25
-
26
- return `any`
27
- }
@@ -1,53 +0,0 @@
1
- // @ts-check
2
-
3
- import fs from 'fs'
4
- import path from 'path'
5
- import { resolveDefaultConfigPath } from '../../util/resolveConfigPath.js'
6
- import { createProcessor } from './plugin.js'
7
-
8
- export async function build(args) {
9
- let input = args['--input']
10
- let shouldWatch = args['--watch']
11
-
12
- // TODO: Deprecate this in future versions
13
- if (!input && args['_'][1]) {
14
- console.error('[deprecation] Running tailwindcss without -i, please provide an input file.')
15
- input = args['--input'] = args['_'][1]
16
- }
17
-
18
- if (input && input !== '-' && !fs.existsSync((input = path.resolve(input)))) {
19
- console.error(`Specified input file ${args['--input']} does not exist.`)
20
- process.exit(9)
21
- }
22
-
23
- if (args['--config'] && !fs.existsSync((args['--config'] = path.resolve(args['--config'])))) {
24
- console.error(`Specified config file ${args['--config']} does not exist.`)
25
- process.exit(9)
26
- }
27
-
28
- if (args['--no-autoprefixer']) {
29
- console.error('[deprecation] The --no-autoprefixer flag is deprecated and has no effect.')
30
- }
31
-
32
- // TODO: Reference the @config path here if exists
33
- let configPath = args['--config'] ? args['--config'] : resolveDefaultConfigPath()
34
-
35
- let processor = await createProcessor(args, configPath)
36
-
37
- if (shouldWatch) {
38
- // Abort the watcher if stdin is closed to avoid zombie processes
39
- // You can disable this behavior with --watch=always
40
- if (args['--watch'] !== 'always') {
41
- process.stdin.on('end', () => process.exit(0))
42
- }
43
-
44
- process.stdin.resume()
45
-
46
- await processor.watch()
47
- } else {
48
- await processor.build().catch((e) => {
49
- console.error(e)
50
- process.exit(1)
51
- })
52
- }
53
- }
@@ -1,466 +0,0 @@
1
- // @ts-check
2
-
3
- import pkg from '../../../package.json'
4
- import path from 'path'
5
- import fs from 'fs'
6
- import postcss from 'postcss'
7
- import postcssrc from 'postcss-load-config'
8
- import browserslist from 'browserslist'
9
- import lightning, { Features } from 'lightningcss'
10
- import { lilconfig } from 'lilconfig'
11
- import loadPlugins from 'postcss-load-config/src/plugins' // Little bit scary, looking at private/internal API
12
- import loadOptions from 'postcss-load-config/src/options' // Little bit scary, looking at private/internal API
13
-
14
- import tailwind from '../../processTailwindFeatures'
15
- import { formatNodes, drainStdin, outputFile } from './utils'
16
- import { env } from '../../lib/sharedState'
17
- import resolveConfig from '../../../resolveConfig.js'
18
- import { parseCandidateFiles } from '../../lib/content.js'
19
- import { createWatcher } from './watching.js'
20
- import fastGlob from 'fast-glob'
21
- import { findAtConfigPath } from '../../lib/findAtConfigPath.js'
22
- import log from '../../util/log'
23
- import { loadConfig } from '../../lib/load-config'
24
- import getModuleDependencies from '../../lib/getModuleDependencies'
25
- import { validateConfig } from '../../util/validateConfig'
26
- import { handleImportAtRules } from '../../lib/handleImportAtRules'
27
- import { flagEnabled } from '../../featureFlags'
28
-
29
- function license() {
30
- return `/* ! tailwindcss v${pkg.version} | MIT License | https://tailwindcss.com */\n`
31
- }
32
-
33
- async function lightningcss(result, { map = true, minify = true } = {}) {
34
- try {
35
- let resolvedBrowsersListConfig = browserslist.findConfig(
36
- result.opts.from ?? process.cwd()
37
- )?.defaults
38
- let defaultBrowsersListConfig = pkg.browserslist
39
- let browsersListConfig = resolvedBrowsersListConfig ?? defaultBrowsersListConfig
40
-
41
- let transformed = lightning.transform({
42
- filename: result.opts.from || 'input.css',
43
- code: Buffer.from(result.css, 'utf-8'),
44
- minify,
45
- sourceMap: result.map === undefined ? map : !!result.map,
46
- inputSourceMap: result.map ? result.map.toString() : undefined,
47
- targets: lightning.browserslistToTargets(browserslist(browsersListConfig)),
48
- include: Features.Nesting,
49
- exclude: Features.LogicalProperties,
50
- })
51
-
52
- return Object.assign(result, {
53
- css: transformed.code.toString(),
54
- map: result.map
55
- ? Object.assign(result.map, {
56
- toString() {
57
- return transformed.map?.toString()
58
- },
59
- })
60
- : result.map,
61
- })
62
- } catch (err) {
63
- console.error('Unable to use Lightning CSS. Using raw version instead.')
64
- console.error(err)
65
-
66
- return result
67
- }
68
- }
69
-
70
- /**
71
- *
72
- * @param {string} [customPostCssPath ]
73
- * @returns
74
- */
75
- async function loadPostCssPlugins(customPostCssPath) {
76
- let config = customPostCssPath
77
- ? await (async () => {
78
- let file = path.resolve(customPostCssPath)
79
-
80
- // Implementation, see: https://unpkg.com/browse/postcss-load-config@3.1.0/src/index.js
81
- // @ts-ignore
82
- let { config = {} } = await lilconfig('postcss').load(file)
83
- if (typeof config === 'function') {
84
- config = config()
85
- } else {
86
- config = Object.assign({}, config)
87
- }
88
-
89
- if (!config.plugins) {
90
- config.plugins = []
91
- }
92
-
93
- return {
94
- file,
95
- plugins: loadPlugins(config, file),
96
- options: loadOptions(config, file),
97
- }
98
- })()
99
- : await postcssrc()
100
-
101
- let configPlugins = config.plugins
102
-
103
- let configPluginTailwindIdx = configPlugins.findIndex((plugin) => {
104
- if (typeof plugin === 'function' && plugin.name === 'tailwindcss') {
105
- return true
106
- }
107
-
108
- if (typeof plugin === 'object' && plugin !== null && plugin.postcssPlugin === 'tailwindcss') {
109
- return true
110
- }
111
-
112
- return false
113
- })
114
-
115
- let beforePlugins =
116
- configPluginTailwindIdx === -1 ? [] : configPlugins.slice(0, configPluginTailwindIdx)
117
- let afterPlugins =
118
- configPluginTailwindIdx === -1
119
- ? configPlugins
120
- : configPlugins.slice(configPluginTailwindIdx + 1)
121
-
122
- return [beforePlugins, afterPlugins, config.options]
123
- }
124
-
125
- let state = {
126
- /** @type {any} */
127
- context: null,
128
-
129
- /** @type {ReturnType<typeof createWatcher> | null} */
130
- watcher: null,
131
-
132
- /** @type {{content: string, extension: string}[]} */
133
- changedContent: [],
134
-
135
- /** @type {{config: import('../../../types').Config, dependencies: Set<string>, dispose: Function } | null} */
136
- configBag: null,
137
-
138
- contextDependencies: new Set(),
139
-
140
- /** @type {import('../../lib/content.js').ContentPath[]} */
141
- contentPaths: [],
142
-
143
- refreshContentPaths() {
144
- this.contentPaths = parseCandidateFiles(this.context, this.context?.tailwindConfig)
145
- },
146
-
147
- get config() {
148
- return this.context.tailwindConfig
149
- },
150
-
151
- get contentPatterns() {
152
- return {
153
- all: this.contentPaths.map((contentPath) => contentPath.pattern),
154
- dynamic: this.contentPaths
155
- .filter((contentPath) => contentPath.glob !== undefined)
156
- .map((contentPath) => contentPath.pattern),
157
- }
158
- },
159
-
160
- loadConfig(configPath, content) {
161
- if (this.watcher && configPath) {
162
- this.refreshConfigDependencies()
163
- }
164
-
165
- let config = loadConfig(configPath)
166
- let dependencies = getModuleDependencies(configPath)
167
- this.configBag = {
168
- config,
169
- dependencies,
170
- dispose() {
171
- for (let file of dependencies) {
172
- delete require.cache[require.resolve(file)]
173
- }
174
- },
175
- }
176
-
177
- this.configBag.config = validateConfig(resolveConfig(this.configBag.config))
178
-
179
- // Override content files if `--content` has been passed explicitly
180
- if (content?.length > 0) {
181
- this.configBag.config.content.files = content
182
- }
183
-
184
- return this.configBag.config
185
- },
186
-
187
- refreshConfigDependencies() {
188
- env.DEBUG && console.time('Module dependencies')
189
- this.configBag?.dispose()
190
- env.DEBUG && console.timeEnd('Module dependencies')
191
- },
192
-
193
- readContentPaths() {
194
- let content = []
195
-
196
- // Resolve globs from the content config
197
- // TODO: When we make the postcss plugin async-capable this can become async
198
- let files = fastGlob.sync(this.contentPatterns.all)
199
-
200
- for (let file of files) {
201
- if (flagEnabled(this.config, 'oxideParser')) {
202
- content.push({
203
- file,
204
- extension: path.extname(file).slice(1),
205
- })
206
- } else {
207
- content.push({
208
- content: fs.readFileSync(path.resolve(file), 'utf8'),
209
- extension: path.extname(file).slice(1),
210
- })
211
- }
212
- }
213
-
214
- // Resolve raw content in the tailwind config
215
- let rawContent = this.config.content.files.filter((file) => {
216
- return file !== null && typeof file === 'object'
217
- })
218
-
219
- for (let { raw: htmlContent, extension = 'html' } of rawContent) {
220
- content.push({ content: htmlContent, extension })
221
- }
222
-
223
- return content
224
- },
225
-
226
- getContext({ createContext, cliConfigPath, root, result, content }) {
227
- env.DEBUG && console.time('Searching for config')
228
- let configPath = findAtConfigPath(root, result) ?? cliConfigPath
229
- env.DEBUG && console.timeEnd('Searching for config')
230
-
231
- if (this.context) {
232
- this.context.changedContent = this.changedContent.splice(0)
233
-
234
- return this.context
235
- }
236
-
237
- env.DEBUG && console.time('Loading config')
238
- let config = this.loadConfig(configPath, content)
239
- env.DEBUG && console.timeEnd('Loading config')
240
-
241
- env.DEBUG && console.time('Creating context')
242
- this.context = createContext(config, [])
243
- Object.assign(this.context, {
244
- userConfigPath: configPath,
245
- })
246
- env.DEBUG && console.timeEnd('Creating context')
247
-
248
- env.DEBUG && console.time('Resolving content paths')
249
- this.refreshContentPaths()
250
- env.DEBUG && console.timeEnd('Resolving content paths')
251
-
252
- if (this.watcher) {
253
- env.DEBUG && console.time('Watch new files')
254
- this.watcher.refreshWatchedFiles()
255
- env.DEBUG && console.timeEnd('Watch new files')
256
- }
257
-
258
- for (let file of this.readContentPaths()) {
259
- this.context.changedContent.push(file)
260
- }
261
-
262
- return this.context
263
- },
264
- }
265
-
266
- export async function createProcessor(args, cliConfigPath) {
267
- let input = args['--input']
268
- let output = args['--output']
269
- let includePostCss = args['--postcss']
270
- let customPostCssPath = typeof args['--postcss'] === 'string' ? args['--postcss'] : undefined
271
-
272
- let [beforePlugins, afterPlugins, postcssOptions] = includePostCss
273
- ? await loadPostCssPlugins(customPostCssPath)
274
- : [[], [], {}]
275
-
276
- beforePlugins.unshift(...handleImportAtRules())
277
-
278
- if (args['--purge']) {
279
- log.warn('purge-flag-deprecated', [
280
- 'The `--purge` flag has been deprecated.',
281
- 'Please use `--content` instead.',
282
- ])
283
-
284
- if (!args['--content']) {
285
- args['--content'] = args['--purge']
286
- }
287
- }
288
-
289
- let content = args['--content']?.split(/(?<!{[^}]+),/) ?? []
290
-
291
- let tailwindPlugin = () => {
292
- return {
293
- postcssPlugin: 'tailwindcss',
294
- async Once(root, { result }) {
295
- env.DEBUG && console.time('Compiling CSS')
296
- await tailwind(({ createContext }) => {
297
- console.error()
298
- console.error('Rebuilding...')
299
-
300
- return () => {
301
- return state.getContext({
302
- createContext,
303
- cliConfigPath,
304
- root,
305
- result,
306
- content,
307
- })
308
- }
309
- })(root, result)
310
- env.DEBUG && console.timeEnd('Compiling CSS')
311
- },
312
- }
313
- }
314
-
315
- tailwindPlugin.postcss = true
316
-
317
- let plugins = [
318
- ...beforePlugins,
319
- tailwindPlugin,
320
- !args['--minify'] && formatNodes,
321
- ...afterPlugins,
322
- ].filter(Boolean)
323
-
324
- /** @type {import('postcss').Processor} */
325
- // @ts-ignore
326
- let processor = postcss(plugins)
327
-
328
- async function readInput() {
329
- // Piping in data, let's drain the stdin
330
- if (input === '-') {
331
- return drainStdin()
332
- }
333
-
334
- // Input file has been provided
335
- if (input) {
336
- return fs.promises.readFile(path.resolve(input), 'utf8')
337
- }
338
-
339
- // No input file provided, fallback to default atrules
340
- return '@tailwind base; @tailwind components; @tailwind utilities'
341
- }
342
-
343
- async function build() {
344
- let start = process.hrtime.bigint()
345
- let options = {
346
- ...postcssOptions,
347
- from: input,
348
- to: output,
349
- }
350
-
351
- return readInput()
352
- .then((css) => processor.process(css, options))
353
- .then((result) =>
354
- lightningcss(result, {
355
- ...options,
356
- minify: !!args['--minify'],
357
- })
358
- )
359
- .then((result) => {
360
- if (!state.watcher) {
361
- return result
362
- }
363
-
364
- env.DEBUG && console.time('Recording PostCSS dependencies')
365
- for (let message of result.messages) {
366
- if (message.type === 'dependency') {
367
- state.contextDependencies.add(message.file)
368
- }
369
- }
370
- env.DEBUG && console.timeEnd('Recording PostCSS dependencies')
371
-
372
- // TODO: This needs to be in a different spot
373
- env.DEBUG && console.time('Watch new files')
374
- state.watcher.refreshWatchedFiles()
375
- env.DEBUG && console.timeEnd('Watch new files')
376
-
377
- return result
378
- })
379
- .then((result) => {
380
- if (!output) {
381
- process.stdout.write(license() + result.css)
382
- return
383
- }
384
-
385
- return Promise.all([
386
- outputFile(result.opts.to, license() + result.css),
387
- result.map && outputFile(result.opts.to + '.map', result.map.toString()),
388
- ])
389
- })
390
- .then(() => {
391
- let end = process.hrtime.bigint()
392
- console.error()
393
- console.error('Done in', (end - start) / BigInt(1e6) + 'ms.')
394
- })
395
- .then(
396
- () => {},
397
- (err) => {
398
- // TODO: If an initial build fails we can't easily pick up any PostCSS dependencies
399
- // that were collected before the error occurred
400
- // The result is not stored on the error so we have to store it externally
401
- // and pull the messages off of it here somehow
402
-
403
- // This results in a less than ideal DX because the watcher will not pick up
404
- // changes to imported CSS if one of them caused an error during the initial build
405
- // If you fix it and then save the main CSS file so there's no error
406
- // The watcher will start watching the imported CSS files and will be
407
- // resilient to future errors.
408
-
409
- if (state.watcher) {
410
- console.error(err)
411
- } else {
412
- return Promise.reject(err)
413
- }
414
- }
415
- )
416
- }
417
-
418
- /**
419
- * @param {{file: string, content(): Promise<string>, extension: string}[]} changes
420
- */
421
- async function parseChanges(changes) {
422
- return Promise.all(
423
- changes.map(async (change) => ({
424
- content: await change.content(),
425
- extension: change.extension,
426
- }))
427
- )
428
- }
429
-
430
- if (input !== undefined && input !== '-') {
431
- state.contextDependencies.add(path.resolve(input))
432
- }
433
-
434
- return {
435
- build,
436
- watch: async () => {
437
- state.watcher = createWatcher(args, {
438
- state,
439
-
440
- /**
441
- * @param {{file: string, content(): Promise<string>, extension: string}[]} changes
442
- */
443
- async rebuild(changes) {
444
- let needsNewContext = changes.some((change) => {
445
- return (
446
- state.configBag?.dependencies.has(change.file) ||
447
- state.contextDependencies.has(change.file)
448
- )
449
- })
450
-
451
- if (needsNewContext) {
452
- state.context = null
453
- } else {
454
- for (let change of await parseChanges(changes)) {
455
- state.changedContent.push(change)
456
- }
457
- }
458
-
459
- return build()
460
- },
461
- })
462
-
463
- await build()
464
- },
465
- }
466
- }