@jimmy.codes/eslint-config 3.19.0 → 3.21.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/README.md CHANGED
@@ -21,131 +21,52 @@ First install the package, by running the following:
21
21
  pnpm add -D @jimmy.codes/eslint-config
22
22
  ```
23
23
 
24
- Then if you want a simple configuration:
24
+ Then all you need to in your `eslint.config.js` is:
25
25
 
26
- ```js
27
- // eslint.config.mjs
28
- import jimmyDotCodes from "@jimmy.codes/eslint-config";
26
+ ```mjs
27
+ import eslintConfig from "@jimmy.codes/eslint-config";
29
28
 
30
- export default jimmyDotCodes();
29
+ export default eslintConfig();
31
30
  ```
32
31
 
33
- Or if you want to use [TypeScript configuration files](https://eslint.org/docs/latest/use/configure/configuration-files#typescript-configuration-files), you can do the following:
34
-
35
- Add `--flag unstable_ts_config` to your eslint script, for example:
36
-
37
- ```json
38
- {
39
- "scripts": {
40
- "lint": "eslint --flag unstable_ts_config ."
41
- }
42
- }
43
- ```
44
-
45
- And add the following to your `.vscode/settings.json`:
46
-
47
- ```json
48
- "eslint.options": {
49
- "flags": ["unstable_ts_config"]
50
- }
51
- ```
32
+ Which will enable rules based on your project dependencies.
52
33
 
53
34
  ### 🔧 Configuration
54
35
 
55
- > [!NOTE]
56
- > By default all rules are enabled based on the project's dependencies.
57
-
58
36
  This package contains rules that can be enabled or disabled as follows:
59
37
 
60
- ```js
61
- import jimmyDotCodes from "@jimmy.codes/eslint-config";
62
-
63
- export default jimmyDotCodes({
64
- /**
65
- * Are TypeScript rules enabled?
66
- * @default false
67
- */
68
- typescript: true,
69
- /**
70
- * Are React rules enabled?
71
- * @default false
72
- */
73
- react: true,
74
- /**
75
- * Are Astro rules enabled?
76
- * @default false
77
- */
78
- astro: true,
79
- /**
80
- * Are testing rules enabled?
81
- * @default false
82
- */
83
- testing: true,
38
+ ```ts
39
+ import eslintConfig from "@jimmy.codes/eslint-config";
40
+
41
+ export default eslintConfig({
42
+ astro: false,
43
+ jest: false,
44
+ playwright: false,
45
+ react: false,
46
+ storybook: false,
47
+ tanstackQuery: false,
48
+ testingLibrary: false,
49
+ typescript: false,
50
+ vitest: false,
84
51
  });
85
52
  ```
86
53
 
87
54
  Or you can turn off auto detection to disable rules based on a project's dependencies:
88
55
 
89
- ```js
90
- import jimmyDotCodes from "@jimmy.codes/eslint-config";
91
-
92
- export default jimmyDotCodes({ autoDetect: false });
93
- ```
94
-
95
- #### TypeScript
96
-
97
- You can also change the project location which can be helpful for monorepos:
98
-
99
- > [!WARNING]
100
- > This is [not recommended nor needed since the introduction of `projectService`](https://typescript-eslint.io/getting-started/typed-linting#can-i-customize-the-tsconfig-used-for-typed-linting) which this config uses by default.
101
-
102
- ```js
103
- import jimmyDotCodes from "@jimmy.codes/eslint-config";
104
-
105
- export default jimmyDotCodes({
106
- typescript: {
107
- project: ["./tsconfig.eslint.json", "./packages/*/tsconfig.json"],
108
- },
109
- });
110
- ```
111
-
112
- #### Testing
113
-
114
- By default [vitest](https://vitest.dev) is used as the testing framework but you can override and add additional rules for utilities:
115
-
116
- ```js
117
- import jimmyDotCodes from "@jimmy.codes/eslint-config";
118
-
119
- export default jimmyDotCodes({
120
- testing: {
121
- framework: "jest",
122
- utilities: ["testing-library"],
123
- },
124
- });
125
- ```
126
-
127
- #### React
128
-
129
- You can add additional rules for utilities:
130
-
131
- ```js
132
- import jimmyDotCodes from "@jimmy.codes/eslint-config";
56
+ ```ts
57
+ import eslintConfig from "@jimmy.codes/eslint-config";
133
58
 
134
- export default jimmyDotCodes({
135
- react: {
136
- utilities: ["@tanstack/query"],
137
- },
138
- });
59
+ export default eslintConfig({ autoDetect: false });
139
60
  ```
140
61
 
141
62
  #### Extending the Configuration
142
63
 
143
64
  You can also extend the configuration:
144
65
 
145
- ```js
146
- import jimmyDotCodes from "@jimmy.codes/eslint-config";
66
+ ```ts
67
+ import eslintConfig from "@jimmy.codes/eslint-config";
147
68
 
148
- export default jimmyDotCodes(
69
+ export default eslintConfig(
149
70
  {
150
71
  configs: [
151
72
  {
@@ -164,16 +85,42 @@ export default jimmyDotCodes(
164
85
  );
165
86
  ```
166
87
 
88
+ #### Ignores
89
+
167
90
  You can also extend what is ignored:
168
91
 
169
92
  ```ts
170
- import jimmyDotCodes from "@jimmy.codes/eslint-config";
93
+ import eslintConfig from "@jimmy.codes/eslint-config";
171
94
 
172
- export default jimmyDotCodes({
95
+ export default eslintConfig({
173
96
  ignores: ["**/*.mjs"],
174
97
  });
175
98
  ```
176
99
 
100
+ ### Typescript Configuration Files
101
+
102
+ If you want to use [TypeScript configuration files](https://eslint.org/docs/latest/use/configure/configuration-files#typescript-configuration-files), you can do the following:
103
+
104
+ Add `--flag unstable_ts_config` to your eslint script, for example:
105
+
106
+ ```json
107
+ {
108
+ "scripts": {
109
+ "lint": "eslint --flag unstable_ts_config ."
110
+ }
111
+ }
112
+ ```
113
+
114
+ And add the following to your `.vscode/settings.json`:
115
+
116
+ ```json
117
+ {
118
+ "eslint.options": {
119
+ "flags": ["unstable_ts_config"]
120
+ }
121
+ }
122
+ ```
123
+
177
124
  ## ❤️ Credits
178
125
 
179
126
  - [@antfu/eslint-config](https://github.com/antfu/eslint-config) by [Anthony Fu](https://antfu.me)
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var z=Object.create;var d=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var t=(e,r)=>d(e,"name",{value:r,configurable:!0});var H=(e,r,s,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of V(r))!D.call(e,a)&&a!==s&&d(e,a,{get:()=>r[a],enumerable:!(n=Q(r,a))||n.enumerable});return e};var o=(e,r,s)=>(s=e!=null?z(X(e)):{},H(r||!e||!e.__esModule?d(s,"default",{value:e,enumerable:!0}):s,e));var g=require("globals"),f=require("typescript-eslint"),k=require("@eslint-community/eslint-plugin-eslint-comments/configs"),u=require("eslint-plugin-import-x"),P=require("eslint-plugin-n"),U=require("@eslint/js"),O=require("eslint-plugin-perfectionist"),W=require("eslint-config-prettier"),Y=require("eslint-plugin-regexp"),l=require("local-pkg"),E=require("eslint-plugin-unicorn");function M(e){var r=Object.create(null);return e&&Object.keys(e).forEach(function(s){if(s!=="default"){var n=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(r,s,n.get?n:{enumerable:!0,get:t(function(){return e[s]},"get")})}}),r.default=e,Object.freeze(r)}t(M,"_interopNamespaceDefault");var q=M(Y);const c="?([cm])[jt]s?(x)",K=["**/node_modules","**/dist","**/package-lock.json","**/yarn.lock","**/pnpm-lock.yaml","**/bun.lockb","**/output","**/coverage","**/temp","**/.temp","**/tmp","**/.tmp","**/.history","**/.vitepress/cache","**/.nuxt","**/.next","**/.vercel","**/.changeset","**/.idea","**/.cache","**/.output","**/.vite-inspect","**/.yarn","**/storybook-static","**/.eslint-config-inspector","**/playwright-report","**/.astro","**/.vinxi","**/app.config.timestamp_*.js","**/CHANGELOG*.md","**/*.min.*","**/LICENSE*","**/__snapshots__","**/auto-import?(s).d.ts","**/components.d.ts","**/vite.config.ts.*.mjs","**/*.gen.*","!.storybook"],Z="**/*.?([cm])js",y="**/*.?([cm])jsx",_="**/*.?([cm])tsx",m=[`**/__tests__/**/*.${c}`,`**/*.spec.${c}`,`**/*.test.${c}`,`**/*.bench.${c}`,`**/*.benchmark.${c}`],C=[`**/e2e/**/*.spec.${c}`,`**/e2e/**/*.test.${c}`],j=[...C,`**/cypress/**/*.spec.${c}`,`**/cypress/**/*.test.${c}`],ee="**/*.cjs",re="**/*.astro",te=["vi.mock","describe","expect","it"],se=["@testing-library/react"],i=t(async e=>{const r=await e;return r.default??r},"interopDefault"),oe=t(async()=>{const e=[re],[r,s,n]=await Promise.all([import("eslint-plugin-astro"),import("astro-eslint-parser"),i(import("eslint-plugin-jsx-a11y"))]);return[{files:e,languageOptions:{globals:{...g.node,Astro:!1,Fragment:!1},parser:s,parserOptions:{extraFileExtensions:[".astro"],parser:f.parser},sourceType:"module"},name:"jimmy.codes/astro",plugins:{astro:r,"jsx-a11y":n},processor:"astro/client-side-ts",rules:{...n.configs.recommended.rules,"astro/missing-client-only-directive-value":"error","astro/no-conflict-set-directives":"error","astro/no-deprecated-astro-canonicalurl":"error","astro/no-deprecated-astro-fetchcontent":"error","astro/no-deprecated-astro-resolve":"error","astro/no-deprecated-getentrybyslug":"error","astro/no-exports-from-components":"off","astro/no-unused-define-vars-in-style":"error","astro/valid-compile":"error"}},{files:e,languageOptions:{parserOptions:f.configs.disableTypeChecked.languageOptions?.parserOptions},name:"jimmy.codes/astro/disable-type-checked",rules:f.configs.disableTypeChecked.rules},{name:"jimmy.codes/astro/imports",settings:{"import-x/core-modules":["astro:content"]}}]},"astroConfig"),ne=t(()=>[{files:[ee],languageOptions:{globals:g.commonjs},name:"jimmy.codes/commonjs"}],"commonjsConfig"),ie={...k.recommended.rules,"@eslint-community/eslint-comments/no-unused-disable":"off","@eslint-community/eslint-comments/require-description":"error"},ae=t(()=>[{...k.recommended,name:"jimmy.codes/eslint-comments",rules:ie}],"eslintCommentsConfig"),ce=t(e=>[{ignores:[...K,...e],name:"jimmy.codes/ignores"}],"ignoresConfig"),le={...u.configs.recommended.rules,"import-x/consistent-type-specifier-style":["error","prefer-top-level"],"import-x/extensions":["error","never",{checkTypedImports:!0,svg:"always"}],"import-x/first":"error","import-x/namespace":"off","import-x/newline-after-import":"error","import-x/no-absolute-path":"error","import-x/no-duplicates":"error","import-x/no-empty-named-blocks":"error","import-x/no-named-as-default":"error","import-x/no-named-as-default-member":"error","import-x/no-self-import":"error","import-x/no-unresolved":["error",{ignore:[String.raw`\.svg$`]}],"import-x/no-useless-path-segments":"error"},pe={name:"jimmy.codes/imports/typescript",rules:u.configs.typescript.rules,settings:{...u.configs.typescript.settings,"import-x/resolver":{...u.configs.typescript.settings["import-x/resolver"],typescript:!0}}},fe=t(({typescript:e=!1}={})=>[{name:"jimmy.codes/imports",plugins:{"import-x":u,n:P},rules:le},...e?[pe]:[]],"importsConfig"),ue={...U.configs.recommended.rules,"array-callback-return":["error",{allowImplicit:!0}],"arrow-body-style":["error","always"],curly:["error","all"],"no-console":"warn","no-self-compare":"error","no-template-curly-in-string":"error","no-unmodified-loop-condition":"error","no-unreachable-loop":"error","no-use-before-define":["error",{allowNamedExports:!1,classes:!1,functions:!1,variables:!0}],"no-useless-rename":"error","object-shorthand":"error","prefer-arrow-callback":"error"},me=t(()=>[{linterOptions:{reportUnusedDisableDirectives:!0},name:"jimmy.codes/javascript",rules:ue}],"javascriptConfig"),de={"n/no-process-exit":"off","n/prefer-node-protocol":"error"},ge=t(()=>[{name:"jimmy.codes/node",plugins:{n:P},rules:de}],"nodeConfig"),ye={...O.configs["recommended-natural"].rules,"perfectionist/sort-imports":["error",{customGroups:{type:{},value:{}},environment:"node",groups:["side-effect-style","builtin","type","external","internal-type","internal",["parent-type","sibling-type","index-type"],["parent","sibling","index"],"object","style","unknown"],internalPattern:["^~/.*","^@/.*"],order:"asc",type:"natural"}],"perfectionist/sort-modules":"off"},je=t(()=>[{name:"jimmy.codes/perfectionist",plugins:{perfectionist:O},rules:ye}],"perfectionistConfig"),he=t(async()=>({...(await i(import("eslint-plugin-playwright"))).configs["flat/recommended"].rules,"playwright/expect-expect":"error","playwright/max-nested-describe":"error","playwright/no-conditional-expect":"error","playwright/no-conditional-in-test":"error","playwright/no-element-handle":"error","playwright/no-eval":"error","playwright/no-force-option":"error","playwright/no-nested-step":"error","playwright/no-page-pause":"error","playwright/no-skipped-test":"error","playwright/no-useless-await":"error","playwright/no-useless-not":"error","playwright/no-wait-for-selector":"error","playwright/no-wait-for-timeout":"error"}),"playwrightRules"),xe=t(async()=>[{...(await i(import("eslint-plugin-playwright"))).configs["flat/recommended"],files:C,name:"jimmy.codes/playwright",rules:await he()}],"playwrightConfig"),be=t(()=>[{name:"jimmy.codes/prettier",...W}],"prettierConfig"),we=t(e=>e===2?"error":e===1?"warn":"off","toStringSeverity"),T=t((e={})=>Object.fromEntries(Object.entries(e).map(([r,s])=>[r,typeof s=="number"?we(s):s])),"normalizeRuleEntries"),ve=t(async()=>{const[e,r]=await Promise.all([i(import("eslint-plugin-react")),i(import("eslint-plugin-jsx-a11y"))]);return{...r.configs.recommended.rules,...T(e.configs.flat?.recommended?.rules),...T(e.configs.flat?.["jsx-runtime"]?.rules),"react-hooks/exhaustive-deps":"error","react-hooks/rules-of-hooks":"error","react-refresh/only-export-components":["warn",{allowConstantExport:!0}],"react/boolean-prop-naming":"off","react/button-has-type":"error","react/checked-requires-onchange-or-readonly":"error","react/default-props-match-prop-types":"error","react/destructuring-assignment":"off","react/forbid-component-props":"off","react/forbid-dom-props":"off","react/forbid-elements":"off","react/forbid-foreign-prop-types":"off","react/forbid-prop-types":"off","react/forward-ref-uses-ref":"error","react/function-component-definition":"off","react/hook-use-state":"error","react/iframe-missing-sandbox":"error","react/jsx-boolean-value":["error","never"],"react/jsx-curly-brace-presence":"error","react/jsx-filename-extension":"off","react/jsx-fragments":["error","syntax"],"react/jsx-handler-names":"off","react/jsx-max-depth":"off","react/jsx-no-bind":"off","react/jsx-no-constructed-context-values":"error","react/jsx-no-leaked-render":"error","react/jsx-no-literals":"off","react/jsx-no-script-url":"error","react/jsx-no-useless-fragment":"error","react/jsx-one-expression-per-line":"off","react/jsx-pascal-case":["error",{allowNamespace:!0}],"react/jsx-props-no-spread-multi":"off","react/jsx-props-no-spreading":"off","react/jsx-sort-default-props":"off","react/jsx-sort-props":"off","react/no-access-state-in-setstate":"error","react/no-adjacent-inline-elements":"off","react/no-array-index-key":"off","react/no-arrow-function-lifecycle":"error","react/no-danger":"off","react/no-did-mount-set-state":"error","react/no-did-update-set-state":"error","react/no-invalid-html-attribute":"error","react/no-multi-comp":"off","react/no-namespace":"error","react/no-object-type-as-default-prop":"error","react/no-redundant-should-component-update":"error","react/no-set-state":"off","react/no-this-in-sfc":"error","react/no-typos":"error","react/no-unstable-nested-components":"error","react/no-unused-class-component-methods":"error","react/no-unused-prop-types":"error","react/no-unused-state":"error","react/no-will-update-set-state":"error","react/prefer-es6-class":"off","react/prefer-exact-props":"off","react/prefer-read-only-props":"off","react/prefer-stateless-function":"off","react/require-default-props":"off","react/require-optimization":"off","react/self-closing-comp":"error","react/sort-comp":"off","react/sort-default-props":"off","react/sort-prop-types":"off","react/state-in-constructor":"off","react/static-property-placement":"off","react/style-prop-object":"error","react/void-dom-elements-no-children":"error"}},"reactRules"),ke=t(async()=>{const[e,r,s,n]=await Promise.all([i(import("eslint-plugin-react")),i(import("eslint-plugin-jsx-a11y")),import("eslint-plugin-react-hooks"),import("eslint-plugin-react-refresh")]);return[{files:[y,_],languageOptions:{globals:{...g.browser},parserOptions:{ecmaFeatures:{jsx:!0},jsxPragma:null}},name:"jimmy.codes/react",plugins:{"jsx-a11y":r,react:e,"react-hooks":s,"react-refresh":n},rules:await ve(),settings:{react:{version:"detect"}}}]},"reactConfig"),Pe={...q.configs["flat/recommended"].rules,"regexp/confusing-quantifier":"error","regexp/no-empty-alternative":"error","regexp/no-lazy-ends":"error","regexp/no-potentially-useless-backreference":"error","regexp/no-useless-flag":"error","regexp/optimal-lookaround-quantifier":"error"},Oe=t(()=>[{name:"jimmy.codes/regexp",plugins:{regexp:q},rules:Pe}],"regexpConfig"),Ee=t(async()=>{const e=await i(import("@tanstack/eslint-plugin-query"));return[{files:[y,_],name:"jimmy.codes/react/query",plugins:{"@tanstack/query":e},rules:{"@tanstack/query/exhaustive-deps":"error","@tanstack/query/no-rest-destructuring":"warn","@tanstack/query/stable-query-client":"error"}}]},"tanstackQuery"),R=t(async()=>{const e=await i(import("eslint-plugin-jest"));return{...e.configs["flat/recommended"].rules,...e.configs["flat/style"].rules,"jest/consistent-test-it":["error",{fn:"test",withinDescribe:"it"}],"jest/expect-expect":"error","jest/no-alias-methods":"error","jest/no-commented-out-tests":"error","jest/no-conditional-in-test":"error","jest/no-confusing-set-timeout":"error","jest/no-duplicate-hooks":"error","jest/no-hooks":"off","jest/no-large-snapshots":"off","jest/no-restricted-jest-methods":"off","jest/no-restricted-matchers":"off","jest/no-test-return-statement":"error","jest/no-untyped-mock-factory":"off","jest/prefer-called-with":"error","jest/prefer-comparison-matcher":"error","jest/prefer-each":"error","jest/prefer-equality-matcher":"error","jest/prefer-expect-assertions":"off","jest/prefer-expect-resolves":"error","jest/prefer-hooks-in-order":"error","jest/prefer-hooks-on-top":"error","jest/prefer-lowercase-title":"off","jest/prefer-mock-promise-shorthand":"error","jest/prefer-snapshot-hint":"error","jest/prefer-spy-on":"off","jest/prefer-strict-equal":"error","jest/prefer-todo":"warn","jest/require-hook":"error","jest/require-to-throw-message":"error","jest/require-top-level-describe":"off","jest/unbound-method":"off"}},"jestRules"),qe=t(async()=>({...await R(),"jest/no-deprecated-functions":"off","jest/require-hook":["error",{allowedFunctionCalls:te}]}),"vitestRules"),_e=t(()=>l.isPackageExists("typescript"),"hasTypescript"),Ce=t(()=>l.isPackageExists("react"),"hasReact"),L=t(()=>l.isPackageExists("vitest"),"hasVitest"),S=t(()=>l.isPackageExists("jest"),"hasJest"),Te=t(()=>L()||S(),"hasTesting"),Re=t(()=>se.some(e=>l.isPackageExists(e)),"hasTestingLibrary"),Le=t(()=>l.isPackageExists("@tanstack/react-query"),"hasReactQuery"),Se=t(()=>l.isPackageExists("astro"),"hasAstro"),Ge=t(()=>l.isPackageExists("@playwright/test"),"hasPlaywright"),Ae=t(async({framework:e="vitest"}={},r=!0)=>{const s=r?L():e==="vitest",n=e==="jest"||r&&S(),a=[];if(s){const p=await i(import("eslint-plugin-jest"));a.push({files:m,ignores:j,...p.configs["flat/recommended"],name:"jimmy.codes/vitest",rules:await qe()})}if(n){const p=await i(import("eslint-plugin-jest"));a.push({files:m,ignores:j,...p.configs["flat/recommended"],name:"jimmy.codes/jest",rules:await R()})}return a},"testingConfig"),Ie=t(async()=>{const[e,r]=await Promise.all([import("eslint-plugin-jest-dom"),i(import("eslint-plugin-testing-library"))]);return{...r.configs["flat/react"].rules,...e.configs["flat/recommended"].rules}},"testingLibraryRules"),Be=t(async()=>{const[e,r]=await Promise.all([import("eslint-plugin-jest-dom"),i(import("eslint-plugin-testing-library"))]);return[{files:m,ignores:j,name:"jimmy.codes/testing-library",plugins:{"jest-dom":e,"testing-library":r},rules:await Ie()}]},"testingLibrary"),Ne={"@typescript-eslint/consistent-type-exports":["error",{fixMixedExportsWithInlineTypeSpecifier:!1}],"@typescript-eslint/consistent-type-imports":["error",{fixStyle:"separate-type-imports"}],"@typescript-eslint/no-deprecated":"warn","@typescript-eslint/no-misused-promises":["error",{checksVoidReturn:{attributes:!1}}],"@typescript-eslint/no-unused-vars":["error",{args:"all",argsIgnorePattern:"^_",caughtErrors:"all",caughtErrorsIgnorePattern:"^_",destructuredArrayIgnorePattern:"^_",ignoreRestSiblings:!0,varsIgnorePattern:"^_"}],"@typescript-eslint/no-use-before-define":["error",{allowNamedExports:!1,classes:!1,functions:!1,variables:!0}],"@typescript-eslint/restrict-template-expressions":["error",{allowNumber:!0}],"no-use-before-define":"off"},$e=t(e=>[...f.configs.strictTypeChecked,...f.configs.stylisticTypeChecked.filter(r=>r.name==="typescript-eslint/stylistic-type-checked"),{languageOptions:{parserOptions:{...e?.project?{project:e.project}:{projectService:!0},tsconfigRootDir:process.cwd()}},name:"jimmy.codes/typescript",rules:Ne},{files:[Z,y],...f.configs.disableTypeChecked},{files:m,name:"jimmy.codes/typescript/testing",rules:{"@typescript-eslint/no-unsafe-argument":"off","@typescript-eslint/no-unsafe-assignment":"off"}}],"typescriptConfig"),Fe={...E.configs["flat/recommended"].rules,"unicorn/filename-case":"off","unicorn/import-style":"off","unicorn/no-abusive-eslint-disable":"off","unicorn/no-anonymous-default-export":"off","unicorn/no-array-callback-reference":"off","unicorn/no-array-reduce":"off","unicorn/no-null":"off","unicorn/no-process-exit":"off","unicorn/no-useless-undefined":["error",{checkArguments:!1,checkArrowFunctionBody:!1}],"unicorn/prefer-node-protocol":"off","unicorn/prevent-abbreviations":"off"},Je=t(()=>[{...E.configs["flat/recommended"],name:"jimmy.codes/unicorn",rules:Fe}],"unicornConfig"),ze=t(e=>typeof e=="object"?e:void 0,"getTypescriptOptions"),Qe=t(e=>typeof e=="object"?e:{framework:"vitest"},"getTestingOptions"),Ve=t(e=>typeof e=="object"?e:{utilities:[]},"getReactOptions"),Xe=t(({utilities:e=[]},r)=>e.includes("@tanstack/query")||r&&Le(),"shouldEnableTanstackQuery"),De=t(({utilities:e=[]},r)=>e.includes("testing-library")||r&&Re(),"shouldEnableTestingLibrary"),He=t(async({astro:e=!1,autoDetect:r=!0,configs:s=[],ignores:n=[],playwright:a=!1,react:p=!1,testing:h=!1,typescript:x=!1}={},...G)=>{const A=Ve(p),b=Qe(h),w=ze(x),v=x||!!w||r&&_e(),I=p||r&&Ce(),B=h||r&&Te(),N=e||r&&Se(),$=Xe(A,r),F=De(b,r),J=a||r&&Ge();return[me(),je(),ge(),Je(),ae(),Oe(),fe({typescript:v}),v?$e(w):[],I?await ke():[],$?await Ee():[],N?await oe():[],B?await Ae(b,r):[],F?await Be():[],J?await xe():[],be(),ne(),ce(n),s,G].flat()},"jimmyDotCodes");module.exports=He;
1
+ "use strict";var W=Object.create;var d=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var t=(e,r)=>d(e,"name",{value:r,configurable:!0});var Z=(e,r,s,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of M(r))!K.call(e,a)&&a!==s&&d(e,a,{get:()=>r[a],enumerable:!(n=Y(r,a))||n.enumerable});return e};var o=(e,r,s)=>(s=e!=null?W(D(e)):{},Z(r||!e||!e.__esModule?d(s,"default",{value:e,enumerable:!0}):s,e));var g=require("globals"),p=require("typescript-eslint"),E=require("@eslint-community/eslint-plugin-eslint-comments/configs"),u=require("eslint-plugin-import-x"),O=require("eslint-plugin-n"),ee=require("@eslint/js"),C=require("eslint-plugin-perfectionist"),re=require("eslint-config-prettier"),te=require("eslint-plugin-regexp"),c=require("local-pkg"),q=require("eslint-plugin-unicorn");function se(e){var r=Object.create(null);return e&&Object.keys(e).forEach(function(s){if(s!=="default"){var n=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(r,s,n.get?n:{enumerable:!0,get:t(function(){return e[s]},"get")})}}),r.default=e,Object.freeze(r)}t(se,"_interopNamespaceDefault");var _=se(te);const l="?([cm])[jt]s?(x)",oe=["**/node_modules","**/dist","**/package-lock.json","**/yarn.lock","**/pnpm-lock.yaml","**/bun.lockb","**/output","**/coverage","**/temp","**/.temp","**/tmp","**/.tmp","**/.history","**/.vitepress/cache","**/.nuxt","**/.next","**/.vercel","**/.changeset","**/.idea","**/.cache","**/.output","**/.vite-inspect","**/.yarn","**/storybook-static","**/.eslint-config-inspector","**/playwright-report","**/.astro","**/.vinxi","**/app.config.timestamp_*.js","**/CHANGELOG*.md","**/*.min.*","**/LICENSE*","**/__snapshots__","**/auto-import?(s).d.ts","**/components.d.ts","**/vite.config.ts.*.mjs","**/*.gen.*","!.storybook"],ne="**/*.?([cm])js",y="**/*.?([cm])jsx",T="**/*.?([cm])tsx",m=[`**/__tests__/**/*.${l}`,`**/*.spec.${l}`,`**/*.test.${l}`,`**/*.bench.${l}`,`**/*.benchmark.${l}`],R=[`**/e2e/**/*.spec.${l}`,`**/e2e/**/*.test.${l}`],j=[...R,`**/cypress/**/*.spec.${l}`,`**/cypress/**/*.test.${l}`],ie="**/*.cjs",ae="**/*.astro",ce=["vi.mock","describe","expect","it"],le=["@testing-library/react"],i=t(async e=>{const r=await e;return r.default??r},"interopDefault"),pe=t(async()=>{const e=[ae],[r,s,n]=await Promise.all([import("eslint-plugin-astro"),import("astro-eslint-parser"),i(import("eslint-plugin-jsx-a11y"))]);return[{files:e,languageOptions:{globals:{...g.node,Astro:!1,Fragment:!1},parser:s,parserOptions:{extraFileExtensions:[".astro"],parser:p.parser},sourceType:"module"},name:"jimmy.codes/astro",plugins:{astro:r,"jsx-a11y":n},processor:"astro/client-side-ts",rules:{...n.configs.recommended.rules,"astro/missing-client-only-directive-value":"error","astro/no-conflict-set-directives":"error","astro/no-deprecated-astro-canonicalurl":"error","astro/no-deprecated-astro-fetchcontent":"error","astro/no-deprecated-astro-resolve":"error","astro/no-deprecated-getentrybyslug":"error","astro/no-exports-from-components":"off","astro/no-unused-define-vars-in-style":"error","astro/valid-compile":"error"}},{files:e,languageOptions:{parserOptions:p.configs.disableTypeChecked.languageOptions?.parserOptions},name:"jimmy.codes/astro/disable-type-checked",rules:p.configs.disableTypeChecked.rules},{name:"jimmy.codes/astro/imports",settings:{"import-x/core-modules":["astro:content"]}}]},"astroConfig"),fe=t(()=>[{files:[ie],languageOptions:{globals:g.commonjs},name:"jimmy.codes/commonjs"}],"commonjsConfig"),ue={...E.recommended.rules,"@eslint-community/eslint-comments/no-unused-disable":"off","@eslint-community/eslint-comments/require-description":"error"},me=t(()=>[{...E.recommended,name:"jimmy.codes/eslint-comments",rules:ue}],"eslintCommentsConfig"),de=t(e=>[{ignores:[...oe,...e],name:"jimmy.codes/ignores"}],"ignoresConfig"),ge={...u.configs.recommended.rules,"import-x/consistent-type-specifier-style":["error","prefer-top-level"],"import-x/extensions":["error","never",{checkTypedImports:!0,svg:"always"}],"import-x/first":"error","import-x/namespace":"off","import-x/newline-after-import":"error","import-x/no-absolute-path":"error","import-x/no-duplicates":"error","import-x/no-empty-named-blocks":"error","import-x/no-named-as-default":"error","import-x/no-named-as-default-member":"error","import-x/no-self-import":"error","import-x/no-unresolved":["error",{ignore:[String.raw`\.svg$`]}],"import-x/no-useless-path-segments":"error"},ye={name:"jimmy.codes/imports/typescript",rules:u.configs.typescript.rules,settings:{...u.configs.typescript.settings,"import-x/resolver":{...u.configs.typescript.settings["import-x/resolver"],typescript:!0}}},je=t(({typescript:e=!1}={})=>[{name:"jimmy.codes/imports",plugins:{"import-x":u,n:O},rules:ge},...e?[ye]:[]],"importsConfig"),xe={...ee.configs.recommended.rules,"array-callback-return":["error",{allowImplicit:!0}],"arrow-body-style":["error","always"],curly:["error","all"],"no-console":"warn","no-self-compare":"error","no-template-curly-in-string":"error","no-unmodified-loop-condition":"error","no-unreachable-loop":"error","no-use-before-define":["error",{allowNamedExports:!1,classes:!1,functions:!1,variables:!0}],"no-useless-rename":"error","object-shorthand":"error","prefer-arrow-callback":"error"},he=t(()=>[{linterOptions:{reportUnusedDisableDirectives:!0},name:"jimmy.codes/javascript",rules:xe}],"javascriptConfig"),be={"n/no-process-exit":"off","n/prefer-node-protocol":"error"},we=t(()=>[{name:"jimmy.codes/node",plugins:{n:O},rules:be}],"nodeConfig"),ve={...C.configs["recommended-natural"].rules,"perfectionist/sort-imports":["error",{customGroups:{type:{},value:{}},environment:"node",groups:["side-effect-style","builtin","type","external","internal-type","internal",["parent-type","sibling-type","index-type"],["parent","sibling","index"],"object","style","unknown"],internalPattern:["^~/.*","^@/.*"],order:"asc",type:"natural"}],"perfectionist/sort-modules":"off"},ke=t(()=>[{name:"jimmy.codes/perfectionist",plugins:{perfectionist:C},rules:ve}],"perfectionistConfig"),Pe=t(async()=>({...(await i(import("eslint-plugin-playwright"))).configs["flat/recommended"].rules,"playwright/expect-expect":"error","playwright/max-nested-describe":"error","playwright/no-conditional-expect":"error","playwright/no-conditional-in-test":"error","playwright/no-element-handle":"error","playwright/no-eval":"error","playwright/no-force-option":"error","playwright/no-nested-step":"error","playwright/no-page-pause":"error","playwright/no-skipped-test":"error","playwright/no-useless-await":"error","playwright/no-useless-not":"error","playwright/no-wait-for-selector":"error","playwright/no-wait-for-timeout":"error"}),"playwrightRules"),Ee=t(async()=>[{...(await i(import("eslint-plugin-playwright"))).configs["flat/recommended"],files:R,name:"jimmy.codes/playwright",rules:await Pe()}],"playwrightConfig"),Oe=t(()=>[{name:"jimmy.codes/prettier",...re}],"prettierConfig"),Ce=t(e=>e===2?"error":e===1?"warn":"off","toStringSeverity"),L=t((e={})=>Object.fromEntries(Object.entries(e).map(([r,s])=>[r,typeof s=="number"?Ce(s):s])),"normalizeRuleEntries"),qe=t(async()=>{const[e,r]=await Promise.all([i(import("eslint-plugin-react")),i(import("eslint-plugin-jsx-a11y"))]);return{...r.configs.recommended.rules,...L(e.configs.flat?.recommended?.rules),...L(e.configs.flat?.["jsx-runtime"]?.rules),"react-hooks/exhaustive-deps":"error","react-hooks/rules-of-hooks":"error","react-refresh/only-export-components":["warn",{allowConstantExport:!0}],"react/boolean-prop-naming":"off","react/button-has-type":"error","react/checked-requires-onchange-or-readonly":"error","react/default-props-match-prop-types":"error","react/destructuring-assignment":"off","react/forbid-component-props":"off","react/forbid-dom-props":"off","react/forbid-elements":"off","react/forbid-foreign-prop-types":"off","react/forbid-prop-types":"off","react/forward-ref-uses-ref":"error","react/function-component-definition":"off","react/hook-use-state":"error","react/iframe-missing-sandbox":"error","react/jsx-boolean-value":["error","never"],"react/jsx-curly-brace-presence":"error","react/jsx-filename-extension":"off","react/jsx-fragments":["error","syntax"],"react/jsx-handler-names":"off","react/jsx-max-depth":"off","react/jsx-no-bind":"off","react/jsx-no-constructed-context-values":"error","react/jsx-no-leaked-render":"error","react/jsx-no-literals":"off","react/jsx-no-script-url":"error","react/jsx-no-useless-fragment":"error","react/jsx-one-expression-per-line":"off","react/jsx-pascal-case":["error",{allowNamespace:!0}],"react/jsx-props-no-spread-multi":"off","react/jsx-props-no-spreading":"off","react/jsx-sort-default-props":"off","react/jsx-sort-props":"off","react/no-access-state-in-setstate":"error","react/no-adjacent-inline-elements":"off","react/no-array-index-key":"off","react/no-arrow-function-lifecycle":"error","react/no-danger":"off","react/no-did-mount-set-state":"error","react/no-did-update-set-state":"error","react/no-invalid-html-attribute":"error","react/no-multi-comp":"off","react/no-namespace":"error","react/no-object-type-as-default-prop":"error","react/no-redundant-should-component-update":"error","react/no-set-state":"off","react/no-this-in-sfc":"error","react/no-typos":"error","react/no-unstable-nested-components":"error","react/no-unused-class-component-methods":"error","react/no-unused-prop-types":"error","react/no-unused-state":"error","react/no-will-update-set-state":"error","react/prefer-es6-class":"off","react/prefer-exact-props":"off","react/prefer-read-only-props":"off","react/prefer-stateless-function":"off","react/require-default-props":"off","react/require-optimization":"off","react/self-closing-comp":"error","react/sort-comp":"off","react/sort-default-props":"off","react/sort-prop-types":"off","react/state-in-constructor":"off","react/static-property-placement":"off","react/style-prop-object":"error","react/void-dom-elements-no-children":"error"}},"reactRules"),_e=t(async()=>{const[e,r,s,n]=await Promise.all([i(import("eslint-plugin-react")),i(import("eslint-plugin-jsx-a11y")),import("eslint-plugin-react-hooks"),import("eslint-plugin-react-refresh")]);return[{files:[y,T],languageOptions:{globals:{...g.browser},parserOptions:{ecmaFeatures:{jsx:!0},jsxPragma:null}},name:"jimmy.codes/react",plugins:{"jsx-a11y":r,react:e,"react-hooks":s,"react-refresh":n},rules:await qe(),settings:{react:{version:"detect"}}}]},"reactConfig"),Te={..._.configs["flat/recommended"].rules,"regexp/confusing-quantifier":"error","regexp/no-empty-alternative":"error","regexp/no-lazy-ends":"error","regexp/no-potentially-useless-backreference":"error","regexp/no-useless-flag":"error","regexp/optimal-lookaround-quantifier":"error"},Re=t(()=>[{name:"jimmy.codes/regexp",plugins:{regexp:_},rules:Te}],"regexpConfig"),Le=t((e={})=>Object.fromEntries(Object.entries(e).map(([r,s])=>[r,s==="warn"?"error":s])),"warningAsErrors"),Se=t(async()=>{const{configs:e}=await i(import("eslint-plugin-storybook")),[r,s,n]=e["flat/recommended"];return[{name:"jimmy.codes/storybook/setup",plugins:r?.plugins},{files:s?.files,name:"jimmy.codes/storybook/stories-rules",rules:{...Le(s?.rules),"import-x/no-anonymous-default-export":"off","unicorn/no-anonymous-default-export":"off"}},{files:n?.files,name:"jimmy.codes/storybook/main-rules",rules:{...n?.rules}}]},"storybookConfig"),Ae=t(async()=>{const e=await i(import("@tanstack/eslint-plugin-query"));return[{files:[y,T],name:"jimmy.codes/react/query",plugins:{"@tanstack/query":e},rules:{"@tanstack/query/exhaustive-deps":"error","@tanstack/query/no-rest-destructuring":"warn","@tanstack/query/stable-query-client":"error"}}]},"tanstackQueryConfig"),S=t(async()=>{const e=await i(import("eslint-plugin-jest"));return{...e.configs["flat/recommended"].rules,...e.configs["flat/style"].rules,"jest/consistent-test-it":["error",{fn:"test",withinDescribe:"it"}],"jest/expect-expect":"error","jest/no-alias-methods":"error","jest/no-commented-out-tests":"error","jest/no-conditional-in-test":"error","jest/no-confusing-set-timeout":"error","jest/no-duplicate-hooks":"error","jest/no-hooks":"off","jest/no-large-snapshots":"off","jest/no-restricted-jest-methods":"off","jest/no-restricted-matchers":"off","jest/no-test-return-statement":"error","jest/no-untyped-mock-factory":"off","jest/prefer-called-with":"error","jest/prefer-comparison-matcher":"error","jest/prefer-each":"error","jest/prefer-equality-matcher":"error","jest/prefer-expect-assertions":"off","jest/prefer-expect-resolves":"error","jest/prefer-hooks-in-order":"error","jest/prefer-hooks-on-top":"error","jest/prefer-lowercase-title":"off","jest/prefer-mock-promise-shorthand":"error","jest/prefer-snapshot-hint":"error","jest/prefer-spy-on":"off","jest/prefer-strict-equal":"error","jest/prefer-todo":"warn","jest/require-hook":"error","jest/require-to-throw-message":"error","jest/require-top-level-describe":"off","jest/unbound-method":"off"}},"jestRules"),Ge=t(async()=>({...await S(),"jest/no-deprecated-functions":"off","jest/require-hook":["error",{allowedFunctionCalls:ce}]}),"vitestRules"),Ie=t(()=>c.isPackageExists("typescript"),"hasTypescript"),Be=t(()=>c.isPackageExists("react"),"hasReact"),A=t(()=>c.isPackageExists("vitest"),"hasVitest"),G=t(()=>c.isPackageExists("jest"),"hasJest"),Ne=t(()=>A()||G(),"hasTesting"),$e=t(()=>le.some(e=>c.isPackageExists(e)),"hasTestingLibrary"),Fe=t(()=>c.isPackageExists("@tanstack/react-query"),"hasReactQuery"),Je=t(()=>c.isPackageExists("astro"),"hasAstro"),ze=t(()=>c.isPackageExists("@playwright/test"),"hasPlaywright"),Qe=t(()=>c.isPackageExists("storybook"),"hasStorybook"),Ve=t(async({framework:e="vitest"}={},r=!0)=>{const s=r?A():e==="vitest",n=e==="jest"||r&&G(),a=[];if(s){const f=await i(import("eslint-plugin-jest"));a.push({files:m,ignores:j,...f.configs["flat/recommended"],name:"jimmy.codes/vitest",rules:await Ge()})}if(n){const f=await i(import("eslint-plugin-jest"));a.push({files:m,ignores:j,...f.configs["flat/recommended"],name:"jimmy.codes/jest",rules:await S()})}return a},"testingConfig"),Xe=t(async()=>{const[e,r]=await Promise.all([import("eslint-plugin-jest-dom"),i(import("eslint-plugin-testing-library"))]);return{...r.configs["flat/react"].rules,...e.configs["flat/recommended"].rules}},"testingLibraryRules"),He=t(async()=>{const[e,r]=await Promise.all([import("eslint-plugin-jest-dom"),i(import("eslint-plugin-testing-library"))]);return[{files:m,ignores:j,name:"jimmy.codes/testing-library",plugins:{"jest-dom":e,"testing-library":r},rules:await Xe()}]},"testingLibraryConfig"),Ue={"@typescript-eslint/consistent-type-exports":["error",{fixMixedExportsWithInlineTypeSpecifier:!1}],"@typescript-eslint/consistent-type-imports":["error",{fixStyle:"separate-type-imports"}],"@typescript-eslint/no-deprecated":"warn","@typescript-eslint/no-misused-promises":["error",{checksVoidReturn:{attributes:!1}}],"@typescript-eslint/no-unused-vars":["error",{args:"all",argsIgnorePattern:"^_",caughtErrors:"all",caughtErrorsIgnorePattern:"^_",destructuredArrayIgnorePattern:"^_",ignoreRestSiblings:!0,varsIgnorePattern:"^_"}],"@typescript-eslint/no-use-before-define":["error",{allowNamedExports:!1,classes:!1,functions:!1,variables:!0}],"@typescript-eslint/restrict-template-expressions":["error",{allowNumber:!0}],"no-use-before-define":"off"},We=t(e=>[...p.configs.strictTypeChecked,...p.configs.stylisticTypeChecked.filter(r=>r.name==="typescript-eslint/stylistic-type-checked"),{languageOptions:{parserOptions:{...e?.project?{project:e.project}:{projectService:!0},tsconfigRootDir:process.cwd()}},name:"jimmy.codes/typescript",rules:Ue},{files:[ne,y],...p.configs.disableTypeChecked},{files:m,name:"jimmy.codes/typescript/testing",rules:{"@typescript-eslint/no-unsafe-argument":"off","@typescript-eslint/no-unsafe-assignment":"off"}}],"typescriptConfig"),Ye={...q.configs["flat/recommended"].rules,"unicorn/filename-case":"off","unicorn/import-style":"off","unicorn/no-abusive-eslint-disable":"off","unicorn/no-anonymous-default-export":"off","unicorn/no-array-callback-reference":"off","unicorn/no-array-reduce":"off","unicorn/no-null":"off","unicorn/no-process-exit":"off","unicorn/no-useless-undefined":["error",{checkArguments:!1,checkArrowFunctionBody:!1}],"unicorn/prefer-node-protocol":"off","unicorn/prevent-abbreviations":"off"},Me=t(()=>[{...q.configs["flat/recommended"],name:"jimmy.codes/unicorn",rules:Ye}],"unicornConfig"),De=t(e=>typeof e=="object"?e:void 0,"getTypescriptOptions"),Ke=t((e,r)=>typeof e=="object"?e:{framework:r.vitest?"vitest":r.jest?"jest":"vitest",...r.testingLibrary&&{utilities:["testing-library"]}},"getTestingOptions"),Ze=t(e=>typeof e=="object"?e:{utilities:[]},"getReactOptions"),er=t(({utilities:e=[]},r,s)=>r||e.includes("@tanstack/query")||s&&Fe(),"shouldEnableTanstackQuery"),rr=t(({utilities:e=[]},r)=>e.includes("testing-library")||r&&$e(),"shouldEnableTestingLibrary"),tr=t(async({astro:e=!1,autoDetect:r=!0,configs:s=[],ignores:n=[],jest:a=!1,playwright:f=!1,react:x=!1,storybook:I=!1,tanstackQuery:B=!1,testing:h=!1,testingLibrary:N=!1,typescript:b=!1,vitest:w=!1}={},...$)=>{const F=Ze(x),v=Ke(h,{jest:a,testingLibrary:N,vitest:w}),k=De(b),P=b||!!k||r&&Ie(),J=x||r&&Be(),z=h||a||w||r&&Ne(),Q=e||r&&Je(),V=er(F,B,r),X=rr(v,r),H=f||r&&ze(),U=I||r&&Qe();return[he(),ke(),we(),Me(),me(),Re(),je({typescript:P}),P?We(k):[],J?await _e():[],V?await Ae():[],Q?await pe():[],z?await Ve(v,r):[],X?await He():[],H?await Ee():[],U?await Se():[],Oe(),fe(),de(n),s,$].flat()},"eslintConfig");module.exports=tr;
package/dist/index.d.cts CHANGED
@@ -4747,6 +4747,76 @@ interface RuleOptions {
4747
4747
  * @deprecated
4748
4748
  */
4749
4749
  'spaced-comment'?: Linter.RuleEntry<SpacedComment>
4750
+ /**
4751
+ * Interactions should be awaited
4752
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/await-interactions.md
4753
+ */
4754
+ 'storybook/await-interactions'?: Linter.RuleEntry<[]>
4755
+ /**
4756
+ * Pass a context when invoking play function of another story
4757
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/context-in-play-function.md
4758
+ */
4759
+ 'storybook/context-in-play-function'?: Linter.RuleEntry<[]>
4760
+ /**
4761
+ * The component property should be set
4762
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/csf-component.md
4763
+ */
4764
+ 'storybook/csf-component'?: Linter.RuleEntry<[]>
4765
+ /**
4766
+ * Story files should have a default export
4767
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/default-exports.md
4768
+ */
4769
+ 'storybook/default-exports'?: Linter.RuleEntry<[]>
4770
+ /**
4771
+ * Deprecated hierarchy separator in title property
4772
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/hierarchy-separator.md
4773
+ */
4774
+ 'storybook/hierarchy-separator'?: Linter.RuleEntry<[]>
4775
+ /**
4776
+ * Meta should only have inline properties
4777
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/meta-inline-properties.md
4778
+ */
4779
+ 'storybook/meta-inline-properties'?: Linter.RuleEntry<StorybookMetaInlineProperties>
4780
+ /**
4781
+ * A story should not have a redundant name property
4782
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/no-redundant-story-name.md
4783
+ */
4784
+ 'storybook/no-redundant-story-name'?: Linter.RuleEntry<[]>
4785
+ /**
4786
+ * storiesOf is deprecated and should not be used
4787
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/no-stories-of.md
4788
+ */
4789
+ 'storybook/no-stories-of'?: Linter.RuleEntry<[]>
4790
+ /**
4791
+ * Do not define a title in meta
4792
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/no-title-property-in-meta.md
4793
+ */
4794
+ 'storybook/no-title-property-in-meta'?: Linter.RuleEntry<[]>
4795
+ /**
4796
+ * This rule identifies storybook addons that are invalid because they are either not installed or contain a typo in their name.
4797
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/no-uninstalled-addons.md
4798
+ */
4799
+ 'storybook/no-uninstalled-addons'?: Linter.RuleEntry<StorybookNoUninstalledAddons>
4800
+ /**
4801
+ * Stories should use PascalCase
4802
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/prefer-pascal-case.md
4803
+ */
4804
+ 'storybook/prefer-pascal-case'?: Linter.RuleEntry<[]>
4805
+ /**
4806
+ * A story file must contain at least one story export
4807
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/story-exports.md
4808
+ */
4809
+ 'storybook/story-exports'?: Linter.RuleEntry<[]>
4810
+ /**
4811
+ * Use expect from `@storybook/test` or `@storybook/jest`
4812
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/use-storybook-expect.md
4813
+ */
4814
+ 'storybook/use-storybook-expect'?: Linter.RuleEntry<[]>
4815
+ /**
4816
+ * Do not use testing-library directly on stories
4817
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/use-storybook-testing-library.md
4818
+ */
4819
+ 'storybook/use-storybook-testing-library'?: Linter.RuleEntry<[]>
4750
4820
  /**
4751
4821
  * Require or disallow strict mode directives
4752
4822
  * @see https://eslint.org/docs/latest/rules/strict
@@ -10408,6 +10478,16 @@ type SpacedComment = []|[("always" | "never")]|[("always" | "never"), {
10408
10478
  balanced?: boolean
10409
10479
  }
10410
10480
  }]
10481
+ // ----- storybook/meta-inline-properties -----
10482
+ type StorybookMetaInlineProperties = []|[{
10483
+ csfVersion?: number
10484
+ }]
10485
+ // ----- storybook/no-uninstalled-addons -----
10486
+ type StorybookNoUninstalledAddons = []|[{
10487
+ packageJsonLocation?: string
10488
+ ignore?: string[]
10489
+ [k: string]: unknown | undefined
10490
+ }]
10411
10491
  // ----- strict -----
10412
10492
  type Strict = []|[("never" | "global" | "function" | "safe")]
10413
10493
  // ----- switch-colon-spacing -----
@@ -10710,6 +10790,9 @@ type Yoda = []|[("always" | "never")]|[("always" | "never"), {
10710
10790
  }]
10711
10791
 
10712
10792
  type Rules = RuleOptions;
10793
+ /**
10794
+ * @deprecated
10795
+ */
10713
10796
  interface TypescriptOptions {
10714
10797
  /**
10715
10798
  * Location of `tsconfig.json` used for [type aware linting](https://typescript-eslint.io/getting-started/typed-linting)
@@ -10720,6 +10803,9 @@ interface TypescriptOptions {
10720
10803
  type TestingFrameworks = "jest" | "vitest";
10721
10804
  type TestingUtilities = "testing-library";
10722
10805
  type ReactUtilities = "@tanstack/query";
10806
+ /**
10807
+ * @deprecated
10808
+ */
10723
10809
  interface TestingOptions {
10724
10810
  /**
10725
10811
  * Which testing framework are you using?
@@ -10732,6 +10818,9 @@ interface TestingOptions {
10732
10818
  */
10733
10819
  utilities?: TestingUtilities[];
10734
10820
  }
10821
+ /**
10822
+ * @deprecated
10823
+ */
10735
10824
  interface ReactOptions {
10736
10825
  /**
10737
10826
  * Enable additional rules for utilities such as:
@@ -10768,6 +10857,11 @@ interface Options {
10768
10857
  * @see [Ignoring files](https://eslint.org/docs/latest/use/configure/ignore)
10769
10858
  */
10770
10859
  ignores?: string[];
10860
+ /**
10861
+ * Are Jest rules enabled?
10862
+ * @default false
10863
+ */
10864
+ jest?: boolean;
10771
10865
  /**
10772
10866
  * Are playwright rules enabled?
10773
10867
  * @default false
@@ -10778,19 +10872,40 @@ interface Options {
10778
10872
  * @default false
10779
10873
  */
10780
10874
  react?: boolean | ReactOptions;
10875
+ /**
10876
+ * Are Storybook rules enabled?
10877
+ * @default false
10878
+ */
10879
+ storybook?: boolean;
10880
+ /**
10881
+ * Are Tanstack Query rules enabled?
10882
+ * @default false
10883
+ */
10884
+ tanstackQuery?: boolean;
10781
10885
  /**
10782
10886
  * Are testing rules enabled?
10783
10887
  * @default false
10888
+ * @deprecated please use {@link Options.jest}, {@link Options.vitest}, or {@link Options.testingLibrary} instead.
10784
10889
  */
10785
10890
  testing?: boolean | TestingOptions;
10891
+ /**
10892
+ * Are Testing Library rules enabled?
10893
+ * @default false
10894
+ */
10895
+ testingLibrary?: boolean;
10786
10896
  /**
10787
10897
  * Are TypeScript rules enabled?
10788
10898
  * @default false
10789
10899
  */
10790
10900
  typescript?: boolean | TypescriptOptions;
10901
+ /**
10902
+ * Are Vitest rules enabled?
10903
+ * @default false
10904
+ */
10905
+ vitest?: boolean;
10791
10906
  }
10792
10907
 
10793
- declare const jimmyDotCodes: ({ astro, autoDetect, configs, ignores, playwright, react, testing, typescript, }?: Options, ...moreConfigs: Linter.Config[] | TypedConfigItem[]) => Promise<(TypedConfigItem | Linter.Config<Linter.RulesRecord> | _typescript_eslint_utils_ts_eslint.FlatConfig.Config | {
10908
+ declare const eslintConfig: ({ astro, autoDetect, configs, ignores, jest, playwright, react, storybook, tanstackQuery, testing, testingLibrary, typescript, vitest, }?: Options, ...moreConfigs: Linter.Config[] | TypedConfigItem[]) => Promise<(TypedConfigItem | Linter.Config<Linter.RulesRecord> | _typescript_eslint_utils_ts_eslint.FlatConfig.Config | {
10794
10909
  files: string[];
10795
10910
  languageOptions: {
10796
10911
  globals: {
@@ -13134,6 +13249,26 @@ declare const jimmyDotCodes: ({ astro, autoDetect, configs, ignores, playwright,
13134
13249
  "regexp/no-useless-flag": "error";
13135
13250
  "regexp/optimal-lookaround-quantifier": "error";
13136
13251
  };
13252
+ } | {
13253
+ name: string;
13254
+ plugins: {
13255
+ readonly storybook: any;
13256
+ } | undefined;
13257
+ files?: undefined;
13258
+ rules?: undefined;
13259
+ } | {
13260
+ files: string[] | undefined;
13261
+ name: string;
13262
+ rules: {
13263
+ "import-x/no-anonymous-default-export": "off";
13264
+ "unicorn/no-anonymous-default-export": "off";
13265
+ };
13266
+ plugins?: undefined;
13267
+ } | {
13268
+ files: string[] | undefined;
13269
+ name: string;
13270
+ rules: {};
13271
+ plugins?: undefined;
13137
13272
  } | {
13138
13273
  files: string[];
13139
13274
  name: string;
@@ -13226,4 +13361,4 @@ declare const jimmyDotCodes: ({ astro, autoDetect, configs, ignores, playwright,
13226
13361
  settings?: Record<string, unknown>;
13227
13362
  })[]>;
13228
13363
 
13229
- export { type Options, type ReactOptions, type Rules, type TestingOptions, type TypedConfigItem, type TypescriptOptions, jimmyDotCodes as default };
13364
+ export { type Options, type ReactOptions, type Rules, type TestingOptions, type TypedConfigItem, type TypescriptOptions, eslintConfig as default };
package/dist/index.d.mts CHANGED
@@ -4747,6 +4747,76 @@ interface RuleOptions {
4747
4747
  * @deprecated
4748
4748
  */
4749
4749
  'spaced-comment'?: Linter.RuleEntry<SpacedComment>
4750
+ /**
4751
+ * Interactions should be awaited
4752
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/await-interactions.md
4753
+ */
4754
+ 'storybook/await-interactions'?: Linter.RuleEntry<[]>
4755
+ /**
4756
+ * Pass a context when invoking play function of another story
4757
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/context-in-play-function.md
4758
+ */
4759
+ 'storybook/context-in-play-function'?: Linter.RuleEntry<[]>
4760
+ /**
4761
+ * The component property should be set
4762
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/csf-component.md
4763
+ */
4764
+ 'storybook/csf-component'?: Linter.RuleEntry<[]>
4765
+ /**
4766
+ * Story files should have a default export
4767
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/default-exports.md
4768
+ */
4769
+ 'storybook/default-exports'?: Linter.RuleEntry<[]>
4770
+ /**
4771
+ * Deprecated hierarchy separator in title property
4772
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/hierarchy-separator.md
4773
+ */
4774
+ 'storybook/hierarchy-separator'?: Linter.RuleEntry<[]>
4775
+ /**
4776
+ * Meta should only have inline properties
4777
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/meta-inline-properties.md
4778
+ */
4779
+ 'storybook/meta-inline-properties'?: Linter.RuleEntry<StorybookMetaInlineProperties>
4780
+ /**
4781
+ * A story should not have a redundant name property
4782
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/no-redundant-story-name.md
4783
+ */
4784
+ 'storybook/no-redundant-story-name'?: Linter.RuleEntry<[]>
4785
+ /**
4786
+ * storiesOf is deprecated and should not be used
4787
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/no-stories-of.md
4788
+ */
4789
+ 'storybook/no-stories-of'?: Linter.RuleEntry<[]>
4790
+ /**
4791
+ * Do not define a title in meta
4792
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/no-title-property-in-meta.md
4793
+ */
4794
+ 'storybook/no-title-property-in-meta'?: Linter.RuleEntry<[]>
4795
+ /**
4796
+ * This rule identifies storybook addons that are invalid because they are either not installed or contain a typo in their name.
4797
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/no-uninstalled-addons.md
4798
+ */
4799
+ 'storybook/no-uninstalled-addons'?: Linter.RuleEntry<StorybookNoUninstalledAddons>
4800
+ /**
4801
+ * Stories should use PascalCase
4802
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/prefer-pascal-case.md
4803
+ */
4804
+ 'storybook/prefer-pascal-case'?: Linter.RuleEntry<[]>
4805
+ /**
4806
+ * A story file must contain at least one story export
4807
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/story-exports.md
4808
+ */
4809
+ 'storybook/story-exports'?: Linter.RuleEntry<[]>
4810
+ /**
4811
+ * Use expect from `@storybook/test` or `@storybook/jest`
4812
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/use-storybook-expect.md
4813
+ */
4814
+ 'storybook/use-storybook-expect'?: Linter.RuleEntry<[]>
4815
+ /**
4816
+ * Do not use testing-library directly on stories
4817
+ * @see https://github.com/storybookjs/eslint-plugin-storybook/blob/main/docs/rules/use-storybook-testing-library.md
4818
+ */
4819
+ 'storybook/use-storybook-testing-library'?: Linter.RuleEntry<[]>
4750
4820
  /**
4751
4821
  * Require or disallow strict mode directives
4752
4822
  * @see https://eslint.org/docs/latest/rules/strict
@@ -10408,6 +10478,16 @@ type SpacedComment = []|[("always" | "never")]|[("always" | "never"), {
10408
10478
  balanced?: boolean
10409
10479
  }
10410
10480
  }]
10481
+ // ----- storybook/meta-inline-properties -----
10482
+ type StorybookMetaInlineProperties = []|[{
10483
+ csfVersion?: number
10484
+ }]
10485
+ // ----- storybook/no-uninstalled-addons -----
10486
+ type StorybookNoUninstalledAddons = []|[{
10487
+ packageJsonLocation?: string
10488
+ ignore?: string[]
10489
+ [k: string]: unknown | undefined
10490
+ }]
10411
10491
  // ----- strict -----
10412
10492
  type Strict = []|[("never" | "global" | "function" | "safe")]
10413
10493
  // ----- switch-colon-spacing -----
@@ -10710,6 +10790,9 @@ type Yoda = []|[("always" | "never")]|[("always" | "never"), {
10710
10790
  }]
10711
10791
 
10712
10792
  type Rules = RuleOptions;
10793
+ /**
10794
+ * @deprecated
10795
+ */
10713
10796
  interface TypescriptOptions {
10714
10797
  /**
10715
10798
  * Location of `tsconfig.json` used for [type aware linting](https://typescript-eslint.io/getting-started/typed-linting)
@@ -10720,6 +10803,9 @@ interface TypescriptOptions {
10720
10803
  type TestingFrameworks = "jest" | "vitest";
10721
10804
  type TestingUtilities = "testing-library";
10722
10805
  type ReactUtilities = "@tanstack/query";
10806
+ /**
10807
+ * @deprecated
10808
+ */
10723
10809
  interface TestingOptions {
10724
10810
  /**
10725
10811
  * Which testing framework are you using?
@@ -10732,6 +10818,9 @@ interface TestingOptions {
10732
10818
  */
10733
10819
  utilities?: TestingUtilities[];
10734
10820
  }
10821
+ /**
10822
+ * @deprecated
10823
+ */
10735
10824
  interface ReactOptions {
10736
10825
  /**
10737
10826
  * Enable additional rules for utilities such as:
@@ -10768,6 +10857,11 @@ interface Options {
10768
10857
  * @see [Ignoring files](https://eslint.org/docs/latest/use/configure/ignore)
10769
10858
  */
10770
10859
  ignores?: string[];
10860
+ /**
10861
+ * Are Jest rules enabled?
10862
+ * @default false
10863
+ */
10864
+ jest?: boolean;
10771
10865
  /**
10772
10866
  * Are playwright rules enabled?
10773
10867
  * @default false
@@ -10778,19 +10872,40 @@ interface Options {
10778
10872
  * @default false
10779
10873
  */
10780
10874
  react?: boolean | ReactOptions;
10875
+ /**
10876
+ * Are Storybook rules enabled?
10877
+ * @default false
10878
+ */
10879
+ storybook?: boolean;
10880
+ /**
10881
+ * Are Tanstack Query rules enabled?
10882
+ * @default false
10883
+ */
10884
+ tanstackQuery?: boolean;
10781
10885
  /**
10782
10886
  * Are testing rules enabled?
10783
10887
  * @default false
10888
+ * @deprecated please use {@link Options.jest}, {@link Options.vitest}, or {@link Options.testingLibrary} instead.
10784
10889
  */
10785
10890
  testing?: boolean | TestingOptions;
10891
+ /**
10892
+ * Are Testing Library rules enabled?
10893
+ * @default false
10894
+ */
10895
+ testingLibrary?: boolean;
10786
10896
  /**
10787
10897
  * Are TypeScript rules enabled?
10788
10898
  * @default false
10789
10899
  */
10790
10900
  typescript?: boolean | TypescriptOptions;
10901
+ /**
10902
+ * Are Vitest rules enabled?
10903
+ * @default false
10904
+ */
10905
+ vitest?: boolean;
10791
10906
  }
10792
10907
 
10793
- declare const jimmyDotCodes: ({ astro, autoDetect, configs, ignores, playwright, react, testing, typescript, }?: Options, ...moreConfigs: Linter.Config[] | TypedConfigItem[]) => Promise<(TypedConfigItem | Linter.Config<Linter.RulesRecord> | _typescript_eslint_utils_ts_eslint.FlatConfig.Config | {
10908
+ declare const eslintConfig: ({ astro, autoDetect, configs, ignores, jest, playwright, react, storybook, tanstackQuery, testing, testingLibrary, typescript, vitest, }?: Options, ...moreConfigs: Linter.Config[] | TypedConfigItem[]) => Promise<(TypedConfigItem | Linter.Config<Linter.RulesRecord> | _typescript_eslint_utils_ts_eslint.FlatConfig.Config | {
10794
10909
  files: string[];
10795
10910
  languageOptions: {
10796
10911
  globals: {
@@ -13134,6 +13249,26 @@ declare const jimmyDotCodes: ({ astro, autoDetect, configs, ignores, playwright,
13134
13249
  "regexp/no-useless-flag": "error";
13135
13250
  "regexp/optimal-lookaround-quantifier": "error";
13136
13251
  };
13252
+ } | {
13253
+ name: string;
13254
+ plugins: {
13255
+ readonly storybook: any;
13256
+ } | undefined;
13257
+ files?: undefined;
13258
+ rules?: undefined;
13259
+ } | {
13260
+ files: string[] | undefined;
13261
+ name: string;
13262
+ rules: {
13263
+ "import-x/no-anonymous-default-export": "off";
13264
+ "unicorn/no-anonymous-default-export": "off";
13265
+ };
13266
+ plugins?: undefined;
13267
+ } | {
13268
+ files: string[] | undefined;
13269
+ name: string;
13270
+ rules: {};
13271
+ plugins?: undefined;
13137
13272
  } | {
13138
13273
  files: string[];
13139
13274
  name: string;
@@ -13226,4 +13361,4 @@ declare const jimmyDotCodes: ({ astro, autoDetect, configs, ignores, playwright,
13226
13361
  settings?: Record<string, unknown>;
13227
13362
  })[]>;
13228
13363
 
13229
- export { type Options, type ReactOptions, type Rules, type TestingOptions, type TypedConfigItem, type TypescriptOptions, jimmyDotCodes as default };
13364
+ export { type Options, type ReactOptions, type Rules, type TestingOptions, type TypedConfigItem, type TypescriptOptions, eslintConfig as default };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var F=Object.defineProperty;var r=(e,t)=>F(e,"name",{value:t,configurable:!0});import u from"globals";import{parser as J,configs as p}from"typescript-eslint";import w from"@eslint-community/eslint-plugin-eslint-comments/configs";import f from"eslint-plugin-import-x";import k from"eslint-plugin-n";import Q from"@eslint/js";import v from"eslint-plugin-perfectionist";import V from"eslint-config-prettier";import*as P from"eslint-plugin-regexp";import{isPackageExists as a}from"local-pkg";import O from"eslint-plugin-unicorn";const n="?([cm])[jt]s?(x)",X=["**/node_modules","**/dist","**/package-lock.json","**/yarn.lock","**/pnpm-lock.yaml","**/bun.lockb","**/output","**/coverage","**/temp","**/.temp","**/tmp","**/.tmp","**/.history","**/.vitepress/cache","**/.nuxt","**/.next","**/.vercel","**/.changeset","**/.idea","**/.cache","**/.output","**/.vite-inspect","**/.yarn","**/storybook-static","**/.eslint-config-inspector","**/playwright-report","**/.astro","**/.vinxi","**/app.config.timestamp_*.js","**/CHANGELOG*.md","**/*.min.*","**/LICENSE*","**/__snapshots__","**/auto-import?(s).d.ts","**/components.d.ts","**/vite.config.ts.*.mjs","**/*.gen.*","!.storybook"],z="**/*.?([cm])js",d="**/*.?([cm])jsx",C="**/*.?([cm])tsx",m=[`**/__tests__/**/*.${n}`,`**/*.spec.${n}`,`**/*.test.${n}`,`**/*.bench.${n}`,`**/*.benchmark.${n}`],E=[`**/e2e/**/*.spec.${n}`,`**/e2e/**/*.test.${n}`],g=[...E,`**/cypress/**/*.spec.${n}`,`**/cypress/**/*.test.${n}`],H="**/*.cjs",U="**/*.astro",W=["vi.mock","describe","expect","it"],Y=["@testing-library/react"],o=r(async e=>{const t=await e;return t.default??t},"interopDefault"),M=r(async()=>{const e=[U],[t,s,i]=await Promise.all([import("eslint-plugin-astro"),import("astro-eslint-parser"),o(import("eslint-plugin-jsx-a11y"))]);return[{files:e,languageOptions:{globals:{...u.node,Astro:!1,Fragment:!1},parser:s,parserOptions:{extraFileExtensions:[".astro"],parser:J},sourceType:"module"},name:"jimmy.codes/astro",plugins:{astro:t,"jsx-a11y":i},processor:"astro/client-side-ts",rules:{...i.configs.recommended.rules,"astro/missing-client-only-directive-value":"error","astro/no-conflict-set-directives":"error","astro/no-deprecated-astro-canonicalurl":"error","astro/no-deprecated-astro-fetchcontent":"error","astro/no-deprecated-astro-resolve":"error","astro/no-deprecated-getentrybyslug":"error","astro/no-exports-from-components":"off","astro/no-unused-define-vars-in-style":"error","astro/valid-compile":"error"}},{files:e,languageOptions:{parserOptions:p.disableTypeChecked.languageOptions?.parserOptions},name:"jimmy.codes/astro/disable-type-checked",rules:p.disableTypeChecked.rules},{name:"jimmy.codes/astro/imports",settings:{"import-x/core-modules":["astro:content"]}}]},"astroConfig"),D=r(()=>[{files:[H],languageOptions:{globals:u.commonjs},name:"jimmy.codes/commonjs"}],"commonjsConfig"),K={...w.recommended.rules,"@eslint-community/eslint-comments/no-unused-disable":"off","@eslint-community/eslint-comments/require-description":"error"},Z=r(()=>[{...w.recommended,name:"jimmy.codes/eslint-comments",rules:K}],"eslintCommentsConfig"),ee=r(e=>[{ignores:[...X,...e],name:"jimmy.codes/ignores"}],"ignoresConfig"),re={...f.configs.recommended.rules,"import-x/consistent-type-specifier-style":["error","prefer-top-level"],"import-x/extensions":["error","never",{checkTypedImports:!0,svg:"always"}],"import-x/first":"error","import-x/namespace":"off","import-x/newline-after-import":"error","import-x/no-absolute-path":"error","import-x/no-duplicates":"error","import-x/no-empty-named-blocks":"error","import-x/no-named-as-default":"error","import-x/no-named-as-default-member":"error","import-x/no-self-import":"error","import-x/no-unresolved":["error",{ignore:[String.raw`\.svg$`]}],"import-x/no-useless-path-segments":"error"},te={name:"jimmy.codes/imports/typescript",rules:f.configs.typescript.rules,settings:{...f.configs.typescript.settings,"import-x/resolver":{...f.configs.typescript.settings["import-x/resolver"],typescript:!0}}},oe=r(({typescript:e=!1}={})=>[{name:"jimmy.codes/imports",plugins:{"import-x":f,n:k},rules:re},...e?[te]:[]],"importsConfig"),se={...Q.configs.recommended.rules,"array-callback-return":["error",{allowImplicit:!0}],"arrow-body-style":["error","always"],curly:["error","all"],"no-console":"warn","no-self-compare":"error","no-template-curly-in-string":"error","no-unmodified-loop-condition":"error","no-unreachable-loop":"error","no-use-before-define":["error",{allowNamedExports:!1,classes:!1,functions:!1,variables:!0}],"no-useless-rename":"error","object-shorthand":"error","prefer-arrow-callback":"error"},ne=r(()=>[{linterOptions:{reportUnusedDisableDirectives:!0},name:"jimmy.codes/javascript",rules:se}],"javascriptConfig"),ie={"n/no-process-exit":"off","n/prefer-node-protocol":"error"},ae=r(()=>[{name:"jimmy.codes/node",plugins:{n:k},rules:ie}],"nodeConfig"),ce={...v.configs["recommended-natural"].rules,"perfectionist/sort-imports":["error",{customGroups:{type:{},value:{}},environment:"node",groups:["side-effect-style","builtin","type","external","internal-type","internal",["parent-type","sibling-type","index-type"],["parent","sibling","index"],"object","style","unknown"],internalPattern:["^~/.*","^@/.*"],order:"asc",type:"natural"}],"perfectionist/sort-modules":"off"},le=r(()=>[{name:"jimmy.codes/perfectionist",plugins:{perfectionist:v},rules:ce}],"perfectionistConfig"),pe=r(async()=>({...(await o(import("eslint-plugin-playwright"))).configs["flat/recommended"].rules,"playwright/expect-expect":"error","playwright/max-nested-describe":"error","playwright/no-conditional-expect":"error","playwright/no-conditional-in-test":"error","playwright/no-element-handle":"error","playwright/no-eval":"error","playwright/no-force-option":"error","playwright/no-nested-step":"error","playwright/no-page-pause":"error","playwright/no-skipped-test":"error","playwright/no-useless-await":"error","playwright/no-useless-not":"error","playwright/no-wait-for-selector":"error","playwright/no-wait-for-timeout":"error"}),"playwrightRules"),fe=r(async()=>[{...(await o(import("eslint-plugin-playwright"))).configs["flat/recommended"],files:E,name:"jimmy.codes/playwright",rules:await pe()}],"playwrightConfig"),me=r(()=>[{name:"jimmy.codes/prettier",...V}],"prettierConfig"),ue=r(e=>e===2?"error":e===1?"warn":"off","toStringSeverity"),T=r((e={})=>Object.fromEntries(Object.entries(e).map(([t,s])=>[t,typeof s=="number"?ue(s):s])),"normalizeRuleEntries"),de=r(async()=>{const[e,t]=await Promise.all([o(import("eslint-plugin-react")),o(import("eslint-plugin-jsx-a11y"))]);return{...t.configs.recommended.rules,...T(e.configs.flat?.recommended?.rules),...T(e.configs.flat?.["jsx-runtime"]?.rules),"react-hooks/exhaustive-deps":"error","react-hooks/rules-of-hooks":"error","react-refresh/only-export-components":["warn",{allowConstantExport:!0}],"react/boolean-prop-naming":"off","react/button-has-type":"error","react/checked-requires-onchange-or-readonly":"error","react/default-props-match-prop-types":"error","react/destructuring-assignment":"off","react/forbid-component-props":"off","react/forbid-dom-props":"off","react/forbid-elements":"off","react/forbid-foreign-prop-types":"off","react/forbid-prop-types":"off","react/forward-ref-uses-ref":"error","react/function-component-definition":"off","react/hook-use-state":"error","react/iframe-missing-sandbox":"error","react/jsx-boolean-value":["error","never"],"react/jsx-curly-brace-presence":"error","react/jsx-filename-extension":"off","react/jsx-fragments":["error","syntax"],"react/jsx-handler-names":"off","react/jsx-max-depth":"off","react/jsx-no-bind":"off","react/jsx-no-constructed-context-values":"error","react/jsx-no-leaked-render":"error","react/jsx-no-literals":"off","react/jsx-no-script-url":"error","react/jsx-no-useless-fragment":"error","react/jsx-one-expression-per-line":"off","react/jsx-pascal-case":["error",{allowNamespace:!0}],"react/jsx-props-no-spread-multi":"off","react/jsx-props-no-spreading":"off","react/jsx-sort-default-props":"off","react/jsx-sort-props":"off","react/no-access-state-in-setstate":"error","react/no-adjacent-inline-elements":"off","react/no-array-index-key":"off","react/no-arrow-function-lifecycle":"error","react/no-danger":"off","react/no-did-mount-set-state":"error","react/no-did-update-set-state":"error","react/no-invalid-html-attribute":"error","react/no-multi-comp":"off","react/no-namespace":"error","react/no-object-type-as-default-prop":"error","react/no-redundant-should-component-update":"error","react/no-set-state":"off","react/no-this-in-sfc":"error","react/no-typos":"error","react/no-unstable-nested-components":"error","react/no-unused-class-component-methods":"error","react/no-unused-prop-types":"error","react/no-unused-state":"error","react/no-will-update-set-state":"error","react/prefer-es6-class":"off","react/prefer-exact-props":"off","react/prefer-read-only-props":"off","react/prefer-stateless-function":"off","react/require-default-props":"off","react/require-optimization":"off","react/self-closing-comp":"error","react/sort-comp":"off","react/sort-default-props":"off","react/sort-prop-types":"off","react/state-in-constructor":"off","react/static-property-placement":"off","react/style-prop-object":"error","react/void-dom-elements-no-children":"error"}},"reactRules"),ge=r(async()=>{const[e,t,s,i]=await Promise.all([o(import("eslint-plugin-react")),o(import("eslint-plugin-jsx-a11y")),import("eslint-plugin-react-hooks"),import("eslint-plugin-react-refresh")]);return[{files:[d,C],languageOptions:{globals:{...u.browser},parserOptions:{ecmaFeatures:{jsx:!0},jsxPragma:null}},name:"jimmy.codes/react",plugins:{"jsx-a11y":t,react:e,"react-hooks":s,"react-refresh":i},rules:await de(),settings:{react:{version:"detect"}}}]},"reactConfig"),ye={...P.configs["flat/recommended"].rules,"regexp/confusing-quantifier":"error","regexp/no-empty-alternative":"error","regexp/no-lazy-ends":"error","regexp/no-potentially-useless-backreference":"error","regexp/no-useless-flag":"error","regexp/optimal-lookaround-quantifier":"error"},je=r(()=>[{name:"jimmy.codes/regexp",plugins:{regexp:P},rules:ye}],"regexpConfig"),he=r(async()=>{const e=await o(import("@tanstack/eslint-plugin-query"));return[{files:[d,C],name:"jimmy.codes/react/query",plugins:{"@tanstack/query":e},rules:{"@tanstack/query/exhaustive-deps":"error","@tanstack/query/no-rest-destructuring":"warn","@tanstack/query/stable-query-client":"error"}}]},"tanstackQuery"),_=r(async()=>{const e=await o(import("eslint-plugin-jest"));return{...e.configs["flat/recommended"].rules,...e.configs["flat/style"].rules,"jest/consistent-test-it":["error",{fn:"test",withinDescribe:"it"}],"jest/expect-expect":"error","jest/no-alias-methods":"error","jest/no-commented-out-tests":"error","jest/no-conditional-in-test":"error","jest/no-confusing-set-timeout":"error","jest/no-duplicate-hooks":"error","jest/no-hooks":"off","jest/no-large-snapshots":"off","jest/no-restricted-jest-methods":"off","jest/no-restricted-matchers":"off","jest/no-test-return-statement":"error","jest/no-untyped-mock-factory":"off","jest/prefer-called-with":"error","jest/prefer-comparison-matcher":"error","jest/prefer-each":"error","jest/prefer-equality-matcher":"error","jest/prefer-expect-assertions":"off","jest/prefer-expect-resolves":"error","jest/prefer-hooks-in-order":"error","jest/prefer-hooks-on-top":"error","jest/prefer-lowercase-title":"off","jest/prefer-mock-promise-shorthand":"error","jest/prefer-snapshot-hint":"error","jest/prefer-spy-on":"off","jest/prefer-strict-equal":"error","jest/prefer-todo":"warn","jest/require-hook":"error","jest/require-to-throw-message":"error","jest/require-top-level-describe":"off","jest/unbound-method":"off"}},"jestRules"),xe=r(async()=>({...await _(),"jest/no-deprecated-functions":"off","jest/require-hook":["error",{allowedFunctionCalls:W}]}),"vitestRules"),be=r(()=>a("typescript"),"hasTypescript"),we=r(()=>a("react"),"hasReact"),R=r(()=>a("vitest"),"hasVitest"),L=r(()=>a("jest"),"hasJest"),ke=r(()=>R()||L(),"hasTesting"),ve=r(()=>Y.some(e=>a(e)),"hasTestingLibrary"),Pe=r(()=>a("@tanstack/react-query"),"hasReactQuery"),Oe=r(()=>a("astro"),"hasAstro"),Ce=r(()=>a("@playwright/test"),"hasPlaywright"),Ee=r(async({framework:e="vitest"}={},t=!0)=>{const s=t?R():e==="vitest",i=e==="jest"||t&&L(),l=[];if(s){const c=await o(import("eslint-plugin-jest"));l.push({files:m,ignores:g,...c.configs["flat/recommended"],name:"jimmy.codes/vitest",rules:await xe()})}if(i){const c=await o(import("eslint-plugin-jest"));l.push({files:m,ignores:g,...c.configs["flat/recommended"],name:"jimmy.codes/jest",rules:await _()})}return l},"testingConfig"),Te=r(async()=>{const[e,t]=await Promise.all([import("eslint-plugin-jest-dom"),o(import("eslint-plugin-testing-library"))]);return{...t.configs["flat/react"].rules,...e.configs["flat/recommended"].rules}},"testingLibraryRules"),_e=r(async()=>{const[e,t]=await Promise.all([import("eslint-plugin-jest-dom"),o(import("eslint-plugin-testing-library"))]);return[{files:m,ignores:g,name:"jimmy.codes/testing-library",plugins:{"jest-dom":e,"testing-library":t},rules:await Te()}]},"testingLibrary"),Re={"@typescript-eslint/consistent-type-exports":["error",{fixMixedExportsWithInlineTypeSpecifier:!1}],"@typescript-eslint/consistent-type-imports":["error",{fixStyle:"separate-type-imports"}],"@typescript-eslint/no-deprecated":"warn","@typescript-eslint/no-misused-promises":["error",{checksVoidReturn:{attributes:!1}}],"@typescript-eslint/no-unused-vars":["error",{args:"all",argsIgnorePattern:"^_",caughtErrors:"all",caughtErrorsIgnorePattern:"^_",destructuredArrayIgnorePattern:"^_",ignoreRestSiblings:!0,varsIgnorePattern:"^_"}],"@typescript-eslint/no-use-before-define":["error",{allowNamedExports:!1,classes:!1,functions:!1,variables:!0}],"@typescript-eslint/restrict-template-expressions":["error",{allowNumber:!0}],"no-use-before-define":"off"},Le=r(e=>[...p.strictTypeChecked,...p.stylisticTypeChecked.filter(t=>t.name==="typescript-eslint/stylistic-type-checked"),{languageOptions:{parserOptions:{...e?.project?{project:e.project}:{projectService:!0},tsconfigRootDir:process.cwd()}},name:"jimmy.codes/typescript",rules:Re},{files:[z,d],...p.disableTypeChecked},{files:m,name:"jimmy.codes/typescript/testing",rules:{"@typescript-eslint/no-unsafe-argument":"off","@typescript-eslint/no-unsafe-assignment":"off"}}],"typescriptConfig"),qe={...O.configs["flat/recommended"].rules,"unicorn/filename-case":"off","unicorn/import-style":"off","unicorn/no-abusive-eslint-disable":"off","unicorn/no-anonymous-default-export":"off","unicorn/no-array-callback-reference":"off","unicorn/no-array-reduce":"off","unicorn/no-null":"off","unicorn/no-process-exit":"off","unicorn/no-useless-undefined":["error",{checkArguments:!1,checkArrowFunctionBody:!1}],"unicorn/prefer-node-protocol":"off","unicorn/prevent-abbreviations":"off"},Se=r(()=>[{...O.configs["flat/recommended"],name:"jimmy.codes/unicorn",rules:qe}],"unicornConfig"),Ge=r(e=>typeof e=="object"?e:void 0,"getTypescriptOptions"),Ae=r(e=>typeof e=="object"?e:{framework:"vitest"},"getTestingOptions"),Ie=r(e=>typeof e=="object"?e:{utilities:[]},"getReactOptions"),Be=r(({utilities:e=[]},t)=>e.includes("@tanstack/query")||t&&Pe(),"shouldEnableTanstackQuery"),$e=r(({utilities:e=[]},t)=>e.includes("testing-library")||t&&ve(),"shouldEnableTestingLibrary"),Ne=r(async({astro:e=!1,autoDetect:t=!0,configs:s=[],ignores:i=[],playwright:l=!1,react:c=!1,testing:y=!1,typescript:j=!1}={},...q)=>{const S=Ie(c),h=Ae(y),x=Ge(j),b=j||!!x||t&&be(),G=c||t&&we(),A=y||t&&ke(),I=e||t&&Oe(),B=Be(S,t),$=$e(h,t),N=l||t&&Ce();return[ne(),le(),ae(),Se(),Z(),je(),oe({typescript:b}),b?Le(x):[],G?await ge():[],B?await he():[],I?await M():[],A?await Ee(h,t):[],$?await _e():[],N?await fe():[],me(),D(),ee(i),s,q].flat()},"jimmyDotCodes");export{Ne as default};
1
+ var H=Object.defineProperty;var r=(e,t)=>H(e,"name",{value:t,configurable:!0});import u from"globals";import{parser as U,configs as p}from"typescript-eslint";import v from"@eslint-community/eslint-plugin-eslint-comments/configs";import f from"eslint-plugin-import-x";import C from"eslint-plugin-n";import W from"@eslint/js";import O from"eslint-plugin-perfectionist";import Y from"eslint-config-prettier";import*as P from"eslint-plugin-regexp";import{isPackageExists as i}from"local-pkg";import E from"eslint-plugin-unicorn";const a="?([cm])[jt]s?(x)",M=["**/node_modules","**/dist","**/package-lock.json","**/yarn.lock","**/pnpm-lock.yaml","**/bun.lockb","**/output","**/coverage","**/temp","**/.temp","**/tmp","**/.tmp","**/.history","**/.vitepress/cache","**/.nuxt","**/.next","**/.vercel","**/.changeset","**/.idea","**/.cache","**/.output","**/.vite-inspect","**/.yarn","**/storybook-static","**/.eslint-config-inspector","**/playwright-report","**/.astro","**/.vinxi","**/app.config.timestamp_*.js","**/CHANGELOG*.md","**/*.min.*","**/LICENSE*","**/__snapshots__","**/auto-import?(s).d.ts","**/components.d.ts","**/vite.config.ts.*.mjs","**/*.gen.*","!.storybook"],K="**/*.?([cm])js",d="**/*.?([cm])jsx",T="**/*.?([cm])tsx",m=[`**/__tests__/**/*.${a}`,`**/*.spec.${a}`,`**/*.test.${a}`,`**/*.bench.${a}`,`**/*.benchmark.${a}`],_=[`**/e2e/**/*.spec.${a}`,`**/e2e/**/*.test.${a}`],y=[..._,`**/cypress/**/*.spec.${a}`,`**/cypress/**/*.test.${a}`],Z="**/*.cjs",D="**/*.astro",ee=["vi.mock","describe","expect","it"],re=["@testing-library/react"],s=r(async e=>{const t=await e;return t.default??t},"interopDefault"),te=r(async()=>{const e=[D],[t,o,n]=await Promise.all([import("eslint-plugin-astro"),import("astro-eslint-parser"),s(import("eslint-plugin-jsx-a11y"))]);return[{files:e,languageOptions:{globals:{...u.node,Astro:!1,Fragment:!1},parser:o,parserOptions:{extraFileExtensions:[".astro"],parser:U},sourceType:"module"},name:"jimmy.codes/astro",plugins:{astro:t,"jsx-a11y":n},processor:"astro/client-side-ts",rules:{...n.configs.recommended.rules,"astro/missing-client-only-directive-value":"error","astro/no-conflict-set-directives":"error","astro/no-deprecated-astro-canonicalurl":"error","astro/no-deprecated-astro-fetchcontent":"error","astro/no-deprecated-astro-resolve":"error","astro/no-deprecated-getentrybyslug":"error","astro/no-exports-from-components":"off","astro/no-unused-define-vars-in-style":"error","astro/valid-compile":"error"}},{files:e,languageOptions:{parserOptions:p.disableTypeChecked.languageOptions?.parserOptions},name:"jimmy.codes/astro/disable-type-checked",rules:p.disableTypeChecked.rules},{name:"jimmy.codes/astro/imports",settings:{"import-x/core-modules":["astro:content"]}}]},"astroConfig"),oe=r(()=>[{files:[Z],languageOptions:{globals:u.commonjs},name:"jimmy.codes/commonjs"}],"commonjsConfig"),se={...v.recommended.rules,"@eslint-community/eslint-comments/no-unused-disable":"off","@eslint-community/eslint-comments/require-description":"error"},ne=r(()=>[{...v.recommended,name:"jimmy.codes/eslint-comments",rules:se}],"eslintCommentsConfig"),ie=r(e=>[{ignores:[...M,...e],name:"jimmy.codes/ignores"}],"ignoresConfig"),ae={...f.configs.recommended.rules,"import-x/consistent-type-specifier-style":["error","prefer-top-level"],"import-x/extensions":["error","never",{checkTypedImports:!0,svg:"always"}],"import-x/first":"error","import-x/namespace":"off","import-x/newline-after-import":"error","import-x/no-absolute-path":"error","import-x/no-duplicates":"error","import-x/no-empty-named-blocks":"error","import-x/no-named-as-default":"error","import-x/no-named-as-default-member":"error","import-x/no-self-import":"error","import-x/no-unresolved":["error",{ignore:[String.raw`\.svg$`]}],"import-x/no-useless-path-segments":"error"},ce={name:"jimmy.codes/imports/typescript",rules:f.configs.typescript.rules,settings:{...f.configs.typescript.settings,"import-x/resolver":{...f.configs.typescript.settings["import-x/resolver"],typescript:!0}}},le=r(({typescript:e=!1}={})=>[{name:"jimmy.codes/imports",plugins:{"import-x":f,n:C},rules:ae},...e?[ce]:[]],"importsConfig"),pe={...W.configs.recommended.rules,"array-callback-return":["error",{allowImplicit:!0}],"arrow-body-style":["error","always"],curly:["error","all"],"no-console":"warn","no-self-compare":"error","no-template-curly-in-string":"error","no-unmodified-loop-condition":"error","no-unreachable-loop":"error","no-use-before-define":["error",{allowNamedExports:!1,classes:!1,functions:!1,variables:!0}],"no-useless-rename":"error","object-shorthand":"error","prefer-arrow-callback":"error"},fe=r(()=>[{linterOptions:{reportUnusedDisableDirectives:!0},name:"jimmy.codes/javascript",rules:pe}],"javascriptConfig"),me={"n/no-process-exit":"off","n/prefer-node-protocol":"error"},ue=r(()=>[{name:"jimmy.codes/node",plugins:{n:C},rules:me}],"nodeConfig"),de={...O.configs["recommended-natural"].rules,"perfectionist/sort-imports":["error",{customGroups:{type:{},value:{}},environment:"node",groups:["side-effect-style","builtin","type","external","internal-type","internal",["parent-type","sibling-type","index-type"],["parent","sibling","index"],"object","style","unknown"],internalPattern:["^~/.*","^@/.*"],order:"asc",type:"natural"}],"perfectionist/sort-modules":"off"},ye=r(()=>[{name:"jimmy.codes/perfectionist",plugins:{perfectionist:O},rules:de}],"perfectionistConfig"),ge=r(async()=>({...(await s(import("eslint-plugin-playwright"))).configs["flat/recommended"].rules,"playwright/expect-expect":"error","playwright/max-nested-describe":"error","playwright/no-conditional-expect":"error","playwright/no-conditional-in-test":"error","playwright/no-element-handle":"error","playwright/no-eval":"error","playwright/no-force-option":"error","playwright/no-nested-step":"error","playwright/no-page-pause":"error","playwright/no-skipped-test":"error","playwright/no-useless-await":"error","playwright/no-useless-not":"error","playwright/no-wait-for-selector":"error","playwright/no-wait-for-timeout":"error"}),"playwrightRules"),je=r(async()=>[{...(await s(import("eslint-plugin-playwright"))).configs["flat/recommended"],files:_,name:"jimmy.codes/playwright",rules:await ge()}],"playwrightConfig"),he=r(()=>[{name:"jimmy.codes/prettier",...Y}],"prettierConfig"),xe=r(e=>e===2?"error":e===1?"warn":"off","toStringSeverity"),R=r((e={})=>Object.fromEntries(Object.entries(e).map(([t,o])=>[t,typeof o=="number"?xe(o):o])),"normalizeRuleEntries"),be=r(async()=>{const[e,t]=await Promise.all([s(import("eslint-plugin-react")),s(import("eslint-plugin-jsx-a11y"))]);return{...t.configs.recommended.rules,...R(e.configs.flat?.recommended?.rules),...R(e.configs.flat?.["jsx-runtime"]?.rules),"react-hooks/exhaustive-deps":"error","react-hooks/rules-of-hooks":"error","react-refresh/only-export-components":["warn",{allowConstantExport:!0}],"react/boolean-prop-naming":"off","react/button-has-type":"error","react/checked-requires-onchange-or-readonly":"error","react/default-props-match-prop-types":"error","react/destructuring-assignment":"off","react/forbid-component-props":"off","react/forbid-dom-props":"off","react/forbid-elements":"off","react/forbid-foreign-prop-types":"off","react/forbid-prop-types":"off","react/forward-ref-uses-ref":"error","react/function-component-definition":"off","react/hook-use-state":"error","react/iframe-missing-sandbox":"error","react/jsx-boolean-value":["error","never"],"react/jsx-curly-brace-presence":"error","react/jsx-filename-extension":"off","react/jsx-fragments":["error","syntax"],"react/jsx-handler-names":"off","react/jsx-max-depth":"off","react/jsx-no-bind":"off","react/jsx-no-constructed-context-values":"error","react/jsx-no-leaked-render":"error","react/jsx-no-literals":"off","react/jsx-no-script-url":"error","react/jsx-no-useless-fragment":"error","react/jsx-one-expression-per-line":"off","react/jsx-pascal-case":["error",{allowNamespace:!0}],"react/jsx-props-no-spread-multi":"off","react/jsx-props-no-spreading":"off","react/jsx-sort-default-props":"off","react/jsx-sort-props":"off","react/no-access-state-in-setstate":"error","react/no-adjacent-inline-elements":"off","react/no-array-index-key":"off","react/no-arrow-function-lifecycle":"error","react/no-danger":"off","react/no-did-mount-set-state":"error","react/no-did-update-set-state":"error","react/no-invalid-html-attribute":"error","react/no-multi-comp":"off","react/no-namespace":"error","react/no-object-type-as-default-prop":"error","react/no-redundant-should-component-update":"error","react/no-set-state":"off","react/no-this-in-sfc":"error","react/no-typos":"error","react/no-unstable-nested-components":"error","react/no-unused-class-component-methods":"error","react/no-unused-prop-types":"error","react/no-unused-state":"error","react/no-will-update-set-state":"error","react/prefer-es6-class":"off","react/prefer-exact-props":"off","react/prefer-read-only-props":"off","react/prefer-stateless-function":"off","react/require-default-props":"off","react/require-optimization":"off","react/self-closing-comp":"error","react/sort-comp":"off","react/sort-default-props":"off","react/sort-prop-types":"off","react/state-in-constructor":"off","react/static-property-placement":"off","react/style-prop-object":"error","react/void-dom-elements-no-children":"error"}},"reactRules"),we=r(async()=>{const[e,t,o,n]=await Promise.all([s(import("eslint-plugin-react")),s(import("eslint-plugin-jsx-a11y")),import("eslint-plugin-react-hooks"),import("eslint-plugin-react-refresh")]);return[{files:[d,T],languageOptions:{globals:{...u.browser},parserOptions:{ecmaFeatures:{jsx:!0},jsxPragma:null}},name:"jimmy.codes/react",plugins:{"jsx-a11y":t,react:e,"react-hooks":o,"react-refresh":n},rules:await be(),settings:{react:{version:"detect"}}}]},"reactConfig"),ke={...P.configs["flat/recommended"].rules,"regexp/confusing-quantifier":"error","regexp/no-empty-alternative":"error","regexp/no-lazy-ends":"error","regexp/no-potentially-useless-backreference":"error","regexp/no-useless-flag":"error","regexp/optimal-lookaround-quantifier":"error"},ve=r(()=>[{name:"jimmy.codes/regexp",plugins:{regexp:P},rules:ke}],"regexpConfig"),Ce=r((e={})=>Object.fromEntries(Object.entries(e).map(([t,o])=>[t,o==="warn"?"error":o])),"warningAsErrors"),Oe=r(async()=>{const{configs:e}=await s(import("eslint-plugin-storybook")),[t,o,n]=e["flat/recommended"];return[{name:"jimmy.codes/storybook/setup",plugins:t?.plugins},{files:o?.files,name:"jimmy.codes/storybook/stories-rules",rules:{...Ce(o?.rules),"import-x/no-anonymous-default-export":"off","unicorn/no-anonymous-default-export":"off"}},{files:n?.files,name:"jimmy.codes/storybook/main-rules",rules:{...n?.rules}}]},"storybookConfig"),Pe=r(async()=>{const e=await s(import("@tanstack/eslint-plugin-query"));return[{files:[d,T],name:"jimmy.codes/react/query",plugins:{"@tanstack/query":e},rules:{"@tanstack/query/exhaustive-deps":"error","@tanstack/query/no-rest-destructuring":"warn","@tanstack/query/stable-query-client":"error"}}]},"tanstackQueryConfig"),L=r(async()=>{const e=await s(import("eslint-plugin-jest"));return{...e.configs["flat/recommended"].rules,...e.configs["flat/style"].rules,"jest/consistent-test-it":["error",{fn:"test",withinDescribe:"it"}],"jest/expect-expect":"error","jest/no-alias-methods":"error","jest/no-commented-out-tests":"error","jest/no-conditional-in-test":"error","jest/no-confusing-set-timeout":"error","jest/no-duplicate-hooks":"error","jest/no-hooks":"off","jest/no-large-snapshots":"off","jest/no-restricted-jest-methods":"off","jest/no-restricted-matchers":"off","jest/no-test-return-statement":"error","jest/no-untyped-mock-factory":"off","jest/prefer-called-with":"error","jest/prefer-comparison-matcher":"error","jest/prefer-each":"error","jest/prefer-equality-matcher":"error","jest/prefer-expect-assertions":"off","jest/prefer-expect-resolves":"error","jest/prefer-hooks-in-order":"error","jest/prefer-hooks-on-top":"error","jest/prefer-lowercase-title":"off","jest/prefer-mock-promise-shorthand":"error","jest/prefer-snapshot-hint":"error","jest/prefer-spy-on":"off","jest/prefer-strict-equal":"error","jest/prefer-todo":"warn","jest/require-hook":"error","jest/require-to-throw-message":"error","jest/require-top-level-describe":"off","jest/unbound-method":"off"}},"jestRules"),Ee=r(async()=>({...await L(),"jest/no-deprecated-functions":"off","jest/require-hook":["error",{allowedFunctionCalls:ee}]}),"vitestRules"),Te=r(()=>i("typescript"),"hasTypescript"),_e=r(()=>i("react"),"hasReact"),S=r(()=>i("vitest"),"hasVitest"),q=r(()=>i("jest"),"hasJest"),Re=r(()=>S()||q(),"hasTesting"),Le=r(()=>re.some(e=>i(e)),"hasTestingLibrary"),Se=r(()=>i("@tanstack/react-query"),"hasReactQuery"),qe=r(()=>i("astro"),"hasAstro"),Ae=r(()=>i("@playwright/test"),"hasPlaywright"),Ge=r(()=>i("storybook"),"hasStorybook"),Ie=r(async({framework:e="vitest"}={},t=!0)=>{const o=t?S():e==="vitest",n=e==="jest"||t&&q(),c=[];if(o){const l=await s(import("eslint-plugin-jest"));c.push({files:m,ignores:y,...l.configs["flat/recommended"],name:"jimmy.codes/vitest",rules:await Ee()})}if(n){const l=await s(import("eslint-plugin-jest"));c.push({files:m,ignores:y,...l.configs["flat/recommended"],name:"jimmy.codes/jest",rules:await L()})}return c},"testingConfig"),Be=r(async()=>{const[e,t]=await Promise.all([import("eslint-plugin-jest-dom"),s(import("eslint-plugin-testing-library"))]);return{...t.configs["flat/react"].rules,...e.configs["flat/recommended"].rules}},"testingLibraryRules"),$e=r(async()=>{const[e,t]=await Promise.all([import("eslint-plugin-jest-dom"),s(import("eslint-plugin-testing-library"))]);return[{files:m,ignores:y,name:"jimmy.codes/testing-library",plugins:{"jest-dom":e,"testing-library":t},rules:await Be()}]},"testingLibraryConfig"),Ne={"@typescript-eslint/consistent-type-exports":["error",{fixMixedExportsWithInlineTypeSpecifier:!1}],"@typescript-eslint/consistent-type-imports":["error",{fixStyle:"separate-type-imports"}],"@typescript-eslint/no-deprecated":"warn","@typescript-eslint/no-misused-promises":["error",{checksVoidReturn:{attributes:!1}}],"@typescript-eslint/no-unused-vars":["error",{args:"all",argsIgnorePattern:"^_",caughtErrors:"all",caughtErrorsIgnorePattern:"^_",destructuredArrayIgnorePattern:"^_",ignoreRestSiblings:!0,varsIgnorePattern:"^_"}],"@typescript-eslint/no-use-before-define":["error",{allowNamedExports:!1,classes:!1,functions:!1,variables:!0}],"@typescript-eslint/restrict-template-expressions":["error",{allowNumber:!0}],"no-use-before-define":"off"},Fe=r(e=>[...p.strictTypeChecked,...p.stylisticTypeChecked.filter(t=>t.name==="typescript-eslint/stylistic-type-checked"),{languageOptions:{parserOptions:{...e?.project?{project:e.project}:{projectService:!0},tsconfigRootDir:process.cwd()}},name:"jimmy.codes/typescript",rules:Ne},{files:[K,d],...p.disableTypeChecked},{files:m,name:"jimmy.codes/typescript/testing",rules:{"@typescript-eslint/no-unsafe-argument":"off","@typescript-eslint/no-unsafe-assignment":"off"}}],"typescriptConfig"),Je={...E.configs["flat/recommended"].rules,"unicorn/filename-case":"off","unicorn/import-style":"off","unicorn/no-abusive-eslint-disable":"off","unicorn/no-anonymous-default-export":"off","unicorn/no-array-callback-reference":"off","unicorn/no-array-reduce":"off","unicorn/no-null":"off","unicorn/no-process-exit":"off","unicorn/no-useless-undefined":["error",{checkArguments:!1,checkArrowFunctionBody:!1}],"unicorn/prefer-node-protocol":"off","unicorn/prevent-abbreviations":"off"},Qe=r(()=>[{...E.configs["flat/recommended"],name:"jimmy.codes/unicorn",rules:Je}],"unicornConfig"),Ve=r(e=>typeof e=="object"?e:void 0,"getTypescriptOptions"),Xe=r((e,t)=>typeof e=="object"?e:{framework:t.vitest?"vitest":t.jest?"jest":"vitest",...t.testingLibrary&&{utilities:["testing-library"]}},"getTestingOptions"),ze=r(e=>typeof e=="object"?e:{utilities:[]},"getReactOptions"),He=r(({utilities:e=[]},t,o)=>t||e.includes("@tanstack/query")||o&&Se(),"shouldEnableTanstackQuery"),Ue=r(({utilities:e=[]},t)=>e.includes("testing-library")||t&&Le(),"shouldEnableTestingLibrary"),We=r(async({astro:e=!1,autoDetect:t=!0,configs:o=[],ignores:n=[],jest:c=!1,playwright:l=!1,react:g=!1,storybook:A=!1,tanstackQuery:G=!1,testing:j=!1,testingLibrary:I=!1,typescript:h=!1,vitest:x=!1}={},...B)=>{const $=ze(g),b=Xe(j,{jest:c,testingLibrary:I,vitest:x}),w=Ve(h),k=h||!!w||t&&Te(),N=g||t&&_e(),F=j||c||x||t&&Re(),J=e||t&&qe(),Q=He($,G,t),V=Ue(b,t),X=l||t&&Ae(),z=A||t&&Ge();return[fe(),ye(),ue(),Qe(),ne(),ve(),le({typescript:k}),k?Fe(w):[],N?await we():[],Q?await Pe():[],J?await te():[],F?await Ie(b,t):[],V?await $e():[],X?await je():[],z?await Oe():[],he(),oe(),ie(n),o,B].flat()},"eslintConfig");export{We as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jimmy.codes/eslint-config",
3
- "version": "3.19.0",
3
+ "version": "3.21.0",
4
4
  "description": "another opinionated eslint config",
5
5
  "keywords": [
6
6
  "eslint",
@@ -52,6 +52,7 @@
52
52
  "eslint-plugin-react-hooks": "^5.0.0",
53
53
  "eslint-plugin-react-refresh": "0.4.14",
54
54
  "eslint-plugin-regexp": "^2.7.0",
55
+ "eslint-plugin-storybook": "0.11.1",
55
56
  "eslint-plugin-testing-library": "^7.0.0",
56
57
  "eslint-plugin-unicorn": "^56.0.1",
57
58
  "globals": "^15.12.0",