UNPKG

@neosjs/eslint-config

Version:

Neosjs's ESLint config

72 lines (64 loc) 12.1 kB
/*! * @neosjs/eslint-config * Version: 1.3.2 * ReleaseTime: 2024-09-21T03:22:36.727Z * Copyright (c) 2021-PRESENT NeosJS */ import B from"node:process";import h from"picocolors";import{hideBin as ae}from"yargs/helpers";import le from"yargs";import*as k from"@clack/prompts";import oe from"node:fs";import pe from"node:path";import v from"node:process";import x from"picocolors";import*as o from"@clack/prompts";import j from"picocolors";var l={name:"@neosjs/eslint-config",type:"module",version:"1.3.2",packageManager:"pnpm@9.1.0",description:"Neosjs's ESLint config",author:"\u542C\u7740\u60C5\u6B4C\u6D41\u6CEA",license:"MIT",homepage:"https://docs.neosjs.com/eslint-config",keywords:["eslint-config","eslint","neosjs"],exports:{".":{import:"./dist/index.js",require:"./dist/index.cjs"}},main:"./dist/index.js",types:"./dist/index.d.ts",bin:{"eslint-config":"bin/index.js"},files:["bin","dist"],engines:{node:">=18.18.0"},scripts:{build:"pnpm typegen && tsup --format esm,cjs --clean --dts",stub:"tsup --format esm",dev:"npx @eslint/config-inspector --config eslint.config.ts",watch:"tsup --format esm,cjs --watch",lint:"eslint --flag unstable_ts_config .",typegen:"esno scripts/typegen.ts",prepublishOnly:"pnpm build",typecheck:"tsc --noEmit",prepare:"simple-git-hooks",release:"release && npm publish"},peerDependencies:{"@eslint-react/eslint-plugin":"^1.6.0","@prettier/plugin-xml":"^3.4.1","@unocss/eslint-plugin":">=0.50.0",eslint:"^9.10.0","eslint-plugin-format":">=0.1.2","eslint-plugin-react-hooks":"^4.6.2","eslint-plugin-react-refresh":"^0.4.4","prettier-plugin-slidev":"^1.0.5"},peerDependenciesMeta:{"@eslint-react/eslint-plugin":{optional:!0},"@prettier/plugin-xml":{optional:!0},"@unocss/eslint-plugin":{optional:!0},"eslint-plugin-format":{optional:!0},"eslint-plugin-react-hooks":{optional:!0},"eslint-plugin-react-refresh":{optional:!0},"prettier-plugin-slidev":{optional:!0}},dependencies:{"@antfu/install-pkg":"^0.4.1","@clack/prompts":"^0.7.0","@eslint-community/eslint-plugin-eslint-comments":"^4.4.0","@eslint/markdown":"^6.1.0","@stylistic/eslint-plugin":"^2.8.0","@typescript-eslint/eslint-plugin":"^8.6.0","@typescript-eslint/parser":"^8.6.0","@vitest/eslint-plugin":"^1.1.4","eslint-config-flat-gitignore":"^0.3.0","eslint-flat-config-utils":"^0.4.0","eslint-merge-processors":"^0.1.0","eslint-plugin-antfu":"^2.7.0","eslint-plugin-command":"^0.2.5","eslint-plugin-import-x":"^4.2.1","eslint-plugin-jsdoc":"^50.2.4","eslint-plugin-jsonc":"^2.16.0","eslint-plugin-n":"^17.10.3","eslint-plugin-no-only-tests":"^3.3.0","eslint-plugin-perfectionist":"^3.4.0","eslint-plugin-regexp":"^2.6.0","eslint-plugin-toml":"^0.11.1","eslint-plugin-unicorn":"^55.0.0","eslint-plugin-unused-imports":"^4.1.3","eslint-plugin-vue":"^9.28.0","eslint-plugin-yml":"^1.14.0","eslint-processor-vue-blocks":"^0.1.2",globals:"^15.9.0","jsonc-eslint-parser":"^2.4.0","local-pkg":"^0.5.0","parse-gitignore":"^2.0.0",picocolors:"^1.1.0","toml-eslint-parser":"^0.10.0","vue-eslint-parser":"^9.4.3","yaml-eslint-parser":"^1.2.3",yargs:"^17.7.2"},devDependencies:{"@eslint-react/eslint-plugin":"^1.10.1","@eslint/config-inspector":"^0.5.3","@prettier/plugin-xml":"^3.4.1","@stylistic/eslint-plugin-migrate":"^2.6.4","@types/eslint":"^9.6.0","@types/fs-extra":"^11.0.4","@types/node":"^22.5.5","@types/prompts":"^2.4.9","@types/yargs":"^17.0.33","@unocss/eslint-plugin":"^0.62.4",eslint:"^9.10.0","eslint-plugin-format":"^0.1.2","eslint-plugin-react-hooks":"^4.6.2","eslint-plugin-react-refresh":"^0.4.9","eslint-typegen":"^0.3.2",esno:"^4.7.0",execa:"^9.4.0","fast-glob":"^3.3.2","fs-extra":"^11.2.0",jiti:"^1.21.6","lint-staged":"^15.2.9","prettier-plugin-slidev":"^1.0.5",rimraf:"^6.0.0","simple-git-hooks":"^2.11.1",tsup:"^8.3.0",tsx:"^4.19.1",typescript:"^5.6.2",vitest:"^2.0.5",vue:"^3.5.6"},resolutions:{"@eslint-community/eslint-utils":"^4.4.0","@typescript-eslint/utils":"^8.6.0",eslint:"^9.10.0",tsx:"~4.17.0"},"simple-git-hooks":{"pre-commit":"npx lint-staged"},"lint-staged":{"*":"eslint --flag unstable_ts_config --fix"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"}};var S=` // \u542F\u7528ESlint\u6241\u5E73\u5316\u914D\u7F6E\u652F\u6301 // (\u5982\u679C\u4F60\u7684ESLint\u6269\u5C55\u9AD8\u4E8Ev3.0.5\uFF0C\u8BF7\u5220\u9664\u6B64\u9009\u9879) "eslint.experimental.useFlatConfig": true, // \u7981\u7528prettier\u9ED8\u8BA4\u683C\u5F0F\u5316\u5668\uFF0C\u4F7F\u7528eslint\u4EE3\u66FF "prettier.enable": false, "editor.formatOnSave": false, // \u81EA\u52A8\u4FEE\u590D "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", "source.organizeImports": "never" }, // \u5728IDE\u4E2D\u7684\u98CE\u683C\u89C4\u5219\uFF0C\u4F46\u4ECD\u7136\u81EA\u52A8\u4FEE\u590D\u5B83\u4EEC "eslint.rules.customizations": [ { "rule": "style/*", "severity": "off" }, { "rule": "format/*", "severity": "off" }, { "rule": "*-indent", "severity": "off" }, { "rule": "*-spacing", "severity": "off" }, { "rule": "*-spaces", "severity": "off" }, { "rule": "*-order", "severity": "off" }, { "rule": "*-dangle", "severity": "off" }, { "rule": "*-newline", "severity": "off" }, { "rule": "*quotes", "severity": "off" }, { "rule": "*semi", "severity": "off" } ], // \u4E3A\u4EE5\u4E0B\u8BED\u8A00\u542F\u7528eslint "eslint.validate": [ "javascript", "javascriptreact", "typescript", "typescriptreact", "vue", "html", "markdown", "json", "jsonc", "yaml", "toml", "xml", "css", "less", "scss", "pcss", "postcss" ] `,P=[{label:j.green("Vue"),value:"vue"},{label:j.cyan("React"),value:"react"}],R=P.map(({value:e})=>e),C=[{hint:"\u4F7F\u7528\u5916\u90E8\u683C\u5F0F\u5316\u5668(Prettier \u548C/\u6216 dprint)\u6765\u683C\u5F0F\u5316ESLint\u8FD8\u4E0D\u80FD\u5904\u7406\u7684\u6587\u4EF6(.css, .html\u7B49)",label:j.red("Formatter"),value:"formatter"},{label:j.cyan("UnoCSS"),value:"unocss"}],I=C.map(({value:e})=>e),V={react:["@eslint-react/eslint-plugin","eslint-plugin-react-hooks","eslint-plugin-react-refresh"],slidev:["prettier-plugin-slidev"],vue:[]};import{execSync as ee}from"node:child_process";function J(){try{return ee("git diff-index --quiet HEAD --"),!0}catch{return!1}}function N(e,r){return` import neosjs from '@neosjs/eslint-config' export default neosjs({ ${e} }${r?.map(i=>`,{ ${i} }`)}) `.trimStart()}import te from"node:path";import A from"node:fs/promises";import ie from"node:process";import E from"picocolors";import*as d from"@clack/prompts";async function M(e){let r=ie.cwd(),i=te.join(r,"package.json");d.log.step(E.cyan(`\u5C06 @neosjs/eslint-config \u5347\u7EA7\u5230 v${l.version}`));let p=await A.readFile(i,"utf-8"),t=JSON.parse(p);t.devDependencies??={},t.devDependencies["@neosjs/eslint-config"]=`^${l.version}`,t.devDependencies.eslint??=l.devDependencies.eslint.replace("npm:eslint-ts-patch@","").replace(/-\d+$/,"");let n=[];e.extra.length&&e.extra.forEach(a=>{switch(a){case"formatter":["eslint-plugin-format"].forEach(s=>{s&&(t.devDependencies[s]=l.devDependencies[s],n.push(s))});break;case"unocss":["@unocss/eslint-plugin"].forEach(s=>{t.devDependencies[s]=l.devDependencies[s],n.push(s)});break}});for(let a of e.frameworks){let s=V[a];s&&s.forEach(c=>{t.devDependencies[c]=l.devDependencies[c],n.push(c)})}n.length&&d.note(`${E.dim(n.join(", "))}`,"Added packages"),await A.writeFile(i,JSON.stringify(t,null,2)),d.log.success(E.green("\u5BF9 package.json \u8FDB\u884C\u4FEE\u6539"))}import q from"node:fs";import F from"node:fs/promises";import se from"node:process";import $ from"node:path";import D from"picocolors";import*as y from"@clack/prompts";import ne from"parse-gitignore";async function _(e){let r=se.cwd(),i=$.join(r,".eslintignore"),p=$.join(r,"package.json"),t=await F.readFile(p,"utf-8"),a=JSON.parse(t).type==="module"?"eslint.config.js":"eslint.config.mjs",s=$.join(r,a),c=[];if(q.existsSync(i)){y.log.step(D.cyan("\u8FC1\u79FB\u73B0\u6709\u7684 .eslintignore"));let m=await F.readFile(i,"utf-8"),Q=ne(m).globs();for(let w of Q)w.type==="ignore"?c.push(...w.patterns):w.type==="unignore"&&c.push(...w.patterns.map(X=>`!${X}`))}let u=[];c.length&&u.push(`ignores: ${JSON.stringify(c)},`),e.extra.includes("formatter")&&u.push("formatters: true,"),e.extra.includes("unocss")&&u.push("unocss: true,");for(let m of e.frameworks)u.push(`${m}: true,`);let K=u.map(m=>` ${m}`).join(` `),U=N(K,[]);await F.writeFile(s,U),y.log.success(D.green(`\u521B\u5EFA ${a}`));let Y=q.readdirSync(r),O=[];Y.forEach(m=>{/eslint|prettier/.test(m)&&!/eslint\.config\./.test(m)&&O.push(m)}),O.length&&y.note(`${D.dim(O.join(", "))}`,"You can now remove those files")}import T from"node:path";import b from"node:fs/promises";import z from"node:fs";import re from"node:process";import G from"picocolors";import*as L from"@clack/prompts";async function H(e){let r=re.cwd();if(!e.updateVscodeSettings)return;let i=T.join(r,".vscode"),p=T.join(i,"settings.json");if(z.existsSync(i)||await b.mkdir(i,{recursive:!0}),!z.existsSync(p))await b.writeFile(p,`{${S}} `,"utf-8"),L.log.success(G.green("\u521B\u5EFA .vscode/settings.json"));else{let t=await b.readFile(p,"utf8");t=t.trim().replace(/\s*\}$/,""),t+=t.endsWith(",")||t.endsWith("{")?"":",",t+=`${S}} `,await b.writeFile(p,t,"utf-8"),L.log.success(G.green("\u66F4\u65B0 .vscode/settings.json"))}}async function W(e={}){let r=!!v.env.SKIP_PROMPT||e.yes,i=e.frameworks?.map(n=>n.trim()),p=e.extra?.map(n=>n.trim());if(oe.existsSync(pe.join(v.cwd(),"eslint.config.js")))return o.log.warn(x.yellow("eslint.config.js \u5DF2\u5B58\u5728\uFF0C\u8FC1\u79FB\u5411\u5BFC\u5DF2\u9000\u51FA.")),v.exit(1);let t={extra:p??[],frameworks:i??[],uncommittedConfirmed:!1,updateVscodeSettings:!0};if(!r&&(t=await o.group({uncommittedConfirmed:()=>r||J()?Promise.resolve(!0):o.confirm({initialValue:!1,message:"\u5F53\u524D\u5B58\u50A8\u5E93\u4E2D\u6709\u672A\u63D0\u4EA4\u7684\u66F4\u6539\uFF0C\u60A8\u786E\u5B9A\u7EE7\u7EED\u5417?"}),frameworks:({results:n})=>{let a=typeof i=="string"&&!!R.includes(i);if(!n.uncommittedConfirmed||a)return;let s=!a&&i?`"${i}" \u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u6A21\u677F\u3002\u8BF7\u4ECE\u4E0B\u9762\u9009\u62E9: `:"\u9009\u62E9\u4E00\u4E2A\u6846\u67B6:";return o.multiselect({message:x.reset(s),options:P,required:!1})},extra:({results:n})=>{let a=p?.length&&!p.filter(c=>!I.includes(c)).length;if(!n.uncommittedConfirmed||a)return;let s=!a&&p?`"${p}" \u4E0D\u662F\u6709\u6548\u7684\u989D\u5916\u6548\u7528\u3002\u8BF7\u4ECE\u4E0B\u9762\u9009\u62E9: `:"\u9009\u62E9\u4E00\u4E2A\u989D\u5916\u7684\u5DE5\u5177:";return o.multiselect({message:x.reset(s),options:C,required:!1})},updateVscodeSettings:({results:n})=>{if(n.uncommittedConfirmed)return o.confirm({initialValue:!0,message:"\u66F4\u65B0 .vscode/settings.json \u3002\u4E3A\u4E86\u66F4\u597D\u7684 VSCode \u4F53\u9A8C?"})}},{onCancel:()=>{o.cancel("\u64CD\u4F5C\u88AB\u53D6\u6D88."),v.exit(0)}}),!t.uncommittedConfirmed))return v.exit(1);await M(t),await _(t),await H(t),o.log.success(x.green("\u8BBE\u7F6E\u5B8C\u6210")),o.outro(`\u73B0\u5728\u60A8\u53EF\u4EE5\u66F4\u65B0\u4F9D\u8D56\u9879\u5E76\u8FD0\u884C ${x.blue("eslint . --fix")} `)}function ce(){console.log(` `),k.intro(`${h.green("@neosjs/eslint-config ")}${h.dim(`v${l.version}`)}`)}var me=le(ae(B.argv)).scriptName("@neosjs/eslint-config").usage("").command("*","\u6267\u884C\u521D\u59CB\u5316\u6216\u8FC1\u79FB",e=>e.option("yes",{alias:"y",description:"\u8DF3\u8FC7\u63D0\u793A\u5E76\u4F7F\u7528\u9ED8\u8BA4\u503C",type:"boolean"}).option("template",{alias:"t",description:"\u4F7F\u7528\u6846\u67B6\u6A21\u677F\u8FDB\u884C\u6700\u4F73\u5B9A\u5236: vue / react",type:"string"}).option("extra",{alias:"e",array:!0,description:"\u4F7F\u7528\u989D\u5916\u7684\u5DE5\u5177: formatter / unocss",type:"string"}).help(),async e=>{ce();try{await W(e)}catch(r){k.log.error(h.inverse(h.red(" \u8FC1\u79FB\u5931\u8D25 "))),k.log.error(h.red(`\u2718 ${String(r)}`)),B.exit(1)}}).showHelpOnFail(!1).alias("h","help").version("version",l.version).alias("v","version");me.help().argv;