@2digits/eslint-plugin 2.2.8 → 2.3.0

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/dist/index.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  var magicRegexp = require('magic-regexp');
4
4
  var tsPattern = require('ts-pattern');
5
5
 
6
- var g="@2digits/eslint-plugin";var a="2.2.8";var f={url:"https://github.com/2digits-agency/configs",directory:"packages/eslint-plugin"};var y={rules:{"@2digits/type-param-names":"error"}};var k=`${f.url}/blob/${g}@${a}/packages/eslint/src/rules/`;function I(e){return function({name:s,meta:t,...i}){return E({meta:{...t,docs:{...t.docs,url:e(s)}},...i})}}function E({create:e,defaultOptions:r,meta:s}){return {create:t=>{let i=t.options.map((o,O)=>({...r[O],...o}));return e(t,i)},defaultOptions:r,meta:s}}var x=I(e=>`${k}${e}.ts`);var d=magicRegexp.anyOf("T","$").at.lineStart(),c=magicRegexp.letter.uppercase,T=magicRegexp.oneOrMore(magicRegexp.letter),$=magicRegexp.digit.times.any().at.lineEnd(),N=magicRegexp.createRegExp(d),j=magicRegexp.createRegExp(d,c),D=magicRegexp.createRegExp(d,c,T),W=magicRegexp.createRegExp(d,c,T,$),m={prefix:"prefix",initial:"initial",remainder:"remainder",regex:"regex"},A="type-param-names",h=x({name:A,meta:{type:"suggestion",docs:{description:"Enforce giving proper names to type parameters when there are two or more"},schema:[],messages:{prefix:'Type parameter {{name}} should have a prefix of "T" or "$"',initial:"Type parameter {{name}}'s name should start with an uppercase letter",remainder:"Type parameter {{name}}'s name should contain at least one lowercase letter",regex:"Type parameter {{name}} should match the regex {{regex}}"}},defaultOptions:[],create(e){return {TSTypeParameterDeclaration(r){let{params:s}=r;if(!(s.length===1&&s.at(0)?.name.name==="T"))for(let t of s){let{name:i}=t.name,o=tsPattern.match(i).with(tsPattern.P.string.regex(W),()=>!1).with(tsPattern.P.not(tsPattern.P.string.regex(N)),()=>m.prefix).with(tsPattern.P.not(tsPattern.P.string.regex(j)),()=>m.initial).with(tsPattern.P.not(tsPattern.P.string.regex(D)),()=>m.remainder).otherwise(()=>!1);o&&e.report({node:t,messageId:o,data:{name:i}});}}}}});var M={"type-param-names":h};var w={meta:{name:"@2digits",version:a},rules:M,configs:{recommended:{plugins:{get"@2digits"(){return w},set"@2digits"(e){}},rules:y.rules}}},ee=w;
6
+ var g="@2digits/eslint-plugin";var a="2.3.0";var f={url:"https://github.com/2digits-agency/configs",directory:"packages/eslint-plugin"};var y={rules:{"@2digits/type-param-names":"error"}};var k=`${f.url}/blob/${g}@${a}/packages/eslint/src/rules/`;function I(e){return function({name:s,meta:t,...i}){return E({meta:{...t,docs:{...t.docs,url:e(s)}},...i})}}function E({create:e,defaultOptions:r,meta:s}){return {create:t=>{let i=t.options.map((o,O)=>({...r[O],...o}));return e(t,i)},defaultOptions:r,meta:s}}var x=I(e=>`${k}${e}.ts`);var d=magicRegexp.anyOf("T","$").at.lineStart(),c=magicRegexp.letter.uppercase,T=magicRegexp.oneOrMore(magicRegexp.letter),$=magicRegexp.digit.times.any().at.lineEnd(),N=magicRegexp.createRegExp(d),j=magicRegexp.createRegExp(d,c),D=magicRegexp.createRegExp(d,c,T),W=magicRegexp.createRegExp(d,c,T,$),m={prefix:"prefix",initial:"initial",remainder:"remainder",regex:"regex"},A="type-param-names",h=x({name:A,meta:{type:"suggestion",docs:{description:"Enforce giving proper names to type parameters when there are two or more"},schema:[],messages:{prefix:'Type parameter {{name}} should have a prefix of "T" or "$"',initial:"Type parameter {{name}}'s name should start with an uppercase letter",remainder:"Type parameter {{name}}'s name should contain at least one lowercase letter",regex:"Type parameter {{name}} should match the regex {{regex}}"}},defaultOptions:[],create(e){return {TSTypeParameterDeclaration(r){let{params:s}=r;if(!(s.length===1&&s.at(0)?.name.name==="T"))for(let t of s){let{name:i}=t.name,o=tsPattern.match(i).with(tsPattern.P.string.regex(W),()=>!1).with(tsPattern.P.not(tsPattern.P.string.regex(N)),()=>m.prefix).with(tsPattern.P.not(tsPattern.P.string.regex(j)),()=>m.initial).with(tsPattern.P.not(tsPattern.P.string.regex(D)),()=>m.remainder).otherwise(()=>!1);o&&e.report({node:t,messageId:o,data:{name:i}});}}}}});var M={"type-param-names":h};var w={meta:{name:"@2digits",version:a},rules:M,configs:{recommended:{plugins:{get"@2digits"(){return w},set"@2digits"(e){}},rules:y.rules}}},ee=w;
7
7
 
8
8
  module.exports = ee;
