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
@@ -2,52 +2,81 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- exports.default = expandTailwindAtRules;
6
- var _quickLru = _interopRequireDefault(require("quick-lru"));
7
- var sharedState = _interopRequireWildcard(require("./sharedState"));
8
- var _generateRules = require("./generateRules");
9
- var _bigSign = _interopRequireDefault(require("../util/bigSign"));
10
- var _log = _interopRequireDefault(require("../util/log"));
11
- var _cloneNodes = _interopRequireDefault(require("../util/cloneNodes"));
12
- var _defaultExtractor = require("./defaultExtractor");
13
- function _interopRequireDefault(obj) {
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return expandTailwindAtRules;
9
+ }
10
+ });
11
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
12
+ const _quicklru = /*#__PURE__*/ _interop_require_default(require("@alloc/quick-lru"));
13
+ const _oxide = require("@tailwindcss/oxide");
14
+ const _sharedState = /*#__PURE__*/ _interop_require_wildcard(require("./sharedState"));
15
+ const _generateRules = require("./generateRules");
16
+ const _log = /*#__PURE__*/ _interop_require_default(require("../util/log"));
17
+ const _cloneNodes = /*#__PURE__*/ _interop_require_default(require("../util/cloneNodes"));
18
+ const _defaultExtractor = require("./defaultExtractor");
19
+ const _featureFlags = require("../featureFlags");
20
+ function _interop_require_default(obj) {
14
21
  return obj && obj.__esModule ? obj : {
15
22
  default: obj
16
23
  };
17
24
  }
