diff --git a/packages/knip/fixtures/plugins/yarn/package.json b/packages/knip/fixtures/plugins/yarn/package.json new file mode 100644 index 000000000..a27588ec9 --- /dev/null +++ b/packages/knip/fixtures/plugins/yarn/package.json @@ -0,0 +1,7 @@ +{ + "name": "@fixtures/yarn", + "version": "*", + "devDependencies": { + "@yarnpkg/types": "latest" + } +} diff --git a/packages/knip/fixtures/plugins/yarn/yarn.config.cjs b/packages/knip/fixtures/plugins/yarn/yarn.config.cjs new file mode 100644 index 000000000..a65de78e6 --- /dev/null +++ b/packages/knip/fixtures/plugins/yarn/yarn.config.cjs @@ -0,0 +1,10 @@ +// https://yarnpkg.com/features/constraints + +/** @type {import('@yarnpkg/types')} */ +const { defineConfig } = require('@yarnpkg/types'); + +module.exports = defineConfig({ + async constraints({Yarn}) { + // `Yarn` is now well-typed ✨ + }, +}); diff --git a/packages/knip/fixtures/plugins/yarn/yarn.lock b/packages/knip/fixtures/plugins/yarn/yarn.lock new file mode 100644 index 000000000..2dd7ab06f --- /dev/null +++ b/packages/knip/fixtures/plugins/yarn/yarn.lock @@ -0,0 +1,6 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10 diff --git a/packages/knip/schema.json b/packages/knip/schema.json index 256d77417..75bccc7d6 100644 --- a/packages/knip/schema.json +++ b/packages/knip/schema.json @@ -612,6 +612,10 @@ "title": "xo plugin configuration (https://knip.dev/reference/plugins/xo)", "$ref": "#/definitions/plugin" }, + "yarn": { + "title": "yarn plugin configuration (https://knip.dev/reference/plugins/yarn)", + "$ref": "#/definitions/plugin" + }, "yorkie": { "title": "yorkie plugin configuration (https://knip.dev/reference/plugins/yorkie)", "$ref": "#/definitions/plugin" diff --git a/packages/knip/src/plugins/index.ts b/packages/knip/src/plugins/index.ts index ef662e4af..1db4cec8d 100644 --- a/packages/knip/src/plugins/index.ts +++ b/packages/knip/src/plugins/index.ts @@ -84,6 +84,7 @@ import { default as webpack } from './webpack/index.js'; import { default as wireit } from './wireit/index.js'; import { default as wrangler } from './wrangler/index.js'; import { default as xo } from './xo/index.js'; +import { default as yarn } from './yarn/index.js'; import { default as yorkie } from './yorkie/index.js'; export const Plugins = { @@ -172,5 +173,6 @@ export const Plugins = { wireit, wrangler, xo, + yarn, yorkie, }; diff --git a/packages/knip/src/plugins/yarn/index.ts b/packages/knip/src/plugins/yarn/index.ts new file mode 100644 index 000000000..3a52b838f --- /dev/null +++ b/packages/knip/src/plugins/yarn/index.ts @@ -0,0 +1,19 @@ +import type { IsPluginEnabled, Plugin } from '../../types/config.js'; +import { _firstGlob } from '../../util/glob.js'; + +// https://yarnpkg.com/features/constraints + +const title = 'Yarn'; + +const enablers = 'This plugin is enabled when a `yarn.lock` file is found in the root folder.'; + +const isEnabled: IsPluginEnabled = async ({ cwd }) => Boolean(await _firstGlob({ cwd, patterns: ['yarn.lock'] })); + +const entry: string[] = ['yarn.config.cjs']; + +export default { + title, + enablers, + isEnabled, + entry, +} satisfies Plugin; diff --git a/packages/knip/src/schema/plugins.ts b/packages/knip/src/schema/plugins.ts index 9d9f9c176..cb8ec3247 100644 --- a/packages/knip/src/schema/plugins.ts +++ b/packages/knip/src/schema/plugins.ts @@ -98,5 +98,6 @@ export const pluginsSchema = z.object({ wireit: pluginSchema, wrangler: pluginSchema, xo: pluginSchema, + yarn: pluginSchema, yorkie: pluginSchema, }); diff --git a/packages/knip/src/types/PluginNames.ts b/packages/knip/src/types/PluginNames.ts index f60c603e7..cf7616381 100644 --- a/packages/knip/src/types/PluginNames.ts +++ b/packages/knip/src/types/PluginNames.ts @@ -85,6 +85,7 @@ export type PluginName = | 'wireit' | 'wrangler' | 'xo' + | 'yarn' | 'yorkie'; export const pluginNames = [ @@ -173,5 +174,6 @@ export const pluginNames = [ 'wireit', 'wrangler', 'xo', + 'yarn', 'yorkie', ] as const; diff --git a/packages/knip/test/plugins/yarn.test.ts b/packages/knip/test/plugins/yarn.test.ts new file mode 100644 index 000000000..569c2b703 --- /dev/null +++ b/packages/knip/test/plugins/yarn.test.ts @@ -0,0 +1,23 @@ +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/yarn'); + +test('Find dependencies with the yarn plugin', async () => { + const { issues, counters } = await main({ + ...baseArguments, + cwd, + }); + + assert(issues.files.size === 0); + + assert.deepEqual(counters, { + ...baseCounters, + processed: 1, + total: 1, + }); +});