9
9
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/configs/recommended.ts","../src/utils/index.ts","../src/rules/type-param-names.ts","../src/rules/index.ts","../src/index.ts"],"names":["name","version","repository","recommended","blobUrl","RuleCreator","urlCreator","meta","rule","createRule","create","defaultOptions","context","optionsWithDefault","options","index","createEslintRule","ruleName","prefix","anyOf","initial","letter","remainder","oneOrMore","digits","digit","PrefixRegex","createRegExp","InitialRegex","RemainderRegex","TypeParamRegex","MessageId","RULE_NAME","typeParamNames","node","params","param","messageId","match","P","rules","plugin","_","src_default"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"@2digits/eslint-plugin\",\n \"description\": \"An eslint plugin that provides a set of rules to enforce best practices for 2digits projects\",\n \"version\": \"2.2.8\",\n \"type\": \"module\",\n \"repository\": {\n \"url\": \"https://github.com/2digits-agency/configs\",\n \"directory\": \"packages/eslint-plugin\"\n },\n \"license\": \"MIT\",\n \"public\": true,\n \"sideEffects\": false,\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"import\": {\n \"default\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"require\": {\n \"default\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.cts\"\n }\n }\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint .\",\n \"types\": \"tsc --noEmit\",\n \"test\": \"vitest --run\"\n },\n \"keywords\": [\n \"eslint\",\n \"eslint-plugin\",\n \"2digits\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"8.3.0\",\n \"eslint\": \"9.9.1\",\n \"magic-regexp\": \"0.8.0\",\n \"ts-pattern\": \"5.3.1\"\n },\n \"devDependencies\": {\n \"@2digits/tsconfig\": \"workspace:*\",\n \"@typescript-eslint/parser\": \"8.3.0\",\n \"eslint-vitest-rule-tester\": \"0.6.1\",\n \"tsup\": \"8.2.4\",\n \"typescript\": \"5.5.4\",\n \"vitest\": \"2.0.5\"\n }\n}\n","import type { Linter } from 'eslint';\n\nimport type { rules } from '../rules';\n\nexport const recommended = {\n rules: {\n '@2digits/type-param-names': 'error' as const,\n } satisfies Record<`@2digits/${keyof typeof rules}`, Linter.RuleEntry<[]>>,\n};\n","import type {\n RuleListener,\n RuleWithMeta,\n RuleWithMetaAndName,\n} from '@typescript-eslint/utils/eslint-utils';\nimport type { RuleContext } from '@typescript-eslint/utils/ts-eslint';\nimport type { Rule } from 'eslint';\n\nimport { name, repository, version } from '../../package.json';\n\nconst blobUrl = `${repository.url}/blob/${name}@${version}/packages/eslint/src/rules/`;\n\n/** @public */\nexport interface RuleModule<T extends readonly unknown[]> extends Rule.RuleModule {\n defaultOptions: T;\n}\n\n/**\n * Creates reusable function to create rules with default options and docs URLs.\n *\n * @param urlCreator Creates a documentation URL for a given rule name.\n * @returns Function to create a rule with the docs URL format.\n */\nfunction RuleCreator(urlCreator: (name: string) => string) {\n // This function will get much easier to call when this is merged https://github.com/Microsoft/TypeScript/pull/26349\n // TODO - when the above PR lands; add type checking for the context.report `data` property\n return function createNamedRule<\n TOptions extends readonly Record<string, unknown>[],\n TMessageIds extends string,\n >({\n name,\n meta,\n ...rule\n }: Readonly<RuleWithMetaAndName<TOptions, TMessageIds>>): RuleModule<TOptions> {\n return createRule<TOptions, TMessageIds>({\n meta: {\n ...meta,\n docs: {\n ...meta.docs,\n url: urlCreator(name),\n },\n },\n ...rule,\n });\n };\n}\n\nfunction createRule<\n TOptions extends readonly Record<string, unknown>[],\n TMessageIds extends string,\n>({\n create,\n defaultOptions,\n meta,\n}: Readonly<RuleWithMeta<TOptions, TMessageIds>>): RuleModule<TOptions> {\n return {\n create: ((context: Readonly<RuleContext<TMessageIds, TOptions>>): RuleListener => {\n const optionsWithDefault = context.options.map((options, index) => {\n return {\n ...defaultOptions[index],\n ...options,\n };\n }) as unknown as TOptions;\n return create(context as never, optionsWithDefault);\n }) as unknown,\n defaultOptions,\n meta,\n } as unknown as RuleModule<TOptions>;\n}\n\nexport const createEslintRule = RuleCreator(\n (ruleName) => `${blobUrl}${ruleName}.ts`,\n) as unknown as <TOptions extends readonly unknown[], TMessageIds extends string>({\n name,\n meta,\n ...rule\n}: Readonly<RuleWithMetaAndName<TOptions, TMessageIds>>) => RuleModule<TOptions>;\n","import { anyOf, createRegExp, digit, letter, oneOrMore } from 'magic-regexp';\nimport { match, P } from 'ts-pattern';\n\nimport { createEslintRule } from '../utils';\n\nconst prefix = anyOf('T', '$').at.lineStart();\nconst initial = letter.uppercase;\nconst remainder = oneOrMore(letter);\nconst digits = digit.times.any().at.lineEnd();\n\nconst PrefixRegex = createRegExp(prefix);\nconst InitialRegex = createRegExp(prefix, initial);\nconst RemainderRegex = createRegExp(prefix, initial, remainder);\nconst TypeParamRegex = createRegExp(prefix, initial, remainder, digits);\n\ntype MessageId = (typeof MessageId)[keyof typeof MessageId];\nconst MessageId = {\n prefix: 'prefix',\n initial: 'initial',\n remainder: 'remainder',\n regex: 'regex',\n} as const;\n\nexport const RULE_NAME = 'type-param-names';\n\nexport const typeParamNames = createEslintRule<[], MessageId>({\n name: RULE_NAME,\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Enforce giving proper names to type parameters when there are two or more',\n },\n schema: [],\n messages: {\n prefix: 'Type parameter {{name}} should have a prefix of \"T\" or \"$\"',\n initial: \"Type parameter {{name}}'s name should start with an uppercase letter\",\n remainder: \"Type parameter {{name}}'s name should contain at least one lowercase letter\",\n regex: 'Type parameter {{name}} should match the regex {{regex}}',\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n TSTypeParameterDeclaration(node) {\n const { params } = node;\n\n if (params.length === 1 && params.at(0)?.name.name === 'T') return;\n\n for (const param of params) {\n const { name } = param.name;\n\n const messageId = match(name)\n .with(P.string.regex(TypeParamRegex), () => false as const)\n .with(P.not(P.string.regex(PrefixRegex)), () => MessageId.prefix)\n .with(P.not(P.string.regex(InitialRegex)), () => MessageId.initial)\n .with(P.not(P.string.regex(RemainderRegex)), () => MessageId.remainder)\n .otherwise(() => false as const);\n\n if (messageId) {\n context.report({\n node: param,\n messageId,\n data: { name },\n });\n }\n }\n },\n };\n },\n});\n","import { typeParamNames } from './type-param-names';\n\nexport const rules = {\n 'type-param-names': typeParamNames,\n};\n","import type { FlatConfig } from '@typescript-eslint/utils/ts-eslint';\nimport type { ESLint, Linter } from 'eslint';\n\nimport { version } from '../package.json';\n\nimport { recommended } from './configs/recommended';\nimport { rules } from './rules';\n\nconst plugin = {\n meta: {\n name: '@2digits',\n version,\n },\n rules,\n configs: {\n recommended: {\n plugins: {\n get '@2digits'(): ESLint.Plugin {\n return plugin;\n },\n set '@2digits'(_) {},\n },\n rules: recommended.rules as Record<string, Linter.RuleEntry<[]>>,\n },\n },\n} satisfies FlatConfig.Plugin;\n\nexport default plugin;\n\ntype RuleDefinitions = (typeof plugin)['rules'];\n\nexport type RuleOptions = {\n [K in keyof RuleDefinitions]: RuleDefinitions[K]['defaultOptions'];\n};\n\nexport type Rules = {\n [K in keyof RuleOptions]: Linter.RuleEntry<RuleOptions[K]>;\n};\n"]}
1
+ {"version":3,"sources":["../package.json","../src/configs/recommended.ts","../src/utils/index.ts","../src/rules/type-param-names.ts","../src/rules/index.ts","../src/index.ts"],"names":["name","version","repository","recommended","blobUrl","RuleCreator","urlCreator","meta","rule","createRule","create","defaultOptions","context","optionsWithDefault","options","index","createEslintRule","ruleName","prefix","anyOf","initial","letter","remainder","oneOrMore","digits","digit","PrefixRegex","createRegExp","InitialRegex","RemainderRegex","TypeParamRegex","MessageId","RULE_NAME","typeParamNames","node","params","param","messageId","match","P","rules","plugin","_","src_default"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"@2digits/eslint-plugin\",\n \"description\": \"An eslint plugin that provides a set of rules to enforce best practices for 2digits projects\",\n \"version\": \"2.3.0\",\n \"type\": \"module\",\n \"repository\": {\n \"url\": \"https://github.com/2digits-agency/configs\",\n \"directory\": \"packages/eslint-plugin\"\n },\n \"license\": \"MIT\",\n \"public\": true,\n \"sideEffects\": false,\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"import\": {\n \"default\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"require\": {\n \"default\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.cts\"\n }\n }\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint .\",\n \"types\": \"tsc --noEmit\",\n \"test\": \"vitest --run\"\n },\n \"keywords\": [\n \"eslint\",\n \"eslint-plugin\",\n \"2digits\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"8.5.0\",\n \"eslint\": \"9.10.0\",\n \"magic-regexp\": \"0.8.0\",\n \"ts-pattern\": \"5.3.1\"\n },\n \"devDependencies\": {\n \"@2digits/tsconfig\": \"workspace:*\",\n \"@typescript-eslint/parser\": \"8.5.0\",\n \"eslint-vitest-rule-tester\": \"0.6.1\",\n \"tsup\": \"8.2.4\",\n \"typescript\": \"5.6.2\",\n \"vitest\": \"2.0.5\"\n }\n}\n","import type { Linter } from 'eslint';\n\nimport type { rules } from '../rules';\n\nexport const recommended = {\n rules: {\n '@2digits/type-param-names': 'error' as const,\n } satisfies Record<`@2digits/${keyof typeof rules}`, Linter.RuleEntry<[]>>,\n};\n","import type {\n RuleListener,\n RuleWithMeta,\n RuleWithMetaAndName,\n} from '@typescript-eslint/utils/eslint-utils';\nimport type { RuleContext } from '@typescript-eslint/utils/ts-eslint';\nimport type { Rule } from 'eslint';\n\nimport { name, repository, version } from '../../package.json';\n\nconst blobUrl = `${repository.url}/blob/${name}@${version}/packages/eslint/src/rules/`;\n\n/** @public */\nexport interface RuleModule<T extends readonly unknown[]> extends Rule.RuleModule {\n defaultOptions: T;\n}\n\n/**\n * Creates reusable function to create rules with default options and docs URLs.\n *\n * @param urlCreator Creates a documentation URL for a given rule name.\n * @returns Function to create a rule with the docs URL format.\n */\nfunction RuleCreator(urlCreator: (name: string) => string) {\n // This function will get much easier to call when this is merged https://github.com/Microsoft/TypeScript/pull/26349\n // TODO - when the above PR lands; add type checking for the context.report `data` property\n return function createNamedRule<\n TOptions extends readonly Record<string, unknown>[],\n TMessageIds extends string,\n >({\n name,\n meta,\n ...rule\n }: Readonly<RuleWithMetaAndName<TOptions, TMessageIds>>): RuleModule<TOptions> {\n return createRule<TOptions, TMessageIds>({\n meta: {\n ...meta,\n docs: {\n ...meta.docs,\n url: urlCreator(name),\n },\n },\n ...rule,\n });\n };\n}\n\nfunction createRule<\n TOptions extends readonly Record<string, unknown>[],\n TMessageIds extends string,\n>({\n create,\n defaultOptions,\n meta,\n}: Readonly<RuleWithMeta<TOptions, TMessageIds>>): RuleModule<TOptions> {\n return {\n create: ((context: Readonly<RuleContext<TMessageIds, TOptions>>): RuleListener => {\n const optionsWithDefault = context.options.map((options, index) => {\n return {\n ...defaultOptions[index],\n ...options,\n };\n }) as unknown as TOptions;\n return create(context as never, optionsWithDefault);\n }) as unknown,\n defaultOptions,\n meta,\n } as unknown as RuleModule<TOptions>;\n}\n\nexport const createEslintRule = RuleCreator(\n (ruleName) => `${blobUrl}${ruleName}.ts`,\n) as unknown as <TOptions extends readonly unknown[], TMessageIds extends string>({\n name,\n meta,\n ...rule\n}: Readonly<RuleWithMetaAndName<TOptions, TMessageIds>>) => RuleModule<TOptions>;\n","import { anyOf, createRegExp, digit, letter, oneOrMore } from 'magic-regexp';\nimport { match, P } from 'ts-pattern';\n\nimport { createEslintRule } from '../utils';\n\nconst prefix = anyOf('T', '$').at.lineStart();\nconst initial = letter.uppercase;\nconst remainder = oneOrMore(letter);\nconst digits = digit.times.any().at.lineEnd();\n\nconst PrefixRegex = createRegExp(prefix);\nconst InitialRegex = createRegExp(prefix, initial);\nconst RemainderRegex = createRegExp(prefix, initial, remainder);\nconst TypeParamRegex = createRegExp(prefix, initial, remainder, digits);\n\ntype MessageId = (typeof MessageId)[keyof typeof MessageId];\nconst MessageId = {\n prefix: 'prefix',\n initial: 'initial',\n remainder: 'remainder',\n regex: 'regex',\n} as const;\n\nexport const RULE_NAME = 'type-param-names';\n\nexport const typeParamNames = createEslintRule<[], MessageId>({\n name: RULE_NAME,\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Enforce giving proper names to type parameters when there are two or more',\n },\n schema: [],\n messages: {\n prefix: 'Type parameter {{name}} should have a prefix of \"T\" or \"$\"',\n initial: \"Type parameter {{name}}'s name should start with an uppercase letter\",\n remainder: \"Type parameter {{name}}'s name should contain at least one lowercase letter\",\n regex: 'Type parameter {{name}} should match the regex {{regex}}',\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n TSTypeParameterDeclaration(node) {\n const { params } = node;\n\n if (params.length === 1 && params.at(0)?.name.name === 'T') return;\n\n for (const param of params) {\n const { name } = param.name;\n\n const messageId = match(name)\n .with(P.string.regex(TypeParamRegex), () => false as const)\n .with(P.not(P.string.regex(PrefixRegex)), () => MessageId.prefix)\n .with(P.not(P.string.regex(InitialRegex)), () => MessageId.initial)\n .with(P.not(P.string.regex(RemainderRegex)), () => MessageId.remainder)\n .otherwise(() => false as const);\n\n if (messageId) {\n context.report({\n node: param,\n messageId,\n data: { name },\n });\n }\n }\n },\n };\n },\n});\n","import { typeParamNames } from './type-param-names';\n\nexport const rules = {\n 'type-param-names': typeParamNames,\n};\n","import type { FlatConfig } from '@typescript-eslint/utils/ts-eslint';\nimport type { ESLint, Linter } from 'eslint';\n\nimport { version } from '../package.json';\n\nimport { recommended } from './configs/recommended';\nimport { rules } from './rules';\n\nconst plugin = {\n meta: {\n name: '@2digits',\n version,\n },\n rules,\n configs: {\n recommended: {\n plugins: {\n get '@2digits'(): ESLint.Plugin {\n return plugin;\n },\n set '@2digits'(_) {},\n },\n rules: recommended.rules as Record<string, Linter.RuleEntry<[]>>,\n },\n },\n} satisfies FlatConfig.Plugin;\n\nexport default plugin;\n\ntype RuleDefinitions = (typeof plugin)['rules'];\n\nexport type RuleOptions = {\n [K in keyof RuleDefinitions]: RuleDefinitions[K]['defaultOptions'];\n};\n\nexport type Rules = {\n [K in keyof RuleOptions]: Linter.RuleEntry<RuleOptions[K]>;\n};\n"]}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { anyOf, letter, oneOrMore, digit, createRegExp } from 'magic-regexp';
2
2
  import { match, P } from 'ts-pattern';