18
- function _interopRequireWildcard(obj) {
19
- if (obj && obj.__esModule) {
25
+ function _getRequireWildcardCache(nodeInterop) {
26
+ if (typeof WeakMap !== "function") return null;
27
+ var cacheBabelInterop = new WeakMap();
28
+ var cacheNodeInterop = new WeakMap();
29
+ return (_getRequireWildcardCache = function(nodeInterop) {
30
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
31
+ })(nodeInterop);
32
+ }
33
+ function _interop_require_wildcard(obj, nodeInterop) {
34
+ if (!nodeInterop && obj && obj.__esModule) {
20
35
  return obj;
21
- } else {
22
- var newObj = {};
23
- if (obj != null) {
24
- for(var key in obj){
25
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
26
- var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
27
- if (desc.get || desc.set) {
28
- Object.defineProperty(newObj, key, desc);
29
- } else {
30
- newObj[key] = obj[key];
31
- }
32
- }
36
+ }
37
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
38
+ return {
39
+ default: obj
40
+ };
41
+ }
42
+ var cache = _getRequireWildcardCache(nodeInterop);
43
+ if (cache && cache.has(obj)) {
44
+ return cache.get(obj);
45
+ }
46
+ var newObj = {};
47
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
48
+ for(var key in obj){
49
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
50
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
51
+ if (desc && (desc.get || desc.set)) {
52
+ Object.defineProperty(newObj, key, desc);
53
+ } else {
54
+ newObj[key] = obj[key];
33
55
  }
34
56
  }
35
- newObj.default = obj;
36
- return newObj;
37
57
  }
58
+ newObj.default = obj;
59
+ if (cache) {
60
+ cache.set(obj, newObj);
61
+ }
62
+ return newObj;
38
63
  }
39
- let env = sharedState.env;
64
+ let env = _sharedState.env;
40
65
  const builtInExtractors = {
41
66
  DEFAULT: _defaultExtractor.defaultExtractor
42
67
  };
43
68
  const builtInTransformers = {
44
- DEFAULT: (content)=>content
45
- ,
69
+ DEFAULT: (content)=>content,
46
70
  svelte: (content)=>content.replace(/(?:^|\s)class:/g, ' ')
47
71
  };
48
- function getExtractor(tailwindConfig, fileExtension) {
49
- let extractors = tailwindConfig.content.extract;
50
- return extractors[fileExtension] || extractors.DEFAULT || builtInExtractors[fileExtension] || builtInExtractors.DEFAULT;
72
+ function getExtractor(context, fileExtension) {
73
+ let extractors = context.tailwindConfig.content.extract;
74
+ return extractors[fileExtension] || extractors.DEFAULT || builtInExtractors[fileExtension] || // Because we call `DEFAULT(context)`, the returning function is always a new function without a
75
+ // stable identity. Marking it with `DEFAULT_EXTRACTOR` allows us to check if it is the default
76
+ // extractor without relying on the function identity.
77
+ Object.assign(builtInExtractors.DEFAULT(context), {
78
+ DEFAULT_EXTRACTOR: true
79
+ });
51
80
  }
52
81
  function getTransformer(tailwindConfig, fileExtension) {
53
82
  let transformers = tailwindConfig.content.transform;
@@ -59,7 +88,7 @@ let extractorCache = new WeakMap();
59
88
  // up these regexes by 50% that could cut initial build time by like 20%.
60
89
  function getClassCandidates(content, extractor, candidates, seen) {
61
90
  if (!extractorCache.has(extractor)) {
62
- extractorCache.set(extractor, new _quickLru.default({
91
+ extractorCache.set(extractor, new _quicklru.default({
63
92
  maxSize: 25000
64
93
  }));
65
94
  }
@@ -74,8 +103,7 @@ function getClassCandidates(content, extractor, candidates, seen) {
74
103
  candidates.add(match);
75
104
  }
76
105
  } else {
77
- let extractorMatches = extractor(line).filter((s)=>s !== '!*'
78
- );
106
+ let extractorMatches = extractor(line).filter((s)=>s !== '!*');
79
107
  let lineMatchesSet = new Set(extractorMatches);
80
108
  for (let match of lineMatchesSet){
81
109
  candidates.add(match);
@@ -84,55 +112,26 @@ function getClassCandidates(content, extractor, candidates, seen) {
84
112
  }
85
113
  }
86
114
  }
87
- function buildStylesheet(rules, context) {
88
- let sortedRules = rules.sort(([a], [z])=>(0, _bigSign).default(a - z)
89
- );
115
+ /**
116
+ *
117
+ * @param {[import('./offsets.js').RuleOffset, import('postcss').Node][]} rules
118
+ * @param {*} context
119
+ */ function buildStylesheet(rules, context) {
120
+ let sortedRules = context.offsets.sort(rules);
90
121
  let returnValue = {
91
122
  base: new Set(),
92
123
  defaults: new Set(),
93
124
  components: new Set(),
94
125
  utilities: new Set(),
95
- variants: new Set(),
96
- // All the CSS that is not Tailwind related can be put in this bucket. This
97
- // will make it easier to later use this information when we want to
98
- // `@apply` for example. The main reason we do this here is because we
99
- // still need to make sure the order is correct. Last but not least, we
100
- // will make sure to always re-inject this section into the css, even if
101
- // certain rules were not used. This means that it will look like a no-op
102
- // from the user's perspective, but we gathered all the useful information
103
- // we need.
104
- user: new Set()
126
+ variants: new Set()
105
127
  };
106
128
  for (let [sort, rule] of sortedRules){
107
- if (sort >= context.minimumScreen) {
108
- returnValue.variants.add(rule);
109
- continue;
110
- }
111
- if (sort & context.layerOrder.base) {
112
- returnValue.base.add(rule);
113
- continue;
114
- }
115
- if (sort & context.layerOrder.defaults) {
116
- returnValue.defaults.add(rule);
117
- continue;
118
- }
119
- if (sort & context.layerOrder.components) {
120
- returnValue.components.add(rule);
121
- continue;
122
- }
123
- if (sort & context.layerOrder.utilities) {
124
- returnValue.utilities.add(rule);
125
- continue;
126
- }
127
- if (sort & context.layerOrder.user) {
128
- returnValue.user.add(rule);
129
- continue;
130
- }
129
+ returnValue[sort.layer].add(rule);
131
130
  }
132
131
  return returnValue;
133
132
  }
134
133
  function expandTailwindAtRules(context) {
135
- return (root)=>{
134
+ return async (root)=>{
136
135
  let layerNodes = {
137
136
  base: null,
138
137
  components: null,
@@ -150,45 +149,88 @@ function expandTailwindAtRules(context) {
150
149
  }
151
150
  }
152
151
  });
153
- if (Object.values(layerNodes).every((n)=>n === null
154
- )) {
152
+ if (Object.values(layerNodes).every((n)=>n === null)) {
155
153
  return root;
156
154
  }
155
+ var _context_candidates;
157
156
  // ---
158
157
  // Find potential rules in changed files
159
158
  let candidates = new Set([
160
- sharedState.NOT_ON_DEMAND
159
+ ...(_context_candidates = context.candidates) !== null && _context_candidates !== void 0 ? _context_candidates : [],
160
+ _sharedState.NOT_ON_DEMAND
161
161
  ]);
162
162
  let seen = new Set();
163
163
  env.DEBUG && console.time('Reading changed files');
164
- for (let { content , extension } of context.changedContent){
165
- let transformer = getTransformer(context.tailwindConfig, extension);
166
- let extractor = getExtractor(context.tailwindConfig, extension);
167
- getClassCandidates(transformer(content), extractor, candidates, seen);
164
+ if ((0, _featureFlags.flagEnabled)(context.tailwindConfig, 'oxideParser')) {
165
+ let rustParserContent = [];
166
+ let regexParserContent = [];
167
+ for (let item of context.changedContent){
168
+ var _extractor;
169
+ let transformer = getTransformer(context.tailwindConfig, item.extension);
170
+ let extractor = getExtractor(context, item.extension);
171
+ if (transformer === builtInTransformers.DEFAULT && ((_extractor = extractor) === null || _extractor === void 0 ? void 0 : _extractor.DEFAULT_EXTRACTOR) === true) {
172
+ rustParserContent.push(item);
173
+ } else {
174
+ regexParserContent.push([
175
+ item,
176
+ {
177
+ transformer,
178
+ extractor
179
+ }
180
+ ]);
181
+ }
182
+ }
183
+ if (rustParserContent.length > 0) {
184
+ for (let candidate of (0, _oxide.parseCandidateStrings)(rustParserContent, _oxide.IO.Parallel | _oxide.Parsing.Parallel)){
185
+ candidates.add(candidate);
186
+ }
187
+ }
188
+ if (regexParserContent.length > 0) {
189
+ await Promise.all(regexParserContent.map(async ([{ file, content }, { transformer, extractor }])=>{
190
+ content = file ? await _fs.default.promises.readFile(file, 'utf8') : content;
191
+ getClassCandidates(transformer(content), extractor, candidates, seen);
192
+ }));
193
+ }
194
+ } else {
195
+ await Promise.all(context.changedContent.map(async ({ file, content, extension })=>{
196
+ let transformer = getTransformer(context.tailwindConfig, extension);
197
+ let extractor = getExtractor(context, extension);
198
+ content = file ? await _fs.default.promises.readFile(file, 'utf8') : content;
199
+ getClassCandidates(transformer(content), extractor, candidates, seen);
200
+ }));
168
201
  }
169
202
  env.DEBUG && console.timeEnd('Reading changed files');
170
203
  // ---
171
204
  // Generate the actual CSS
172
205
  let classCacheCount = context.classCache.size;
173
206
  env.DEBUG && console.time('Generate rules');
174
- let rules = (0, _generateRules).generateRules(candidates, context);
207
+ env.DEBUG && console.time('Sorting candidates');
208
+ // TODO: only sort if we are not using the oxide parser (flagEnabled(context.tailwindConfig,
209
+ // 'oxideParser')) AND if we got all the candidates form the oxideParser alone. This will not
210
+ // be the case currently if you have custom transformers / extractors.
211
+ let sortedCandidates = new Set([
212
+ ...candidates
213
+ ].sort((a, z)=>{
214
+ if (a === z) return 0;
215
+ if (a < z) return -1;
216
+ return 1;
217
+ }));
218
+ env.DEBUG && console.timeEnd('Sorting candidates');
219
+ (0, _generateRules.generateRules)(sortedCandidates, context);
175
220
  env.DEBUG && console.timeEnd('Generate rules');
176
221
  // We only ever add to the classCache, so if it didn't grow, there is nothing new.
177
222
  env.DEBUG && console.time('Build stylesheet');
178
223
  if (context.stylesheetCache === null || context.classCache.size !== classCacheCount) {
179
- for (let rule of rules){
180
- context.ruleCache.add(rule);
181
- }
182
224
  context.stylesheetCache = buildStylesheet([
183
225
  ...context.ruleCache
184
226
  ], context);
185
227
  }
186
228
  env.DEBUG && console.timeEnd('Build stylesheet');
187
- let { defaults: defaultNodes , base: baseNodes , components: componentNodes , utilities: utilityNodes , variants: screenNodes , } = context.stylesheetCache;
229
+ let { defaults: defaultNodes, base: baseNodes, components: componentNodes, utilities: utilityNodes, variants: screenNodes } = context.stylesheetCache;
188
230
  // ---
189
231
  // Replace any Tailwind directives with generated CSS
190
232
  if (layerNodes.base) {
191
- layerNodes.base.before((0, _cloneNodes).default([
233
+ layerNodes.base.before((0, _cloneNodes.default)([
192
234
  ...baseNodes,
193
235
  ...defaultNodes
194
236
  ], layerNodes.base.source, {
@@ -197,7 +239,7 @@ function expandTailwindAtRules(context) {
197
239
  layerNodes.base.remove();
198
240
  }
199
241
  if (layerNodes.components) {
200
- layerNodes.components.before((0, _cloneNodes).default([
242
+ layerNodes.components.before((0, _cloneNodes.default)([
201
243
  ...componentNodes
202
244
  ], layerNodes.components.source, {
203
245
  layer: 'components'
@@ -205,7 +247,7 @@ function expandTailwindAtRules(context) {
205
247
  layerNodes.components.remove();
206
248
  }
207
249
  if (layerNodes.utilities) {
208
- layerNodes.utilities.before((0, _cloneNodes).default([
250
+ layerNodes.utilities.before((0, _cloneNodes.default)([
209
251
  ...utilityNodes
210
252
  ], layerNodes.utilities.source, {
211
253
  layer: 'utilities'
@@ -214,8 +256,8 @@ function expandTailwindAtRules(context) {
214
256
  }
215
257
  // We do post-filtering to not alter the emitted order of the variants
216
258
  const variantNodes = Array.from(screenNodes).filter((node)=>{
217
- var ref;
218
- const parentLayer = (ref = node.raws.tailwind) === null || ref === void 0 ? void 0 : ref.parentLayer;
259
+ var _node_raws_tailwind;
260
+ const parentLayer = (_node_raws_tailwind = node.raws.tailwind) === null || _node_raws_tailwind === void 0 ? void 0 : _node_raws_tailwind.parentLayer;
219
261
  if (parentLayer === 'components') {
220
262
  return layerNodes.components !== null;
221
263
  }
@@ -225,30 +267,41 @@ function expandTailwindAtRules(context) {
225
267
  return true;
226
268
  });
227
269
  if (layerNodes.variants) {
228
- layerNodes.variants.before((0, _cloneNodes).default(variantNodes, layerNodes.variants.source, {
270
+ layerNodes.variants.before((0, _cloneNodes.default)(variantNodes, layerNodes.variants.source, {
229
271
  layer: 'variants'
230
272
  }));
231
273
  layerNodes.variants.remove();
232
274
  } else if (variantNodes.length > 0) {
233
- root.append((0, _cloneNodes).default(variantNodes, root.source, {
275
+ let cloned = (0, _cloneNodes.default)(variantNodes, undefined, {
234
276
  layer: 'variants'
235
- }));
277
+ });
278
+ cloned.forEach((node)=>{
279
+ var _node_raws_tailwind;
280
+ var _node_raws_tailwind_parentLayer;
281
+ let parentLayer = (_node_raws_tailwind_parentLayer = (_node_raws_tailwind = node.raws.tailwind) === null || _node_raws_tailwind === void 0 ? void 0 : _node_raws_tailwind.parentLayer) !== null && _node_raws_tailwind_parentLayer !== void 0 ? _node_raws_tailwind_parentLayer : null;
282
+ node.walk((n)=>{
283
+ if (!n.source) {
284
+ n.source = layerNodes[parentLayer].source;
285
+ }
286
+ });
287
+ });
288
+ root.append(cloned);
236
289
  }
237
290
  // If we've got a utility layer and no utilities are generated there's likely something wrong
238
291
  const hasUtilityVariants = variantNodes.some((node)=>{
239
- var ref;
240
- return ((ref = node.raws.tailwind) === null || ref === void 0 ? void 0 : ref.parentLayer) === 'utilities';
292
+ var _node_raws_tailwind;
293
+ return ((_node_raws_tailwind = node.raws.tailwind) === null || _node_raws_tailwind === void 0 ? void 0 : _node_raws_tailwind.parentLayer) === 'utilities';
241
294
  });
242
295
  if (layerNodes.utilities && utilityNodes.size === 0 && !hasUtilityVariants) {
243
296
  _log.default.warn('content-problems', [
244
297
  'No utility classes were detected in your source files. If this is unexpected, double-check the `content` option in your Tailwind CSS configuration.',
245
- 'https://tailwindcss.com/docs/content-configuration',
298
+ 'https://tailwindcss.com/docs/content-configuration'
246
299
  ]);
247
300
  }
248
301
  // ---
249
302
  if (env.DEBUG) {
250
303
  console.log('Potential classes: ', candidates.size);
251
- console.log('Active contexts: ', sharedState.contextSourcesMap.size);
304
+ console.log('Active contexts: ', _sharedState.contextSourcesMap.size);
252
305
  }
253
306
  // Clear the cache for the changed files
254
307
  context.changedContent = [];
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "findAtConfigPath", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return findAtConfigPath;
9
+ }
10
+ });
11
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
12
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
13
+ function _interop_require_default(obj) {
14
+ return obj && obj.__esModule ? obj : {
15
+ default: obj
16
+ };
17
+ }
18
+ function findAtConfigPath(root, result) {
19
+ let configPath = null;
20
+ let relativeTo = null;
21
+ root.walkAtRules('config', (rule)=>{
22
+ var _rule_source;
23
+ var _rule_source_input_file, _ref;
24
+ relativeTo = (_ref = (_rule_source_input_file = (_rule_source = rule.source) === null || _rule_source === void 0 ? void 0 : _rule_source.input.file) !== null && _rule_source_input_file !== void 0 ? _rule_source_input_file : result.opts.from) !== null && _ref !== void 0 ? _ref : null;
25
+ if (relativeTo === null) {
26
+ throw rule.error('The `@config` directive cannot be used without setting `from` in your PostCSS config.');
27
+ }
28
+ if (configPath) {
29
+ throw rule.error('Only one `@config` directive is allowed per file.');
30
+ }
31
+ let matches = rule.params.match(/(['"])(.*?)\1/);
32
+ if (!matches) {
33
+ throw rule.error('A path is required when using the `@config` directive.');
34
+ }
35
+ let inputPath = matches[2];
36
+ if (_path.default.isAbsolute(inputPath)) {
37
+ throw rule.error('The `@config` directive cannot be used with an absolute path.');
38
+ }
39
+ configPath = _path.default.resolve(_path.default.dirname(relativeTo), inputPath);
40
+ if (!_fs.default.existsSync(configPath)) {
41
+ throw rule.error(`The config file at "${inputPath}" does not exist. Make sure the path is correct and the file exists.`);
42
+ }
43
+ rule.remove();
44
+ });
45
+ return configPath ? configPath : null;
46
+ }