tailwindcss 0.0.0-insiders.eb8d929 → 0.0.0-insiders.ec0049a

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