tailwindcss 0.0.0-insiders.d3e754a → 0.0.0-insiders.d3f2221
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -9
- package/colors.d.ts +3 -0
- package/defaultConfig.d.ts +3 -0
- package/defaultTheme.d.ts +4 -0
- package/index.css +5 -0
- package/lib/cli/build/index.js +57 -0
- package/lib/cli/build/plugin.js +431 -0
- package/lib/cli/build/utils.js +88 -0
- package/lib/cli/build/watching.js +182 -0
- package/lib/cli/help/index.js +73 -0
- package/lib/cli/index.js +231 -0
- package/lib/cli/init/index.js +63 -0
- package/lib/cli.js +1 -739
- package/lib/corePluginList.js +13 -3
- package/lib/corePlugins.js +1094 -478
- package/lib/css/preflight.css +17 -4
- package/lib/featureFlags.js +49 -23
- package/lib/index.js +1 -29
- package/lib/lib/cacheInvalidation.js +92 -0
- package/lib/lib/collapseAdjacentRules.js +12 -5
- package/lib/lib/collapseDuplicateDeclarations.js +12 -7
- package/lib/lib/content.js +207 -0
- package/lib/lib/defaultExtractor.js +217 -33
- package/lib/lib/detectNesting.js +15 -4
- package/lib/lib/evaluateTailwindFunctions.js +104 -37
- package/lib/lib/expandApplyAtRules.js +312 -211
- package/lib/lib/expandTailwindAtRules.js +149 -96
- package/lib/lib/findAtConfigPath.js +46 -0
- package/lib/lib/generateRules.js +437 -188
- package/lib/lib/getModuleDependencies.js +88 -37
- package/lib/lib/handleImportAtRules.js +50 -0
- package/lib/lib/load-config.js +42 -0
- package/lib/lib/normalizeTailwindDirectives.js +9 -19
- package/lib/lib/offsets.js +306 -0
- package/lib/lib/partitionApplyAtRules.js +11 -6
- package/lib/lib/regex.js +74 -0
- package/lib/lib/remap-bitfield.js +89 -0
- package/lib/lib/resolveDefaultsAtRules.js +80 -58
- package/lib/lib/setupContextUtils.js +683 -270
- package/lib/lib/setupTrackingContext.js +63 -67
- package/lib/lib/sharedState.js +39 -10
- package/lib/lib/substituteScreenAtRules.js +13 -9
- package/lib/plugin.js +164 -0
- package/lib/postcss-plugins/nesting/README.md +2 -2
- package/lib/postcss-plugins/nesting/index.js +10 -6
- package/lib/postcss-plugins/nesting/plugin.js +15 -11
- package/lib/processTailwindFeatures.js +33 -28
- package/lib/public/colors.js +55 -29
- package/lib/public/create-plugin.js +9 -5
- package/lib/public/default-config.js +10 -6
- package/lib/public/default-theme.js +10 -6
- package/lib/public/load-config.js +12 -0
- package/lib/public/resolve-config.js +11 -6
- package/lib/util/applyImportantSelector.js +36 -0
- package/lib/util/bigSign.js +6 -1
- package/lib/util/buildMediaQuery.js +12 -5
- package/lib/util/cloneDeep.js +8 -5
- package/lib/util/cloneNodes.js +11 -2
- package/lib/util/color.js +59 -42
- package/lib/util/colorNames.js +752 -0
- package/lib/util/configurePlugins.js +7 -2
- package/lib/util/createPlugin.js +8 -5
- package/lib/util/createUtilityPlugin.js +15 -11
- package/lib/util/dataTypes.js +172 -47
- package/lib/util/defaults.js +12 -7
- package/lib/util/escapeClassName.js +13 -8
- package/lib/util/escapeCommas.js +6 -1
- package/lib/util/flattenColorPalette.js +9 -8
- package/lib/util/formatVariantSelector.js +230 -151
- package/lib/util/getAllConfigs.js +34 -12
- package/lib/util/hashConfig.js +9 -4
- package/lib/util/isKeyframeRule.js +6 -1
- package/lib/util/isPlainObject.js +6 -1
- package/lib/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +15 -5
- package/lib/util/log.js +36 -9
- package/lib/util/nameClass.js +24 -7
- package/lib/util/negateValue.js +23 -6
- package/lib/util/normalizeConfig.js +142 -69
- package/lib/util/normalizeScreens.js +124 -5
- package/lib/util/parseAnimationValue.js +8 -4
- package/lib/util/parseBoxShadowValue.js +16 -45
- package/lib/util/parseDependency.js +38 -54
- package/lib/util/parseGlob.js +36 -0
- package/lib/util/parseObjectStyles.js +14 -9
- package/lib/util/pluginUtils.js +146 -51
- package/lib/util/prefixSelector.js +29 -10
- package/lib/util/pseudoElements.js +209 -0
- package/lib/util/removeAlphaVariables.js +31 -0
- package/lib/util/resolveConfig.js +100 -73
- package/lib/util/resolveConfigPath.js +27 -8
- package/lib/util/responsive.js +10 -5
- package/lib/util/splitAtTopLevelOnly.js +51 -0
- package/lib/util/tap.js +6 -1
- package/lib/util/toColorValue.js +6 -1
- package/lib/util/toPath.js +20 -2
- package/lib/util/transformThemeValue.js +21 -7
- package/lib/util/validateConfig.js +48 -0
- package/lib/util/validateFormalSyntax.js +26 -0
- package/lib/util/withAlphaVariable.js +24 -12
- package/lib/value-parser/LICENSE +22 -0
- package/lib/value-parser/README.md +3 -0
- package/lib/value-parser/index.d.js +2 -0
- package/lib/value-parser/index.js +22 -0
- package/lib/value-parser/parse.js +259 -0
- package/lib/value-parser/stringify.js +38 -0
- package/lib/value-parser/unit.js +86 -0
- package/lib/value-parser/walk.js +16 -0
- package/loadConfig.d.ts +4 -0
- package/loadConfig.js +2 -0
- package/package.json +58 -53
- package/plugin.d.ts +11 -0
- package/resolveConfig.d.ts +12 -0
- package/scripts/generate-types.js +105 -0
- package/scripts/release-channel.js +18 -0
- package/scripts/release-notes.js +21 -0
- package/scripts/type-utils.js +27 -0
- package/src/cli/build/index.js +53 -0
- package/src/cli/build/plugin.js +469 -0
- package/src/cli/build/utils.js +76 -0
- package/src/cli/build/watching.js +229 -0
- package/src/cli/help/index.js +70 -0
- package/src/cli/index.js +217 -0
- package/src/cli/init/index.js +79 -0
- package/src/cli.js +1 -813
- package/src/corePluginList.js +1 -1
- package/src/corePlugins.js +636 -117
- package/src/css/preflight.css +17 -4
- package/src/featureFlags.js +13 -3
- package/src/index.js +1 -28
- package/src/lib/cacheInvalidation.js +52 -0
- package/src/lib/collapseAdjacentRules.js +5 -1
- package/src/lib/content.js +240 -0
- package/src/lib/defaultExtractor.js +192 -35
- package/src/lib/detectNesting.js +9 -1
- package/src/lib/evaluateTailwindFunctions.js +82 -8
- package/src/lib/expandApplyAtRules.js +322 -189
- package/src/lib/expandTailwindAtRules.js +87 -60
- package/src/lib/findAtConfigPath.js +48 -0
- package/src/lib/generateRules.js +428 -128
- package/src/lib/getModuleDependencies.js +70 -30
- package/src/lib/handleImportAtRules.js +34 -0
- package/src/lib/load-config.ts +31 -0
- package/src/lib/normalizeTailwindDirectives.js +0 -27
- package/src/lib/offsets.js +373 -0
- package/src/lib/regex.js +74 -0
- package/src/lib/remap-bitfield.js +82 -0
- package/src/lib/resolveDefaultsAtRules.js +53 -36
- package/src/lib/setupContextUtils.js +608 -157
- package/src/lib/setupTrackingContext.js +44 -58
- package/src/lib/sharedState.js +14 -4
- package/src/plugin.js +133 -0
- package/src/postcss-plugins/nesting/README.md +2 -2
- package/src/processTailwindFeatures.js +3 -2
- 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/buildMediaQuery.js +5 -3
- package/src/util/cloneNodes.js +5 -1
- package/src/util/color.js +39 -20
- package/src/util/colorNames.js +150 -0
- package/src/util/dataTypes.js +115 -23
- package/src/util/formatVariantSelector.js +265 -144
- package/src/util/getAllConfigs.js +21 -2
- package/src/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +1 -1
- package/src/util/log.js +25 -1
- package/src/util/nameClass.js +4 -0
- package/src/util/negateValue.js +11 -3
- package/src/util/normalizeConfig.js +78 -20
- package/src/util/normalizeScreens.js +99 -4
- package/src/util/parseBoxShadowValue.js +3 -50
- package/src/util/parseDependency.js +37 -42
- package/src/util/parseGlob.js +24 -0
- package/src/util/pluginUtils.js +118 -23
- package/src/util/prefixSelector.js +29 -10
- package/src/util/pseudoElements.js +167 -0
- package/src/util/removeAlphaVariables.js +24 -0
- package/src/util/resolveConfig.js +70 -32
- package/src/util/resolveConfigPath.js +12 -1
- package/src/util/splitAtTopLevelOnly.js +52 -0
- package/src/util/toPath.js +1 -1
- package/src/util/transformThemeValue.js +13 -3
- package/src/util/validateConfig.js +36 -0
- package/src/util/validateFormalSyntax.js +34 -0
- package/src/util/withAlphaVariable.js +1 -1
- package/src/value-parser/LICENSE +22 -0
- package/src/value-parser/README.md +3 -0
- package/src/value-parser/index.d.ts +177 -0
- package/src/value-parser/index.js +28 -0
- package/src/value-parser/parse.js +303 -0
- package/src/value-parser/stringify.js +41 -0
- package/src/value-parser/unit.js +118 -0
- package/src/value-parser/walk.js +18 -0
- package/stubs/.gitignore +1 -0
- package/stubs/.prettierrc.json +6 -0
- package/stubs/{defaultConfig.stub.js → config.full.js} +224 -172
- package/stubs/{simpleConfig.stub.js → config.simple.js} +1 -1
- package/stubs/{defaultPostCssConfig.stub.js → postcss.config.cjs} +0 -1
- package/stubs/postcss.config.js +5 -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 +369 -0
- package/types/generated/.gitkeep +0 -0
- package/types/generated/colors.d.ts +298 -0
- package/types/generated/corePluginList.d.ts +1 -0
- package/types/generated/default-theme.d.ts +378 -0
- package/types/index.d.ts +7 -0
- package/CHANGELOG.md +0 -2075
- package/lib/cli-peer-dependencies.js +0 -15
- package/lib/constants.js +0 -37
- package/peers/index.js +0 -75077
- package/scripts/install-integrations.js +0 -27
- package/scripts/rebuildFixtures.js +0 -68
- package/src/cli-peer-dependencies.js +0 -9
- package/src/constants.js +0 -17
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import LRU from '@alloc/quick-lru'
|
|
3
|
+
import { parseCandidateStrings, IO, Parsing } from '@tailwindcss/oxide'
|
|
2
4
|
import * as sharedState from './sharedState'
|
|
3
5
|
import { generateRules } from './generateRules'
|
|
4
|
-
import bigSign from '../util/bigSign'
|
|
5
6
|
import log from '../util/log'
|
|
6
7
|
import cloneNodes from '../util/cloneNodes'
|
|
7
8
|
import { defaultExtractor } from './defaultExtractor'
|
|
9
|
+
import { flagEnabled } from '../featureFlags'
|
|
8
10
|
|
|
9
11
|
let env = sharedState.env
|
|
10
12
|
|
|
@@ -17,14 +19,17 @@ const builtInTransformers = {
|
|
|
17
19
|
svelte: (content) => content.replace(/(?:^|\s)class:/g, ' '),
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
function getExtractor(
|
|
21
|
-
let extractors = tailwindConfig.content.extract
|
|
22
|
+
function getExtractor(context, fileExtension) {
|
|
23
|
+
let extractors = context.tailwindConfig.content.extract
|
|
22
24
|
|
|
23
25
|
return (
|
|
24
26
|
extractors[fileExtension] ||
|
|
25
27
|
extractors.DEFAULT ||
|
|
26
28
|
builtInExtractors[fileExtension] ||
|
|
27
|
-
|
|
29
|
+
// Because we call `DEFAULT(context)`, the returning function is always a new function without a
|
|
30
|
+
// stable identity. Marking it with `DEFAULT_EXTRACTOR` allows us to check if it is the default
|
|
31
|
+
// extractor without relying on the function identity.
|
|
32
|
+
Object.assign(builtInExtractors.DEFAULT(context), { DEFAULT_EXTRACTOR: true })
|
|
28
33
|
)
|
|
29
34
|
}
|
|
30
35
|
|
|
@@ -74,8 +79,13 @@ function getClassCandidates(content, extractor, candidates, seen) {
|
|
|
74
79
|
}
|
|
75
80
|
}
|
|
76
81
|
|
|
82
|
+
/**
|
|
83
|
+
*
|
|
84
|
+
* @param {[import('./offsets.js').RuleOffset, import('postcss').Node][]} rules
|
|
85
|
+
* @param {*} context
|
|
86
|
+
*/
|
|
77
87
|
function buildStylesheet(rules, context) {
|
|
78
|
-
let sortedRules =
|
|
88
|
+
let sortedRules = context.offsets.sort(rules)
|
|
79
89
|
|
|
80
90
|
let returnValue = {
|
|
81
91
|
base: new Set(),
|
|
@@ -83,55 +93,17 @@ function buildStylesheet(rules, context) {
|
|
|
83
93
|
components: new Set(),
|
|
84
94
|
utilities: new Set(),
|
|
85
95
|
variants: new Set(),
|
|
86
|
-
|
|
87
|
-
// All the CSS that is not Tailwind related can be put in this bucket. This
|
|
88
|
-
// will make it easier to later use this information when we want to
|
|
89
|
-
// `@apply` for example. The main reason we do this here is because we
|
|
90
|
-
// still need to make sure the order is correct. Last but not least, we
|
|
91
|
-
// will make sure to always re-inject this section into the css, even if
|
|
92
|
-
// certain rules were not used. This means that it will look like a no-op
|
|
93
|
-
// from the user's perspective, but we gathered all the useful information
|
|
94
|
-
// we need.
|
|
95
|
-
user: new Set(),
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
for (let [sort, rule] of sortedRules) {
|
|
99
|
-
|
|
100
|
-
returnValue.variants.add(rule)
|
|
101
|
-
continue
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (sort & context.layerOrder.base) {
|
|
105
|
-
returnValue.base.add(rule)
|
|
106
|
-
continue
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (sort & context.layerOrder.defaults) {
|
|
110
|
-
returnValue.defaults.add(rule)
|
|
111
|
-
continue
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (sort & context.layerOrder.components) {
|
|
115
|
-
returnValue.components.add(rule)
|
|
116
|
-
continue
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (sort & context.layerOrder.utilities) {
|
|
120
|
-
returnValue.utilities.add(rule)
|
|
121
|
-
continue
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (sort & context.layerOrder.user) {
|
|
125
|
-
returnValue.user.add(rule)
|
|
126
|
-
continue
|
|
127
|
-
}
|
|
99
|
+
returnValue[sort.layer].add(rule)
|
|
128
100
|
}
|
|
129
101
|
|
|
130
102
|
return returnValue
|
|
131
103
|
}
|
|
132
104
|
|
|
133
105
|
export default function expandTailwindAtRules(context) {
|
|
134
|
-
return (root) => {
|
|
106
|
+
return async (root) => {
|
|
135
107
|
let layerNodes = {
|
|
136
108
|
base: null,
|
|
137
109
|
components: null,
|
|
@@ -158,15 +130,52 @@ export default function expandTailwindAtRules(context) {
|
|
|
158
130
|
// ---
|
|
159
131
|
|
|
160
132
|
// Find potential rules in changed files
|
|
161
|
-
let candidates = new Set([sharedState.NOT_ON_DEMAND])
|
|
133
|
+
let candidates = new Set([...(context.candidates ?? []), sharedState.NOT_ON_DEMAND])
|
|
162
134
|
let seen = new Set()
|
|
163
135
|
|
|
164
136
|
env.DEBUG && console.time('Reading changed files')
|
|
165
137
|
|
|
166
|
-
|
|
167
|
-
let
|
|
168
|
-
let
|
|
169
|
-
|
|
138
|
+
if (flagEnabled(context.tailwindConfig, 'oxideParser')) {
|
|
139
|
+
let rustParserContent = []
|
|
140
|
+
let regexParserContent = []
|
|
141
|
+
|
|
142
|
+
for (let item of context.changedContent) {
|
|
143
|
+
let transformer = getTransformer(context.tailwindConfig, item.extension)
|
|
144
|
+
let extractor = getExtractor(context, item.extension)
|
|
145
|
+
|
|
146
|
+
if (transformer === builtInTransformers.DEFAULT && extractor?.DEFAULT_EXTRACTOR === true) {
|
|
147
|
+
rustParserContent.push(item)
|
|
148
|
+
} else {
|
|
149
|
+
regexParserContent.push([item, { transformer, extractor }])
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (rustParserContent.length > 0) {
|
|
154
|
+
for (let candidate of parseCandidateStrings(
|
|
155
|
+
rustParserContent,
|
|
156
|
+
IO.Parallel | Parsing.Parallel
|
|
157
|
+
)) {
|
|
158
|
+
candidates.add(candidate)
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (regexParserContent.length > 0) {
|
|
163
|
+
await Promise.all(
|
|
164
|
+
regexParserContent.map(async ([{ file, content }, { transformer, extractor }]) => {
|
|
165
|
+
content = file ? await fs.promises.readFile(file, 'utf8') : content
|
|
166
|
+
getClassCandidates(transformer(content), extractor, candidates, seen)
|
|
167
|
+
})
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
} else {
|
|
171
|
+
await Promise.all(
|
|
172
|
+
context.changedContent.map(async ({ file, content, extension }) => {
|
|
173
|
+
let transformer = getTransformer(context.tailwindConfig, extension)
|
|
174
|
+
let extractor = getExtractor(context, extension)
|
|
175
|
+
content = file ? await fs.promises.readFile(file, 'utf8') : content
|
|
176
|
+
getClassCandidates(transformer(content), extractor, candidates, seen)
|
|
177
|
+
})
|
|
178
|
+
)
|
|
170
179
|
}
|
|
171
180
|
|
|
172
181
|
env.DEBUG && console.timeEnd('Reading changed files')
|
|
@@ -177,16 +186,24 @@ export default function expandTailwindAtRules(context) {
|
|
|
177
186
|
let classCacheCount = context.classCache.size
|
|
178
187
|
|
|
179
188
|
env.DEBUG && console.time('Generate rules')
|
|
180
|
-
|
|
189
|
+
env.DEBUG && console.time('Sorting candidates')
|
|
190
|
+
// TODO: only sort if we are not using the oxide parser (flagEnabled(context.tailwindConfig,
|
|
191
|
+
// 'oxideParser')) AND if we got all the candidates form the oxideParser alone. This will not
|
|
192
|
+
// be the case currently if you have custom transformers / extractors.
|
|
193
|
+
let sortedCandidates = new Set(
|
|
194
|
+
[...candidates].sort((a, z) => {
|
|
195
|
+
if (a === z) return 0
|
|
196
|
+
if (a < z) return -1
|
|
197
|
+
return 1
|
|
198
|
+
})
|
|
199
|
+
)
|
|
200
|
+
env.DEBUG && console.timeEnd('Sorting candidates')
|
|
201
|
+
generateRules(sortedCandidates, context)
|
|
181
202
|
env.DEBUG && console.timeEnd('Generate rules')
|
|
182
203
|
|
|
183
204
|
// We only ever add to the classCache, so if it didn't grow, there is nothing new.
|
|
184
205
|
env.DEBUG && console.time('Build stylesheet')
|
|
185
206
|
if (context.stylesheetCache === null || context.classCache.size !== classCacheCount) {
|
|
186
|
-
for (let rule of rules) {
|
|
187
|
-
context.ruleCache.add(rule)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
207
|
context.stylesheetCache = buildStylesheet([...context.ruleCache], context)
|
|
191
208
|
}
|
|
192
209
|
env.DEBUG && console.timeEnd('Build stylesheet')
|
|
@@ -253,11 +270,21 @@ export default function expandTailwindAtRules(context) {
|
|
|
253
270
|
)
|
|
254
271
|
layerNodes.variants.remove()
|
|
255
272
|
} else if (variantNodes.length > 0) {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
273
|
+
let cloned = cloneNodes(variantNodes, undefined, {
|
|
274
|
+
layer: 'variants',
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
cloned.forEach((node) => {
|
|
278
|
+
let parentLayer = node.raws.tailwind?.parentLayer ?? null
|
|
279
|
+
|
|
280
|
+
node.walk((n) => {
|
|
281
|
+
if (!n.source) {
|
|
282
|
+
n.source = layerNodes[parentLayer].source
|
|
283
|
+
}
|
|
259
284
|
})
|
|
260
|
-
)
|
|
285
|
+
})
|
|
286
|
+
|
|
287
|
+
root.append(cloned)
|
|
261
288
|
}
|
|
262
289
|
|
|
263
290
|
// If we've got a utility layer and no utilities are generated there's likely something wrong
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Find the @config at-rule in the given CSS AST and return the relative path to the config file
|
|
6
|
+
*
|
|
7
|
+
* @param {import('postcss').Root} root
|
|
8
|
+
* @param {import('postcss').Result} result
|
|
9
|
+
*/
|
|
10
|
+
export function findAtConfigPath(root, result) {
|
|
11
|
+
let configPath = null
|
|
12
|
+
let relativeTo = null
|
|
13
|
+
|
|
14
|
+
root.walkAtRules('config', (rule) => {
|
|
15
|
+
relativeTo = rule.source?.input.file ?? result.opts.from ?? null
|
|
16
|
+
|
|
17
|
+
if (relativeTo === null) {
|
|
18
|
+
throw rule.error(
|
|
19
|
+
'The `@config` directive cannot be used without setting `from` in your PostCSS config.'
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (configPath) {
|
|
24
|
+
throw rule.error('Only one `@config` directive is allowed per file.')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let matches = rule.params.match(/(['"])(.*?)\1/)
|
|
28
|
+
if (!matches) {
|
|
29
|
+
throw rule.error('A path is required when using the `@config` directive.')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let inputPath = matches[2]
|
|
33
|
+
if (path.isAbsolute(inputPath)) {
|
|
34
|
+
throw rule.error('The `@config` directive cannot be used with an absolute path.')
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
configPath = path.resolve(path.dirname(relativeTo), inputPath)
|
|
38
|
+
if (!fs.existsSync(configPath)) {
|
|
39
|
+
throw rule.error(
|
|
40
|
+
`The config file at "${inputPath}" does not exist. Make sure the path is correct and the file exists.`
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
rule.remove()
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
return configPath ? configPath : null
|
|
48
|
+
}
|