1 | import colors from 'picocolors'
|
2 | import log from './util/log'
|
3 |
|
4 | let defaults = {
|
5 | optimizeUniversalDefaults: false,
|
6 | generalizedModifiers: true,
|
7 | }
|
8 |
|
9 | let featureFlags = {
|
10 | future: [
|
11 | 'hoverOnlyWhenSupported',
|
12 | 'respectDefaultRingColorOpacity',
|
13 | 'disableColorOpacityUtilitiesByDefault',
|
14 | 'relativeContentPathsByDefault',
|
15 | ],
|
16 | experimental: [
|
17 | 'optimizeUniversalDefaults',
|
18 | 'generalizedModifiers',
|
19 |
|
20 | ],
|
21 | }
|
22 |
|
23 | export function flagEnabled(config, flag) {
|
24 | if (featureFlags.future.includes(flag)) {
|
25 | return config.future === 'all' || (config?.future?.[flag] ?? defaults[flag] ?? false)
|
26 | }
|
27 |
|
28 | if (featureFlags.experimental.includes(flag)) {
|
29 | return (
|
30 | config.experimental === 'all' || (config?.experimental?.[flag] ?? defaults[flag] ?? false)
|
31 | )
|
32 | }
|
33 |
|
34 | return false
|
35 | }
|
36 |
|
37 | function experimentalFlagsEnabled(config) {
|
38 | if (config.experimental === 'all') {
|
39 | return featureFlags.experimental
|
40 | }
|
41 |
|
42 | return Object.keys(config?.experimental ?? {}).filter(
|
43 | (flag) => featureFlags.experimental.includes(flag) && config.experimental[flag]
|
44 | )
|
45 | }
|
46 |
|
47 | export function issueFlagNotices(config) {
|
48 | if (process.env.JEST_WORKER_ID !== undefined) {
|
49 | return
|
50 | }
|
51 |
|
52 | if (experimentalFlagsEnabled(config).length > 0) {
|
53 | let changes = experimentalFlagsEnabled(config)
|
54 | .map((s) => colors.yellow(s))
|
55 | .join(', ')
|
56 |
|
57 | log.warn('experimental-flags-enabled', [
|
58 | `You have enabled experimental features: ${changes}`,
|
59 | 'Experimental features in Tailwind CSS are not covered by semver, may introduce breaking changes, and can change at any time.',
|
60 | ])
|
61 | }
|
62 | }
|
63 |
|
64 | export default featureFlags
|