@dimensional-innovations/tool-config 5.0.1 → 5.0.2
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/dist/astro-6WHBKQFX.js +43 -0
- package/dist/astro-6WHBKQFX.js.map +1 -0
- package/dist/chunk-HUYPX7RZ.js +125 -0
- package/dist/chunk-HUYPX7RZ.js.map +1 -0
- package/dist/chunk-ITGUBGO6.js +625 -0
- package/dist/chunk-ITGUBGO6.js.map +1 -0
- package/dist/chunk-L7IN57ZC.js +167 -0
- package/dist/chunk-L7IN57ZC.js.map +1 -0
- package/dist/chunk-LRQFF2N5.js +141 -0
- package/dist/chunk-LRQFF2N5.js.map +1 -0
- package/dist/chunk-OMQFJOZZ.js +48 -0
- package/dist/chunk-OMQFJOZZ.js.map +1 -0
- package/dist/chunk-SY42COTI.js +363 -0
- package/dist/chunk-SY42COTI.js.map +1 -0
- package/dist/chunk-SZOB6JY7.js +446 -0
- package/dist/chunk-SZOB6JY7.js.map +1 -0
- package/dist/eslint-YWWMMZDP.js +5 -0
- package/dist/eslint-YWWMMZDP.js.map +1 -0
- package/dist/index.js +14 -2589
- package/dist/index.js.map +1 -1
- package/dist/prettier-EYWEBRIS.js +4 -0
- package/dist/prettier-EYWEBRIS.js.map +1 -0
- package/dist/react-YIKJI3VA.js +91 -0
- package/dist/react-YIKJI3VA.js.map +1 -0
- package/dist/semantic-release-7XCPBEKO.js +4 -0
- package/dist/semantic-release-7XCPBEKO.js.map +1 -0
- package/dist/solid-F44BEBBP.js +54 -0
- package/dist/solid-F44BEBBP.js.map +1 -0
- package/dist/stylelint-ENTCYNXG.js +5 -0
- package/dist/stylelint-ENTCYNXG.js.map +1 -0
- package/dist/svelte-XEOX6WAQ.js +56 -0
- package/dist/svelte-XEOX6WAQ.js.map +1 -0
- package/dist/typescript-ZJ7LECQN.js +4 -0
- package/dist/typescript-ZJ7LECQN.js.map +1 -0
- package/dist/vue-DP7MCMOU.js +144 -0
- package/dist/vue-DP7MCMOU.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { getStylelintIgnores } from './chunk-OMQFJOZZ.js';
|
|
2
|
+
import { autoDetect, detectCssType } from './chunk-L7IN57ZC.js';
|
|
3
|
+
|
|
4
|
+
// src/tools/stylelint/presets/base.ts
|
|
5
|
+
var basePreset = {
|
|
6
|
+
extends: ["stylelint-config-standard"],
|
|
7
|
+
rules: {
|
|
8
|
+
// Color rules
|
|
9
|
+
"color-hex-length": "short",
|
|
10
|
+
"color-named": "never",
|
|
11
|
+
// Property rules
|
|
12
|
+
"declaration-block-no-redundant-longhand-properties": true,
|
|
13
|
+
"shorthand-property-no-redundant-values": true,
|
|
14
|
+
// Selector rules
|
|
15
|
+
"selector-max-id": 0,
|
|
16
|
+
"selector-no-qualifying-type": true,
|
|
17
|
+
"selector-class-pattern": [
|
|
18
|
+
"^[a-z]([a-z0-9-]+)?(__([a-z0-9]+-?)+)?(--([a-z0-9]+-?)+){0,2}$",
|
|
19
|
+
{
|
|
20
|
+
message: "Expected class selector to be kebab-case or BEM format"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
// Nesting
|
|
24
|
+
"max-nesting-depth": 3,
|
|
25
|
+
// Specificity
|
|
26
|
+
"no-descending-specificity": null,
|
|
27
|
+
// At-rules
|
|
28
|
+
"at-rule-no-unknown": [
|
|
29
|
+
true,
|
|
30
|
+
{
|
|
31
|
+
ignoreAtRules: ["tailwind", "apply", "variants", "responsive", "screen"]
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var base_default = basePreset;
|
|
37
|
+
|
|
38
|
+
// src/tools/stylelint/presets/css-modules.ts
|
|
39
|
+
var cssModulesPreset = {
|
|
40
|
+
rules: {
|
|
41
|
+
// Allow CSS Modules pseudo-classes
|
|
42
|
+
"selector-pseudo-class-no-unknown": [
|
|
43
|
+
true,
|
|
44
|
+
{
|
|
45
|
+
ignorePseudoClasses: ["global", "local", "export", "import"]
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
// Allow @value (CSS Modules constants)
|
|
49
|
+
"at-rule-no-unknown": [
|
|
50
|
+
true,
|
|
51
|
+
{
|
|
52
|
+
ignoreAtRules: ["value"]
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
// Allow 'composes' property (CSS Modules composition)
|
|
56
|
+
"property-no-unknown": [
|
|
57
|
+
true,
|
|
58
|
+
{
|
|
59
|
+
ignoreProperties: ["composes", "compose-with"]
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
// CSS Modules often use camelCase
|
|
63
|
+
"selector-class-pattern": null
|
|
64
|
+
// Disable pattern check for modules
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
var css_modules_default = cssModulesPreset;
|
|
68
|
+
|
|
69
|
+
// src/tools/stylelint/presets/frameworks/react.ts
|
|
70
|
+
var reactPreset = {
|
|
71
|
+
// No special rules needed for React/Solid CSS files
|
|
72
|
+
// They use standard CSS, so base preset is sufficient
|
|
73
|
+
rules: {}
|
|
74
|
+
};
|
|
75
|
+
var react_default = reactPreset;
|
|
76
|
+
|
|
77
|
+
// src/tools/stylelint/presets/frameworks/svelte.ts
|
|
78
|
+
var sveltePreset = {
|
|
79
|
+
extends: ["stylelint-config-standard"],
|
|
80
|
+
overrides: [
|
|
81
|
+
{
|
|
82
|
+
files: ["**/*.svelte"],
|
|
83
|
+
customSyntax: "postcss-html"
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
rules: {
|
|
87
|
+
// Allow Svelte :global() pseudo-class
|
|
88
|
+
"selector-pseudo-class-no-unknown": [
|
|
89
|
+
true,
|
|
90
|
+
{
|
|
91
|
+
ignorePseudoClasses: ["global"]
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
var svelte_default = sveltePreset;
|
|
97
|
+
|
|
98
|
+
// src/tools/stylelint/presets/frameworks/vue.ts
|
|
99
|
+
var vuePreset = {
|
|
100
|
+
extends: ["stylelint-config-standard-vue"],
|
|
101
|
+
overrides: [
|
|
102
|
+
{
|
|
103
|
+
files: ["**/*.vue"],
|
|
104
|
+
customSyntax: "postcss-html"
|
|
105
|
+
}
|
|
106
|
+
],
|
|
107
|
+
rules: {
|
|
108
|
+
// Allow Vue-specific pseudo-classes
|
|
109
|
+
"selector-pseudo-class-no-unknown": [
|
|
110
|
+
true,
|
|
111
|
+
{
|
|
112
|
+
ignorePseudoClasses: ["deep", "global", "slotted"]
|
|
113
|
+
}
|
|
114
|
+
],
|
|
115
|
+
// Allow Vue-specific pseudo-elements
|
|
116
|
+
"selector-pseudo-element-no-unknown": [
|
|
117
|
+
true,
|
|
118
|
+
{
|
|
119
|
+
ignorePseudoElements: ["v-deep", "v-global", "v-slotted"]
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
var vue_default = vuePreset;
|
|
125
|
+
|
|
126
|
+
// src/tools/stylelint/presets/scss.ts
|
|
127
|
+
var scssPreset = {
|
|
128
|
+
extends: ["stylelint-config-standard-scss"],
|
|
129
|
+
rules: {
|
|
130
|
+
// Color rules
|
|
131
|
+
"color-hex-length": "short",
|
|
132
|
+
// Variables
|
|
133
|
+
"scss/dollar-variable-colon-space-after": "always",
|
|
134
|
+
"scss/dollar-variable-colon-space-before": "never",
|
|
135
|
+
"scss/dollar-variable-pattern": [
|
|
136
|
+
"^[a-z][a-zA-Z0-9]*(-[a-z][a-zA-Z0-9]*)*$",
|
|
137
|
+
{
|
|
138
|
+
message: "Expected variable to be kebab-case"
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
// Operators
|
|
142
|
+
"scss/operator-no-newline-after": true,
|
|
143
|
+
"scss/operator-no-unspaced": true,
|
|
144
|
+
// Nesting
|
|
145
|
+
"max-nesting-depth": 4,
|
|
146
|
+
// Allow one more level for SCSS
|
|
147
|
+
// At-rules (allow Tailwind if present)
|
|
148
|
+
"scss/at-rule-no-unknown": [
|
|
149
|
+
true,
|
|
150
|
+
{
|
|
151
|
+
ignoreAtRules: ["tailwind", "apply", "variants", "responsive", "screen", "layer"]
|
|
152
|
+
}
|
|
153
|
+
],
|
|
154
|
+
// Mixins
|
|
155
|
+
"scss/at-mixin-pattern": [
|
|
156
|
+
"^[a-z][a-zA-Z0-9]*(-[a-z][a-zA-Z0-9]*)*$",
|
|
157
|
+
{
|
|
158
|
+
message: "Expected mixin name to be kebab-case"
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
// Functions
|
|
162
|
+
"scss/at-function-pattern": [
|
|
163
|
+
"^[a-z][a-zA-Z0-9]*(-[a-z][a-zA-Z0-9]*)*$",
|
|
164
|
+
{
|
|
165
|
+
message: "Expected function name to be kebab-case"
|
|
166
|
+
}
|
|
167
|
+
],
|
|
168
|
+
// Placeholder selectors
|
|
169
|
+
"scss/percent-placeholder-pattern": [
|
|
170
|
+
"^[a-z][a-zA-Z0-9]*(-[a-z][a-zA-Z0-9]*)*$",
|
|
171
|
+
{
|
|
172
|
+
message: "Expected placeholder to be kebab-case"
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
// Selector rules (inherit from base)
|
|
176
|
+
"selector-max-id": 0,
|
|
177
|
+
"selector-no-qualifying-type": true,
|
|
178
|
+
"selector-class-pattern": [
|
|
179
|
+
"^[a-z]([a-z0-9-]+)?(__([a-z0-9]+-?)+)?(--([a-z0-9]+-?)+){0,2}$",
|
|
180
|
+
{
|
|
181
|
+
message: "Expected class selector to be kebab-case or BEM format"
|
|
182
|
+
}
|
|
183
|
+
],
|
|
184
|
+
// Disable some rules that conflict with SCSS
|
|
185
|
+
"no-descending-specificity": null
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
var scss_default = scssPreset;
|
|
189
|
+
|
|
190
|
+
// src/tools/stylelint/presets/tailwind.ts
|
|
191
|
+
var tailwindPreset = {
|
|
192
|
+
// Note: We don't extend stylelint-config-tailwindcss because it's too opinionated
|
|
193
|
+
// Instead, we selectively disable conflicting rules
|
|
194
|
+
rules: {
|
|
195
|
+
// Allow Tailwind at-rules
|
|
196
|
+
"at-rule-no-unknown": [
|
|
197
|
+
true,
|
|
198
|
+
{
|
|
199
|
+
ignoreAtRules: ["tailwind", "apply", "layer", "variants", "responsive", "screen", "config"]
|
|
200
|
+
}
|
|
201
|
+
],
|
|
202
|
+
// Allow Tailwind functions
|
|
203
|
+
"function-no-unknown": [
|
|
204
|
+
true,
|
|
205
|
+
{
|
|
206
|
+
ignoreFunctions: ["theme", "screen"]
|
|
207
|
+
}
|
|
208
|
+
],
|
|
209
|
+
// Disable rules that conflict with Tailwind's utility classes
|
|
210
|
+
"selector-class-pattern": null,
|
|
211
|
+
// Tailwind uses various patterns
|
|
212
|
+
"selector-max-id": null,
|
|
213
|
+
// Allow IDs (though not recommended)
|
|
214
|
+
"no-descending-specificity": null,
|
|
215
|
+
// Utility classes have complex specificity
|
|
216
|
+
"declaration-block-no-redundant-longhand-properties": null,
|
|
217
|
+
// Utilities may look redundant
|
|
218
|
+
// Allow unknown properties (Tailwind CSS variables)
|
|
219
|
+
"property-no-unknown": [
|
|
220
|
+
true,
|
|
221
|
+
{
|
|
222
|
+
ignoreProperties: ["/^--/"]
|
|
223
|
+
// Allow CSS custom properties
|
|
224
|
+
}
|
|
225
|
+
]
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
var tailwind_default = tailwindPreset;
|
|
229
|
+
|
|
230
|
+
// src/tools/stylelint/index.ts
|
|
231
|
+
function normalizeExtends(value) {
|
|
232
|
+
if (!value) return [];
|
|
233
|
+
return Array.isArray(value) ? value : [value];
|
|
234
|
+
}
|
|
235
|
+
function mergeArrays(target, source) {
|
|
236
|
+
let targetArray;
|
|
237
|
+
if (Array.isArray(target)) {
|
|
238
|
+
targetArray = target;
|
|
239
|
+
} else if (target) {
|
|
240
|
+
targetArray = [target];
|
|
241
|
+
} else {
|
|
242
|
+
targetArray = [];
|
|
243
|
+
}
|
|
244
|
+
let sourceArray;
|
|
245
|
+
if (Array.isArray(source)) {
|
|
246
|
+
sourceArray = source;
|
|
247
|
+
} else if (source) {
|
|
248
|
+
sourceArray = [source];
|
|
249
|
+
} else {
|
|
250
|
+
sourceArray = [];
|
|
251
|
+
}
|
|
252
|
+
return [...targetArray, ...sourceArray];
|
|
253
|
+
}
|
|
254
|
+
function mergePreset(config, preset) {
|
|
255
|
+
if (preset.extends) {
|
|
256
|
+
const presetExtends = normalizeExtends(preset.extends);
|
|
257
|
+
const configExtends = normalizeExtends(config.extends);
|
|
258
|
+
config.extends = [...configExtends, ...presetExtends];
|
|
259
|
+
}
|
|
260
|
+
if (preset.overrides) {
|
|
261
|
+
config.overrides = [...config.overrides || [], ...preset.overrides];
|
|
262
|
+
}
|
|
263
|
+
if (preset.rules) {
|
|
264
|
+
config.rules = { ...config.rules, ...preset.rules };
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function applyUserOverrides(config, userOverrides) {
|
|
268
|
+
if (userOverrides.extends) {
|
|
269
|
+
config.extends = mergeArrays(config.extends, userOverrides.extends);
|
|
270
|
+
delete userOverrides.extends;
|
|
271
|
+
}
|
|
272
|
+
if (userOverrides.plugins) {
|
|
273
|
+
config.plugins = mergeArrays(config.plugins, userOverrides.plugins);
|
|
274
|
+
delete userOverrides.plugins;
|
|
275
|
+
}
|
|
276
|
+
if (userOverrides.overrides) {
|
|
277
|
+
config.overrides = mergeArrays(
|
|
278
|
+
config.overrides,
|
|
279
|
+
userOverrides.overrides
|
|
280
|
+
);
|
|
281
|
+
delete userOverrides.overrides;
|
|
282
|
+
}
|
|
283
|
+
if (userOverrides.rules) {
|
|
284
|
+
config.rules = { ...config.rules, ...userOverrides.rules };
|
|
285
|
+
delete userOverrides.rules;
|
|
286
|
+
}
|
|
287
|
+
Object.assign(config, userOverrides);
|
|
288
|
+
}
|
|
289
|
+
async function createStylelintConfig(options = {}) {
|
|
290
|
+
const {
|
|
291
|
+
framework: explicitFramework = "auto",
|
|
292
|
+
cssType: explicitCssType = "auto",
|
|
293
|
+
cwd = process.cwd(),
|
|
294
|
+
...userOverrides
|
|
295
|
+
} = options;
|
|
296
|
+
const framework = explicitFramework === "auto" ? autoDetect(cwd).framework : explicitFramework;
|
|
297
|
+
const cssType = explicitCssType === "auto" ? detectCssType(cwd) : explicitCssType;
|
|
298
|
+
let cssTypeResult;
|
|
299
|
+
if (typeof cssType === "string") {
|
|
300
|
+
cssTypeResult = cssType === "scss" ? { preprocessor: "scss", tailwind: false, modules: false, postcss: false } : null;
|
|
301
|
+
} else {
|
|
302
|
+
cssTypeResult = cssType;
|
|
303
|
+
}
|
|
304
|
+
const config = cssTypeResult?.preprocessor === "scss" ? { ...scss_default, customSyntax: "postcss-scss" } : { ...base_default };
|
|
305
|
+
config.ignoreFiles = getStylelintIgnores();
|
|
306
|
+
if (cssTypeResult?.tailwind) {
|
|
307
|
+
mergePreset(config, tailwind_default);
|
|
308
|
+
}
|
|
309
|
+
if ((framework === "react" || framework === "solid") && !cssTypeResult?.tailwind) {
|
|
310
|
+
mergePreset(config, css_modules_default);
|
|
311
|
+
}
|
|
312
|
+
let cssTypeDesc = cssTypeResult?.preprocessor === "scss" ? "SCSS" : "CSS";
|
|
313
|
+
if (cssTypeResult?.tailwind) cssTypeDesc += " + Tailwind";
|
|
314
|
+
if ((framework === "react" || framework === "solid") && !cssTypeResult?.tailwind) {
|
|
315
|
+
cssTypeDesc += " Modules";
|
|
316
|
+
}
|
|
317
|
+
switch (framework) {
|
|
318
|
+
case "vue": {
|
|
319
|
+
mergePreset(config, vue_default);
|
|
320
|
+
console.warn(`\u{1F3A8} Stylelint: Detected Vue.js - linting .vue component styles (${cssTypeDesc})`);
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
case "svelte": {
|
|
324
|
+
mergePreset(config, svelte_default);
|
|
325
|
+
console.warn(
|
|
326
|
+
`\u{1F3A8} Stylelint: Detected Svelte - linting .svelte component styles (${cssTypeDesc})`
|
|
327
|
+
);
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
case "react":
|
|
331
|
+
case "solid": {
|
|
332
|
+
mergePreset(config, react_default);
|
|
333
|
+
console.warn(
|
|
334
|
+
`\u{1F3A8} Stylelint: Detected ${framework} - linting ${cssTypeDesc} (CSS-in-JS uses ESLint)`
|
|
335
|
+
);
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
case "angular":
|
|
339
|
+
case "node":
|
|
340
|
+
case "vanilla":
|
|
341
|
+
case "astro": {
|
|
342
|
+
console.warn(`\u{1F3A8} Stylelint: Detected ${framework} - linting ${cssTypeDesc} files`);
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
default: {
|
|
346
|
+
console.warn(`\u26A0\uFE0F Unknown framework "${framework}", using base ${cssTypeDesc} linting`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const {
|
|
350
|
+
framework: _f,
|
|
351
|
+
cssType: _ct,
|
|
352
|
+
cwd: _c,
|
|
353
|
+
customIgnores: _ci,
|
|
354
|
+
...restOverrides
|
|
355
|
+
} = userOverrides;
|
|
356
|
+
applyUserOverrides(config, restOverrides);
|
|
357
|
+
return config;
|
|
358
|
+
}
|
|
359
|
+
var stylelint_default = createStylelintConfig;
|
|
360
|
+
|
|
361
|
+
export { createStylelintConfig, stylelint_default };
|
|
362
|
+
//# sourceMappingURL=chunk-SY42COTI.js.map
|
|
363
|
+
//# sourceMappingURL=chunk-SY42COTI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/stylelint/presets/base.ts","../src/tools/stylelint/presets/css-modules.ts","../src/tools/stylelint/presets/frameworks/react.ts","../src/tools/stylelint/presets/frameworks/svelte.ts","../src/tools/stylelint/presets/frameworks/vue.ts","../src/tools/stylelint/presets/scss.ts","../src/tools/stylelint/presets/tailwind.ts","../src/tools/stylelint/index.ts"],"names":[],"mappings":"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","file":"chunk-SY42COTI.js","sourcesContent":["import type { StylelintConfig } from '#core/types.js'\n\n/**\n * Base Stylelint preset\n *\n * Standard CSS linting rules for all projects.\n * Focuses on code quality and best practices, NOT formatting (that's Prettier's job).\n *\n * Key principles:\n * - Use modern CSS practices\n * - Avoid common mistakes\n * - Maintain consistency\n * - Don't fight with Prettier\n */\nconst basePreset: StylelintConfig = {\n extends: ['stylelint-config-standard'],\n\n rules: {\n // Color rules\n 'color-hex-length': 'short',\n 'color-named': 'never',\n\n // Property rules\n 'declaration-block-no-redundant-longhand-properties': true,\n 'shorthand-property-no-redundant-values': true,\n\n // Selector rules\n 'selector-max-id': 0,\n 'selector-no-qualifying-type': true,\n 'selector-class-pattern': [\n '^[a-z]([a-z0-9-]+)?(__([a-z0-9]+-?)+)?(--([a-z0-9]+-?)+){0,2}$',\n {\n message: 'Expected class selector to be kebab-case or BEM format'\n }\n ],\n\n // Nesting\n 'max-nesting-depth': 3,\n\n // Specificity\n 'no-descending-specificity': null,\n\n // At-rules\n 'at-rule-no-unknown': [\n true,\n {\n ignoreAtRules: ['tailwind', 'apply', 'variants', 'responsive', 'screen']\n }\n ]\n }\n}\n\nexport default basePreset\n","import type { StylelintConfig } from '#core/types.js'\n\n/**\n * CSS Modules Stylelint preset\n *\n * Configuration for projects using CSS Modules.\n * Allows CSS Modules-specific pseudo-classes and conventions.\n *\n * Key principles:\n * - Support :global() and :local() pseudo-classes\n * - Allow composition with composes\n * - Support @value imports\n * - Work alongside regular CSS/SCSS\n */\nconst cssModulesPreset: StylelintConfig = {\n rules: {\n // Allow CSS Modules pseudo-classes\n 'selector-pseudo-class-no-unknown': [\n true,\n {\n ignorePseudoClasses: ['global', 'local', 'export', 'import']\n }\n ],\n\n // Allow @value (CSS Modules constants)\n 'at-rule-no-unknown': [\n true,\n {\n ignoreAtRules: ['value']\n }\n ],\n\n // Allow 'composes' property (CSS Modules composition)\n 'property-no-unknown': [\n true,\n {\n ignoreProperties: ['composes', 'compose-with']\n }\n ],\n\n // CSS Modules often use camelCase\n 'selector-class-pattern': null // Disable pattern check for modules\n }\n}\n\nexport default cssModulesPreset\n","import type { StylelintConfig } from '#core/types.js'\n\n/**\n * React/Solid-specific Stylelint preset\n *\n * Note: Most React/Solid projects use CSS-in-JS (styled-components, emotion, etc.)\n * which is better linted by ESLint plugins, not Stylelint.\n *\n * This preset is for React/Solid projects that use separate CSS files.\n * If you're using CSS-in-JS exclusively, you don't need Stylelint.\n *\n * CSS Modules support is added conditionally in the factory function\n * when Tailwind CSS is not detected.\n */\nconst reactPreset: StylelintConfig = {\n // No special rules needed for React/Solid CSS files\n // They use standard CSS, so base preset is sufficient\n rules: {}\n}\n\nexport default reactPreset\n","import type { StylelintConfig } from '#core/types.js'\n\n/**\n * Svelte-specific Stylelint preset\n *\n * Handles <style> blocks in Svelte components (.svelte files)\n *\n * Requires: postcss-html (peer dependency)\n */\nconst sveltePreset: StylelintConfig = {\n extends: ['stylelint-config-standard'],\n\n overrides: [\n {\n files: ['**/*.svelte'],\n customSyntax: 'postcss-html'\n }\n ],\n\n rules: {\n // Allow Svelte :global() pseudo-class\n 'selector-pseudo-class-no-unknown': [\n true,\n {\n ignorePseudoClasses: ['global']\n }\n ]\n }\n}\n\nexport default sveltePreset\n","import type { StylelintConfig } from '#core/types.js'\n\n/**\n * Vue-specific Stylelint preset\n *\n * Handles <style> blocks in Vue Single File Components (.vue files)\n *\n * Requires:\n * - stylelint-config-standard-vue\n * - postcss-html (peer dependencies)\n */\nconst vuePreset: StylelintConfig = {\n extends: ['stylelint-config-standard-vue'],\n\n overrides: [\n {\n files: ['**/*.vue'],\n customSyntax: 'postcss-html'\n }\n ],\n\n rules: {\n // Allow Vue-specific pseudo-classes\n 'selector-pseudo-class-no-unknown': [\n true,\n {\n ignorePseudoClasses: ['deep', 'global', 'slotted']\n }\n ],\n\n // Allow Vue-specific pseudo-elements\n 'selector-pseudo-element-no-unknown': [\n true,\n {\n ignorePseudoElements: ['v-deep', 'v-global', 'v-slotted']\n }\n ]\n }\n}\n\nexport default vuePreset\n","import type { StylelintConfig } from '#core/types.js'\n\n/**\n * SCSS/Sass Stylelint preset\n *\n * Standard SCSS linting rules for projects using Sass.\n * Extends the standard SCSS configuration with additional quality rules.\n *\n * Key principles:\n * - Support SCSS syntax (variables, mixins, nesting, etc.)\n * - Enforce modern SCSS practices\n * - Avoid common SCSS mistakes\n * - Maintain consistency with CSS base rules\n */\nconst scssPreset: StylelintConfig = {\n extends: ['stylelint-config-standard-scss'],\n\n rules: {\n // Color rules\n 'color-hex-length': 'short',\n\n // Variables\n 'scss/dollar-variable-colon-space-after': 'always',\n 'scss/dollar-variable-colon-space-before': 'never',\n 'scss/dollar-variable-pattern': [\n '^[a-z][a-zA-Z0-9]*(-[a-z][a-zA-Z0-9]*)*$',\n {\n message: 'Expected variable to be kebab-case'\n }\n ],\n\n // Operators\n 'scss/operator-no-newline-after': true,\n 'scss/operator-no-unspaced': true,\n\n // Nesting\n 'max-nesting-depth': 4, // Allow one more level for SCSS\n\n // At-rules (allow Tailwind if present)\n 'scss/at-rule-no-unknown': [\n true,\n {\n ignoreAtRules: ['tailwind', 'apply', 'variants', 'responsive', 'screen', 'layer']\n }\n ],\n\n // Mixins\n 'scss/at-mixin-pattern': [\n '^[a-z][a-zA-Z0-9]*(-[a-z][a-zA-Z0-9]*)*$',\n {\n message: 'Expected mixin name to be kebab-case'\n }\n ],\n\n // Functions\n 'scss/at-function-pattern': [\n '^[a-z][a-zA-Z0-9]*(-[a-z][a-zA-Z0-9]*)*$',\n {\n message: 'Expected function name to be kebab-case'\n }\n ],\n\n // Placeholder selectors\n 'scss/percent-placeholder-pattern': [\n '^[a-z][a-zA-Z0-9]*(-[a-z][a-zA-Z0-9]*)*$',\n {\n message: 'Expected placeholder to be kebab-case'\n }\n ],\n\n // Selector rules (inherit from base)\n 'selector-max-id': 0,\n 'selector-no-qualifying-type': true,\n 'selector-class-pattern': [\n '^[a-z]([a-z0-9-]+)?(__([a-z0-9]+-?)+)?(--([a-z0-9]+-?)+){0,2}$',\n {\n message: 'Expected class selector to be kebab-case or BEM format'\n }\n ],\n\n // Disable some rules that conflict with SCSS\n 'no-descending-specificity': null\n }\n}\n\nexport default scssPreset\n","import type { StylelintConfig } from '#core/types.js'\n\n/**\n * Tailwind CSS Stylelint preset\n *\n * Configuration for projects using Tailwind CSS.\n * Disables rules that conflict with Tailwind's utility-first approach.\n *\n * Key principles:\n * - Allow Tailwind directives (@tailwind, @apply, @layer, etc.)\n * - Disable rules that conflict with utility classes\n * - Support arbitrary values and variants\n * - Work alongside regular CSS/SCSS\n */\nconst tailwindPreset: StylelintConfig = {\n // Note: We don't extend stylelint-config-tailwindcss because it's too opinionated\n // Instead, we selectively disable conflicting rules\n\n rules: {\n // Allow Tailwind at-rules\n 'at-rule-no-unknown': [\n true,\n {\n ignoreAtRules: ['tailwind', 'apply', 'layer', 'variants', 'responsive', 'screen', 'config']\n }\n ],\n\n // Allow Tailwind functions\n 'function-no-unknown': [\n true,\n {\n ignoreFunctions: ['theme', 'screen']\n }\n ],\n\n // Disable rules that conflict with Tailwind's utility classes\n 'selector-class-pattern': null, // Tailwind uses various patterns\n 'selector-max-id': null, // Allow IDs (though not recommended)\n 'no-descending-specificity': null, // Utility classes have complex specificity\n 'declaration-block-no-redundant-longhand-properties': null, // Utilities may look redundant\n\n // Allow unknown properties (Tailwind CSS variables)\n 'property-no-unknown': [\n true,\n {\n ignoreProperties: ['/^--/'] // Allow CSS custom properties\n }\n ]\n }\n}\n\nexport default tailwindPreset\n","/**\n * Stylelint configuration factory\n *\n * Creates Stylelint configurations with framework-aware defaults for CSS linting.\n *\n * Note: Stylelint is for CSS files and component styles (Vue, Svelte).\n * CSS-in-JS (React styled-components, emotion) should use ESLint plugins instead.\n */\n\nimport basePreset from './presets/base.js'\nimport cssModulesPreset from './presets/css-modules.js'\nimport reactPreset from './presets/frameworks/react.js'\nimport sveltePreset from './presets/frameworks/svelte.js'\nimport vuePreset from './presets/frameworks/vue.js'\nimport scssPreset from './presets/scss.js'\nimport tailwindPreset from './presets/tailwind.js'\n\nimport { autoDetect, detectCssType } from '#core/detectors.js'\nimport { getStylelintIgnores } from '#core/ignore-patterns.js'\nimport type { CssTypeResult, Framework, StylelintConfig, StylelintOptions } from '#core/types.js'\n\n/**\n * Normalize extends to array\n */\nfunction normalizeExtends(value: string | string[] | undefined): string[] {\n if (!value) return []\n return Array.isArray(value) ? value : [value]\n}\n\n/**\n * Merge array values, ensuring both are arrays and concatenating them\n */\nfunction mergeArrays<T>(target: T | T[] | undefined, source: T | T[] | undefined): T[] {\n let targetArray: T[]\n if (Array.isArray(target)) {\n targetArray = target\n } else if (target) {\n targetArray = [target]\n } else {\n targetArray = []\n }\n\n let sourceArray: T[]\n if (Array.isArray(source)) {\n sourceArray = source\n } else if (source) {\n sourceArray = [source]\n } else {\n sourceArray = []\n }\n\n return [...targetArray, ...sourceArray]\n}\n\n/**\n * Merge framework preset into config\n */\nfunction mergePreset(config: StylelintConfig, preset: StylelintConfig): void {\n if (preset.extends) {\n const presetExtends = normalizeExtends(preset.extends)\n const configExtends = normalizeExtends(config.extends)\n config.extends = [...configExtends, ...presetExtends]\n }\n if (preset.overrides) {\n config.overrides = [...(config.overrides || []), ...preset.overrides]\n }\n if (preset.rules) {\n config.rules = { ...config.rules, ...preset.rules }\n }\n}\n\n/**\n * Apply user overrides to config\n */\nfunction applyUserOverrides(config: StylelintConfig, userOverrides: Record<string, unknown>): void {\n // Handle arrays (extends, plugins, overrides)\n if (userOverrides.extends) {\n config.extends = mergeArrays(config.extends, userOverrides.extends as string | string[])\n delete userOverrides.extends\n }\n if (userOverrides.plugins) {\n config.plugins = mergeArrays(config.plugins, userOverrides.plugins as string | string[])\n delete userOverrides.plugins\n }\n if (userOverrides.overrides) {\n config.overrides = mergeArrays(\n config.overrides,\n userOverrides.overrides as NonNullable<StylelintConfig['overrides']> | undefined\n )\n delete userOverrides.overrides\n }\n if (userOverrides.rules) {\n config.rules = { ...config.rules, ...(userOverrides.rules as Record<string, unknown>) }\n delete userOverrides.rules\n }\n\n // Merge remaining overrides\n Object.assign(config, userOverrides)\n}\n\n/**\n * Create a Stylelint configuration\n *\n * @param options - Configuration options\n * @returns Stylelint configuration object\n *\n * @example\n * // Auto-detect framework\n * export default await createStylelintConfig();\n *\n * @example\n * // Explicit framework\n * export default await createStylelintConfig({ framework: 'vue' });\n *\n * @example\n * // Explicit CSS type\n * export default await createStylelintConfig({ cssType: 'scss' });\n *\n * @example\n * // With overrides\n * export default await createStylelintConfig({\n * framework: 'vue',\n * cssType: 'scss',\n * rules: {\n * 'color-hex-length': 'long'\n * }\n * });\n */\n// eslint-disable-next-line require-await -- async for API consistency with other tools\nexport async function createStylelintConfig(\n options: StylelintOptions = {}\n): Promise<StylelintConfig> {\n const {\n framework: explicitFramework = 'auto',\n cssType: explicitCssType = 'auto',\n cwd = process.cwd(),\n ...userOverrides\n } = options\n\n // Auto-detect framework if needed\n const framework: Framework =\n explicitFramework === 'auto' ? autoDetect(cwd).framework : explicitFramework\n\n // Auto-detect CSS type if needed\n const cssType: CssTypeResult | string =\n explicitCssType === 'auto' ? detectCssType(cwd) : explicitCssType\n\n // Normalize cssType to CssTypeResult\n let cssTypeResult: CssTypeResult | null\n if (typeof cssType === 'string') {\n cssTypeResult =\n cssType === 'scss'\n ? { preprocessor: 'scss' as const, tailwind: false, modules: false, postcss: false }\n : null\n } else {\n cssTypeResult = cssType\n }\n\n // Start with appropriate base configuration (SCSS or plain CSS)\n const config: StylelintConfig =\n cssTypeResult?.preprocessor === 'scss'\n ? { ...scssPreset, customSyntax: 'postcss-scss' }\n : { ...basePreset }\n\n // Add default ignore patterns\n config.ignoreFiles = getStylelintIgnores()\n\n // Apply Tailwind preset if detected\n if (cssTypeResult?.tailwind) {\n mergePreset(config, tailwindPreset)\n }\n\n // CSS Modules support (for React/Next.js projects)\n if ((framework === 'react' || framework === 'solid') && !cssTypeResult?.tailwind) {\n mergePreset(config, cssModulesPreset)\n }\n\n // Build CSS type description\n let cssTypeDesc = cssTypeResult?.preprocessor === 'scss' ? 'SCSS' : 'CSS'\n if (cssTypeResult?.tailwind) cssTypeDesc += ' + Tailwind'\n if ((framework === 'react' || framework === 'solid') && !cssTypeResult?.tailwind) {\n cssTypeDesc += ' Modules'\n }\n\n // Apply framework-specific preset\n switch (framework) {\n case 'vue': {\n mergePreset(config, vuePreset)\n console.warn(`🎨 Stylelint: Detected Vue.js - linting .vue component styles (${cssTypeDesc})`)\n break\n }\n\n case 'svelte': {\n mergePreset(config, sveltePreset)\n console.warn(\n `🎨 Stylelint: Detected Svelte - linting .svelte component styles (${cssTypeDesc})`\n )\n break\n }\n\n case 'react':\n case 'solid': {\n mergePreset(config, reactPreset)\n console.warn(\n `🎨 Stylelint: Detected ${framework} - linting ${cssTypeDesc} (CSS-in-JS uses ESLint)`\n )\n break\n }\n\n case 'angular':\n case 'node':\n case 'vanilla':\n case 'astro': {\n console.warn(`🎨 Stylelint: Detected ${framework} - linting ${cssTypeDesc} files`)\n break\n }\n\n default: {\n console.warn(`⚠️ Unknown framework \"${framework}\", using base ${cssTypeDesc} linting`)\n }\n }\n\n // Apply user overrides (excluding internal options)\n const {\n framework: _f,\n cssType: _ct,\n cwd: _c,\n customIgnores: _ci,\n ...restOverrides\n } = userOverrides as Record<string, unknown>\n applyUserOverrides(config, restOverrides)\n\n return config\n}\n\nexport default createStylelintConfig\n"]}
|