tailwindcss 0.0.0-insiders.ddb9b4d → 0.0.0-insiders.ddec022

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 (190) hide show
  1. package/README.md +7 -6
  2. package/lib/cli/build/deps.js +17 -9
  3. package/lib/cli/build/index.js +20 -10
  4. package/lib/cli/build/plugin.js +111 -68
  5. package/lib/cli/build/utils.js +18 -8
  6. package/lib/cli/build/watching.js +91 -22
  7. package/lib/cli/help/index.js +6 -4
  8. package/lib/cli/index.js +222 -10
  9. package/lib/cli/init/index.js +29 -12
  10. package/lib/cli-peer-dependencies.js +12 -4
  11. package/lib/cli.js +4 -226
  12. package/lib/corePluginList.js +7 -1
  13. package/lib/corePlugins.js +359 -85
  14. package/lib/css/preflight.css +4 -0
  15. package/lib/featureFlags.js +27 -15
  16. package/lib/index.js +1 -47
  17. package/lib/lib/cacheInvalidation.js +7 -5
  18. package/lib/lib/collapseAdjacentRules.js +5 -3
  19. package/lib/lib/collapseDuplicateDeclarations.js +12 -10
  20. package/lib/lib/content.js +37 -23
  21. package/lib/lib/defaultExtractor.js +15 -8
  22. package/lib/lib/detectNesting.js +10 -2
  23. package/lib/lib/evaluateTailwindFunctions.js +22 -20
  24. package/lib/lib/expandApplyAtRules.js +72 -45
  25. package/lib/lib/expandTailwindAtRules.js +47 -20
  26. package/lib/lib/findAtConfigPath.js +13 -11
  27. package/lib/lib/generateRules.js +159 -94
  28. package/lib/lib/getModuleDependencies.js +85 -37
  29. package/lib/lib/load-config.js +42 -0
  30. package/lib/lib/normalizeTailwindDirectives.js +5 -3
  31. package/lib/lib/offsets.js +93 -4
  32. package/lib/lib/partitionApplyAtRules.js +3 -1
  33. package/lib/lib/regex.js +21 -7
  34. package/lib/lib/remap-bitfield.js +89 -0
  35. package/lib/lib/resolveDefaultsAtRules.js +28 -24
  36. package/lib/lib/setupContextUtils.js +209 -137
  37. package/lib/lib/setupTrackingContext.js +49 -26
  38. package/lib/lib/sharedState.js +37 -10
  39. package/lib/lib/substituteScreenAtRules.js +5 -3
  40. package/lib/oxide/cli/build/deps.js +89 -0
  41. package/lib/oxide/cli/build/index.js +53 -0
  42. package/lib/oxide/cli/build/plugin.js +375 -0
  43. package/lib/oxide/cli/build/utils.js +87 -0
  44. package/lib/oxide/cli/build/watching.js +179 -0
  45. package/lib/oxide/cli/help/index.js +72 -0
  46. package/lib/oxide/cli/index.js +214 -0
  47. package/lib/oxide/cli/init/index.js +52 -0
  48. package/lib/oxide/cli.js +5 -0
  49. package/lib/oxide/postcss-plugin.js +2 -0
  50. package/lib/plugin.js +98 -0
  51. package/lib/postcss-plugins/nesting/index.js +3 -1
  52. package/lib/postcss-plugins/nesting/plugin.js +10 -8
  53. package/lib/processTailwindFeatures.js +14 -12
  54. package/lib/public/colors.js +49 -25
  55. package/lib/public/create-plugin.js +5 -3
  56. package/lib/public/default-config.js +6 -4
  57. package/lib/public/default-theme.js +6 -4
  58. package/lib/public/load-config.js +12 -0
  59. package/lib/public/resolve-config.js +6 -4
  60. package/lib/util/applyImportantSelector.js +36 -0
  61. package/lib/util/bigSign.js +3 -1
  62. package/lib/util/buildMediaQuery.js +3 -1
  63. package/lib/util/cloneDeep.js +3 -1
  64. package/lib/util/cloneNodes.js +5 -3
  65. package/lib/util/color.js +30 -12
  66. package/lib/util/colorNames.js +752 -0
  67. package/lib/util/configurePlugins.js +3 -1
  68. package/lib/util/createPlugin.js +3 -1
  69. package/lib/util/createUtilityPlugin.js +7 -5
  70. package/lib/util/dataTypes.js +74 -17
  71. package/lib/util/defaults.js +9 -7
  72. package/lib/util/escapeClassName.js +10 -8
  73. package/lib/util/escapeCommas.js +3 -1
  74. package/lib/util/flattenColorPalette.js +3 -1
  75. package/lib/util/formatVariantSelector.js +140 -162
  76. package/lib/util/getAllConfigs.js +8 -6
  77. package/lib/util/hashConfig.js +6 -4
  78. package/lib/util/isKeyframeRule.js +3 -1
  79. package/lib/util/isPlainObject.js +3 -1
  80. package/lib/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +4 -2
  81. package/lib/util/log.js +8 -4
  82. package/lib/util/nameClass.js +12 -6
  83. package/lib/util/negateValue.js +4 -2
  84. package/lib/util/normalizeConfig.js +42 -27
  85. package/lib/util/normalizeScreens.js +12 -4
  86. package/lib/util/parseAnimationValue.js +3 -1
  87. package/lib/util/parseBoxShadowValue.js +6 -2
  88. package/lib/util/parseDependency.js +3 -1
  89. package/lib/util/parseGlob.js +6 -4
  90. package/lib/util/parseObjectStyles.js +9 -7
  91. package/lib/util/pluginUtils.js +83 -71
  92. package/lib/util/prefixSelector.js +27 -11
  93. package/lib/util/pseudoElements.js +225 -0
  94. package/lib/util/removeAlphaVariables.js +3 -1
  95. package/lib/util/resolveConfig.js +21 -24
  96. package/lib/util/resolveConfigPath.js +26 -10
  97. package/lib/util/responsive.js +6 -4
  98. package/lib/util/splitAtTopLevelOnly.js +10 -2
  99. package/lib/util/tap.js +3 -1
  100. package/lib/util/toColorValue.js +3 -1
  101. package/lib/util/toPath.js +3 -1
  102. package/lib/util/transformThemeValue.js +6 -4
  103. package/lib/util/validateConfig.js +16 -3
  104. package/lib/util/validateFormalSyntax.js +3 -1
  105. package/lib/util/withAlphaVariable.js +6 -2
  106. package/loadConfig.d.ts +4 -0
  107. package/loadConfig.js +2 -0
  108. package/package.json +47 -39
  109. package/peers/index.js +63386 -46424
  110. package/resolveConfig.d.ts +11 -2
  111. package/scripts/release-channel.js +18 -0
  112. package/scripts/release-notes.js +21 -0
  113. package/scripts/swap-engines.js +40 -0
  114. package/src/cli/build/index.js +13 -9
  115. package/src/cli/build/plugin.js +80 -33
  116. package/src/cli/build/watching.js +108 -13
  117. package/src/cli/index.js +216 -3
  118. package/src/cli/init/index.js +37 -8
  119. package/src/cli.js +4 -220
  120. package/src/corePluginList.js +1 -1
  121. package/src/corePlugins.js +220 -43
  122. package/src/css/preflight.css +4 -0
  123. package/src/featureFlags.js +6 -0
  124. package/src/index.js +1 -47
  125. package/src/lib/content.js +19 -16
  126. package/src/lib/defaultExtractor.js +9 -3
  127. package/src/lib/detectNesting.js +9 -1
  128. package/src/lib/expandApplyAtRules.js +43 -16
  129. package/src/lib/expandTailwindAtRules.js +36 -7
  130. package/src/lib/findAtConfigPath.js +4 -6
  131. package/src/lib/generateRules.js +126 -41
  132. package/src/lib/getModuleDependencies.js +70 -30
  133. package/src/lib/load-config.ts +31 -0
  134. package/src/lib/offsets.js +104 -1
  135. package/src/lib/remap-bitfield.js +82 -0
  136. package/src/lib/setupContextUtils.js +127 -66
  137. package/src/lib/setupTrackingContext.js +36 -11
  138. package/src/lib/sharedState.js +15 -4
  139. package/src/oxide/cli/build/deps.ts +91 -0
  140. package/src/oxide/cli/build/index.ts +47 -0
  141. package/src/oxide/cli/build/plugin.ts +442 -0
  142. package/src/oxide/cli/build/utils.ts +74 -0
  143. package/src/oxide/cli/build/watching.ts +225 -0
  144. package/src/oxide/cli/help/index.ts +69 -0
  145. package/src/oxide/cli/index.ts +204 -0
  146. package/src/oxide/cli/init/index.ts +59 -0
  147. package/src/oxide/cli.ts +1 -0
  148. package/src/oxide/postcss-plugin.ts +1 -0
  149. package/src/plugin.js +107 -0
  150. package/src/public/colors.js +22 -0
  151. package/src/public/default-config.js +1 -1
  152. package/src/public/default-theme.js +2 -2
  153. package/src/public/load-config.js +2 -0
  154. package/src/util/applyImportantSelector.js +27 -0
  155. package/src/util/color.js +18 -3
  156. package/src/util/colorNames.js +150 -0
  157. package/src/util/dataTypes.js +33 -4
  158. package/src/util/formatVariantSelector.js +162 -165
  159. package/src/util/getAllConfigs.js +2 -2
  160. package/src/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +1 -1
  161. package/src/util/negateValue.js +1 -1
  162. package/src/util/normalizeConfig.js +20 -1
  163. package/src/util/pluginUtils.js +50 -39
  164. package/src/util/prefixSelector.js +28 -10
  165. package/src/util/pseudoElements.js +170 -0
  166. package/src/util/resolveConfig.js +3 -9
  167. package/src/util/resolveConfigPath.js +12 -1
  168. package/src/util/splitAtTopLevelOnly.js +8 -1
  169. package/src/util/validateConfig.js +13 -0
  170. package/stubs/.gitignore +1 -0
  171. package/stubs/.prettierrc.json +6 -0
  172. package/stubs/{defaultConfig.stub.js → config.full.js} +183 -163
  173. package/stubs/{simpleConfig.stub.js → config.simple.js} +0 -1
  174. package/stubs/postcss.config.js +6 -0
  175. package/stubs/tailwind.config.cjs +2 -0
  176. package/stubs/tailwind.config.js +2 -0
  177. package/stubs/tailwind.config.ts +3 -0
  178. package/types/config.d.ts +16 -9
  179. package/types/generated/colors.d.ts +22 -0
  180. package/types/generated/corePluginList.d.ts +1 -1
  181. package/types/generated/default-theme.d.ts +108 -79
  182. package/CHANGELOG.md +0 -2282
  183. package/lib/cli/shared.js +0 -12
  184. package/lib/constants.js +0 -44
  185. package/scripts/calculate-tag-name.js +0 -8
  186. package/scripts/install-integrations.js +0 -27
  187. package/scripts/rebuildFixtures.js +0 -68
  188. package/src/cli/shared.js +0 -5
  189. package/src/constants.js +0 -17
  190. /package/stubs/{defaultPostCssConfig.stub.js → postcss.config.cjs} +0 -0