3
3
 
4
- var f="@2digits/eslint-plugin";var a="2.2.8";var y={url:"https://github.com/2digits-agency/configs",directory:"packages/eslint-plugin"};var x={rules:{"@2digits/type-param-names":"error"}};var I=`${y.url}/blob/${f}@${a}/packages/eslint/src/rules/`;function E(e){return function({name:s,meta:t,...i}){return v({meta:{...t,docs:{...t.docs,url:e(s)}},...i})}}function v({create:e,defaultOptions:r,meta:s}){return {create:t=>{let i=t.options.map((o,k)=>({...r[k],...o}));return e(t,i)},defaultOptions:r,meta:s}}var R=E(e=>`${I}${e}.ts`);var u=anyOf("T","$").at.lineStart(),g=letter.uppercase,h=oneOrMore(letter),N=digit.times.any().at.lineEnd(),j=createRegExp(u),D=createRegExp(u,g),W=createRegExp(u,g,h),A=createRegExp(u,g,h,N),c={prefix:"prefix",initial:"initial",remainder:"remainder",regex:"regex"},C="type-param-names",M=R({name:C,meta:{type:"suggestion",docs:{description:"Enforce giving proper names to type parameters when there are two or more"},schema:[],messages:{prefix:'Type parameter {{name}} should have a prefix of "T" or "$"',initial:"Type parameter {{name}}'s name should start with an uppercase letter",remainder:"Type parameter {{name}}'s name should contain at least one lowercase letter",regex:"Type parameter {{name}} should match the regex {{regex}}"}},defaultOptions:[],create(e){return {TSTypeParameterDeclaration(r){let{params:s}=r;if(!(s.length===1&&s.at(0)?.name.name==="T"))for(let t of s){let{name:i}=t.name,o=match(i).with(P.string.regex(A),()=>!1).with(P.not(P.string.regex(j)),()=>c.prefix).with(P.not(P.string.regex(D)),()=>c.initial).with(P.not(P.string.regex(W)),()=>c.remainder).otherwise(()=>!1);o&&e.report({node:t,messageId:o,data:{name:i}});}}}}});var w={"type-param-names":M};var O={meta:{name:"@2digits",version:a},rules:w,configs:{recommended:{plugins:{get"@2digits"(){return O},set"@2digits"(e){}},rules:x.rules}}},te=O;
4
+ var f="@2digits/eslint-plugin";var a="2.3.0";var y={url:"https://github.com/2digits-agency/configs",directory:"packages/eslint-plugin"};var x={rules:{"@2digits/type-param-names":"error"}};var I=`${y.url}/blob/${f}@${a}/packages/eslint/src/rules/`;function E(e){return function({name:s,meta:t,...i}){return v({meta:{...t,docs:{...t.docs,url:e(s)}},...i})}}function v({create:e,defaultOptions:r,meta:s}){return {create:t=>{let i=t.options.map((o,k)=>({...r[k],...o}));return e(t,i)},defaultOptions:r,meta:s}}var R=E(e=>`${I}${e}.ts`);var u=anyOf("T","$").at.lineStart(),g=letter.uppercase,h=oneOrMore(letter),N=digit.times.any().at.lineEnd(),j=createRegExp(u),D=createRegExp(u,g),W=createRegExp(u,g,h),A=createRegExp(u,g,h,N),c={prefix:"prefix",initial:"initial",remainder:"remainder",regex:"regex"},C="type-param-names",M=R({name:C,meta:{type:"suggestion",docs:{description:"Enforce giving proper names to type parameters when there are two or more"},schema:[],messages:{prefix:'Type parameter {{name}} should have a prefix of "T" or "$"',initial:"Type parameter {{name}}'s name should start with an uppercase letter",remainder:"Type parameter {{name}}'s name should contain at least one lowercase letter",regex:"Type parameter {{name}} should match the regex {{regex}}"}},defaultOptions:[],create(e){return {TSTypeParameterDeclaration(r){let{params:s}=r;if(!(s.length===1&&s.at(0)?.name.name==="T"))for(let t of s){let{name:i}=t.name,o=match(i).with(P.string.regex(A),()=>!1).with(P.not(P.string.regex(j)),()=>c.prefix).with(P.not(P.string.regex(D)),()=>c.initial).with(P.not(P.string.regex(W)),()=>c.remainder).otherwise(()=>!1);o&&e.report({node:t,messageId:o,data:{name:i}});}}}}});var w={"type-param-names":M};var O={meta:{name:"@2digits",version:a},rules:w,configs:{recommended:{plugins:{get"@2digits"(){return O},set"@2digits"(e){}},rules:x.rules}}},te=O;
5
5
 
