tailwindcss 0.0.0-insiders.d3e754a → 0.0.0-insiders.d3f2221

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 (217) hide show
  1. package/README.md +13 -9
  2. package/colors.d.ts +3 -0
  3. package/defaultConfig.d.ts +3 -0
  4. package/defaultTheme.d.ts +4 -0
  5. package/index.css +5 -0
  6. package/lib/cli/build/index.js +57 -0
  7. package/lib/cli/build/plugin.js +431 -0
  8. package/lib/cli/build/utils.js +88 -0
  9. package/lib/cli/build/watching.js +182 -0
  10. package/lib/cli/help/index.js +73 -0
  11. package/lib/cli/index.js +231 -0
  12. package/lib/cli/init/index.js +63 -0
  13. package/lib/cli.js +1 -739
  14. package/lib/corePluginList.js +13 -3
  15. package/lib/corePlugins.js +1094 -478
  16. package/lib/css/preflight.css +17 -4
  17. package/lib/featureFlags.js +49 -23
  18. package/lib/index.js +1 -29
  19. package/lib/lib/cacheInvalidation.js +92 -0
  20. package/lib/lib/collapseAdjacentRules.js +12 -5
  21. package/lib/lib/collapseDuplicateDeclarations.js +12 -7
  22. package/lib/lib/content.js +207 -0
  23. package/lib/lib/defaultExtractor.js +217 -33
  24. package/lib/lib/detectNesting.js +15 -4
  25. package/lib/lib/evaluateTailwindFunctions.js +104 -37
  26. package/lib/lib/expandApplyAtRules.js +312 -211
  27. package/lib/lib/expandTailwindAtRules.js +149 -96
  28. package/lib/lib/findAtConfigPath.js +46 -0
  29. package/lib/lib/generateRules.js +437 -188
  30. package/lib/lib/getModuleDependencies.js +88 -37
  31. package/lib/lib/handleImportAtRules.js +50 -0
  32. package/lib/lib/load-config.js +42 -0
  33. package/lib/lib/normalizeTailwindDirectives.js +9 -19
  34. package/lib/lib/offsets.js +306 -0
  35. package/lib/lib/partitionApplyAtRules.js +11 -6
  36. package/lib/lib/regex.js +74 -0
  37. package/lib/lib/remap-bitfield.js +89 -0
  38. package/lib/lib/resolveDefaultsAtRules.js +80 -58
  39. package/lib/lib/setupContextUtils.js +683 -270
  40. package/lib/lib/setupTrackingContext.js +63 -67
  41. package/lib/lib/sharedState.js +39 -10
  42. package/lib/lib/substituteScreenAtRules.js +13 -9
  43. package/lib/plugin.js +164 -0
  44. package/lib/postcss-plugins/nesting/README.md +2 -2
  45. package/lib/postcss-plugins/nesting/index.js +10 -6
  46. package/lib/postcss-plugins/nesting/plugin.js +15 -11
  47. package/lib/processTailwindFeatures.js +33 -28
  48. package/lib/public/colors.js +55 -29
  49. package/lib/public/create-plugin.js +9 -5
  50. package/lib/public/default-config.js +10 -6
  51. package/lib/public/default-theme.js +10 -6
  52. package/lib/public/load-config.js +12 -0
  53. package/lib/public/resolve-config.js +11 -6
  54. package/lib/util/applyImportantSelector.js +36 -0
  55. package/lib/util/bigSign.js +6 -1
  56. package/lib/util/buildMediaQuery.js +12 -5
  57. package/lib/util/cloneDeep.js +8 -5
  58. package/lib/util/cloneNodes.js +11 -2
  59. package/lib/util/color.js +59 -42
  60. package/lib/util/colorNames.js +752 -0
  61. package/lib/util/configurePlugins.js +7 -2
  62. package/lib/util/createPlugin.js +8 -5
  63. package/lib/util/createUtilityPlugin.js +15 -11
  64. package/lib/util/dataTypes.js +172 -47
  65. package/lib/util/defaults.js +12 -7
  66. package/lib/util/escapeClassName.js +13 -8
  67. package/lib/util/escapeCommas.js +6 -1
  68. package/lib/util/flattenColorPalette.js +9 -8
  69. package/lib/util/formatVariantSelector.js +230 -151
  70. package/lib/util/getAllConfigs.js +34 -12
  71. package/lib/util/hashConfig.js +9 -4
  72. package/lib/util/isKeyframeRule.js +6 -1
  73. package/lib/util/isPlainObject.js +6 -1
  74. package/lib/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +15 -5
  75. package/lib/util/log.js +36 -9
  76. package/lib/util/nameClass.js +24 -7
  77. package/lib/util/negateValue.js +23 -6
  78. package/lib/util/normalizeConfig.js +142 -69
  79. package/lib/util/normalizeScreens.js +124 -5
  80. package/lib/util/parseAnimationValue.js +8 -4
  81. package/lib/util/parseBoxShadowValue.js +16 -45
  82. package/lib/util/parseDependency.js +38 -54
  83. package/lib/util/parseGlob.js +36 -0
  84. package/lib/util/parseObjectStyles.js +14 -9
  85. package/lib/util/pluginUtils.js +146 -51
  86. package/lib/util/prefixSelector.js +29 -10
  87. package/lib/util/pseudoElements.js +209 -0
  88. package/lib/util/removeAlphaVariables.js +31 -0
  89. package/lib/util/resolveConfig.js +100 -73
  90. package/lib/util/resolveConfigPath.js +27 -8
  91. package/lib/util/responsive.js +10 -5
  92. package/lib/util/splitAtTopLevelOnly.js +51 -0
  93. package/lib/util/tap.js +6 -1
  94. package/lib/util/toColorValue.js +6 -1
  95. package/lib/util/toPath.js +20 -2
  96. package/lib/util/transformThemeValue.js +21 -7
  97. package/lib/util/validateConfig.js +48 -0
  98. package/lib/util/validateFormalSyntax.js +26 -0
  99. package/lib/util/withAlphaVariable.js +24 -12
  100. package/lib/value-parser/LICENSE +22 -0
  101. package/lib/value-parser/README.md +3 -0
  102. package/lib/value-parser/index.d.js +2 -0
  103. package/lib/value-parser/index.js +22 -0
  104. package/lib/value-parser/parse.js +259 -0
  105. package/lib/value-parser/stringify.js +38 -0
  106. package/lib/value-parser/unit.js +86 -0
  107. package/lib/value-parser/walk.js +16 -0
  108. package/loadConfig.d.ts +4 -0
  109. package/loadConfig.js +2 -0
  110. package/package.json +58 -53
  111. package/plugin.d.ts +11 -0
  112. package/resolveConfig.d.ts +12 -0
  113. package/scripts/generate-types.js +105 -0
  114. package/scripts/release-channel.js +18 -0
  115. package/scripts/release-notes.js +21 -0
  116. package/scripts/type-utils.js +27 -0
  117. package/src/cli/build/index.js +53 -0
  118. package/src/cli/build/plugin.js +469 -0
  119. package/src/cli/build/utils.js +76 -0
  120. package/src/cli/build/watching.js +229 -0
  121. package/src/cli/help/index.js +70 -0
  122. package/src/cli/index.js +217 -0
  123. package/src/cli/init/index.js +79 -0
  124. package/src/cli.js +1 -813
  125. package/src/corePluginList.js +1 -1
  126. package/src/corePlugins.js +636 -117
  127. package/src/css/preflight.css +17 -4
  128. package/src/featureFlags.js +13 -3
  129. package/src/index.js +1 -28
  130. package/src/lib/cacheInvalidation.js +52 -0
  131. package/src/lib/collapseAdjacentRules.js +5 -1
  132. package/src/lib/content.js +240 -0
  133. package/src/lib/defaultExtractor.js +192 -35
  134. package/src/lib/detectNesting.js +9 -1
  135. package/src/lib/evaluateTailwindFunctions.js +82 -8
  136. package/src/lib/expandApplyAtRules.js +322 -189
  137. package/src/lib/expandTailwindAtRules.js +87 -60
  138. package/src/lib/findAtConfigPath.js +48 -0
  139. package/src/lib/generateRules.js +428 -128
  140. package/src/lib/getModuleDependencies.js +70 -30
  141. package/src/lib/handleImportAtRules.js +34 -0
  142. package/src/lib/load-config.ts +31 -0
  143. package/src/lib/normalizeTailwindDirectives.js +0 -27
  144. package/src/lib/offsets.js +373 -0
  145. package/src/lib/regex.js +74 -0
  146. package/src/lib/remap-bitfield.js +82 -0
  147. package/src/lib/resolveDefaultsAtRules.js +53 -36
  148. package/src/lib/setupContextUtils.js +608 -157
  149. package/src/lib/setupTrackingContext.js +44 -58
  150. package/src/lib/sharedState.js +14 -4
  151. package/src/plugin.js +133 -0
  152. package/src/postcss-plugins/nesting/README.md +2 -2
  153. package/src/processTailwindFeatures.js +3 -2
  154. package/src/public/colors.js +22 -0
  155. package/src/public/default-config.js +1 -1
  156. package/src/public/default-theme.js +2 -2
  157. package/src/public/load-config.js +2 -0
  158. package/src/util/applyImportantSelector.js +27 -0
  159. package/src/util/buildMediaQuery.js +5 -3
  160. package/src/util/cloneNodes.js +5 -1
  161. package/src/util/color.js +39 -20
  162. package/src/util/colorNames.js +150 -0
  163. package/src/util/dataTypes.js +115 -23
  164. package/src/util/formatVariantSelector.js +265 -144
  165. package/src/util/getAllConfigs.js +21 -2
  166. package/src/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +1 -1
  167. package/src/util/log.js +25 -1
  168. package/src/util/nameClass.js +4 -0
  169. package/src/util/negateValue.js +11 -3
  170. package/src/util/normalizeConfig.js +78 -20
  171. package/src/util/normalizeScreens.js +99 -4
  172. package/src/util/parseBoxShadowValue.js +3 -50
  173. package/src/util/parseDependency.js +37 -42
  174. package/src/util/parseGlob.js +24 -0
  175. package/src/util/pluginUtils.js +118 -23
  176. package/src/util/prefixSelector.js +29 -10
  177. package/src/util/pseudoElements.js +167 -0
  178. package/src/util/removeAlphaVariables.js +24 -0
  179. package/src/util/resolveConfig.js +70 -32
  180. package/src/util/resolveConfigPath.js +12 -1
  181. package/src/util/splitAtTopLevelOnly.js +52 -0
  182. package/src/util/toPath.js +1 -1
  183. package/src/util/transformThemeValue.js +13 -3
  184. package/src/util/validateConfig.js +36 -0
  185. package/src/util/validateFormalSyntax.js +34 -0
  186. package/src/util/withAlphaVariable.js +1 -1
  187. package/src/value-parser/LICENSE +22 -0
  188. package/src/value-parser/README.md +3 -0
  189. package/src/value-parser/index.d.ts +177 -0
  190. package/src/value-parser/index.js +28 -0
  191. package/src/value-parser/parse.js +303 -0
  192. package/src/value-parser/stringify.js +41 -0
  193. package/src/value-parser/unit.js +118 -0
  194. package/src/value-parser/walk.js +18 -0
  195. package/stubs/.gitignore +1 -0
  196. package/stubs/.prettierrc.json +6 -0
  197. package/stubs/{defaultConfig.stub.js → config.full.js} +224 -172
  198. package/stubs/{simpleConfig.stub.js → config.simple.js} +1 -1
  199. package/stubs/{defaultPostCssConfig.stub.js → postcss.config.cjs} +0 -1
  200. package/stubs/postcss.config.js +5 -0
  201. package/stubs/tailwind.config.cjs +2 -0
  202. package/stubs/tailwind.config.js +2 -0
  203. package/stubs/tailwind.config.ts +3 -0
  204. package/types/config.d.ts +369 -0
  205. package/types/generated/.gitkeep +0 -0
  206. package/types/generated/colors.d.ts +298 -0
  207. package/types/generated/corePluginList.d.ts +1 -0
  208. package/types/generated/default-theme.d.ts +378 -0
  209. package/types/index.d.ts +7 -0
  210. package/CHANGELOG.md +0 -2075
  211. package/lib/cli-peer-dependencies.js +0 -15
  212. package/lib/constants.js +0 -37
  213. package/peers/index.js +0 -75077
  214. package/scripts/install-integrations.js +0 -27
  215. package/scripts/rebuildFixtures.js +0 -68
  216. package/src/cli-peer-dependencies.js +0 -9
  217. package/src/constants.js +0 -17
