Skip to content

Commit

Permalink
Add simple-git-hooks plugin (#679)
Browse files Browse the repository at this point in the history
  • Loading branch information
hyoban committed Jun 15, 2024
1 parent 6797bf8 commit 9129af7
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 0 deletions.
13 changes: 13 additions & 0 deletions packages/knip/fixtures/plugins/simple-git-hooks/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "@fixtures/simple-git-hooks",
"devDependencies": {
"simple-git-hooks": "*",
"lint-staged": "*"
},
"simple-git-hooks": {
"pre-commit": "pnpm lint-staged"
},
"lint-staged": {
"*": "eslint --fix"
}
}
4 changes: 4 additions & 0 deletions packages/knip/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,10 @@
"title": "Sentry plugin configuration (https://knip.dev/reference/plugins/sentry)",
"$ref": "#/definitions/plugin"
},
"simple-git-hooks": {
"title": "simple-git-hooks plugin configuration (https://knip.dev/reference/plugins/simple-git-hooks)",
"$ref": "#/definitions/plugin"
},
"storybook": {
"title": "Storybook plugin configuration (https://knip.dev/reference/plugins/storybook)",
"$ref": "#/definitions/plugin"
Expand Down
1 change: 1 addition & 0 deletions packages/knip/src/ConfigurationValidator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ export const pluginSchema = z.union([
]);

const pluginsSchema = z.object({
'simple-git-hooks': pluginSchema,
unocss: pluginSchema,
astro: pluginSchema,
angular: pluginSchema,
Expand Down
1 change: 1 addition & 0 deletions packages/knip/src/plugins/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,4 @@ export { default as wrangler } from './wrangler/index.js';
export { default as yorkie } from './yorkie/index.js';
export { default as xo } from './xo/index.js';
export { default as unocss } from './unocss/index.js';
export { default as simpleGitHooks } from './simple-git-hooks/index.js';
45 changes: 45 additions & 0 deletions packages/knip/src/plugins/simple-git-hooks/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import type { EnablerPatterns } from '#p/types/config.js';
import type { IsPluginEnabled, Plugin, ResolveConfig } from '#p/types/plugins.js';
import { getDependenciesFromScripts, hasDependency } from '#p/util/plugin.js';
import type { PluginConfig } from './types.js';

// https://github.com/toplenboren/simple-git-hooks

const title = 'simple-git-hooks';

const enablers: EnablerPatterns = ['simple-git-hooks'];

const isEnabled: IsPluginEnabled = ({ dependencies }) => hasDependency(dependencies, enablers);

const packageJsonPath = 'simple-git-hooks';

const config: string[] = [
'.simple-git-hooks.{js,cjs}',
'simple-git-hooks.{js,cjs}',
'.simple-git-hooks.json',
'simple-git-hooks.json',
'package.json',
];

const resolveConfig: ResolveConfig<PluginConfig> = async (config, options) => {
if (typeof config === 'function') config = config();

if (!config) return [];

const dependencies = new Set<string>();

for (const hook of Object.values(config)) {
for (const id of getDependenciesFromScripts(hook, options)) dependencies.add(id);
}

return Array.from(dependencies);
};

export default {
title,
enablers,
isEnabled,
packageJsonPath,
config,
resolveConfig,
} satisfies Plugin;
8 changes: 8 additions & 0 deletions packages/knip/src/plugins/simple-git-hooks/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// https://github.com/toplenboren/simple-git-hooks?tab=readme-ov-file#additional-configuration-options
// {
// "pre-commit": "npx lint-staged",
// "pre-push": "npm run format"
// }
type Config = Record<string, string>;

export type PluginConfig = Config | (() => Config);
26 changes: 26 additions & 0 deletions packages/knip/test/plugins/simple-git-hooks.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
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/simple-git-hooks');

test('Find dependencies with the simple-git-hooks plugin', async () => {
const { issues, counters } = await main({
...baseArguments,
cwd,
});

assert(issues.binaries['package.json']['eslint']);
assert(issues.binaries['package.json']['lint-staged']);
assert(issues.devDependencies['package.json']['simple-git-hooks']);
assert(issues.devDependencies['package.json']['lint-staged']);

assert.deepEqual(counters, {
...baseCounters,
binaries: 2,
devDependencies: 2,
});
});

0 comments on commit 9129af7

Please sign in to comment.