This commit is contained in:
Alex
2024-04-16 22:29:31 -04:00
parent 1d955d951d
commit 51455e3c21
17 changed files with 410 additions and 303 deletions

38
src/commits.json Normal file
View File

@ -0,0 +1,38 @@
{
"eslint-plugin-import": {
"hash": "f77ceb679d59ced5d9a633123385470a9eea10d9",
"date": "2024-04-07T12:55:28+12:00",
"committer": "Jordan Harband",
"subject": "[actions] cancel in-progress runs on PR updates"
},
"eslint-import-resolver-typescript": {
"hash": "7a02ac08b5aaac8c217f0e87142f97eafcc38fbc",
"date": "2024-04-01T01:06:20+00:00",
"committer": "GitHub",
"subject": "chore(deps): update dependency npm-run-all2 to ^5.0.2 (#277)"
},
"eslint-plugin-jsx-a11y": {
"hash": "0d5321a5457c5f0da0ca216053cc5b4f571b53ae",
"date": "2024-01-27T22:18:19-08:00",
"committer": "Jordan Harband",
"subject": "[Deps] update `@babel/runtime`, `safe-regex-test`"
},
"eslint-plugin-n": {
"hash": "8d711f5446655c9874aeffb2ef28b3c4d8463fb6",
"date": "2024-04-16T16:08:04+08:00",
"committer": "GitHub",
"subject": "chore: update outdated funding (#246)"
},
"eslint-plugin-react": {
"hash": "4467db503e38b9356517cf6926d11be544ccf4b1",
"date": "2024-03-16T12:54:58+09:00",
"committer": "Jordan Harband",
"subject": "[Fix] `boolean-prop-naming`: avoid a crash with a non-TSTypeReference type"
},
"jsx-ast-utils": {
"hash": "5943318eaf23764eec3ff397ebb969613d728a95",
"date": "2023-07-28T18:34:04-07:00",
"committer": "Jordan Harband",
"subject": "v3.3.5"
}
}

View File

@ -1,4 +1,4 @@
/// <reference path="./types.d.ts" />
/// <reference path="./modules.d.ts" />
import './redirect';
import fs from 'node:fs';
import type { Rule } from 'eslint';

View File

@ -30,9 +30,10 @@ const plugin: ESLint.Plugin = {
};
for (const file of files) {
const name = basename(file, extname(file));
const module = require(resolve(folders, file));
plugin.rules![name] = module.default ?? module;
const unwrap = module.default ?? module;
const name = unwrap.name ?? basename(file, extname(file));
plugin.rules![name] = unwrap;
}
export = plugin;

View File

@ -19,3 +19,18 @@ declare module '@typescript-eslint/scope-manager' {
declare module '@typescript-eslint/types' {
export * from '@typescript-eslint/types/dist/index';
}
declare module 'module' {
export function _resolveFilename(
request: string,
parent: {
/**
* Can be null if the parent id is 'internal/preload' (e.g. via --require)
* which doesn't have a file path.
*/
filename: string | null;
},
isMain: boolean,
options?: Record<PropertyKey, unknown>,
): string;
}

37
src/prettier.ts Normal file
View File

@ -0,0 +1,37 @@
import type { Config } from 'prettier';
const prettier: Config = {
arrowParens: 'avoid',
tabWidth: 2,
printWidth: 90,
semi: true,
singleQuote: true,
trailingComma: 'all',
plugins: [],
};
export default function defineConfig({
tailwind,
...config
}: Partial<Config> & {
tailwind?: boolean;
}) {
const result: Config = {
...prettier,
...config,
};
if (tailwind) {
ensureHas(result.plugins!, 'prettier-plugin-tailwindcss');
result.tailwindAttributes ??= ['css'];
result.tailwindFunctions ??= ['tw'];
}
return result;
}
function ensureHas<T>(list: T[], item: T) {
if (!list.includes(item)) {
list.push(item);
}
}

View File

@ -1,7 +1,7 @@
import Module from 'module';
const { name } = [require][0]('./package.json');
const _resolveFilename = (Module as any)._resolveFilename;
const _resolveFilename = Module._resolveFilename;
const alias = new Set([
'eslint-import-resolver-typescript',
'eslint-plugin-import',
@ -13,9 +13,14 @@ const alias = new Set([
'eslint-plugin-rules',
]);
(Module as any)._resolveFilename = function (module: string, ...args: any[]) {
if (alias.has(module)) {
module = `${name}/${module}`;
type CDR<T> = T extends [any, ...infer R] ? R : [];
Module._resolveFilename = function (
request: string,
...args: CDR<Parameters<typeof _resolveFilename>>
) {
if (alias.has(request)) {
request = `${name}/${request}`;
}
return _resolveFilename(module, ...args);
return _resolveFilename(request, ...args);
};

View File

@ -1,16 +1,15 @@
import type { Rule } from 'eslint';
import { defineRule } from '../types';
const rule: Rule.RuleModule = {
meta: {
type: 'problem',
docs: {
description:
'Ban assignment of empty object literals `{}` and replace them with `Object.create(null)`',
category: 'Best Practices',
recommended: true,
},
fixable: 'code',
export default defineRule({
type: 'problem',
docs: {
description:
'Ban assignment of empty object literals `{}` and replace them with `Object.create(null)`',
category: 'Best Practices',
recommended: true,
},
fixable: 'code',
create: context => ({
AssignmentExpression(node) {
if (
@ -27,6 +26,4 @@ const rule: Rule.RuleModule = {
}
},
}),
};
export default rule;
});

26
src/types.ts Normal file
View File

@ -0,0 +1,26 @@
import type { Rule } from 'eslint';
import type { ESLintUtils } from '@typescript-eslint/utils';
export function defineRules(rules: {
[ruleName: string]: Rule.RuleModule | ESLintUtils.RuleModule<string, unknown[]>;
}) {
return rules;
}
export function defineRule({
name,
create,
...meta
}: Rule.RuleMetaData & {
name?: string;
create: (context: Rule.RuleContext) => Rule.RuleListener;
}): Rule.RuleModule {
const module: Rule.RuleModule = {
meta,
create,
};
if (name != null) {
Object.defineProperty(module, 'name', { value: name });
}
return module;
}