package/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  <p align="center">
2
- <a href="https://tailwindcss.com/#gh-light-mode-only" target="_blank">
3
- <img src="./.github/logo-light.svg" alt="Tailwind CSS" width="350" height="70">
4
- </a>
5
- <a href="https://tailwindcss.com/#gh-dark-mode-only" target="_blank">
6
- <img src="./.github/logo-dark.svg" alt="Tailwind CSS" width="350" height="70">
2
+ <a href="https://tailwindcss.com" target="_blank">
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tailwindlabs/tailwindcss/HEAD/.github/logo-dark.svg">
5
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/tailwindlabs/tailwindcss/HEAD/.github/logo-light.svg">
6
+ <img alt="Tailwind CSS" src="https://raw.githubusercontent.com/tailwindlabs/tailwindcss/HEAD/.github/logo-light.svg" width="350" height="70" style="max-width: 100%;">
7
+ </picture>
7
8
  </a>
8
9
  </p>
9
10
 
@@ -13,7 +14,7 @@
13
14
 
14
15
 
15
16
  <p align="center">
16
- <a href="https://github.com/tailwindlabs/tailwindcss/actions"><img src="https://img.shields.io/github/workflow/status/tailwindlabs/tailwindcss/Node.js%20CI" alt="Build Status"></a>
17
+ <a href="https://github.com/tailwindlabs/tailwindcss/actions"><img src="https://img.shields.io/github/actions/workflow/status/tailwindlabs/tailwindcss/ci-stable.yml?branch=master" alt="Build Status"></a>
17
18
  <a href="https://www.npmjs.com/package/tailwindcss"><img src="https://img.shields.io/npm/dt/tailwindcss.svg" alt="Total Downloads"></a>
