From 41a2bcc7f325fb3cba1e5463a8a04ae1a931bf51 Mon Sep 17 00:00:00 2001 From: TJNhxMZHmqGytuWT <113251528+TJNhxMZHmqGytuWT@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:58:42 +0100 Subject: [PATCH] feat: Support Stylelint custom syntax object (#937) --- .../plugins/stylelint2/.stylelintrc.cjs | 4 ++++ .../plugins/stylelint2/.stylelintrc.mjs | 18 +++++++++++++++ .../plugins/stylelint2/myExtendableConfig.js | 6 +++++ .../node_modules/postcss-less/index.js | 1 + .../node_modules/postcss-less/package.json | 4 ++++ .../node_modules/postcss-styl/index.js | 1 + .../node_modules/postcss-styl/package.json | 4 ++++ .../stylelint-config-recommended/index.js | 1 + .../stylelint-config-recommended/package.json | 4 ++++ .../fixtures/plugins/stylelint2/package.json | 14 +++++++++++ .../plugins/stylelint2/stylelint.config.js | 23 +++++++++++++++++++ packages/knip/src/plugins/stylelint/index.ts | 3 ++- packages/knip/src/plugins/stylelint/types.ts | 2 +- packages/knip/test/plugins/stylelint2.test.ts | 21 +++++++++++++++++ 14 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 packages/knip/fixtures/plugins/stylelint2/.stylelintrc.cjs create mode 100644 packages/knip/fixtures/plugins/stylelint2/.stylelintrc.mjs create mode 100644 packages/knip/fixtures/plugins/stylelint2/myExtendableConfig.js create mode 100644 packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-less/index.js create mode 100644 packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-less/package.json create mode 100644 packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-styl/index.js create mode 100644 packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-styl/package.json create mode 100644 packages/knip/fixtures/plugins/stylelint2/node_modules/stylelint-config-recommended/index.js create mode 100644 packages/knip/fixtures/plugins/stylelint2/node_modules/stylelint-config-recommended/package.json create mode 100644 packages/knip/fixtures/plugins/stylelint2/package.json create mode 100644 packages/knip/fixtures/plugins/stylelint2/stylelint.config.js create mode 100644 packages/knip/test/plugins/stylelint2.test.ts diff --git a/packages/knip/fixtures/plugins/stylelint2/.stylelintrc.cjs b/packages/knip/fixtures/plugins/stylelint2/.stylelintrc.cjs new file mode 100644 index 000000000..bd9d7316b --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/.stylelintrc.cjs @@ -0,0 +1,4 @@ +/** @type {import('stylelint').Config} */ +module.exports = { + customSyntax: require('postcss-less'), +}; diff --git a/packages/knip/fixtures/plugins/stylelint2/.stylelintrc.mjs b/packages/knip/fixtures/plugins/stylelint2/.stylelintrc.mjs new file mode 100644 index 000000000..44b02ddac --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/.stylelintrc.mjs @@ -0,0 +1,18 @@ +import less from 'postcss-less'; + +/** @type {import('stylelint').Config} */ +const config = { + customSyntax: less, + extends: ['stylelint-config-standard'], + rules: { + 'alpha-value-notation': 'number', + }, + overrides: [ + { + files: ['**/*.html'], + extends: ['stylelint-config-html/html.js', 'stylelint-config-standard'], + }, + ], +}; + +export default config; diff --git a/packages/knip/fixtures/plugins/stylelint2/myExtendableConfig.js b/packages/knip/fixtures/plugins/stylelint2/myExtendableConfig.js new file mode 100644 index 000000000..d3bdd056d --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/myExtendableConfig.js @@ -0,0 +1,6 @@ +/** @type {import('stylelint').Config} */ +const myExtendableConfig = { + plugins: ['stylelint-order'], +}; + +module.exports = myExtendableConfig; diff --git a/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-less/index.js b/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-less/index.js new file mode 100644 index 000000000..cc40a4649 --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-less/index.js @@ -0,0 +1 @@ +module.exports = () => {}; diff --git a/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-less/package.json b/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-less/package.json new file mode 100644 index 000000000..fca904f55 --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-less/package.json @@ -0,0 +1,4 @@ +{ + "name": "postcss-less", + "main": "index.js" +} diff --git a/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-styl/index.js b/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-styl/index.js new file mode 100644 index 000000000..cc40a4649 --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-styl/index.js @@ -0,0 +1 @@ +module.exports = () => {}; diff --git a/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-styl/package.json b/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-styl/package.json new file mode 100644 index 000000000..355e17763 --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/node_modules/postcss-styl/package.json @@ -0,0 +1,4 @@ +{ + "name": "postcss-styl", + "main": "index.js" +} diff --git a/packages/knip/fixtures/plugins/stylelint2/node_modules/stylelint-config-recommended/index.js b/packages/knip/fixtures/plugins/stylelint2/node_modules/stylelint-config-recommended/index.js new file mode 100644 index 000000000..cc40a4649 --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/node_modules/stylelint-config-recommended/index.js @@ -0,0 +1 @@ +module.exports = () => {}; diff --git a/packages/knip/fixtures/plugins/stylelint2/node_modules/stylelint-config-recommended/package.json b/packages/knip/fixtures/plugins/stylelint2/node_modules/stylelint-config-recommended/package.json new file mode 100644 index 000000000..1801ff273 --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/node_modules/stylelint-config-recommended/package.json @@ -0,0 +1,4 @@ +{ + "name": "stylelint-config-recommended", + "main": "index.js" +} diff --git a/packages/knip/fixtures/plugins/stylelint2/package.json b/packages/knip/fixtures/plugins/stylelint2/package.json new file mode 100644 index 000000000..acfe3ccf4 --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/package.json @@ -0,0 +1,14 @@ +{ + "name": "@fixtures/stylelint2", + "version": "*", + "devDependencies": { + "postcss-less": "*", + "postcss-styl": "*", + "stylelint": "*", + "stylelint-config-recommended": "*", + "stylelint-config-standard": "*" + }, + "dependencies": { + "stylelint-config-html": "*" + } +} diff --git a/packages/knip/fixtures/plugins/stylelint2/stylelint.config.js b/packages/knip/fixtures/plugins/stylelint2/stylelint.config.js new file mode 100644 index 000000000..20e52ba1c --- /dev/null +++ b/packages/knip/fixtures/plugins/stylelint2/stylelint.config.js @@ -0,0 +1,23 @@ +const less = require('postcss-less'); +const stylus = require('postcss-styl'); + +/** @type {import('stylelint').Config} */ +const config = { + customSyntax: less, + extends: [require.resolve('stylelint-config-recommended'), './myExtendableConfig'], + rules: { + 'alpha-value-notation': 'number', + }, + overrides: [ + { + files: ['**/*.html'], + extends: ['stylelint-config-html/html', 'stylelint-config-standard'], + }, + { + files: ['*.styl', '**/*.styl', '*.stylus', '**/*.stylus'], + customSyntax: stylus, + }, + ], +}; + +module.exports = config; diff --git a/packages/knip/src/plugins/stylelint/index.ts b/packages/knip/src/plugins/stylelint/index.ts index 775a8d3d5..78a9c8f53 100644 --- a/packages/knip/src/plugins/stylelint/index.ts +++ b/packages/knip/src/plugins/stylelint/index.ts @@ -17,7 +17,8 @@ const config = ['package.json', ...toCosmiconfig('stylelint')]; const resolve = (config: StyleLintConfig | BaseStyleLintConfig): Input[] => { const extend = config.extends ?? []; const plugins = config.plugins ?? []; - const customSyntax = config.customSyntax ? [config.customSyntax] : []; + const customSyntax: string[] = typeof config.customSyntax === 'string' ? [config.customSyntax] : []; + const overrideConfigs = 'overrides' in config ? config.overrides.flatMap(resolve) : []; return [...[extend, plugins, customSyntax].flat().map(toDeferResolve), ...overrideConfigs]; }; diff --git a/packages/knip/src/plugins/stylelint/types.ts b/packages/knip/src/plugins/stylelint/types.ts index 10e37c971..b0de9c906 100644 --- a/packages/knip/src/plugins/stylelint/types.ts +++ b/packages/knip/src/plugins/stylelint/types.ts @@ -1,5 +1,5 @@ export type BaseStyleLintConfig = { - customSyntax?: string; + customSyntax?: unknown; extends?: string | string[]; plugins?: string[]; }; diff --git a/packages/knip/test/plugins/stylelint2.test.ts b/packages/knip/test/plugins/stylelint2.test.ts new file mode 100644 index 000000000..e5cc3c716 --- /dev/null +++ b/packages/knip/test/plugins/stylelint2.test.ts @@ -0,0 +1,21 @@ +import { test } from 'bun:test'; +import assert from 'node:assert/strict'; +import { main } from '../../src/index.js'; +import { resolve } from '../../src/util/path.js'; +import baseArguments from '../helpers/baseArguments.js'; +import baseCounters from '../helpers/baseCounters.js'; + +const cwd = resolve('fixtures/plugins/stylelint2'); + +test('Find dependencies with the stylelint plugin (2)', async () => { + const { counters } = await main({ + ...baseArguments, + cwd, + }); + + assert.deepEqual(counters, { + ...baseCounters, + processed: 4, + total: 4, + }); +});