@culur/config-stylelint 0.0.0-dev-20240527064403 → 1.0.1

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/CHANGELOG.md CHANGED
@@ -1,13 +1,27 @@
1
1
  # @culur/config-stylelint
2
2
 
3
- ## 0.0.0-dev-20240527064403
3
+ ## 1.0.1
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - [#18](https://github.com/culur/culur/pull/18) [`622888f`](https://github.com/culur/culur/commit/622888fa6d4a31ac275b435a74c29cd0b986f974) Thanks [@github-actions](https://github.com/apps/github-actions)! - Update dependencies version
7
+ - [`49476de`](https://github.com/culur/culur/commit/49476dee58addebe889a9bd134435a7d41a6d1f2) Thanks [@renovate[bot]](https://github.com/renovate%5Bbot%5D)! - Update dependencies from renovate:
8
8
 
9
- - Updated dependencies [[`622888f`](https://github.com/culur/culur/commit/622888fa6d4a31ac275b435a74c29cd0b986f974)]:
10
- - @culur/utils-packages@0.0.0-dev-20240527064403
9
+ - `dependencies`:
10
+ - `stylelint-config-clean-order` to `^6.0.0`
11
+
12
+ - [`74dbf2c`](https://github.com/culur/culur/commit/74dbf2c0050b30e9289aa7879c4cbb9ac103f4d3) Thanks [@renovate[bot]](https://github.com/renovate%5Bbot%5D)! - Update dependencies from renovate:
13
+
14
+ - `dependencies`:
15
+ - `stylelint-scss` to `^6.3.1`
16
+ - `devDependencies`:
17
+ - `@types/node` to `^20.14.2`
18
+ - `stylelint` to `^16.6.1`
19
+ - `tsup` to `^8.1.0`
20
+
21
+ - [`7f4eeae`](https://github.com/culur/culur/commit/7f4eeae4fa2c2dbed218675e8ce2cc91ca0bc4c3) Thanks [@phamhongphuc](https://github.com/phamhongphuc)! - Update workspace dependencies to specific version
22
+
23
+ - Updated dependencies [[`74dbf2c`](https://github.com/culur/culur/commit/74dbf2c0050b30e9289aa7879c4cbb9ac103f4d3), [`7f4eeae`](https://github.com/culur/culur/commit/7f4eeae4fa2c2dbed218675e8ce2cc91ca0bc4c3)]:
24
+ - @culur/utils-packages@1.0.1
11
25
 
12
26
  ## 1.0.0
13
27
 
package/dist/index.cjs CHANGED
@@ -53,7 +53,7 @@ var declarationBlockNoRedundantLonghandPropertiesRule = defineRule([true, { igno
53
53
  var declarationBlockNoRedundantLonghandProperties = defineRules({
54
54
  "declaration-block-no-redundant-longhand-properties": declarationBlockNoRedundantLonghandPropertiesRule
55
55
  });
56
- var functionNoUnknownRule = () => {
56
+ function functionNoUnknownRule() {
57
57
  const ignoreFunctions = [
58
58
  // https://tailwindcss.com/docs/functions-and-directives#functions
59
59
  ...utilsPackages.hasTailwind() ? ["theme", "screen"] : [],
@@ -68,7 +68,7 @@ var functionNoUnknownRule = () => {
68
68
  true,
69
69
  ignoreFunctions.length > 0 ? { ignoreFunctions } : { ignoreFunctions: void 0 }
70
70
  ]);
71
- };
71
+ }
72
72
  var functionNoUnknown = () => defineRules({
73
73
  "function-no-unknown": functionNoUnknownRule()
74
74
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/factory.ts","../src/rules/at-rule-no-unknown.ts","../src/utils/utils.ts","../src/rules/declaration-block-no-redundant-longhand-properties.ts","../src/rules/function-no-unknown.ts","../src/rules/order.ts","../src/configs/css.ts","../src/rules/dollar-variable-pattern.ts","../src/configs/scss.ts","../src/configs/shared.ts","../src/configs/vue.ts","../src/index.ts"],"names":["hasSass","hasVue","hasTailwind"],"mappings":";AACA,SAAS,WAAAA,UAAS,UAAAC,SAAQ,6BAA6B;;;ACDvD,SAAS,mBAAmB;;;ACSrB,IAAM,aAAa,CAIxB,SACG;AAEE,IAAM,cAAc,CAAiC,SAC1D;AAGK,IAAM,eAAe,IACvB,kBACA;AACH,QAAM,UAAU,cAAc,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC;AAE5D,SAAO;AAAA,IACL,SAAS,CAAC,GAAG,IAAI,IAAI,QAAQ,QAAQ,OAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;AAAA,IAC3D,WAAW,CAAC,GAAG,IAAI,IAAI,QAAQ,QAAQ,OAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;AAAA,IAC/D,SAAS,QACN,QAAQ,OAAK,EAAE,WAAW,CAAC,CAAC,EAC5B,OAAO,CAAC,MAAM,OAAO,QAAQ,IAAI,YAAY,IAAI,MAAM,KAAK;AAAA,IAC/D,OAAO,QAAQ;AAAA,MACb,CAAC,KAAK,YAAY,EAAE,GAAG,KAAK,GAAG,OAAO,MAAM;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IACA,GAAG,QAAQ;AAAA,MACT,CACE,KACA,EAAE,SAAS,IAAI,WAAW,IAAI,SAAS,IAAI,OAAO,IAAI,GAAG,OAAO,OAC5D,EAAE,GAAG,KAAK,GAAG,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ADvCA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,sBAAsB,MACjC,WAA4D;AAAA,EAC1D;AAAA,EACA,EAAE,eAAe,YAAY,IAAI,aAAa,CAAC,EAAE;AACnD,CAAC;AAEI,IAAM,qBAAqB,MAChC,YAAY;AAAA,EACV,sBAAsB,oBAAoB;AAC5C,CAAC;AAEI,IAAM,sBAAsB,MACjC,YAAY;AAAA,EACV,sBAAsB;AAAA,EACtB,2BAA2B,oBAAoB;AACjD,CAAC;;;AE9BI,IAAM,oDAAoD,WAG/D,CAAC,MAAM,EAAE,kBAAkB,CAAC,eAAe,EAAE,CAAC,CAAC;AAE1C,IAAM,gDAAgD,YAAY;AAAA,EACvE,sDACE;AACJ,CAAC;;;ACVD,SAAS,SAAS,eAAAC,cAAa,cAAc;AAGtC,IAAM,wBAAwB,MAAM;AACzC,QAAM,kBAAkB;AAAA;AAAA,IAEtB,GAAIA,aAAY,IACZ,CAAC,SAAS,QAAQ,IAClB,CAAC;AAAA;AAAA;AAAA;AAAA,IAKL,GAAI,QAAQ,IACR,CAAC,wBAAwB,IACzB,CAAC;AAAA;AAAA,IAGL,GAAI,OAAO,IACP,CAAC,QAAQ,IACT,CAAC;AAAA,EACP;AAEA,SAAO,WAA+D;AAAA,IACpE;AAAA,IACA,gBAAgB,SAAS,IACrB,EAAE,gBAAgB,IAClB,EAAE,iBAAiB,OAAU;AAAA,EACnC,CAAC;AACH;AAEO,IAAM,oBAAoB,MAC/B,YAAY;AAAA,EACV,uBAAuB,sBAAsB;AAC/C,CAAC;;;AClCH,SAAS,WAAAF,UAAS,eAAAE,oBAAmB;AAmCrC,IAAM,mBAAkC;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,MAAM;AAAA,EAC/B,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EACnC,EAAE,MAAM,WAAW,MAAM,SAAS;AACpC;AACA,IAAM,aAA4B;AAAA,EAChC,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,QAAQ;AAAA,EACjC,EAAE,MAAM,WAAW,MAAM,SAAS;AAAA,EAClC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EACnC,EAAE,MAAM,WAAW,MAAM,UAAU;AACrC;AAEA,IAAM,YAA2B;AAAA,EAC/B;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAKA,IAAM,iBAAgC;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,QAAQ;AAAA,EACjC,EAAE,MAAM,WAAW,MAAM,QAAQ;AAAA,EACjC,EAAE,MAAM,WAAW,MAAM,SAAS;AACpC;AAOA,IAAM,mBAAkC;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,aAAa;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,SAAS;AACpC;AAKA,IAAM,QAAuB;AAAA,EAC3B;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AACF;AAEO,IAAM,YAAY,MACvB,WAA4C;AAAA,EAC1C;AAAA,IACE,GAAIF,SAAQ,IAAI,mBAAmB,CAAC;AAAA,IACpC,GAAIE,aAAY,IAAI,iBAAiB,CAAC;AAAA,IACtC,GAAG;AAAA,IACH,GAAIF,SAAQ,IAAI,aAAa,CAAC;AAAA,IAC9B,GAAIE,aAAY,IAAI,mBAAmB,CAAC;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AAAA,EACA;AAAA,IACE,aAAa;AAAA,EACf;AACF,CAAC;AAEI,IAAM,QAAQ,MACnB,YAAY;AAAA,EACV,eAAe,UAAU;AAC3B,CAAC;;;ACrGI,IAAM,YAAY,OAAe;AAAA,EACtC,SAAS,CAAC,6BAA6B,8BAA8B;AAAA,EACrE,SAAS,CAAC,mBAAmB,gCAAgC;AAAA,EAC7D,OAAO;AAAA,IACL,GAAG,mBAAmB;AAAA,IACtB,GAAG;AAAA,IACH,GAAG,kBAAkB;AAAA,IACrB,GAAG,MAAM;AAAA,EACX;AACF;;;ACRO,IAAM,4BAA4B,WAGvC;AAAA,EACA;AAAA,EACA,EAAE,SAAS,qCAAqC;AAClD,CAAC;AAEM,IAAM,4BAA4B,YAAY;AAAA,EACnD,gCAAgC;AAClC,CAAC;;;ACbM,IAAM,aAAa,OAAe;AAAA,EACvC,SAAS,CAAC,gCAAgC;AAAA,EAC1C,OAAO;AAAA,IACL,GAAG,oBAAoB;AAAA,IACvB,GAAG;AAAA,EACL;AACF;;;ACRO,IAAM,eAAe,OAAe;AAAA,EACzC,SAAS,CAAC,uBAAuB;AACnC;;;ACJA,SAAS,WAAAF,gBAAe;AAGjB,IAAM,YAAY,OAAe;AAAA,EACtC,SAAS;AAAA,IACPA,SAAQ,IACJ,uCACA;AAAA,EACN;AACF;;;AVAe,SAAR,aACL,SACA,QACQ;AACR,wBAAsB,OAAO;AAE7B,SAAO;AAAA,IACL,aAAa;AAAA,IACb,UAAU;AAAA,IACVA,SAAQ,KAAK,WAAW;AAAA,IACxBC,QAAO,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AACF;;;AWpBA,IAAO,cAAQ,aAAa","sourcesContent":["import type { Packages } from '@culur/utils-packages';\nimport { hasSass, hasVue, updateDefaultPackages } from '@culur/utils-packages';\nimport type { Config } from 'stylelint';\nimport { configCss } from './configs/css';\nimport { configScss } from './configs/scss';\nimport { configShared } from './configs/shared';\nimport { configVue } from './configs/vue';\nimport { mergeConfigs } from './utils';\n\nexport default function defineConfig(\n options?: Partial<Packages>,\n config?: Config,\n): Config {\n updateDefaultPackages(options);\n\n return mergeConfigs(\n configShared(),\n configCss(),\n hasSass() && configScss(),\n hasVue() && configVue(),\n config,\n );\n}\n","import { hasTailwind } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\n// https://tailwindcss.com/docs/functions-and-directives\nconst directives = [\n 'tailwind',\n 'layer',\n 'apply',\n 'config',\n\n // https://v2.tailwindcss.com/docs/functions-and-directives\n // backwards compatible for v2\n 'variants',\n 'responsive',\n 'screen',\n];\n\nexport const atRuleNoUnknownRule = () =>\n defineRule<boolean, { ignoreAtRules: (string | RegExp)[] }>([\n true,\n { ignoreAtRules: hasTailwind() ? directives : [] },\n ]);\n\nexport const atRuleNoUnknownCSS = () =>\n defineRules({\n 'at-rule-no-unknown': atRuleNoUnknownRule(),\n });\n\nexport const atRuleNoUnknownSCSS = () =>\n defineRules({\n 'at-rule-no-unknown': null,\n 'scss/at-rule-no-unknown': atRuleNoUnknownRule(),\n });\n","import type { Config, ConfigRuleSettings } from 'stylelint';\n\nexport type ConfigRulePrimaryOption =\n | boolean\n | number\n | string\n | Array<boolean | number | string | object>;\nexport type ConfigRuleSecondaryOptions = object;\n\nexport const defineRule = <\n PrimaryOption extends ConfigRulePrimaryOption,\n SecondaryOptions extends ConfigRuleSecondaryOptions,\n>(\n rule: ConfigRuleSettings<PrimaryOption, SecondaryOptions>,\n) => rule;\n\nexport const defineRules = <TRules extends Config['rules']>(rule: TRules) =>\n rule;\n\n// clone function mergeConfigs from stylelint repository\nexport const mergeConfigs = (\n ...configsOrNull: (Config | undefined | null | false)[]\n) => {\n const configs = configsOrNull.filter((c): c is Config => !!c);\n\n return {\n plugins: [...new Set(configs.flatMap(c => c.plugins ?? []))],\n overrides: [...new Set(configs.flatMap(c => c.overrides ?? []))],\n extends: configs\n .flatMap(c => c.extends ?? [])\n .filter((item, index, arr) => arr.lastIndexOf(item) === index),\n rules: configs.reduce(\n (acc, config) => ({ ...acc, ...config.rules }),\n {} as Config['rules'],\n ),\n ...configs.reduce(\n (\n acc,\n { plugins: _p, overrides: _o, extends: _e, rules: _r, ...config },\n ) => ({ ...acc, ...config }),\n {} as Config,\n ),\n };\n};\n","import { defineRule, defineRules } from '~/utils';\n\nexport const declarationBlockNoRedundantLonghandPropertiesRule = defineRule<\n true,\n { ignoreShorthands?: (string | RegExp)[] }\n>([true, { ignoreShorthands: ['grid-template'] }]);\n\nexport const declarationBlockNoRedundantLonghandProperties = defineRules({\n 'declaration-block-no-redundant-longhand-properties':\n declarationBlockNoRedundantLonghandPropertiesRule,\n});\n","import { hasSass, hasTailwind, hasVue } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\nexport const functionNoUnknownRule = () => {\n const ignoreFunctions = [\n // https://tailwindcss.com/docs/functions-and-directives#functions\n ...(hasTailwind() //\n ? ['theme', 'screen']\n : []),\n\n // https://sass-lang.com/documentation/modules/list\n // https://sass-lang.com/documentation/modules/math\n // https://sass-lang.com/documentation/modules/color\n ...(hasSass() //\n ? [/^(list|math|color)\\..+/]\n : []),\n\n // https://vuejs.org/api/sfc-css-features.html#v-bind-in-css\n ...(hasVue() //\n ? ['v-bind']\n : []),\n ];\n\n return defineRule<boolean, { ignoreFunctions?: (string | RegExp)[] }>([\n true,\n ignoreFunctions.length > 0\n ? { ignoreFunctions }\n : { ignoreFunctions: undefined },\n ]);\n};\n\nexport const functionNoUnknown = () =>\n defineRules({\n 'function-no-unknown': functionNoUnknownRule(),\n });\n","import { hasSass, hasTailwind } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\n// https://github.com/hudochenkov/stylelint-order/blob/master/rules/order/README.md#options\n\ntype Keyword =\n | 'custom-properties' /**/ // Custom properties (e.g. --property: 10px;)\n | 'dollar-variables' /***/ // Dollar variables (e.g. $variable)\n | 'at-variables' /*******/ // At-variables (e.g. @variable available in Less syntax)\n | 'declarations' /*******/ // CSS declarations (e.g. display: block)\n | 'rules' /**************/ // Nested rules (e.g. a { span {} })\n | 'at-rules' /***********/ // Nested at-rules (e.g. div { @media () {} })\n | 'less-mixins'; /*******/ // Mixins in Less syntax (e.g. .mixin();)\n\ninterface AtRule {\n type: 'at-rule';\n name?: string;\n parameter?: string | RegExp;\n hasBlock?: boolean;\n}\n\ninterface Rule {\n type: 'rule';\n selector?: string | RegExp;\n name?: string;\n}\n\ntype PrimaryOption = Array<Keyword | AtRule | Rule>;\ninterface SecondaryOptions {\n unspecified?: 'top' | 'bottom' | 'ignore';\n}\n\n/**\n * https://sass-lang.com/documentation/at-rules\n */\nconst atRuleScssImport: PrimaryOption = [\n { type: 'at-rule', name: 'use' },\n { type: 'at-rule', name: 'forward' },\n { type: 'at-rule', name: 'import' },\n];\nconst atRuleScss: PrimaryOption = [\n { type: 'at-rule', name: 'function' },\n { type: 'at-rule', name: 'mixin' },\n { type: 'at-rule', name: 'extend' },\n { type: 'at-rule', name: 'include' },\n { type: 'at-rule', name: 'at-root' },\n];\n\nconst variables: PrimaryOption = [\n 'dollar-variables', // $variable\n 'at-variables', // @variable\n 'custom-properties', // --property: 10px\n];\n\n/**\n * https://tailwindcss.com/docs/functions-and-directives\n */\nconst atRuleTailwind: PrimaryOption = [\n { type: 'at-rule', name: 'tailwind' },\n { type: 'at-rule', name: 'layer' },\n { type: 'at-rule', name: 'apply' },\n { type: 'at-rule', name: 'config' },\n];\n\n/**\n * https://v2.tailwindcss.com/docs/functions-and-directives\n *\n * backwards compatible for v2\n */\nconst atRuleTailwindV2: PrimaryOption = [\n { type: 'at-rule', name: 'variants' },\n { type: 'at-rule', name: 'responsive' },\n { type: 'at-rule', name: 'screen' },\n];\n\n/**\n * Nested rules (e.g. a { span {} })\n */\nconst rules: PrimaryOption = [\n {\n type: 'rule',\n selector: /^&::[\\w-]+/,\n },\n 'rules',\n];\n\nexport const orderRule = () =>\n defineRule<PrimaryOption, SecondaryOptions>([\n [\n ...(hasSass() ? atRuleScssImport : []),\n ...(hasTailwind() ? atRuleTailwind : []),\n ...variables,\n ...(hasSass() ? atRuleScss : []),\n ...(hasTailwind() ? atRuleTailwindV2 : []),\n 'at-rules',\n 'less-mixins',\n 'declarations',\n ...rules,\n ],\n {\n unspecified: 'bottom',\n },\n ]);\n\nexport const order = () =>\n defineRules({\n 'order/order': orderRule(),\n });\n","import type { Config } from 'stylelint';\nimport { atRuleNoUnknownCSS } from '~/rules/at-rule-no-unknown';\nimport { declarationBlockNoRedundantLonghandProperties } from '~/rules/declaration-block-no-redundant-longhand-properties';\nimport { functionNoUnknown } from '~/rules/function-no-unknown';\nimport { order } from '~/rules/order';\n\nexport const configCss = (): Config => ({\n extends: ['stylelint-config-standard', 'stylelint-config-clean-order'],\n plugins: ['stylelint-order', 'stylelint-selector-bem-pattern'],\n rules: {\n ...atRuleNoUnknownCSS(),\n ...declarationBlockNoRedundantLonghandProperties,\n ...functionNoUnknown(),\n ...order(),\n },\n});\n","import { defineRule, defineRules } from '~/utils';\n\ntype PrimaryOption = string;\ninterface SecondaryOptions {\n message: string;\n}\n\nexport const dollarVariablePatternRule = defineRule<\n PrimaryOption,\n SecondaryOptions\n>([\n '^(-{0,2}?[a-z][a-z0-9]*)(-[a-z0-9]+)*$',\n { message: 'Expected variable to be kebab-case' },\n]);\n\nexport const dollarVariablePatternSCSS = defineRules({\n 'scss/dollar-variable-pattern': dollarVariablePatternRule,\n});\n","import type { Config } from 'stylelint';\nimport { atRuleNoUnknownSCSS } from '~/rules/at-rule-no-unknown';\nimport { dollarVariablePatternSCSS } from '~/rules/dollar-variable-pattern';\n\nexport const configScss = (): Config => ({\n extends: ['stylelint-config-standard-scss'],\n rules: {\n ...atRuleNoUnknownSCSS(),\n ...dollarVariablePatternSCSS,\n },\n});\n","import type { Config } from 'stylelint';\n\nexport const configShared = (): Config => ({\n extends: ['stylelint-config-html'],\n});\n","import { hasSass } from '@culur/utils-packages';\nimport type { Config } from 'stylelint';\n\nexport const configVue = (): Config => ({\n extends: [\n hasSass()\n ? 'stylelint-config-standard-vue/scss'\n : 'stylelint-config-standard-vue',\n ],\n});\n","import defineConfig from './factory';\n\nexport default defineConfig();\n"]}
1
+ {"version":3,"sources":["../src/factory.ts","../src/rules/at-rule-no-unknown.ts","../src/utils/utils.ts","../src/rules/declaration-block-no-redundant-longhand-properties.ts","../src/rules/function-no-unknown.ts","../src/rules/order.ts","../src/configs/css.ts","../src/rules/dollar-variable-pattern.ts","../src/configs/scss.ts","../src/configs/shared.ts","../src/configs/vue.ts","../src/index.ts"],"names":["hasSass","hasVue","hasTailwind"],"mappings":"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","sourcesContent":["import type { Packages } from '@culur/utils-packages';\nimport { hasSass, hasVue, updateDefaultPackages } from '@culur/utils-packages';\nimport type { Config } from 'stylelint';\nimport { configCss } from './configs/css';\nimport { configScss } from './configs/scss';\nimport { configShared } from './configs/shared';\nimport { configVue } from './configs/vue';\nimport { mergeConfigs } from './utils';\n\nexport default function defineConfig(\n options?: Partial<Packages>,\n config?: Config,\n): Config {\n updateDefaultPackages(options);\n\n return mergeConfigs(\n configShared(),\n configCss(),\n hasSass() && configScss(),\n hasVue() && configVue(),\n config,\n );\n}\n","import { hasTailwind } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\n// https://tailwindcss.com/docs/functions-and-directives\nconst directives = [\n 'tailwind',\n 'layer',\n 'apply',\n 'config',\n\n // https://v2.tailwindcss.com/docs/functions-and-directives\n // backwards compatible for v2\n 'variants',\n 'responsive',\n 'screen',\n];\n\nexport const atRuleNoUnknownRule = () =>\n defineRule<boolean, { ignoreAtRules: (string | RegExp)[] }>([\n true,\n { ignoreAtRules: hasTailwind() ? directives : [] },\n ]);\n\nexport const atRuleNoUnknownCSS = () =>\n defineRules({\n 'at-rule-no-unknown': atRuleNoUnknownRule(),\n });\n\nexport const atRuleNoUnknownSCSS = () =>\n defineRules({\n 'at-rule-no-unknown': null,\n 'scss/at-rule-no-unknown': atRuleNoUnknownRule(),\n });\n","import type { Config, ConfigRuleSettings } from 'stylelint';\n\nexport type ConfigRulePrimaryOption =\n | boolean\n | number\n | string\n | Array<boolean | number | string | object>;\nexport type ConfigRuleSecondaryOptions = object;\n\nexport const defineRule = <\n PrimaryOption extends ConfigRulePrimaryOption,\n SecondaryOptions extends ConfigRuleSecondaryOptions,\n>(\n rule: ConfigRuleSettings<PrimaryOption, SecondaryOptions>,\n) => rule;\n\nexport const defineRules = <TRules extends Config['rules']>(rule: TRules) =>\n rule;\n\n// clone function mergeConfigs from stylelint repository\nexport const mergeConfigs = (\n ...configsOrNull: (Config | undefined | null | false)[]\n) => {\n const configs = configsOrNull.filter((c): c is Config => !!c);\n\n return {\n plugins: [...new Set(configs.flatMap(c => c.plugins ?? []))],\n overrides: [...new Set(configs.flatMap(c => c.overrides ?? []))],\n extends: configs\n .flatMap(c => c.extends ?? [])\n .filter((item, index, arr) => arr.lastIndexOf(item) === index),\n rules: configs.reduce(\n (acc, config) => ({ ...acc, ...config.rules }),\n {} as Config['rules'],\n ),\n ...configs.reduce(\n (\n acc,\n { plugins: _p, overrides: _o, extends: _e, rules: _r, ...config },\n ) => ({ ...acc, ...config }),\n {} as Config,\n ),\n };\n};\n","import { defineRule, defineRules } from '~/utils';\n\nexport const declarationBlockNoRedundantLonghandPropertiesRule = defineRule<\n true,\n { ignoreShorthands?: (string | RegExp)[] }\n>([true, { ignoreShorthands: ['grid-template'] }]);\n\nexport const declarationBlockNoRedundantLonghandProperties = defineRules({\n 'declaration-block-no-redundant-longhand-properties':\n declarationBlockNoRedundantLonghandPropertiesRule,\n});\n","import { hasSass, hasTailwind, hasVue } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\nexport function functionNoUnknownRule() {\n const ignoreFunctions = [\n // https://tailwindcss.com/docs/functions-and-directives#functions\n ...(hasTailwind() //\n ? ['theme', 'screen']\n : []),\n\n // https://sass-lang.com/documentation/modules/list\n // https://sass-lang.com/documentation/modules/math\n // https://sass-lang.com/documentation/modules/color\n ...(hasSass() //\n ? [/^(list|math|color)\\..+/]\n : []),\n\n // https://vuejs.org/api/sfc-css-features.html#v-bind-in-css\n ...(hasVue() //\n ? ['v-bind']\n : []),\n ];\n\n return defineRule<boolean, { ignoreFunctions?: (string | RegExp)[] }>([\n true,\n ignoreFunctions.length > 0\n ? { ignoreFunctions }\n : { ignoreFunctions: undefined },\n ]);\n}\n\nexport const functionNoUnknown = () =>\n defineRules({\n 'function-no-unknown': functionNoUnknownRule(),\n });\n","import { hasSass, hasTailwind } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\n// https://github.com/hudochenkov/stylelint-order/blob/master/rules/order/README.md#options\n\ntype Keyword =\n | 'custom-properties' /**/ // Custom properties (e.g. --property: 10px;)\n | 'dollar-variables' /***/ // Dollar variables (e.g. $variable)\n | 'at-variables' /*******/ // At-variables (e.g. @variable available in Less syntax)\n | 'declarations' /*******/ // CSS declarations (e.g. display: block)\n | 'rules' /**************/ // Nested rules (e.g. a { span {} })\n | 'at-rules' /***********/ // Nested at-rules (e.g. div { @media () {} })\n | 'less-mixins'; /*******/ // Mixins in Less syntax (e.g. .mixin();)\n\ninterface AtRule {\n type: 'at-rule';\n name?: string;\n parameter?: string | RegExp;\n hasBlock?: boolean;\n}\n\ninterface Rule {\n type: 'rule';\n selector?: string | RegExp;\n name?: string;\n}\n\ntype PrimaryOption = Array<Keyword | AtRule | Rule>;\ninterface SecondaryOptions {\n unspecified?: 'top' | 'bottom' | 'ignore';\n}\n\n/**\n * https://sass-lang.com/documentation/at-rules\n */\nconst atRuleScssImport: PrimaryOption = [\n { type: 'at-rule', name: 'use' },\n { type: 'at-rule', name: 'forward' },\n { type: 'at-rule', name: 'import' },\n];\nconst atRuleScss: PrimaryOption = [\n { type: 'at-rule', name: 'function' },\n { type: 'at-rule', name: 'mixin' },\n { type: 'at-rule', name: 'extend' },\n { type: 'at-rule', name: 'include' },\n { type: 'at-rule', name: 'at-root' },\n];\n\nconst variables: PrimaryOption = [\n 'dollar-variables', // $variable\n 'at-variables', // @variable\n 'custom-properties', // --property: 10px\n];\n\n/**\n * https://tailwindcss.com/docs/functions-and-directives\n */\nconst atRuleTailwind: PrimaryOption = [\n { type: 'at-rule', name: 'tailwind' },\n { type: 'at-rule', name: 'layer' },\n { type: 'at-rule', name: 'apply' },\n { type: 'at-rule', name: 'config' },\n];\n\n/**\n * https://v2.tailwindcss.com/docs/functions-and-directives\n *\n * backwards compatible for v2\n */\nconst atRuleTailwindV2: PrimaryOption = [\n { type: 'at-rule', name: 'variants' },\n { type: 'at-rule', name: 'responsive' },\n { type: 'at-rule', name: 'screen' },\n];\n\n/**\n * Nested rules (e.g. a { span {} })\n */\nconst rules: PrimaryOption = [\n {\n type: 'rule',\n selector: /^&::[\\w-]+/,\n },\n 'rules',\n];\n\nexport const orderRule = () =>\n defineRule<PrimaryOption, SecondaryOptions>([\n [\n ...(hasSass() ? atRuleScssImport : []),\n ...(hasTailwind() ? atRuleTailwind : []),\n ...variables,\n ...(hasSass() ? atRuleScss : []),\n ...(hasTailwind() ? atRuleTailwindV2 : []),\n 'at-rules',\n 'less-mixins',\n 'declarations',\n ...rules,\n ],\n {\n unspecified: 'bottom',\n },\n ]);\n\nexport const order = () =>\n defineRules({\n 'order/order': orderRule(),\n });\n","import type { Config } from 'stylelint';\nimport { atRuleNoUnknownCSS } from '~/rules/at-rule-no-unknown';\nimport { declarationBlockNoRedundantLonghandProperties } from '~/rules/declaration-block-no-redundant-longhand-properties';\nimport { functionNoUnknown } from '~/rules/function-no-unknown';\nimport { order } from '~/rules/order';\n\nexport const configCss = (): Config => ({\n extends: ['stylelint-config-standard', 'stylelint-config-clean-order'],\n plugins: ['stylelint-order', 'stylelint-selector-bem-pattern'],\n rules: {\n ...atRuleNoUnknownCSS(),\n ...declarationBlockNoRedundantLonghandProperties,\n ...functionNoUnknown(),\n ...order(),\n },\n});\n","import { defineRule, defineRules } from '~/utils';\n\ntype PrimaryOption = string;\ninterface SecondaryOptions {\n message: string;\n}\n\nexport const dollarVariablePatternRule = defineRule<\n PrimaryOption,\n SecondaryOptions\n>([\n '^(-{0,2}?[a-z][a-z0-9]*)(-[a-z0-9]+)*$',\n { message: 'Expected variable to be kebab-case' },\n]);\n\nexport const dollarVariablePatternSCSS = defineRules({\n 'scss/dollar-variable-pattern': dollarVariablePatternRule,\n});\n","import type { Config } from 'stylelint';\nimport { atRuleNoUnknownSCSS } from '~/rules/at-rule-no-unknown';\nimport { dollarVariablePatternSCSS } from '~/rules/dollar-variable-pattern';\n\nexport const configScss = (): Config => ({\n extends: ['stylelint-config-standard-scss'],\n rules: {\n ...atRuleNoUnknownSCSS(),\n ...dollarVariablePatternSCSS,\n },\n});\n","import type { Config } from 'stylelint';\n\nexport const configShared = (): Config => ({\n extends: ['stylelint-config-html'],\n});\n","import { hasSass } from '@culur/utils-packages';\nimport type { Config } from 'stylelint';\n\nexport const configVue = (): Config => ({\n extends: [\n hasSass()\n ? 'stylelint-config-standard-vue/scss'\n : 'stylelint-config-standard-vue',\n ],\n});\n","import defineConfig from './factory';\n\nexport default defineConfig();\n"]}
package/dist/index.js CHANGED
@@ -51,7 +51,7 @@ var declarationBlockNoRedundantLonghandPropertiesRule = defineRule([true, { igno
51
51
  var declarationBlockNoRedundantLonghandProperties = defineRules({
52
52
  "declaration-block-no-redundant-longhand-properties": declarationBlockNoRedundantLonghandPropertiesRule
53
53
  });
54
- var functionNoUnknownRule = () => {
54
+ function functionNoUnknownRule() {
55
55
  const ignoreFunctions = [
56
56
  // https://tailwindcss.com/docs/functions-and-directives#functions
57
57
  ...hasTailwind() ? ["theme", "screen"] : [],
@@ -66,7 +66,7 @@ var functionNoUnknownRule = () => {
66
66
  true,
67
67
  ignoreFunctions.length > 0 ? { ignoreFunctions } : { ignoreFunctions: void 0 }
68
68
  ]);
69
- };
69
+ }
70
70
  var functionNoUnknown = () => defineRules({
71
71
  "function-no-unknown": functionNoUnknownRule()
72
72
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/factory.ts","../src/rules/at-rule-no-unknown.ts","../src/utils/utils.ts","../src/rules/declaration-block-no-redundant-longhand-properties.ts","../src/rules/function-no-unknown.ts","../src/rules/order.ts","../src/configs/css.ts","../src/rules/dollar-variable-pattern.ts","../src/configs/scss.ts","../src/configs/shared.ts","../src/configs/vue.ts","../src/index.ts"],"names":["hasSass","hasVue","hasTailwind"],"mappings":"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","sourcesContent":["import type { Packages } from '@culur/utils-packages';\nimport { hasSass, hasVue, updateDefaultPackages } from '@culur/utils-packages';\nimport type { Config } from 'stylelint';\nimport { configCss } from './configs/css';\nimport { configScss } from './configs/scss';\nimport { configShared } from './configs/shared';\nimport { configVue } from './configs/vue';\nimport { mergeConfigs } from './utils';\n\nexport default function defineConfig(\n options?: Partial<Packages>,\n config?: Config,\n): Config {\n updateDefaultPackages(options);\n\n return mergeConfigs(\n configShared(),\n configCss(),\n hasSass() && configScss(),\n hasVue() && configVue(),\n config,\n );\n}\n","import { hasTailwind } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\n// https://tailwindcss.com/docs/functions-and-directives\nconst directives = [\n 'tailwind',\n 'layer',\n 'apply',\n 'config',\n\n // https://v2.tailwindcss.com/docs/functions-and-directives\n // backwards compatible for v2\n 'variants',\n 'responsive',\n 'screen',\n];\n\nexport const atRuleNoUnknownRule = () =>\n defineRule<boolean, { ignoreAtRules: (string | RegExp)[] }>([\n true,\n { ignoreAtRules: hasTailwind() ? directives : [] },\n ]);\n\nexport const atRuleNoUnknownCSS = () =>\n defineRules({\n 'at-rule-no-unknown': atRuleNoUnknownRule(),\n });\n\nexport const atRuleNoUnknownSCSS = () =>\n defineRules({\n 'at-rule-no-unknown': null,\n 'scss/at-rule-no-unknown': atRuleNoUnknownRule(),\n });\n","import type { Config, ConfigRuleSettings } from 'stylelint';\n\nexport type ConfigRulePrimaryOption =\n | boolean\n | number\n | string\n | Array<boolean | number | string | object>;\nexport type ConfigRuleSecondaryOptions = object;\n\nexport const defineRule = <\n PrimaryOption extends ConfigRulePrimaryOption,\n SecondaryOptions extends ConfigRuleSecondaryOptions,\n>(\n rule: ConfigRuleSettings<PrimaryOption, SecondaryOptions>,\n) => rule;\n\nexport const defineRules = <TRules extends Config['rules']>(rule: TRules) =>\n rule;\n\n// clone function mergeConfigs from stylelint repository\nexport const mergeConfigs = (\n ...configsOrNull: (Config | undefined | null | false)[]\n) => {\n const configs = configsOrNull.filter((c): c is Config => !!c);\n\n return {\n plugins: [...new Set(configs.flatMap(c => c.plugins ?? []))],\n overrides: [...new Set(configs.flatMap(c => c.overrides ?? []))],\n extends: configs\n .flatMap(c => c.extends ?? [])\n .filter((item, index, arr) => arr.lastIndexOf(item) === index),\n rules: configs.reduce(\n (acc, config) => ({ ...acc, ...config.rules }),\n {} as Config['rules'],\n ),\n ...configs.reduce(\n (\n acc,\n { plugins: _p, overrides: _o, extends: _e, rules: _r, ...config },\n ) => ({ ...acc, ...config }),\n {} as Config,\n ),\n };\n};\n","import { defineRule, defineRules } from '~/utils';\n\nexport const declarationBlockNoRedundantLonghandPropertiesRule = defineRule<\n true,\n { ignoreShorthands?: (string | RegExp)[] }\n>([true, { ignoreShorthands: ['grid-template'] }]);\n\nexport const declarationBlockNoRedundantLonghandProperties = defineRules({\n 'declaration-block-no-redundant-longhand-properties':\n declarationBlockNoRedundantLonghandPropertiesRule,\n});\n","import { hasSass, hasTailwind, hasVue } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\nexport const functionNoUnknownRule = () => {\n const ignoreFunctions = [\n // https://tailwindcss.com/docs/functions-and-directives#functions\n ...(hasTailwind() //\n ? ['theme', 'screen']\n : []),\n\n // https://sass-lang.com/documentation/modules/list\n // https://sass-lang.com/documentation/modules/math\n // https://sass-lang.com/documentation/modules/color\n ...(hasSass() //\n ? [/^(list|math|color)\\..+/]\n : []),\n\n // https://vuejs.org/api/sfc-css-features.html#v-bind-in-css\n ...(hasVue() //\n ? ['v-bind']\n : []),\n ];\n\n return defineRule<boolean, { ignoreFunctions?: (string | RegExp)[] }>([\n true,\n ignoreFunctions.length > 0\n ? { ignoreFunctions }\n : { ignoreFunctions: undefined },\n ]);\n};\n\nexport const functionNoUnknown = () =>\n defineRules({\n 'function-no-unknown': functionNoUnknownRule(),\n });\n","import { hasSass, hasTailwind } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\n// https://github.com/hudochenkov/stylelint-order/blob/master/rules/order/README.md#options\n\ntype Keyword =\n | 'custom-properties' /**/ // Custom properties (e.g. --property: 10px;)\n | 'dollar-variables' /***/ // Dollar variables (e.g. $variable)\n | 'at-variables' /*******/ // At-variables (e.g. @variable available in Less syntax)\n | 'declarations' /*******/ // CSS declarations (e.g. display: block)\n | 'rules' /**************/ // Nested rules (e.g. a { span {} })\n | 'at-rules' /***********/ // Nested at-rules (e.g. div { @media () {} })\n | 'less-mixins'; /*******/ // Mixins in Less syntax (e.g. .mixin();)\n\ninterface AtRule {\n type: 'at-rule';\n name?: string;\n parameter?: string | RegExp;\n hasBlock?: boolean;\n}\n\ninterface Rule {\n type: 'rule';\n selector?: string | RegExp;\n name?: string;\n}\n\ntype PrimaryOption = Array<Keyword | AtRule | Rule>;\ninterface SecondaryOptions {\n unspecified?: 'top' | 'bottom' | 'ignore';\n}\n\n/**\n * https://sass-lang.com/documentation/at-rules\n */\nconst atRuleScssImport: PrimaryOption = [\n { type: 'at-rule', name: 'use' },\n { type: 'at-rule', name: 'forward' },\n { type: 'at-rule', name: 'import' },\n];\nconst atRuleScss: PrimaryOption = [\n { type: 'at-rule', name: 'function' },\n { type: 'at-rule', name: 'mixin' },\n { type: 'at-rule', name: 'extend' },\n { type: 'at-rule', name: 'include' },\n { type: 'at-rule', name: 'at-root' },\n];\n\nconst variables: PrimaryOption = [\n 'dollar-variables', // $variable\n 'at-variables', // @variable\n 'custom-properties', // --property: 10px\n];\n\n/**\n * https://tailwindcss.com/docs/functions-and-directives\n */\nconst atRuleTailwind: PrimaryOption = [\n { type: 'at-rule', name: 'tailwind' },\n { type: 'at-rule', name: 'layer' },\n { type: 'at-rule', name: 'apply' },\n { type: 'at-rule', name: 'config' },\n];\n\n/**\n * https://v2.tailwindcss.com/docs/functions-and-directives\n *\n * backwards compatible for v2\n */\nconst atRuleTailwindV2: PrimaryOption = [\n { type: 'at-rule', name: 'variants' },\n { type: 'at-rule', name: 'responsive' },\n { type: 'at-rule', name: 'screen' },\n];\n\n/**\n * Nested rules (e.g. a { span {} })\n */\nconst rules: PrimaryOption = [\n {\n type: 'rule',\n selector: /^&::[\\w-]+/,\n },\n 'rules',\n];\n\nexport const orderRule = () =>\n defineRule<PrimaryOption, SecondaryOptions>([\n [\n ...(hasSass() ? atRuleScssImport : []),\n ...(hasTailwind() ? atRuleTailwind : []),\n ...variables,\n ...(hasSass() ? atRuleScss : []),\n ...(hasTailwind() ? atRuleTailwindV2 : []),\n 'at-rules',\n 'less-mixins',\n 'declarations',\n ...rules,\n ],\n {\n unspecified: 'bottom',\n },\n ]);\n\nexport const order = () =>\n defineRules({\n 'order/order': orderRule(),\n });\n","import type { Config } from 'stylelint';\nimport { atRuleNoUnknownCSS } from '~/rules/at-rule-no-unknown';\nimport { declarationBlockNoRedundantLonghandProperties } from '~/rules/declaration-block-no-redundant-longhand-properties';\nimport { functionNoUnknown } from '~/rules/function-no-unknown';\nimport { order } from '~/rules/order';\n\nexport const configCss = (): Config => ({\n extends: ['stylelint-config-standard', 'stylelint-config-clean-order'],\n plugins: ['stylelint-order', 'stylelint-selector-bem-pattern'],\n rules: {\n ...atRuleNoUnknownCSS(),\n ...declarationBlockNoRedundantLonghandProperties,\n ...functionNoUnknown(),\n ...order(),\n },\n});\n","import { defineRule, defineRules } from '~/utils';\n\ntype PrimaryOption = string;\ninterface SecondaryOptions {\n message: string;\n}\n\nexport const dollarVariablePatternRule = defineRule<\n PrimaryOption,\n SecondaryOptions\n>([\n '^(-{0,2}?[a-z][a-z0-9]*)(-[a-z0-9]+)*$',\n { message: 'Expected variable to be kebab-case' },\n]);\n\nexport const dollarVariablePatternSCSS = defineRules({\n 'scss/dollar-variable-pattern': dollarVariablePatternRule,\n});\n","import type { Config } from 'stylelint';\nimport { atRuleNoUnknownSCSS } from '~/rules/at-rule-no-unknown';\nimport { dollarVariablePatternSCSS } from '~/rules/dollar-variable-pattern';\n\nexport const configScss = (): Config => ({\n extends: ['stylelint-config-standard-scss'],\n rules: {\n ...atRuleNoUnknownSCSS(),\n ...dollarVariablePatternSCSS,\n },\n});\n","import type { Config } from 'stylelint';\n\nexport const configShared = (): Config => ({\n extends: ['stylelint-config-html'],\n});\n","import { hasSass } from '@culur/utils-packages';\nimport type { Config } from 'stylelint';\n\nexport const configVue = (): Config => ({\n extends: [\n hasSass()\n ? 'stylelint-config-standard-vue/scss'\n : 'stylelint-config-standard-vue',\n ],\n});\n","import defineConfig from './factory';\n\nexport default defineConfig();\n"]}
1
+ {"version":3,"sources":["../src/factory.ts","../src/rules/at-rule-no-unknown.ts","../src/utils/utils.ts","../src/rules/declaration-block-no-redundant-longhand-properties.ts","../src/rules/function-no-unknown.ts","../src/rules/order.ts","../src/configs/css.ts","../src/rules/dollar-variable-pattern.ts","../src/configs/scss.ts","../src/configs/shared.ts","../src/configs/vue.ts","../src/index.ts"],"names":["hasSass","hasVue","hasTailwind"],"mappings":";AACA,SAAS,WAAAA,UAAS,UAAAC,SAAQ,6BAA6B;;;ACDvD,SAAS,mBAAmB;;;ACSrB,IAAM,aAAa,CAIxB,SACG;AAEE,IAAM,cAAc,CAAiC,SAC1D;AAGK,IAAM,eAAe,IACvB,kBACA;AACH,QAAM,UAAU,cAAc,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC;AAE5D,SAAO;AAAA,IACL,SAAS,CAAC,GAAG,IAAI,IAAI,QAAQ,QAAQ,OAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;AAAA,IAC3D,WAAW,CAAC,GAAG,IAAI,IAAI,QAAQ,QAAQ,OAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;AAAA,IAC/D,SAAS,QACN,QAAQ,OAAK,EAAE,WAAW,CAAC,CAAC,EAC5B,OAAO,CAAC,MAAM,OAAO,QAAQ,IAAI,YAAY,IAAI,MAAM,KAAK;AAAA,IAC/D,OAAO,QAAQ;AAAA,MACb,CAAC,KAAK,YAAY,EAAE,GAAG,KAAK,GAAG,OAAO,MAAM;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IACA,GAAG,QAAQ;AAAA,MACT,CACE,KACA,EAAE,SAAS,IAAI,WAAW,IAAI,SAAS,IAAI,OAAO,IAAI,GAAG,OAAO,OAC5D,EAAE,GAAG,KAAK,GAAG,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ADvCA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,sBAAsB,MACjC,WAA4D;AAAA,EAC1D;AAAA,EACA,EAAE,eAAe,YAAY,IAAI,aAAa,CAAC,EAAE;AACnD,CAAC;AAEI,IAAM,qBAAqB,MAChC,YAAY;AAAA,EACV,sBAAsB,oBAAoB;AAC5C,CAAC;AAEI,IAAM,sBAAsB,MACjC,YAAY;AAAA,EACV,sBAAsB;AAAA,EACtB,2BAA2B,oBAAoB;AACjD,CAAC;;;AE9BI,IAAM,oDAAoD,WAG/D,CAAC,MAAM,EAAE,kBAAkB,CAAC,eAAe,EAAE,CAAC,CAAC;AAE1C,IAAM,gDAAgD,YAAY;AAAA,EACvE,sDACE;AACJ,CAAC;;;ACVD,SAAS,SAAS,eAAAC,cAAa,cAAc;AAGtC,SAAS,wBAAwB;AACtC,QAAM,kBAAkB;AAAA;AAAA,IAEtB,GAAIA,aAAY,IACZ,CAAC,SAAS,QAAQ,IAClB,CAAC;AAAA;AAAA;AAAA;AAAA,IAKL,GAAI,QAAQ,IACR,CAAC,wBAAwB,IACzB,CAAC;AAAA;AAAA,IAGL,GAAI,OAAO,IACP,CAAC,QAAQ,IACT,CAAC;AAAA,EACP;AAEA,SAAO,WAA+D;AAAA,IACpE;AAAA,IACA,gBAAgB,SAAS,IACrB,EAAE,gBAAgB,IAClB,EAAE,iBAAiB,OAAU;AAAA,EACnC,CAAC;AACH;AAEO,IAAM,oBAAoB,MAC/B,YAAY;AAAA,EACV,uBAAuB,sBAAsB;AAC/C,CAAC;;;AClCH,SAAS,WAAAF,UAAS,eAAAE,oBAAmB;AAmCrC,IAAM,mBAAkC;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,MAAM;AAAA,EAC/B,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EACnC,EAAE,MAAM,WAAW,MAAM,SAAS;AACpC;AACA,IAAM,aAA4B;AAAA,EAChC,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,QAAQ;AAAA,EACjC,EAAE,MAAM,WAAW,MAAM,SAAS;AAAA,EAClC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EACnC,EAAE,MAAM,WAAW,MAAM,UAAU;AACrC;AAEA,IAAM,YAA2B;AAAA,EAC/B;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAKA,IAAM,iBAAgC;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,QAAQ;AAAA,EACjC,EAAE,MAAM,WAAW,MAAM,QAAQ;AAAA,EACjC,EAAE,MAAM,WAAW,MAAM,SAAS;AACpC;AAOA,IAAM,mBAAkC;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,aAAa;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,SAAS;AACpC;AAKA,IAAM,QAAuB;AAAA,EAC3B;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AACF;AAEO,IAAM,YAAY,MACvB,WAA4C;AAAA,EAC1C;AAAA,IACE,GAAIF,SAAQ,IAAI,mBAAmB,CAAC;AAAA,IACpC,GAAIE,aAAY,IAAI,iBAAiB,CAAC;AAAA,IACtC,GAAG;AAAA,IACH,GAAIF,SAAQ,IAAI,aAAa,CAAC;AAAA,IAC9B,GAAIE,aAAY,IAAI,mBAAmB,CAAC;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AAAA,EACA;AAAA,IACE,aAAa;AAAA,EACf;AACF,CAAC;AAEI,IAAM,QAAQ,MACnB,YAAY;AAAA,EACV,eAAe,UAAU;AAC3B,CAAC;;;ACrGI,IAAM,YAAY,OAAe;AAAA,EACtC,SAAS,CAAC,6BAA6B,8BAA8B;AAAA,EACrE,SAAS,CAAC,mBAAmB,gCAAgC;AAAA,EAC7D,OAAO;AAAA,IACL,GAAG,mBAAmB;AAAA,IACtB,GAAG;AAAA,IACH,GAAG,kBAAkB;AAAA,IACrB,GAAG,MAAM;AAAA,EACX;AACF;;;ACRO,IAAM,4BAA4B,WAGvC;AAAA,EACA;AAAA,EACA,EAAE,SAAS,qCAAqC;AAClD,CAAC;AAEM,IAAM,4BAA4B,YAAY;AAAA,EACnD,gCAAgC;AAClC,CAAC;;;ACbM,IAAM,aAAa,OAAe;AAAA,EACvC,SAAS,CAAC,gCAAgC;AAAA,EAC1C,OAAO;AAAA,IACL,GAAG,oBAAoB;AAAA,IACvB,GAAG;AAAA,EACL;AACF;;;ACRO,IAAM,eAAe,OAAe;AAAA,EACzC,SAAS,CAAC,uBAAuB;AACnC;;;ACJA,SAAS,WAAAF,gBAAe;AAGjB,IAAM,YAAY,OAAe;AAAA,EACtC,SAAS;AAAA,IACPA,SAAQ,IACJ,uCACA;AAAA,EACN;AACF;;;AVAe,SAAR,aACL,SACA,QACQ;AACR,wBAAsB,OAAO;AAE7B,SAAO;AAAA,IACL,aAAa;AAAA,IACb,UAAU;AAAA,IACVA,SAAQ,KAAK,WAAW;AAAA,IACxBC,QAAO,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AACF;;;AWpBA,IAAO,cAAQ,aAAa","sourcesContent":["import type { Packages } from '@culur/utils-packages';\nimport { hasSass, hasVue, updateDefaultPackages } from '@culur/utils-packages';\nimport type { Config } from 'stylelint';\nimport { configCss } from './configs/css';\nimport { configScss } from './configs/scss';\nimport { configShared } from './configs/shared';\nimport { configVue } from './configs/vue';\nimport { mergeConfigs } from './utils';\n\nexport default function defineConfig(\n options?: Partial<Packages>,\n config?: Config,\n): Config {\n updateDefaultPackages(options);\n\n return mergeConfigs(\n configShared(),\n configCss(),\n hasSass() && configScss(),\n hasVue() && configVue(),\n config,\n );\n}\n","import { hasTailwind } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\n// https://tailwindcss.com/docs/functions-and-directives\nconst directives = [\n 'tailwind',\n 'layer',\n 'apply',\n 'config',\n\n // https://v2.tailwindcss.com/docs/functions-and-directives\n // backwards compatible for v2\n 'variants',\n 'responsive',\n 'screen',\n];\n\nexport const atRuleNoUnknownRule = () =>\n defineRule<boolean, { ignoreAtRules: (string | RegExp)[] }>([\n true,\n { ignoreAtRules: hasTailwind() ? directives : [] },\n ]);\n\nexport const atRuleNoUnknownCSS = () =>\n defineRules({\n 'at-rule-no-unknown': atRuleNoUnknownRule(),\n });\n\nexport const atRuleNoUnknownSCSS = () =>\n defineRules({\n 'at-rule-no-unknown': null,\n 'scss/at-rule-no-unknown': atRuleNoUnknownRule(),\n });\n","import type { Config, ConfigRuleSettings } from 'stylelint';\n\nexport type ConfigRulePrimaryOption =\n | boolean\n | number\n | string\n | Array<boolean | number | string | object>;\nexport type ConfigRuleSecondaryOptions = object;\n\nexport const defineRule = <\n PrimaryOption extends ConfigRulePrimaryOption,\n SecondaryOptions extends ConfigRuleSecondaryOptions,\n>(\n rule: ConfigRuleSettings<PrimaryOption, SecondaryOptions>,\n) => rule;\n\nexport const defineRules = <TRules extends Config['rules']>(rule: TRules) =>\n rule;\n\n// clone function mergeConfigs from stylelint repository\nexport const mergeConfigs = (\n ...configsOrNull: (Config | undefined | null | false)[]\n) => {\n const configs = configsOrNull.filter((c): c is Config => !!c);\n\n return {\n plugins: [...new Set(configs.flatMap(c => c.plugins ?? []))],\n overrides: [...new Set(configs.flatMap(c => c.overrides ?? []))],\n extends: configs\n .flatMap(c => c.extends ?? [])\n .filter((item, index, arr) => arr.lastIndexOf(item) === index),\n rules: configs.reduce(\n (acc, config) => ({ ...acc, ...config.rules }),\n {} as Config['rules'],\n ),\n ...configs.reduce(\n (\n acc,\n { plugins: _p, overrides: _o, extends: _e, rules: _r, ...config },\n ) => ({ ...acc, ...config }),\n {} as Config,\n ),\n };\n};\n","import { defineRule, defineRules } from '~/utils';\n\nexport const declarationBlockNoRedundantLonghandPropertiesRule = defineRule<\n true,\n { ignoreShorthands?: (string | RegExp)[] }\n>([true, { ignoreShorthands: ['grid-template'] }]);\n\nexport const declarationBlockNoRedundantLonghandProperties = defineRules({\n 'declaration-block-no-redundant-longhand-properties':\n declarationBlockNoRedundantLonghandPropertiesRule,\n});\n","import { hasSass, hasTailwind, hasVue } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\nexport function functionNoUnknownRule() {\n const ignoreFunctions = [\n // https://tailwindcss.com/docs/functions-and-directives#functions\n ...(hasTailwind() //\n ? ['theme', 'screen']\n : []),\n\n // https://sass-lang.com/documentation/modules/list\n // https://sass-lang.com/documentation/modules/math\n // https://sass-lang.com/documentation/modules/color\n ...(hasSass() //\n ? [/^(list|math|color)\\..+/]\n : []),\n\n // https://vuejs.org/api/sfc-css-features.html#v-bind-in-css\n ...(hasVue() //\n ? ['v-bind']\n : []),\n ];\n\n return defineRule<boolean, { ignoreFunctions?: (string | RegExp)[] }>([\n true,\n ignoreFunctions.length > 0\n ? { ignoreFunctions }\n : { ignoreFunctions: undefined },\n ]);\n}\n\nexport const functionNoUnknown = () =>\n defineRules({\n 'function-no-unknown': functionNoUnknownRule(),\n });\n","import { hasSass, hasTailwind } from '@culur/utils-packages';\nimport { defineRule, defineRules } from '~/utils';\n\n// https://github.com/hudochenkov/stylelint-order/blob/master/rules/order/README.md#options\n\ntype Keyword =\n | 'custom-properties' /**/ // Custom properties (e.g. --property: 10px;)\n | 'dollar-variables' /***/ // Dollar variables (e.g. $variable)\n | 'at-variables' /*******/ // At-variables (e.g. @variable available in Less syntax)\n | 'declarations' /*******/ // CSS declarations (e.g. display: block)\n | 'rules' /**************/ // Nested rules (e.g. a { span {} })\n | 'at-rules' /***********/ // Nested at-rules (e.g. div { @media () {} })\n | 'less-mixins'; /*******/ // Mixins in Less syntax (e.g. .mixin();)\n\ninterface AtRule {\n type: 'at-rule';\n name?: string;\n parameter?: string | RegExp;\n hasBlock?: boolean;\n}\n\ninterface Rule {\n type: 'rule';\n selector?: string | RegExp;\n name?: string;\n}\n\ntype PrimaryOption = Array<Keyword | AtRule | Rule>;\ninterface SecondaryOptions {\n unspecified?: 'top' | 'bottom' | 'ignore';\n}\n\n/**\n * https://sass-lang.com/documentation/at-rules\n */\nconst atRuleScssImport: PrimaryOption = [\n { type: 'at-rule', name: 'use' },\n { type: 'at-rule', name: 'forward' },\n { type: 'at-rule', name: 'import' },\n];\nconst atRuleScss: PrimaryOption = [\n { type: 'at-rule', name: 'function' },\n { type: 'at-rule', name: 'mixin' },\n { type: 'at-rule', name: 'extend' },\n { type: 'at-rule', name: 'include' },\n { type: 'at-rule', name: 'at-root' },\n];\n\nconst variables: PrimaryOption = [\n 'dollar-variables', // $variable\n 'at-variables', // @variable\n 'custom-properties', // --property: 10px\n];\n\n/**\n * https://tailwindcss.com/docs/functions-and-directives\n */\nconst atRuleTailwind: PrimaryOption = [\n { type: 'at-rule', name: 'tailwind' },\n { type: 'at-rule', name: 'layer' },\n { type: 'at-rule', name: 'apply' },\n { type: 'at-rule', name: 'config' },\n];\n\n/**\n * https://v2.tailwindcss.com/docs/functions-and-directives\n *\n * backwards compatible for v2\n */\nconst atRuleTailwindV2: PrimaryOption = [\n { type: 'at-rule', name: 'variants' },\n { type: 'at-rule', name: 'responsive' },\n { type: 'at-rule', name: 'screen' },\n];\n\n/**\n * Nested rules (e.g. a { span {} })\n */\nconst rules: PrimaryOption = [\n {\n type: 'rule',\n selector: /^&::[\\w-]+/,\n },\n 'rules',\n];\n\nexport const orderRule = () =>\n defineRule<PrimaryOption, SecondaryOptions>([\n [\n ...(hasSass() ? atRuleScssImport : []),\n ...(hasTailwind() ? atRuleTailwind : []),\n ...variables,\n ...(hasSass() ? atRuleScss : []),\n ...(hasTailwind() ? atRuleTailwindV2 : []),\n 'at-rules',\n 'less-mixins',\n 'declarations',\n ...rules,\n ],\n {\n unspecified: 'bottom',\n },\n ]);\n\nexport const order = () =>\n defineRules({\n 'order/order': orderRule(),\n });\n","import type { Config } from 'stylelint';\nimport { atRuleNoUnknownCSS } from '~/rules/at-rule-no-unknown';\nimport { declarationBlockNoRedundantLonghandProperties } from '~/rules/declaration-block-no-redundant-longhand-properties';\nimport { functionNoUnknown } from '~/rules/function-no-unknown';\nimport { order } from '~/rules/order';\n\nexport const configCss = (): Config => ({\n extends: ['stylelint-config-standard', 'stylelint-config-clean-order'],\n plugins: ['stylelint-order', 'stylelint-selector-bem-pattern'],\n rules: {\n ...atRuleNoUnknownCSS(),\n ...declarationBlockNoRedundantLonghandProperties,\n ...functionNoUnknown(),\n ...order(),\n },\n});\n","import { defineRule, defineRules } from '~/utils';\n\ntype PrimaryOption = string;\ninterface SecondaryOptions {\n message: string;\n}\n\nexport const dollarVariablePatternRule = defineRule<\n PrimaryOption,\n SecondaryOptions\n>([\n '^(-{0,2}?[a-z][a-z0-9]*)(-[a-z0-9]+)*$',\n { message: 'Expected variable to be kebab-case' },\n]);\n\nexport const dollarVariablePatternSCSS = defineRules({\n 'scss/dollar-variable-pattern': dollarVariablePatternRule,\n});\n","import type { Config } from 'stylelint';\nimport { atRuleNoUnknownSCSS } from '~/rules/at-rule-no-unknown';\nimport { dollarVariablePatternSCSS } from '~/rules/dollar-variable-pattern';\n\nexport const configScss = (): Config => ({\n extends: ['stylelint-config-standard-scss'],\n rules: {\n ...atRuleNoUnknownSCSS(),\n ...dollarVariablePatternSCSS,\n },\n});\n","import type { Config } from 'stylelint';\n\nexport const configShared = (): Config => ({\n extends: ['stylelint-config-html'],\n});\n","import { hasSass } from '@culur/utils-packages';\nimport type { Config } from 'stylelint';\n\nexport const configVue = (): Config => ({\n extends: [\n hasSass()\n ? 'stylelint-config-standard-vue/scss'\n : 'stylelint-config-standard-vue',\n ],\n});\n","import defineConfig from './factory';\n\nexport default defineConfig();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@culur/config-stylelint",
3
- "version": "0.0.0-dev-20240527064403",
3
+ "version": "1.0.1",
4
4
  "description": "Culur's stylelint configuration",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -66,21 +66,21 @@
66
66
  "node": ">=20"
67
67
  },
68
68
  "dependencies": {
69
- "@culur/utils-packages": "workspace:*",
70
- "stylelint-config-clean-order": "^5.4.2",
69
+ "@culur/utils-packages": "1.0.1",
70
+ "stylelint-config-clean-order": "^6.0.0",
71
71
  "stylelint-config-html": "^1.1.0",
72
72
  "stylelint-config-standard": "^36.0.0",
73
73
  "stylelint-config-standard-scss": "^13.1.0",
74
74
  "stylelint-config-standard-vue": "^1.0.0",
75
75
  "stylelint-order": "^6.0.4",
76
- "stylelint-scss": "^6.3.0",
76
+ "stylelint-scss": "^6.3.1",
77
77
  "stylelint-selector-bem-pattern": "^4.0.0"
78
78
  },
79
79
  "devDependencies": {
80
- "@culur/config-tsup": "workspace:*",
81
- "@culur/config-typescript": "workspace:*",
82
- "@culur/config-vite": "workspace:*",
83
- "@types/node": "^20.12.12",
80
+ "@culur/config-tsup": "1.0.1",
81
+ "@culur/config-typescript": "1.0.1",
82
+ "@culur/config-vite": "1.0.1",
83
+ "@types/node": "^20.14.2",
84
84
  "@vitest/coverage-v8": "^1.6.0",
85
85
  "@vitest/ui": "^1.6.0",
86
86
  "dedent": "^1.5.3",
@@ -89,8 +89,8 @@
89
89
  "postcss-sass": "^0.5.0",
90
90
  "postcss-scss": "^4.0.9",
91
91
  "rimraf": "^5.0.7",
92
- "stylelint": "^16.6.0",
93
- "tsup": "^8.0.2",
92
+ "stylelint": "^16.6.1",
93
+ "tsup": "^8.1.0",
94
94
  "typescript": "^5.4.5",
95
95
  "vitest": "^1.6.0"
96
96
  },
@@ -0,0 +1,61 @@
1
+ import { resolve } from 'node:path';
2
+ import type { Awaitable } from 'vitest';
3
+ import { afterEach, describe, expect, it, vi } from 'vitest';
4
+ import type { Config } from 'stylelint';
5
+ import stylelint from 'stylelint';
6
+ import type { UtilsPackages } from './mock';
7
+ import { spyOnUtilsPackages } from './spy-on-utils-packages';
8
+
9
+ type LintAndFixCase = {
10
+ code: string;
11
+ fixedCode?: string;
12
+ isError?: boolean;
13
+ ext?: 'css' | 'scss' | 'vue';
14
+ debug?: boolean;
15
+ } & UtilsPackages;
16
+
17
+ export function describeLintAndFix(
18
+ utilsPackages: typeof import('@culur/utils-packages'),
19
+ getConfig: Config | (() => Awaitable<Config>),
20
+ testCases: LintAndFixCase[],
21
+ ) {
22
+ const itName = [
23
+ ...(['hasTailwind', 'hasSass', 'hasVue', 'isError'] as const) //
24
+ .filter(field => testCases.some(t => typeof t[field] === 'boolean')),
25
+ ...(['code', 'fixedCode'] as const) //
26
+ .filter(field => testCases.some(t => typeof t[field] === 'string')),
27
+ ]
28
+ .map(field => `${field} = $${field}`)
29
+ .join(', ');
30
+
31
+ describe('test lint and fix', () => {
32
+ afterEach(() => {
33
+ vi.restoreAllMocks();
34
+ });
35
+
36
+ it.each(testCases)(itName, async testCase => {
37
+ spyOnUtilsPackages(utilsPackages, testCase);
38
+
39
+ const config =
40
+ typeof getConfig === 'function' ? await getConfig() : getConfig;
41
+
42
+ const result = await stylelint.lint({
43
+ code: testCase.code,
44
+ codeFilename: `filename.${testCase.ext ?? 'css'}`,
45
+ config,
46
+ fix: 'fixedCode' in testCase,
47
+ configBasedir: resolve(__dirname, '..'),
48
+ });
49
+
50
+ if (testCase.debug) {
51
+ /* eslint-disable no-console */
52
+ console.log(JSON.stringify(config, undefined, 2));
53
+ console.log(result.results.flatMap(r => r.warnings));
54
+ console.log(result.code);
55
+ /* eslint-enable no-console */
56
+ }
57
+ if ('fixedCode' in testCase) expect(result.code).toBe(testCase.fixedCode);
58
+ if ('isError' in testCase) expect(result.errored).toBe(testCase.isError);
59
+ });
60
+ });
61
+ }
@@ -0,0 +1,73 @@
1
+ import type { Awaitable } from 'vitest';
2
+ import { afterEach, describe, it, vi } from 'vitest';
3
+ import type { Config, ConfigRuleSettings } from 'stylelint';
4
+ import type { UtilsPackages } from './mock';
5
+ import { hasValues, spyOnUtilsPackages } from './spy-on-utils-packages';
6
+ import type {
7
+ ConfigRulePrimaryOption,
8
+ ConfigRuleSecondaryOptions,
9
+ } from '~/utils';
10
+
11
+ type Fn<
12
+ TTestCase extends UtilsPackages & object,
13
+ TRuleOrConfig extends
14
+ | ConfigRuleSettings<ConfigRulePrimaryOption, ConfigRuleSecondaryOptions>
15
+ | Config,
16
+ > = (
17
+ ruleOrConfig: TRuleOrConfig,
18
+ options: UtilsPackages & TTestCase,
19
+ ) => Promise<void> | void;
20
+
21
+ export function describeRuleOrConfigFactory<
22
+ TBaseRuleOrConfig extends
23
+ | ConfigRuleSettings<ConfigRulePrimaryOption, ConfigRuleSecondaryOptions>
24
+ | Config,
25
+ >(describeName: string) {
26
+ function describeRuleOrConfig<
27
+ TRuleOrConfig extends TBaseRuleOrConfig,
28
+ TTestCase extends UtilsPackages & object,
29
+ >(
30
+ utilsPackages: typeof import('@culur/utils-packages'),
31
+ getRuleOrConfig: (() => Awaitable<TRuleOrConfig>) | TRuleOrConfig,
32
+ ...args:
33
+ | [testCases: TTestCase[], fn: Fn<TTestCase, TRuleOrConfig>]
34
+ | [fn: Fn<TTestCase, TRuleOrConfig>]
35
+ ) {
36
+ const [testCases, fn] =
37
+ args.length === 2 //
38
+ ? [...args]
39
+ : [[{} as UtilsPackages & TTestCase], ...args];
40
+
41
+ const itName =
42
+ hasValues
43
+ .filter(field => testCases.some(t => typeof t[field] === 'boolean'))
44
+ .map(field => `${field} = $${field}`)
45
+ .join(', ') || 'default';
46
+
47
+ describe(describeName, () => {
48
+ afterEach(() => {
49
+ vi.restoreAllMocks();
50
+ });
51
+
52
+ it.each(testCases)(itName, async testCase => {
53
+ spyOnUtilsPackages(utilsPackages, testCase);
54
+
55
+ const ruleOrConfig =
56
+ typeof getRuleOrConfig === 'function'
57
+ ? await getRuleOrConfig()
58
+ : getRuleOrConfig;
59
+
60
+ fn(ruleOrConfig, testCase);
61
+ });
62
+ });
63
+ }
64
+
65
+ return describeRuleOrConfig;
66
+ }
67
+ export const describeConfig = describeRuleOrConfigFactory<Config>('config');
68
+ export const describeRule = describeRuleOrConfigFactory<
69
+ ConfigRuleSettings<
70
+ ConfigRulePrimaryOption, //
71
+ ConfigRuleSecondaryOptions
72
+ >
73
+ >('rule');
@@ -1,5 +1,8 @@
1
1
  export * from './dedent';
2
- export * from './mock';
2
+ export * from './describe-lint-and-fix';
3
+ export * from './describe-rule-or-config';
4
+ // export * from './mock';
5
+ export * from './spy-on-utils-packages';
3
6
  export * from './syntax';
4
- export * from './test-rule-or-config-value';
5
- export * from './test-lint-and-fix';
7
+ // export * from './test-lint-and-fix';
8
+ // export * from './test-rule-or-config-value';
@@ -0,0 +1,14 @@
1
+ import { vi } from 'vitest';
2
+ import type { UtilsPackages } from './mock';
3
+
4
+ export const hasValues = ['hasTailwind', 'hasSass', 'hasVue'] as const;
5
+
6
+ export function spyOnUtilsPackages(
7
+ utilsPackages: typeof import('@culur/utils-packages'),
8
+ options: UtilsPackages,
9
+ ) {
10
+ for (const hasValue of hasValues) {
11
+ const value = options[hasValue] ?? false;
12
+ vi.spyOn(utilsPackages, hasValue).mockReturnValue(value);
13
+ }
14
+ }
@@ -1,10 +1,9 @@
1
- import { assert, describe } from 'vitest';
1
+ import { assert } from 'vitest';
2
+ import * as utilsPackages from '@culur/utils-packages';
2
3
  import { configCss } from './css';
3
- import { testConfigValue } from '~/__tests__';
4
+ import { describeConfig } from '~/__tests__';
4
5
 
5
- describe('css config', () => {
6
- testConfigValue(configCss, config => {
7
- assert(Array.isArray(config.extends));
8
- assert(Array.isArray(config.plugins));
9
- });
6
+ describeConfig(utilsPackages, configCss, config => {
7
+ assert(Array.isArray(config.extends));
8
+ assert(Array.isArray(config.plugins));
10
9
  });
@@ -1,9 +1,8 @@
1
- import { assert, describe } from 'vitest';
1
+ import * as utilsPackages from '@culur/utils-packages';
2
+ import { assert } from 'vitest';
2
3
  import { configScss } from './scss';
3
- import { testConfigValue } from '~/__tests__';
4
+ import { describeConfig } from '~/__tests__';
4
5
 
5
- describe('scss config', () => {
6
- testConfigValue(configScss, config => {
7
- assert(Array.isArray(config.extends));
8
- });
6
+ describeConfig(utilsPackages, configScss, config => {
7
+ assert(Array.isArray(config.extends));
9
8
  });
@@ -1,9 +1,8 @@
1
- import { assert, describe } from 'vitest';
1
+ import { assert } from 'vitest';
2
+ import * as utilsPackages from '@culur/utils-packages';
2
3
  import { configShared } from './shared';
3
- import { testConfigValue } from '~/__tests__';
4
+ import { describeConfig } from '~/__tests__';
4
5
 
5
- describe('shared config', () => {
6
- testConfigValue(configShared, config => {
7
- assert(Array.isArray(config.extends));
8
- });
6
+ describeConfig(utilsPackages, configShared, config => {
7
+ assert(Array.isArray(config.extends));
9
8
  });
@@ -1,18 +1,19 @@
1
- import { assert, describe } from 'vitest';
1
+ import { assert } from 'vitest';
2
+ import * as utilsPackages from '@culur/utils-packages';
2
3
  import { configVue } from './vue';
3
- import { testConfigValue } from '~/__tests__';
4
+ import { describeConfig } from '~/__tests__';
4
5
 
5
- describe('vue config', () => {
6
- testConfigValue(
7
- [{ hasSass: true }, { hasSass: false }],
8
- configVue,
9
- (config, options) => {
10
- assert(Array.isArray(config.extends));
11
- config.extends.includes(
12
- options.hasSass
13
- ? 'stylelint-config-standard-vue/scss'
14
- : 'stylelint-config-standard-vue',
15
- );
16
- },
17
- );
18
- });
6
+ describeConfig(
7
+ utilsPackages,
8
+ configVue,
9
+ [{ hasSass: true }, { hasSass: false }],
10
+ (config, testCase) => {
11
+ assert(Array.isArray(config.extends));
12
+ assert(Array.isArray(config.extends));
13
+ config.extends.includes(
14
+ testCase.hasSass
15
+ ? 'stylelint-config-standard-vue/scss'
16
+ : 'stylelint-config-standard-vue',
17
+ );
18
+ },
19
+ );
@@ -1,7 +1,8 @@
1
- import { css, testLintAndFix } from './__tests__';
1
+ import * as utilsPackages from '@culur/utils-packages';
2
+ import { css, describeLintAndFix } from './__tests__';
2
3
  import defineConfig from './factory';
3
4
 
4
- testLintAndFix(defineConfig, [
5
+ describeLintAndFix(utilsPackages, defineConfig, [
5
6
  {
6
7
  code: css`
7
8
  a {
@@ -1,43 +1,46 @@
1
+ import * as utilsPackages from '@culur/utils-packages';
1
2
  import { assert, expect } from 'vitest';
2
- import { syntaxScss, testLintAndFix } from '~/__tests__';
3
- import { testRuleValue } from '~/__tests__/test-rule-or-config-value';
3
+ import {
4
+ atRuleNoUnknownCSS,
5
+ atRuleNoUnknownRule,
6
+ atRuleNoUnknownSCSS,
7
+ } from './at-rule-no-unknown';
8
+ import { describeLintAndFix, describeRule, syntaxScss } from '~/__tests__';
4
9
 
5
- testRuleValue(
10
+ describeRule(
11
+ utilsPackages,
12
+ atRuleNoUnknownRule,
6
13
  [
7
14
  { hasTailwind: false, length: 0 },
8
15
  { hasTailwind: true, length: 7 },
9
16
  ],
10
- async () => {
11
- const module = await import('./at-rule-no-unknown');
12
- return module.atRuleNoUnknownRule();
13
- },
14
- (rule, options) => {
17
+ (rule, testCase) => {
15
18
  assert(Array.isArray(rule));
16
19
  assert(typeof rule[1] === 'object');
17
- expect(rule[1].ignoreAtRules).toHaveLength(options.length);
20
+ expect(rule[1].ignoreAtRules).toHaveLength(testCase.length);
18
21
  },
19
22
  );
20
23
 
21
- testLintAndFix(async () => {
22
- const module = await import('./at-rule-no-unknown');
23
- return {
24
- rules: module.atRuleNoUnknownCSS(),
25
- };
26
- }, [
27
- { hasTailwind: false, code: '@unknown {}', isError: true },
28
- { hasTailwind: false, code: '@media {}', isError: false },
29
- { hasTailwind: true, code: '@tailwind {}', isError: false },
30
- ]);
24
+ describeLintAndFix(
25
+ utilsPackages, //
26
+ () => ({ rules: atRuleNoUnknownCSS() }),
27
+ [
28
+ { hasTailwind: false, code: '@unknown {}', isError: true },
29
+ { hasTailwind: false, code: '@media {}', isError: false },
30
+ { hasTailwind: true, code: '@tailwind {}', isError: false },
31
+ ],
32
+ );
31
33
 
32
- testLintAndFix(async () => {
33
- const module = await import('./at-rule-no-unknown');
34
- return {
34
+ describeLintAndFix(
35
+ utilsPackages,
36
+ () => ({
35
37
  plugins: ['stylelint-scss'],
36
- rules: module.atRuleNoUnknownSCSS(),
38
+ rules: atRuleNoUnknownSCSS(),
37
39
  overrides: [syntaxScss],
38
- };
39
- }, [
40
- { ext: 'scss', hasTailwind: false, code: '@unknown {}', isError: true },
41
- { ext: 'scss', hasTailwind: false, code: '@media {}', isError: false },
42
- { ext: 'scss', hasTailwind: true, code: '@tailwind {}', isError: false },
43
- ]);
40
+ }),
41
+ [
42
+ { ext: 'scss', hasTailwind: false, code: '@unknown {}', isError: true },
43
+ { ext: 'scss', hasTailwind: false, code: '@media {}', isError: false },
44
+ { ext: 'scss', hasTailwind: true, code: '@tailwind {}', isError: false },
45
+ ],
46
+ );
@@ -1,12 +1,14 @@
1
+ import * as utilsPackages from '@culur/utils-packages';
1
2
  import { assert, expect } from 'vitest';
2
3
  import {
3
4
  declarationBlockNoRedundantLonghandProperties,
4
5
  declarationBlockNoRedundantLonghandPropertiesRule,
5
6
  } from './declaration-block-no-redundant-longhand-properties';
6
- import { css, testLintAndFix, testRuleValue } from '~/__tests__';
7
+ import { css, describeLintAndFix, describeRule } from '~/__tests__';
7
8
 
8
- testRuleValue(
9
- declarationBlockNoRedundantLonghandPropertiesRule, //
9
+ describeRule(
10
+ utilsPackages,
11
+ declarationBlockNoRedundantLonghandPropertiesRule,
10
12
  rule => {
11
13
  assert(Array.isArray(rule));
12
14
  assert(typeof rule[1] === 'object');
@@ -14,7 +16,8 @@ testRuleValue(
14
16
  },
15
17
  );
16
18
 
17
- testLintAndFix(
19
+ describeLintAndFix(
20
+ utilsPackages,
18
21
  {
19
22
  rules: declarationBlockNoRedundantLonghandProperties,
20
23
  },
@@ -1,24 +1,23 @@
1
1
  import { assert, expectTypeOf } from 'vitest';
2
+ import * as utilsPackages from '@culur/utils-packages';
2
3
  import {
3
4
  dollarVariablePatternRule,
4
5
  dollarVariablePatternSCSS,
5
6
  } from './dollar-variable-pattern';
6
- import { scss, testLintAndFix, testRuleValue } from '~/__tests__';
7
+ import { describeLintAndFix, describeRule, scss } from '~/__tests__';
7
8
 
8
- testRuleValue(
9
- () => dollarVariablePatternRule,
10
- rule => {
11
- assert(Array.isArray(rule));
12
- assert(typeof rule[1] === 'object');
13
- expectTypeOf(rule[1].message).toBeString();
14
- },
15
- );
9
+ describeRule(utilsPackages, dollarVariablePatternRule, rule => {
10
+ assert(Array.isArray(rule));
11
+ assert(typeof rule[1] === 'object');
12
+ expectTypeOf(rule[1].message).toBeString();
13
+ });
16
14
 
17
- testLintAndFix(
15
+ describeLintAndFix(
16
+ utilsPackages,
18
17
  {
19
18
  extends: ['stylelint-config-standard-scss'],
20
19
  rules: dollarVariablePatternSCSS,
21
- }, //
20
+ },
22
21
  [
23
22
  { isError: false, code: scss`a { $kebab-case: 123; }` },
24
23
  { isError: true, code: scss`a { $snake_case: 123; }` },
@@ -1,16 +1,19 @@
1
1
  import { assert, expect } from 'vitest';
2
- import { testLintAndFix, testRuleValue } from '~/__tests__';
2
+ import * as utilsPackages from '@culur/utils-packages';
3
+ import {
4
+ functionNoUnknown,
5
+ functionNoUnknownRule,
6
+ } from './function-no-unknown';
7
+ import { describeLintAndFix, describeRule } from '~/__tests__';
3
8
 
4
- testRuleValue(
9
+ describeRule(
10
+ utilsPackages,
11
+ functionNoUnknownRule,
5
12
  [
6
13
  { hasTailwind: true, hasSass: false, hasVue: false, length: 2 },
7
14
  { hasTailwind: false, hasSass: true, hasVue: false, length: 1 },
8
15
  { hasTailwind: false, hasSass: false, hasVue: true, length: 1 },
9
16
  ],
10
- async () => {
11
- const module = await import('./function-no-unknown');
12
- return module.functionNoUnknownRule();
13
- },
14
17
  (rule, options) => {
15
18
  assert(Array.isArray(rule));
16
19
  assert(typeof rule[1] === 'object');
@@ -18,22 +21,23 @@ testRuleValue(
18
21
  },
19
22
  );
20
23
 
21
- testLintAndFix(async () => {
22
- const module = await import('./function-no-unknown');
23
- return { rules: module.functionNoUnknown() };
24
- }, [
25
- {
26
- isError: true,
27
- code: 'a { color: unknown(1); }',
28
- },
29
- {
30
- hasTailwind: true,
31
- isError: false,
32
- code: 'a { color: theme(colors.blue.500); }',
33
- },
34
- {
35
- hasVue: true,
36
- isError: false,
37
- code: 'a { color: v-bind(colors); }',
38
- },
39
- ]);
24
+ describeLintAndFix(
25
+ utilsPackages, //
26
+ () => ({ rules: functionNoUnknown() }),
27
+ [
28
+ {
29
+ isError: true,
30
+ code: 'a { color: unknown(1); }',
31
+ },
32
+ {
33
+ hasTailwind: true,
34
+ isError: false,
35
+ code: 'a { color: theme(colors.blue.500); }',
36
+ },
37
+ {
38
+ hasVue: true,
39
+ isError: false,
40
+ code: 'a { color: v-bind(colors); }',
41
+ },
42
+ ],
43
+ );
@@ -1,7 +1,7 @@
1
1
  import { hasSass, hasTailwind, hasVue } from '@culur/utils-packages';
2
2
  import { defineRule, defineRules } from '~/utils';
3
3
 
4
- export const functionNoUnknownRule = () => {
4
+ export function functionNoUnknownRule() {
5
5
  const ignoreFunctions = [
6
6
  // https://tailwindcss.com/docs/functions-and-directives#functions
7
7
  ...(hasTailwind() //
@@ -27,7 +27,7 @@ export const functionNoUnknownRule = () => {
27
27
  ? { ignoreFunctions }
28
28
  : { ignoreFunctions: undefined },
29
29
  ]);
30
- };
30
+ }
31
31
 
32
32
  export const functionNoUnknown = () =>
33
33
  defineRules({
@@ -1,46 +1,47 @@
1
+ import * as utilsPackages from '@culur/utils-packages';
1
2
  import { assert, expect } from 'vitest';
2
- import { scss, testLintAndFix, testRuleValue } from '~/__tests__';
3
+ import { order, orderRule } from './order';
4
+ import { describeLintAndFix, describeRule, scss } from '~/__tests__';
3
5
 
4
- testRuleValue(
6
+ describeRule(
7
+ utilsPackages,
8
+ orderRule,
5
9
  [
6
10
  { hasTailwind: false, hasSass: false, length: 8 },
7
11
  { hasTailwind: true, hasSass: false, length: 15 },
8
12
  { hasTailwind: false, hasSass: true, length: 16 },
9
13
  { hasTailwind: true, hasSass: true, length: 23 },
10
14
  ],
11
- async () => {
12
- const module = await import('./order');
13
- return module.orderRule();
14
- },
15
- (rule, options) => {
15
+ (rule, testCase) => {
16
16
  assert(Array.isArray(rule));
17
17
 
18
18
  assert(Array.isArray(rule[0]));
19
- expect(rule[0]).toHaveLength(options.length);
19
+ expect(rule[0]).toHaveLength(testCase.length);
20
20
 
21
21
  assert(typeof rule[1] === 'object');
22
22
  expect(rule[1]).toStrictEqual({ unspecified: 'bottom' });
23
23
  },
24
24
  );
25
25
 
26
- testLintAndFix(async () => {
27
- const module = await import('./order');
28
- return {
26
+ describeLintAndFix(
27
+ utilsPackages,
28
+ async () => ({
29
29
  plugins: ['stylelint-order'],
30
- rules: module.order(),
31
- };
32
- }, [
33
- {
34
- hasTailwind: false,
35
- hasSass: false,
36
- code: scss`
37
- a {
38
- $variable: 1px;
39
- --property: 3px;
40
- @variable: 2px;
41
- width: 4px;
42
- }
43
- `,
44
- isError: false,
45
- },
46
- ]);
30
+ rules: order(),
31
+ }),
32
+ [
33
+ {
34
+ hasTailwind: false,
35
+ hasSass: false,
36
+ code: scss`
37
+ a {
38
+ $variable: 1px;
39
+ --property: 3px;
40
+ @variable: 2px;
41
+ width: 4px;
42
+ }
43
+ `,
44
+ isError: false,
45
+ },
46
+ ],
47
+ );
@@ -1,55 +0,0 @@
1
- import { resolve } from 'node:path';
2
- import type { Config } from 'stylelint';
3
- import stylelint from 'stylelint';
4
- import type { Awaitable } from 'vitest';
5
- import { describe, expect, it } from 'vitest';
6
- import type { UtilsPackages } from './mock';
7
- import { defineMockUtilsPackages } from './mock';
8
-
9
- type LintAndFixCase = {
10
- code: string;
11
- fixedCode?: string;
12
- isError?: boolean;
13
- ext?: 'css' | 'scss' | 'vue';
14
- debug?: boolean;
15
- } & UtilsPackages;
16
-
17
- export const testLintAndFix = (
18
- getConfig: Config | (() => Awaitable<Config>),
19
- testCases: LintAndFixCase[],
20
- ) =>
21
- describe('test lint and fix', () => {
22
- const mockUtilsPackages = defineMockUtilsPackages(testCases);
23
-
24
- const name = [
25
- ...(['hasTailwind', 'hasSass', 'hasVue', 'isError'] as const) //
26
- .filter(field => testCases.some(t => typeof t[field] === 'boolean')),
27
- ...(['code', 'fixedCode'] as const) //
28
- .filter(field => testCases.some(t => typeof t[field] === 'string')),
29
- ]
30
- .map(field => `${field} = $${field}`)
31
- .join(', ');
32
-
33
- it.each(testCases)(name, async options => {
34
- await mockUtilsPackages(options);
35
-
36
- const config =
37
- typeof getConfig === 'function' ? await getConfig() : getConfig;
38
- const result = await stylelint.lint({
39
- code: options.code,
40
- codeFilename: `filename.${options.ext ?? 'css'}`,
41
- config,
42
- fix: 'fixedCode' in options,
43
- configBasedir: resolve(__dirname, '..'),
44
- });
45
-
46
- if (options.debug) {
47
- /* eslint-disable no-console */
48
- console.log(result.results.flatMap(r => r.warnings));
49
- console.log(result.code);
50
- /* eslint-enable no-console */
51
- }
52
- if ('fixedCode' in options) expect(result.code).toBe(options.fixedCode);
53
- if ('isError' in options) expect(result.errored).toBe(options.isError);
54
- });
55
- });
@@ -1,68 +0,0 @@
1
- import type { Awaitable } from 'vitest';
2
- import { describe, it } from 'vitest';
3
- import type { Config, ConfigRuleSettings } from 'stylelint';
4
- import type { UtilsPackages } from './mock';
5
- import { defineMockUtilsPackages } from './mock';
6
-
7
- import type {
8
- ConfigRulePrimaryOption,
9
- ConfigRuleSecondaryOptions,
10
- } from '~/utils';
11
-
12
- type TArgs<TOptions extends object, TRuleOrConfig> = [
13
- getRuleOrConfig: (() => Awaitable<TRuleOrConfig>) | TRuleOrConfig,
14
- fn: (
15
- ruleOrConfig: TRuleOrConfig,
16
- options: UtilsPackages & TOptions,
17
- ) => Promise<void> | void,
18
- ];
19
-
20
- const testRuleOrConfigValue = <
21
- TBaseRuleOrConfig extends
22
- | ConfigRuleSettings<ConfigRulePrimaryOption, ConfigRuleSecondaryOptions>
23
- | Config,
24
- >(
25
- ruleOrConfig: 'rule' | 'config',
26
- ) => {
27
- return <
28
- TCase extends UtilsPackages & object,
29
- TRuleOrConfig extends TBaseRuleOrConfig,
30
- >(
31
- ...args:
32
- | [testCases: TCase[], ...TArgs<TCase, TRuleOrConfig>]
33
- | [...TArgs<TCase, TRuleOrConfig>]
34
- ) => {
35
- describe(ruleOrConfig, () => {
36
- const [testCases, getRuleOrConfig, fn] =
37
- args.length === 3
38
- ? [...args]
39
- : [[{} as UtilsPackages & TCase], ...args];
40
-
41
- const mockUtilsPackages = defineMockUtilsPackages(testCases);
42
-
43
- const name = (['hasTailwind', 'hasSass', 'hasVue'] as const)
44
- .filter(field => testCases.some(t => typeof t[field] === 'boolean'))
45
- .map(field => `${field} = $${field}`)
46
- .join(', ');
47
-
48
- it.each(testCases)(name, async options => {
49
- await mockUtilsPackages(options);
50
-
51
- const ruleOrConfig =
52
- typeof getRuleOrConfig === 'function'
53
- ? await getRuleOrConfig()
54
- : getRuleOrConfig;
55
-
56
- await fn(ruleOrConfig, options);
57
- });
58
- });
59
- };
60
- };
61
-
62
- export const testConfigValue = testRuleOrConfigValue<Config>('config');
63
- export const testRuleValue = testRuleOrConfigValue<
64
- ConfigRuleSettings<
65
- ConfigRulePrimaryOption, //
66
- ConfigRuleSecondaryOptions
67
- >
68
- >('rule');