@2digits/eslint-config 5.4.2 → 5.4.4

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
@@ -4399,7 +4399,7 @@ interface RuleOptions {
4399
4399
  */
4400
4400
  'sonar/aws-ec2-rds-dms-public'?: Linter.RuleEntry<[]>;
4401
4401
  /**
4402
- * Using unencrypted EBS volumes is security-sensitive
4402
+ * EBS volumes should be encrypted
4403
4403
  * @see https://sonarsource.github.io/rspec/#/rspec/S6275/javascript
4404
4404
  */
4405
4405
  'sonar/aws-ec2-unencrypted-ebs-volume'?: Linter.RuleEntry<[]>;
@@ -4409,7 +4409,7 @@ interface RuleOptions {
4409
4409
  */
4410
4410
  'sonar/aws-efs-unencrypted'?: Linter.RuleEntry<[]>;
4411
4411
  /**
4412
- * Policies granting all privileges are security-sensitive
4412
+ * Policies should not grant all privileges
4413
4413
  * @see https://sonarsource.github.io/rspec/#/rspec/S6302/javascript
4414
4414
  */
4415
4415
  'sonar/aws-iam-all-privileges'?: Linter.RuleEntry<[]>;
@@ -4424,17 +4424,17 @@ interface RuleOptions {
4424
4424
  */
4425
4425
  'sonar/aws-iam-privilege-escalation'?: Linter.RuleEntry<[]>;
4426
4426
  /**
4427
- * Policies authorizing public access to resources are security-sensitive
4427
+ * AWS resource-based policies should not grant public access
4428
4428
  * @see https://sonarsource.github.io/rspec/#/rspec/S6270/javascript
4429
4429
  */
4430
4430
  'sonar/aws-iam-public-access'?: Linter.RuleEntry<[]>;
4431
4431
  /**
4432
- * Using unencrypted Opensearch domains is security-sensitive
4432
+ * OpenSearch domains should have encryption at rest enabled
4433
4433
  * @see https://sonarsource.github.io/rspec/#/rspec/S6308/javascript
4434
4434
  */
4435
4435
  'sonar/aws-opensearchservice-domain'?: Linter.RuleEntry<[]>;
4436
4436
  /**
4437
- * Using unencrypted RDS DB resources is security-sensitive
4437
+ * Amazon RDS resources should be encrypted at rest
4438
4438
  * @see https://sonarsource.github.io/rspec/#/rspec/S6303/javascript
4439
4439
  */
4440
4440
  'sonar/aws-rds-unencrypted-databases'?: Linter.RuleEntry<[]>;
@@ -4444,7 +4444,7 @@ interface RuleOptions {
4444
4444
  */
4445
4445
  'sonar/aws-restricted-ip-admin-access'?: Linter.RuleEntry<[]>;
4446
4446
  /**
4447
- * Granting access to S3 buckets to all or authenticated users is security-sensitive
4447
+ * S3 buckets should not grant access to all users or authenticated users
4448
4448
  * @see https://sonarsource.github.io/rspec/#/rspec/S6265/javascript
4449
4449
  */
4450
4450
  'sonar/aws-s3-bucket-granted-access'?: Linter.RuleEntry<[]>;
@@ -4480,7 +4480,7 @@ interface RuleOptions {
4480
4480
  */
4481
4481
  'sonar/aws-sns-unencrypted-topics'?: Linter.RuleEntry<[]>;
4482
4482
  /**
4483
- * Using unencrypted SQS queues is security-sensitive
4483
+ * SQS queues should be encrypted
4484
4484
  * @see https://sonarsource.github.io/rspec/#/rspec/S6330/javascript
4485
4485
  */
4486
4486
  'sonar/aws-sqs-unencrypted-queue'?: Linter.RuleEntry<[]>;
@@ -4567,7 +4567,7 @@ interface RuleOptions {
4567
4567
  */
4568
4568
  'sonar/constructor-for-side-effects'?: Linter.RuleEntry<[]>;
4569
4569
  /**
4570
- * Allowing requests with excessive content length is security-sensitive
4570
+ * HTTP request content length should be limited
4571
4571
  * @see https://sonarsource.github.io/rspec/#/rspec/S5693/javascript
4572
4572
  */
4573
4573
  'sonar/content-length'?: Linter.RuleEntry<SonarContentLength>;
@@ -4588,7 +4588,7 @@ interface RuleOptions {
4588
4588
  */
4589
4589
  'sonar/cookies'?: Linter.RuleEntry<[]>;
4590
4590
  /**
4591
- * Having a permissive Cross-Origin Resource Sharing policy is security-sensitive
4591
+ * Cross-Origin Resource Sharing (CORS) policy should be restricted to trusted origins
4592
4592
  * @see https://sonarsource.github.io/rspec/#/rspec/S5122/javascript
4593
4593
  */
4594
4594
  'sonar/cors'?: Linter.RuleEntry<[]>;
@@ -4643,6 +4643,11 @@ interface RuleOptions {
4643
4643
  * @deprecated
4644
4644
  */
4645
4645
  'sonar/dns-prefetching'?: Linter.RuleEntry<[]>;
4646
+ /**
4647
+ * DOMPurify configuration should not be bypassable
4648
+ * @see https://sonarsource.github.io/rspec/#/rspec/S8479/javascript
4649
+ */
4650
+ 'sonar/dompurify-unsafe-config'?: Linter.RuleEntry<[]>;
4646
4651
  /**
4647
4652
  * Character classes in regular expressions should not contain the same character twice
4648
4653
  * @see https://sonarsource.github.io/rspec/#/rspec/S5869/javascript
@@ -4780,7 +4785,7 @@ interface RuleOptions {
4780
4785
  */
4781
4786
  'sonar/index-of-compare-to-positive-number'?: Linter.RuleEntry<[]>;
4782
4787
  /**
4783
- * Creating cookies without the "secure" flag is security-sensitive
4788
+ * Cookies should have the "secure" flag
4784
4789
  * @see https://sonarsource.github.io/rspec/#/rspec/S2092/javascript
4785
4790
  */
4786
4791
  'sonar/insecure-cookie'?: Linter.RuleEntry<[]>;
@@ -4805,7 +4810,7 @@ interface RuleOptions {
4805
4810
  */
4806
4811
  'sonar/label-position'?: Linter.RuleEntry<[]>;
4807
4812
  /**
4808
- * Authorizing an opened window to access back to the originating window is security-sensitive
4813
+ * Opened windows should not have access to the originating page
4809
4814
  * @see https://sonarsource.github.io/rspec/#/rspec/S5148/javascript
4810
4815
  */
4811
4816
  'sonar/link-with-target-blank'?: Linter.RuleEntry<[]>;
@@ -5020,7 +5025,7 @@ interface RuleOptions {
5020
5025
  */
5021
5026
  'sonar/no-gratuitous-expressions'?: Linter.RuleEntry<[]>;
5022
5027
  /**
5023
- * Using hardcoded IP addresses is security-sensitive
5028
+ * IP addresses should not be hardcoded
5024
5029
  * @see https://sonarsource.github.io/rspec/#/rspec/S1313/javascript
5025
5030
  */
5026
5031
  'sonar/no-hardcoded-ip'?: Linter.RuleEntry<[]>;
@@ -5322,8 +5327,9 @@ interface RuleOptions {
5322
5327
  */
5323
5328
  'sonar/no-uniq-key'?: Linter.RuleEntry<[]>;
5324
5329
  /**
5325
- * Expanding archive files without controlling resource consumption is security-sensitive
5330
+ * Expanding archive files should not be done without controlling resource consumption
5326
5331
  * @see https://sonarsource.github.io/rspec/#/rspec/S5042/javascript
5332
+ * @deprecated
5327
5333
  */
5328
5334
  'sonar/no-unsafe-unzip'?: Linter.RuleEntry<[]>;
5329
5335
  /**
@@ -5499,7 +5505,7 @@ interface RuleOptions {
5499
5505
  */
5500
5506
  'sonar/public-static-readonly'?: Linter.RuleEntry<[]>;
5501
5507
  /**
5502
- * Using publicly writable directories is security-sensitive
5508
+ * Temporary files should not be created in publicly writable directories
5503
5509
  * @see https://sonarsource.github.io/rspec/#/rspec/S5443/javascript
5504
5510
  */
5505
5511
  'sonar/publicly-writable-directories'?: Linter.RuleEntry<[]>;
@@ -5689,7 +5695,7 @@ interface RuleOptions {
5689
5695
  */
5690
5696
  'sonar/web-sql-database'?: Linter.RuleEntry<[]>;
5691
5697
  /**
5692
- * Disclosing fingerprints from web application technologies is security-sensitive
5698
+ * Web application technologies should not disclose version information
5693
5699
  * @see https://sonarsource.github.io/rspec/#/rspec/S5689/javascript
5694
5700
  */
5695
5701
  'sonar/x-powered-by'?: Linter.RuleEntry<[]>;
@@ -8636,6 +8642,11 @@ interface RuleOptions {
8636
8642
  * @see https://github.com/marcalexiei/eslint-plugin-zod/blob/HEAD/docs/rules/no-throw-in-refine.md
8637
8643
  */
8638
8644
  'zod/no-throw-in-refine'?: Linter.RuleEntry<[]>;
8645
+ /**
8646
+ * Disallow transforms in z.record() key schemas, which can cause silent key mutations and data loss through key collisions
8647
+ * @see https://github.com/marcalexiei/eslint-plugin-zod/blob/HEAD/docs/rules/no-transform-in-record-key.md
8648
+ */
8649
+ 'zod/no-transform-in-record-key'?: Linter.RuleEntry<[]>;
8639
8650
  /**
8640
8651
  * Disallow usage of `z.unknown()` in Zod schemas
8641
8652
  * @see https://github.com/marcalexiei/eslint-plugin-zod/blob/HEAD/docs/rules/no-unknown-schema.md
@@ -11721,7 +11732,7 @@ type SonarArrowFunctionConvention = [] | [{
11721
11732
  type SonarClassName = [] | [{
11722
11733
  format?: string;
11723
11734
  }]; // ----- sonar/cognitive-complexity -----
11724
- type SonarCognitiveComplexity = [] | [(number | string)] | [(number | string), string]; // ----- sonar/comment-regex -----
11735
+ type SonarCognitiveComplexity = [] | [(number | "silence-issues")] | [(number | "silence-issues"), "silence-issues"]; // ----- sonar/comment-regex -----
11725
11736
  type SonarCommentRegex = [] | [{
11726
11737
  regularExpression?: string;
11727
11738
  message?: string;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{FlatConfigComposer as e,renamePluginsInConfigs as t,renamePluginsInRules as n}from"eslint-flat-config-utils";import{getPackageInfo as r,isPackageExists as i}from"local-pkg";import{findWorkspaceDir as a}from"pkg-types";import o from"eslint-plugin-antfu";import s,{configs as c}from"eslint-plugin-de-morgan";import l from"@eslint-community/eslint-plugin-eslint-comments";import u from"@eslint-community/eslint-plugin-eslint-comments/configs";import d from"@eslint/css";import{tailwind3 as f,tailwind4 as p}from"tailwind-csstree";import m from"eslint-plugin-depend";import{fixupPluginRules as h}from"@eslint/compat";import g,{configs as _}from"eslint-plugin-github-action";import*as v from"yaml-eslint-parser";import y from"eslint-config-flat-gitignore";import ee from"@eslint/js";import te from"@stylistic/eslint-plugin";import b from"globals";import x from"eslint-plugin-jsdoc";import S,{configs as C}from"eslint-plugin-jsonc";import*as w from"jsonc-eslint-parser";import T from"@eslint/markdown";import{mergeProcessors as ne,processorPassThrough as re}from"eslint-merge-processors";import ie from"eslint-plugin-n";import ae,{configs as oe}from"eslint-plugin-regexp";import se from"eslint-plugin-sonarjs";import*as E from"empathic/find";import ce,{configs as le}from"eslint-plugin-toml";import D from"eslint-plugin-unicorn";import O from"eslint-plugin-yml";const k=`**/*.?([cm])[jt]s?(x)`,A=`**/*.?([cm])ts`,j=`**/*.?([cm])tsx`,M=`.github/workflows/*.y?(a)ml`,N=`**/*.md`,P=`${N}/${k}`,F=`**/node_modules,**/dist,**/package-lock.json,**/yarn.lock,**/pnpm-lock.yaml,**/bun.lockb,**/bun.lock,**/output,**/coverage,**/temp,**/.temp,**/tmp,**/.tmp,**/.history,**/.vitepress/cache,**/.nuxt,**/.next,**/.vercel,**/.changeset,**/.idea,**/.cache,**/.output,**/.vite-inspect,**/.yarn,**/CHANGELOG*.md,**/*.min.*,**/LICENSE*,**/__snapshots__,**/auto-import?(s).d.ts,**/components.d.ts`.split(`,`);function I(){return[{files:[k],name:`2digits:antfu`,plugins:{antfu:o},rules:{"antfu/top-level-function":`error`}}]}function L(){return[{files:[k],name:`2digits:boolean`,plugins:{boolean:s},rules:{...c.recommended.rules}}]}const R={"@next/next":`next`,"@eslint-react":`react-extra`,"react-hooks":`react-hooks`,"react-compiler":`react-compiler`,"@stylistic/eslint-plugin":`stylistic`,"@typescript-eslint":`ts`,vitest:`vitest`,node:`node`,"@eslint-community/eslint-comments":`comments`,storybook:`storybook`,turbo:`turbo`,jsdoc:`jsdoc`,unicorn:`unicorn`,tailwindcss:`tailwindcss`,"@tanstack/query":`tanstack-query`,"@tanstack/router":`tanstack-router`,"@2digits":`@2digits`,"@graphql-eslint":`gql`,sonarjs:`sonar`,drizzle:`drizzle`,"de-morgan":`boolean`,antfu:`antfu`,css:`css`,depend:`depend`,"github-action":`github-action`,jsonc:`jsonc`,markdown:`markdown`,pnpm:`pnpm`,regexp:`regexp`,yml:`yml`,zod:`zod`,toml:`toml`},z=[`storybook`,`@storybook/nextjs`,`@storybook/nextjs-vite`,`@storybook/react-vite`,`@storybook/react-webpack5`,`@storybook/react-native-web-vite`],B=n(u.recommended.rules,R);function V(){return[{files:[k],name:`2digits:comments`,plugins:{comments:l},rules:{...B,"comments/no-unused-disable":`error`,"comments/disable-enable-pair":[`error`,{allowWholeFile:!0}]}}]}async function H(e){if(e?.customSyntax)return e.customSyntax;if(e?.tailwindMajor===3)return f;if(e?.tailwindMajor===4)return p;try{let e=(await r(`tailwindcss`))?.version??``,t=Number.parseInt(e.split(`.`)[0]??`0`,10);if(Number.isFinite(t)&&t>=4)return p}catch{}return f}async function U(e={}){let t=await H(e);return[{name:`2digits:css`,files:[`**/*.css`],language:`css/css`,plugins:{css:d},languageOptions:{tolerant:!0,customSyntax:t},rules:{...d.configs.recommended.rules,...e.overrides}}]}function W(){return[{files:[k],name:`2digits:depend`,plugins:{depend:m},rules:{"depend/ban-dependencies":`warn`}}]}async function G(e){let t=await e;return t.default??t}async function ue(e={}){let{overrides:t={},drizzleObjectName:n=[`drizzle`,`db`]}=e,r=await G(import(`eslint-plugin-drizzle`));return[{files:[k],name:`2digits:drizzle`,plugins:{drizzle:h(r)},rules:{"drizzle/enforce-update-with-where":[`error`,{drizzleObjectName:n}],"drizzle/enforce-delete-with-where":[`error`,{drizzleObjectName:n}],...t}}]}const de=Object.fromEntries(_.recommended.flatMap(({rules:e})=>Object.entries({...e})));function fe(){return[{name:`2digits:github-actions/setup`,plugins:{"github-action":g}},{name:`2digits:github-actions/recommended`,files:[M],ignores:[`!**/${M}`],languageOptions:{parser:v},rules:{...de}}]}async function pe(e={}){let{overrides:t={},files:r=[`**/*.graphql`,`**/*.gql`]}=e,[i,a]=await Promise.all([G(import(`@graphql-eslint/eslint-plugin`)),import(`graphql-config`).then(({loadConfig:e})=>e({throwOnEmpty:!1,throwOnMissing:!1}).then(e=>e?.getDefault().schema))]),o=i.configs[`flat/operations-recommended`].rules,s={};if(a)s=o;else for(let e of Object.keys(o)){let t=e.replace(`@graphql-eslint/`,``);t in i.rules&&(i.rules[t].meta.docs?.requiresSchema||i.rules[t].meta.docs?.requiresSiblings)||(s[e]=o[e])}let c=n(s,R);return[{name:`2digits:graphql`,plugins:{gql:i},languageOptions:{parser:i.parser},files:r,rules:{...c,"gql/naming-convention":[`error`,{allowLeadingUnderscore:!0}],...t}}]}function me(e={}){let{gitIgnore:t,ignores:n=[]}=e;return[{ignores:[F,n].flat(),name:`2digits:ignores`},y({strict:!1,...t,name:`2digits:gitignore`})]}function he(e={}){let{overrides:t={}}=e;return[{files:[k],name:`2digits:javascript`,plugins:{stylistic:te},languageOptions:{ecmaVersion:2022,globals:{...b.browser,...b.es2021,...b.node,document:`readonly`,navigator:`readonly`,window:`readonly`},parserOptions:{ecmaFeatures:{jsx:!0},ecmaVersion:2022,sourceType:`module`},sourceType:`module`},linterOptions:{reportUnusedDisableDirectives:!0},rules:{...ee.configs.recommended.rules,"accessor-pairs":[`error`,{enforceForClassMembers:!0,setWithoutGet:!0}],"array-callback-return":`error`,"block-scoped-var":`error`,"constructor-super":`error`,"default-case-last":`error`,"dot-notation":[`error`,{allowKeywords:!0}],eqeqeq:[`error`,`smart`],"new-cap":[`error`,{capIsNew:!1,newIsCap:!0,properties:!0}],"no-alert":`error`,"no-array-constructor":`error`,"no-async-promise-executor":`error`,"no-caller":`error`,"no-case-declarations":`error`,"no-class-assign":`error`,"no-compare-neg-zero":`error`,"no-cond-assign":[`error`,`always`],"no-const-assign":`error`,"no-control-regex":`error`,"no-debugger":`error`,"no-delete-var":`error`,"no-dupe-args":`error`,"no-dupe-class-members":`error`,"no-dupe-keys":`error`,"no-duplicate-case":`error`,"no-empty":[`error`,{allowEmptyCatch:!0}],"no-empty-character-class":`error`,"no-empty-pattern":`error`,"no-eval":`error`,"no-ex-assign":`error`,"no-extend-native":`error`,"no-extra-bind":`error`,"no-extra-boolean-cast":`error`,"no-fallthrough":`error`,"no-func-assign":`error`,"no-global-assign":`error`,"no-implied-eval":`error`,"no-import-assign":`error`,"no-invalid-regexp":`error`,"no-irregular-whitespace":`error`,"no-iterator":`error`,"no-labels":[`error`,{allowLoop:!1,allowSwitch:!1}],"no-lone-blocks":`error`,"no-loss-of-precision":`error`,"no-misleading-character-class":`error`,"no-multi-str":`error`,"no-new":`error`,"no-new-func":`error`,"no-new-native-nonconstructor":`error`,"no-new-wrappers":`error`,"no-obj-calls":`error`,"no-octal":`error`,"no-octal-escape":`error`,"no-proto":`error`,"no-prototype-builtins":`error`,"no-redeclare":[`error`,{builtinGlobals:!1}],"no-regex-spaces":`error`,"no-restricted-globals":[`error`,{message:"Use `globalThis` instead.",name:`global`},{message:"Use `globalThis` instead.",name:`self`}],"no-restricted-properties":[`error`,{message:"Use `Object.getPrototypeOf` or `Object.setPrototypeOf` instead.",property:`__proto__`},{message:"Use `Object.defineProperty` instead.",property:`__defineGetter__`},{message:"Use `Object.defineProperty` instead.",property:`__defineSetter__`},{message:"Use `Object.getOwnPropertyDescriptor` instead.",property:`__lookupGetter__`},{message:"Use `Object.getOwnPropertyDescriptor` instead.",property:`__lookupSetter__`}],"no-restricted-syntax":[`error`,`DebuggerStatement`,`LabeledStatement`,`WithStatement`,`TSEnumDeclaration`,`TSExportAssignment`],"no-self-assign":[`error`,{props:!0}],"no-self-compare":`error`,"no-sequences":`error`,"no-shadow-restricted-names":`error`,"no-sparse-arrays":`error`,"no-template-curly-in-string":`error`,"no-this-before-super":`error`,"no-throw-literal":`error`,"no-undef":`error`,"no-undef-init":`error`,"no-unexpected-multiline":`error`,"no-unmodified-loop-condition":`error`,"no-unneeded-ternary":[`error`,{defaultAssignment:!1}],"no-unreachable":`error`,"no-unreachable-loop":`error`,"no-unsafe-finally":`error`,"no-unsafe-negation":`error`,"no-unused-expressions":[`error`,{allowShortCircuit:!0,allowTaggedTemplates:!0,allowTernary:!0}],"no-unused-vars":[`error`,{args:`none`,caughtErrors:`none`,ignoreRestSiblings:!0,vars:`all`}],"no-useless-assignment":`off`,"no-useless-backreference":`error`,"no-useless-call":`error`,"no-useless-catch":`error`,"no-useless-computed-key":`error`,"no-useless-constructor":`error`,"no-useless-rename":`error`,"no-var":`error`,"no-with":`error`,"object-shorthand":[`error`,`always`,{avoidQuotes:!0,ignoreConstructors:!1}],"one-var":[`error`,{initialized:`never`}],"prefer-arrow-callback":[`error`,{allowNamedFunctions:!0,allowUnboundThis:!0}],"prefer-const":[`error`,{destructuring:`all`,ignoreReadBeforeAssign:!0}],"prefer-exponentiation-operator":`error`,"prefer-promise-reject-errors":`error`,"prefer-regex-literals":[`error`,{disallowRedundantWrapping:!0}],"prefer-rest-params":`error`,"prefer-spread":`error`,"prefer-template":`error`,"symbol-description":`error`,"unicode-bom":[`error`,`never`],"use-isnan":[`error`,{enforceForIndexOf:!0,enforceForSwitchCase:!0}],"valid-typeof":[`error`,{requireStringLiterals:!0}],"vars-on-top":`error`,yoda:[`error`,`never`],"stylistic/padding-line-between-statements":[`error`,{blankLine:`always`,prev:[`const`,`let`],next:`*`},{blankLine:`any`,prev:[`const`,`let`],next:[`const`,`let`]},{blankLine:`always`,prev:`*`,next:`return`}],...t}}]}function ge(){return[{files:[k],name:`2digits:jsdoc`,plugins:{jsdoc:x},rules:{"jsdoc/check-access":`error`,"jsdoc/check-param-names":`error`,"jsdoc/check-property-names":`error`,"jsdoc/check-tag-names":[`error`,{typed:!0}],"jsdoc/check-types":`error`,"jsdoc/empty-tags":`error`,"jsdoc/implements-on-classes":`error`,"jsdoc/no-defaults":`error`,"jsdoc/no-multi-asterisks":`error`,"jsdoc/require-param":`error`,"jsdoc/require-param-name":`error`,"jsdoc/require-property":`error`,"jsdoc/require-property-description":`error`,"jsdoc/require-property-name":`error`,"jsdoc/require-returns-check":`error`,"jsdoc/require-returns-description":`error`,"jsdoc/require-yields":`error`,"jsdoc/require-yields-check":`error`}}]}function _e(){return[...C[`flat/base`].map(e=>({...e,name:`2digits:jsonc/base`})),{name:`2digits:jsonc/json`,files:[`**/*.json`],...K,rules:{...q(C[`flat/recommended-with-json`])}},{name:`2digits:jsonc/jsonc`,files:[`**/*.jsonc`],...K,rules:{...q(C[`flat/recommended-with-jsonc`])}},{name:`2digits:jsonc/json5`,files:[`**/*.json5`],...K,rules:{...q(C[`flat/recommended-with-json5`])}},{name:`2digits:jsonc/package.json`,...K,files:[`**/package.json`],rules:{"jsonc/sort-array-values":[`error`,{order:{type:`asc`},pathPattern:`^files$`}],"jsonc/sort-keys":[`error`,{order:{type:`asc`},pathPattern:`^(?:dev|peer|optional|bundled)?[Dd]ependencies(Meta)?$`},{order:[`types`,`import`,`module`,`require`,`default`],pathPattern:`^exports.*$`}]}},{name:`2digits:jsonc/tsconfig.json`,...K,files:[`**/tsconfig.json`,`**/tsconfig.*.json`,`**/tsconfig-*.json`,`**/jsconfig.json`,`**/jsconfig.*.json`,`**/jsconfig-*.json`],rules:{"jsonc/sort-keys":[`error`,{order:[`$schema`,`extends`,`compilerOptions`,`references`,`files`,`include`,`exclude`],pathPattern:`^$`},{order:`incremental.composite.tsBuildInfoFile.disableSourceOfProjectReferenceRedirect.disableSolutionSearching.disableReferencedProjectLoad.target.lib.jsx.experimentalDecorators.emitDecoratorMetadata.jsxFactory.jsxFragmentFactory.jsxImportSource.reactNamespace.noLib.useDefineForClassFields.moduleDetection.module.rootDir.moduleResolution.baseUrl.paths.rootDirs.typeRoots.types.allowUmdGlobalAccess.moduleSuffixes.allowImportingTsExtensions.resolvePackageJsonExports.resolvePackageJsonImports.customConditions.resolveJsonModule.allowArbitraryExtensions.noResolve.allowJs.checkJs.maxNodeModuleJsDepth.declaration.declarationMap.emitDeclarationOnly.sourceMap.inlineSourceMap.outFile.outDir.removeComments.noEmit.importHelpers.importsNotUsedAsValues.downlevelIteration.sourceRoot.mapRoot.inlineSources.emitBOM.newLine.stripInternal.noEmitHelpers.noEmitOnError.preserveConstEnums.declarationDir.preserveValueImports.isolatedModules.verbatimModuleSyntax.allowSyntheticDefaultImports.esModuleInterop.preserveSymlinks.forceConsistentCasingInFileNames.strict.strictBindCallApply.strictFunctionTypes.strictNullChecks.strictPropertyInitialization.allowUnreachableCode.allowUnusedLabels.alwaysStrict.exactOptionalPropertyTypes.noFallthroughCasesInSwitch.noImplicitAny.noImplicitOverride.noImplicitReturns.noImplicitThis.noPropertyAccessFromIndexSignature.noUncheckedIndexedAccess.noUnusedLocals.noUnusedParameters.useUnknownInCatchVariables.skipDefaultLibCheck.skipLibCheck`.split(`.`),pathPattern:`^compilerOptions$`}]}},...C[`flat/prettier`].map(e=>({...e,name:`2digits:jsonc/prettier`}))]}const K={languageOptions:{parser:w},plugins:{jsonc:S}};function q(e){return Object.fromEntries(e.flatMap(({rules:e})=>Object.entries(e??{})))}const J=[N];function ve(){return[{name:`2digits:markdown/setup`,plugins:{markdown:T}},{name:`2digits:markdown/processor`,files:J,language:`markdown/gfm`,ignores:[`**/*.md/*.md`],processor:ne([T.processors.markdown,re])},{name:`2digits:markdown/parser`,files:J,language:`markdown/gfm`,languageOptions:{parser:be}},{name:`2digits:markdown/rules`,files:J,language:`markdown/gfm`,rules:{"markdown/fenced-code-language":`error`,"markdown/heading-increment":`error`,"markdown/no-empty-links":`error`,"markdown/no-invalid-label-refs":`error`,"markdown/no-missing-label-refs":`error`}}]}async function ye(){let e=await G(import(`typescript-eslint`)),t=await G(import(`@eslint-react/eslint-plugin`)),r=n({...e.configs.disableTypeChecked.rules,...t.configs[`disable-type-checked`].rules},R);return[{name:`2digits:markdown/disables`,files:[P],languageOptions:{parser:e.parser,parserOptions:{project:!1,projectService:!1,ecmaFeatures:{impliedStrict:!0}}},rules:{...r,"no-alert":`off`,"no-console":`off`,"no-labels":`off`,"no-lone-blocks":`off`,"no-restricted-syntax":`off`,"no-undef":`off`,"no-unused-expressions":`off`,"no-unused-labels":`off`,"no-unused-vars":`off`,"node/prefer-global/process":`off`,"ts/consistent-type-imports":`off`,"ts/explicit-function-return-type":`off`,"ts/no-namespace":`off`,"ts/no-redeclare":`off`,"ts/no-require-imports":`off`,"ts/no-unused-expressions":`off`,"ts/no-unused-vars":`off`,"ts/no-use-before-define":`off`,"unicode-bom":`off`}}]}const be={meta:{name:`parser-plain`},parseForESLint:e=>({ast:{body:[],comments:[],loc:{end:e.length,start:0},range:[0,e.length],tokens:[],type:`Program`},scopeManager:null,services:{isPlain:!0},visitorKeys:{Program:[]}})};async function xe(e={}){let{files:t=[A,j],overrides:r={},parserOptions:i}=e,[a,o]=await Promise.all([G(import(`@next/eslint-plugin-next`)),G(import(`@typescript-eslint/parser`))]),s=n({...a.configs.recommended.rules,...a.configs[`core-web-vitals`].rules},R);return[{name:`2digits:next/setup`,plugins:{next:h(a)}},{name:`2digits:next/rules`,files:t,languageOptions:{parser:o,parserOptions:{ecmaFeatures:{jsx:!0},projectService:!0,...i},sourceType:`module`},rules:{...s,"next/no-html-link-for-pages":`off`,...r}},{files:[`**/middleware.ts`,`**/proxy.ts`],name:`2digits:next/proxy`,rules:{"unicorn/prefer-string-raw":`off`}}]}var Se={node:`24.14.1`};function Ce(){return[{files:[k],name:`2digits:node`,settings:{node:{version:Se.node}},plugins:{node:ie},rules:{"node/handle-callback-err":[`error`,`^(err|error)$`],"node/no-deprecated-api":`error`,"node/no-exports-assign":`error`,"node/no-new-require":`error`,"node/no-path-concat":`error`,"node/no-unsupported-features/node-builtins":[`error`,{allowExperimental:!0}],"node/prefer-global/buffer":`error`,"node/prefer-global/process":`error`,"node/prefer-global/text-encoder":`error`,"node/prefer-global/url":`error`,"node/prefer-global/console":`error`,"node/prefer-global/url-search-params":`error`,"node/prefer-global/text-decoder":`error`,"node/process-exit-as-throw":`error`}}]}async function we(){let e=await G(import(`eslint-plugin-pnpm`));return[{name:`2digits:pnpm/package-json`,files:[`package.json`,`**/package.json`],languageOptions:{parser:w},plugins:{pnpm:e},rules:{"pnpm/json-enforce-catalog":`error`,"pnpm/json-prefer-workspace-settings":`error`,"pnpm/json-valid-catalog":`error`}},{name:`2digits:pnpm/pnpm-workspace-yaml`,files:[`pnpm-workspace.yaml`],languageOptions:{parser:await G(import(`yaml-eslint-parser`))},plugins:{pnpm:e},rules:{"pnpm/yaml-no-duplicate-catalog-item":`error`,"pnpm/yaml-no-unused-catalog-item":`error`,"pnpm/yaml-valid-packages":`error`,"pnpm/yaml-enforce-settings":[`error`,{autofix:!0,settings:{catalogMode:`strict`,savePrefix:``,preferWorkspacePackages:!0,cleanupUnusedCatalogs:!0}}]}}]}async function Te(){let[e,t]=await Promise.all([G(import(`eslint-config-prettier`)),G(import(`@stylistic/eslint-plugin`))]);return[{name:`2digits:prettier`,plugins:{stylistic:t},rules:{...e.rules,"tailwindcss/classnames-order":`off`,"stylistic/jsx-newline":[`error`,{prevent:!1}]}}]}async function Ee(e={}){let{files:t=[A,j],overrides:r={},parserOptions:i,tsconfigRootDir:a,reactCompiler:o=!0}=e,[s,c,l,u]=await Promise.all([G(import(`@eslint-react/eslint-plugin`)),G(import(`@typescript-eslint/parser`)),o?G(import(`eslint-plugin-react-compiler`)):Promise.resolve(void 0),G(import(`@stylistic/eslint-plugin`))]),d=s.configs.all.plugins,f=n({...s.configs[`disable-conflict-eslint-plugin-react`].rules,...s.configs[`disable-conflict-eslint-plugin-react-hooks`].rules,...s.configs[`strict-type-checked`].rules},R);return[{name:`2digits:react/setup`,plugins:{stylistic:u,"react-extra":d[`@eslint-react`],...o?{"react-compiler":l}:{}},settings:{react:{version:`detect`}}},{name:`2digits:react/rules`,files:t,languageOptions:{parser:c,parserOptions:{ecmaFeatures:{jsx:!0},tsconfigRootDir:a,projectService:!0,...i},sourceType:`module`},rules:{...f,...o?{"react-compiler/react-compiler":`error`}:{},"react-extra/exhaustive-deps":`error`,"react-extra/purity":`error`,"react-extra/no-unused-class-component-members":`error`,"react-extra/no-unnecessary-use-callback":`error`,"react-extra/no-unnecessary-use-prefix":`error`,"react-extra/no-unnecessary-use-memo":`error`,"react-extra/set-state-in-effect":`error`,"react-extra/use-state":`error`,"react-extra/no-unstable-context-value":`error`,"react-extra/no-unstable-default-props":`error`,"react-extra/no-unused-props":`error`,"react-extra/no-context-provider":`error`,"react-extra/no-forward-ref":`error`,"react-extra/no-use-context":`error`,"react-extra/immutability":`error`,"react-extra/refs":`error`,"react-extra/no-duplicate-key":`error`,"react-extra/dom-no-missing-button-type":`error`,"react-extra/dom-no-missing-iframe-sandbox":`error`,"react-extra/dom-no-unsafe-target-blank":`error`,"react-extra/naming-convention-context-name":`error`,"react-extra/naming-convention-id-name":`error`,"react-extra/naming-convention-ref-name":`error`,"react-extra/prefer-namespace-import":`error`,"react-extra/jsx-no-useless-fragment":`off`,"stylistic/jsx-curly-newline":`off`,"stylistic/jsx-newline":[`error`,{prevent:!1}],"stylistic/jsx-self-closing-comp":`error`,...r}}]}function De(){return[{files:[k],name:`2digits:regexp`,plugins:{regexp:ae},rules:{...oe[`flat/recommended`].rules}}]}function Oe(){return[{files:[k],name:`2digits:sonar`,plugins:{sonar:se},rules:{"sonar/cognitive-complexity":`error`,"sonar/comma-or-logical-or-case":`error`,"sonar/concise-regex":`error`,"sonar/confidential-information-logging":`error`,"sonar/constructor-for-side-effects":`error`,"sonar/content-length":`error`,"sonar/content-security-policy":`error`,"sonar/cookie-no-httponly":`error`,"sonar/cors":`error`,"sonar/csrf":`error`,"sonar/max-switch-cases":`error`,"sonar/no-all-duplicated-branches":`error`,"sonar/no-collapsible-if":`error`,"sonar/no-collection-size-mischeck":`error`,"sonar/no-duplicate-string":[`error`,{threshold:5}],"sonar/no-duplicated-branches":`error`,"sonar/no-element-overwrite":`error`,"sonar/no-empty-collection":`error`,"sonar/no-extra-arguments":`error`,"sonar/no-for-in-iterable":`error`,"sonar/no-gratuitous-expressions":`error`,"sonar/no-identical-conditions":`error`,"sonar/no-identical-expressions":`error`,"sonar/no-identical-functions":`error`,"sonar/no-ignored-return":`error`,"sonar/no-inverted-boolean-check":`error`,"sonar/no-nested-switch":`error`,"sonar/no-nested-template-literals":`error`,"sonar/no-redundant-boolean":`error`,"sonar/no-same-line-conditional":`error`,"sonar/no-small-switch":`error`,"sonar/no-unused-collection":`error`,"sonar/no-use-of-empty-return-value":`error`,"sonar/no-useless-catch":`error`,"sonar/non-existent-operator":`error`,"sonar/prefer-immediate-return":`error`,"sonar/prefer-object-literal":`error`,"sonar/prefer-single-boolean-return":`error`,"sonar/prefer-while":`error`,"sonar/elseif-without-else":`off`,"sonar/no-redundant-jump":`off`}}]}async function ke(e={}){let{files:t=[`**/*.stories.tsx`],overrides:n={},parserOptions:r,storybookDirectory:i=`.storybook`}=e,[a,o]=await Promise.all([G(import(`eslint-plugin-storybook`)),G(import(`@typescript-eslint/parser`))]),s={parser:o,parserOptions:{ecmaFeatures:{jsx:!0},projectService:!0,...r},sourceType:`module`};return[{name:`2digits:storybook/setup`,plugins:{storybook:a}},{name:`2digits:storybook/rules`,files:t,languageOptions:s,rules:{"storybook/await-interactions":`error`,"storybook/context-in-play-function":`error`,"storybook/csf-component":`error`,"storybook/default-exports":`error`,"storybook/hierarchy-separator":`error`,"storybook/meta-inline-properties":`error`,"storybook/no-redundant-story-name":`error`,"storybook/no-stories-of":`error`,"storybook/no-title-property-in-meta":`error`,"storybook/no-uninstalled-addons":`error`,"storybook/prefer-pascal-case":`error`,"storybook/story-exports":`error`,"storybook/use-storybook-expect":`error`,"storybook/use-storybook-testing-library":`error`,"storybook/meta-satisfies-type":`error`,"storybook/no-renderer-packages":`error`,...n}},{name:`2digits:storybook/disables`,files:t,rules:{"sonar/no-duplicate-string":`off`}},{name:`2digits:storybook/config`,files:[`${i}/main.@(js|cjs|mjs|ts)`],languageOptions:s,rules:{"storybook/no-uninstalled-addons":`error`}}]}async function Ae(e={}){let{overrides:t={}}=e,[n,{tailwindFunctions:r},i]=await Promise.all([G(import(`eslint-plugin-tailwindcss`)),G(import(`@2digits/constants`)),a().catch(()=>void 0)]),o=E.file(`tailwind.config.ts`,{last:i})??E.file(`tailwind.config.js`,{last:i});return[{files:[k],name:`2digits:tailwind`,plugins:{tailwindcss:n},settings:{tailwindcss:{callees:r,config:o}},rules:{...n.configs.recommended.rules,...t}}]}async function je(e={}){let{overrides:t={}}=e,r=await G(import(`@tanstack/eslint-plugin-query`)),i=n(r.configs[`flat/recommended`].at(0)?.rules??{},R);return[{files:[k],name:`2digits:tanstack-query`,plugins:{"tanstack-query":r},rules:{...i,"tanstack-query/prefer-query-options":`error`,...t}}]}async function Y(e={}){let{overrides:t={}}=e,r=await G(import(`@tanstack/eslint-plugin-router`)),i=n(r.configs[`flat/recommended`].at(0)?.rules??{},R);return[{files:[k],name:`2digits:tanstack-router`,plugins:{"tanstack-router":r},rules:{...i,"ts/only-throw-error":[`error`,{allow:[{from:`package`,package:`@tanstack/router-core`,name:`Redirect`}]}],...t}}]}const Me=Object.fromEntries(le.standard.flatMap(({rules:e})=>Object.entries({...e})));function Ne(){return[{name:`2digits:toml`,files:[`**/*.toml`],language:`toml/toml`,plugins:{toml:ce},rules:{...Me,"toml/array-bracket-spacing":[`error`,`never`],"toml/array-element-newline":[`error`,`consistent`],"toml/indent":[`error`,2,{keyValuePairs:0,subTables:0}]}}]}async function Pe(e={}){let{overrides:t={}}=e,n=await G(import(`eslint-plugin-turbo`));return[{files:[k],name:`2digits:turbo`,plugins:{turbo:n},rules:{"turbo/no-undeclared-env-vars":`error`,...t}}]}async function Fe(e={}){let{overrides:n={},parserOptions:r={}}=e,[{plugin:i,configs:a,parser:o},s]=await Promise.all([G(import(`typescript-eslint`)),G(import(`@2digits/eslint-plugin`))]),c=t(a.strictTypeChecked,R),l=Object.fromEntries(c.flatMap(({rules:e})=>Object.entries(e??{})));return[{name:`2digits:typescript/setup`,plugins:{ts:i,"@2digits":s}},{name:`2digits:typescript/rules`,files:[k],languageOptions:{parser:o,parserOptions:{tsconfigRootDir:process.cwd(),projectService:!0,warnOnUnsupportedTypeScriptVersion:!1,...r},sourceType:`module`},rules:{...l,"ts/array-type":[`error`,{default:`generic`,readonly:`generic`}],"ts/restrict-template-expressions":[`error`,{allowNumber:!0}],"ts/ban-ts-comment":[`error`,{"ts-ignore":`allow-with-description`}],"ts/consistent-type-exports":[`error`],"ts/consistent-type-imports":[`error`,{prefer:`type-imports`,disallowTypeAnnotations:!1,fixStyle:`inline-type-imports`}],"ts/no-empty-object-type":[`error`,{allowInterfaces:`with-single-extends`,allowObjectTypes:`never`}],"ts/no-explicit-any":[`error`],"ts/no-import-type-side-effects":[`error`],"ts/no-misused-promises":`off`,"ts/no-confusing-void-expression":`off`,"ts/no-unused-vars":[`error`,{ignoreRestSiblings:!0,argsIgnorePattern:`^_`,varsIgnorePattern:`^_`}],"ts/unbound-method":`off`,...s.configs.recommended.rules,...n}},{name:`2digits:typescript/disables/dts`,files:[`**/*.d.ts`],rules:{"unicorn/no-abusive-eslint-disable":`off`,"no-duplicate-imports":`off`,"no-restricted-syntax":`off`,"ts/no-unused-vars":`off`}},{name:`2digits:typescript/disables/test`,files:[`**/*.{test,spec}.ts?(x)`],rules:{"no-unused-expressions":`off`}},{name:`2digits:typescript/disables/cjs`,files:[`**/*.js`,`**/*.cjs`,`**/*.cts`],rules:{"ts/no-require-imports":`off`,"ts/no-var-requires":`off`}}]}function Ie(){return[{files:[k],name:`2digits:unicorn`,plugins:{unicorn:D},rules:{...D.configs.recommended.rules,"unicorn/no-array-callback-reference":`off`,"unicorn/filename-case":`off`,"unicorn/prefer-module":`off`,"unicorn/prevent-abbreviations":`off`,"unicorn/prefer-ternary":[`error`,`only-single-line`],"unicorn/no-useless-undefined":[`error`,{checkArguments:!1,checkArrowFunctionBody:!1}],"unicorn/prefer-top-level-await":`off`,"unicorn/no-nested-ternary":`off`}}]}async function Le(e={}){let{files:t=[`**/*.{test,spec}.ts?(x)`],overrides:n={},typecheck:r=!0,vitestImports:i}=e,a=await G(import(`@vitest/eslint-plugin`));return[{name:`2digits:vitest/setup`,plugins:{vitest:a}},{name:`2digits:vitest/rules`,files:t,languageOptions:{globals:a.environments.env.globals},settings:{vitest:{typecheck:r,...i?{vitestImports:i}:{}}},rules:{"vitest/consistent-each-for":[`error`,{describe:`for`,suite:`for`,it:`for`,test:`for`}],"vitest/consistent-test-filename":[`error`,{pattern:String.raw`.*\.spec\.[tj]sx?$`,allTestPattern:String.raw`.*\.(test|spec)\.[tj]sx?$`}],"vitest/consistent-test-it":[`error`,{fn:`it`,withinDescribe:`it`}],"vitest/consistent-vitest-vi":[`error`,{fn:`vi`}],"vitest/hoisted-apis-on-top":`error`,"vitest/no-conditional-tests":`error`,"vitest/no-import-node-test":`error`,"vitest/prefer-called-exactly-once-with":`error`,"vitest/prefer-called-once":`error`,"vitest/prefer-describe-function-title":`error`,"vitest/prefer-each":`error`,"vitest/prefer-expect-type-of":`error`,"vitest/prefer-import-in-mock":`error`,"vitest/prefer-to-be-falsy":`error`,"vitest/prefer-to-be-object":`error`,"vitest/prefer-to-be-truthy":`error`,"vitest/require-awaited-expect-poll":`error`,"vitest/require-local-test-context-for-concurrent-snapshots":`error`,"vitest/require-mock-type-parameters":`error`,"vitest/warn-todo":`error`,...n}}]}function Re(){return[{name:`2digits:yaml/setup`,plugins:{yml:O}},{name:`2digits:yaml/base`,...X,rules:{"no-irregular-whitespace":`off`,"no-unused-vars":`off`,"spaced-comment":`off`}},{name:`2digits:yaml/recommended`,...X,rules:{"yml/no-empty-document":`error`,"yml/no-empty-key":`error`,"yml/no-empty-mapping-value":`error`,"yml/no-empty-sequence-entry":`error`,"yml/no-irregular-whitespace":`error`,"yml/no-tab-indent":`error`,"yml/vue-custom-block/no-parsing-error":`error`}},{name:`2digits:yaml/standard`,...X,rules:{"yml/block-mapping":`error`,"yml/block-sequence":`error`,"yml/plain-scalar":`error`,"yml/spaced-comment":`error`}},{name:`2digits:yaml/prettier`,...X,rules:{"yml/block-mapping-colon-indicator-newline":`off`,"yml/block-mapping-question-indicator-newline":`off`,"yml/block-sequence-hyphen-indicator-newline":`off`,"yml/flow-mapping-curly-newline":`off`,"yml/flow-mapping-curly-spacing":`off`,"yml/flow-sequence-bracket-newline":`off`,"yml/flow-sequence-bracket-spacing":`off`,"yml/indent":`off`,"yml/key-spacing":`off`,"yml/no-multiple-empty-lines":`off`,"yml/no-trailing-zeros":`off`,"yml/quotes":`off`}}]}const X={files:[`**/*.y?(a)ml`],languageOptions:{parser:v}};async function ze(e={}){let{overrides:t={}}=e,n=await G(import(`eslint-plugin-zod`));return[{files:[k],name:`2digits:zod`,plugins:{zod:n},rules:{"zod/array-style":[`error`,{style:`function`}],"zod/no-any-schema":`error`,"zod/no-empty-custom-schema":`error`,"zod/no-number-schema-with-int":`error`,"zod/no-optional-and-default-together":[`warn`,{preferredMethod:`default`}],"zod/no-string-schema-with-uuid":`error`,"zod/no-throw-in-refine":`error`,"zod/prefer-enum-over-literal-union":`error`,"zod/prefer-meta":`error`,"zod/prefer-meta-last":`error`,"zod/prefer-string-schema-with-trim":`error`,"zod/consistent-import":[`error`,{syntax:`namespace`}],"zod/require-brand-type-parameter":`error`,"zod/require-schema-suffix":[`warn`,{suffix:`Schema`}],"zod/schema-error-property-style":[`error`,{selector:`Literal,TemplateLiteral`,example:`"This is an error message"`}],...t}}]}function Z(e,t){return typeof e==`boolean`?e:e?.enable??t??!1}function Q(e){if(typeof e==`boolean`||e===void 0)return{};let{enable:t,...n}=e;return n}async function $(t={},...n){let r;t.pnpm===void 0&&(r=a());let o=new e(me(t.ignores),he(t.js),L(),Ce(),V(),ge(),Ie(),Oe(),De(),I(),_e(),Ne(),Re(),ve(),fe());Z(t.css)&&(o=o.append(U(Q(t.css)))),Z(t.depend,!0)&&(o=o.append(W())),Z(t.turbo,i(`turbo`))&&(o=o.append(Pe(Q(t.turbo))));let{overrides:s,...c}=Q(t.ts);return Z(t.ts,i(`typescript`))&&(o=o.append(Fe(Q(t.ts)))),Z(t.react,i(`react`))&&(o=o.append(Ee({...Q(t.react),...c}))),Z(t.next,i(`next`))&&(o=o.append(xe({...Q(t.next),...c}))),Z(t.storybook,z.some(e=>i(e)))&&(o=o.append(ke({...Q(t.storybook),...c}))),Z(t.vitest,i(`vitest`))&&(o=o.append(Le(Q(t.vitest)))),Z(t.tailwind,i(`tailwindcss`))&&(o=o.append(Ae(Q(t.tailwind)))),Z(t.tanstackQuery,i(`react-query`)||i(`@tanstack/react-query`)||i(`@tanstack/react-query-devtools`))&&(o=o.append(je(Q(t.tanstackQuery)))),Z(t.tanstackRouter,i(`@tanstack/react-router`))&&(o=o.append(Y(Q(t.tanstackRouter)))),Z(t.drizzle,i(`drizzle-kit`)||i(`drizzle-orm`))&&(o=o.append(ue(Q(t.drizzle)))),Z(t.zod,i(`zod`))&&(o=o.append(ze(Q(t.zod)))),Z(t.graphql,i(`graphql`))&&(o=o.append(pe(Q(t.graphql)))),Z(t.pnpm,!!await r)&&(o=o.append(we())),o=o.append(...n),i(`prettier`)&&(o=o.append(Te())),o=o.append(ye()),o.renamePlugins(R).toConfigs()}export{$ as default,$ as twoDigits};
1
+ import{FlatConfigComposer as e,renamePluginsInConfigs as t,renamePluginsInRules as n}from"eslint-flat-config-utils";import{getPackageInfo as r,isPackageExists as i}from"local-pkg";import{findWorkspaceDir as a}from"pkg-types";import o from"eslint-plugin-antfu";import s,{configs as c}from"eslint-plugin-de-morgan";import l from"@eslint-community/eslint-plugin-eslint-comments";import u from"@eslint-community/eslint-plugin-eslint-comments/configs";import d from"@eslint/css";import{tailwind3 as f,tailwind4 as p}from"tailwind-csstree";import m from"eslint-plugin-depend";import{fixupPluginRules as h}from"@eslint/compat";import g,{configs as _}from"eslint-plugin-github-action";import*as v from"yaml-eslint-parser";import y from"eslint-config-flat-gitignore";import ee from"@eslint/js";import te from"@stylistic/eslint-plugin";import b from"globals";import x from"eslint-plugin-jsdoc";import S,{configs as C}from"eslint-plugin-jsonc";import*as w from"jsonc-eslint-parser";import T from"@eslint/markdown";import{mergeProcessors as ne,processorPassThrough as re}from"eslint-merge-processors";import ie from"eslint-plugin-n";import ae,{configs as oe}from"eslint-plugin-regexp";import se from"eslint-plugin-sonarjs";import*as E from"empathic/find";import ce,{configs as le}from"eslint-plugin-toml";import D from"eslint-plugin-unicorn";import O from"eslint-plugin-yml";const k=`**/*.?([cm])[jt]s?(x)`,A=`**/*.?([cm])ts`,j=`**/*.?([cm])tsx`,M=`.github/workflows/*.y?(a)ml`,N=`**/*.md`,P=`${N}/${k}`,F=`**/node_modules,**/dist,**/package-lock.json,**/yarn.lock,**/pnpm-lock.yaml,**/bun.lockb,**/bun.lock,**/output,**/coverage,**/temp,**/.temp,**/tmp,**/.tmp,**/.history,**/.vitepress/cache,**/.nuxt,**/.next,**/.vercel,**/.changeset,**/.idea,**/.cache,**/.output,**/.vite-inspect,**/.yarn,**/CHANGELOG*.md,**/*.min.*,**/LICENSE*,**/__snapshots__,**/auto-import?(s).d.ts,**/components.d.ts`.split(`,`);function I(){return[{files:[k],name:`2digits:antfu`,plugins:{antfu:o},rules:{"antfu/top-level-function":`error`}}]}function L(){return[{files:[k],name:`2digits:boolean`,plugins:{boolean:s},rules:{...c.recommended.rules}}]}const R={"@next/next":`next`,"@eslint-react":`react-extra`,"react-hooks":`react-hooks`,"react-compiler":`react-compiler`,"@stylistic/eslint-plugin":`stylistic`,"@typescript-eslint":`ts`,vitest:`vitest`,node:`node`,"@eslint-community/eslint-comments":`comments`,storybook:`storybook`,turbo:`turbo`,jsdoc:`jsdoc`,unicorn:`unicorn`,tailwindcss:`tailwindcss`,"@tanstack/query":`tanstack-query`,"@tanstack/router":`tanstack-router`,"@2digits":`@2digits`,"@graphql-eslint":`gql`,sonarjs:`sonar`,drizzle:`drizzle`,"de-morgan":`boolean`,antfu:`antfu`,css:`css`,depend:`depend`,"github-action":`github-action`,jsonc:`jsonc`,markdown:`markdown`,pnpm:`pnpm`,regexp:`regexp`,yml:`yml`,zod:`zod`,toml:`toml`},z=[`storybook`,`@storybook/nextjs`,`@storybook/nextjs-vite`,`@storybook/react-vite`,`@storybook/react-webpack5`,`@storybook/react-native-web-vite`],B=n(u.recommended.rules,R);function V(){return[{files:[k],name:`2digits:comments`,plugins:{comments:l},rules:{...B,"comments/no-unused-disable":`error`,"comments/disable-enable-pair":[`error`,{allowWholeFile:!0}]}}]}async function H(e){if(e?.customSyntax)return e.customSyntax;if(e?.tailwindMajor===3)return f;if(e?.tailwindMajor===4)return p;try{let e=(await r(`tailwindcss`))?.version??``,t=Number.parseInt(e.split(`.`)[0]??`0`,10);if(Number.isFinite(t)&&t>=4)return p}catch{}return f}async function U(e={}){let t=await H(e);return[{name:`2digits:css`,files:[`**/*.css`],language:`css/css`,plugins:{css:d},languageOptions:{tolerant:!0,customSyntax:t},rules:{...d.configs.recommended.rules,...e.overrides}}]}function W(){return[{files:[k],name:`2digits:depend`,plugins:{depend:m},rules:{"depend/ban-dependencies":`warn`}}]}async function G(e){let t=await e;return t.default??t}async function ue(e={}){let{overrides:t={},drizzleObjectName:n=[`drizzle`,`db`]}=e,r=await G(import(`eslint-plugin-drizzle`));return[{files:[k],name:`2digits:drizzle`,plugins:{drizzle:h(r)},rules:{"drizzle/enforce-update-with-where":[`error`,{drizzleObjectName:n}],"drizzle/enforce-delete-with-where":[`error`,{drizzleObjectName:n}],...t}}]}const de=Object.fromEntries(_.recommended.flatMap(({rules:e})=>Object.entries({...e})));function fe(){return[{name:`2digits:github-actions/setup`,plugins:{"github-action":g}},{name:`2digits:github-actions/recommended`,files:[M],ignores:[`!**/${M}`],languageOptions:{parser:v},rules:{...de}}]}async function pe(e={}){let{overrides:t={},files:r=[`**/*.graphql`,`**/*.gql`]}=e,[i,a]=await Promise.all([G(import(`@graphql-eslint/eslint-plugin`)),import(`graphql-config`).then(({loadConfig:e})=>e({throwOnEmpty:!1,throwOnMissing:!1}).then(e=>e?.getDefault().schema))]),o=i.configs[`flat/operations-recommended`].rules,s={};if(a)s=o;else for(let e of Object.keys(o)){let t=e.replace(`@graphql-eslint/`,``);t in i.rules&&(i.rules[t].meta.docs?.requiresSchema||i.rules[t].meta.docs?.requiresSiblings)||(s[e]=o[e])}let c=n(s,R);return[{name:`2digits:graphql`,plugins:{gql:i},languageOptions:{parser:i.parser},files:r,rules:{...c,"gql/naming-convention":[`error`,{allowLeadingUnderscore:!0}],...t}}]}function me(e={}){let{gitIgnore:t,ignores:n=[]}=e;return[{ignores:[F,n].flat(),name:`2digits:ignores`},y({strict:!1,...t,name:`2digits:gitignore`})]}function he(e={}){let{overrides:t={}}=e;return[{files:[k],name:`2digits:javascript`,plugins:{stylistic:te},languageOptions:{ecmaVersion:2022,globals:{...b.browser,...b.es2021,...b.node,document:`readonly`,navigator:`readonly`,window:`readonly`},parserOptions:{ecmaFeatures:{jsx:!0},ecmaVersion:2022,sourceType:`module`},sourceType:`module`},linterOptions:{reportUnusedDisableDirectives:!0},rules:{...ee.configs.recommended.rules,"accessor-pairs":[`error`,{enforceForClassMembers:!0,setWithoutGet:!0}],"array-callback-return":`error`,"block-scoped-var":`error`,"constructor-super":`error`,"default-case-last":`error`,"dot-notation":[`error`,{allowKeywords:!0}],eqeqeq:[`error`,`smart`],"new-cap":[`error`,{capIsNew:!1,newIsCap:!0,properties:!0}],"no-alert":`error`,"no-array-constructor":`error`,"no-async-promise-executor":`error`,"no-caller":`error`,"no-case-declarations":`error`,"no-class-assign":`error`,"no-compare-neg-zero":`error`,"no-cond-assign":[`error`,`always`],"no-const-assign":`error`,"no-control-regex":`error`,"no-debugger":`error`,"no-delete-var":`error`,"no-dupe-args":`error`,"no-dupe-class-members":`error`,"no-dupe-keys":`error`,"no-duplicate-case":`error`,"no-empty":[`error`,{allowEmptyCatch:!0}],"no-empty-character-class":`error`,"no-empty-pattern":`error`,"no-eval":`error`,"no-ex-assign":`error`,"no-extend-native":`error`,"no-extra-bind":`error`,"no-extra-boolean-cast":`error`,"no-fallthrough":`error`,"no-func-assign":`error`,"no-global-assign":`error`,"no-implied-eval":`error`,"no-import-assign":`error`,"no-invalid-regexp":`error`,"no-irregular-whitespace":`error`,"no-iterator":`error`,"no-labels":[`error`,{allowLoop:!1,allowSwitch:!1}],"no-lone-blocks":`error`,"no-loss-of-precision":`error`,"no-misleading-character-class":`error`,"no-multi-str":`error`,"no-new":`error`,"no-new-func":`error`,"no-new-native-nonconstructor":`error`,"no-new-wrappers":`error`,"no-obj-calls":`error`,"no-octal":`error`,"no-octal-escape":`error`,"no-proto":`error`,"no-prototype-builtins":`error`,"no-redeclare":[`error`,{builtinGlobals:!1}],"no-regex-spaces":`error`,"no-restricted-globals":[`error`,{message:"Use `globalThis` instead.",name:`global`},{message:"Use `globalThis` instead.",name:`self`}],"no-restricted-properties":[`error`,{message:"Use `Object.getPrototypeOf` or `Object.setPrototypeOf` instead.",property:`__proto__`},{message:"Use `Object.defineProperty` instead.",property:`__defineGetter__`},{message:"Use `Object.defineProperty` instead.",property:`__defineSetter__`},{message:"Use `Object.getOwnPropertyDescriptor` instead.",property:`__lookupGetter__`},{message:"Use `Object.getOwnPropertyDescriptor` instead.",property:`__lookupSetter__`}],"no-restricted-syntax":[`error`,`DebuggerStatement`,`LabeledStatement`,`WithStatement`,`TSEnumDeclaration`,`TSExportAssignment`],"no-self-assign":[`error`,{props:!0}],"no-self-compare":`error`,"no-sequences":`error`,"no-shadow-restricted-names":`error`,"no-sparse-arrays":`error`,"no-template-curly-in-string":`error`,"no-this-before-super":`error`,"no-throw-literal":`error`,"no-undef":`error`,"no-undef-init":`error`,"no-unexpected-multiline":`error`,"no-unmodified-loop-condition":`error`,"no-unneeded-ternary":[`error`,{defaultAssignment:!1}],"no-unreachable":`error`,"no-unreachable-loop":`error`,"no-unsafe-finally":`error`,"no-unsafe-negation":`error`,"no-unused-expressions":[`error`,{allowShortCircuit:!0,allowTaggedTemplates:!0,allowTernary:!0}],"no-unused-vars":[`error`,{args:`none`,caughtErrors:`none`,ignoreRestSiblings:!0,vars:`all`}],"no-useless-assignment":`off`,"no-useless-backreference":`error`,"no-useless-call":`error`,"no-useless-catch":`error`,"no-useless-computed-key":`error`,"no-useless-constructor":`error`,"no-useless-rename":`error`,"no-var":`error`,"no-with":`error`,"object-shorthand":[`error`,`always`,{avoidQuotes:!0,ignoreConstructors:!1}],"one-var":[`error`,{initialized:`never`}],"prefer-arrow-callback":[`error`,{allowNamedFunctions:!0,allowUnboundThis:!0}],"prefer-const":[`error`,{destructuring:`all`,ignoreReadBeforeAssign:!0}],"prefer-exponentiation-operator":`error`,"prefer-promise-reject-errors":`error`,"prefer-regex-literals":[`error`,{disallowRedundantWrapping:!0}],"prefer-rest-params":`error`,"prefer-spread":`error`,"prefer-template":`error`,"symbol-description":`error`,"unicode-bom":[`error`,`never`],"use-isnan":[`error`,{enforceForIndexOf:!0,enforceForSwitchCase:!0}],"valid-typeof":[`error`,{requireStringLiterals:!0}],"vars-on-top":`error`,yoda:[`error`,`never`],"stylistic/padding-line-between-statements":[`error`,{blankLine:`always`,prev:[`const`,`let`],next:`*`},{blankLine:`any`,prev:[`const`,`let`],next:[`const`,`let`]},{blankLine:`always`,prev:`*`,next:`return`}],...t}}]}function ge(){return[{files:[k],name:`2digits:jsdoc`,plugins:{jsdoc:x},rules:{"jsdoc/check-access":`error`,"jsdoc/check-param-names":`error`,"jsdoc/check-property-names":`error`,"jsdoc/check-tag-names":[`error`,{typed:!0}],"jsdoc/check-types":`error`,"jsdoc/empty-tags":`error`,"jsdoc/implements-on-classes":`error`,"jsdoc/no-defaults":`error`,"jsdoc/no-multi-asterisks":`error`,"jsdoc/require-param":`error`,"jsdoc/require-param-name":`error`,"jsdoc/require-property":`error`,"jsdoc/require-property-description":`error`,"jsdoc/require-property-name":`error`,"jsdoc/require-returns-check":`error`,"jsdoc/require-returns-description":`error`,"jsdoc/require-yields":`error`,"jsdoc/require-yields-check":`error`}}]}function _e(){return[...C[`flat/base`].map(e=>({...e,name:`2digits:jsonc/base`})),{name:`2digits:jsonc/json`,files:[`**/*.json`],...K,rules:{...q(C[`flat/recommended-with-json`])}},{name:`2digits:jsonc/jsonc`,files:[`**/*.jsonc`],...K,rules:{...q(C[`flat/recommended-with-jsonc`])}},{name:`2digits:jsonc/json5`,files:[`**/*.json5`],...K,rules:{...q(C[`flat/recommended-with-json5`])}},{name:`2digits:jsonc/package.json`,...K,files:[`**/package.json`],rules:{"jsonc/sort-array-values":[`error`,{order:{type:`asc`},pathPattern:`^files$`}],"jsonc/sort-keys":[`error`,{order:{type:`asc`},pathPattern:`^(?:dev|peer|optional|bundled)?[Dd]ependencies(Meta)?$`},{order:[`types`,`import`,`module`,`require`,`default`],pathPattern:`^exports.*$`}]}},{name:`2digits:jsonc/tsconfig.json`,...K,files:[`**/tsconfig.json`,`**/tsconfig.*.json`,`**/tsconfig-*.json`,`**/jsconfig.json`,`**/jsconfig.*.json`,`**/jsconfig-*.json`],rules:{"jsonc/sort-keys":[`error`,{order:[`$schema`,`extends`,`compilerOptions`,`references`,`files`,`include`,`exclude`],pathPattern:`^$`},{order:`incremental.composite.tsBuildInfoFile.disableSourceOfProjectReferenceRedirect.disableSolutionSearching.disableReferencedProjectLoad.target.lib.jsx.experimentalDecorators.emitDecoratorMetadata.jsxFactory.jsxFragmentFactory.jsxImportSource.reactNamespace.noLib.useDefineForClassFields.moduleDetection.module.rootDir.moduleResolution.baseUrl.paths.rootDirs.typeRoots.types.allowUmdGlobalAccess.moduleSuffixes.allowImportingTsExtensions.resolvePackageJsonExports.resolvePackageJsonImports.customConditions.resolveJsonModule.allowArbitraryExtensions.noResolve.allowJs.checkJs.maxNodeModuleJsDepth.declaration.declarationMap.emitDeclarationOnly.sourceMap.inlineSourceMap.outFile.outDir.removeComments.noEmit.importHelpers.importsNotUsedAsValues.downlevelIteration.sourceRoot.mapRoot.inlineSources.emitBOM.newLine.stripInternal.noEmitHelpers.noEmitOnError.preserveConstEnums.declarationDir.preserveValueImports.isolatedModules.verbatimModuleSyntax.allowSyntheticDefaultImports.esModuleInterop.preserveSymlinks.forceConsistentCasingInFileNames.strict.strictBindCallApply.strictFunctionTypes.strictNullChecks.strictPropertyInitialization.allowUnreachableCode.allowUnusedLabels.alwaysStrict.exactOptionalPropertyTypes.noFallthroughCasesInSwitch.noImplicitAny.noImplicitOverride.noImplicitReturns.noImplicitThis.noPropertyAccessFromIndexSignature.noUncheckedIndexedAccess.noUnusedLocals.noUnusedParameters.useUnknownInCatchVariables.skipDefaultLibCheck.skipLibCheck`.split(`.`),pathPattern:`^compilerOptions$`}]}},...C[`flat/prettier`].map(e=>({...e,name:`2digits:jsonc/prettier`}))]}const K={languageOptions:{parser:w},plugins:{jsonc:S}};function q(e){return Object.fromEntries(e.flatMap(({rules:e})=>Object.entries(e??{})))}const J=[N];function ve(){return[{name:`2digits:markdown/setup`,plugins:{markdown:T}},{name:`2digits:markdown/processor`,files:J,language:`markdown/gfm`,ignores:[`**/*.md/*.md`],processor:ne([T.processors.markdown,re])},{name:`2digits:markdown/parser`,files:J,language:`markdown/gfm`,languageOptions:{parser:be}},{name:`2digits:markdown/rules`,files:J,language:`markdown/gfm`,rules:{"markdown/fenced-code-language":`error`,"markdown/heading-increment":`error`,"markdown/no-empty-links":`error`,"markdown/no-invalid-label-refs":`error`,"markdown/no-missing-label-refs":`error`}}]}async function ye(){let e=await G(import(`typescript-eslint`)),t=await G(import(`@eslint-react/eslint-plugin`)),r=n({...e.configs.disableTypeChecked.rules,...t.configs[`disable-type-checked`].rules},R);return[{name:`2digits:markdown/disables`,files:[P],languageOptions:{parser:e.parser,parserOptions:{project:!1,projectService:!1,ecmaFeatures:{impliedStrict:!0}}},rules:{...r,"no-alert":`off`,"no-console":`off`,"no-labels":`off`,"no-lone-blocks":`off`,"no-restricted-syntax":`off`,"no-undef":`off`,"no-unused-expressions":`off`,"no-unused-labels":`off`,"no-unused-vars":`off`,"node/prefer-global/process":`off`,"ts/consistent-type-imports":`off`,"ts/explicit-function-return-type":`off`,"ts/no-namespace":`off`,"ts/no-redeclare":`off`,"ts/no-require-imports":`off`,"ts/no-unused-expressions":`off`,"ts/no-unused-vars":`off`,"ts/no-use-before-define":`off`,"unicode-bom":`off`}}]}const be={meta:{name:`parser-plain`},parseForESLint:e=>({ast:{body:[],comments:[],loc:{end:e.length,start:0},range:[0,e.length],tokens:[],type:`Program`},scopeManager:null,services:{isPlain:!0},visitorKeys:{Program:[]}})};async function xe(e={}){let{files:t=[A,j],overrides:r={},parserOptions:i}=e,[a,o]=await Promise.all([G(import(`@next/eslint-plugin-next`)),G(import(`@typescript-eslint/parser`))]),s=n({...a.configs.recommended.rules,...a.configs[`core-web-vitals`].rules},R);return[{name:`2digits:next/setup`,plugins:{next:h(a)}},{name:`2digits:next/rules`,files:t,languageOptions:{parser:o,parserOptions:{ecmaFeatures:{jsx:!0},projectService:!0,...i},sourceType:`module`},rules:{...s,"next/no-html-link-for-pages":`off`,...r}},{files:[`**/middleware.ts`,`**/proxy.ts`],name:`2digits:next/proxy`,rules:{"unicorn/prefer-string-raw":`off`}}]}var Se={node:`24.14.1`};function Ce(){return[{files:[k],name:`2digits:node`,settings:{node:{version:Se.node}},plugins:{node:ie},rules:{"node/handle-callback-err":[`error`,`^(err|error)$`],"node/no-deprecated-api":`error`,"node/no-exports-assign":`error`,"node/no-new-require":`error`,"node/no-path-concat":`error`,"node/no-unsupported-features/node-builtins":[`error`,{allowExperimental:!0}],"node/prefer-global/buffer":`error`,"node/prefer-global/process":`error`,"node/prefer-global/text-encoder":`error`,"node/prefer-global/url":`error`,"node/prefer-global/console":`error`,"node/prefer-global/url-search-params":`error`,"node/prefer-global/text-decoder":`error`,"node/process-exit-as-throw":`error`}}]}async function we(){let e=await G(import(`eslint-plugin-pnpm`));return[{name:`2digits:pnpm/package-json`,files:[`package.json`,`**/package.json`],languageOptions:{parser:w},plugins:{pnpm:e},rules:{"pnpm/json-enforce-catalog":`error`,"pnpm/json-prefer-workspace-settings":`error`,"pnpm/json-valid-catalog":`error`}},{name:`2digits:pnpm/pnpm-workspace-yaml`,files:[`pnpm-workspace.yaml`],languageOptions:{parser:await G(import(`yaml-eslint-parser`))},plugins:{pnpm:e},rules:{"pnpm/yaml-no-duplicate-catalog-item":`error`,"pnpm/yaml-no-unused-catalog-item":`error`,"pnpm/yaml-valid-packages":`error`,"pnpm/yaml-enforce-settings":[`error`,{autofix:!0,settings:{catalogMode:`strict`,savePrefix:``,preferWorkspacePackages:!0,cleanupUnusedCatalogs:!0}}]}}]}async function Te(){let[e,t]=await Promise.all([G(import(`eslint-config-prettier`)),G(import(`@stylistic/eslint-plugin`))]);return[{name:`2digits:prettier`,plugins:{stylistic:t},rules:{...e.rules,"tailwindcss/classnames-order":`off`,"stylistic/jsx-newline":[`error`,{prevent:!1}]}}]}async function Ee(e={}){let{files:t=[A,j],overrides:r={},parserOptions:i,tsconfigRootDir:a,reactCompiler:o=!0}=e,[s,c,l,u]=await Promise.all([G(import(`@eslint-react/eslint-plugin`)),G(import(`@typescript-eslint/parser`)),o?G(import(`eslint-plugin-react-compiler`)):Promise.resolve(void 0),G(import(`@stylistic/eslint-plugin`))]),d=s.configs.all.plugins,f=n({...s.configs[`disable-conflict-eslint-plugin-react`].rules,...s.configs[`disable-conflict-eslint-plugin-react-hooks`].rules,...s.configs[`strict-type-checked`].rules},R);return[{name:`2digits:react/setup`,plugins:{stylistic:u,"react-extra":d[`@eslint-react`],...o?{"react-compiler":l}:{}},settings:{react:{version:`detect`}}},{name:`2digits:react/rules`,files:t,languageOptions:{parser:c,parserOptions:{ecmaFeatures:{jsx:!0},tsconfigRootDir:a,projectService:!0,...i},sourceType:`module`},rules:{...f,...o?{"react-compiler/react-compiler":`error`}:{},"react-extra/exhaustive-deps":`error`,"react-extra/purity":`error`,"react-extra/no-unused-class-component-members":`error`,"react-extra/no-unnecessary-use-callback":`error`,"react-extra/no-unnecessary-use-prefix":`error`,"react-extra/no-unnecessary-use-memo":`error`,"react-extra/set-state-in-effect":`error`,"react-extra/use-state":`error`,"react-extra/no-unstable-context-value":`error`,"react-extra/no-unstable-default-props":`error`,"react-extra/no-unused-props":`error`,"react-extra/no-context-provider":`error`,"react-extra/no-forward-ref":`error`,"react-extra/no-use-context":`error`,"react-extra/immutability":`error`,"react-extra/refs":`error`,"react-extra/no-duplicate-key":`error`,"react-extra/dom-no-missing-button-type":`error`,"react-extra/dom-no-missing-iframe-sandbox":`error`,"react-extra/dom-no-unsafe-target-blank":`error`,"react-extra/naming-convention-context-name":`error`,"react-extra/naming-convention-id-name":`error`,"react-extra/naming-convention-ref-name":`error`,"react-extra/prefer-namespace-import":`error`,"react-extra/jsx-no-useless-fragment":`off`,"stylistic/jsx-curly-newline":`off`,"stylistic/jsx-newline":[`error`,{prevent:!1}],"stylistic/jsx-self-closing-comp":`error`,...r}}]}function De(){return[{files:[k],name:`2digits:regexp`,plugins:{regexp:ae},rules:{...oe[`flat/recommended`].rules}}]}function Oe(){return[{files:[k],name:`2digits:sonar`,plugins:{sonar:se},rules:{"sonar/cognitive-complexity":`error`,"sonar/comma-or-logical-or-case":`error`,"sonar/concise-regex":`error`,"sonar/confidential-information-logging":`error`,"sonar/constructor-for-side-effects":`error`,"sonar/content-length":`error`,"sonar/content-security-policy":`error`,"sonar/cookie-no-httponly":`error`,"sonar/cors":`error`,"sonar/csrf":`error`,"sonar/max-switch-cases":`error`,"sonar/no-all-duplicated-branches":`error`,"sonar/no-collapsible-if":`error`,"sonar/no-collection-size-mischeck":`error`,"sonar/no-duplicate-string":[`error`,{threshold:5}],"sonar/no-duplicated-branches":`error`,"sonar/no-element-overwrite":`error`,"sonar/no-empty-collection":`error`,"sonar/no-extra-arguments":`error`,"sonar/no-for-in-iterable":`error`,"sonar/no-gratuitous-expressions":`error`,"sonar/no-identical-conditions":`error`,"sonar/no-identical-expressions":`error`,"sonar/no-identical-functions":`error`,"sonar/no-ignored-return":`error`,"sonar/no-inverted-boolean-check":`error`,"sonar/no-nested-switch":`error`,"sonar/no-nested-template-literals":`error`,"sonar/no-redundant-boolean":`error`,"sonar/no-same-line-conditional":`error`,"sonar/no-small-switch":`error`,"sonar/no-unused-collection":`error`,"sonar/no-use-of-empty-return-value":`error`,"sonar/no-useless-catch":`error`,"sonar/non-existent-operator":`error`,"sonar/prefer-immediate-return":`error`,"sonar/prefer-object-literal":`error`,"sonar/prefer-single-boolean-return":`error`,"sonar/prefer-while":`error`,"sonar/elseif-without-else":`off`,"sonar/no-redundant-jump":`off`}}]}async function ke(e={}){let{files:t=[`**/*.stories.tsx`],overrides:n={},parserOptions:r,storybookDirectory:i=`.storybook`}=e,[a,o]=await Promise.all([G(import(`eslint-plugin-storybook`)),G(import(`@typescript-eslint/parser`))]),s={parser:o,parserOptions:{ecmaFeatures:{jsx:!0},projectService:!0,...r},sourceType:`module`};return[{name:`2digits:storybook/setup`,plugins:{storybook:a}},{name:`2digits:storybook/rules`,files:t,languageOptions:s,rules:{"storybook/await-interactions":`error`,"storybook/context-in-play-function":`error`,"storybook/csf-component":`error`,"storybook/default-exports":`error`,"storybook/hierarchy-separator":`error`,"storybook/meta-inline-properties":`error`,"storybook/no-redundant-story-name":`error`,"storybook/no-stories-of":`error`,"storybook/no-title-property-in-meta":`error`,"storybook/no-uninstalled-addons":`error`,"storybook/prefer-pascal-case":`error`,"storybook/story-exports":`error`,"storybook/use-storybook-expect":`error`,"storybook/use-storybook-testing-library":`error`,"storybook/meta-satisfies-type":`error`,"storybook/no-renderer-packages":`error`,...n}},{name:`2digits:storybook/disables`,files:t,rules:{"sonar/no-duplicate-string":`off`}},{name:`2digits:storybook/config`,files:[`${i}/main.@(js|cjs|mjs|ts)`],languageOptions:s,rules:{"storybook/no-uninstalled-addons":`error`}}]}async function Ae(e={}){let{overrides:t={}}=e,[n,{tailwindFunctions:r},i]=await Promise.all([G(import(`eslint-plugin-tailwindcss`)),G(import(`@2digits/constants`)),a().catch(()=>void 0)]),o=E.file(`tailwind.config.ts`,{last:i})??E.file(`tailwind.config.js`,{last:i});return[{files:[k],name:`2digits:tailwind`,plugins:{tailwindcss:n},settings:{tailwindcss:{callees:r,config:o}},rules:{...n.configs.recommended.rules,...t}}]}async function je(e={}){let{overrides:t={}}=e,r=await G(import(`@tanstack/eslint-plugin-query`)),i=n(r.configs[`flat/recommended`].at(0)?.rules??{},R);return[{files:[k],name:`2digits:tanstack-query`,plugins:{"tanstack-query":r},rules:{...i,"tanstack-query/prefer-query-options":`error`,...t}}]}async function Y(e={}){let{overrides:t={}}=e,r=await G(import(`@tanstack/eslint-plugin-router`)),i=n(r.configs[`flat/recommended`].at(0)?.rules??{},R);return[{files:[k],name:`2digits:tanstack-router`,plugins:{"tanstack-router":r},rules:{...i,"ts/only-throw-error":[`error`,{allow:[{from:`package`,package:`@tanstack/router-core`,name:`Redirect`}]}],...t}}]}const Me=Object.fromEntries(le.standard.flatMap(({rules:e})=>Object.entries({...e})));function Ne(){return[{name:`2digits:toml`,files:[`**/*.toml`],language:`toml/toml`,plugins:{toml:ce},rules:{...Me,"toml/array-bracket-spacing":[`error`,`never`],"toml/array-element-newline":[`error`,`consistent`],"toml/indent":[`error`,2,{keyValuePairs:0,subTables:0}]}}]}async function Pe(e={}){let{overrides:t={}}=e,n=await G(import(`eslint-plugin-turbo`));return[{files:[k],name:`2digits:turbo`,plugins:{turbo:n},rules:{"turbo/no-undeclared-env-vars":`error`,...t}}]}async function Fe(e={}){let{overrides:n={},parserOptions:r={}}=e,[{plugin:i,configs:a,parser:o},s]=await Promise.all([G(import(`typescript-eslint`)),G(import(`@2digits/eslint-plugin`))]),c=t(a.strictTypeChecked,R),l=Object.fromEntries(c.flatMap(({rules:e})=>Object.entries(e??{})));return[{name:`2digits:typescript/setup`,plugins:{ts:i,"@2digits":s}},{name:`2digits:typescript/rules`,files:[k],languageOptions:{parser:o,parserOptions:{tsconfigRootDir:process.cwd(),projectService:!0,warnOnUnsupportedTypeScriptVersion:!1,...r},sourceType:`module`},rules:{...l,"ts/array-type":[`error`,{default:`generic`,readonly:`generic`}],"ts/restrict-template-expressions":[`error`,{allowNumber:!0}],"ts/ban-ts-comment":[`error`,{"ts-ignore":`allow-with-description`}],"ts/consistent-type-exports":[`error`],"ts/consistent-type-imports":[`error`,{prefer:`type-imports`,disallowTypeAnnotations:!1,fixStyle:`inline-type-imports`}],"ts/no-empty-object-type":[`error`,{allowInterfaces:`with-single-extends`,allowObjectTypes:`never`}],"ts/no-explicit-any":[`error`],"ts/no-import-type-side-effects":[`error`],"ts/no-misused-promises":`off`,"ts/no-confusing-void-expression":`off`,"ts/no-unused-vars":[`error`,{ignoreRestSiblings:!0,argsIgnorePattern:`^_`,varsIgnorePattern:`^_`}],"ts/unbound-method":`off`,...s.configs.recommended.rules,...n}},{name:`2digits:typescript/disables/dts`,files:[`**/*.d.ts`],rules:{"unicorn/no-abusive-eslint-disable":`off`,"no-duplicate-imports":`off`,"no-restricted-syntax":`off`,"ts/no-unused-vars":`off`}},{name:`2digits:typescript/disables/test`,files:[`**/*.{test,spec}.ts?(x)`],rules:{"no-unused-expressions":`off`}},{name:`2digits:typescript/disables/cjs`,files:[`**/*.js`,`**/*.cjs`,`**/*.cts`],rules:{"ts/no-require-imports":`off`,"ts/no-var-requires":`off`}}]}function Ie(){return[{files:[k],name:`2digits:unicorn`,plugins:{unicorn:D},rules:{...D.configs.recommended.rules,"unicorn/no-array-callback-reference":`off`,"unicorn/filename-case":`off`,"unicorn/prefer-module":`off`,"unicorn/prevent-abbreviations":`off`,"unicorn/prefer-ternary":[`error`,`only-single-line`],"unicorn/no-useless-undefined":[`error`,{checkArguments:!1,checkArrowFunctionBody:!1}],"unicorn/prefer-top-level-await":`off`,"unicorn/no-nested-ternary":`off`}}]}async function Le(e={}){let{files:t=[`**/*.{test,spec}.ts?(x)`],overrides:n={},typecheck:r=!0,vitestImports:i}=e,a=await G(import(`@vitest/eslint-plugin`));return[{name:`2digits:vitest/setup`,plugins:{vitest:a}},{name:`2digits:vitest/rules`,files:t,languageOptions:{globals:a.environments.env.globals},settings:{vitest:{typecheck:r,...i?{vitestImports:i}:{}}},rules:{"vitest/consistent-each-for":[`error`,{describe:`for`,suite:`for`,it:`for`,test:`for`}],"vitest/consistent-test-filename":[`error`,{pattern:String.raw`.*\.spec\.[tj]sx?$`,allTestPattern:String.raw`.*\.(test|spec)\.[tj]sx?$`}],"vitest/consistent-test-it":[`error`,{fn:`it`,withinDescribe:`it`}],"vitest/consistent-vitest-vi":[`error`,{fn:`vi`}],"vitest/hoisted-apis-on-top":`error`,"vitest/no-conditional-tests":`error`,"vitest/no-import-node-test":`error`,"vitest/prefer-called-exactly-once-with":`error`,"vitest/prefer-called-once":`error`,"vitest/prefer-describe-function-title":`error`,"vitest/prefer-each":`error`,"vitest/prefer-expect-type-of":`error`,"vitest/prefer-import-in-mock":`error`,"vitest/prefer-to-be-falsy":`error`,"vitest/prefer-to-be-object":`error`,"vitest/prefer-to-be-truthy":`error`,"vitest/require-awaited-expect-poll":`error`,"vitest/require-local-test-context-for-concurrent-snapshots":`error`,"vitest/require-mock-type-parameters":`error`,"vitest/warn-todo":`error`,...n}}]}function Re(){return[{name:`2digits:yaml/setup`,plugins:{yml:O}},{name:`2digits:yaml/base`,...X,rules:{"no-irregular-whitespace":`off`,"no-unused-vars":`off`,"spaced-comment":`off`}},{name:`2digits:yaml/recommended`,...X,rules:{"yml/no-empty-document":`error`,"yml/no-empty-key":`error`,"yml/no-empty-mapping-value":`error`,"yml/no-empty-sequence-entry":`error`,"yml/no-irregular-whitespace":`error`,"yml/no-tab-indent":`error`,"yml/vue-custom-block/no-parsing-error":`error`}},{name:`2digits:yaml/standard`,...X,rules:{"yml/block-mapping":`error`,"yml/block-sequence":`error`,"yml/plain-scalar":`error`,"yml/spaced-comment":`error`}},{name:`2digits:yaml/prettier`,...X,rules:{"yml/block-mapping-colon-indicator-newline":`off`,"yml/block-mapping-question-indicator-newline":`off`,"yml/block-sequence-hyphen-indicator-newline":`off`,"yml/flow-mapping-curly-newline":`off`,"yml/flow-mapping-curly-spacing":`off`,"yml/flow-sequence-bracket-newline":`off`,"yml/flow-sequence-bracket-spacing":`off`,"yml/indent":`off`,"yml/key-spacing":`off`,"yml/no-multiple-empty-lines":`off`,"yml/no-trailing-zeros":`off`,"yml/quotes":`off`}}]}const X={files:[`**/*.y?(a)ml`],languageOptions:{parser:v}};async function ze(e={}){let{overrides:t={}}=e,n=await G(import(`eslint-plugin-zod`));return[{files:[k],name:`2digits:zod`,plugins:{zod:n},rules:{"zod/array-style":[`error`,{style:`function`}],"zod/consistent-import":[`error`,{syntax:`namespace`}],"zod/no-any-schema":`error`,"zod/no-empty-custom-schema":`error`,"zod/no-number-schema-with-int":`error`,"zod/no-optional-and-default-together":[`warn`,{preferredMethod:`default`}],"zod/no-string-schema-with-uuid":`error`,"zod/no-throw-in-refine":`error`,"zod/no-transform-in-record-key":`error`,"zod/prefer-enum-over-literal-union":`error`,"zod/prefer-meta":`error`,"zod/prefer-meta-last":`error`,"zod/prefer-string-schema-with-trim":`error`,"zod/require-brand-type-parameter":`error`,"zod/require-schema-suffix":[`warn`,{suffix:`Schema`}],"zod/schema-error-property-style":[`error`,{selector:`Literal,TemplateLiteral`,example:`"This is an error message"`}],...t}}]}function Z(e,t){return typeof e==`boolean`?e:e?.enable??t??!1}function Q(e){if(typeof e==`boolean`||e===void 0)return{};let{enable:t,...n}=e;return n}async function $(t={},...n){let r;t.pnpm===void 0&&(r=a());let o=new e(me(t.ignores),he(t.js),L(),Ce(),V(),ge(),Ie(),Oe(),De(),I(),_e(),Ne(),Re(),ve(),fe());Z(t.css)&&(o=o.append(U(Q(t.css)))),Z(t.depend,!0)&&(o=o.append(W())),Z(t.turbo,i(`turbo`))&&(o=o.append(Pe(Q(t.turbo))));let{overrides:s,...c}=Q(t.ts);return Z(t.ts,i(`typescript`))&&(o=o.append(Fe(Q(t.ts)))),Z(t.react,i(`react`))&&(o=o.append(Ee({...Q(t.react),...c}))),Z(t.next,i(`next`))&&(o=o.append(xe({...Q(t.next),...c}))),Z(t.storybook,z.some(e=>i(e)))&&(o=o.append(ke({...Q(t.storybook),...c}))),Z(t.vitest,i(`vitest`))&&(o=o.append(Le(Q(t.vitest)))),Z(t.tailwind,i(`tailwindcss`))&&(o=o.append(Ae(Q(t.tailwind)))),Z(t.tanstackQuery,i(`react-query`)||i(`@tanstack/react-query`)||i(`@tanstack/react-query-devtools`))&&(o=o.append(je(Q(t.tanstackQuery)))),Z(t.tanstackRouter,i(`@tanstack/react-router`))&&(o=o.append(Y(Q(t.tanstackRouter)))),Z(t.drizzle,i(`drizzle-kit`)||i(`drizzle-orm`))&&(o=o.append(ue(Q(t.drizzle)))),Z(t.zod,i(`zod`))&&(o=o.append(ze(Q(t.zod)))),Z(t.graphql,i(`graphql`))&&(o=o.append(pe(Q(t.graphql)))),Z(t.pnpm,!!await r)&&(o=o.append(we())),o=o.append(...n),i(`prettier`)&&(o=o.append(Te())),o=o.append(ye()),o.renamePlugins(R).toConfigs()}export{$ as default,$ as twoDigits};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@2digits/eslint-config",
3
- "version": "5.4.2",
3
+ "version": "5.4.4",
4
4
  "description": "Effortlessly enforce best practices and catch errors with this comprehensive ESLint configuration for TypeScript, featuring popular plugins like @typescript-eslint, eslint-plugin-react, and eslint-plugin-unicorn.",
5
5
  "keywords": [
6
6
  "eslint-config"
@@ -30,13 +30,13 @@
30
30
  "@eslint/js": "10.0.1",
31
31
  "@eslint/markdown": "8.0.1",
32
32
  "@graphql-eslint/eslint-plugin": "4.4.0",
33
- "@next/eslint-plugin-next": "16.2.3",
33
+ "@next/eslint-plugin-next": "16.2.4",
34
34
  "@stylistic/eslint-plugin": "5.10.0",
35
- "@tanstack/eslint-plugin-query": "5.99.0",
35
+ "@tanstack/eslint-plugin-query": "5.99.2",
36
36
  "@tanstack/eslint-plugin-router": "1.161.6",
37
- "@typescript-eslint/parser": "8.58.1",
38
- "@typescript-eslint/utils": "8.58.1",
39
- "@vitest/eslint-plugin": "1.6.15",
37
+ "@typescript-eslint/parser": "8.58.2",
38
+ "@typescript-eslint/utils": "8.58.2",
39
+ "@vitest/eslint-plugin": "1.6.16",
40
40
  "empathic": "2.0.0",
41
41
  "eslint-config-flat-gitignore": "2.3.0",
42
42
  "eslint-config-prettier": "10.1.8",
@@ -53,45 +53,45 @@
53
53
  "eslint-plugin-pnpm": "1.6.0",
54
54
  "eslint-plugin-react-compiler": "19.1.0-rc.2",
55
55
  "eslint-plugin-regexp": "3.1.0",
56
- "eslint-plugin-sonarjs": "4.0.2",
56
+ "eslint-plugin-sonarjs": "4.0.3",
57
57
  "eslint-plugin-storybook": "10.3.5",
58
58
  "eslint-plugin-tailwindcss": "3.18.2",
59
59
  "eslint-plugin-toml": "1.3.1",
60
60
  "eslint-plugin-turbo": "2.9.6",
61
61
  "eslint-plugin-unicorn": "64.0.0",
62
62
  "eslint-plugin-yml": "3.3.1",
63
- "eslint-plugin-zod": "3.5.3",
63
+ "eslint-plugin-zod": "3.7.0",
64
64
  "globals": "17.5.0",
65
65
  "graphql-config": "5.1.6",
66
66
  "jsonc-eslint-parser": "3.1.0",
67
67
  "local-pkg": "1.1.2",
68
68
  "pkg-types": "2.3.0",
69
69
  "tailwind-csstree": "0.3.1",
70
- "typescript-eslint": "8.58.1",
70
+ "typescript-eslint": "8.58.2",
71
71
  "yaml-eslint-parser": "2.0.0",
72
72
  "@2digits/constants": "1.1.18",
73
- "@2digits/eslint-plugin": "4.0.10"
73
+ "@2digits/eslint-plugin": "4.0.11"
74
74
  },
75
75
  "devDependencies": {
76
76
  "@arethetypeswrong/core": "0.18.2",
77
- "@eslint/config-inspector": "1.5.0",
77
+ "@eslint/config-inspector": "2.0.0",
78
78
  "@types/react": "19.2.14",
79
- "@typescript/native-preview": "7.0.0-dev.20260412.1",
79
+ "@typescript/native-preview": "7.0.0-dev.20260419.1",
80
80
  "dedent": "1.7.2",
81
- "eslint": "10.2.0",
81
+ "eslint": "10.2.1",
82
82
  "eslint-typegen": "2.3.1",
83
83
  "publint": "0.3.18",
84
84
  "react": "19.2.5",
85
85
  "tinyexec": "1.1.1",
86
86
  "tinyglobby": "0.2.16",
87
- "typescript": "6.0.2",
88
- "vite-plus": "0.1.16",
89
- "vitest": "npm:@voidzero-dev/vite-plus-test@0.1.16",
87
+ "typescript": "6.0.3",
88
+ "vite-plus": "0.1.18",
89
+ "vitest": "npm:@voidzero-dev/vite-plus-test@0.1.18",
90
90
  "zod": "4.3.6",
91
91
  "@2digits/tsconfig": "0.8.7"
92
92
  },
93
93
  "peerDependencies": {
94
- "eslint": "10.2.0"
94
+ "eslint": "10.2.1"
95
95
  },
96
96
  "engines": {
97
97
  "node": "24.14.1"