UNPKG

@soybeanjs/eslint-config

Version:

SoybeanJS's eslint flat config presets with prettier.

1 lines 18.8 kB
import e from"node:process";import{readFile as t}from"node:fs/promises";import n from"node:path";import{isPackageExists as r}from"local-pkg";import i from"globals";import a from"@eslint/js";import o from"eslint-config-prettier";async function s(e){let t=await e;return t.default||t}async function c(t){if(e.env.CI||e.stdout.isTTY===!1)return;let n=t.filter(e=>!r(e));if(n.length===0)return;let{default:i}=await import(`prompts`),{result:a}=await i([{message:`${n.length===1?`Package is`:`Packages are`} required for this config: ${n.join(`, `)}. Do you want to install them?`,name:`result`,type:`confirm`}]);if(a){let{installPackage:e}=await import(`@antfu/install-pkg`);await e(n,{dev:!0})}}async function l(e){let r={};try{let i=await t(n.join(e,`.prettierrc`),`utf-8`);r=JSON.parse(i)}catch{}return r}function u(e={}){let t={js:{}},n={ts:`@typescript-eslint/`,import:`import/`,n:`n/`,unicorn:`unicorn/`,vue:`vue/`,"react-native":`react-native/`,react:`react/`,astro:`astro/`,svelte:`svelte/`,solid:`solid/`,unocss:`unocss/`},r=Object.keys(n);return r.forEach(e=>{t[e]={}}),Object.keys(e).forEach(i=>{r.some(r=>{let a=n[r],o=i.startsWith(a);return o&&(t[r][i]=e[i]),o})||(t.js[i]=e[i])}),t}async function d(e){if(!e)return[];let t=[],n=await s(import(`eslint-config-flat-gitignore`)).then(t=>[t(typeof e==`boolean`?{strict:!1}:e)]);return t.push(...n),t}const f=`?([cm])[jt]s?(x)`,p=`**/*.?([cm])[jt]s?(x)`,m=`**/*.?([cm])jsx`,h=`**/*.?([cm])tsx`,g=`**/*.vue`,_=[p,g],v=[`**/__tests__/**/*.${f}`,`**/*.spec.${f}`,`**/*.test.${f}`,`**/*.bench.${f}`,`**/*.benchmark.${f}`],y=`**/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,**/CHANGELOG*.md,**/*.min.*,**/LICENSE*,**/__snapshots__,**/auto-import?(s).d.ts,**/components.d.ts,**/.github/workflows/*.yml`.split(`,`);function b(e={}){return[{languageOptions:{ecmaVersion:2023,globals:{...i.browser,...i.es2025,...i.node,document:`readonly`,navigator:`readonly`,window:`readonly`},parserOptions:{ecmaFeatures:{jsx:!0},ecmaVersion:2022,sourceType:`module`},sourceType:`module`},linterOptions:{reportUnusedDisableDirectives:!1},rules:{...a.configs.all.rules,"accessor-pairs":[`error`,{enforceForClassMembers:!0,setWithoutGet:!0}],camelcase:`off`,"capitalized-comments":`off`,"dot-notation":[`error`,{allowKeywords:!0}],"func-style":`off`,"id-length":`off`,"init-declarations":`off`,"line-comment-position":`off`,"max-classes-per-file":`off`,"max-lines":`off`,"max-lines-per-function":`off`,"max-statements":`off`,"max-statements-per-line":`off`,"multiline-comment-style":`off`,"new-cap":[`error`,{newIsCap:!0,capIsNew:!1,properties:!0}],"no-console":`warn`,"no-duplicate-imports":`off`,"no-empty":[`error`,{allowEmptyCatch:!0}],"no-empty-function":`off`,"no-inline-comments":`off`,"no-labels":[`error`,{allowLoop:!1,allowSwitch:!1}],"no-magic-numbers":`off`,"no-mixed-operators":[`error`,{groups:[[`+`,`-`,`*`,`/`,`%`,`**`],[`&`,`|`,`^`,`~`,`<<`,`>>`,`>>>`],[`==`,`!=`,`===`,`!==`,`>`,`>=`,`<`,`<=`],[`&&`,`||`],[`in`,`instanceof`]],allowSamePrecedence:!0}],"no-negated-condition":`off`,"no-redeclare":[`error`,{builtinGlobals:!1}],"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[const=true]`,`TSExportAssignment`],"no-self-assign":[`error`,{props:!0}],"no-ternary":`off`,"no-undefined":`off`,"no-unneeded-ternary":[`error`,{defaultAssignment:!1}],"no-unused-expressions":[`error`,{allowShortCircuit:!0,allowTaggedTemplates:!0,allowTernary:!0}],"no-unused-vars":[`error`,{vars:`all`,args:`all`,ignoreRestSiblings:!1,varsIgnorePattern:`^_`,argsIgnorePattern:`^_`}],"no-useless-assignment":`off`,"no-use-before-define":[`error`,{functions:!1,classes:!1,variables:!0}],"object-shorthand":[`error`,`always`,{ignoreConstructors:!1,avoidQuotes:!0}],"one-var":[`error`,`never`],"prefer-arrow-callback":[`error`,{allowNamedFunctions:!1,allowUnboundThis:!0}],"prefer-const":[`error`,{destructuring:`all`,ignoreReadBeforeAssign:!0}],"prefer-destructuring":`off`,"prefer-named-capture-group":`off`,"prefer-regex-literals":[`error`,{disallowRedundantWrapping:!0}],"require-atomic-updates":`off`,"require-await":`off`,"require-unicode-regexp":`off`,"sort-imports":[`error`,{allowSeparatedGroups:!1,ignoreCase:!1,ignoreDeclarationSort:!0,ignoreMemberSort:!1,memberSyntaxSortOrder:[`none`,`all`,`multiple`,`single`]}],"sort-keys":`off`,"spaced-comment":[`error`,`always`,{line:{markers:[`*package`,`!`,`/`,`,`,`=`]},block:{balanced:!0,markers:[`*package`,`!`,`,`,`:`,`::`,`flow-include`],exceptions:[`*`]}}],"unicode-bom":[`error`,`never`],...e}},{files:[`**/scripts/${p}`,`**/cli.${f}`],rules:{"no-console":`off`}},{files:v,rules:{"no-unused-expressions":`off`}}]}async function x(e={}){return[{plugins:{n:await s(import(`eslint-plugin-n`))},rules:{"n/handle-callback-err":[`error`,`^(err|error)$`],"n/no-deprecated-api":`error`,"n/no-exports-assign":`error`,"n/no-new-require":`error`,"n/no-path-concat":`error`,"n/prefer-global/buffer":[`error`,`never`],"n/prefer-global/process":[`error`,`never`],"n/process-exit-as-throw":`error`,...e}}]}async function S(e={}){let t=await s(import(`eslint-plugin-import-x`)),n=[`vite`,`vite/**`,`vitepress`,`vitepress/**`,`@vitejs/**`,`vite-plugin-**`,`vue`,`@vue/**`,`vue-router`,`@vueuse/**`,`unocss`,`@unocss/**`,`unplugin-**`,`pinia`,`naive-ui`,`element-plus`,`ant-design-vue`,`soy-ui`,`@soy-ui/**`,`soybean-ui`,`@soybean-ui/**`,`@soybeanjs/**`],r=[`react`,`react-dom`,`react-router-dom`,`react-query`,`react-i18next`,`antd`],i=[`axios`,`es-toolkit`,`date-fns`,`dayjs`,`lodash-es`,`@tanstack/**`,`zod`,`valibot`],a=`@/constant.@/constant/**.@/constants.@/constants/**.@/config.@/config/**.@/configs.@/configs/**.@/setting.@/setting/**.@/settings.@/settings/**.@/plugin.@/plugin/**.@/plugins.@/plugins/**.@/layouts.@/views.@/components.@/router.@/service.@/service/**.@/services.@/services/**.@/api.@/api/**.@/apis.@/apis/**.@/store.@/store/**.@/context.@/context/**.@/composables.@/composables/**.@/hooks.@/hooks/**.@/directives.@/shared.@/shared/**.@/utils.@/utils/**.@/styles.@/style.@/assets.@/assets/**.@/**`.split(`.`),o=[...n,...r,...i].map(e=>({pattern:e,group:`external`,position:`before`})),c=a.map(e=>({pattern:e,group:`internal`,position:`before`}));return[{plugins:{import:t},rules:{"import/first":`error`,"import/no-duplicates":`error`,"import/no-mutable-exports":`error`,"import/no-named-default":`error`,"import/no-self-import":`error`,"import/no-webpack-loader-syntax":`error`,"import/order":[`error`,{"newlines-between":`never`,groups:[`builtin`,`external`,`internal`,`parent`,`sibling`,`index`],pathGroups:[...o,...c],pathGroupsExcludedImportTypes:[]}],...e}}]}async function C(e={}){return[{plugins:{unicorn:await s(import(`eslint-plugin-unicorn`))},rules:{"unicorn/error-message":`error`,"unicorn/escape-case":`error`,"unicorn/no-instanceof-array":`error`,"unicorn/no-new-array":`error`,"unicorn/no-new-buffer":`error`,"unicorn/number-literal-case":`error`,"unicorn/prefer-dom-node-text-content":`error`,"unicorn/prefer-includes":`error`,"unicorn/prefer-node-protocol":`error`,"unicorn/prefer-number-properties":`error`,"unicorn/prefer-string-starts-ends-with":`error`,"unicorn/prefer-type-error":`error`,"unicorn/throw-new-error":`error`,...e}}]}async function w(){let e=await s(import(`@typescript-eslint/eslint-plugin`)),{rules:t}=e.configs[`eslint-recommended`].overrides[0];return{...e.configs.base.rules,...t,...e.configs.strict.rules,"@typescript-eslint/consistent-type-imports":[`error`,{prefer:`type-imports`,disallowTypeAnnotations:!1}],"@typescript-eslint/no-empty-interface":[`error`,{allowSingleExtends:!0}],"no-redeclare":`off`,"@typescript-eslint/no-redeclare":`error`,"no-unused-vars":`off`,"@typescript-eslint/no-unused-vars":[`error`,{vars:`all`,args:`all`,ignoreRestSiblings:!1,varsIgnorePattern:`^_`,argsIgnorePattern:`^_`}],"no-use-before-define":`off`,"@typescript-eslint/no-use-before-define":[`error`,{functions:!1,classes:!1,variables:!0}],"no-shadow":`off`,"@typescript-eslint/no-shadow":`error`,"@typescript-eslint/ban-types":`off`,"@typescript-eslint/consistent-type-definitions":`off`,"@typescript-eslint/no-empty-function":`off`,"@typescript-eslint/no-explicit-any":`off`,"@typescript-eslint/no-non-null-assertion":`off`,"@typescript-eslint/unified-signatures":`off`}}async function T(e={}){let[t,n]=await Promise.all([s(import(`@typescript-eslint/eslint-plugin`)),s(import(`@typescript-eslint/parser`))]),r=await w();return[{files:[p],languageOptions:{parser:n,parserOptions:{sourceType:`module`}},plugins:{"@typescript-eslint":t},rules:{...r,...e}},{files:[`**/*.js`,`**/*.cjs`],rules:{"@typescript-eslint/no-require-imports":`off`,"@typescript-eslint/no-var-requires":`off`}}]}async function E(e,t={}){if(!e)return[];let{version:n,files:r}=e;await c([`eslint-plugin-vue`,`vue-eslint-parser`]);let[i,a,o]=await Promise.all([s(import(`eslint-plugin-vue`)),s(import(`vue-eslint-parser`)),s(import(`@typescript-eslint/eslint-plugin`))]),l=await w(),u=(n===3?[`essential`,`strongly-recommended`,`recommended`]:[`vue2-essential`,`vue2-strongly-recommended`,`vue2-recommended`]).reduce((e,t)=>{let n=i.configs[t];return{...e,...n.rules}},{});return[{plugins:{vue:i}},{files:r,languageOptions:{parser:a,parserOptions:{ecmaFeatures:{jsx:!0},extraFileExtensions:[`.vue`],parser:`@typescript-eslint/parser`,sourceType:`module`}},processor:i.processors[`.vue`],plugins:{"@typescript-eslint":o},rules:{...l,...i.configs.base.rules,...u,"vue/block-order":[`warn`,{order:[`script`,`template`,`style`]}],"vue/component-api-style":[`warn`,[`script-setup`,`composition`]],"vue/component-name-in-template-casing":[`warn`,`PascalCase`,{registeredComponentsOnly:!1,ignores:[]}],"vue/component-options-name-casing":[`warn`,`PascalCase`],"vue/custom-event-name-casing":[`warn`,`camelCase`],"vue/define-emits-declaration":[`warn`,`type-based`],"vue/define-macros-order":`off`,"vue/define-props-declaration":[`warn`,`type-based`],"vue/html-comment-content-newline":`warn`,"vue/multi-word-component-names":`warn`,"vue/next-tick-style":[`warn`,`promise`],"vue/no-duplicate-attr-inheritance":`warn`,"vue/no-required-prop-with-default":`warn`,"vue/no-static-inline-styles":`warn`,"vue/no-template-target-blank":`error`,"vue/no-this-in-before-route-enter":`error`,"vue/no-undef-properties":`warn`,"vue/no-unsupported-features":`warn`,"vue/no-unused-emit-declarations":`warn`,"vue/no-unused-properties":`warn`,"vue/no-unused-refs":`warn`,"vue/no-use-v-else-with-v-for":`error`,"vue/no-useless-mustaches":`warn`,"vue/no-useless-v-bind":`error`,"vue/no-v-text":`warn`,"vue/padding-line-between-blocks":`warn`,"vue/prefer-define-options":`warn`,"vue/prefer-separate-static-class":`warn`,"vue/prop-name-casing":[`warn`,`camelCase`],"vue/require-macro-variable-name":[`warn`,{defineProps:`props`,defineEmits:`emit`,defineSlots:`slots`,useSlots:`slots`,useAttrs:`attrs`}],"vue/valid-define-options":`warn`,...t}}]}async function D(e,t={}){if(!e)return[];let{files:n}=e;await c([`eslint-plugin-react`,`eslint-plugin-react-hooks`,`eslint-plugin-react-refresh`]);let[i,a,o]=await Promise.all([s(import(`eslint-plugin-react`)),s(import(`eslint-plugin-react-hooks`)),s(import(`eslint-plugin-react-refresh`))]),l=[`vite`].some(e=>r(e));return[{plugins:{react:i,"react-hooks":a,"react-refresh":o},settings:{react:{version:`detect`}}},{files:n,languageOptions:{parserOptions:{ecmaFeatures:{jsx:!0}}},rules:{"react-hooks/exhaustive-deps":`warn`,"react-hooks/rules-of-hooks":`error`,"react-refresh/only-export-components":[`warn`,{allowConstantExport:l}],...i.configs.recommended.rules,"react/react-in-jsx-scope":`off`,"react/jsx-uses-react":`off`,...t}}]}async function O(e,t={}){if(!e)return[];let{files:n}=e;await c([`eslint-plugin-react-native`]);let r=await s(import(`eslint-plugin-react-native`));return[{plugins:{"react-native":r}},{files:n,languageOptions:{parserOptions:{ecmaFeatures:{jsx:!0}},globals:{...r.environments[`react-native`].globals}},rules:{...r.configs.all.rules,...t}}]}async function k(e,t={}){if(!e)return[];let{files:n}=e;await c([`eslint-plugin-solid`]);let r=await s(import(`eslint-plugin-solid`));return[{plugins:{solid:r}},{files:n,languageOptions:{parserOptions:{ecmaFeatures:{jsx:!0}}},rules:{...r.configs.typescript.rules,...t}}]}async function A(e,t={},n={}){if(!e)return[];let{files:r}=e;await c([`eslint-plugin-svelte`,`svelte-eslint-parser`,`prettier-plugin-svelte`]);let[i,a,o,l]=await Promise.all([s(import(`eslint-plugin-svelte`)),s(import(`svelte-eslint-parser`)),s(import(`@typescript-eslint/eslint-plugin`)),s(import(`eslint-plugin-prettier`))]),u=await w(),{plugins:d=[]}=t,f={...t,plugins:d.concat(`prettier-plugin-svelte`)};return[{files:r,languageOptions:{parser:a,parserOptions:{extraFileExtensions:[`.svelte`],parser:`@typescript-eslint/parser`,sourceType:`module`}},plugins:{"@typescript-eslint":o,svelte:i,prettier:l},processor:i.processors.svelte,rules:{...u,"no-inner-declarations":`off`,"no-self-assign":`off`,"svelte/comment-directive":`error`,"svelte/system":`error`,"svelte/infinite-reactive-loop":`error`,"svelte/no-at-debug-tags":`warn`,"svelte/no-at-html-tags":`error`,"svelte/no-dom-manipulating":`error`,"svelte/no-dupe-else-if-blocks":`error`,"svelte/no-dupe-on-directives":`error`,"svelte/no-dupe-style-properties":`error`,"svelte/no-dupe-use-directives":`error`,"svelte/no-export-load-in-svelte-module-in-kit-pages":`error`,"svelte/no-immutable-reactive-statements":`error`,"svelte/no-inner-declarations":`error`,"svelte/no-inspect":`warn`,"svelte/no-not-function-handler":`error`,"svelte/no-object-in-text-mustaches":`error`,"svelte/no-raw-special-elements":`error`,"svelte/no-reactive-functions":`error`,"svelte/no-reactive-literals":`error`,"svelte/no-reactive-reassign":`error`,"svelte/no-shorthand-style-property-overrides":`error`,"svelte/no-store-async":`error`,"svelte/no-svelte-internal":`error`,"svelte/no-unknown-style-directive-property":`error`,"svelte/no-unused-svelte-ignore":`error`,"svelte/no-useless-children-snippet":`error`,"svelte/no-useless-mustaches":`error`,"svelte/require-each-key":`error`,"svelte/require-event-dispatcher-types":`error`,"svelte/require-store-reactive-access":`error`,"svelte/valid-each-key":`error`,"svelte/valid-prop-names-in-kit-pages":`error`,...n,"prettier/prettier":[`warn`,{...f,parser:`svelte`}]}}]}async function j(e,t={},n={}){if(!e)return[];let{files:r}=e;await c([`eslint-plugin-astro`,`astro-eslint-parser`,`prettier-plugin-astro`]);let[i,a,o]=await Promise.all([s(import(`eslint-plugin-astro`)),s(import(`@typescript-eslint/eslint-plugin`)),s(import(`eslint-plugin-prettier`))]),l=await w(),{plugins:u=[]}=t,d={...t,plugins:u.concat(`prettier-plugin-astro`)};return[...i.configs.recommended,{files:r,plugins:{"@typescript-eslint":a,prettier:o},rules:{...l,...n,"prettier/prettier":[`warn`,{...d,parser:`astro`}]}}]}async function M(e,t={}){return e?(await c([`@unocss/eslint-config`]),[{plugins:{unocss:(await s(import(`@unocss/eslint-config/flat`))).plugins.unocss},rules:{"unocss/order":`warn`,"unocss/order-attributify":`off`,"unocss/blocklist":`off`,...t}}]):[]}const{rules:N}=o;async function P(e){let t=await s(import(`eslint-plugin-prettier`)),{plugins:n=[]}=e,r={...e,plugins:n};return[{files:_,plugins:{prettier:t},rules:{...N,"prettier/prettier":[`warn`,r],"arrow-body-style":`off`,"prefer-arrow-callback":`off`}}]}async function F(e,t={}){let{html:n=!0,css:r=!0,json:i=!0,markdown:a,yaml:o,toml:l}=e||{},[u,d]=await Promise.all([s(import(`eslint-plugin-prettier`)),s(import(`eslint-parser-plain`))]);function f(e,n,r){let i={...t,parser:n};return r?.length&&(i.plugins=[...i.plugins||[],...r]),{files:e,languageOptions:{parser:d},plugins:{prettier:u},rules:{"prettier/prettier":[`warn`,i]}}}let p=[];if(r){let e=f([`**/*.css`,`**/*.{p,post}css`],`css`),t=f([` **/*.scss`],`scss`),n=f([`**/*.less`],`less`);p.push(e,t,n)}if(n){let e=f([`**/*.htm?(l)`],`html`);p.push(e)}if(i){let e=f([`**/*.json`,`**/*.jsonc`],`json`,[`prettier-plugin-json-sort`]),t=f([`**/*.json5`],`json5`);p.push(e,t)}if(a){let e=f([`**/*.md`],`markdown`);p.push(e)}if(o){let e=f([`**/*.y?(a)ml`],`yaml`);p.push(e)}if(l){await c([`@toml-tools/parser`,`prettier-plugin-toml`]);let e=f([`**/*.toml`],`toml`,[`prettier-plugin-toml`]);p.push(e)}return p}const I={printWidth:120,singleQuote:!0,trailingComma:`none`,arrowParens:`avoid`,htmlWhitespaceSensitivity:`ignore`,jsdocCapitalizeDescription:!1};async function L(t={}){let n={cwd:e.cwd(),ignores:y,gitignore:!0,overrides:{},prettierRules:{...I},usePrettierrc:!0,formatter:{html:!0,css:!0,json:!0}},{cwd:r,ignores:i,gitignore:a,overrides:o,prettierRules:s,usePrettierrc:c,formatter:u,unocss:d,...f}=t;if(r&&(n.cwd=r),i?.length&&(n.ignores=[...n.ignores,...i]),a&&(n.gitignore=a),o&&(n.overrides=o),s&&(n.prettierRules={...n.prettierRules,...s}),c!==void 0&&(n.usePrettierrc=c),n.usePrettierrc){let e=await l(n.cwd);Object.assign(n.prettierRules,e)}u&&Object.assign(n.formatter,u);let p=[`vue`,`react`,`react-native`,`solid`,`svelte`,`astro`],_={vue:[g],react:[m,h],"react-native":[m,h],solid:[m,h],svelte:[`**/*.svelte`],astro:[`**/*.astro`]};return p.forEach(e=>{n[e]=R(e,f[e],_[e])}),f[`react-native`]&&!f.react&&(n.react=R(`react`,!0,_.react)),n.unocss=!!d,n}function R(e,t,n){if(!t)return;if(e===`vue`){let e={version:3,files:n};return typeof t==`object`&&Object.assign(e,t),e}let r={files:n};return typeof t==`object`&&Object.assign(r,t),r}async function z(e={},...t){let n=await L(e),r={ignores:n.ignores},i=u(n.overrides),a=await d(n.gitignore),o=b(i.js),s=await x(i.n),c=await S(i.import),l=await C(i.unicorn),f=await T(i.ts),p=await E(n.vue,i.vue),m=await k(n.solid,i.solid),h=await D(n.react,i.react),g=await O(n[`react-native`],i[`react-native`]),_=await A(n.svelte,n.prettierRules,i.svelte),v=await j(n.astro,n.prettierRules,i.astro),y=await M(n.unocss,i.unocss),w=await P(n.prettierRules),N=await F(n.formatter,n.prettierRules),I=await Promise.all(t);return[...a,r,...o,...s,...c,...l,...f,...p,...h,...g,...m,...v,..._,...y,...I,...w,...N]}export{z as defineConfig};