@2digits/eslint-plugin 0.0.5 → 1.0.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.d.mts CHANGED
@@ -1,8 +1,8 @@
1
- import * as _typescript_eslint_utils_dist_ts_eslint_Rule from '@typescript-eslint/utils/dist/ts-eslint/Rule';
1
+ import { RuleModule, RuleListener } from '@typescript-eslint/utils/ts-eslint';
2
2
 
3
- declare const _default: {
3
+ declare const plugin: {
4
4
  rules: {
5
- 'type-param-names': _typescript_eslint_utils_dist_ts_eslint_Rule.RuleModule<"prefix" | "initial" | "remainder" | "regex", [], _typescript_eslint_utils_dist_ts_eslint_Rule.RuleListener>;
5
+ 'type-param-names': RuleModule<"prefix" | "initial" | "remainder" | "regex", [], RuleListener>;
6
6
  };
7
7
  configs: {
8
8
  recommended: {
@@ -14,4 +14,4 @@ declare const _default: {
14
14
  };
15
15
  };
16
16
 
17
- export { _default as default };
17
+ export { plugin as default };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import * as _typescript_eslint_utils_dist_ts_eslint_Rule from '@typescript-eslint/utils/dist/ts-eslint/Rule';
1
+ import { RuleModule, RuleListener } from '@typescript-eslint/utils/ts-eslint';
2
2
 
3
- declare const _default: {
3
+ declare const plugin: {
4
4
  rules: {
5
- 'type-param-names': _typescript_eslint_utils_dist_ts_eslint_Rule.RuleModule<"prefix" | "initial" | "remainder" | "regex", [], _typescript_eslint_utils_dist_ts_eslint_Rule.RuleListener>;
5
+ 'type-param-names': RuleModule<"prefix" | "initial" | "remainder" | "regex", [], RuleListener>;
6
6
  };
7
7
  configs: {
8
8
  recommended: {
@@ -14,4 +14,4 @@ declare const _default: {
14
14
  };
15
15
  };
16
16
 
17
- export { _default as default };
17
+ export { plugin as default };
package/dist/index.js CHANGED
@@ -4,8 +4,8 @@ var utils = require('@typescript-eslint/utils');
4
4
  var magicRegexp = require('magic-regexp');
5
5
  var tsPattern = require('ts-pattern');
6
6
 
7
- var l="@2digits/eslint-plugin";var f="0.0.5",c={url:"https://github.com/2digits-agency/configs",directory:"packages/eslint-plugin"};var u=utils.ESLintUtils.RuleCreator(r=>`${c.url}/blob/${l}@${f}/packages/eslint/src/rules/${r}.ts`);var x={plugins:["@2digits"],rules:{"@2digits/type-param-names":"error"}};var s=magicRegexp.anyOf("T","$").at.lineStart(),p=magicRegexp.letter.uppercase,h=magicRegexp.oneOrMore(magicRegexp.letter),j=magicRegexp.digit.times.any().at.lineEnd(),k=magicRegexp.createRegExp(s),M=magicRegexp.createRegExp(s,p),$=magicRegexp.createRegExp(s,p,h),P=magicRegexp.createRegExp(s,p,h,j),a={prefix:"prefix",initial:"initial",remainder:"remainder",regex:"regex"},R=u({name:__filename,meta:{type:"suggestion",docs:{description:"Enforce giving proper names to type parameters when there are two or more",recommended:"error"},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(r){return {TSTypeParameterDeclaration(w){let{params:n}=w;if(!(n.length===1&&n.at(0)?.name.name==="T"))for(let m of n){let{name:d}=m.name,g=tsPattern.match(d).with(tsPattern.P.string.regex(P),()=>!1).with(tsPattern.P.not(tsPattern.P.string.regex(k)),()=>a.prefix).with(tsPattern.P.not(tsPattern.P.string.regex(M)),()=>a.initial).with(tsPattern.P.not(tsPattern.P.string.regex($)),()=>a.remainder).otherwise(()=>!1);g&&r.report({node:m,messageId:g,data:{name:d}});}}}}});var T={"type-param-names":R};var V={rules:T,configs:{recommended:x}};
7
+ var c="@2digits/eslint-plugin";var g="1.0.0",f={url:"https://github.com/2digits-agency/configs",directory:"packages/eslint-plugin"};var u=utils.ESLintUtils.RuleCreator(r=>`${f.url}/blob/${c}@${g}/packages/eslint/src/rules/${r}.ts`);var y={plugins:["@2digits"],rules:{"@2digits/type-param-names":"error"}};var i=magicRegexp.anyOf("T","$").at.lineStart(),p=magicRegexp.letter.uppercase,h=magicRegexp.oneOrMore(magicRegexp.letter),M=magicRegexp.digit.times.any().at.lineEnd(),b=magicRegexp.createRegExp(i),j=magicRegexp.createRegExp(i,p),k=magicRegexp.createRegExp(i,p,h),$=magicRegexp.createRegExp(i,p,h,M),a={prefix:"prefix",initial:"initial",remainder:"remainder",regex:"regex"},R=u({name:__filename,meta:{type:"suggestion",docs:{description:"Enforce giving proper names to type parameters when there are two or more",recommended:"recommended"},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(r){return {TSTypeParameterDeclaration(w){let{params:n}=w;if(!(n.length===1&&n.at(0)?.name.name==="T"))for(let m of n){let{name:l}=m.name,d=tsPattern.match(l).with(tsPattern.P.string.regex($),()=>!1).with(tsPattern.P.not(tsPattern.P.string.regex(b)),()=>a.prefix).with(tsPattern.P.not(tsPattern.P.string.regex(j)),()=>a.initial).with(tsPattern.P.not(tsPattern.P.string.regex(k)),()=>a.remainder).otherwise(()=>!1);d&&r.report({node:m,messageId:d,data:{name:l}});}}}}});var T={"type-param-names":R};var N={rules:T,configs:{recommended:y}},Q=N;
8
8
 
9
- module.exports = V;
9
+ module.exports = Q;
10
10
  //# sourceMappingURL=out.js.map
11
11
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/index.ts","../package.json","../src/configs/recommended.ts","../src/rules/type-param-names.ts","../src/rules/index.ts","../src/index.ts"],"names":["ESLintUtils","name","version","repository","createRule","rule","recommended_default","anyOf","createRegExp","digit","letter","oneOrMore","match","P","prefix","initial","remainder","digits","PrefixRegex","InitialRegex","RemainderRegex","TypeParamRegex","MessageId","type_param_names_default","context","node","params","param","messageId","rules_default","src_default"],"mappings":"AAAA,OAAS,eAAAA,MAAmB,2BCC1B,IAAAC,EAAQ,yBAER,IAAAC,EAAW,QACXC,EAAc,CACZ,IAAO,4CACP,UAAa,wBACf,EDFK,IAAMC,EAAaJ,EAAY,YACnCK,GAAS,GAAGF,EAAW,GAAG,SAASF,CAAI,IAAIC,CAAO,8BAA8BG,CAAI,KACvF,EEFA,IAAOC,EAAqB,CAC1B,QAAS,CAAC,UAAU,EACpB,MAAO,CACL,4BAA6B,OAC/B,CACF,ECVA,OAAS,SAAAC,EAAO,gBAAAC,EAAc,SAAAC,EAAO,UAAAC,EAAQ,aAAAC,MAAiB,eAC9D,OAAS,SAAAC,EAAO,KAAAC,MAAS,aAIzB,IAAMC,EAASP,EAAM,IAAK,GAAG,EAAE,GAAG,UAAU,EACtCQ,EAAUL,EAAO,UACjBM,EAAYL,EAAUD,CAAM,EAC5BO,EAASR,EAAM,MAAM,IAAI,EAAE,GAAG,QAAQ,EAEtCS,EAAcV,EAAaM,CAAM,EACjCK,EAAeX,EAAaM,EAAQC,CAAO,EAC3CK,EAAiBZ,EAAaM,EAAQC,EAASC,CAAS,EACxDK,EAAiBb,EAAaM,EAAQC,EAASC,EAAWC,CAAM,EAGhEK,EAAY,CAChB,OAAQ,SACR,QAAS,UACT,UAAW,YACX,MAAO,OACT,EAEOC,EAAQnB,EAA0B,CACvC,KAAM,WACN,KAAM,CACJ,KAAM,aACN,KAAM,CACJ,YAAa,4EACb,YAAa,OACf,EACA,OAAQ,CAAC,EACT,SAAU,CACR,OAAQ,6DACR,QAAS,uEACT,UAAW,8EACX,MAAO,0DACT,CACF,EACA,eAAgB,CAAC,EACjB,OAAOoB,EAAS,CACd,MAAO,CACL,2BAA2BC,EAAM,CAC/B,GAAM,CAAE,OAAAC,CAAO,EAAID,EAEnB,GAAI,EAAAC,EAAO,SAAW,GAAKA,EAAO,GAAG,CAAC,GAAG,KAAK,OAAS,KAEvD,QAAWC,KAASD,EAAQ,CAC1B,GAAM,CAAE,KAAAzB,CAAK,EAAI0B,EAAM,KAEjBC,EAAYhB,EAAMX,CAAI,EACzB,KAAKY,EAAE,OAAO,MAAMQ,CAAc,EAAG,IAAM,EAAc,EACzD,KAAKR,EAAE,IAAIA,EAAE,OAAO,MAAMK,CAAW,CAAC,EAAG,IAAMI,EAAU,MAAM,EAC/D,KAAKT,EAAE,IAAIA,EAAE,OAAO,MAAMM,CAAY,CAAC,EAAG,IAAMG,EAAU,OAAO,EACjE,KAAKT,EAAE,IAAIA,EAAE,OAAO,MAAMO,CAAc,CAAC,EAAG,IAAME,EAAU,SAAS,EACrE,UAAU,IAAM,EAAc,EAEjCM,GACEJ,EAAQ,OAAO,CACb,KAAMG,EACN,UAAAC,EACA,KAAM,CAAE,KAAA3B,CAAK,CACf,CAAC,CACL,CACF,CACF,CACF,CACF,CAAC,ECjED,IAAO4B,EAAQ,CACb,mBAAoBN,CACtB,ECDA,IAAOO,EAAQ,CACb,MAAAD,EACA,QAAS,CACP,YAAAvB,CACF,CACF","sourcesContent":["import { ESLintUtils } from '@typescript-eslint/utils';\nimport type { ESLintConfig } from 'eslint-define-config';\n\nimport { name, repository, version } from '../../package.json';\n\nexport const createRule = ESLintUtils.RuleCreator(\n (rule) => `${repository.url}/blob/${name}@${version}/packages/eslint/src/rules/${rule}.ts`,\n);\n\nexport function defineConfig<TConfig extends ESLintConfig>(config: TConfig): TConfig {\n return config;\n}\n","{\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\": \"0.0.5\",\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.mjs\",\n \"types\": \"./dist/index.d.mts\"\n },\n \"require\": {\n \"default\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n }\n }\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint --ignore-path ../../.gitignore .\",\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 \"@types/eslint\": \"^8.44.7\",\n \"@typescript-eslint/utils\": \"5.62.0\",\n \"eslint\": \"^8.54.0\",\n \"magic-regexp\": \"^0.7.0\",\n \"ts-pattern\": \"^5.0.5\"\n },\n \"devDependencies\": {\n \"@2digits/tsconfig\": \"*\",\n \"eslint-define-config\": \"^2.0.0\",\n \"tsup\": \"^8.0.0\",\n \"turbo\": \"^1.10.16\",\n \"typescript\": \"^5.2.2\",\n \"vitest\": \"^0.34.0\"\n },\n \"eslintConfig\": {\n \"extends\": \"@2digits\",\n \"ignorePatterns\": [\n \"fixtures\"\n ]\n }\n}\n","import type { Rules } from 'eslint-define-config';\n\nimport type Rule from '../rules';\nimport { defineConfig } from '../utils';\n\nexport default defineConfig({\n plugins: ['@2digits'],\n rules: {\n '@2digits/type-param-names': 'error',\n } satisfies Record<`@2digits/${keyof typeof Rule}`, Rules[string]>,\n});\n","import { anyOf, createRegExp, digit, letter, oneOrMore } from 'magic-regexp';\nimport { match, P } from 'ts-pattern';\n\nimport { createRule } 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 default createRule<[], MessageId>({\n name: __filename,\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Enforce giving proper names to type parameters when there are two or more',\n recommended: 'error',\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 messageId &&\n context.report({\n node: param,\n messageId,\n data: { name },\n });\n }\n },\n };\n },\n});\n","import typeParamNames from './type-param-names';\n\nexport default {\n 'type-param-names': typeParamNames,\n};\n","import recommended from './configs/recommended';\nimport rules from './rules';\n\nexport default {\n rules,\n configs: {\n recommended,\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/index.ts","../package.json","../src/configs/recommended.ts","../src/rules/type-param-names.ts","../src/rules/index.ts","../src/index.ts"],"names":["ESLintUtils","name","version","repository","createRule","rule","recommended","anyOf","createRegExp","digit","letter","oneOrMore","match","P","prefix","initial","remainder","digits","PrefixRegex","InitialRegex","RemainderRegex","TypeParamRegex","MessageId","typeParamNames","context","node","params","param","messageId","rules","plugin","src_default"],"mappings":"AAAA,OAAS,eAAAA,MAAmB,2BCC1B,IAAAC,EAAQ,yBAER,IAAAC,EAAW,QACXC,EAAc,CACZ,IAAO,4CACP,UAAa,wBACf,EDFK,IAAMC,EAAaJ,EAAY,YACnCK,GAAS,GAAGF,EAAW,GAAG,SAASF,CAAI,IAAIC,CAAO,8BAA8BG,CAAI,KACvF,EEFO,IAAMC,EAA2B,CACtC,QAAS,CAAC,UAAU,EACpB,MAAO,CACL,4BAA6B,OAC/B,CACF,ECRA,OAAS,SAAAC,EAAO,gBAAAC,EAAc,SAAAC,EAAO,UAAAC,EAAQ,aAAAC,MAAiB,eAC9D,OAAS,SAAAC,EAAO,KAAAC,MAAS,aAMzB,IAAMC,EAASP,EAAM,IAAK,GAAG,EAAE,GAAG,UAAU,EACtCQ,EAAUL,EAAO,UACjBM,EAAYL,EAAUD,CAAM,EAC5BO,EAASR,EAAM,MAAM,IAAI,EAAE,GAAG,QAAQ,EAEtCS,EAAcV,EAAaM,CAAM,EACjCK,EAAeX,EAAaM,EAAQC,CAAO,EAC3CK,EAAiBZ,EAAaM,EAAQC,EAASC,CAAS,EACxDK,EAAiBb,EAAaM,EAAQC,EAASC,EAAWC,CAAM,EAGhEK,EAAY,CAChB,OAAQ,SACR,QAAS,UACT,UAAW,YACX,MAAO,OACT,EAEaC,EAAiBnB,EAA0B,CACtD,KAAM,WACN,KAAM,CACJ,KAAM,aACN,KAAM,CACJ,YAAa,4EACb,YAAa,aACf,EACA,OAAQ,CAAC,EACT,SAAU,CACR,OAAQ,6DACR,QAAS,uEACT,UAAW,8EACX,MAAO,0DACT,CACF,EACA,eAAgB,CAAC,EACjB,OAAOoB,EAAS,CACd,MAAO,CACL,2BAA2BC,EAAM,CAC/B,GAAM,CAAE,OAAAC,CAAO,EAAID,EAEnB,GAAI,EAAAC,EAAO,SAAW,GAAKA,EAAO,GAAG,CAAC,GAAG,KAAK,OAAS,KAEvD,QAAWC,KAASD,EAAQ,CAC1B,GAAM,CAAE,KAAAzB,CAAK,EAAI0B,EAAM,KAEjBC,EAAYhB,EAAMX,CAAI,EACzB,KAAKY,EAAE,OAAO,MAAMQ,CAAc,EAAG,IAAM,EAAc,EACzD,KAAKR,EAAE,IAAIA,EAAE,OAAO,MAAMK,CAAW,CAAC,EAAG,IAAMI,EAAU,MAAM,EAC/D,KAAKT,EAAE,IAAIA,EAAE,OAAO,MAAMM,CAAY,CAAC,EAAG,IAAMG,EAAU,OAAO,EACjE,KAAKT,EAAE,IAAIA,EAAE,OAAO,MAAMO,CAAc,CAAC,EAAG,IAAME,EAAU,SAAS,EACrE,UAAU,IAAM,EAAc,EAEjCM,GACEJ,EAAQ,OAAO,CACb,KAAMG,EACN,UAAAC,EACA,KAAM,CAAE,KAAA3B,CAAK,CACf,CAAC,CACL,CACF,CACF,CACF,CACF,CAAC,ECnEM,IAAM4B,EAAQ,CACnB,mBAAmCN,CACrC,ECHA,IAAMO,EAAS,CACb,MAAaD,EACb,QAAS,CACP,YAAAvB,CACF,CACF,EAEOyB,EAAQD","sourcesContent":["import { ESLintUtils } from '@typescript-eslint/utils';\nimport type { ESLintConfig } from 'eslint-define-config';\n\nimport { name, repository, version } from '../../package.json';\n\nexport const createRule = ESLintUtils.RuleCreator(\n (rule) => `${repository.url}/blob/${name}@${version}/packages/eslint/src/rules/${rule}.ts`,\n);\n\nexport function defineConfig<TConfig extends ESLintConfig>(config: TConfig): TConfig {\n return config;\n}\n","{\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\": \"1.0.0\",\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.mjs\",\n \"types\": \"./dist/index.d.mts\"\n },\n \"require\": {\n \"default\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n }\n }\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint --ignore-path ../../.gitignore .\",\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 \"@types/eslint\": \"^8.44.7\",\n \"@typescript-eslint/utils\": \"6.12.0\",\n \"eslint\": \"^8.54.0\",\n \"magic-regexp\": \"^0.7.0\",\n \"ts-pattern\": \"^5.0.5\"\n },\n \"devDependencies\": {\n \"@2digits/tsconfig\": \"*\",\n \"@typescript-eslint/rule-tester\": \"6.12.0\",\n \"eslint-define-config\": \"^2.0.0\",\n \"tsup\": \"^8.0.1\",\n \"turbo\": \"^1.10.16\",\n \"typescript\": \"^5.3.2\",\n \"vitest\": \"^0.34.6\"\n },\n \"eslintConfig\": {\n \"extends\": \"@2digits\",\n \"ignorePatterns\": [\n \"fixtures\"\n ]\n }\n}\n","import type { Rules } from 'eslint-define-config';\n\nimport type { rules } from '../rules';\nimport { defineConfig } from '../utils';\n\nexport const recommended = defineConfig({\n plugins: ['@2digits'],\n rules: {\n '@2digits/type-param-names': 'error',\n } satisfies Record<`@2digits/${keyof typeof rules}`, Rules[string]>,\n});\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type _ from '@typescript-eslint/utils/ts-eslint';\nimport { anyOf, createRegExp, digit, letter, oneOrMore } from 'magic-regexp';\nimport { match, P } from 'ts-pattern';\n\nimport { createRule } from '../utils';\n\nexport type { RuleListener, RuleModule } from '@typescript-eslint/utils/ts-eslint';\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 typeParamNames = createRule<[], MessageId>({\n name: __filename,\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Enforce giving proper names to type parameters when there are two or more',\n recommended: 'recommended',\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 messageId &&\n context.report({\n node: param,\n messageId,\n data: { name },\n });\n }\n },\n };\n },\n});\n","import * as typeParamNames from './type-param-names';\n\nexport type * from './type-param-names';\n\nexport const rules = {\n 'type-param-names': typeParamNames.typeParamNames,\n};\n","import { recommended } from './configs/recommended';\nimport * as rules from './rules';\n\nconst plugin = {\n rules: rules.rules,\n configs: {\n recommended,\n },\n};\n\nexport default plugin;\n"]}
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  import { fileURLToPath } from 'url';
2
2
  import { ESLintUtils } from '@typescript-eslint/utils';
3
3
  import { anyOf, letter, oneOrMore, digit, createRegExp } from 'magic-regexp';
4
- import { match, P as P$1 } from 'ts-pattern';
4
+ import { match, P } from 'ts-pattern';
5
5
 
6
- var E=()=>fileURLToPath(import.meta.url);var t=E();var f="@2digits/eslint-plugin";var c="0.0.5",u={url:"https://github.com/2digits-agency/configs",directory:"packages/eslint-plugin"};var x=ESLintUtils.RuleCreator(n=>`${u.url}/blob/${f}@${c}/packages/eslint/src/rules/${n}.ts`);var y={plugins:["@2digits"],rules:{"@2digits/type-param-names":"error"}};var s=anyOf("T","$").at.lineStart(),m=letter.uppercase,R=oneOrMore(letter),P=digit.times.any().at.lineEnd(),$=createRegExp(s),S=createRegExp(s,m),L=createRegExp(s,m,R),_=createRegExp(s,m,R,P),p={prefix:"prefix",initial:"initial",remainder:"remainder",regex:"regex"},T=x({name:t,meta:{type:"suggestion",docs:{description:"Enforce giving proper names to type parameters when there are two or more",recommended:"error"},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(n){return {TSTypeParameterDeclaration(v){let{params:o}=v;if(!(o.length===1&&o.at(0)?.name.name==="T"))for(let d of o){let{name:g}=d.name,l=match(g).with(P$1.string.regex(_),()=>!1).with(P$1.not(P$1.string.regex($)),()=>p.prefix).with(P$1.not(P$1.string.regex(S)),()=>p.initial).with(P$1.not(P$1.string.regex(L)),()=>p.remainder).otherwise(()=>!1);l&&n.report({node:d,messageId:l,data:{name:g}});}}}}});var w={"type-param-names":T};var ee={rules:w,configs:{recommended:y}};
6
+ var C=()=>fileURLToPath(import.meta.url);var t=C();var g="@2digits/eslint-plugin";var f="1.0.0",u={url:"https://github.com/2digits-agency/configs",directory:"packages/eslint-plugin"};var y=ESLintUtils.RuleCreator(n=>`${u.url}/blob/${g}@${f}/packages/eslint/src/rules/${n}.ts`);var x={plugins:["@2digits"],rules:{"@2digits/type-param-names":"error"}};var r=anyOf("T","$").at.lineStart(),m=letter.uppercase,R=oneOrMore(letter),k=digit.times.any().at.lineEnd(),$=createRegExp(r),L=createRegExp(r,m),S=createRegExp(r,m,R),_=createRegExp(r,m,R,k),p={prefix:"prefix",initial:"initial",remainder:"remainder",regex:"regex"},T=y({name:t,meta:{type:"suggestion",docs:{description:"Enforce giving proper names to type parameters when there are two or more",recommended:"recommended"},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(n){return {TSTypeParameterDeclaration(P$1){let{params:o}=P$1;if(!(o.length===1&&o.at(0)?.name.name==="T"))for(let l of o){let{name:d}=l.name,c=match(d).with(P.string.regex(_),()=>!1).with(P.not(P.string.regex($)),()=>p.prefix).with(P.not(P.string.regex(L)),()=>p.initial).with(P.not(P.string.regex(S)),()=>p.remainder).otherwise(()=>!1);c&&n.report({node:l,messageId:c,data:{name:d}});}}}}});var w={"type-param-names":T};var O={rules:w,configs:{recommended:x}},Z=O;
7
7
 
8
- export { ee as default };
8
+ export { Z as default };
9
9
  //# sourceMappingURL=out.js.map
10
10
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.0.0_postcss@8.4.31_typescript@5.2.2/node_modules/tsup/assets/esm_shims.js","../src/utils/index.ts","../package.json","../src/configs/recommended.ts","../src/rules/type-param-names.ts","../src/rules/index.ts","../src/index.ts"],"names":["fileURLToPath","getFilename","__filename","ESLintUtils","name","version","repository","createRule","rule","recommended_default","anyOf","createRegExp","digit","letter","oneOrMore","match","P","prefix","initial","remainder","digits","PrefixRegex","InitialRegex","RemainderRegex","TypeParamRegex","MessageId","type_param_names_default","context","node","params","param","messageId","rules_default","src_default"],"mappings":"AACA,OAAS,iBAAAA,MAAqB,MAG9B,IAAMC,EAAc,IAAMD,EAAc,YAAY,GAAG,EAIhD,IAAME,EAA6BD,EAAY,ECRtD,OAAS,eAAAE,MAAmB,2BCC1B,IAAAC,EAAQ,yBAER,IAAAC,EAAW,QACXC,EAAc,CACZ,IAAO,4CACP,UAAa,wBACf,EDFK,IAAMC,EAAaJ,EAAY,YACnCK,GAAS,GAAGF,EAAW,GAAG,SAASF,CAAI,IAAIC,CAAO,8BAA8BG,CAAI,KACvF,EEFA,IAAOC,EAAqB,CAC1B,QAAS,CAAC,UAAU,EACpB,MAAO,CACL,4BAA6B,OAC/B,CACF,ECVA,OAAS,SAAAC,EAAO,gBAAAC,EAAc,SAAAC,EAAO,UAAAC,EAAQ,aAAAC,MAAiB,eAC9D,OAAS,SAAAC,EAAO,KAAAC,MAAS,aAIzB,IAAMC,EAASP,EAAM,IAAK,GAAG,EAAE,GAAG,UAAU,EACtCQ,EAAUL,EAAO,UACjBM,EAAYL,EAAUD,CAAM,EAC5BO,EAASR,EAAM,MAAM,IAAI,EAAE,GAAG,QAAQ,EAEtCS,EAAcV,EAAaM,CAAM,EACjCK,EAAeX,EAAaM,EAAQC,CAAO,EAC3CK,EAAiBZ,EAAaM,EAAQC,EAASC,CAAS,EACxDK,EAAiBb,EAAaM,EAAQC,EAASC,EAAWC,CAAM,EAGhEK,EAAY,CAChB,OAAQ,SACR,QAAS,UACT,UAAW,YACX,MAAO,OACT,EAEOC,EAAQnB,EAA0B,CACvC,KAAML,EACN,KAAM,CACJ,KAAM,aACN,KAAM,CACJ,YAAa,4EACb,YAAa,OACf,EACA,OAAQ,CAAC,EACT,SAAU,CACR,OAAQ,6DACR,QAAS,uEACT,UAAW,8EACX,MAAO,0DACT,CACF,EACA,eAAgB,CAAC,EACjB,OAAOyB,EAAS,CACd,MAAO,CACL,2BAA2BC,EAAM,CAC/B,GAAM,CAAE,OAAAC,CAAO,EAAID,EAEnB,GAAI,EAAAC,EAAO,SAAW,GAAKA,EAAO,GAAG,CAAC,GAAG,KAAK,OAAS,KAEvD,QAAWC,KAASD,EAAQ,CAC1B,GAAM,CAAE,KAAAzB,CAAK,EAAI0B,EAAM,KAEjBC,EAAYhB,EAAMX,CAAI,EACzB,KAAKY,EAAE,OAAO,MAAMQ,CAAc,EAAG,IAAM,EAAc,EACzD,KAAKR,EAAE,IAAIA,EAAE,OAAO,MAAMK,CAAW,CAAC,EAAG,IAAMI,EAAU,MAAM,EAC/D,KAAKT,EAAE,IAAIA,EAAE,OAAO,MAAMM,CAAY,CAAC,EAAG,IAAMG,EAAU,OAAO,EACjE,KAAKT,EAAE,IAAIA,EAAE,OAAO,MAAMO,CAAc,CAAC,EAAG,IAAME,EAAU,SAAS,EACrE,UAAU,IAAM,EAAc,EAEjCM,GACEJ,EAAQ,OAAO,CACb,KAAMG,EACN,UAAAC,EACA,KAAM,CAAE,KAAA3B,CAAK,CACf,CAAC,CACL,CACF,CACF,CACF,CACF,CAAC,ECjED,IAAO4B,EAAQ,CACb,mBAAoBN,CACtB,ECDA,IAAOO,GAAQ,CACb,MAAAD,EACA,QAAS,CACP,YAAAvB,CACF,CACF","sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { ESLintUtils } from '@typescript-eslint/utils';\nimport type { ESLintConfig } from 'eslint-define-config';\n\nimport { name, repository, version } from '../../package.json';\n\nexport const createRule = ESLintUtils.RuleCreator(\n (rule) => `${repository.url}/blob/${name}@${version}/packages/eslint/src/rules/${rule}.ts`,\n);\n\nexport function defineConfig<TConfig extends ESLintConfig>(config: TConfig): TConfig {\n return config;\n}\n","{\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\": \"0.0.5\",\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.mjs\",\n \"types\": \"./dist/index.d.mts\"\n },\n \"require\": {\n \"default\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n }\n }\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint --ignore-path ../../.gitignore .\",\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 \"@types/eslint\": \"^8.44.7\",\n \"@typescript-eslint/utils\": \"5.62.0\",\n \"eslint\": \"^8.54.0\",\n \"magic-regexp\": \"^0.7.0\",\n \"ts-pattern\": \"^5.0.5\"\n },\n \"devDependencies\": {\n \"@2digits/tsconfig\": \"*\",\n \"eslint-define-config\": \"^2.0.0\",\n \"tsup\": \"^8.0.0\",\n \"turbo\": \"^1.10.16\",\n \"typescript\": \"^5.2.2\",\n \"vitest\": \"^0.34.0\"\n },\n \"eslintConfig\": {\n \"extends\": \"@2digits\",\n \"ignorePatterns\": [\n \"fixtures\"\n ]\n }\n}\n","import type { Rules } from 'eslint-define-config';\n\nimport type Rule from '../rules';\nimport { defineConfig } from '../utils';\n\nexport default defineConfig({\n plugins: ['@2digits'],\n rules: {\n '@2digits/type-param-names': 'error',\n } satisfies Record<`@2digits/${keyof typeof Rule}`, Rules[string]>,\n});\n","import { anyOf, createRegExp, digit, letter, oneOrMore } from 'magic-regexp';\nimport { match, P } from 'ts-pattern';\n\nimport { createRule } 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 default createRule<[], MessageId>({\n name: __filename,\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Enforce giving proper names to type parameters when there are two or more',\n recommended: 'error',\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 messageId &&\n context.report({\n node: param,\n messageId,\n data: { name },\n });\n }\n },\n };\n },\n});\n","import typeParamNames from './type-param-names';\n\nexport default {\n 'type-param-names': typeParamNames,\n};\n","import recommended from './configs/recommended';\nimport rules from './rules';\n\nexport default {\n rules,\n configs: {\n recommended,\n },\n};\n"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.0.1_postcss@8.4.31_typescript@5.3.2/node_modules/tsup/assets/esm_shims.js","../src/utils/index.ts","../package.json","../src/configs/recommended.ts","../src/rules/type-param-names.ts","../src/rules/index.ts","../src/index.ts"],"names":["fileURLToPath","getFilename","__filename","ESLintUtils","name","version","repository","createRule","rule","recommended","anyOf","createRegExp","digit","letter","oneOrMore","match","P","prefix","initial","remainder","digits","PrefixRegex","InitialRegex","RemainderRegex","TypeParamRegex","MessageId","typeParamNames","context","node","params","param","messageId","rules","plugin","src_default"],"mappings":"AACA,OAAS,iBAAAA,MAAqB,MAG9B,IAAMC,EAAc,IAAMD,EAAc,YAAY,GAAG,EAIhD,IAAME,EAA6BD,EAAY,ECRtD,OAAS,eAAAE,MAAmB,2BCC1B,IAAAC,EAAQ,yBAER,IAAAC,EAAW,QACXC,EAAc,CACZ,IAAO,4CACP,UAAa,wBACf,EDFK,IAAMC,EAAaJ,EAAY,YACnCK,GAAS,GAAGF,EAAW,GAAG,SAASF,CAAI,IAAIC,CAAO,8BAA8BG,CAAI,KACvF,EEFO,IAAMC,EAA2B,CACtC,QAAS,CAAC,UAAU,EACpB,MAAO,CACL,4BAA6B,OAC/B,CACF,ECRA,OAAS,SAAAC,EAAO,gBAAAC,EAAc,SAAAC,EAAO,UAAAC,EAAQ,aAAAC,MAAiB,eAC9D,OAAS,SAAAC,EAAO,KAAAC,MAAS,aAMzB,IAAMC,EAASP,EAAM,IAAK,GAAG,EAAE,GAAG,UAAU,EACtCQ,EAAUL,EAAO,UACjBM,EAAYL,EAAUD,CAAM,EAC5BO,EAASR,EAAM,MAAM,IAAI,EAAE,GAAG,QAAQ,EAEtCS,EAAcV,EAAaM,CAAM,EACjCK,EAAeX,EAAaM,EAAQC,CAAO,EAC3CK,EAAiBZ,EAAaM,EAAQC,EAASC,CAAS,EACxDK,EAAiBb,EAAaM,EAAQC,EAASC,EAAWC,CAAM,EAGhEK,EAAY,CAChB,OAAQ,SACR,QAAS,UACT,UAAW,YACX,MAAO,OACT,EAEaC,EAAiBnB,EAA0B,CACtD,KAAML,EACN,KAAM,CACJ,KAAM,aACN,KAAM,CACJ,YAAa,4EACb,YAAa,aACf,EACA,OAAQ,CAAC,EACT,SAAU,CACR,OAAQ,6DACR,QAAS,uEACT,UAAW,8EACX,MAAO,0DACT,CACF,EACA,eAAgB,CAAC,EACjB,OAAOyB,EAAS,CACd,MAAO,CACL,2BAA2BC,EAAM,CAC/B,GAAM,CAAE,OAAAC,CAAO,EAAID,EAEnB,GAAI,EAAAC,EAAO,SAAW,GAAKA,EAAO,GAAG,CAAC,GAAG,KAAK,OAAS,KAEvD,QAAWC,KAASD,EAAQ,CAC1B,GAAM,CAAE,KAAAzB,CAAK,EAAI0B,EAAM,KAEjBC,EAAYhB,EAAMX,CAAI,EACzB,KAAKY,EAAE,OAAO,MAAMQ,CAAc,EAAG,IAAM,EAAc,EACzD,KAAKR,EAAE,IAAIA,EAAE,OAAO,MAAMK,CAAW,CAAC,EAAG,IAAMI,EAAU,MAAM,EAC/D,KAAKT,EAAE,IAAIA,EAAE,OAAO,MAAMM,CAAY,CAAC,EAAG,IAAMG,EAAU,OAAO,EACjE,KAAKT,EAAE,IAAIA,EAAE,OAAO,MAAMO,CAAc,CAAC,EAAG,IAAME,EAAU,SAAS,EACrE,UAAU,IAAM,EAAc,EAEjCM,GACEJ,EAAQ,OAAO,CACb,KAAMG,EACN,UAAAC,EACA,KAAM,CAAE,KAAA3B,CAAK,CACf,CAAC,CACL,CACF,CACF,CACF,CACF,CAAC,ECnEM,IAAM4B,EAAQ,CACnB,mBAAmCN,CACrC,ECHA,IAAMO,EAAS,CACb,MAAaD,EACb,QAAS,CACP,YAAAvB,CACF,CACF,EAEOyB,EAAQD","sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { ESLintUtils } from '@typescript-eslint/utils';\nimport type { ESLintConfig } from 'eslint-define-config';\n\nimport { name, repository, version } from '../../package.json';\n\nexport const createRule = ESLintUtils.RuleCreator(\n (rule) => `${repository.url}/blob/${name}@${version}/packages/eslint/src/rules/${rule}.ts`,\n);\n\nexport function defineConfig<TConfig extends ESLintConfig>(config: TConfig): TConfig {\n return config;\n}\n","{\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\": \"1.0.0\",\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.mjs\",\n \"types\": \"./dist/index.d.mts\"\n },\n \"require\": {\n \"default\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n }\n }\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint --ignore-path ../../.gitignore .\",\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 \"@types/eslint\": \"^8.44.7\",\n \"@typescript-eslint/utils\": \"6.12.0\",\n \"eslint\": \"^8.54.0\",\n \"magic-regexp\": \"^0.7.0\",\n \"ts-pattern\": \"^5.0.5\"\n },\n \"devDependencies\": {\n \"@2digits/tsconfig\": \"*\",\n \"@typescript-eslint/rule-tester\": \"6.12.0\",\n \"eslint-define-config\": \"^2.0.0\",\n \"tsup\": \"^8.0.1\",\n \"turbo\": \"^1.10.16\",\n \"typescript\": \"^5.3.2\",\n \"vitest\": \"^0.34.6\"\n },\n \"eslintConfig\": {\n \"extends\": \"@2digits\",\n \"ignorePatterns\": [\n \"fixtures\"\n ]\n }\n}\n","import type { Rules } from 'eslint-define-config';\n\nimport type { rules } from '../rules';\nimport { defineConfig } from '../utils';\n\nexport const recommended = defineConfig({\n plugins: ['@2digits'],\n rules: {\n '@2digits/type-param-names': 'error',\n } satisfies Record<`@2digits/${keyof typeof rules}`, Rules[string]>,\n});\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type _ from '@typescript-eslint/utils/ts-eslint';\nimport { anyOf, createRegExp, digit, letter, oneOrMore } from 'magic-regexp';\nimport { match, P } from 'ts-pattern';\n\nimport { createRule } from '../utils';\n\nexport type { RuleListener, RuleModule } from '@typescript-eslint/utils/ts-eslint';\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 typeParamNames = createRule<[], MessageId>({\n name: __filename,\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Enforce giving proper names to type parameters when there are two or more',\n recommended: 'recommended',\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 messageId &&\n context.report({\n node: param,\n messageId,\n data: { name },\n });\n }\n },\n };\n },\n});\n","import * as typeParamNames from './type-param-names';\n\nexport type * from './type-param-names';\n\nexport const rules = {\n 'type-param-names': typeParamNames.typeParamNames,\n};\n","import { recommended } from './configs/recommended';\nimport * as rules from './rules';\n\nconst plugin = {\n rules: rules.rules,\n configs: {\n recommended,\n },\n};\n\nexport default plugin;\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": "0.0.5",
4
+ "version": "1.0.0",
5
5
  "repository": {
6
6
  "url": "https://github.com/2digits-agency/configs",
7
7
  "directory": "packages/eslint-plugin"
@@ -35,18 +35,19 @@
35
35
  ],
36
36
  "dependencies": {
37
37
  "@types/eslint": "^8.44.7",
38
- "@typescript-eslint/utils": "5.62.0",
38
+ "@typescript-eslint/utils": "6.12.0",
39
39
  "eslint": "^8.54.0",
40
40
  "magic-regexp": "^0.7.0",
41
41
  "ts-pattern": "^5.0.5"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@2digits/tsconfig": "*",
45
+ "@typescript-eslint/rule-tester": "6.12.0",
45
46
  "eslint-define-config": "^2.0.0",
46
- "tsup": "^8.0.0",
47
+ "tsup": "^8.0.1",
47
48
  "turbo": "^1.10.16",
48
- "typescript": "^5.2.2",
49
- "vitest": "^0.34.0"
49
+ "typescript": "^5.3.2",
50
+ "vitest": "^0.34.6"
50
51
  },
51
52
  "eslintConfig": {
52
53
  "extends": "@2digits",