tailwindcss 0.0.0-insiders.293ee90 → 0.0.0-insiders.2a40326
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 +1 -1
- package/lib/cli/build/plugin.js +18 -13
- package/lib/cli/index.js +231 -10
- package/lib/cli/init/index.js +2 -2
- package/lib/cli/shared.js +2 -1
- package/lib/cli.js +4 -236
- package/lib/corePlugins.js +26 -26
- package/lib/featureFlags.js +8 -8
- package/lib/index.js +4 -46
- package/lib/lib/collapseAdjacentRules.js +2 -2
- package/lib/lib/collapseDuplicateDeclarations.js +2 -2
- package/lib/lib/content.js +16 -16
- package/lib/lib/defaultExtractor.js +10 -5
- package/lib/lib/detectNesting.js +7 -1
- package/lib/lib/evaluateTailwindFunctions.js +4 -4
- package/lib/lib/expandApplyAtRules.js +2 -2
- package/lib/lib/expandTailwindAtRules.js +37 -9
- package/lib/lib/findAtConfigPath.js +3 -3
- package/lib/lib/generateRules.js +90 -41
- package/lib/lib/offsets.js +83 -1
- package/lib/lib/remap-bitfield.js +87 -0
- package/lib/lib/resolveDefaultsAtRules.js +4 -4
- package/lib/lib/setupContextUtils.js +89 -61
- package/lib/lib/setupTrackingContext.js +25 -4
- package/lib/lib/sharedState.js +2 -1
- package/lib/oxide/cli/build/deps.js +81 -0
- package/lib/oxide/cli/build/index.js +47 -0
- package/lib/oxide/cli/build/plugin.js +364 -0
- package/lib/oxide/cli/build/utils.js +77 -0
- package/lib/oxide/cli/build/watching.js +177 -0
- package/lib/oxide/cli/help/index.js +70 -0
- package/lib/oxide/cli/index.js +220 -0
- package/lib/oxide/cli/init/index.js +35 -0
- package/lib/oxide/cli/shared.js +12 -0
- package/lib/oxide/cli.js +5 -0
- package/lib/oxide/postcss-plugin.js +2 -0
- package/lib/plugin.js +48 -0
- package/lib/postcss-plugins/nesting/plugin.js +2 -2
- package/lib/util/cloneNodes.js +2 -2
- package/lib/util/color.js +4 -4
- package/lib/util/createUtilityPlugin.js +2 -2
- package/lib/util/dataTypes.js +26 -2
- package/lib/util/defaults.js +4 -4
- package/lib/util/escapeClassName.js +3 -3
- package/lib/util/formatVariantSelector.js +170 -104
- package/lib/util/getAllConfigs.js +2 -2
- package/lib/util/negateValue.js +2 -2
- package/lib/util/normalizeConfig.js +22 -22
- package/lib/util/pluginUtils.js +15 -15
- package/lib/util/prefixSelector.js +22 -8
- package/lib/util/resolveConfig.js +7 -7
- package/oxide-node-api-shim/index.js +21 -0
- package/oxide-node-api-shim/package.json +5 -0
- package/package.json +32 -18
- package/peers/index.js +107 -172
- package/src/cli/build/plugin.js +11 -6
- package/src/cli/index.js +234 -3
- package/src/cli/shared.js +1 -0
- package/src/cli.js +4 -231
- package/src/corePlugins.js +6 -2
- package/src/index.js +4 -46
- package/src/lib/content.js +12 -17
- package/src/lib/defaultExtractor.js +9 -3
- package/src/lib/detectNesting.js +9 -1
- package/src/lib/expandTailwindAtRules.js +40 -6
- package/src/lib/generateRules.js +77 -23
- package/src/lib/offsets.js +98 -1
- package/src/lib/remap-bitfield.js +82 -0
- package/src/lib/setupContextUtils.js +72 -35
- package/src/lib/setupTrackingContext.js +31 -6
- package/src/lib/sharedState.js +1 -0
- 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 +436 -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 +212 -0
- package/src/oxide/cli/init/index.ts +32 -0
- package/src/oxide/cli/shared.ts +4 -0
- package/src/oxide/cli.ts +1 -0
- package/src/oxide/postcss-plugin.ts +1 -0
- package/src/plugin.js +47 -0
- package/src/util/dataTypes.js +29 -4
- package/src/util/formatVariantSelector.js +214 -121
- package/src/util/negateValue.js +1 -1
- package/src/util/prefixSelector.js +28 -10
- package/stubs/defaultConfig.stub.js +3 -0
- package/types/config.d.ts +6 -1
- package/types/generated/default-theme.d.ts +5 -2
- package/CHANGELOG.md +0 -2340
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
17
|
-
<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/nodejs.yml?branch=master" alt="Build Status"></a>
|
|
18
18
|
<a href="https://www.npmjs.com/package/tailwindcss"><img src="https://img.shields.io/npm/dt/tailwindcss.svg" alt="Total Downloads"></a>
|
|
19
19
|
<a href="https://github.com/tailwindcss/tailwindcss/releases"><img src="https://img.shields.io/npm/v/tailwindcss.svg" alt="Latest Release"></a>
|
|
20
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/plugin.js
CHANGED
|
@@ -113,8 +113,8 @@ let state = {
|
|
|
113
113
|
contextDependencies: new Set(),
|
|
114
114
|
/** @type {import('../../lib/content.js').ContentPath[]} */ contentPaths: [],
|
|
115
115
|
refreshContentPaths () {
|
|
116
|
-
var
|
|
117
|
-
this.contentPaths = (0, _contentJs.parseCandidateFiles)(this.context, (
|
|
116
|
+
var _this_context;
|
|
117
|
+
this.contentPaths = (0, _contentJs.parseCandidateFiles)(this.context, (_this_context = this.context) === null || _this_context === void 0 ? void 0 : _this_context.tailwindConfig);
|
|
118
118
|
},
|
|
119
119
|
get config () {
|
|
120
120
|
return this.context.tailwindConfig;
|
|
@@ -161,10 +161,17 @@ let state = {
|
|
|
161
161
|
// TODO: When we make the postcss plugin async-capable this can become async
|
|
162
162
|
let files = _fastGlob.default.sync(this.contentPatterns.all);
|
|
163
163
|
for (let file of files){
|
|
164
|
-
|
|
165
|
-
content
|
|
166
|
-
|
|
167
|
-
|
|
164
|
+
if (_shared.env.OXIDE) {
|
|
165
|
+
content.push({
|
|
166
|
+
file,
|
|
167
|
+
extension: _path.default.extname(file).slice(1)
|
|
168
|
+
});
|
|
169
|
+
} else {
|
|
170
|
+
content.push({
|
|
171
|
+
content: _fs.default.readFileSync(_path.default.resolve(file), "utf8"),
|
|
172
|
+
extension: _path.default.extname(file).slice(1)
|
|
173
|
+
});
|
|
174
|
+
}
|
|
168
175
|
}
|
|
169
176
|
// Resolve raw content in the tailwind config
|
|
170
177
|
let rawContent = this.config.content.files.filter((file)=>{
|
|
@@ -184,8 +191,8 @@ let state = {
|
|
|
184
191
|
return this.context;
|
|
185
192
|
}
|
|
186
193
|
_shared.env.DEBUG && console.time("Searching for config");
|
|
187
|
-
var
|
|
188
|
-
let configPath = (
|
|
194
|
+
var _findAtConfigPath;
|
|
195
|
+
let configPath = (_findAtConfigPath = (0, _findAtConfigPathJs.findAtConfigPath)(root, result)) !== null && _findAtConfigPath !== void 0 ? _findAtConfigPath : cliConfigPath;
|
|
189
196
|
_shared.env.DEBUG && console.timeEnd("Searching for config");
|
|
190
197
|
_shared.env.DEBUG && console.time("Loading config");
|
|
191
198
|
let config = this.loadConfig(configPath, content);
|
|
@@ -204,16 +211,14 @@ let state = {
|
|
|
204
211
|
this.watcher.refreshWatchedFiles();
|
|
205
212
|
_shared.env.DEBUG && console.timeEnd("Watch new files");
|
|
206
213
|
}
|
|
207
|
-
_shared.env.DEBUG && console.time("Reading content files");
|
|
208
214
|
for (let file of this.readContentPaths()){
|
|
209
215
|
this.context.changedContent.push(file);
|
|
210
216
|
}
|
|
211
|
-
_shared.env.DEBUG && console.timeEnd("Reading content files");
|
|
212
217
|
return this.context;
|
|
213
218
|
}
|
|
214
219
|
};
|
|
215
220
|
async function createProcessor(args, cliConfigPath) {
|
|
216
|
-
var
|
|
221
|
+
var _args_content;
|
|
217
222
|
let postcss = (0, _deps.loadPostcss)();
|
|
218
223
|
let input = args["--input"];
|
|
219
224
|
let output = args["--output"];
|
|
@@ -229,8 +234,8 @@ async function createProcessor(args, cliConfigPath) {
|
|
|
229
234
|
args["--content"] = args["--purge"];
|
|
230
235
|
}
|
|
231
236
|
}
|
|
232
|
-
var
|
|
233
|
-
let content = (
|
|
237
|
+
var _args_content_split;
|
|
238
|
+
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
239
|
let tailwindPlugin = ()=>{
|
|
235
240
|
return {
|
|
236
241
|
postcssPlugin: "tailwindcss",
|
package/lib/cli/index.js
CHANGED
|
@@ -1,18 +1,239 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
"use strict";
|
|
2
3
|
Object.defineProperty(exports, "__esModule", {
|
|
3
4
|
value: true
|
|
4
5
|
});
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
|
|
7
|
+
const _arg = /*#__PURE__*/ _interopRequireDefault(require("arg"));
|
|
8
|
+
const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
|
|
9
|
+
const _build = require("./build");
|
|
10
|
+
const _help = require("./help");
|
|
11
|
+
const _init = require("./init");
|
|
12
|
+
function _interopRequireDefault(obj) {
|
|
13
|
+
return obj && obj.__esModule ? obj : {
|
|
14
|
+
default: obj
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function isESM() {
|
|
18
|
+
const pkgPath = _path.default.resolve("./package.json");
|
|
19
|
+
try {
|
|
20
|
+
let pkg = JSON.parse(_fs.default.readFileSync(pkgPath, "utf8"));
|
|
21
|
+
return pkg.type && pkg.type === "module";
|
|
22
|
+
} catch (err) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
let configs = isESM() ? {
|
|
27
|
+
tailwind: "tailwind.config.cjs",
|
|
28
|
+
postcss: "postcss.config.cjs"
|
|
29
|
+
} : {
|
|
30
|
+
tailwind: "tailwind.config.js",
|
|
31
|
+
postcss: "postcss.config.js"
|
|
32
|
+
};
|
|
33
|
+
// ---
|
|
34
|
+
function oneOf(...options) {
|
|
35
|
+
return Object.assign((value = true)=>{
|
|
36
|
+
for (let option of options){
|
|
37
|
+
let parsed = option(value);
|
|
38
|
+
if (parsed === value) {
|
|
39
|
+
return parsed;
|
|
14
40
|
}
|
|
41
|
+
}
|
|
42
|
+
throw new Error("...");
|
|
43
|
+
}, {
|
|
44
|
+
manualParsing: true
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
let commands = {
|
|
48
|
+
init: {
|
|
49
|
+
run: _init.init,
|
|
50
|
+
args: {
|
|
51
|
+
"--full": {
|
|
52
|
+
type: Boolean,
|
|
53
|
+
description: `Initialize a full \`${configs.tailwind}\` file`
|
|
54
|
+
},
|
|
55
|
+
"--postcss": {
|
|
56
|
+
type: Boolean,
|
|
57
|
+
description: `Initialize a \`${configs.postcss}\` file`
|
|
58
|
+
},
|
|
59
|
+
"-f": "--full",
|
|
60
|
+
"-p": "--postcss"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
build: {
|
|
64
|
+
run: _build.build,
|
|
65
|
+
args: {
|
|
66
|
+
"--input": {
|
|
67
|
+
type: String,
|
|
68
|
+
description: "Input file"
|
|
69
|
+
},
|
|
70
|
+
"--output": {
|
|
71
|
+
type: String,
|
|
72
|
+
description: "Output file"
|
|
73
|
+
},
|
|
74
|
+
"--watch": {
|
|
75
|
+
type: oneOf(String, Boolean),
|
|
76
|
+
description: "Watch for changes and rebuild as needed"
|
|
77
|
+
},
|
|
78
|
+
"--poll": {
|
|
79
|
+
type: Boolean,
|
|
80
|
+
description: "Use polling instead of filesystem events when watching"
|
|
81
|
+
},
|
|
82
|
+
"--content": {
|
|
83
|
+
type: String,
|
|
84
|
+
description: "Content paths to use for removing unused classes"
|
|
85
|
+
},
|
|
86
|
+
"--purge": {
|
|
87
|
+
type: String,
|
|
88
|
+
deprecated: true
|
|
89
|
+
},
|
|
90
|
+
"--postcss": {
|
|
91
|
+
type: oneOf(String, Boolean),
|
|
92
|
+
description: "Load custom PostCSS configuration"
|
|
93
|
+
},
|
|
94
|
+
"--minify": {
|
|
95
|
+
type: Boolean,
|
|
96
|
+
description: "Minify the output"
|
|
97
|
+
},
|
|
98
|
+
"--config": {
|
|
99
|
+
type: String,
|
|
100
|
+
description: "Path to a custom config file"
|
|
101
|
+
},
|
|
102
|
+
"--no-autoprefixer": {
|
|
103
|
+
type: Boolean,
|
|
104
|
+
description: "Disable autoprefixer"
|
|
105
|
+
},
|
|
106
|
+
"-c": "--config",
|
|
107
|
+
"-i": "--input",
|
|
108
|
+
"-o": "--output",
|
|
109
|
+
"-m": "--minify",
|
|
110
|
+
"-w": "--watch",
|
|
111
|
+
"-p": "--poll"
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
let sharedFlags = {
|
|
116
|
+
"--help": {
|
|
117
|
+
type: Boolean,
|
|
118
|
+
description: "Display usage information"
|
|
119
|
+
},
|
|
120
|
+
"-h": "--help"
|
|
121
|
+
};
|
|
122
|
+
if (process.stdout.isTTY /* Detect redirecting output to a file */ && (process.argv[2] === undefined || process.argv.slice(2).every((flag)=>sharedFlags[flag] !== undefined))) {
|
|
123
|
+
(0, _help.help)({
|
|
124
|
+
usage: [
|
|
125
|
+
"tailwindcss [--input input.css] [--output output.css] [--watch] [options...]",
|
|
126
|
+
"tailwindcss init [--full] [--postcss] [options...]"
|
|
127
|
+
],
|
|
128
|
+
commands: Object.keys(commands).filter((command)=>command !== "build").map((command)=>`${command} [options]`),
|
|
129
|
+
options: {
|
|
130
|
+
...commands.build.args,
|
|
131
|
+
...sharedFlags
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
process.exit(0);
|
|
135
|
+
}
|
|
136
|
+
let command = ((arg = "")=>arg.startsWith("-") ? undefined : arg)(process.argv[2]) || "build";
|
|
137
|
+
if (commands[command] === undefined) {
|
|
138
|
+
if (_fs.default.existsSync(_path.default.resolve(command))) {
|
|
139
|
+
// TODO: Deprecate this in future versions
|
|
140
|
+
// Check if non-existing command, might be a file.
|
|
141
|
+
command = "build";
|
|
142
|
+
} else {
|
|
143
|
+
(0, _help.help)({
|
|
144
|
+
message: `Invalid command: ${command}`,
|
|
145
|
+
usage: [
|
|
146
|
+
"tailwindcss <command> [options]"
|
|
147
|
+
],
|
|
148
|
+
commands: Object.keys(commands).filter((command)=>command !== "build").map((command)=>`${command} [options]`),
|
|
149
|
+
options: sharedFlags
|
|
150
|
+
});
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Execute command
|
|
155
|
+
let { args: flags , run } = commands[command];
|
|
156
|
+
let args = (()=>{
|
|
157
|
+
try {
|
|
158
|
+
let result = (0, _arg.default)(Object.fromEntries(Object.entries({
|
|
159
|
+
...flags,
|
|
160
|
+
...sharedFlags
|
|
161
|
+
}).filter(([_key, value])=>{
|
|
162
|
+
var _value_type;
|
|
163
|
+
return !(value === null || value === void 0 ? void 0 : (_value_type = value.type) === null || _value_type === void 0 ? void 0 : _value_type.manualParsing);
|
|
164
|
+
}).map(([key, value])=>[
|
|
165
|
+
key,
|
|
166
|
+
typeof value === "object" ? value.type : value
|
|
167
|
+
])), {
|
|
168
|
+
permissive: true
|
|
15
169
|
});
|
|
170
|
+
// Manual parsing of flags to allow for special flags like oneOf(Boolean, String)
|
|
171
|
+
for(let i = result["_"].length - 1; i >= 0; --i){
|
|
172
|
+
let flag = result["_"][i];
|
|
173
|
+
if (!flag.startsWith("-")) continue;
|
|
174
|
+
let [flagName, flagValue] = flag.split("=");
|
|
175
|
+
let handler = flags[flagName];
|
|
176
|
+
// Resolve flagName & handler
|
|
177
|
+
while(typeof handler === "string"){
|
|
178
|
+
flagName = handler;
|
|
179
|
+
handler = flags[handler];
|
|
180
|
+
}
|
|
181
|
+
if (!handler) continue;
|
|
182
|
+
let args = [];
|
|
183
|
+
let offset = i + 1;
|
|
184
|
+
// --flag value syntax was used so we need to pull `value` from `args`
|
|
185
|
+
if (flagValue === undefined) {
|
|
186
|
+
// Parse args for current flag
|
|
187
|
+
while(result["_"][offset] && !result["_"][offset].startsWith("-")){
|
|
188
|
+
args.push(result["_"][offset++]);
|
|
189
|
+
}
|
|
190
|
+
// Cleanup manually parsed flags + args
|
|
191
|
+
result["_"].splice(i, 1 + args.length);
|
|
192
|
+
// No args were provided, use default value defined in handler
|
|
193
|
+
// One arg was provided, use that directly
|
|
194
|
+
// Multiple args were provided so pass them all in an array
|
|
195
|
+
flagValue = args.length === 0 ? undefined : args.length === 1 ? args[0] : args;
|
|
196
|
+
} else {
|
|
197
|
+
// Remove the whole flag from the args array
|
|
198
|
+
result["_"].splice(i, 1);
|
|
199
|
+
}
|
|
200
|
+
// Set the resolved value in the `result` object
|
|
201
|
+
result[flagName] = handler.type(flagValue, flagName);
|
|
202
|
+
}
|
|
203
|
+
// Ensure that the `command` is always the first argument in the `args`.
|
|
204
|
+
// This is important so that we don't have to check if a default command
|
|
205
|
+
// (build) was used or not from within each plugin.
|
|
206
|
+
//
|
|
207
|
+
// E.g.: tailwindcss input.css -> _: ['build', 'input.css']
|
|
208
|
+
// E.g.: tailwindcss build input.css -> _: ['build', 'input.css']
|
|
209
|
+
if (result["_"][0] !== command) {
|
|
210
|
+
result["_"].unshift(command);
|
|
211
|
+
}
|
|
212
|
+
return result;
|
|
213
|
+
} catch (err) {
|
|
214
|
+
if (err.code === "ARG_UNKNOWN_OPTION") {
|
|
215
|
+
(0, _help.help)({
|
|
216
|
+
message: err.message,
|
|
217
|
+
usage: [
|
|
218
|
+
"tailwindcss <command> [options]"
|
|
219
|
+
],
|
|
220
|
+
options: sharedFlags
|
|
221
|
+
});
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
throw err;
|
|
225
|
+
}
|
|
226
|
+
})();
|
|
227
|
+
if (args["--help"]) {
|
|
228
|
+
(0, _help.help)({
|
|
229
|
+
options: {
|
|
230
|
+
...flags,
|
|
231
|
+
...sharedFlags
|
|
232
|
+
},
|
|
233
|
+
usage: [
|
|
234
|
+
`tailwindcss ${command} [options]`
|
|
235
|
+
]
|
|
16
236
|
});
|
|
17
|
-
|
|
237
|
+
process.exit(0);
|
|
18
238
|
}
|
|
239
|
+
run(args, configs);
|
package/lib/cli/init/index.js
CHANGED
|
@@ -16,8 +16,8 @@ function _interopRequireDefault(obj) {
|
|
|
16
16
|
}
|
|
17
17
|
function init(args, configs) {
|
|
18
18
|
let messages = [];
|
|
19
|
-
var
|
|
20
|
-
let tailwindConfigLocation = _path.default.resolve((
|
|
19
|
+
var _args___;
|
|
20
|
+
let tailwindConfigLocation = _path.default.resolve((_args___ = args["_"][1]) !== null && _args___ !== void 0 ? _args___ : `./${configs.tailwind}`);
|
|
21
21
|
if (_fs.default.existsSync(tailwindConfigLocation)) {
|
|
22
22
|
messages.push(`${_path.default.basename(tailwindConfigLocation)} already exists.`);
|
|
23
23
|
} else {
|
package/lib/cli/shared.js
CHANGED
package/lib/cli.js
CHANGED
|
@@ -1,239 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
const _arg = /*#__PURE__*/ _interopRequireDefault(require("arg"));
|
|
8
|
-
const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
|
|
9
|
-
const _build = require("./cli/build");
|
|
10
|
-
const _help = require("./cli/help");
|
|
11
|
-
const _init = require("./cli/init");
|
|
12
|
-
function _interopRequireDefault(obj) {
|
|
13
|
-
return obj && obj.__esModule ? obj : {
|
|
14
|
-
default: obj
|
|
15
|
-
};
|
|
3
|
+
if (process.env.OXIDE) {
|
|
4
|
+
module.exports = require("./oxide/cli");
|
|
5
|
+
} else {
|
|
6
|
+
module.exports = require("./cli/index");
|
|
16
7
|
}
|
|
17
|
-
function isESM() {
|
|
18
|
-
const pkgPath = _path.default.resolve("./package.json");
|
|
19
|
-
try {
|
|
20
|
-
let pkg = JSON.parse(_fs.default.readFileSync(pkgPath, "utf8"));
|
|
21
|
-
return pkg.type && pkg.type === "module";
|
|
22
|
-
} catch (err) {
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
let configs = isESM() ? {
|
|
27
|
-
tailwind: "tailwind.config.cjs",
|
|
28
|
-
postcss: "postcss.config.cjs"
|
|
29
|
-
} : {
|
|
30
|
-
tailwind: "tailwind.config.js",
|
|
31
|
-
postcss: "postcss.config.js"
|
|
32
|
-
};
|
|
33
|
-
// ---
|
|
34
|
-
function oneOf(...options) {
|
|
35
|
-
return Object.assign((value = true)=>{
|
|
36
|
-
for (let option of options){
|
|
37
|
-
let parsed = option(value);
|
|
38
|
-
if (parsed === value) {
|
|
39
|
-
return parsed;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
throw new Error("...");
|
|
43
|
-
}, {
|
|
44
|
-
manualParsing: true
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
let commands = {
|
|
48
|
-
init: {
|
|
49
|
-
run: _init.init,
|
|
50
|
-
args: {
|
|
51
|
-
"--full": {
|
|
52
|
-
type: Boolean,
|
|
53
|
-
description: `Initialize a full \`${configs.tailwind}\` file`
|
|
54
|
-
},
|
|
55
|
-
"--postcss": {
|
|
56
|
-
type: Boolean,
|
|
57
|
-
description: `Initialize a \`${configs.postcss}\` file`
|
|
58
|
-
},
|
|
59
|
-
"-f": "--full",
|
|
60
|
-
"-p": "--postcss"
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
build: {
|
|
64
|
-
run: _build.build,
|
|
65
|
-
args: {
|
|
66
|
-
"--input": {
|
|
67
|
-
type: String,
|
|
68
|
-
description: "Input file"
|
|
69
|
-
},
|
|
70
|
-
"--output": {
|
|
71
|
-
type: String,
|
|
72
|
-
description: "Output file"
|
|
73
|
-
},
|
|
74
|
-
"--watch": {
|
|
75
|
-
type: oneOf(String, Boolean),
|
|
76
|
-
description: "Watch for changes and rebuild as needed"
|
|
77
|
-
},
|
|
78
|
-
"--poll": {
|
|
79
|
-
type: Boolean,
|
|
80
|
-
description: "Use polling instead of filesystem events when watching"
|
|
81
|
-
},
|
|
82
|
-
"--content": {
|
|
83
|
-
type: String,
|
|
84
|
-
description: "Content paths to use for removing unused classes"
|
|
85
|
-
},
|
|
86
|
-
"--purge": {
|
|
87
|
-
type: String,
|
|
88
|
-
deprecated: true
|
|
89
|
-
},
|
|
90
|
-
"--postcss": {
|
|
91
|
-
type: oneOf(String, Boolean),
|
|
92
|
-
description: "Load custom PostCSS configuration"
|
|
93
|
-
},
|
|
94
|
-
"--minify": {
|
|
95
|
-
type: Boolean,
|
|
96
|
-
description: "Minify the output"
|
|
97
|
-
},
|
|
98
|
-
"--config": {
|
|
99
|
-
type: String,
|
|
100
|
-
description: "Path to a custom config file"
|
|
101
|
-
},
|
|
102
|
-
"--no-autoprefixer": {
|
|
103
|
-
type: Boolean,
|
|
104
|
-
description: "Disable autoprefixer"
|
|
105
|
-
},
|
|
106
|
-
"-c": "--config",
|
|
107
|
-
"-i": "--input",
|
|
108
|
-
"-o": "--output",
|
|
109
|
-
"-m": "--minify",
|
|
110
|
-
"-w": "--watch",
|
|
111
|
-
"-p": "--poll"
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
let sharedFlags = {
|
|
116
|
-
"--help": {
|
|
117
|
-
type: Boolean,
|
|
118
|
-
description: "Display usage information"
|
|
119
|
-
},
|
|
120
|
-
"-h": "--help"
|
|
121
|
-
};
|
|
122
|
-
if (process.stdout.isTTY /* Detect redirecting output to a file */ && (process.argv[2] === undefined || process.argv.slice(2).every((flag)=>sharedFlags[flag] !== undefined))) {
|
|
123
|
-
(0, _help.help)({
|
|
124
|
-
usage: [
|
|
125
|
-
"tailwindcss [--input input.css] [--output output.css] [--watch] [options...]",
|
|
126
|
-
"tailwindcss init [--full] [--postcss] [options...]"
|
|
127
|
-
],
|
|
128
|
-
commands: Object.keys(commands).filter((command)=>command !== "build").map((command)=>`${command} [options]`),
|
|
129
|
-
options: {
|
|
130
|
-
...commands.build.args,
|
|
131
|
-
...sharedFlags
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
process.exit(0);
|
|
135
|
-
}
|
|
136
|
-
let command = ((arg = "")=>arg.startsWith("-") ? undefined : arg)(process.argv[2]) || "build";
|
|
137
|
-
if (commands[command] === undefined) {
|
|
138
|
-
if (_fs.default.existsSync(_path.default.resolve(command))) {
|
|
139
|
-
// TODO: Deprecate this in future versions
|
|
140
|
-
// Check if non-existing command, might be a file.
|
|
141
|
-
command = "build";
|
|
142
|
-
} else {
|
|
143
|
-
(0, _help.help)({
|
|
144
|
-
message: `Invalid command: ${command}`,
|
|
145
|
-
usage: [
|
|
146
|
-
"tailwindcss <command> [options]"
|
|
147
|
-
],
|
|
148
|
-
commands: Object.keys(commands).filter((command)=>command !== "build").map((command)=>`${command} [options]`),
|
|
149
|
-
options: sharedFlags
|
|
150
|
-
});
|
|
151
|
-
process.exit(1);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// Execute command
|
|
155
|
-
let { args: flags , run } = commands[command];
|
|
156
|
-
let args = (()=>{
|
|
157
|
-
try {
|
|
158
|
-
let result = (0, _arg.default)(Object.fromEntries(Object.entries({
|
|
159
|
-
...flags,
|
|
160
|
-
...sharedFlags
|
|
161
|
-
}).filter(([_key, value])=>{
|
|
162
|
-
var ref;
|
|
163
|
-
return !(value === null || value === void 0 ? void 0 : (ref = value.type) === null || ref === void 0 ? void 0 : ref.manualParsing);
|
|
164
|
-
}).map(([key, value])=>[
|
|
165
|
-
key,
|
|
166
|
-
typeof value === "object" ? value.type : value
|
|
167
|
-
])), {
|
|
168
|
-
permissive: true
|
|
169
|
-
});
|
|
170
|
-
// Manual parsing of flags to allow for special flags like oneOf(Boolean, String)
|
|
171
|
-
for(let i = result["_"].length - 1; i >= 0; --i){
|
|
172
|
-
let flag = result["_"][i];
|
|
173
|
-
if (!flag.startsWith("-")) continue;
|
|
174
|
-
let [flagName, flagValue] = flag.split("=");
|
|
175
|
-
let handler = flags[flagName];
|
|
176
|
-
// Resolve flagName & handler
|
|
177
|
-
while(typeof handler === "string"){
|
|
178
|
-
flagName = handler;
|
|
179
|
-
handler = flags[handler];
|
|
180
|
-
}
|
|
181
|
-
if (!handler) continue;
|
|
182
|
-
let args = [];
|
|
183
|
-
let offset = i + 1;
|
|
184
|
-
// --flag value syntax was used so we need to pull `value` from `args`
|
|
185
|
-
if (flagValue === undefined) {
|
|
186
|
-
// Parse args for current flag
|
|
187
|
-
while(result["_"][offset] && !result["_"][offset].startsWith("-")){
|
|
188
|
-
args.push(result["_"][offset++]);
|
|
189
|
-
}
|
|
190
|
-
// Cleanup manually parsed flags + args
|
|
191
|
-
result["_"].splice(i, 1 + args.length);
|
|
192
|
-
// No args were provided, use default value defined in handler
|
|
193
|
-
// One arg was provided, use that directly
|
|
194
|
-
// Multiple args were provided so pass them all in an array
|
|
195
|
-
flagValue = args.length === 0 ? undefined : args.length === 1 ? args[0] : args;
|
|
196
|
-
} else {
|
|
197
|
-
// Remove the whole flag from the args array
|
|
198
|
-
result["_"].splice(i, 1);
|
|
199
|
-
}
|
|
200
|
-
// Set the resolved value in the `result` object
|
|
201
|
-
result[flagName] = handler.type(flagValue, flagName);
|
|
202
|
-
}
|
|
203
|
-
// Ensure that the `command` is always the first argument in the `args`.
|
|
204
|
-
// This is important so that we don't have to check if a default command
|
|
205
|
-
// (build) was used or not from within each plugin.
|
|
206
|
-
//
|
|
207
|
-
// E.g.: tailwindcss input.css -> _: ['build', 'input.css']
|
|
208
|
-
// E.g.: tailwindcss build input.css -> _: ['build', 'input.css']
|
|
209
|
-
if (result["_"][0] !== command) {
|
|
210
|
-
result["_"].unshift(command);
|
|
211
|
-
}
|
|
212
|
-
return result;
|
|
213
|
-
} catch (err) {
|
|
214
|
-
if (err.code === "ARG_UNKNOWN_OPTION") {
|
|
215
|
-
(0, _help.help)({
|
|
216
|
-
message: err.message,
|
|
217
|
-
usage: [
|
|
218
|
-
"tailwindcss <command> [options]"
|
|
219
|
-
],
|
|
220
|
-
options: sharedFlags
|
|
221
|
-
});
|
|
222
|
-
process.exit(1);
|
|
223
|
-
}
|
|
224
|
-
throw err;
|
|
225
|
-
}
|
|
226
|
-
})();
|
|
227
|
-
if (args["--help"]) {
|
|
228
|
-
(0, _help.help)({
|
|
229
|
-
options: {
|
|
230
|
-
...flags,
|
|
231
|
-
...sharedFlags
|
|
232
|
-
},
|
|
233
|
-
usage: [
|
|
234
|
-
`tailwindcss ${command} [options]`
|
|
235
|
-
]
|
|
236
|
-
});
|
|
237
|
-
process.exit(0);
|
|
238
|
-
}
|
|
239
|
-
run(args, configs);
|