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.
- package/README.md +7 -6
- package/lib/cli/build/deps.js +17 -9
- package/lib/cli/build/index.js +20 -10
- package/lib/cli/build/plugin.js +111 -68
- package/lib/cli/build/utils.js +18 -8
- package/lib/cli/build/watching.js +91 -22
- package/lib/cli/help/index.js +6 -4
- package/lib/cli/index.js +222 -10
- package/lib/cli/init/index.js +29 -12
- package/lib/cli-peer-dependencies.js +12 -4
- package/lib/cli.js +4 -226
- package/lib/corePluginList.js +7 -1
- package/lib/corePlugins.js +359 -85
- package/lib/css/preflight.css +4 -0
- package/lib/featureFlags.js +27 -15
- package/lib/index.js +1 -47
- package/lib/lib/cacheInvalidation.js +7 -5
- package/lib/lib/collapseAdjacentRules.js +5 -3
- package/lib/lib/collapseDuplicateDeclarations.js +12 -10
- package/lib/lib/content.js +37 -23
- package/lib/lib/defaultExtractor.js +15 -8
- package/lib/lib/detectNesting.js +10 -2
- package/lib/lib/evaluateTailwindFunctions.js +22 -20
- package/lib/lib/expandApplyAtRules.js +72 -45
- package/lib/lib/expandTailwindAtRules.js +47 -20
- package/lib/lib/findAtConfigPath.js +13 -11
- package/lib/lib/generateRules.js +159 -94
- package/lib/lib/getModuleDependencies.js +85 -37
- package/lib/lib/load-config.js +42 -0
- package/lib/lib/normalizeTailwindDirectives.js +5 -3
- package/lib/lib/offsets.js +93 -4
- package/lib/lib/partitionApplyAtRules.js +3 -1
- package/lib/lib/regex.js +21 -7
- package/lib/lib/remap-bitfield.js +89 -0
- package/lib/lib/resolveDefaultsAtRules.js +28 -24
- package/lib/lib/setupContextUtils.js +209 -137
- package/lib/lib/setupTrackingContext.js +49 -26
- package/lib/lib/sharedState.js +37 -10
- package/lib/lib/substituteScreenAtRules.js +5 -3
- package/lib/oxide/cli/build/deps.js +89 -0
- package/lib/oxide/cli/build/index.js +53 -0
- package/lib/oxide/cli/build/plugin.js +375 -0
- package/lib/oxide/cli/build/utils.js +87 -0
- package/lib/oxide/cli/build/watching.js +179 -0
- package/lib/oxide/cli/help/index.js +72 -0
- package/lib/oxide/cli/index.js +214 -0
- package/lib/oxide/cli/init/index.js +52 -0
- package/lib/oxide/cli.js +5 -0
- package/lib/oxide/postcss-plugin.js +2 -0
- package/lib/plugin.js +98 -0
- package/lib/postcss-plugins/nesting/index.js +3 -1
- package/lib/postcss-plugins/nesting/plugin.js +10 -8
- package/lib/processTailwindFeatures.js +14 -12
- package/lib/public/colors.js +49 -25
- package/lib/public/create-plugin.js +5 -3
- package/lib/public/default-config.js +6 -4
- package/lib/public/default-theme.js +6 -4
- package/lib/public/load-config.js +12 -0
- package/lib/public/resolve-config.js +6 -4
- package/lib/util/applyImportantSelector.js +36 -0
- package/lib/util/bigSign.js +3 -1
- package/lib/util/buildMediaQuery.js +3 -1
- package/lib/util/cloneDeep.js +3 -1
- package/lib/util/cloneNodes.js +5 -3
- package/lib/util/color.js +30 -12
- package/lib/util/colorNames.js +752 -0
- package/lib/util/configurePlugins.js +3 -1
- package/lib/util/createPlugin.js +3 -1
- package/lib/util/createUtilityPlugin.js +7 -5
- package/lib/util/dataTypes.js +74 -17
- package/lib/util/defaults.js +9 -7
- package/lib/util/escapeClassName.js +10 -8
- package/lib/util/escapeCommas.js +3 -1
- package/lib/util/flattenColorPalette.js +3 -1
- package/lib/util/formatVariantSelector.js +140 -162
- package/lib/util/getAllConfigs.js +8 -6
- package/lib/util/hashConfig.js +6 -4
- package/lib/util/isKeyframeRule.js +3 -1
- package/lib/util/isPlainObject.js +3 -1
- package/lib/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +4 -2
- package/lib/util/log.js +8 -4
- package/lib/util/nameClass.js +12 -6
- package/lib/util/negateValue.js +4 -2
- package/lib/util/normalizeConfig.js +42 -27
- package/lib/util/normalizeScreens.js +12 -4
- package/lib/util/parseAnimationValue.js +3 -1
- package/lib/util/parseBoxShadowValue.js +6 -2
- package/lib/util/parseDependency.js +3 -1
- package/lib/util/parseGlob.js +6 -4
- package/lib/util/parseObjectStyles.js +9 -7
- package/lib/util/pluginUtils.js +83 -71
- package/lib/util/prefixSelector.js +27 -11
- package/lib/util/pseudoElements.js +225 -0
- package/lib/util/removeAlphaVariables.js +3 -1
- package/lib/util/resolveConfig.js +21 -24
- package/lib/util/resolveConfigPath.js +26 -10
- package/lib/util/responsive.js +6 -4
- package/lib/util/splitAtTopLevelOnly.js +10 -2
- package/lib/util/tap.js +3 -1
- package/lib/util/toColorValue.js +3 -1
- package/lib/util/toPath.js +3 -1
- package/lib/util/transformThemeValue.js +6 -4
- package/lib/util/validateConfig.js +16 -3
- package/lib/util/validateFormalSyntax.js +3 -1
- package/lib/util/withAlphaVariable.js +6 -2
- package/loadConfig.d.ts +4 -0
- package/loadConfig.js +2 -0
- package/package.json +47 -39
- package/peers/index.js +63386 -46424
- package/resolveConfig.d.ts +11 -2
- package/scripts/release-channel.js +18 -0
- package/scripts/release-notes.js +21 -0
- package/scripts/swap-engines.js +40 -0
- package/src/cli/build/index.js +13 -9
- package/src/cli/build/plugin.js +80 -33
- package/src/cli/build/watching.js +108 -13
- package/src/cli/index.js +216 -3
- package/src/cli/init/index.js +37 -8
- package/src/cli.js +4 -220
- package/src/corePluginList.js +1 -1
- package/src/corePlugins.js +220 -43
- package/src/css/preflight.css +4 -0
- package/src/featureFlags.js +6 -0
- package/src/index.js +1 -47
- package/src/lib/content.js +19 -16
- package/src/lib/defaultExtractor.js +9 -3
- package/src/lib/detectNesting.js +9 -1
- package/src/lib/expandApplyAtRules.js +43 -16
- package/src/lib/expandTailwindAtRules.js +36 -7
- package/src/lib/findAtConfigPath.js +4 -6
- package/src/lib/generateRules.js +126 -41
- package/src/lib/getModuleDependencies.js +70 -30
- package/src/lib/load-config.ts +31 -0
- package/src/lib/offsets.js +104 -1
- package/src/lib/remap-bitfield.js +82 -0
- package/src/lib/setupContextUtils.js +127 -66
- package/src/lib/setupTrackingContext.js +36 -11
- package/src/lib/sharedState.js +15 -4
- package/src/oxide/cli/build/deps.ts +91 -0
- package/src/oxide/cli/build/index.ts +47 -0
- package/src/oxide/cli/build/plugin.ts +442 -0
- package/src/oxide/cli/build/utils.ts +74 -0
- package/src/oxide/cli/build/watching.ts +225 -0
- package/src/oxide/cli/help/index.ts +69 -0
- package/src/oxide/cli/index.ts +204 -0
- package/src/oxide/cli/init/index.ts +59 -0
- package/src/oxide/cli.ts +1 -0
- package/src/oxide/postcss-plugin.ts +1 -0
- package/src/plugin.js +107 -0
- package/src/public/colors.js +22 -0
- package/src/public/default-config.js +1 -1
- package/src/public/default-theme.js +2 -2
- package/src/public/load-config.js +2 -0
- package/src/util/applyImportantSelector.js +27 -0
- package/src/util/color.js +18 -3
- package/src/util/colorNames.js +150 -0
- package/src/util/dataTypes.js +33 -4
- package/src/util/formatVariantSelector.js +162 -165
- package/src/util/getAllConfigs.js +2 -2
- package/src/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +1 -1
- package/src/util/negateValue.js +1 -1
- package/src/util/normalizeConfig.js +20 -1
- package/src/util/pluginUtils.js +50 -39
- package/src/util/prefixSelector.js +28 -10
- package/src/util/pseudoElements.js +170 -0
- package/src/util/resolveConfig.js +3 -9
- package/src/util/resolveConfigPath.js +12 -1
- package/src/util/splitAtTopLevelOnly.js +8 -1
- package/src/util/validateConfig.js +13 -0
- package/stubs/.gitignore +1 -0
- package/stubs/.prettierrc.json +6 -0
- package/stubs/{defaultConfig.stub.js → config.full.js} +183 -163
- package/stubs/{simpleConfig.stub.js → config.simple.js} +0 -1
- package/stubs/postcss.config.js +6 -0
- package/stubs/tailwind.config.cjs +2 -0
- package/stubs/tailwind.config.js +2 -0
- package/stubs/tailwind.config.ts +3 -0
- package/types/config.d.ts +16 -9
- package/types/generated/colors.d.ts +22 -0
- package/types/generated/corePluginList.d.ts +1 -1
- package/types/generated/default-theme.d.ts +108 -79
- package/CHANGELOG.md +0 -2282
- package/lib/cli/shared.js +0 -12
- package/lib/constants.js +0 -44
- package/scripts/calculate-tag-name.js +0 -8
- package/scripts/install-integrations.js +0 -27
- package/scripts/rebuildFixtures.js +0 -68
- package/src/cli/shared.js +0 -5
- package/src/constants.js +0 -17
- /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
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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/
|
|
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>
|
package/lib/cli/build/deps.js
CHANGED
|
@@ -10,25 +10,33 @@ function _export(target, all) {
|
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
_export(exports, {
|
|
13
|
-
loadPostcss: ()
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
61
|
+
return (0, _index.lazyAutoprefixer)();
|
|
54
62
|
}
|
package/lib/cli/build/index.js
CHANGED
|
@@ -5,17 +5,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
Object.defineProperty(exports, "build", {
|
|
7
7
|
enumerable: true,
|
|
8
|
-
get: ()
|
|
8
|
+
get: function() {
|
|
9
|
+
return build;
|
|
10
|
+
}
|
|
9
11
|
});
|
|
10
|
-
const _fs = /*#__PURE__*/
|
|
11
|
-
const _path = /*#__PURE__*/
|
|
12
|
-
const
|
|
13
|
-
|
|
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
|
|
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"] : (
|
|
36
|
-
let processor = await (0,
|
|
38
|
+
let configPath = args["--config"] ? args["--config"] : (0, _resolveConfigPath.resolveDefaultConfigPath)();
|
|
39
|
+
let processor = await (0, _plugin.createProcessor)(args, configPath);
|
|
37
40
|
if (shouldWatch) {
|
|
38
|
-
|
|
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
|
}
|
package/lib/cli/build/plugin.js
CHANGED
|
@@ -5,28 +5,31 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
Object.defineProperty(exports, "createProcessor", {
|
|
7
7
|
enumerable: true,
|
|
8
|
-
get: ()
|
|
8
|
+
get: function() {
|
|
9
|
+
return createProcessor;
|
|
10
|
+
}
|
|
9
11
|
});
|
|
10
|
-
const _path = /*#__PURE__*/
|
|
11
|
-
const _fs = /*#__PURE__*/
|
|
12
|
-
const
|
|
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__*/
|
|
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__*/
|
|
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__*/
|
|
20
|
+
const _processTailwindFeatures = /*#__PURE__*/ _interop_require_default(require("../../processTailwindFeatures"));
|
|
19
21
|
const _deps = require("./deps");
|
|
20
22
|
const _utils = require("./utils");
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
117
|
-
this.contentPaths = (0,
|
|
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(
|
|
133
|
+
this.refreshConfigDependencies();
|
|
131
134
|
}
|
|
132
|
-
let config =
|
|
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,
|
|
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 (
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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 =
|
|
168
|
+
let files = _fastglob.default.sync(this.contentPatterns.all);
|
|
163
169
|
for (let file of files){
|
|
164
|
-
|
|
165
|
-
content
|
|
166
|
-
|
|
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:
|
|
174
|
-
|
|
175
|
-
content:
|
|
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
|
-
|
|
187
|
-
var
|
|
188
|
-
let configPath = (
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
193
|
-
|
|
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
|
-
|
|
199
|
-
|
|
211
|
+
_sharedState.env.DEBUG && console.timeEnd("Creating context");
|
|
212
|
+
_sharedState.env.DEBUG && console.time("Resolving content paths");
|
|
200
213
|
this.refreshContentPaths();
|
|
201
|
-
|
|
214
|
+
_sharedState.env.DEBUG && console.timeEnd("Resolving content paths");
|
|
202
215
|
if (this.watcher) {
|
|
203
|
-
|
|
216
|
+
_sharedState.env.DEBUG && console.time("Watch new files");
|
|
204
217
|
this.watcher.refreshWatchedFiles();
|
|
205
|
-
|
|
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
|
|
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
|
|
233
|
-
let content = (
|
|
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
|
-
|
|
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
|
-
|
|
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)(
|
|
292
|
-
result.map && (0, _utils.outputFile)(
|
|
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,
|
|
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
|
-
|
|
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;
|
package/lib/cli/build/utils.js
CHANGED
|
@@ -10,15 +10,25 @@ function _export(target, all) {
|
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
_export(exports, {
|
|
13
|
-
indentRecursive: ()
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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__*/
|
|
20
|
-
const _path = /*#__PURE__*/
|
|
21
|
-
function
|
|
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: ()
|
|
8
|
+
get: function() {
|
|
9
|
+
return createWatcher;
|
|
10
|
+
}
|
|
9
11
|
});
|
|
10
|
-
const _chokidar = /*#__PURE__*/
|
|
11
|
-
const _fs = /*#__PURE__*/
|
|
12
|
-
const _micromatch = /*#__PURE__*/
|
|
13
|
-
const
|
|
14
|
-
const _path = /*#__PURE__*/
|
|
15
|
-
const
|
|
16
|
-
function
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
77
|
+
* @param {boolean} skipPendingCheck
|
|
78
|
+
* @returns {Promise<void>}
|
|
79
|
+
*/ function recordChangedFile(file, content = null, skipPendingCheck = false) {
|
|
48
80
|
file = _path.default.resolve(file);
|
|
49
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
96
|
-
let content;
|
|
150
|
+
async function enqueue() {
|
|
97
151
|
try {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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.
|
|
178
|
+
watcher.add(Array.from(state.configBag.dependencies));
|
|
110
179
|
watcher.add(state.contentPatterns.all);
|
|
111
180
|
}
|
|
112
181
|
};
|