@@ -1,10 +1,12 @@
1
- import LRU from 'quick-lru'
1
+ import fs from 'fs'
2
+ import LRU from '@alloc/quick-lru'
3
+ import { parseCandidateStrings, IO, Parsing } from '@tailwindcss/oxide'
2
4
  import * as sharedState from './sharedState'
3
5
  import { generateRules } from './generateRules'
4
- import bigSign from '../util/bigSign'
5
6
  import log from '../util/log'
6
7
  import cloneNodes from '../util/cloneNodes'
7
8
  import { defaultExtractor } from './defaultExtractor'
9
+ import { flagEnabled } from '../featureFlags'
8
10
 
9
11
  let env = sharedState.env
10
12
 
@@ -17,14 +19,17 @@ const builtInTransformers = {
17
19
  svelte: (content) => content.replace(/(?:^|\s)class:/g, ' '),
18
20
  }
19
21
 
20
- function getExtractor(tailwindConfig, fileExtension) {
21
- let extractors = tailwindConfig.content.extract
22
+ function getExtractor(context, fileExtension) {
23
+ let extractors = context.tailwindConfig.content.extract
22
24
 
23
25
  return (
24
26
  extractors[fileExtension] ||
25
27
  extractors.DEFAULT ||
26
28
  builtInExtractors[fileExtension] ||
27
- builtInExtractors.DEFAULT
29
+ // Because we call `DEFAULT(context)`, the returning function is always a new function without a
30
+ // stable identity. Marking it with `DEFAULT_EXTRACTOR` allows us to check if it is the default
31
+ // extractor without relying on the function identity.
32
+ Object.assign(builtInExtractors.DEFAULT(context), { DEFAULT_EXTRACTOR: true })
28
33
  )
29
34
  }
30
35
 
@@ -74,8 +79,13 @@ function getClassCandidates(content, extractor, candidates, seen) {
74
79
  }
75
80
  }
