@elliemae/pui-cli 9.0.0-alpha.11 → 9.0.0-alpha.13
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 +6 -4
- package/build/docs/404.html +4 -4
- package/build/docs/api/functions/loadRoutes/index.html +9 -9
- package/build/docs/api/index.html +8 -8
- package/build/docs/api/type-aliases/LIB_NAME/index.html +5 -5
- package/build/docs/api/variables/babelConfig/index.html +5 -28
- package/build/docs/api/variables/commitlintConfig/index.html +5 -8
- package/build/docs/api/variables/eslintFlatBaseConfig/index.html +6 -6
- package/build/docs/api/variables/eslintFlatBaseConfigStrict/index.html +6 -6
- package/build/docs/api/variables/eslintFlatConfig/index.html +6 -6
- package/build/docs/api/variables/eslintFlatConfigStrict/index.html +6 -6
- package/build/docs/api/variables/jestConfig/index.html +86 -86
- package/build/docs/api/variables/jestNodeConfig/index.html +86 -86
- package/build/docs/api/variables/lintStagedConfig/index.html +22 -12
- package/build/docs/api/variables/prettierConfig/index.html +5 -18
- package/build/docs/api/variables/stylelintConfig/index.html +5 -5
- package/build/docs/api/variables/vitestConfig/index.html +5 -5
- package/build/docs/assets/css/{styles.74603f39.css → styles.3cba4e67.css} +1 -1
- package/build/docs/assets/js/04ee7372.c6c3d513.js +1 -0
- package/build/docs/assets/js/0551d4dd.a6b1d9fa.js +1 -0
- package/build/docs/assets/js/0a1d0315.43980061.js +1 -0
- package/build/docs/assets/js/13097d8d.4ac8ef79.js +1 -0
- package/build/docs/assets/js/{16b7bc88.c3779e27.js → 16b7bc88.2ac57556.js} +1 -1
- package/build/docs/assets/js/{17896441.84339068.js → 17896441.705d85a0.js} +1 -1
- package/build/docs/assets/js/{1b9df811.aaa95da1.js → 1b9df811.ec75cfdc.js} +1 -1
- package/build/docs/assets/js/{232a0286.33b2782b.js → 232a0286.6f749ae5.js} +1 -1
- package/build/docs/assets/js/{2399.cc5803e0.js → 2399.5d123cba.js} +1 -1
- package/build/docs/assets/js/{37d86055.47211796.js → 37d86055.1e73f036.js} +1 -1
- package/build/docs/assets/js/3992.b9b54f94.js +2 -0
- package/build/docs/assets/js/4fb6949f.13bde4a8.js +1 -0
- package/build/docs/assets/js/5befad71.96f04f67.js +1 -0
- package/build/docs/assets/js/5d5f1db0.e7607cd2.js +1 -0
- package/build/docs/assets/js/5e8c322a.0b86bf5a.js +1 -0
- package/build/docs/assets/js/5e95c892.de377e27.js +1 -0
- package/build/docs/assets/js/{5fb3c522.da5628e8.js → 5fb3c522.3ec831ee.js} +1 -1
- package/build/docs/assets/js/6bd11e52.c61bfcd5.js +1 -0
- package/build/docs/assets/js/6e96545e.1b545333.js +1 -0
- package/build/docs/assets/js/{71f6d02b.cfd98385.js → 71f6d02b.4b381360.js} +1 -1
- package/build/docs/assets/js/{6704.2615a5c6.js → 7843.f4b19776.js} +1 -1
- package/build/docs/assets/js/80e87108.8c451f49.js +1 -0
- package/build/docs/assets/js/{8585.3cb09ff7.js → 8585.e2298db3.js} +1 -1
- package/build/docs/assets/js/{a7bd4aaa.30ffad02.js → a7bd4aaa.aceac89c.js} +1 -1
- package/build/docs/assets/js/a94703ab.248144c2.js +1 -0
- package/build/docs/assets/js/b7b585d8.7d50f3f6.js +1 -0
- package/build/docs/assets/js/{bde5209a.f5bca8b2.js → bde5209a.480cc8d8.js} +1 -1
- package/build/docs/assets/js/c377a04b.c6b6b394.js +1 -0
- package/build/docs/assets/js/{dfd75424.51c4e2cb.js → dfd75424.459da76b.js} +1 -1
- package/build/docs/assets/js/f736c962.ab424879.js +1 -0
- package/build/docs/assets/js/main.3ae939d4.js +2 -0
- package/build/docs/assets/js/runtime~main.9ecf1839.js +1 -0
- package/build/docs/eslint-rules-migration/index.html +43 -43
- package/build/docs/index.html +70 -71
- package/build/docs/pui-cli-9-migration/index.html +191 -70
- package/build/docs/sitemap.xml +1 -1
- package/build/docs/ssl-certificate-setup/index.html +23 -23
- package/build/docs/stylelint-migration/index.html +19 -21
- package/build/docs/usage-guide/index.html +91 -91
- package/dist/cjs/babel.config.js +124 -0
- package/dist/cjs/commands/storybook.js +33 -4
- package/dist/cjs/index.js +5 -9
- package/dist/cjs/lint-config/commitlint/export.mjs +1 -0
- package/dist/cjs/lint-config/commitlint.config.mjs +6 -0
- package/dist/cjs/lint-config/eslint/common.cjs +8 -1
- package/dist/cjs/lint-config/eslint/flat/compat.mjs +5 -5
- package/dist/cjs/lint-config/eslint/flat/rules.mjs +1 -0
- package/dist/cjs/lint-config/lint-staged.config.js +17 -5
- package/dist/cjs/lint-config/prettier/export.mjs +1 -0
- package/dist/cjs/lint-config/{prettier.config.cjs → prettier.config.mjs} +4 -1
- package/dist/cjs/skills/migrate-storybook-out-of-cjs/SKILL.md +242 -0
- package/dist/cjs/skills/migrate-to-pui-cli-9/SKILL.md +188 -25
- package/dist/cjs/testing/{jest.config.cjs → jest.config.mjs} +14 -6
- package/dist/{esm/testing/jest.node.config.cjs → cjs/testing/jest.node.config.mjs} +3 -2
- package/dist/cjs/testing/setup-textencoder.cjs +4 -0
- package/dist/cjs/webpack/webpack.storybook.js +62 -0
- package/dist/esm/babel.config.js +94 -0
- package/dist/esm/commands/storybook.js +22 -4
- package/dist/esm/index.js +5 -9
- package/dist/esm/lint-config/commitlint/export.mjs +1 -0
- package/dist/esm/lint-config/commitlint.config.mjs +6 -0
- package/dist/esm/lint-config/eslint/common.cjs +8 -1
- package/dist/esm/lint-config/eslint/flat/compat.mjs +5 -5
- package/dist/esm/lint-config/eslint/flat/rules.mjs +1 -0
- package/dist/esm/lint-config/lint-staged.config.js +17 -5
- package/dist/esm/lint-config/prettier/export.mjs +1 -0
- package/{lib/lint-config/prettier.config.cjs → dist/esm/lint-config/prettier.config.mjs} +4 -1
- package/dist/esm/skills/migrate-storybook-out-of-cjs/SKILL.md +242 -0
- package/dist/esm/skills/migrate-to-pui-cli-9/SKILL.md +188 -25
- package/dist/esm/testing/{jest.config.cjs → jest.config.mjs} +14 -6
- package/dist/{cjs/testing/jest.node.config.cjs → esm/testing/jest.node.config.mjs} +3 -2
- package/dist/esm/testing/setup-textencoder.cjs +4 -0
- package/dist/esm/webpack/webpack.storybook.js +61 -0
- package/dist/types/lib/babel.config.d.ts +3 -0
- package/dist/types/lib/commands/storybook.d.ts +1 -0
- package/dist/types/lib/index.d.ts +5 -9
- package/dist/types/lib/lint-config/commitlint/export.d.mts +1 -0
- package/dist/types/lib/lint-config/commitlint.config.d.mts +3 -0
- package/dist/types/lib/lint-config/eslint/common.d.cts +8 -2
- package/dist/types/lib/lint-config/eslint/flat/compat.d.mts +1 -1
- package/dist/types/lib/lint-config/eslint/non-react.d.cts +8 -1
- package/dist/types/lib/lint-config/eslint/react.d.cts +8 -1
- package/dist/types/lib/lint-config/eslint/typescript/non-react.d.cts +8 -1
- package/dist/types/lib/lint-config/eslint/typescript/react.d.cts +8 -1
- package/dist/types/lib/lint-config/lint-staged.config.d.ts +2 -2
- package/dist/types/lib/lint-config/prettier/export.d.mts +1 -0
- package/dist/types/lib/lint-config/prettier.config.d.mts +3 -0
- package/dist/types/lib/testing/setup-textencoder.d.cts +1 -0
- package/dist/types/lib/utils.d.cts +1 -1
- package/dist/types/lib/utils.d.ts +1 -1
- package/dist/types/lib/webpack/webpack.storybook.d.ts +2 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/lib/lint-config/commitlint/export.mjs +1 -0
- package/lib/lint-config/commitlint.config.mjs +6 -0
- package/lib/lint-config/eslint/common.cjs +8 -1
- package/lib/lint-config/eslint/flat/compat.mjs +5 -5
- package/lib/lint-config/eslint/flat/rules.mjs +1 -0
- package/lib/lint-config/lint-staged.config.js +20 -5
- package/lib/lint-config/prettier/export.mjs +1 -0
- package/{dist/esm/lint-config/prettier.config.cjs → lib/lint-config/prettier.config.mjs} +4 -1
- package/lib/skills/migrate-storybook-out-of-cjs/SKILL.md +242 -0
- package/lib/skills/migrate-to-pui-cli-9/SKILL.md +188 -25
- package/lib/testing/jest.config.mjs +124 -0
- package/lib/testing/jest.node.config.mjs +9 -0
- package/package.json +46 -36
- package/build/docs/api/variables/eslintBaseConfig/index.html +0 -132
- package/build/docs/api/variables/eslintConfig/index.html +0 -180
- package/build/docs/assets/js/04ee7372.eaa386ed.js +0 -1
- package/build/docs/assets/js/0551d4dd.ebb18f4f.js +0 -1
- package/build/docs/assets/js/0a1d0315.fc8f91a7.js +0 -1
- package/build/docs/assets/js/13097d8d.af480dfd.js +0 -1
- package/build/docs/assets/js/3992.0ac29b2f.js +0 -2
- package/build/docs/assets/js/4fb6949f.369cc1b9.js +0 -1
- package/build/docs/assets/js/5befad71.5f19afb5.js +0 -1
- package/build/docs/assets/js/5d5f1db0.c5aa5afa.js +0 -1
- package/build/docs/assets/js/5e8c322a.ef3b894b.js +0 -1
- package/build/docs/assets/js/5e95c892.f550b901.js +0 -1
- package/build/docs/assets/js/6bd11e52.08b95209.js +0 -1
- package/build/docs/assets/js/6e96545e.30c1b801.js +0 -1
- package/build/docs/assets/js/80e87108.f9507b95.js +0 -1
- package/build/docs/assets/js/a94703ab.f1796514.js +0 -1
- package/build/docs/assets/js/b7b585d8.6d53e73f.js +0 -1
- package/build/docs/assets/js/b8ac1d98.62684003.js +0 -1
- package/build/docs/assets/js/c377a04b.0f8625c6.js +0 -1
- package/build/docs/assets/js/e5f79924.c793a74d.js +0 -1
- package/build/docs/assets/js/f736c962.dbd0d004.js +0 -1
- package/build/docs/assets/js/main.7f815b7e.js +0 -2
- package/build/docs/assets/js/runtime~main.f7c5bef0.js +0 -1
- package/dist/cjs/babel.config.cjs +0 -97
- package/dist/cjs/index.cjs +0 -35
- package/dist/cjs/lint-config/commitlint.config.cjs +0 -1
- package/dist/cjs/lint-config/stylelint.config.cjs +0 -3
- package/dist/esm/babel.config.cjs +0 -97
- package/dist/esm/index.cjs +0 -35
- package/dist/esm/lint-config/commitlint.config.cjs +0 -1
- package/dist/esm/lint-config/stylelint.config.cjs +0 -3
- package/dist/types/lib/babel.config.d.cts +0 -59
- package/dist/types/lib/index.d.cts +0 -13
- package/dist/types/lib/lint-config/commitlint.config.d.cts +0 -4
- package/dist/types/lib/lint-config/prettier.config.d.cts +0 -8
- package/dist/types/lib/lint-config/stylelint.config.d.cts +0 -2
- package/lib/lint-config/commitlint.config.cjs +0 -1
- package/lib/lint-config/stylelint.config.cjs +0 -3
- /package/build/docs/assets/js/{3992.0ac29b2f.js.LICENSE.txt → 3992.b9b54f94.js.LICENSE.txt} +0 -0
- /package/build/docs/assets/js/{main.7f815b7e.js.LICENSE.txt → main.3ae939d4.js.LICENSE.txt} +0 -0
- /package/dist/types/lib/testing/{jest.config.d.cts → jest.config.d.mts} +0 -0
- /package/dist/types/lib/testing/{jest.node.config.d.cts → jest.node.config.d.mts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{"use strict";var e,a,r,t,d,b={},c={};function f(e){var a=c[e];if(void 0!==a)return a.exports;var r=c[e]={id:e,loaded:!1,exports:{}};return b[e].call(r.exports,r,r.exports,f),r.loaded=!0,r.exports}f.m=b,f.c=c,e=[],f.O=(a,r,t,d)=>{if(!r){var b=1/0;for(i=0;i<e.length;i++){for(var[r,t,d]=e[i],c=!0,o=0;o<r.length;o++)(!1&d||b>=d)&&Object.keys(f.O).every(e=>f.O[e](r[o]))?r.splice(o--,1):(c=!1,d<b&&(b=d));if(c){e.splice(i--,1);var n=t();void 0!==n&&(a=n)}}return a}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[r,t,d]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var d=Object.create(null);f.r(d);var b={};a=a||[null,r({}),r([]),r(r)];for(var c=2&t&&e;("object"==typeof c||"function"==typeof c)&&!~a.indexOf(c);c=r(c))Object.getOwnPropertyNames(c).forEach(a=>b[a]=()=>e[a]);return b.default=()=>e,f.d(d,b),d},f.d=(e,a)=>{for(var r in a)f.o(a,r)&&!f.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce((a,r)=>(f.f[r](e,a),a),[])),f.u=e=>"assets/js/"+({594:"5e8c322a",1019:"4fb6949f",1091:"5fb3c522",1380:"5befad71",1572:"0a1d0315",1712:"0551d4dd",2113:"6bd11e52",2577:"f736c962",2960:"5d5f1db0",3361:"c377a04b",3891:"71f6d02b",4676:"80e87108",5455:"13097d8d",5742:"aba21aa0",5908:"04ee7372",5983:"dfd75424",6130:"16b7bc88",6264:"b7b585d8",6688:"6e96545e",7098:"a7bd4aaa",7581:"37d86055",7589:"232a0286",8155:"bde5209a",8401:"17896441",9048:"a94703ab",9577:"1b9df811",9647:"5e95c892"}[e]||e)+"."+{97:"70eddfb5",213:"e69351b3",242:"73516ab6",247:"e1522e52",594:"0b86bf5a",821:"8d4e2a80",936:"c151b43f",1019:"13bde4a8",1091:"3ec831ee",1126:"fa547e9c",1127:"f28430e6",1298:"fb0939c9",1380:"96f04f67",1572:"43980061",1617:"b2623271",1700:"4f7a9007",1712:"a6b1d9fa",2113:"c61bfcd5",2297:"e63290f4",2399:"5d123cba",2577:"ab424879",2673:"da75a556",2805:"f0505f8c",2960:"e7607cd2",3361:"c6b6b394",3395:"eb3dad5b",3499:"2d5c6821",3552:"9272c0d9",3720:"8e7f36d4",3891:"4b381360",3992:"b9b54f94",4069:"301f1115",4134:"553b3645",4257:"9afce6ac",4676:"8c451f49",4772:"6294b364",4884:"9dbe23e5",5196:"98f7e06a",5248:"ee436cea",5428:"71752e9a",5455:"4ac8ef79",5742:"3bbcf0cc",5908:"c6c3d513",5964:"0728ed91",5968:"5f4ccba7",5983:"459da76b",6130:"2ac57556",6264:"7d50f3f6",6486:"68ae0007",6688:"1b545333",7080:"efd5ba6c",7098:"aceac89c",7201:"e90ba636",7344:"95656e38",7516:"b6668d60",7525:"a8d0db87",7540:"7a4353cf",7581:"1e73f036",7589:"6f749ae5",7843:"f4b19776",7985:"8c6943d6",8049:"8ba75278",8152:"f2bebb2f",8155:"480cc8d8",8290:"a4f7a2ca",8355:"864847a1",8389:"26a9caca",8401:"705d85a0",8585:"e2298db3",8788:"03856709",9048:"248144c2",9178:"50ac2954",9210:"1ac21da8",9354:"37ad86f9",9574:"b172d607",9577:"ec75cfdc",9647:"de377e27",9852:"f77caf52",9953:"f6278635"}[e]+".js",f.miniCssF=e=>{},f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),t={},d="@elliemae/pui-cli:",f.l=(e,a,r,b)=>{if(t[e])t[e].push(a);else{var c,o;if(void 0!==r)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var l=n[i];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==d+r){c=l;break}}c||(o=!0,(c=document.createElement("script")).charset="utf-8",f.nc&&c.setAttribute("nonce",f.nc),c.setAttribute("data-webpack",d+r),c.src=e),t[e]=[a];var u=(a,r)=>{c.onerror=c.onload=null,clearTimeout(s);var d=t[e];if(delete t[e],c.parentNode&&c.parentNode.removeChild(c),d&&d.forEach(e=>e(r)),a)return a(r)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=u.bind(null,c.onerror),c.onload=u.bind(null,c.onload),o&&document.head.appendChild(c)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.dn=e=>{(Object.getOwnPropertyDescriptor(e,"name")||{}).writable||Object.defineProperty(e,"name",{value:"default",configurable:!0})},f.p="/cli/",f.gca=function(e){return e={17896441:"8401","5e8c322a":"594","4fb6949f":"1019","5fb3c522":"1091","5befad71":"1380","0a1d0315":"1572","0551d4dd":"1712","6bd11e52":"2113",f736c962:"2577","5d5f1db0":"2960",c377a04b:"3361","71f6d02b":"3891","80e87108":"4676","13097d8d":"5455",aba21aa0:"5742","04ee7372":"5908",dfd75424:"5983","16b7bc88":"6130",b7b585d8:"6264","6e96545e":"6688",a7bd4aaa:"7098","37d86055":"7581","232a0286":"7589",bde5209a:"8155",a94703ab:"9048","1b9df811":"9577","5e95c892":"9647"}[e]||e,f.p+f.u(e)},(()=>{var e={5354:0,1869:0};f.f.j=(a,r)=>{var t=f.o(e,a)?e[a]:void 0;if(0!==t)if(t)r.push(t[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise((r,d)=>t=e[a]=[r,d]);r.push(t[2]=d);var b=f.p+f.u(a),c=new Error;f.l(b,r=>{if(f.o(e,a)&&(0!==(t=e[a])&&(e[a]=void 0),t)){var d=r&&("load"===r.type?"missing":r.type),b=r&&r.target&&r.target.src;c.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",c.name="ChunkLoadError",c.type=d,c.request=b,t[1](c)}},"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,r)=>{var t,d,[b,c,o]=r,n=0;if(b.some(a=>0!==e[a])){for(t in c)f.o(c,t)&&(f.m[t]=c[t]);if(o)var i=o(f)}for(a&&a(r);n<b.length;n++)d=b[n],f.o(e,d)&&e[d]&&e[d][0](),e[d]=0;return f.O(i)},r=globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[];r.forEach(a.bind(null,0)),r.push=a.bind(null,r.push.bind(r))})()})();
|
|
@@ -3,25 +3,25 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="generator" content="Docusaurus v3.10.1">
|
|
6
|
-
<title data-rh="true">ESLint rules migration guide (legacy → ESLint 10 flat config) | Cli</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pui.ice.com/cli/eslint-rules-migration"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="ESLint rules migration guide (legacy → ESLint 10 flat config) | Cli"><meta data-rh="true" name="description" content="This document compares the previous @elliemae/pui-cli ESLint setup (ESLint 8 + .eslintrc.cjs + Airbnb) with the current setup (ESLint 10 + eslint.config.mjs + typescript-eslint v8 flat config)."><meta data-rh="true" property="og:description" content="This document compares the previous @elliemae/pui-cli ESLint setup (ESLint 8 + .eslintrc.cjs + Airbnb) with the current setup (ESLint 10 + eslint.config.mjs + typescript-eslint v8 flat config)."><link data-rh="true" rel="icon" href="/cli/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pui.ice.com/cli/eslint-rules-migration"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/eslint-rules-migration" hreflang="en"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/eslint-rules-migration" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"ESLint rules migration guide (legacy → ESLint 10 flat config)","item":"https://pui.ice.com/cli/eslint-rules-migration"}]}</script><link rel="stylesheet" href="/cli/assets/css/styles.
|
|
7
|
-
<script src="/cli/assets/js/runtime~main.
|
|
8
|
-
<script src="/cli/assets/js/main.
|
|
6
|
+
<title data-rh="true">ESLint rules migration guide (legacy → ESLint 10 flat config) | Cli</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pui.ice.com/cli/eslint-rules-migration"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="ESLint rules migration guide (legacy → ESLint 10 flat config) | Cli"><meta data-rh="true" name="description" content="This document compares the previous @elliemae/pui-cli ESLint setup (ESLint 8 + .eslintrc.cjs + Airbnb) with the current setup (ESLint 10 + eslint.config.mjs + typescript-eslint v8 flat config)."><meta data-rh="true" property="og:description" content="This document compares the previous @elliemae/pui-cli ESLint setup (ESLint 8 + .eslintrc.cjs + Airbnb) with the current setup (ESLint 10 + eslint.config.mjs + typescript-eslint v8 flat config)."><link data-rh="true" rel="icon" href="/cli/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pui.ice.com/cli/eslint-rules-migration"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/eslint-rules-migration" hreflang="en"><link data-rh="true" rel="alternate" href="https://pui.ice.com/cli/eslint-rules-migration" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"ESLint rules migration guide (legacy → ESLint 10 flat config)","item":"https://pui.ice.com/cli/eslint-rules-migration"}]}</script><link rel="stylesheet" href="/cli/assets/css/styles.3cba4e67.css">
|
|
7
|
+
<script src="/cli/assets/js/runtime~main.9ecf1839.js" defer="defer"></script>
|
|
8
|
+
<script src="/cli/assets/js/main.3ae939d4.js" defer="defer"></script>
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<svg style="display: none;"><defs>
|
|
12
12
|
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
|
|
13
13
|
</defs></svg>
|
|
14
|
-
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="
|
|
14
|
+
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_uUOh" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/cli/"><div class="navbar__logo"><img src="/cli/img/logo.svg" alt="Cli" class="themedComponent_DNHH themedComponent--light_puUK"><img src="/cli/img/logo.svg" alt="Cli" class="themedComponent_DNHH themedComponent--dark_ytUh"></div><b class="navbar__title text--truncate">Cli</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/cli/">Getting Started</a><a class="navbar__item navbar__link" href="/cli/api">API</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://git.elliemae.io/platform-ui/pui-cli.git" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_gBgG"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_bwF7 colorModeToggle_QGVI"><button class="clean-btn toggleButton_Cu0l toggleButtonDisabled_OZ9s" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_njg9 lightToggleIcon_jmWU"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_njg9 darkToggleIcon_cwWx"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_njg9 systemToggleIcon_OGHn"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_WcYf"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_yECr"><div class="docsWrapper_uGqN"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_psYS" type="button"></button><div class="docRoot_xjvB"><aside class="theme-doc-sidebar-container docSidebarContainer_CacH"><div class="sidebarViewport_EpUQ"><div class="sidebar_Pceu"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_NnMk"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_Uon2 menu__link menu__link--sublist" href="/cli/api/"><span title="Cli API" class="categoryLinkLabel_eWUU">Cli API</span></a><button aria-label="Expand sidebar category 'Cli API'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" href="/cli/eslint-rules-migration"><span title="ESLint rules migration guide (legacy → ESLint 10 flat config)" class="linkLabel_GXod">ESLint rules migration guide (legacy → ESLint 10 flat config)</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/cli/"><span title="PUI CLI Documentation" class="linkLabel_GXod">PUI CLI Documentation</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/cli/pui-cli-9-migration"><span title="pui-cli 9 migration guide" class="linkLabel_GXod">pui-cli 9 migration guide</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/cli/ssl-certificate-setup"><span title="Trust SSL Certificate Guide" class="linkLabel_GXod">Trust SSL Certificate Guide</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/cli/stylelint-migration"><span title="Stylelint migration guide (pui-cli 8 → 9 / Stylelint 17)" class="linkLabel_GXod">Stylelint migration guide (pui-cli 8 → 9 / Stylelint 17)</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/cli/usage-guide"><span title="Usage Guide" class="linkLabel_GXod">Usage Guide</span></a></li></ul></nav></div></div></aside><main class="docMainContainer_eyKo"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_Dj72"><div class="docItemContainer_Qzlb"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_BbJP" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/cli/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_h1OG"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">ESLint rules migration guide (legacy → ESLint 10 flat config)</span></li></ul></nav><div class="tocCollapsible_SEmd theme-doc-toc-mobile tocMobile_GImu"><button type="button" class="clean-btn tocCollapsibleButton_wJia">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>ESLint rules migration guide (legacy → ESLint 10 flat config)</h1></header>
|
|
15
15
|
<p>This document compares the <strong>previous</strong> <code>@elliemae/pui-cli</code> ESLint setup (ESLint 8 + <code>.eslintrc.cjs</code> + Airbnb) with the <strong>current</strong> setup (ESLint 10 + <code>eslint.config.mjs</code> + <code>typescript-eslint</code> v8 flat config).</p>
|
|
16
16
|
<p>For the full pui-cli 9 upgrade path (Node 24, pnpm 11, CI, Cursor skills), see <a class="" href="/cli/pui-cli-9-migration">pui-cli 9 migration guide</a>.</p>
|
|
17
17
|
<p>Use it when upgrading apps/libraries and explaining new lint failures to your team.</p>
|
|
18
18
|
<hr>
|
|
19
|
-
<h2 class="anchor
|
|
19
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="at-a-glance">At a glance<a href="#at-a-glance" class="hash-link" aria-label="Direct link to At a glance" title="Direct link to At a glance" translate="no"></a></h2>
|
|
20
20
|
<table><thead><tr><th>Topic</th><th>Before (legacy)</th><th>After (flat config)</th></tr></thead><tbody><tr><td>Config format</td><td><code>.eslintrc.cjs</code> + <code>.eslintignore</code></td><td><code>eslint.config.mjs</code> (ignores built-in)</td></tr><tr><td>ESLint</td><td>8.x</td><td><strong>10.x</strong></td></tr><tr><td>TypeScript lint</td><td><code>@typescript-eslint</code> v5, <code>project: true</code></td><td><code>typescript-eslint</code> v8, <code>projectService: true</code></td></tr><tr><td>JS parser</td><td><code>@babel/eslint-parser</code></td><td><code>@eslint/js</code> recommended (no Babel parser for lint)</td></tr><tr><td>Style presets</td><td><strong>Airbnb</strong> + <strong>airbnb-typescript</strong></td><td>Removed — rules re-expressed explicitly</td></tr><tr><td>Import plugin</td><td><code>eslint-plugin-import</code> (<code>import/*</code>)</td><td><code>eslint-plugin-import-x</code> (<code>import-x/*</code>)</td></tr><tr><td>Prettier in ESLint</td><td><code>prettier/prettier</code> <strong>error</strong></td><td><strong>Not enforced in ESLint</strong> — use Prettier in <code>lint-staged</code> / CI</td></tr><tr><td>Indent in ESLint</td><td><code>indent</code> <strong>error</strong></td><td>Removed — Prettier owns formatting</td></tr><tr><td>Type-aware TS</td><td><code>recommended-requiring-type-checking</code></td><td><code>recommendedTypeChecked</code> (v8 equivalent)</td></tr><tr><td>Consumer import</td><td><code>require('@elliemae/pui-cli').eslintConfig</code></td><td><code>import { eslintFlatConfig } from '@elliemae/pui-cli/eslint'</code></td></tr><tr><td>Strict import</td><td>—</td><td><code>eslintFlatConfigStrict</code> / <code>eslintFlatBaseConfigStrict</code></td></tr></tbody></table>
|
|
21
21
|
<hr>
|
|
22
|
-
<h2 class="anchor
|
|
23
|
-
<div class="language-js
|
|
24
|
-
<div class="language-js
|
|
22
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="how-to-upgrade-a-repo">How to upgrade a repo<a href="#how-to-upgrade-a-repo" class="hash-link" aria-label="Direct link to How to upgrade a repo" title="Direct link to How to upgrade a repo" translate="no"></a></h2>
|
|
23
|
+
<div class="language-js codeBlockContainer_xJos theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HrWh"><pre tabindex="0" class="prism-code language-js codeBlock_wqKj thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tOUB"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// eslint.config.mjs — React apps / libraries</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> eslintFlatConfig </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@elliemae/pui-cli/eslint'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> eslintFlatConfig</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
|
|
24
|
+
<div class="language-js codeBlockContainer_xJos theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HrWh"><pre tabindex="0" class="prism-code language-js codeBlock_wqKj thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tOUB"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// eslint.config.mjs — Node / TS services (non-React)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> eslintFlatBaseConfig </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@elliemae/pui-cli/eslint'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> eslintFlatBaseConfig</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
|
|
25
25
|
<ol>
|
|
26
26
|
<li class="">Upgrade <code>@elliemae/pui-cli</code> to the alpha release that ships flat config.</li>
|
|
27
27
|
<li class="">Add <code>eslint.config.mjs</code> as above.</li>
|
|
@@ -29,83 +29,83 @@
|
|
|
29
29
|
<li class="">Run <code>pui-cli lint</code> and <code>pui-cli lint --fix</code>.</li>
|
|
30
30
|
</ol>
|
|
31
31
|
<hr>
|
|
32
|
-
<h2 class="anchor
|
|
33
|
-
<h3 class="anchor
|
|
32
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="presets-what-was-removed-vs-added">Presets: what was removed vs added<a href="#presets-what-was-removed-vs-added" class="hash-link" aria-label="Direct link to Presets: what was removed vs added" title="Direct link to Presets: what was removed vs added" translate="no"></a></h2>
|
|
33
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="removed-no-longer-extended">Removed (no longer extended)<a href="#removed-no-longer-extended" class="hash-link" aria-label="Direct link to Removed (no longer extended)" title="Direct link to Removed (no longer extended)" translate="no"></a></h3>
|
|
34
34
|
<table><thead><tr><th>Legacy extend</th><th>Impact</th></tr></thead><tbody><tr><td><code>airbnb</code> / <code>airbnb/hooks</code></td><td>React style rules from Airbnb (e.g. <code>react/jsx-props-no-spreading</code>, <code>react/no-array-index-key</code>, stricter JSX patterns) are <strong>gone</strong> unless we set them explicitly in PUI config.</td></tr><tr><td><code>airbnb-base</code></td><td>Same for non-React JS.</td></tr><tr><td><code>airbnb-typescript</code> / <code>airbnb-typescript/base</code></td><td>Airbnb + TypeScript combo rules removed.</td></tr><tr><td><code>plugin:prettier/recommended</code></td><td><code>prettier/prettier</code> is no longer an ESLint error.</td></tr><tr><td><code>plugin:import/recommended</code></td><td>Replaced by <code>eslint-plugin-import-x</code> flat recommended.</td></tr><tr><td><code>plugin:mdx/recommended</code></td><td>MDX-specific ESLint block removed from shared React config (Storybook flat config remains).</td></tr></tbody></table>
|
|
35
|
-
<h3 class="anchor
|
|
36
|
-
<table><thead><tr><th>Area</th><th>Legacy</th><th>Flat config</th></tr></thead><tbody><tr><td>Core JS</td><td>ESLint recommended (via Airbnb + plugins)</td><td><code>@eslint/js</code> <strong>recommended</strong></td></tr><tr><td>TypeScript</td><td><code>@typescript-eslint/recommended</code> + <strong>recommended-requiring-type-checking</strong></td><td><code>typescript-eslint</code> <strong>recommendedTypeChecked</strong></td></tr><tr><td>React</td><td><code>plugin:react/recommended</code> (via Airbnb)</td><td><code>eslint-plugin-react</code> <strong>recommended</strong></td></tr><tr><td>Hooks</td><td><code>react-hooks/rules-of-hooks</code> (explicit); <strong>no</strong> <code>exhaustive-deps</code> in old pui-cli</td><td><code>rules-of-hooks</code> <strong>error</strong> + <strong><code>exhaustive-deps</code> warn</strong> (new)</td></tr><tr><td>a11y</td><td><code>plugin:jsx-a11y/recommended</code></td><td><code>eslint-plugin-jsx-a11y</code> flat <strong>recommended</strong></td></tr><tr><td>Jest</td><td><code>plugin:jest/recommended</code></td><td><code>eslint-plugin-jest</code> <strong>recommended</strong></td></tr><tr><td>Testing Library</td><td><code>plugin:testing-library/dom</code></td><td>Same (<strong>dom</strong> rules only)</td></tr><tr><td>WDIO</td><td><code>plugin:wdio/recommended</code></td><td>Same</td></tr><tr><td>Redux Saga</td><td><code>plugin:redux-saga/recommended</code></td><td>Same</td></tr><tr><td>Storybook</td><td><code>plugin:storybook/recommended</code></td><td><code>eslint-plugin-storybook</code> flat <strong>recommended</strong> (
|
|
37
|
-
<h3 class="anchor
|
|
35
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="still-included-equivalent-or-better">Still included (equivalent or better)<a href="#still-included-equivalent-or-better" class="hash-link" aria-label="Direct link to Still included (equivalent or better)" title="Direct link to Still included (equivalent or better)" translate="no"></a></h3>
|
|
36
|
+
<table><thead><tr><th>Area</th><th>Legacy</th><th>Flat config</th></tr></thead><tbody><tr><td>Core JS</td><td>ESLint recommended (via Airbnb + plugins)</td><td><code>@eslint/js</code> <strong>recommended</strong></td></tr><tr><td>TypeScript</td><td><code>@typescript-eslint/recommended</code> + <strong>recommended-requiring-type-checking</strong></td><td><code>typescript-eslint</code> <strong>recommendedTypeChecked</strong></td></tr><tr><td>React</td><td><code>plugin:react/recommended</code> (via Airbnb)</td><td><code>eslint-plugin-react</code> <strong>recommended</strong></td></tr><tr><td>Hooks</td><td><code>react-hooks/rules-of-hooks</code> (explicit); <strong>no</strong> <code>exhaustive-deps</code> in old pui-cli</td><td><code>rules-of-hooks</code> <strong>error</strong> + <strong><code>exhaustive-deps</code> warn</strong> (new)</td></tr><tr><td>a11y</td><td><code>plugin:jsx-a11y/recommended</code></td><td><code>eslint-plugin-jsx-a11y</code> flat <strong>recommended</strong></td></tr><tr><td>Jest</td><td><code>plugin:jest/recommended</code></td><td><code>eslint-plugin-jest</code> <strong>recommended</strong></td></tr><tr><td>Testing Library</td><td><code>plugin:testing-library/dom</code></td><td>Same (<strong>dom</strong> rules only)</td></tr><tr><td>WDIO</td><td><code>plugin:wdio/recommended</code></td><td>Same</td></tr><tr><td>Redux Saga</td><td><code>plugin:redux-saga/recommended</code></td><td>Same</td></tr><tr><td>Storybook</td><td><code>plugin:storybook/recommended</code></td><td><code>eslint-plugin-storybook</code> flat <strong>recommended</strong> (v10, Storybook 10–compatible)</td></tr><tr><td>Prettier conflict</td><td><code>eslint-config-prettier</code> via <code>plugin:prettier/recommended</code></td><td><code>eslint-config-prettier</code> only (disables conflicting ESLint style rules)</td></tr></tbody></table>
|
|
37
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="optional-not-enabled-by-default">Optional (not enabled by default)<a href="#optional-not-enabled-by-default" class="hash-link" aria-label="Direct link to Optional (not enabled by default)" title="Direct link to Optional (not enabled by default)" translate="no"></a></h3>
|
|
38
38
|
<table><thead><tr><th>Preset</th><th>Status</th></tr></thead><tbody><tr><td><code>typescript-eslint/strictTypeChecked</code></td><td><strong>Not</strong> enabled — optional stricter tier for a later rollout</td></tr><tr><td><code>typescript-eslint/stylistic*</code></td><td><strong>Not</strong> enabled — Prettier is the source of truth for formatting</td></tr></tbody></table>
|
|
39
39
|
<hr>
|
|
40
|
-
<h2 class="anchor
|
|
40
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="pui-custom-rules--unchanged">PUI custom rules — unchanged<a href="#pui-custom-rules--unchanged" class="hash-link" aria-label="Direct link to PUI custom rules — unchanged" title="Direct link to PUI custom rules — unchanged" translate="no"></a></h2>
|
|
41
41
|
<p>These explicit PUI rules are <strong>the same</strong> in spirit (same limits and overrides):</p>
|
|
42
42
|
<table><thead><tr><th>Rule</th><th>JS (<code>.js</code>)</th><th>TS (<code>.ts</code>/<code>.tsx</code>)</th></tr></thead><tbody><tr><td><code>complexity</code></td><td>max 10</td><td>max 10</td></tr><tr><td><code>max-depth</code></td><td>max 4</td><td>max 4</td></tr><tr><td><code>max-nested-callbacks</code></td><td>max 3</td><td>max 3</td></tr><tr><td><code>max-params</code></td><td>max 3</td><td>max 3</td></tr><tr><td><code>max-statements</code></td><td>max 20</td><td>max 20</td></tr><tr><td><code>max-lines</code></td><td>120</td><td>200</td></tr><tr><td><code>no-console</code></td><td>warn</td><td>warn</td></tr><tr><td><code>no-param-reassign</code></td><td>props: false</td><td>props: false</td></tr><tr><td><code>arrow-body-style</code></td><td>as-needed</td><td>as-needed</td></tr><tr><td><code>prefer-template</code></td><td>error</td><td>error</td></tr></tbody></table>
|
|
43
|
-
<h3 class="anchor
|
|
43
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="typescript-explicit-same-as-before">TypeScript (explicit, same as before)<a href="#typescript-explicit-same-as-before" class="hash-link" aria-label="Direct link to TypeScript (explicit, same as before)" title="Direct link to TypeScript (explicit, same as before)" translate="no"></a></h3>
|
|
44
44
|
<table><thead><tr><th>Rule</th><th>Setting</th></tr></thead><tbody><tr><td><code>@typescript-eslint/no-floating-promises</code></td><td>error, <code>ignoreIIFE: true</code></td></tr><tr><td><code>@typescript-eslint/unbound-method</code></td><td>error, <code>ignoreStatic: true</code></td></tr><tr><td><code>@typescript-eslint/no-use-before-define</code></td><td>functions: false, classes/variables/typedefs: true</td></tr><tr><td><code>@typescript-eslint/explicit-module-boundary-types</code></td><td>off</td></tr><tr><td><code>@typescript-eslint/explicit-function-return-type</code></td><td>off</td></tr></tbody></table>
|
|
45
|
-
<h3 class="anchor
|
|
45
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="react-explicit-same-as-before">React (explicit, same as before)<a href="#react-explicit-same-as-before" class="hash-link" aria-label="Direct link to React (explicit, same as before)" title="Direct link to React (explicit, same as before)" translate="no"></a></h3>
|
|
46
46
|
<table><thead><tr><th>Rule</th><th>Setting</th></tr></thead><tbody><tr><td><code>react/function-component-definition</code></td><td>named components: arrow-function</td></tr><tr><td><code>react/react-in-jsx-scope</code></td><td>off</td></tr><tr><td><code>react/prop-types</code></td><td>off</td></tr><tr><td><code>jsx-a11y/heading-has-content</code></td><td>off</td></tr><tr><td><code>jsx-a11y/label-has-associated-control</code></td><td>on, <code>controlComponents: ['Input']</code></td></tr><tr><td><code>redux-saga/no-yield-in-race</code></td><td>error</td></tr><tr><td><code>redux-saga/yield-effects</code></td><td>error</td></tr></tbody></table>
|
|
47
|
-
<h3 class="anchor
|
|
47
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="e2e-specs-unchanged">E2E specs (unchanged)<a href="#e2e-specs-unchanged" class="hash-link" aria-label="Direct link to E2E specs (unchanged)" title="Direct link to E2E specs (unchanged)" translate="no"></a></h3>
|
|
48
48
|
<table><thead><tr><th>Files</th><th>Rule</th><th>Setting</th></tr></thead><tbody><tr><td><code>*.func.spec.js</code>, <code>*.visual.spec.js</code></td><td><code>jest/valid-expect</code></td><td>off</td></tr></tbody></table>
|
|
49
49
|
<hr>
|
|
50
|
-
<h2 class="anchor
|
|
50
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="import-rules-import--import-x">Import rules: <code>import/*</code> → <code>import-x/*</code><a href="#import-rules-import--import-x" class="hash-link" aria-label="Direct link to import-rules-import--import-x" title="Direct link to import-rules-import--import-x" translate="no"></a></h2>
|
|
51
51
|
<p>Update <strong>eslint-disable</strong> comments when you touch files:</p>
|
|
52
52
|
<table><thead><tr><th>Legacy rule name</th><th>New rule name</th></tr></thead><tbody><tr><td><code>import/no-unresolved</code></td><td><code>import-x/no-unresolved</code></td></tr><tr><td><code>import/extensions</code></td><td><code>import-x/extensions</code></td></tr><tr><td><code>import/no-named-as-default</code></td><td><code>import-x/no-named-as-default</code></td></tr><tr><td>…</td><td>Prefix <code>import/</code> → <code>import-x/</code></td></tr></tbody></table>
|
|
53
|
-
<h3 class="anchor
|
|
53
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="still-off-same-as-legacy-pui-config">Still off (same as legacy PUI config)<a href="#still-off-same-as-legacy-pui-config" class="hash-link" aria-label="Direct link to Still off (same as legacy PUI config)" title="Direct link to Still off (same as legacy PUI config)" translate="no"></a></h3>
|
|
54
54
|
<table><thead><tr><th>Rule</th><th>Status</th></tr></thead><tbody><tr><td><code>import-x/imports-first</code></td><td>off</td></tr><tr><td><code>import-x/newline-after-import</code></td><td>off</td></tr><tr><td><code>import-x/no-dynamic-require</code></td><td>off</td></tr><tr><td><code>import-x/no-extraneous-dependencies</code></td><td>off</td></tr><tr><td><code>import-x/no-named-as-default</code></td><td>off</td></tr><tr><td><code>import-x/no-webpack-loader-syntax</code></td><td>off</td></tr><tr><td><code>import-x/prefer-default-export</code></td><td>off</td></tr><tr><td><code>import-x/default</code></td><td>off</td></tr><tr><td><code>import-x/namespace</code></td><td>off</td></tr></tbody></table>
|
|
55
|
-
<h3 class="anchor
|
|
55
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="still-on">Still on<a href="#still-on" class="hash-link" aria-label="Direct link to Still on" title="Direct link to Still on" translate="no"></a></h3>
|
|
56
56
|
<table><thead><tr><th>Rule</th><th>Setting</th></tr></thead><tbody><tr><td><code>import-x/no-unresolved</code></td><td>error, strict casing</td></tr><tr><td><code>import-x/extensions</code></td><td>never (json/js ignorePackages)</td></tr></tbody></table>
|
|
57
57
|
<hr>
|
|
58
|
-
<h2 class="anchor
|
|
58
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="formatting-removed-from-eslint">Formatting: removed from ESLint<a href="#formatting-removed-from-eslint" class="hash-link" aria-label="Direct link to Formatting: removed from ESLint" title="Direct link to Formatting: removed from ESLint" translate="no"></a></h2>
|
|
59
59
|
<table><thead><tr><th>Rule</th><th>Legacy</th><th>Flat config</th></tr></thead><tbody><tr><td><code>prettier/prettier</code></td><td><strong>error</strong> (via <code>plugin:prettier/recommended</code>)</td><td><strong>off</strong> — run Prettier separately</td></tr><tr><td><code>indent</code></td><td><strong>error</strong> (2 spaces, SwitchCase: 1)</td><td><strong>removed</strong></td></tr></tbody></table>
|
|
60
60
|
<p><strong>Action:</strong> Rely on <code>prettier --write</code> / <code>lint-staged</code> for formatting. Do not expect ESLint to fail on quote/semicolon/indent issues.</p>
|
|
61
61
|
<p>Legacy <code>eslint-disable prettier/prettier</code> comments still work (no-op rule registered as off).</p>
|
|
62
62
|
<hr>
|
|
63
|
-
<h2 class="anchor
|
|
63
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="new-rules-you-may-see-after-upgrade">New rules you may see after upgrade<a href="#new-rules-you-may-see-after-upgrade" class="hash-link" aria-label="Direct link to New rules you may see after upgrade" title="Direct link to New rules you may see after upgrade" translate="no"></a></h2>
|
|
64
64
|
<p>These are the main <strong>new or stricter</strong> checks teams notice beyond “same PUI rules as before.”</p>
|
|
65
|
-
<h3 class="anchor
|
|
65
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="typescript--newly-explicit-in-pui-config">TypeScript — newly explicit in PUI config<a href="#typescript--newly-explicit-in-pui-config" class="hash-link" aria-label="Direct link to TypeScript — newly explicit in PUI config" title="Direct link to TypeScript — newly explicit in PUI config" translate="no"></a></h3>
|
|
66
66
|
<table><thead><tr><th>Rule</th><th>Severity</th><th>What it catches</th></tr></thead><tbody><tr><td><code>@typescript-eslint/consistent-type-imports</code></td><td>error</td><td>Use <code>import type { Foo }</code> for type-only imports</td></tr><tr><td><code>@typescript-eslint/no-import-type-side-effects</code></td><td>error</td><td>TS 5+ <code>import type</code> side-effect hygiene</td></tr></tbody></table>
|
|
67
|
-
<h3 class="anchor
|
|
67
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="typescript--from-recommendedtypechecked-v8-bundle">TypeScript — from <code>recommendedTypeChecked</code> (v8 bundle)<a href="#typescript--from-recommendedtypechecked-v8-bundle" class="hash-link" aria-label="Direct link to typescript--from-recommendedtypechecked-v8-bundle" title="Direct link to typescript--from-recommendedtypechecked-v8-bundle" translate="no"></a></h3>
|
|
68
68
|
<p>Already largely covered by legacy <code>recommended-requiring-type-checking</code>, but stricter defaults / renames may surface more issues, including:</p>
|
|
69
69
|
<table><thead><tr><th>Rule</th><th>Typical issue</th></tr></thead><tbody><tr><td><code>@typescript-eslint/no-misused-promises</code></td><td><code>async</code> handler passed where <code>void</code> is expected (e.g. some callbacks)</td></tr><tr><td><code>@typescript-eslint/no-unsafe-assignment</code></td><td>Assigning <code>any</code> to a typed variable</td></tr><tr><td><code>@typescript-eslint/no-unsafe-member-access</code></td><td>Property access on <code>any</code></td></tr><tr><td><code>@typescript-eslint/no-unsafe-call</code></td><td>Calling an <code>any</code> value</td></tr><tr><td><code>@typescript-eslint/no-unsafe-argument</code></td><td>Passing <code>any</code> into a typed parameter</td></tr><tr><td><code>@typescript-eslint/no-unsafe-return</code></td><td>Returning <code>any</code> from a typed function</td></tr></tbody></table>
|
|
70
70
|
<p><strong>Note:</strong> Test files (<code>**/*.{test,spec}.*</code>) disable the <code>no-unsafe-*</code> and <code>unbound-method</code> rules in the shared config to reduce noise.</p>
|
|
71
|
-
<h3 class="anchor
|
|
71
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="react--new-in-pui-cli-shared-config">React — new in pui-cli shared config<a href="#react--new-in-pui-cli-shared-config" class="hash-link" aria-label="Direct link to React — new in pui-cli shared config" title="Direct link to React — new in pui-cli shared config" translate="no"></a></h3>
|
|
72
72
|
<table><thead><tr><th>Rule</th><th>Severity</th><th>Notes</th></tr></thead><tbody><tr><td><code>react-hooks/exhaustive-deps</code></td><td><strong>warn</strong></td><td>Missing deps in <code>useEffect</code> / <code>useCallback</code> / <code>useMemo</code> — was not in legacy pui-cli (only <code>rules-of-hooks</code>)</td></tr></tbody></table>
|
|
73
|
-
<h3 class="anchor
|
|
73
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="unused-variables">Unused variables<a href="#unused-variables" class="hash-link" aria-label="Direct link to Unused variables" title="Direct link to Unused variables" translate="no"></a></h3>
|
|
74
74
|
<table><thead><tr><th>Legacy</th><th>Flat config</th></tr></thead><tbody><tr><td><code>no-unused-vars</code> on TS files</td><td><code>@typescript-eslint/no-unused-vars</code> with <code>ignoreRestSiblings</code>, <code>argsIgnorePattern: '^_'</code></td></tr></tbody></table>
|
|
75
75
|
<hr>
|
|
76
|
-
<h2 class="anchor
|
|
76
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="airbnb-removal--practical-impact">Airbnb removal — practical impact<a href="#airbnb-removal--practical-impact" class="hash-link" aria-label="Direct link to Airbnb removal — practical impact" title="Direct link to Airbnb removal — practical impact" translate="no"></a></h2>
|
|
77
77
|
<p>We no longer extend Airbnb. You should <strong>not</strong> expect every Airbnb rule to have a 1:1 replacement. Common behavioral changes:</p>
|
|
78
78
|
<table><thead><tr><th>You might have relied on (Airbnb)</th><th>After migration</th></tr></thead><tbody><tr><td>Stricter React patterns (e.g. some JSX prop rules)</td><td>Only if still in <code>eslint-plugin-react</code> recommended or our explicit <code>reactRules</code></td></tr><tr><td><code>import/prefer-default-export</code></td><td>Still <strong>off</strong> in PUI config</td></tr><tr><td><code>react/jsx-props-no-spreading</code></td><td>Still <strong>off</strong> in PUI config</td></tr><tr><td>Many opinionated React/a11y defaults from Airbnb</td><td>Replaced by <strong>plugin recommended</strong> sets + PUI overrides above</td></tr></tbody></table>
|
|
79
79
|
<p>If lint gets <strong>looser</strong> in some areas, that is expected. If it gets <strong>stricter</strong>, it is usually from <strong>type-checked TypeScript</strong> or <strong><code>consistent-type-imports</code></strong>, not from Airbnb.</p>
|
|
80
80
|
<hr>
|
|
81
|
-
<h2 class="anchor
|
|
81
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="file-type-overrides-flat-config-only">File-type overrides (flat config only)<a href="#file-type-overrides-flat-config-only" class="hash-link" aria-label="Direct link to File-type overrides (flat config only)" title="Direct link to File-type overrides (flat config only)" translate="no"></a></h2>
|
|
82
82
|
<table><thead><tr><th>Files</th><th>Rules relaxed</th></tr></thead><tbody><tr><td><code>**/*.d.ts</code></td><td><code>@typescript-eslint/no-explicit-any</code>, <code>@typescript-eslint/no-empty-object-type</code> off</td></tr><tr><td><code>**/*.{test,spec}.{js,jsx,ts,tsx}</code>, <code>**/__tests__/**</code>, <code>lib/**/tests/**</code>, <code>app/**/tests/**</code>, etc.</td><td>Jest + Testing Library; <code>no-unsafe-*</code> off; <code>no-unsafe-declaration-merging</code>, <code>no-unsafe-enum-comparison</code>, <code>await-thenable</code>, <code>prefer-promise-reject-errors</code>, <code>prefer-const</code>, etc. off in tests</td></tr><tr><td><code>**/*.checksum*.js</code>, <code>**/*.endpoint.js</code>, versioned <code>tests/**/latest</code> and <code>tests/**/X.Y</code> assets</td><td><code>no-unused-vars</code>, <code>no-console</code>, <code>max-lines</code>, <code>max-statements</code>, <code>complexity</code> off (fixture JS only)</td></tr><tr><td><code>**/lint-config/**</code></td><td><code>max-lines</code> off; some <code>import-x</code> rules off</td></tr></tbody></table>
|
|
83
83
|
<hr>
|
|
84
|
-
<h2 class="anchor
|
|
84
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="ignore-patterns">Ignore patterns<a href="#ignore-patterns" class="hash-link" aria-label="Direct link to Ignore patterns" title="Direct link to Ignore patterns" translate="no"></a></h2>
|
|
85
85
|
<p>Legacy <code>.eslintignore</code> entries are merged into the shared flat config <code>ignores</code>, including:</p>
|
|
86
86
|
<p><code>build</code>, <code>node_modules</code>, <code>dist</code>, <code>reports</code>, <code>coverage</code>, <code>demo</code>, <code>docs</code>, <code>temp</code>, <code>.tmp</code>, <code>public</code>, <code>webroot</code>, <code>cdn</code>, <code>.docusaurus</code>, <code>vendor/*.js</code>, <code>.nx</code>, <code>pnpm-lock.yaml</code>, <code>.scannerwork</code>, <code>stats.json</code>, <code>jsconfig.json</code>, <code>allure-report</code>, <code>docs/api</code></p>
|
|
87
87
|
<p>Repo-specific paths should still be added in <strong>your</strong> <code>eslint.config.mjs</code> if needed:</p>
|
|
88
|
-
<div class="language-js
|
|
88
|
+
<div class="language-js codeBlockContainer_xJos theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HrWh"><pre tabindex="0" class="prism-code language-js codeBlock_wqKj thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tOUB"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> eslintFlatConfig </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@elliemae/pui-cli/eslint'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">eslintFlatConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">ignores</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'my-generated-folder/**'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
|
|
89
89
|
<hr>
|
|
90
|
-
<h2 class="anchor
|
|
90
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="typescript-project-resolution">TypeScript project resolution<a href="#typescript-project-resolution" class="hash-link" aria-label="Direct link to TypeScript project resolution" title="Direct link to TypeScript project resolution" translate="no"></a></h2>
|
|
91
91
|
<table><thead><tr><th></th><th>Legacy</th><th>Flat config</th></tr></thead><tbody><tr><td>Option</td><td><code>parserOptions.project: true</code></td><td><code>parserOptions.projectService: true</code></td></tr><tr><td>Root</td><td><code>tsconfigRootDir: process.cwd()</code></td><td>Same (<code>process.cwd()</code> when lint runs)</td></tr></tbody></table>
|
|
92
92
|
<p>Monorepo packages: run lint from each package root (or ensure <code>tsconfig</code> is discoverable). Same guidance as before, but <code>projectService</code> is faster and less brittle than <code>project: true</code>.</p>
|
|
93
93
|
<hr>
|
|
94
|
-
<h2 class="anchor
|
|
94
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="quick-fix-cheat-sheet">Quick fix cheat sheet<a href="#quick-fix-cheat-sheet" class="hash-link" aria-label="Direct link to Quick fix cheat sheet" title="Direct link to Quick fix cheat sheet" translate="no"></a></h2>
|
|
95
95
|
<table><thead><tr><th>Lint message / area</th><th>What to do</th></tr></thead><tbody><tr><td><code>import/...</code> rule id in comment</td><td>Rename to <code>import-x/...</code></td></tr><tr><td><code>consistent-type-imports</code></td><td>Change to <code>import type { X }</code> or inline <code>import { type X }</code></td></tr><tr><td><code>no-floating-promises</code></td><td><code>void fn()</code>, <code>.catch()</code>, or <code>await</code> in async context</td></tr><tr><td><code>no-misused-promises</code></td><td>Usually fixed by shared config (<code>attributes: false</code>); otherwise wrap handler or fix callback type</td></tr><tr><td><code>exhaustive-deps</code> warning</td><td>Fix dependency array or document intentional omission</td></tr><tr><td>Formatting (quotes, indent)</td><td>Run Prettier — not ESLint</td></tr><tr><td><code>prettier/prettier</code> in disable comment</td><td>Harmless; rule is off in ESLint</td></tr><tr><td><code>no-extraneous-dependencies</code> on app or <code>.babelrc.cjs</code></td><td>Rule is <strong>off</strong> (legacy parity; <code>app-react-dependencies</code> meta-package)</td></tr></tbody></table>
|
|
96
96
|
<hr>
|
|
97
|
-
<h2 class="anchor
|
|
97
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="config-entry-points-reference">Config entry points (reference)<a href="#config-entry-points-reference" class="hash-link" aria-label="Direct link to Config entry points (reference)" title="Direct link to Config entry points (reference)" translate="no"></a></h2>
|
|
98
98
|
<table><thead><tr><th>App type</th><th>Legacy export</th><th>Flat export</th></tr></thead><tbody><tr><td>React + TS</td><td><code>eslintConfig</code></td><td><code>eslintFlatConfig</code> / <code>eslintFlatConfigStrict</code></td></tr><tr><td>Non-React TS</td><td><code>eslintBaseConfig</code></td><td><code>eslintFlatBaseConfig</code> / <code>eslintFlatBaseConfigStrict</code></td></tr></tbody></table>
|
|
99
99
|
<p>Legacy <code>.eslintrc.cjs</code> exports remain in the package for one transition release but are <strong>deprecated</strong>.</p>
|
|
100
100
|
<hr>
|
|
101
|
-
<h2 class="anchor
|
|
101
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="post-migration-tune-ups-alpha-flat-config">Post-migration tune-ups (alpha flat config)<a href="#post-migration-tune-ups-alpha-flat-config" class="hash-link" aria-label="Direct link to Post-migration tune-ups (alpha flat config)" title="Direct link to Post-migration tune-ups (alpha flat config)" translate="no"></a></h2>
|
|
102
102
|
<p>The shared flat config includes pragmatic defaults to reduce migration noise while keeping high-value checks.</p>
|
|
103
|
-
<table><thead><tr><th>Change</th><th>Behavior</th></tr></thead><tbody><tr><td><code>@typescript-eslint/no-misused-promises</code></td><td><code>checksVoidReturn.attributes: false</code> — async <code>onClick</code> / JSX handlers allowed</td></tr><tr><td><code>@typescript-eslint/no-unsafe-*</code></td><td><strong>warn</strong> in app code (not error); <strong>off</strong> in test globs (<code>*.{test,spec}.*</code>, <code>lib/**/tests/**</code>, etc.)</td></tr><tr><td><code>import-x/no-extraneous-dependencies</code></td><td><strong>off</strong> (legacy parity; apps use <code>@elliemae/app-react-dependencies</code>)</td></tr><tr><td>JSDoc</td><td>Full <code>jsdoc/recommended</code> <strong>removed</strong>; only legacy <code>require-jsdoc: off</code> + noisy rules explicitly off</td></tr><tr><td>Testing Library</td><td><code>dom</code> rules on test files; <strong>react</strong> rules on <code>*.{test,spec}.{tsx,jsx}</code></td></tr><tr><td>WDIO</td><td>Globals + rules on <code>*.func.spec.js</code>, <code>*.visual.spec.js</code>, <code>*e2e*</code>, and <code>**/e2e/**</code> (page-objects, etc.)</td></tr><tr><td>Storybook</td><td><code>react/jsx-props-no-spreading</code> off (React config); <code>eslint-plugin-storybook@
|
|
104
|
-
<h3 class="anchor
|
|
105
|
-
<p>Only plugins that still call removed <code>context.getFilename()</code> / <code>getScope()</code> APIs are wrapped via <code>@eslint/compat</code> v2 <code>fixupPluginRules</code>
|
|
106
|
-
<table><thead><tr><th>Plugin</th><th>Wrapped?</th><th>Reason</th></tr></thead><tbody><tr><td><code>eslint-plugin-react</code></td><td>Yes</td><td>Uses legacy context APIs (<code>display-name</code>, etc.)</td></tr><tr><td><code>eslint-plugin-redux-saga</code></td><td>Yes</td><td><code>no-yield-in-race</code> uses <code>getScope()</code></td></tr><tr><td><code>eslint-plugin-storybook</code></td><td>
|
|
103
|
+
<table><thead><tr><th>Change</th><th>Behavior</th></tr></thead><tbody><tr><td><code>@typescript-eslint/no-misused-promises</code></td><td><code>checksVoidReturn.attributes: false</code> — async <code>onClick</code> / JSX handlers allowed</td></tr><tr><td><code>@typescript-eslint/no-unsafe-*</code></td><td><strong>warn</strong> in app code (not error); <strong>off</strong> in test globs (<code>*.{test,spec}.*</code>, <code>lib/**/tests/**</code>, etc.)</td></tr><tr><td><code>import-x/no-extraneous-dependencies</code></td><td><strong>off</strong> (legacy parity; apps use <code>@elliemae/app-react-dependencies</code>)</td></tr><tr><td>JSDoc</td><td>Full <code>jsdoc/recommended</code> <strong>removed</strong>; only legacy <code>require-jsdoc: off</code> + noisy rules explicitly off</td></tr><tr><td>Testing Library</td><td><code>dom</code> rules on test files; <strong>react</strong> rules on <code>*.{test,spec}.{tsx,jsx}</code></td></tr><tr><td>WDIO</td><td>Globals + rules on <code>*.func.spec.js</code>, <code>*.visual.spec.js</code>, <code>*e2e*</code>, and <code>**/e2e/**</code> (page-objects, etc.)</td></tr><tr><td>Storybook</td><td><code>react/jsx-props-no-spreading</code> off (React config); <code>eslint-plugin-storybook@10</code> flat preset (no compat shim)</td></tr><tr><td><code>eslint.config.*</code></td><td><code>import-x/no-unresolved</code> off</td></tr><tr><td><code>scripts/**</code>, <code>ci_cd/**</code></td><td><code>no-console</code>, <code>max-lines</code>, <code>complexity</code> off</td></tr><tr><td><code>react-hooks/exhaustive-deps</code></td><td><strong>warn</strong> (not error) until repos are clean</td></tr></tbody></table>
|
|
104
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="eslint-10-plugin-compatibility">ESLint 10 plugin compatibility<a href="#eslint-10-plugin-compatibility" class="hash-link" aria-label="Direct link to ESLint 10 plugin compatibility" title="Direct link to ESLint 10 plugin compatibility" translate="no"></a></h3>
|
|
105
|
+
<p>Only plugins that still call removed <code>context.getFilename()</code> / <code>getScope()</code> APIs are wrapped via <code>@eslint/compat</code> v2 <code>fixupPluginRules</code> in <code>lib/lint-config/eslint/flat/compat.mjs</code>:</p>
|
|
106
|
+
<table><thead><tr><th>Plugin</th><th>Wrapped?</th><th>Reason</th></tr></thead><tbody><tr><td><code>eslint-plugin-react</code></td><td>Yes</td><td>Uses legacy context APIs (<code>display-name</code>, etc.)</td></tr><tr><td><code>eslint-plugin-redux-saga</code></td><td>Yes</td><td><code>no-yield-in-race</code> uses <code>getScope()</code></td></tr><tr><td><code>eslint-plugin-storybook</code></td><td>No</td><td>v10 flat preset is ESLint 10–compatible</td></tr><tr><td><code>eslint-plugin-wdio</code></td><td>No</td><td>Use nested plugin from <code>flat/recommended</code> (see <code>presets.mjs</code>)</td></tr><tr><td><code>typescript-eslint</code>, <code>import-x</code>, <code>jest</code>, <code>react-hooks</code>, <code>jsx-a11y</code>, <code>testing-library</code></td><td>No</td><td>ESLint 10–compatible; no shim overhead</td></tr></tbody></table>
|
|
107
107
|
<p>Use <code>@eslint/compat</code> <strong>v2+</strong> with ESLint 10. v1 <code>fixupPluginRules</code> lacks ESLint 10 context patches.</p>
|
|
108
|
-
<h3 class="anchor
|
|
108
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="config-performance-notes">Config performance notes<a href="#config-performance-notes" class="hash-link" aria-label="Direct link to Config performance notes" title="Direct link to Config performance notes" translate="no"></a></h3>
|
|
109
109
|
<p>The shared flat config is structured for faster lint runs:</p>
|
|
110
110
|
<ul>
|
|
111
111
|
<li class="">Preset rule spreads are computed once in <code>presets.mjs</code> (not per factory call).</li>
|
|
@@ -117,19 +117,19 @@
|
|
|
117
117
|
<li class=""><code>createBaseFlatConfigs()</code> caches the two variants (default + strict).</li>
|
|
118
118
|
</ul>
|
|
119
119
|
<hr>
|
|
120
|
-
<h3 class="anchor
|
|
120
|
+
<h3 class="anchor anchorTargetStickyNavbar_a4V3" id="strict-exports">Strict exports<a href="#strict-exports" class="hash-link" aria-label="Direct link to Strict exports" title="Direct link to Strict exports" translate="no"></a></h3>
|
|
121
121
|
<p>Use when the default config is clean and you want full type-safety enforcement:</p>
|
|
122
122
|
<table><thead><tr><th>App type</th><th>Export</th></tr></thead><tbody><tr><td>React + TS</td><td><code>eslintFlatConfigStrict</code></td></tr><tr><td>Non-React TS</td><td><code>eslintFlatBaseConfigStrict</code></td></tr></tbody></table>
|
|
123
|
-
<div class="language-js
|
|
123
|
+
<div class="language-js codeBlockContainer_xJos theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_HrWh"><pre tabindex="0" class="prism-code language-js codeBlock_wqKj thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tOUB"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> eslintFlatConfigStrict </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@elliemae/pui-cli/eslint'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> eslintFlatConfigStrict</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
|
|
124
124
|
<p>Compared to the default flat config, strict mode:</p>
|
|
125
125
|
<table><thead><tr><th>Rule</th><th>Default</th><th>Strict</th></tr></thead><tbody><tr><td><code>@typescript-eslint/no-unsafe-*</code></td><td>warn in app code</td><td><strong>error</strong></td></tr><tr><td><code>react-hooks/exhaustive-deps</code></td><td>warn</td><td><strong>error</strong> (React config only)</td></tr></tbody></table>
|
|
126
126
|
<p>Tests, Storybook, and other file overrides are unchanged. Strict does <strong>not</strong> enable <code>typescript-eslint/strictTypeChecked</code> (can be added per-repo later).</p>
|
|
127
127
|
<hr>
|
|
128
|
-
<h2 class="anchor
|
|
128
|
+
<h2 class="anchor anchorTargetStickyNavbar_a4V3" id="questions">Questions?<a href="#questions" class="hash-link" aria-label="Direct link to Questions?" title="Direct link to Questions?" translate="no"></a></h2>
|
|
129
129
|
<ul>
|
|
130
130
|
<li class=""><strong>Channel:</strong> ui-platform-chat</li>
|
|
131
131
|
<li class=""><strong>Source of truth in repo:</strong> <code>lib/lint-config/eslint/flat/</code></li>
|
|
132
132
|
<li class=""><strong>Legacy reference:</strong> <code>lib/lint-config/eslint/*.cjs</code> (frozen snapshot of old behavior)</li>
|
|
133
|
-
</ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col
|
|
133
|
+
</ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_wx0h"><a href="https://git.elliemae.io/platform-ui/pui-cli.git/docs/eslint-rules-migration.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_HJtS" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_rV1z"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/cli/api/variables/vitestConfig"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">vitestConfig</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/cli/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">PUI CLI Documentation</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_Vnv3 thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#at-a-glance" class="table-of-contents__link toc-highlight">At a glance</a></li><li><a href="#how-to-upgrade-a-repo" class="table-of-contents__link toc-highlight">How to upgrade a repo</a></li><li><a href="#presets-what-was-removed-vs-added" class="table-of-contents__link toc-highlight">Presets: what was removed vs added</a><ul><li><a href="#removed-no-longer-extended" class="table-of-contents__link toc-highlight">Removed (no longer extended)</a></li><li><a href="#still-included-equivalent-or-better" class="table-of-contents__link toc-highlight">Still included (equivalent or better)</a></li><li><a href="#optional-not-enabled-by-default" class="table-of-contents__link toc-highlight">Optional (not enabled by default)</a></li></ul></li><li><a href="#pui-custom-rules--unchanged" class="table-of-contents__link toc-highlight">PUI custom rules — unchanged</a><ul><li><a href="#typescript-explicit-same-as-before" class="table-of-contents__link toc-highlight">TypeScript (explicit, same as before)</a></li><li><a href="#react-explicit-same-as-before" class="table-of-contents__link toc-highlight">React (explicit, same as before)</a></li><li><a href="#e2e-specs-unchanged" class="table-of-contents__link toc-highlight">E2E specs (unchanged)</a></li></ul></li><li><a href="#import-rules-import--import-x" class="table-of-contents__link toc-highlight">Import rules: <code>import/*</code> → <code>import-x/*</code></a><ul><li><a href="#still-off-same-as-legacy-pui-config" class="table-of-contents__link toc-highlight">Still off (same as legacy PUI config)</a></li><li><a href="#still-on" class="table-of-contents__link toc-highlight">Still on</a></li></ul></li><li><a href="#formatting-removed-from-eslint" class="table-of-contents__link toc-highlight">Formatting: removed from ESLint</a></li><li><a href="#new-rules-you-may-see-after-upgrade" class="table-of-contents__link toc-highlight">New rules you may see after upgrade</a><ul><li><a href="#typescript--newly-explicit-in-pui-config" class="table-of-contents__link toc-highlight">TypeScript — newly explicit in PUI config</a></li><li><a href="#typescript--from-recommendedtypechecked-v8-bundle" class="table-of-contents__link toc-highlight">TypeScript — from <code>recommendedTypeChecked</code> (v8 bundle)</a></li><li><a href="#react--new-in-pui-cli-shared-config" class="table-of-contents__link toc-highlight">React — new in pui-cli shared config</a></li><li><a href="#unused-variables" class="table-of-contents__link toc-highlight">Unused variables</a></li></ul></li><li><a href="#airbnb-removal--practical-impact" class="table-of-contents__link toc-highlight">Airbnb removal — practical impact</a></li><li><a href="#file-type-overrides-flat-config-only" class="table-of-contents__link toc-highlight">File-type overrides (flat config only)</a></li><li><a href="#ignore-patterns" class="table-of-contents__link toc-highlight">Ignore patterns</a></li><li><a href="#typescript-project-resolution" class="table-of-contents__link toc-highlight">TypeScript project resolution</a></li><li><a href="#quick-fix-cheat-sheet" class="table-of-contents__link toc-highlight">Quick fix cheat sheet</a></li><li><a href="#config-entry-points-reference" class="table-of-contents__link toc-highlight">Config entry points (reference)</a></li><li><a href="#post-migration-tune-ups-alpha-flat-config" class="table-of-contents__link toc-highlight">Post-migration tune-ups (alpha flat config)</a><ul><li><a href="#eslint-10-plugin-compatibility" class="table-of-contents__link toc-highlight">ESLint 10 plugin compatibility</a></li><li><a href="#config-performance-notes" class="table-of-contents__link toc-highlight">Config performance notes</a></li><li><a href="#strict-exports" class="table-of-contents__link toc-highlight">Strict exports</a></li></ul></li><li><a href="#questions" class="table-of-contents__link toc-highlight">Questions?</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/cli/">Getting Started</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://icemortgagetechnology.slack.com/archives/C01M49EGP6Z" target="_blank" rel="noopener noreferrer" class="footer__link-item">Slack<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_gBgG"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://git.elliemae.io/platform-ui/pui-cli.git" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_gBgG"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 ICE.</div></div></div></footer></div>
|
|
134
134
|
</body>
|
|
135
135
|
</html>
|