@modyqyw/fabric
Version:
Opinionated shareable specifications for git-based JavaScript/TypeScript projects.
251 lines (246 loc) • 7.96 kB
JavaScript
import { M as MINI_PROGRAM_ELEMENTS, C as GLOB_EXCLUDE } from './fabric.DrBYK7XE.mjs';
import { D as hasMiniProgram, E as hasScss } from './fabric.UWmAURsN.mjs';
function extends_(options) {
const { order, scss: enableScss } = options;
const array = [
"stylelint-config-html",
"stylelint-config-standard"
];
if (enableScss) array.push("stylelint-config-standard-scss");
if (order) array.push("stylelint-config-recess-order");
return array;
}
function plugins(options) {
const { defensiveCss, highPerformanceAnimation, logicalCss } = options;
const array = [];
if (highPerformanceAnimation)
array.push("stylelint-high-performance-animation");
if (defensiveCss) array.push("stylelint-plugin-defensive-css");
if (logicalCss) array.push("stylelint-plugin-logical-css");
return array;
}
function rules(options) {
const {
defensiveCss,
highPerformanceAnimation,
logicalCss,
scss: enableScss
} = options;
const object = {
// https://stylelint.io/user-guide/rules/at-rule-no-unknown/
"at-rule-no-unknown": [
true,
{
ignoreAtRules: [
// css modules
// https://github.com/pascalduez/stylelint-config-css-modules/blob/4.4.0/index.js
"value",
// tailwindcss
// https://tailwindcss.com/docs/functions-and-directives#directives
"tailwind",
"layer",
"apply",
"config"
]
}
],
// https://stylelint.io/user-guide/rules/function-no-unknown/
"function-no-unknown": [
true,
{
ignoreFunctions: [
// css modules
// https://github.com/pascalduez/stylelint-config-css-modules/blob/4.4.0/index.js
"global",
// tailwindcss
// https://tailwindcss.com/docs/functions-and-directives#functions
"theme",
"screen",
// vue
// https://vuejs.org/api/sfc-css-features.html#v-bind-in-css
"v-bind"
]
}
],
// https://stylelint.io/user-guide/rules/property-no-unknown/
"property-no-unknown": [
true,
{
// css modules
// https://github.com/pascalduez/stylelint-config-css-modules/blob/4.4.0/index.js
ignoreProperties: ["composes", "compose-with"],
ignoreSelectors: [":export", /^:import/]
}
],
// https://stylelint.io/user-guide/rules/selector-class-pattern/
"selector-class-pattern": [
// https://regexr.com/3apms
"^[a-z]([-]?[a-z0-9]+)*(__[a-z0-9]([-]?[a-z0-9]+)*)?(--[a-z0-9]([-]?[a-z0-9]+)*)?$",
{
message: (selector) => `Expected class selector "${selector}" to be kebab-case or BEM`
}
],
// https://stylelint.io/user-guide/rules/selector-pseudo-class-no-unknown/
"selector-pseudo-class-no-unknown": [
true,
{
ignorePseudoClasses: [
// css modules
// https://github.com/pascalduez/stylelint-config-css-modules/blob/4.4.0/index.js
"export",
"import",
"local",
"external",
// css modules
// also vue global selectors
// https://vuejs.org/api/sfc-css-features.html#scoped-css
"global",
// vue deep selectors
// https://vuejs.org/api/sfc-css-features.html#deep-selectors
"deep",
// vue slotted selectors
// https://vuejs.org/api/sfc-css-features.html#slotted-selectors
"slotted"
]
}
],
// https://stylelint.io/user-guide/rules/selector-pseudo-element-no-unknown/
"selector-pseudo-element-no-unknown": [
true,
// vue legacy support
{ ignorePseudoElements: ["v-global", "v-deep", "v-slotted"] }
],
// https://stylelint.io/user-guide/rules/selector-type-no-unknown/
"selector-type-no-unknown": [
true,
{
ignore: ["custom-elements"],
ignoreTypes: [
// css modules
// https://github.com/pascalduez/stylelint-config-css-modules/blob/4.4.0/index.js
"from",
// mini program
...hasMiniProgram ? MINI_PROGRAM_ELEMENTS : []
]
}
],
"unit-no-unknown": [
true,
{
ignoreUnits: hasMiniProgram ? ["rpx"] : []
}
]
};
if (highPerformanceAnimation) {
object["plugin/no-low-performance-animation-properties"] = true;
}
if (defensiveCss) {
object["plugin/use-defensive-css"] = [
true,
{
"accidental-hover": true,
"background-repeat": true,
"custom-property-fallbacks": true,
"flex-wrapping": true,
"scroll-chaining": true,
"scrollbar-gutter": true,
"vendor-prefix-grouping": true
}
];
}
if (logicalCss) {
object["plugin/use-logical-properties-and-values"] = [
true,
{ disableFix: true, severity: "warning" }
];
object["plugin/use-logical-units"] = [
true,
{ disableFix: true, severity: "warning" }
];
}
if (enableScss) {
object["at-rule-no-unknown"] = null;
object["scss/at-rule-no-unknown"] = [
true,
{
ignoreAtRules: [
// css modules
// https://github.com/pascalduez/stylelint-config-css-modules/blob/4.4.0/index.js
"value",
// tailwindcss
// https://tailwindcss.com/docs/functions-and-directives#directives
"tailwind",
"layer",
"apply",
"config"
]
}
];
object["function-no-unknown"] = null;
object["scss/function-no-unknown"] = [
true,
{
ignoreFunctions: [
// css modules
// https://github.com/pascalduez/stylelint-config-css-modules/blob/4.4.0/index.js
"global",
// tailwindcss
// https://tailwindcss.com/docs/functions-and-directives#functions
"theme",
"screen",
// vue
// https://vuejs.org/api/sfc-css-features.html#v-bind-in-css
"v-bind"
]
}
];
object["property-no-unknown"] = null;
object["scss/property-no-unknown"] = [
true,
{
// css modules
// https://github.com/pascalduez/stylelint-config-css-modules/blob/4.4.0/index.js
ignoreProperties: ["composes", "compose-with"],
ignoreSelectors: [":export", /^:import/]
}
];
object["scss/at-else-closing-brace-newline-after"] = null;
object["scss/at-else-closing-brace-space-after"] = null;
object["scss/at-else-empty-line-before"] = null;
object["scss/at-else-if-parentheses-space-before"] = null;
object["scss/at-function-parentheses-space-before"] = null;
object["scss/at-if-closing-brace-newline-after"] = null;
object["scss/at-if-closing-brace-space-after"] = null;
object["scss/at-mixin-parentheses-space-before"] = null;
object["scss/dollar-variable-colon-newline-after"] = null;
object["scss/dollar-variable-colon-space-after"] = null;
object["scss/dollar-variable-colon-space-before"] = null;
object["scss/operator-no-newline-after"] = null;
object["scss/operator-no-newline-before"] = null;
object["scss/operator-no-unspaced"] = null;
}
return object;
}
function parseOptions(options = {}) {
return {
order: options.order ?? true,
highPerformanceAnimation: options.highPerformanceAnimation ?? true,
defensiveCss: options.defensiveCss ?? true,
logicalCss: options.logicalCss ?? false,
scss: options.scss ?? hasScss
};
}
function stylelint(options = {}, userConfig = {}) {
const parsed = parseOptions(options);
return {
extends: extends_(parsed),
ignoreFiles: GLOB_EXCLUDE,
plugins: plugins(parsed),
reportDescriptionlessDisables: true,
reportInvalidScopeDisables: true,
reportNeedlessDisables: true,
rules: rules(parsed),
...userConfig
};
}
export { parseOptions as a, extends_ as e, plugins as p, rules as r, stylelint as s };