18
19
  <a href="https://github.com/tailwindcss/tailwindcss/releases"><img src="https://img.shields.io/npm/v/tailwindcss.svg" alt="Latest Release"></a>
19
20
  <a href="https://github.com/tailwindcss/tailwindcss/blob/master/LICENSE"><img src="https://img.shields.io/npm/l/tailwindcss.svg" alt="License"></a>
@@ -10,25 +10,33 @@ function _export(target, all) {
10
10
  });
11
11
  }
12
12
  _export(exports, {
13
- loadPostcss: ()=>loadPostcss,
14
- loadPostcssImport: ()=>loadPostcssImport,
15
- loadCssNano: ()=>loadCssNano,
16
- loadAutoprefixer: ()=>loadAutoprefixer
13
+ loadPostcss: function() {
14
+ return loadPostcss;
15
+ },
16
+ loadPostcssImport: function() {
17
+ return loadPostcssImport;
18
+ },
19
+ loadCssNano: function() {
20
+ return loadCssNano;
21
+ },
22
+ loadAutoprefixer: function() {
23
+ return loadAutoprefixer;
24
+ }
17
25
  });
18
- const _indexJs = require("../../../peers/index.js");
26
+ const _index = require("../../../peers/index.js");
19
27
  function loadPostcss() {
20
28
  // Try to load a local `postcss` version first
21
29
  try {
22
30
  return require("postcss");
23
31
  } catch {}
24
- return (0, _indexJs.lazyPostcss)();
32
+ return (0, _index.lazyPostcss)();
25
33
  }
26
34
  function loadPostcssImport() {
27
35
  // Try to load a local `postcss-import` version first
28
36
  try {
29
37
  return require("postcss-import");
30
38
  } catch {}
31
- return (0, _indexJs.lazyPostcssImport)();
39
+ return (0, _index.lazyPostcssImport)();
32
40
  }