76
81
 
82
+ /**
83
+ *
84
+ * @param {[import('./offsets.js').RuleOffset, import('postcss').Node][]} rules
85
+ * @param {*} context
86
+ */
77
87
  function buildStylesheet(rules, context) {
78
- let sortedRules = rules.sort(([a], [z]) => bigSign(a - z))
88
+ let sortedRules = context.offsets.sort(rules)
79
89
 
80
90
  let returnValue = {
81
91
  base: new Set(),
@@ -83,55 +93,17 @@ function buildStylesheet(rules, context) {
83
93
  components: new Set(),
84
94
  utilities: new Set(),
85
95
  variants: new Set(),
86
-
87
- // All the CSS that is not Tailwind related can be put in this bucket. This
88
- // will make it easier to later use this information when we want to
89
- // `@apply` for example. The main reason we do this here is because we
90
- // still need to make sure the order is correct. Last but not least, we
91
- // will make sure to always re-inject this section into the css, even if
92
- // certain rules were not used. This means that it will look like a no-op
93
- // from the user's perspective, but we gathered all the useful information
94
- // we need.
95
- user: new Set(),
96
96
  }
97
97
 
98
98
  for (let [sort, rule] of sortedRules) {
99
- if (sort >= context.minimumScreen) {
100
- returnValue.variants.add(rule)
101
- continue
102
- }
103
-
104
- if (sort & context.layerOrder.base) {
105
- returnValue.base.add(rule)
106
- continue
107
- }
108
-
109
- if (sort & context.layerOrder.defaults) {
110
- returnValue.defaults.add(rule)
111
- continue
112
- }
113
-
114
- if (sort & context.layerOrder.components) {
115
- returnValue.components.add(rule)
116
- continue
117
- }
118
-
119
- if (sort & context.layerOrder.utilities) {
120
- returnValue.utilities.add(rule)
121
- continue
122
- }
123
-
124
- if (sort & context.layerOrder.user) {
125
- returnValue.user.add(rule)
126
- continue
127
- }
99
+ returnValue[sort.layer].add(rule)
128
100
  }
129
101
 
130
102
  return returnValue
131
103
  }
132
104
 
133
105
  export default function expandTailwindAtRules(context) {
134
- return (root) => {
106
+ return async (root) => {
135
107
  let layerNodes = {
136
108
  base: null,
137
109
  components: null,
@@ -158,15 +130,52 @@ export default function expandTailwindAtRules(context) {
158
130
  // ---
159
131
 
160
132
  // Find potential rules in changed files
161
- let candidates = new Set([sharedState.NOT_ON_DEMAND])
133
+ let candidates = new Set([...(context.candidates ?? []), sharedState.NOT_ON_DEMAND])
162
134
  let seen = new Set()
163
135
 
164
136
  env.DEBUG && console.time('Reading changed files')
165
137
 
166
- for (let { content, extension } of context.changedContent) {
167
- let transformer = getTransformer(context.tailwindConfig, extension)
168
- let extractor = getExtractor(context.tailwindConfig, extension)
169
- getClassCandidates(transformer(content), extractor, candidates, seen)
138
+ if (flagEnabled(context.tailwindConfig, 'oxideParser')) {
139
+ let rustParserContent = []
140
+ let regexParserContent = []
141
+
142
+ for (let item of context.changedContent) {
143
+ let transformer = getTransformer(context.tailwindConfig, item.extension)
144
+ let extractor = getExtractor(context, item.extension)
145
+
146
+ if (transformer === builtInTransformers.DEFAULT && extractor?.DEFAULT_EXTRACTOR === true) {
147
+ rustParserContent.push(item)
148
+ } else {
149
+ regexParserContent.push([item, { transformer, extractor }])
150
+ }
151
+ }
152
+
153
+ if (rustParserContent.length > 0) {
154
+ for (let candidate of parseCandidateStrings(
155
+ rustParserContent,
156
+ IO.Parallel | Parsing.Parallel
157
+ )) {
158
+ candidates.add(candidate)
159
+ }
160
+ }
161
+
162
+ if (regexParserContent.length > 0) {
163
+ await Promise.all(
164
+ regexParserContent.map(async ([{ file, content }, { transformer, extractor }]) => {
165
+ content = file ? await fs.promises.readFile(file, 'utf8') : content
166
+ getClassCandidates(transformer(content), extractor, candidates, seen)
167
+ })
168
+ )
169
+ }
170
+ } else {
171
+ await Promise.all(
172
+ context.changedContent.map(async ({ file, content, extension }) => {
173
+ let transformer = getTransformer(context.tailwindConfig, extension)
174
+ let extractor = getExtractor(context, extension)
175
+ content = file ? await fs.promises.readFile(file, 'utf8') : content
176
+ getClassCandidates(transformer(content), extractor, candidates, seen)
177
+ })
178
+ )
170
179
  }
171
180
 
172
181
  env.DEBUG && console.timeEnd('Reading changed files')
@@ -177,16 +186,24 @@ export default function expandTailwindAtRules(context) {
177
186
  let classCacheCount = context.classCache.size
178
187
 
179
188
  env.DEBUG && console.time('Generate rules')
180
- let rules = generateRules(candidates, context)
189
+ env.DEBUG && console.time('Sorting candidates')
190
+ // TODO: only sort if we are not using the oxide parser (flagEnabled(context.tailwindConfig,
191
+ // 'oxideParser')) AND if we got all the candidates form the oxideParser alone. This will not
192
+ // be the case currently if you have custom transformers / extractors.
193
+ let sortedCandidates = new Set(
194
+ [...candidates].sort((a, z) => {
195
+ if (a === z) return 0
196
+ if (a < z) return -1
197
+ return 1
198
+ })
199
+ )
200
+ env.DEBUG && console.timeEnd('Sorting candidates')
201
+ generateRules(sortedCandidates, context)
181
202
  env.DEBUG && console.timeEnd('Generate rules')
182
203
 
183
204
  // We only ever add to the classCache, so if it didn't grow, there is nothing new.
184
205
  env.DEBUG && console.time('Build stylesheet')
185
206
  if (context.stylesheetCache === null || context.classCache.size !== classCacheCount) {
186
- for (let rule of rules) {
187
- context.ruleCache.add(rule)
188
- }
189
-
190
207
  context.stylesheetCache = buildStylesheet([...context.ruleCache], context)
191
208
  }
192
209
  env.DEBUG && console.timeEnd('Build stylesheet')
@@ -253,11 +270,21 @@ export default function expandTailwindAtRules(context) {
253
270
  )
254
271
  layerNodes.variants.remove()
255
272
  } else if (variantNodes.length > 0) {
256
- root.append(
257
- cloneNodes(variantNodes, root.source, {
258
- layer: 'variants',
273
+ let cloned = cloneNodes(variantNodes, undefined, {
274
+ layer: 'variants',
275
+ })
276
+
277
+ cloned.forEach((node) => {
278
+ let parentLayer = node.raws.tailwind?.parentLayer ?? null
279
+
280
+ node.walk((n) => {
281
+ if (!n.source) {
282
+ n.source = layerNodes[parentLayer].source
283
+ }
259
284
  })
260
- )
285
+ })
286
+
287
+ root.append(cloned)
261
288
  }
262
289
 
263
290
  // If we've got a utility layer and no utilities are generated there's likely something wrong
@@ -0,0 +1,48 @@
1
+ import fs from 'fs'
2
+ import path from 'path'
3
+
4
+ /**
5
+ * Find the @config at-rule in the given CSS AST and return the relative path to the config file
6
+ *
7
+ * @param {import('postcss').Root} root
8
+ * @param {import('postcss').Result} result
9
+ */
10
+ export function findAtConfigPath(root, result) {
11
+ let configPath = null
12
+ let relativeTo = null
13
+
14
+ root.walkAtRules('config', (rule) => {
15
+ relativeTo = rule.source?.input.file ?? result.opts.from ?? null
16
+
17
+ if (relativeTo === null) {
18
+ throw rule.error(
19
+ 'The `@config` directive cannot be used without setting `from` in your PostCSS config.'
20
+ )
21
+ }
22
+
23
+ if (configPath) {
24
+ throw rule.error('Only one `@config` directive is allowed per file.')
25
+ }
26
+
27
+ let matches = rule.params.match(/(['"])(.*?)\1/)
28
+ if (!matches) {
29
+ throw rule.error('A path is required when using the `@config` directive.')
30
+ }
31
+
32
+ let inputPath = matches[2]
33
+ if (path.isAbsolute(inputPath)) {
34
+ throw rule.error('The `@config` directive cannot be used with an absolute path.')
35
+ }
36
+
37
+ configPath = path.resolve(path.dirname(relativeTo), inputPath)
38
+ if (!fs.existsSync(configPath)) {
39
+ throw rule.error(
40
+ `The config file at "${inputPath}" does not exist. Make sure the path is correct and the file exists.`
41
+ )
42
+ }
43
+
44
+ rule.remove()
45
+ })
46
+
47
+ return configPath ? configPath : null
48
+ }