6
6
  export { te as default };
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/configs/recommended.ts","../src/utils/index.ts","../src/rules/type-param-names.ts","../src/rules/index.ts","../src/index.ts"],"names":["name","version","repository","recommended","blobUrl","RuleCreator","urlCreator","meta","rule","createRule","create","defaultOptions","context","optionsWithDefault","options","index","createEslintRule","ruleName","prefix","anyOf","initial","letter","remainder","oneOrMore","digits","digit","PrefixRegex","createRegExp","InitialRegex","RemainderRegex","TypeParamRegex","MessageId","RULE_NAME","typeParamNames","node","params","param","messageId","match","P","rules","plugin","_","src_default"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@2digits/eslint-plugin\",\n \"description\": \"An eslint plugin that provides a set of rules to enforce best practices for 2digits projects\",\n \"version\": \"2.2.8\",\n \"type\": \"module\",\n \"repository\": {\n \"url\": \"https://github.com/2digits-agency/configs\",\n \"directory\": \"packages/eslint-plugin\"\n },\n \"license\": \"MIT\",\n \"public\": true,\n \"sideEffects\": false,\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"import\": {\n \"default\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"require\": {\n \"default\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.cts\"\n }\n }\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint .\",\n \"types\": \"tsc --noEmit\",\n \"test\": \"vitest --run\"\n },\n \"keywords\": [\n \"eslint\",\n \"eslint-plugin\",\n \"2digits\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"8.3.0\",\n \"eslint\": \"9.9.1\",\n \"magic-regexp\": \"0.8.0\",\n \"ts-pattern\": \"5.3.1\"\n },\n \"devDependencies\": {\n \"@2digits/tsconfig\": \"workspace:*\",\n \"@typescript-eslint/parser\": \"8.3.0\",\n \"eslint-vitest-rule-tester\": \"0.6.1\",\n \"tsup\": \"8.2.4\",\n \"typescript\": \"5.5.4\",\n \"vitest\": \"2.0.5\"\n }\n}\n","import type { Linter } from 'eslint';\n\nimport type { rules } from '../rules';\n\nexport const recommended = {\n rules: {\n '@2digits/type-param-names': 'error' as const,\n } satisfies Record<`@2digits/${keyof typeof rules}`, Linter.RuleEntry<[]>>,\n};\n","import type {\n RuleListener,\n RuleWithMeta,\n RuleWithMetaAndName,\n} from '@typescript-eslint/utils/eslint-utils';\nimport type { RuleContext } from '@typescript-eslint/utils/ts-eslint';\nimport type { Rule } from 'eslint';\n\nimport { name, repository, version } from '../../package.json';\n\nconst blobUrl = `${repository.url}/blob/${name}@${version}/packages/eslint/src/rules/`;\n\n/** @public */\nexport interface RuleModule<T extends readonly unknown[]> extends Rule.RuleModule {\n defaultOptions: T;\n}\n\n/**\n * Creates reusable function to create rules with default options and docs URLs.\n *\n * @param urlCreator Creates a documentation URL for a given rule name.\n * @returns Function to create a rule with the docs URL format.\n */\nfunction RuleCreator(urlCreator: (name: string) => string) {\n // This function will get much easier to call when this is merged https://github.com/Microsoft/TypeScript/pull/26349\n // TODO - when the above PR lands; add type checking for the context.report `data` property\n return function createNamedRule<\n TOptions extends readonly Record<string, unknown>[],\n TMessageIds extends string,\n >({\n name,\n meta,\n ...rule\n }: Readonly<RuleWithMetaAndName<TOptions, TMessageIds>>): RuleModule<TOptions> {\n return createRule<TOptions, TMessageIds>({\n meta: {\n ...meta,\n docs: {\n ...meta.docs,\n url: urlCreator(name),\n },\n },\n ...rule,\n });\n };\n}\n\nfunction createRule<\n TOptions extends readonly Record<string, unknown>[],\n TMessageIds extends string,\n>({\n create,\n defaultOptions,\n meta,\n}: Readonly<RuleWithMeta<TOptions, TMessageIds>>): RuleModule<TOptions> {\n return {\n create: ((context: Readonly<RuleContext<TMessageIds, TOptions>>): RuleListener => {\n const optionsWithDefault = context.options.map((options, index) => {\n return {\n ...defaultOptions[index],\n ...options,\n };\n }) as unknown as TOptions;\n return create(context as never, optionsWithDefault);\n }) as unknown,\n defaultOptions,\n meta,\n } as unknown as RuleModule<TOptions>;\n}\n\nexport const createEslintRule = RuleCreator(\n (ruleName) => `${blobUrl}${ruleName}.ts`,\n) as unknown as <TOptions extends readonly unknown[], TMessageIds extends string>({\n name,\n meta,\n ...rule\n}: Readonly<RuleWithMetaAndName<TOptions, TMessageIds>>) => RuleModule<TOptions>;\n","import { anyOf, createRegExp, digit, letter, oneOrMore } from 'magic-regexp';\nimport { match, P } from 'ts-pattern';\n\nimport { createEslintRule } from '../utils';\n\nconst prefix = anyOf('T', '$').at.lineStart();\nconst initial = letter.uppercase;\nconst remainder = oneOrMore(letter);\nconst digits = digit.times.any().at.lineEnd();\n\nconst PrefixRegex = createRegExp(prefix);\nconst InitialRegex = createRegExp(prefix, initial);\nconst RemainderRegex = createRegExp(prefix, initial, remainder);\nconst TypeParamRegex = createRegExp(prefix, initial, remainder, digits);\n\ntype MessageId = (typeof MessageId)[keyof typeof MessageId];\nconst MessageId = {\n prefix: 'prefix',\n initial: 'initial',\n remainder: 'remainder',\n regex: 'regex',\n} as const;\n\nexport const RULE_NAME = 'type-param-names';\n\nexport const typeParamNames = createEslintRule<[], MessageId>({\n name: RULE_NAME,\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Enforce giving proper names to type parameters when there are two or more',\n },\n schema: [],\n messages: {\n prefix: 'Type parameter {{name}} should have a prefix of \"T\" or \"$\"',\n initial: \"Type parameter {{name}}'s name should start with an uppercase letter\",\n remainder: \"Type parameter {{name}}'s name should contain at least one lowercase letter\",\n regex: 'Type parameter {{name}} should match the regex {{regex}}',\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n TSTypeParameterDeclaration(node) {\n const { params } = node;\n\n if (params.length === 1 && params.at(0)?.name.name === 'T') return;\n\n for (const param of params) {\n const { name } = param.name;\n\n const messageId = match(name)\n .with(P.string.regex(TypeParamRegex), () => false as const)\n .with(P.not(P.string.regex(PrefixRegex)), () => MessageId.prefix)\n .with(P.not(P.string.regex(InitialRegex)), () => MessageId.initial)\n .with(P.not(P.string.regex(RemainderRegex)), () => MessageId.remainder)\n .otherwise(() => false as const);\n\n if (messageId) {\n context.report({\n node: param,\n messageId,\n data: { name },\n });\n }\n }\n },\n };\n },\n});\n","import { typeParamNames } from './type-param-names';\n\nexport const rules = {\n 'type-param-names': typeParamNames,\n};\n","import type { FlatConfig } from '@typescript-eslint/utils/ts-eslint';\nimport type { ESLint, Linter } from 'eslint';\n\nimport { version } from '../package.json';\n\nimport { recommended } from './configs/recommended';\nimport { rules } from './rules';\n\nconst plugin = {\n meta: {\n name: '@2digits',\n version,\n },\n rules,\n configs: {\n recommended: {\n plugins: {\n get '@2digits'(): ESLint.Plugin {\n return plugin;\n },\n set '@2digits'(_) {},\n },\n rules: recommended.rules as Record<string, Linter.RuleEntry<[]>>,\n },\n },\n} satisfies FlatConfig.Plugin;\n\nexport default plugin;\n\ntype RuleDefinitions = (typeof plugin)['rules'];\n\nexport type RuleOptions = {\n [K in keyof RuleDefinitions]: RuleDefinitions[K]['defaultOptions'];\n};\n\nexport type Rules = {\n [K in keyof RuleOptions]: Linter.RuleEntry<RuleOptions[K]>;\n};\n"]}
1
+ {"version":3,"sources":["../package.json","../src/configs/recommended.ts","../src/utils/index.ts","../src/rules/type-param-names.ts","../src/rules/index.ts","../src/index.ts"],"names":["name","version","repository","recommended","blobUrl","RuleCreator","urlCreator","meta","rule","createRule","create","defaultOptions","context","optionsWithDefault","options","index","createEslintRule","ruleName","prefix","anyOf","initial","letter","remainder","oneOrMore","digits","digit","PrefixRegex","createRegExp","InitialRegex","RemainderRegex","TypeParamRegex","MessageId","RULE_NAME","typeParamNames","node","params","param","messageId","match","P","rules","plugin","_","src_default"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@2digits/eslint-plugin\",\n \"description\": \"An eslint plugin that provides a set of rules to enforce best practices for 2digits projects\",\n \"version\": \"2.3.0\",\n \"type\": \"module\",\n \"repository\": {\n \"url\": \"https://github.com/2digits-agency/configs\",\n \"directory\": \"packages/eslint-plugin\"\n },\n \"license\": \"MIT\",\n \"public\": true,\n \"sideEffects\": false,\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"import\": {\n \"default\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"require\": {\n \"default\": \"./dist/index.cjs\",\n \"types\": \"./dist/index.d.cts\"\n }\n }\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint .\",\n \"types\": \"tsc --noEmit\",\n \"test\": \"vitest --run\"\n },\n \"keywords\": [\n \"eslint\",\n \"eslint-plugin\",\n \"2digits\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"8.5.0\",\n \"eslint\": \"9.10.0\",\n \"magic-regexp\": \"0.8.0\",\n \"ts-pattern\": \"5.3.1\"\n },\n \"devDependencies\": {\n \"@2digits/tsconfig\": \"workspace:*\",\n \"@typescript-eslint/parser\": \"8.5.0\",\n \"eslint-vitest-rule-tester\": \"0.6.1\",\n \"tsup\": \"8.2.4\",\n \"typescript\": \"5.6.2\",\n \"vitest\": \"2.0.5\"\n }\n}\n","import type { Linter } from 'eslint';\n\nimport type { rules } from '../rules';\n\nexport const recommended = {\n rules: {\n '@2digits/type-param-names': 'error' as const,\n } satisfies Record<`@2digits/${keyof typeof rules}`, Linter.RuleEntry<[]>>,\n};\n","import type {\n RuleListener,\n RuleWithMeta,\n RuleWithMetaAndName,\n} from '@typescript-eslint/utils/eslint-utils';\nimport type { RuleContext } from '@typescript-eslint/utils/ts-eslint';\nimport type { Rule } from 'eslint';\n\nimport { name, repository, version } from '../../package.json';\n\nconst blobUrl = `${repository.url}/blob/${name}@${version}/packages/eslint/src/rules/`;\n\n/** @public */\nexport interface RuleModule<T extends readonly unknown[]> extends Rule.RuleModule {\n defaultOptions: T;\n}\n\n/**\n * Creates reusable function to create rules with default options and docs URLs.\n *\n * @param urlCreator Creates a documentation URL for a given rule name.\n * @returns Function to create a rule with the docs URL format.\n */\nfunction RuleCreator(urlCreator: (name: string) => string) {\n // This function will get much easier to call when this is merged https://github.com/Microsoft/TypeScript/pull/26349\n // TODO - when the above PR lands; add type checking for the context.report `data` property\n return function createNamedRule<\n TOptions extends readonly Record<string, unknown>[],\n TMessageIds extends string,\n >({\n name,\n meta,\n ...rule\n }: Readonly<RuleWithMetaAndName<TOptions, TMessageIds>>): RuleModule<TOptions> {\n return createRule<TOptions, TMessageIds>({\n meta: {\n ...meta,\n docs: {\n ...meta.docs,\n url: urlCreator(name),\n },\n },\n ...rule,\n });\n };\n}\n\nfunction createRule<\n TOptions extends readonly Record<string, unknown>[],\n TMessageIds extends string,\n>({\n create,\n defaultOptions,\n meta,\n}: Readonly<RuleWithMeta<TOptions, TMessageIds>>): RuleModule<TOptions> {\n return {\n create: ((context: Readonly<RuleContext<TMessageIds, TOptions>>): RuleListener => {\n const optionsWithDefault = context.options.map((options, index) => {\n return {\n ...defaultOptions[index],\n ...options,\n };\n }) as unknown as TOptions;\n return create(context as never, optionsWithDefault);\n }) as unknown,\n defaultOptions,\n meta,\n } as unknown as RuleModule<TOptions>;\n}\n\nexport const createEslintRule = RuleCreator(\n (ruleName) => `${blobUrl}${ruleName}.ts`,\n) as unknown as <TOptions extends readonly unknown[], TMessageIds extends string>({\n name,\n meta,\n ...rule\n}: Readonly<RuleWithMetaAndName<TOptions, TMessageIds>>) => RuleModule<TOptions>;\n","import { anyOf, createRegExp, digit, letter, oneOrMore } from 'magic-regexp';\nimport { match, P } from 'ts-pattern';\n\nimport { createEslintRule } from '../utils';\n\nconst prefix = anyOf('T', '$').at.lineStart();\nconst initial = letter.uppercase;\nconst remainder = oneOrMore(letter);\nconst digits = digit.times.any().at.lineEnd();\n\nconst PrefixRegex = createRegExp(prefix);\nconst InitialRegex = createRegExp(prefix, initial);\nconst RemainderRegex = createRegExp(prefix, initial, remainder);\nconst TypeParamRegex = createRegExp(prefix, initial, remainder, digits);\n\ntype MessageId = (typeof MessageId)[keyof typeof MessageId];\nconst MessageId = {\n prefix: 'prefix',\n initial: 'initial',\n remainder: 'remainder',\n regex: 'regex',\n} as const;\n\nexport const RULE_NAME = 'type-param-names';\n\nexport const typeParamNames = createEslintRule<[], MessageId>({\n name: RULE_NAME,\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Enforce giving proper names to type parameters when there are two or more',\n },\n schema: [],\n messages: {\n prefix: 'Type parameter {{name}} should have a prefix of \"T\" or \"$\"',\n initial: \"Type parameter {{name}}'s name should start with an uppercase letter\",\n remainder: \"Type parameter {{name}}'s name should contain at least one lowercase letter\",\n regex: 'Type parameter {{name}} should match the regex {{regex}}',\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n TSTypeParameterDeclaration(node) {\n const { params } = node;\n\n if (params.length === 1 && params.at(0)?.name.name === 'T') return;\n\n for (const param of params) {\n const { name } = param.name;\n\n const messageId = match(name)\n .with(P.string.regex(TypeParamRegex), () => false as const)\n .with(P.not(P.string.regex(PrefixRegex)), () => MessageId.prefix)\n .with(P.not(P.string.regex(InitialRegex)), () => MessageId.initial)\n .with(P.not(P.string.regex(RemainderRegex)), () => MessageId.remainder)\n .otherwise(() => false as const);\n\n if (messageId) {\n context.report({\n node: param,\n messageId,\n data: { name },\n });\n }\n }\n },\n };\n },\n});\n","import { typeParamNames } from './type-param-names';\n\nexport const rules = {\n 'type-param-names': typeParamNames,\n};\n","import type { FlatConfig } from '@typescript-eslint/utils/ts-eslint';\nimport type { ESLint, Linter } from 'eslint';\n\nimport { version } from '../package.json';\n\nimport { recommended } from './configs/recommended';\nimport { rules } from './rules';\n\nconst plugin = {\n meta: {\n name: '@2digits',\n version,\n },\n rules,\n configs: {\n recommended: {\n plugins: {\n get '@2digits'(): ESLint.Plugin {\n return plugin;\n },\n set '@2digits'(_) {},\n },\n rules: recommended.rules as Record<string, Linter.RuleEntry<[]>>,\n },\n },\n} satisfies FlatConfig.Plugin;\n\nexport default plugin;\n\ntype RuleDefinitions = (typeof plugin)['rules'];\n\nexport type RuleOptions = {\n [K in keyof RuleDefinitions]: RuleDefinitions[K]['defaultOptions'];\n};\n\nexport type Rules = {\n [K in keyof RuleOptions]: Linter.RuleEntry<RuleOptions[K]>;\n};\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@2digits/eslint-plugin",
3
3
  "description": "An eslint plugin that provides a set of rules to enforce best practices for 2digits projects",
4
- "version": "2.2.8",
4
+ "version": "2.3.0",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "url": "https://github.com/2digits-agency/configs",
@@ -34,18 +34,18 @@
34
34
  "dist"
35
35
  ],
36
36
  "dependencies": {
37
- "@typescript-eslint/utils": "8.3.0",
38
- "eslint": "9.9.1",
37
+ "@typescript-eslint/utils": "8.5.0",
38
+ "eslint": "9.10.0",
39
39
  "magic-regexp": "0.8.0",
40
40
  "ts-pattern": "5.3.1"
41
41
  },
42
42
  "devDependencies": {
43
- "@typescript-eslint/parser": "8.3.0",
43
+ "@typescript-eslint/parser": "8.5.0",
44
44
  "eslint-vitest-rule-tester": "0.6.1",
45
45
  "tsup": "8.2.4",
46
- "typescript": "5.5.4",
46
+ "typescript": "5.6.2",
47
47
  "vitest": "2.0.5",
48
- "@2digits/tsconfig": "0.5.1"
48
+ "@2digits/tsconfig": "0.6.0"
49
49
  },
50
50
  "scripts": {
51
51
  "build": "tsup",