33
41
  function loadCssNano() {
34
42
  let options = {
@@ -43,12 +51,12 @@ function loadCssNano() {
43
51
  try {
44
52
  return require("cssnano");
45
53
  } catch {}
46
- return (0, _indexJs.lazyCssnano)()(options);
54
+ return (0, _index.lazyCssnano)()(options);
47
55
  }
48
56
  function loadAutoprefixer() {
49
57
  // Try to load a local `autoprefixer` version first
50
58
  try {
51
59
  return require("autoprefixer");
52
60
  } catch {}
53
- return (0, _indexJs.lazyAutoprefixer)();
61
+ return (0, _index.lazyAutoprefixer)();
54
62
  }
@@ -5,17 +5,20 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  Object.defineProperty(exports, "build", {
7
7
  enumerable: true,
8
- get: ()=>build
8
+ get: function() {
9
+ return build;
10
+ }
9
11
  });
10
- const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
11
- const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
12
- const _pluginJs = require("./plugin.js");
13
- function _interopRequireDefault(obj) {
12
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
13
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
14
+ const _resolveConfigPath = require("../../util/resolveConfigPath.js");
15
+ const _plugin = require("./plugin.js");
16
+ function _interop_require_default(obj) {
14
17
  return obj && obj.__esModule ? obj : {
15
18
  default: obj
16
19
  };
17
20
  }
18
- async function build(args, configs) {
21
+ async function build(args) {
19
22
  let input = args["--input"];
20
23
  let shouldWatch = args["--watch"];
21
24
  // TODO: Deprecate this in future versions
@@ -32,13 +35,20 @@ async function build(args, configs) {
32
35
  process.exit(9);
33
36
  }
34
37
  // TODO: Reference the @config path here if exists
35
- let configPath = args["--config"] ? args["--config"] : ((defaultPath)=>_fs.default.existsSync(defaultPath) ? defaultPath : null)(_path.default.resolve(`./${configs.tailwind}`));
36
- let processor = await (0, _pluginJs.createProcessor)(args, configPath);
38
+ let configPath = args["--config"] ? args["--config"] : (0, _resolveConfigPath.resolveDefaultConfigPath)();
39
+ let processor = await (0, _plugin.createProcessor)(args, configPath);
37
40
  if (shouldWatch) {
38
- /* Abort the watcher if stdin is closed to avoid zombie processes */ process.stdin.on("end", ()=>process.exit(0));
41
+ // Abort the watcher if stdin is closed to avoid zombie processes
42
+ // You can disable this behavior with --watch=always
43
+ if (args["--watch"] !== "always") {
44
+ process.stdin.on("end", ()=>process.exit(0));
45
+ }
39
46
  process.stdin.resume();
40
47
  await processor.watch();
41
48
  } else {
42
- await processor.build();
49
+ await processor.build().catch((e)=>{
50
+ console.error(e);
51
+ process.exit(1);
52
+ });
43
53
  }
44
54
  }
@@ -5,28 +5,31 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  Object.defineProperty(exports, "createProcessor", {
7
7
  enumerable: true,
8
- get: ()=>createProcessor
8
+ get: function() {
9
+ return createProcessor;
10
+ }
9
11
  });
10
- const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
11
- const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
12
- const _postcssLoadConfig = /*#__PURE__*/ _interopRequireDefault(require("postcss-load-config"));
12
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
13
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
14
+ const _postcssloadconfig = /*#__PURE__*/ _interop_require_default(require("postcss-load-config"));
13
15
  const _lilconfig = require("lilconfig");
14
- const _plugins = /*#__PURE__*/ _interopRequireDefault(require("postcss-load-config/src/plugins" // Little bit scary, looking at private/internal API
16
+ const _plugins = /*#__PURE__*/ _interop_require_default(require("postcss-load-config/src/plugins" // Little bit scary, looking at private/internal API
15
17
  ));
16
- const _options = /*#__PURE__*/ _interopRequireDefault(require("postcss-load-config/src/options" // Little bit scary, looking at private/internal API
18
+ const _options = /*#__PURE__*/ _interop_require_default(require("postcss-load-config/src/options" // Little bit scary, looking at private/internal API
17
19
  ));
18
- const _processTailwindFeatures = /*#__PURE__*/ _interopRequireDefault(require("../../processTailwindFeatures"));
20
+ const _processTailwindFeatures = /*#__PURE__*/ _interop_require_default(require("../../processTailwindFeatures"));
19
21
  const _deps = require("./deps");
20
22
  const _utils = require("./utils");
21
- const _shared = require("../shared");
22
- const _resolveConfigJs = /*#__PURE__*/ _interopRequireDefault(require("../../../resolveConfig.js"));
23
- const _getModuleDependenciesJs = /*#__PURE__*/ _interopRequireDefault(require("../../lib/getModuleDependencies.js"));
24
- const _contentJs = require("../../lib/content.js");
25
- const _watchingJs = require("./watching.js");
26
- const _fastGlob = /*#__PURE__*/ _interopRequireDefault(require("fast-glob"));
27
- const _findAtConfigPathJs = require("../../lib/findAtConfigPath.js");
28
- const _log = /*#__PURE__*/ _interopRequireDefault(require("../../util/log"));
29
- function _interopRequireDefault(obj) {
23
+ const _sharedState = require("../../lib/sharedState");
24
+ const _resolveConfig = /*#__PURE__*/ _interop_require_default(require("../../../resolveConfig.js"));
25
+ const _content = require("../../lib/content.js");
26
+ const _watching = require("./watching.js");
27
+ const _fastglob = /*#__PURE__*/ _interop_require_default(require("fast-glob"));
28
+ const _findAtConfigPath = require("../../lib/findAtConfigPath.js");
29
+ const _log = /*#__PURE__*/ _interop_require_default(require("../../util/log"));
30
+ const _loadconfig = require("../../lib/load-config");
31
+ const _getModuleDependencies = /*#__PURE__*/ _interop_require_default(require("../../lib/getModuleDependencies"));
32
+ function _interop_require_default(obj) {
30
33
  return obj && obj.__esModule ? obj : {
31
34
  default: obj
32
35
  };
@@ -54,7 +57,7 @@ function _interopRequireDefault(obj) {
54
57
  plugins: (0, _plugins.default)(config, file),
55
58
  options: (0, _options.default)(config, file)
56
59
  };
57
- })() : await (0, _postcssLoadConfig.default)();
60
+ })() : await (0, _postcssloadconfig.default)();
58
61
  let configPlugins = config.plugins;
59
62
  let configPluginTailwindIdx = configPlugins.findIndex((plugin)=>{
60
63
  if (typeof plugin === "function" && plugin.name === "tailwindcss") {
@@ -109,12 +112,12 @@ let state = {
109
112
  /** @type {any} */ context: null,
110
113
  /** @type {ReturnType<typeof createWatcher> | null} */ watcher: null,
111
114
  /** @type {{content: string, extension: string}[]} */ changedContent: [],
112
- configDependencies: new Set(),
115
+ /** @type {ReturnType<typeof load> | null} */ configBag: null,
113
116
  contextDependencies: new Set(),
114
117
  /** @type {import('../../lib/content.js').ContentPath[]} */ contentPaths: [],
115
118
  refreshContentPaths () {
116
- var ref;
117
- this.contentPaths = (0, _contentJs.parseCandidateFiles)(this.context, (ref = this.context) === null || ref === void 0 ? void 0 : ref.tailwindConfig);
119
+ var _this_context;
120
+ this.contentPaths = (0, _content.parseCandidateFiles)(this.context, (_this_context = this.context) === null || _this_context === void 0 ? void 0 : _this_context.tailwindConfig);
118
121
  },
119
122
  get config () {
120
123
  return this.context.tailwindConfig;
@@ -127,52 +130,62 @@ let state = {
127
130
  },
128
131
  loadConfig (configPath, content) {
129
132
  if (this.watcher && configPath) {
130
- this.refreshConfigDependencies(configPath);
133
+ this.refreshConfigDependencies();
131
134
  }
132
- let config = configPath ? require(configPath) : {};
135
+ let config = (0, _loadconfig.loadConfig)(configPath);
136
+ let dependencies = (0, _getModuleDependencies.default)(configPath);
137
+ this.configBag = {
138
+ config,
139
+ dependencies,
140
+ dispose () {
141
+ for (let file of dependencies){
142
+ delete require.cache[require.resolve(file)];
143
+ }
144
+ }
145
+ };
133
146
  // @ts-ignore
134
- config = (0, _resolveConfigJs.default)(config, {
147
+ this.configBag.config = (0, _resolveConfig.default)(this.configBag.config, {
135
148
  content: {
136
149
  files: []
137
150
  }
138
151
  });
139
152
  // Override content files if `--content` has been passed explicitly
140
153
  if ((content === null || content === void 0 ? void 0 : content.length) > 0) {
141
- config.content.files = content;
154
+ this.configBag.config.content.files = content;
142
155
  }
143
- return config;
156
+ return this.configBag.config;
144
157
  },
145
- refreshConfigDependencies (configPath) {
146
- _shared.env.DEBUG && console.time("Module dependencies");
147
- for (let file of this.configDependencies){
148
- delete require.cache[require.resolve(file)];
149
- }
150
- if (configPath) {
151
- let deps = (0, _getModuleDependenciesJs.default)(configPath).map(({ file })=>file);
152
- for (let dependency of deps){
153
- this.configDependencies.add(dependency);
154
- }
155
- }
156
- _shared.env.DEBUG && console.timeEnd("Module dependencies");
158
+ refreshConfigDependencies () {
159
+ var _this_configBag;
160
+ _sharedState.env.DEBUG && console.time("Module dependencies");
161
+ (_this_configBag = this.configBag) === null || _this_configBag === void 0 ? void 0 : _this_configBag.dispose();
162
+ _sharedState.env.DEBUG && console.timeEnd("Module dependencies");
157
163
  },
158
164
  readContentPaths () {
159
165
  let content = [];
160
166
  // Resolve globs from the content config
161
167
  // TODO: When we make the postcss plugin async-capable this can become async
162
- let files = _fastGlob.default.sync(this.contentPatterns.all);
168
+ let files = _fastglob.default.sync(this.contentPatterns.all);
163
169
  for (let file of files){
164
- content.push({
165
- content: _fs.default.readFileSync(_path.default.resolve(file), "utf8"),
166
- extension: _path.default.extname(file).slice(1)
167
- });
170
+ if (false) {
171
+ content.push({
172
+ file,
173
+ extension: _path.default.extname(file).slice(1)
174
+ });
175
+ } else {
176
+ content.push({
177
+ content: _fs.default.readFileSync(_path.default.resolve(file), "utf8"),
178
+ extension: _path.default.extname(file).slice(1)
179
+ });
180
+ }
168
181
  }
169
182
  // Resolve raw content in the tailwind config
170
183
  let rawContent = this.config.content.files.filter((file)=>{
171
184
  return file !== null && typeof file === "object";
172
185
  });
173
- for (let { raw: content1 , extension ="html" } of rawContent){
174
- content1.push({
175
- content: content1,
186
+ for (let { raw: htmlContent , extension ="html" } of rawContent){
187
+ content.push({
188
+ content: htmlContent,
176
189
  extension
177
190
  });
178
191
  }
@@ -183,37 +196,35 @@ let state = {
183
196
  this.context.changedContent = this.changedContent.splice(0);
184
197
  return this.context;
185
198
  }
186
- _shared.env.DEBUG && console.time("Searching for config");
187
- var ref;
188
- let configPath = (ref = (0, _findAtConfigPathJs.findAtConfigPath)(root, result)) !== null && ref !== void 0 ? ref : cliConfigPath;
189
- _shared.env.DEBUG && console.timeEnd("Searching for config");
190
- _shared.env.DEBUG && console.time("Loading config");
199
+ _sharedState.env.DEBUG && console.time("Searching for config");
200
+ var _findAtConfigPath1;
201
+ let configPath = (_findAtConfigPath1 = (0, _findAtConfigPath.findAtConfigPath)(root, result)) !== null && _findAtConfigPath1 !== void 0 ? _findAtConfigPath1 : cliConfigPath;
202
+ _sharedState.env.DEBUG && console.timeEnd("Searching for config");
203
+ _sharedState.env.DEBUG && console.time("Loading config");
191
204
  let config = this.loadConfig(configPath, content);
192
- _shared.env.DEBUG && console.timeEnd("Loading config");
193
- _shared.env.DEBUG && console.time("Creating context");
205
+ _sharedState.env.DEBUG && console.timeEnd("Loading config");
206
+ _sharedState.env.DEBUG && console.time("Creating context");
194
207
  this.context = createContext(config, []);
195
208
  Object.assign(this.context, {
196
209
  userConfigPath: configPath
197
210
  });
198
- _shared.env.DEBUG && console.timeEnd("Creating context");
199
- _shared.env.DEBUG && console.time("Resolving content paths");
211
+ _sharedState.env.DEBUG && console.timeEnd("Creating context");
212
+ _sharedState.env.DEBUG && console.time("Resolving content paths");
200
213
  this.refreshContentPaths();
201
- _shared.env.DEBUG && console.timeEnd("Resolving content paths");
214
+ _sharedState.env.DEBUG && console.timeEnd("Resolving content paths");
202
215
  if (this.watcher) {
203
- _shared.env.DEBUG && console.time("Watch new files");
216
+ _sharedState.env.DEBUG && console.time("Watch new files");
204
217
  this.watcher.refreshWatchedFiles();
205
- _shared.env.DEBUG && console.timeEnd("Watch new files");
218
+ _sharedState.env.DEBUG && console.timeEnd("Watch new files");
206
219
  }
207
- _shared.env.DEBUG && console.time("Reading content files");
208
220
  for (let file of this.readContentPaths()){
209
221
  this.context.changedContent.push(file);
210
222
  }
211
- _shared.env.DEBUG && console.timeEnd("Reading content files");
212
223
  return this.context;
213
224
  }
214
225
  };
215
226
  async function createProcessor(args, cliConfigPath) {
216
- var ref;
227
+ var _args_content;
217
228
  let postcss = (0, _deps.loadPostcss)();
218
229
  let input = args["--input"];
219
230
  let output = args["--output"];
@@ -229,13 +240,13 @@ async function createProcessor(args, cliConfigPath) {
229
240
  args["--content"] = args["--purge"];
230
241
  }
231
242
  }
232
- var ref1;
233
- let content = (ref1 = (ref = args["--content"]) === null || ref === void 0 ? void 0 : ref.split(/(?<!{[^}]+),/)) !== null && ref1 !== void 0 ? ref1 : [];
243
+ var _args_content_split;
244
+ let content = (_args_content_split = (_args_content = args["--content"]) === null || _args_content === void 0 ? void 0 : _args_content.split(/(?<!{[^}]+),/)) !== null && _args_content_split !== void 0 ? _args_content_split : [];
234
245
  let tailwindPlugin = ()=>{
235
246
  return {
236
247
  postcssPlugin: "tailwindcss",
237
248
  Once (root, { result }) {
238
- _shared.env.DEBUG && console.time("Compiling CSS");
249
+ _sharedState.env.DEBUG && console.time("Compiling CSS");
239
250
  (0, _processTailwindFeatures.default)(({ createContext })=>{
240
251
  console.error();
241
252
  console.error("Rebuilding...");
@@ -249,7 +260,7 @@ async function createProcessor(args, cliConfigPath) {
249
260
  });
250
261
  };
251
262
  })(root, result);
252
- _shared.env.DEBUG && console.timeEnd("Compiling CSS");
263
+ _sharedState.env.DEBUG && console.timeEnd("Compiling CSS");
253
264
  }
254
265
  };
255
266
  };
@@ -283,18 +294,49 @@ async function createProcessor(args, cliConfigPath) {
283
294
  from: input,
284
295
  to: output
285
296
  })).then((result)=>{
297
+ if (!state.watcher) {
298
+ return result;
299
+ }
300
+ _sharedState.env.DEBUG && console.time("Recording PostCSS dependencies");
301
+ for (let message of result.messages){
302
+ if (message.type === "dependency") {
303
+ state.contextDependencies.add(message.file);
304
+ }
305
+ }
306
+ _sharedState.env.DEBUG && console.timeEnd("Recording PostCSS dependencies");
307
+ // TODO: This needs to be in a different spot
308
+ _sharedState.env.DEBUG && console.time("Watch new files");
309
+ state.watcher.refreshWatchedFiles();
310
+ _sharedState.env.DEBUG && console.timeEnd("Watch new files");
311
+ return result;
312
+ }).then((result)=>{
286
313
  if (!output) {
287
314
  process.stdout.write(result.css);
288
315
  return;
289
316
  }
290
317
  return Promise.all([
291
- (0, _utils.outputFile)(output, result.css),
292
- result.map && (0, _utils.outputFile)(output + ".map", result.map.toString())
318
+ (0, _utils.outputFile)(result.opts.to, result.css),
319
+ result.map && (0, _utils.outputFile)(result.opts.to + ".map", result.map.toString())
293
320
  ]);
294
321
  }).then(()=>{
295
322
  let end = process.hrtime.bigint();
296
323
  console.error();
297
324
  console.error("Done in", (end - start) / BigInt(1e6) + "ms.");
325
+ }).then(()=>{}, (err)=>{
326
+ // TODO: If an initial build fails we can't easily pick up any PostCSS dependencies
327
+ // that were collected before the error occurred
328
+ // The result is not stored on the error so we have to store it externally
329
+ // and pull the messages off of it here somehow
330
+ // This results in a less than ideal DX because the watcher will not pick up
331
+ // changes to imported CSS if one of them caused an error during the initial build
332
+ // If you fix it and then save the main CSS file so there's no error
333
+ // The watcher will start watching the imported CSS files and will be
334
+ // resilient to future errors.
335
+ if (state.watcher) {
336
+ console.error(err);
337
+ } else {
338
+ return Promise.reject(err);
339
+ }
298
340
  });
299
341
  }
300
342
  /**
@@ -311,13 +353,14 @@ async function createProcessor(args, cliConfigPath) {
311
353
  return {
312
354
  build,
313
355
  watch: async ()=>{
314
- state.watcher = (0, _watchingJs.createWatcher)(args, {
356
+ state.watcher = (0, _watching.createWatcher)(args, {
315
357
  state,
316
358
  /**
317
359
  * @param {{file: string, content(): Promise<string>, extension: string}[]} changes
318
360
  */ async rebuild (changes) {
319
361
  let needsNewContext = changes.some((change)=>{
320
- return state.configDependencies.has(change.file) || state.contextDependencies.has(change.file);
362
+ var _state_configBag;
363
+ return ((_state_configBag = state.configBag) === null || _state_configBag === void 0 ? void 0 : _state_configBag.dependencies.has(change.file)) || state.contextDependencies.has(change.file);
321
364
  });
322
365
  if (needsNewContext) {
323
366
  state.context = null;
@@ -10,15 +10,25 @@ function _export(target, all) {
10
10
  });
11
11
  }
12
12
  _export(exports, {
13
- indentRecursive: ()=>indentRecursive,
14
- formatNodes: ()=>formatNodes,
15
- readFileWithRetries: ()=>readFileWithRetries,
16
- drainStdin: ()=>drainStdin,
17
- outputFile: ()=>outputFile
13
+ indentRecursive: function() {
14
+ return indentRecursive;
15
+ },
16
+ formatNodes: function() {
17
+ return formatNodes;
18
+ },
19
+ readFileWithRetries: function() {
20
+ return readFileWithRetries;
21
+ },
22
+ drainStdin: function() {
23
+ return drainStdin;
24
+ },
25
+ outputFile: function() {
26
+ return outputFile;
27
+ }
18
28
  });
19
- const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
20
- const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
21
- function _interopRequireDefault(obj) {
29
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
30
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
31
+ function _interop_require_default(obj) {
22
32
  return obj && obj.__esModule ? obj : {
23
33
  default: obj
24
34
  };
@@ -5,15 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  Object.defineProperty(exports, "createWatcher", {
7
7
  enumerable: true,
8
- get: ()=>createWatcher
8
+ get: function() {
9
+ return createWatcher;
10
+ }
9
11
  });
10
- const _chokidar = /*#__PURE__*/ _interopRequireDefault(require("chokidar"));
11
- const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
12
- const _micromatch = /*#__PURE__*/ _interopRequireDefault(require("micromatch"));
13
- const _normalizePath = /*#__PURE__*/ _interopRequireDefault(require("normalize-path"));
14
- const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
15
- const _utilsJs = require("./utils.js");
16
- function _interopRequireDefault(obj) {
12
+ const _chokidar = /*#__PURE__*/ _interop_require_default(require("chokidar"));
13
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
14
+ const _micromatch = /*#__PURE__*/ _interop_require_default(require("micromatch"));
15
+ const _normalizepath = /*#__PURE__*/ _interop_require_default(require("normalize-path"));
16
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
17
+ const _utils = require("./utils.js");
18
+ function _interop_require_default(obj) {
17
19
  return obj && obj.__esModule ? obj : {
18
20
  default: obj
19
21
  };
@@ -37,22 +39,72 @@ function createWatcher(args, { state , rebuild }) {
37
39
  pollInterval: pollInterval
38
40
  } : false
39
41
  });
42
+ // A queue of rebuilds, file reads, etc… to run
40
43
  let chain = Promise.resolve();
41
- let pendingRebuilds = new Set();
42
- let changedContent = [];
44
+ /**
45
+ * A list of files that have been changed since the last rebuild
46
+ *
47
+ * @type {{file: string, content: () => Promise<string>, extension: string}[]}
48
+ */ let changedContent = [];
49
+ /**
50
+ * A list of files for which a rebuild has already been queued.
51
+ * This is used to prevent duplicate rebuilds when multiple events are fired for the same file.
52
+ * The rebuilt file is cleared from this list when it's associated rebuild has _started_
53
+ * This is because if the file is changed during a rebuild it won't trigger a new rebuild which it should
54
+ **/ let pendingRebuilds = new Set();
55
+ let _timer;
56
+ let _reject;
57
+ /**
58
+ * Rebuilds the changed files and resolves when the rebuild is
59
+ * complete regardless of whether it was successful or not
60
+ */ async function rebuildAndContinue() {
61
+ let changes = changedContent.splice(0);
62
+ // There are no changes to rebuild so we can just do nothing
63
+ if (changes.length === 0) {
64
+ return Promise.resolve();
65
+ }
66
+ // Clear all pending rebuilds for the about-to-be-built files
67
+ changes.forEach((change)=>pendingRebuilds.delete(change.file));
68
+ // Resolve the promise even when the rebuild fails
69
+ return rebuild(changes).then(()=>{}, (e)=>{
70
+ console.error(e.toString());
71
+ });
72
+ }
43
73
  /**
44
74
  *
45
75
  * @param {*} file
46
76
  * @param {(() => Promise<string>) | null} content
47
- */ function recordChangedFile(file, content = null) {
77
+ * @param {boolean} skipPendingCheck
78
+ * @returns {Promise<void>}
79
+ */ function recordChangedFile(file, content = null, skipPendingCheck = false) {
48
80
  file = _path.default.resolve(file);
49
- content = content !== null && content !== void 0 ? content : async ()=>await _fs.default.promises.readFile(file, "utf8");
81
+ // Applications like Vim/Neovim fire both rename and change events in succession for atomic writes
82
+ // In that case rebuild has already been queued by rename, so can be skipped in change
83
+ if (pendingRebuilds.has(file) && !skipPendingCheck) {
84
+ return Promise.resolve();
85
+ }
86
+ // Mark that a rebuild of this file is going to happen
87
+ // It MUST happen synchronously before the rebuild is queued for this to be effective
88
+ pendingRebuilds.add(file);
50
89
  changedContent.push({
51
90
  file,
52
- content,
91
+ content: content !== null && content !== void 0 ? content : ()=>_fs.default.promises.readFile(file, "utf8"),
53
92
  extension: _path.default.extname(file).slice(1)
54
93
  });
55
- chain = chain.then(()=>rebuild(changedContent));
94
+ if (_timer) {
95
+ clearTimeout(_timer);
96
+ _reject();
97
+ }
98
+ // If a rebuild is already in progress we don't want to start another one until the 10ms timer has expired
99
+ chain = chain.then(()=>new Promise((resolve, reject)=>{
100
+ _timer = setTimeout(resolve, 10);
101
+ _reject = reject;
102
+ }));
103
+ // Resolves once this file has been rebuilt (or the rebuild for this file has failed)
104
+ // This queues as many rebuilds as there are changed files
105
+ // But those rebuilds happen after some delay
106
+ // And will immediately resolve if there are no changes
107
+ chain = chain.then(rebuildAndContinue, rebuildAndContinue);
56
108
  return chain;
57
109
  }
58
110
  watcher.on("change", (file)=>recordChangedFile(file));
@@ -61,7 +113,7 @@ function createWatcher(args, { state , rebuild }) {
61
113
  // This can happen when a file is pseudo-atomically replaced (a copy is created, overwritten, the old one is unlinked, and the new one is renamed)
62
114
  // TODO: An an optimization we should allow removal when the config changes
63
115
  watcher.on("unlink", (file)=>{
64
- file = (0, _normalizePath.default)(file);
116
+ file = (0, _normalizepath.default)(file);
65
117
  // Only re-add the file if it's not covered by a dynamic pattern
66
118
  if (!_micromatch.default.some([
67
119
  file
@@ -91,22 +143,39 @@ function createWatcher(args, { state , rebuild }) {
91
143
  if (pendingRebuilds.has(filePath)) {
92
144
  return;
93
145
  }
146
+ // We'll go ahead and add the file to the pending rebuilds list here
147
+ // It'll be removed when the rebuild starts unless the read fails
148
+ // which will be taken care of as well
94
149
  pendingRebuilds.add(filePath);
95
- chain = chain.then(async ()=>{
96
- let content;
150
+ async function enqueue() {
97
151
  try {
98
- content = await (0, _utilsJs.readFileWithRetries)(_path.default.resolve(filePath));
99
- } finally{
100
- pendingRebuilds.delete(filePath);
152
+ // We need to read the file as early as possible outside of the chain
153
+ // because it may be gone by the time we get to it. doing the read
154
+ // immediately increases the chance that the file is still there
155
+ let content = await (0, _utils.readFileWithRetries)(_path.default.resolve(filePath));
156
+ if (content === undefined) {
157
+ return;
158
+ }
159
+ // This will push the rebuild onto the chain
160
+ // We MUST skip the rebuild check here otherwise the rebuild will never happen on Linux
161
+ // This is because the order of events and timing is different on Linux
162
+ // @ts-ignore: TypeScript isn't picking up that content is a string here
163
+ await recordChangedFile(filePath, ()=>content, true);
164
+ } catch {
165
+ // If reading the file fails, it's was probably a deleted temporary file
166
+ // So we can ignore it and no rebuild is needed
101
167
  }
102
- return recordChangedFile(filePath, ()=>content);
168
+ }
169
+ enqueue().then(()=>{
170
+ // If the file read fails we still need to make sure the file isn't stuck in the pending rebuilds list
171
+ pendingRebuilds.delete(filePath);
103
172
  });
104
173
  });
105
174
  return {
106
175
  fswatcher: watcher,
107
176
  refreshWatchedFiles () {
108
177
  watcher.add(Array.from(state.contextDependencies));
109
- watcher.add(Array.from(state.configDependencies));
178
+ watcher.add(Array.from(state.configBag.dependencies));
110
179
  watcher.add(state.contentPatterns.all);
111
180
  }
112
181
  };