@elliemae/pui-cli 9.0.0-alpha.12 → 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.
Files changed (151) hide show
  1. package/README.md +4 -3
  2. package/build/docs/404.html +4 -4
  3. package/build/docs/api/functions/loadRoutes/index.html +9 -9
  4. package/build/docs/api/index.html +8 -8
  5. package/build/docs/api/type-aliases/LIB_NAME/index.html +5 -5
  6. package/build/docs/api/variables/babelConfig/index.html +5 -28
  7. package/build/docs/api/variables/commitlintConfig/index.html +5 -8
  8. package/build/docs/api/variables/eslintFlatBaseConfig/index.html +6 -6
  9. package/build/docs/api/variables/eslintFlatBaseConfigStrict/index.html +6 -6
  10. package/build/docs/api/variables/eslintFlatConfig/index.html +6 -6
  11. package/build/docs/api/variables/eslintFlatConfigStrict/index.html +6 -6
  12. package/build/docs/api/variables/jestConfig/index.html +86 -86
  13. package/build/docs/api/variables/jestNodeConfig/index.html +86 -86
  14. package/build/docs/api/variables/lintStagedConfig/index.html +22 -12
  15. package/build/docs/api/variables/prettierConfig/index.html +5 -18
  16. package/build/docs/api/variables/stylelintConfig/index.html +5 -5
  17. package/build/docs/api/variables/vitestConfig/index.html +5 -5
  18. package/build/docs/assets/css/{styles.74603f39.css → styles.3cba4e67.css} +1 -1
  19. package/build/docs/assets/js/04ee7372.c6c3d513.js +1 -0
  20. package/build/docs/assets/js/0551d4dd.a6b1d9fa.js +1 -0
  21. package/build/docs/assets/js/0a1d0315.43980061.js +1 -0
  22. package/build/docs/assets/js/13097d8d.4ac8ef79.js +1 -0
  23. package/build/docs/assets/js/{16b7bc88.c3779e27.js → 16b7bc88.2ac57556.js} +1 -1
  24. package/build/docs/assets/js/{17896441.84339068.js → 17896441.705d85a0.js} +1 -1
  25. package/build/docs/assets/js/{1b9df811.aaa95da1.js → 1b9df811.ec75cfdc.js} +1 -1
  26. package/build/docs/assets/js/{232a0286.33b2782b.js → 232a0286.6f749ae5.js} +1 -1
  27. package/build/docs/assets/js/{2399.cc5803e0.js → 2399.5d123cba.js} +1 -1
  28. package/build/docs/assets/js/{37d86055.47211796.js → 37d86055.1e73f036.js} +1 -1
  29. package/build/docs/assets/js/3992.b9b54f94.js +2 -0
  30. package/build/docs/assets/js/{4fb6949f.69e375e4.js → 4fb6949f.13bde4a8.js} +1 -1
  31. package/build/docs/assets/js/5befad71.96f04f67.js +1 -0
  32. package/build/docs/assets/js/5d5f1db0.e7607cd2.js +1 -0
  33. package/build/docs/assets/js/5e8c322a.0b86bf5a.js +1 -0
  34. package/build/docs/assets/js/5e95c892.de377e27.js +1 -0
  35. package/build/docs/assets/js/{5fb3c522.da5628e8.js → 5fb3c522.3ec831ee.js} +1 -1
  36. package/build/docs/assets/js/6bd11e52.c61bfcd5.js +1 -0
  37. package/build/docs/assets/js/6e96545e.1b545333.js +1 -0
  38. package/build/docs/assets/js/{71f6d02b.cfd98385.js → 71f6d02b.4b381360.js} +1 -1
  39. package/build/docs/assets/js/{6704.2615a5c6.js → 7843.f4b19776.js} +1 -1
  40. package/build/docs/assets/js/80e87108.8c451f49.js +1 -0
  41. package/build/docs/assets/js/{8585.3cb09ff7.js → 8585.e2298db3.js} +1 -1
  42. package/build/docs/assets/js/{a7bd4aaa.30ffad02.js → a7bd4aaa.aceac89c.js} +1 -1
  43. package/build/docs/assets/js/a94703ab.248144c2.js +1 -0
  44. package/build/docs/assets/js/b7b585d8.7d50f3f6.js +1 -0
  45. package/build/docs/assets/js/{bde5209a.f5bca8b2.js → bde5209a.480cc8d8.js} +1 -1
  46. package/build/docs/assets/js/c377a04b.c6b6b394.js +1 -0
  47. package/build/docs/assets/js/{dfd75424.51c4e2cb.js → dfd75424.459da76b.js} +1 -1
  48. package/build/docs/assets/js/f736c962.ab424879.js +1 -0
  49. package/build/docs/assets/js/main.3ae939d4.js +2 -0
  50. package/build/docs/assets/js/runtime~main.9ecf1839.js +1 -0
  51. package/build/docs/eslint-rules-migration/index.html +39 -39
  52. package/build/docs/index.html +70 -71
  53. package/build/docs/pui-cli-9-migration/index.html +163 -99
  54. package/build/docs/sitemap.xml +1 -1
  55. package/build/docs/ssl-certificate-setup/index.html +23 -23
  56. package/build/docs/stylelint-migration/index.html +19 -21
  57. package/build/docs/usage-guide/index.html +90 -90
  58. package/dist/cjs/babel.config.js +124 -0
  59. package/dist/cjs/index.js +5 -9
  60. package/dist/cjs/lint-config/commitlint/export.mjs +1 -0
  61. package/dist/cjs/lint-config/commitlint.config.mjs +6 -0
  62. package/dist/cjs/lint-config/eslint/common.cjs +8 -1
  63. package/dist/cjs/lint-config/eslint/flat/rules.mjs +1 -0
  64. package/dist/cjs/lint-config/lint-staged.config.js +17 -5
  65. package/dist/cjs/lint-config/prettier/export.mjs +1 -0
  66. package/dist/cjs/lint-config/{prettier.config.cjs → prettier.config.mjs} +4 -1
  67. package/dist/cjs/skills/migrate-storybook-out-of-cjs/SKILL.md +89 -35
  68. package/dist/cjs/skills/migrate-to-pui-cli-9/SKILL.md +126 -38
  69. package/dist/cjs/testing/{jest.config.cjs → jest.config.mjs} +9 -5
  70. package/dist/{esm/testing/jest.node.config.cjs → cjs/testing/jest.node.config.mjs} +3 -2
  71. package/dist/esm/babel.config.js +94 -0
  72. package/dist/esm/index.js +5 -9
  73. package/dist/esm/lint-config/commitlint/export.mjs +1 -0
  74. package/dist/esm/lint-config/commitlint.config.mjs +6 -0
  75. package/dist/esm/lint-config/eslint/common.cjs +8 -1
  76. package/dist/esm/lint-config/eslint/flat/rules.mjs +1 -0
  77. package/dist/esm/lint-config/lint-staged.config.js +17 -5
  78. package/dist/esm/lint-config/prettier/export.mjs +1 -0
  79. package/{lib/lint-config/prettier.config.cjs → dist/esm/lint-config/prettier.config.mjs} +4 -1
  80. package/dist/esm/skills/migrate-storybook-out-of-cjs/SKILL.md +89 -35
  81. package/dist/esm/skills/migrate-to-pui-cli-9/SKILL.md +126 -38
  82. package/dist/esm/testing/{jest.config.cjs → jest.config.mjs} +9 -5
  83. package/dist/{cjs/testing/jest.node.config.cjs → esm/testing/jest.node.config.mjs} +3 -2
  84. package/dist/types/lib/babel.config.d.ts +3 -0
  85. package/dist/types/lib/index.d.ts +5 -9
  86. package/dist/types/lib/lint-config/commitlint/export.d.mts +1 -0
  87. package/dist/types/lib/lint-config/commitlint.config.d.mts +3 -0
  88. package/dist/types/lib/lint-config/eslint/common.d.cts +8 -2
  89. package/dist/types/lib/lint-config/eslint/non-react.d.cts +8 -1
  90. package/dist/types/lib/lint-config/eslint/react.d.cts +8 -1
  91. package/dist/types/lib/lint-config/eslint/typescript/non-react.d.cts +8 -1
  92. package/dist/types/lib/lint-config/eslint/typescript/react.d.cts +8 -1
  93. package/dist/types/lib/lint-config/lint-staged.config.d.ts +2 -2
  94. package/dist/types/lib/lint-config/prettier/export.d.mts +1 -0
  95. package/dist/types/lib/lint-config/prettier.config.d.mts +3 -0
  96. package/dist/types/lib/utils.d.cts +1 -1
  97. package/dist/types/lib/utils.d.ts +1 -1
  98. package/dist/types/tsconfig.tsbuildinfo +1 -1
  99. package/lib/lint-config/commitlint/export.mjs +1 -0
  100. package/lib/lint-config/commitlint.config.mjs +6 -0
  101. package/lib/lint-config/eslint/common.cjs +8 -1
  102. package/lib/lint-config/eslint/flat/rules.mjs +1 -0
  103. package/lib/lint-config/lint-staged.config.js +20 -5
  104. package/lib/lint-config/prettier/export.mjs +1 -0
  105. package/{dist/esm/lint-config/prettier.config.cjs → lib/lint-config/prettier.config.mjs} +4 -1
  106. package/lib/skills/migrate-storybook-out-of-cjs/SKILL.md +89 -35
  107. package/lib/skills/migrate-to-pui-cli-9/SKILL.md +126 -38
  108. package/lib/testing/jest.config.mjs +124 -0
  109. package/lib/testing/jest.node.config.mjs +9 -0
  110. package/package.json +38 -22
  111. package/build/docs/api/variables/eslintBaseConfig/index.html +0 -132
  112. package/build/docs/api/variables/eslintConfig/index.html +0 -180
  113. package/build/docs/assets/js/04ee7372.2852111b.js +0 -1
  114. package/build/docs/assets/js/0551d4dd.ebb18f4f.js +0 -1
  115. package/build/docs/assets/js/0a1d0315.fc8f91a7.js +0 -1
  116. package/build/docs/assets/js/13097d8d.7877421c.js +0 -1
  117. package/build/docs/assets/js/3992.0ac29b2f.js +0 -2
  118. package/build/docs/assets/js/5befad71.5f19afb5.js +0 -1
  119. package/build/docs/assets/js/5d5f1db0.c5aa5afa.js +0 -1
  120. package/build/docs/assets/js/5e8c322a.ef3b894b.js +0 -1
  121. package/build/docs/assets/js/5e95c892.f550b901.js +0 -1
  122. package/build/docs/assets/js/6bd11e52.08b95209.js +0 -1
  123. package/build/docs/assets/js/6e96545e.30c1b801.js +0 -1
  124. package/build/docs/assets/js/80e87108.f9507b95.js +0 -1
  125. package/build/docs/assets/js/a94703ab.f1796514.js +0 -1
  126. package/build/docs/assets/js/b7b585d8.6d53e73f.js +0 -1
  127. package/build/docs/assets/js/b8ac1d98.62684003.js +0 -1
  128. package/build/docs/assets/js/c377a04b.0f8625c6.js +0 -1
  129. package/build/docs/assets/js/e5f79924.c793a74d.js +0 -1
  130. package/build/docs/assets/js/f736c962.dbd0d004.js +0 -1
  131. package/build/docs/assets/js/main.d5acb4ca.js +0 -2
  132. package/build/docs/assets/js/runtime~main.4f7cd700.js +0 -1
  133. package/dist/cjs/babel.config.cjs +0 -97
  134. package/dist/cjs/index.cjs +0 -35
  135. package/dist/cjs/lint-config/commitlint.config.cjs +0 -1
  136. package/dist/cjs/lint-config/stylelint.config.cjs +0 -3
  137. package/dist/esm/babel.config.cjs +0 -97
  138. package/dist/esm/index.cjs +0 -35
  139. package/dist/esm/lint-config/commitlint.config.cjs +0 -1
  140. package/dist/esm/lint-config/stylelint.config.cjs +0 -3
  141. package/dist/types/lib/babel.config.d.cts +0 -59
  142. package/dist/types/lib/index.d.cts +0 -13
  143. package/dist/types/lib/lint-config/commitlint.config.d.cts +0 -4
  144. package/dist/types/lib/lint-config/prettier.config.d.cts +0 -8
  145. package/dist/types/lib/lint-config/stylelint.config.d.cts +0 -2
  146. package/lib/lint-config/commitlint.config.cjs +0 -1
  147. package/lib/lint-config/stylelint.config.cjs +0 -3
  148. /package/build/docs/assets/js/{3992.0ac29b2f.js.LICENSE.txt → 3992.b9b54f94.js.LICENSE.txt} +0 -0
  149. /package/build/docs/assets/js/{main.d5acb4ca.js.LICENSE.txt → main.3ae939d4.js.LICENSE.txt} +0 -0
  150. /package/dist/types/lib/testing/{jest.config.d.cts → jest.config.d.mts} +0 -0
  151. /package/dist/types/lib/testing/{jest.node.config.d.cts → jest.node.config.d.mts} +0 -0
@@ -1 +1 @@
1
- "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[1019],{176(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>x,frontMatter:()=>c,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"eslint-rules-migration","title":"ESLint rules migration guide (legacy \u2192 ESLint 10 flat config)","description":"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).","source":"@site/docs/eslint-rules-migration.md","sourceDirName":".","slug":"/eslint-rules-migration","permalink":"/cli/eslint-rules-migration","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/eslint-rules-migration.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"vitestConfig","permalink":"/cli/api/variables/vitestConfig"},"next":{"title":"PUI CLI Documentation","permalink":"/cli/"}}');var i=n(6070),d=n(6607);const c={},t="ESLint rules migration guide (legacy \u2192 ESLint 10 flat config)",l={},o=[{value:"At a glance",id:"at-a-glance",level:2},{value:"How to upgrade a repo",id:"how-to-upgrade-a-repo",level:2},{value:"Presets: what was removed vs added",id:"presets-what-was-removed-vs-added",level:2},{value:"Removed (no longer extended)",id:"removed-no-longer-extended",level:3},{value:"Still included (equivalent or better)",id:"still-included-equivalent-or-better",level:3},{value:"Optional (not enabled by default)",id:"optional-not-enabled-by-default",level:3},{value:"PUI custom rules \u2014 unchanged",id:"pui-custom-rules--unchanged",level:2},{value:"TypeScript (explicit, same as before)",id:"typescript-explicit-same-as-before",level:3},{value:"React (explicit, same as before)",id:"react-explicit-same-as-before",level:3},{value:"E2E specs (unchanged)",id:"e2e-specs-unchanged",level:3},{value:"Import rules: <code>import/*</code> \u2192 <code>import-x/*</code>",id:"import-rules-import--import-x",level:2},{value:"Still off (same as legacy PUI config)",id:"still-off-same-as-legacy-pui-config",level:3},{value:"Still on",id:"still-on",level:3},{value:"Formatting: removed from ESLint",id:"formatting-removed-from-eslint",level:2},{value:"New rules you may see after upgrade",id:"new-rules-you-may-see-after-upgrade",level:2},{value:"TypeScript \u2014 newly explicit in PUI config",id:"typescript--newly-explicit-in-pui-config",level:3},{value:"TypeScript \u2014 from <code>recommendedTypeChecked</code> (v8 bundle)",id:"typescript--from-recommendedtypechecked-v8-bundle",level:3},{value:"React \u2014 new in pui-cli shared config",id:"react--new-in-pui-cli-shared-config",level:3},{value:"Unused variables",id:"unused-variables",level:3},{value:"Airbnb removal \u2014 practical impact",id:"airbnb-removal--practical-impact",level:2},{value:"File-type overrides (flat config only)",id:"file-type-overrides-flat-config-only",level:2},{value:"Ignore patterns",id:"ignore-patterns",level:2},{value:"TypeScript project resolution",id:"typescript-project-resolution",level:2},{value:"Quick fix cheat sheet",id:"quick-fix-cheat-sheet",level:2},{value:"Config entry points (reference)",id:"config-entry-points-reference",level:2},{value:"Post-migration tune-ups (alpha flat config)",id:"post-migration-tune-ups-alpha-flat-config",level:2},{value:"ESLint 10 plugin compatibility",id:"eslint-10-plugin-compatibility",level:3},{value:"Config performance notes",id:"config-performance-notes",level:3},{value:"Strict exports",id:"strict-exports",level:3},{value:"Questions?",id:"questions",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"eslint-rules-migration-guide-legacy--eslint-10-flat-config",children:"ESLint rules migration guide (legacy \u2192 ESLint 10 flat config)"})}),"\n",(0,i.jsxs)(s.p,{children:["This document compares the ",(0,i.jsx)(s.strong,{children:"previous"})," ",(0,i.jsx)(s.code,{children:"@elliemae/pui-cli"})," ESLint setup (ESLint 8 + ",(0,i.jsx)(s.code,{children:".eslintrc.cjs"})," + Airbnb) with the ",(0,i.jsx)(s.strong,{children:"current"})," setup (ESLint 10 + ",(0,i.jsx)(s.code,{children:"eslint.config.mjs"})," + ",(0,i.jsx)(s.code,{children:"typescript-eslint"})," v8 flat config)."]}),"\n",(0,i.jsxs)(s.p,{children:["For the full pui-cli 9 upgrade path (Node 24, pnpm 11, CI, Cursor skills), see ",(0,i.jsx)(s.a,{href:"/cli/pui-cli-9-migration",children:"pui-cli 9 migration guide"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Use it when upgrading apps/libraries and explaining new lint failures to your team."}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"at-a-glance",children:"At a glance"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Topic"}),(0,i.jsx)(s.th,{children:"Before (legacy)"}),(0,i.jsx)(s.th,{children:"After (flat config)"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Config format"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:".eslintrc.cjs"})," + ",(0,i.jsx)(s.code,{children:".eslintignore"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint.config.mjs"})," (ignores built-in)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"ESLint"}),(0,i.jsx)(s.td,{children:"8.x"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"10.x"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"TypeScript lint"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@typescript-eslint"})," v5, ",(0,i.jsx)(s.code,{children:"project: true"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"typescript-eslint"})," v8, ",(0,i.jsx)(s.code,{children:"projectService: true"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"JS parser"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@babel/eslint-parser"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@eslint/js"})," recommended (no Babel parser for lint)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Style presets"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"Airbnb"})," + ",(0,i.jsx)(s.strong,{children:"airbnb-typescript"})]}),(0,i.jsx)(s.td,{children:"Removed \u2014 rules re-expressed explicitly"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Import plugin"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-import"})," (",(0,i.jsx)(s.code,{children:"import/*"}),")"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-import-x"})," (",(0,i.jsx)(s.code,{children:"import-x/*"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Prettier in ESLint"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"prettier/prettier"})," ",(0,i.jsx)(s.strong,{children:"error"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"Not enforced in ESLint"})," \u2014 use Prettier in ",(0,i.jsx)(s.code,{children:"lint-staged"})," / CI"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Indent in ESLint"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"indent"})," ",(0,i.jsx)(s.strong,{children:"error"})]}),(0,i.jsx)(s.td,{children:"Removed \u2014 Prettier owns formatting"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Type-aware TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"recommended-requiring-type-checking"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"recommendedTypeChecked"})," (v8 equivalent)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Consumer import"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"require('@elliemae/pui-cli').eslintConfig"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import { eslintFlatConfig } from '@elliemae/pui-cli/eslint'"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Strict import"}),(0,i.jsx)(s.td,{children:"\u2014"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslintFlatConfigStrict"})," / ",(0,i.jsx)(s.code,{children:"eslintFlatBaseConfigStrict"})]})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"how-to-upgrade-a-repo",children:"How to upgrade a repo"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-js",children:"// eslint.config.mjs \u2014 React apps / libraries\nimport { eslintFlatConfig } from '@elliemae/pui-cli/eslint';\n\nexport default eslintFlatConfig;\n"})}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-js",children:"// eslint.config.mjs \u2014 Node / TS services (non-React)\nimport { eslintFlatBaseConfig } from '@elliemae/pui-cli/eslint';\n\nexport default eslintFlatBaseConfig;\n"})}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Upgrade ",(0,i.jsx)(s.code,{children:"@elliemae/pui-cli"})," to the alpha release that ships flat config."]}),"\n",(0,i.jsxs)(s.li,{children:["Add ",(0,i.jsx)(s.code,{children:"eslint.config.mjs"})," as above."]}),"\n",(0,i.jsxs)(s.li,{children:["Delete ",(0,i.jsx)(s.code,{children:".eslintrc.cjs"})," and ",(0,i.jsx)(s.code,{children:".eslintignore"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Run ",(0,i.jsx)(s.code,{children:"pui-cli lint"})," and ",(0,i.jsx)(s.code,{children:"pui-cli lint --fix"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"presets-what-was-removed-vs-added",children:"Presets: what was removed vs added"}),"\n",(0,i.jsx)(s.h3,{id:"removed-no-longer-extended",children:"Removed (no longer extended)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Legacy extend"}),(0,i.jsx)(s.th,{children:"Impact"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"airbnb"})," / ",(0,i.jsx)(s.code,{children:"airbnb/hooks"})]}),(0,i.jsxs)(s.td,{children:["React style rules from Airbnb (e.g. ",(0,i.jsx)(s.code,{children:"react/jsx-props-no-spreading"}),", ",(0,i.jsx)(s.code,{children:"react/no-array-index-key"}),", stricter JSX patterns) are ",(0,i.jsx)(s.strong,{children:"gone"})," unless we set them explicitly in PUI config."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"airbnb-base"})}),(0,i.jsx)(s.td,{children:"Same for non-React JS."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"airbnb-typescript"})," / ",(0,i.jsx)(s.code,{children:"airbnb-typescript/base"})]}),(0,i.jsx)(s.td,{children:"Airbnb + TypeScript combo rules removed."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:prettier/recommended"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"prettier/prettier"})," is no longer an ESLint error."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:import/recommended"})}),(0,i.jsxs)(s.td,{children:["Replaced by ",(0,i.jsx)(s.code,{children:"eslint-plugin-import-x"})," flat recommended."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:mdx/recommended"})}),(0,i.jsx)(s.td,{children:"MDX-specific ESLint block removed from shared React config (Storybook flat config remains)."})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"still-included-equivalent-or-better",children:"Still included (equivalent or better)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Area"}),(0,i.jsx)(s.th,{children:"Legacy"}),(0,i.jsx)(s.th,{children:"Flat config"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Core JS"}),(0,i.jsx)(s.td,{children:"ESLint recommended (via Airbnb + plugins)"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@eslint/js"})," ",(0,i.jsx)(s.strong,{children:"recommended"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"TypeScript"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@typescript-eslint/recommended"})," + ",(0,i.jsx)(s.strong,{children:"recommended-requiring-type-checking"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"typescript-eslint"})," ",(0,i.jsx)(s.strong,{children:"recommendedTypeChecked"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"React"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"plugin:react/recommended"})," (via Airbnb)"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-react"})," ",(0,i.jsx)(s.strong,{children:"recommended"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Hooks"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"react-hooks/rules-of-hooks"})," (explicit); ",(0,i.jsx)(s.strong,{children:"no"})," ",(0,i.jsx)(s.code,{children:"exhaustive-deps"})," in old pui-cli"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"rules-of-hooks"})," ",(0,i.jsx)(s.strong,{children:"error"})," + ",(0,i.jsxs)(s.strong,{children:[(0,i.jsx)(s.code,{children:"exhaustive-deps"})," warn"]})," (new)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"a11y"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:jsx-a11y/recommended"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-jsx-a11y"})," flat ",(0,i.jsx)(s.strong,{children:"recommended"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Jest"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:jest/recommended"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-jest"})," ",(0,i.jsx)(s.strong,{children:"recommended"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Testing Library"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:testing-library/dom"})}),(0,i.jsxs)(s.td,{children:["Same (",(0,i.jsx)(s.strong,{children:"dom"})," rules only)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"WDIO"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:wdio/recommended"})}),(0,i.jsx)(s.td,{children:"Same"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Redux Saga"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:redux-saga/recommended"})}),(0,i.jsx)(s.td,{children:"Same"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Storybook"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:storybook/recommended"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-storybook"})," flat ",(0,i.jsx)(s.strong,{children:"recommended"})," (v10, Storybook 10\u2013compatible)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Prettier conflict"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-config-prettier"})," via ",(0,i.jsx)(s.code,{children:"plugin:prettier/recommended"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-config-prettier"})," only (disables conflicting ESLint style rules)"]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"optional-not-enabled-by-default",children:"Optional (not enabled by default)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Preset"}),(0,i.jsx)(s.th,{children:"Status"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"typescript-eslint/strictTypeChecked"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"Not"})," enabled \u2014 optional stricter tier for a later rollout"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"typescript-eslint/stylistic*"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"Not"})," enabled \u2014 Prettier is the source of truth for formatting"]})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"pui-custom-rules--unchanged",children:"PUI custom rules \u2014 unchanged"}),"\n",(0,i.jsxs)(s.p,{children:["These explicit PUI rules are ",(0,i.jsx)(s.strong,{children:"the same"})," in spirit (same limits and overrides):"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsxs)(s.th,{children:["JS (",(0,i.jsx)(s.code,{children:".js"}),")"]}),(0,i.jsxs)(s.th,{children:["TS (",(0,i.jsx)(s.code,{children:".ts"}),"/",(0,i.jsx)(s.code,{children:".tsx"}),")"]})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"complexity"})}),(0,i.jsx)(s.td,{children:"max 10"}),(0,i.jsx)(s.td,{children:"max 10"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-depth"})}),(0,i.jsx)(s.td,{children:"max 4"}),(0,i.jsx)(s.td,{children:"max 4"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-nested-callbacks"})}),(0,i.jsx)(s.td,{children:"max 3"}),(0,i.jsx)(s.td,{children:"max 3"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-params"})}),(0,i.jsx)(s.td,{children:"max 3"}),(0,i.jsx)(s.td,{children:"max 3"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-statements"})}),(0,i.jsx)(s.td,{children:"max 20"}),(0,i.jsx)(s.td,{children:"max 20"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-lines"})}),(0,i.jsx)(s.td,{children:"120"}),(0,i.jsx)(s.td,{children:"200"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"no-console"})}),(0,i.jsx)(s.td,{children:"warn"}),(0,i.jsx)(s.td,{children:"warn"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"no-param-reassign"})}),(0,i.jsx)(s.td,{children:"props: false"}),(0,i.jsx)(s.td,{children:"props: false"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"arrow-body-style"})}),(0,i.jsx)(s.td,{children:"as-needed"}),(0,i.jsx)(s.td,{children:"as-needed"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"prefer-template"})}),(0,i.jsx)(s.td,{children:"error"}),(0,i.jsx)(s.td,{children:"error"})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"typescript-explicit-same-as-before",children:"TypeScript (explicit, same as before)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Setting"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-floating-promises"})}),(0,i.jsxs)(s.td,{children:["error, ",(0,i.jsx)(s.code,{children:"ignoreIIFE: true"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/unbound-method"})}),(0,i.jsxs)(s.td,{children:["error, ",(0,i.jsx)(s.code,{children:"ignoreStatic: true"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-use-before-define"})}),(0,i.jsx)(s.td,{children:"functions: false, classes/variables/typedefs: true"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/explicit-module-boundary-types"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/explicit-function-return-type"})}),(0,i.jsx)(s.td,{children:"off"})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"react-explicit-same-as-before",children:"React (explicit, same as before)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Setting"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react/function-component-definition"})}),(0,i.jsx)(s.td,{children:"named components: arrow-function"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react/react-in-jsx-scope"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react/prop-types"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"jsx-a11y/heading-has-content"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"jsx-a11y/label-has-associated-control"})}),(0,i.jsxs)(s.td,{children:["on, ",(0,i.jsx)(s.code,{children:"controlComponents: ['Input']"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"redux-saga/no-yield-in-race"})}),(0,i.jsx)(s.td,{children:"error"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"redux-saga/yield-effects"})}),(0,i.jsx)(s.td,{children:"error"})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"e2e-specs-unchanged",children:"E2E specs (unchanged)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Files"}),(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Setting"})]})}),(0,i.jsx)(s.tbody,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"*.func.spec.js"}),", ",(0,i.jsx)(s.code,{children:"*.visual.spec.js"})]}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"jest/valid-expect"})}),(0,i.jsx)(s.td,{children:"off"})]})})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsxs)(s.h2,{id:"import-rules-import--import-x",children:["Import rules: ",(0,i.jsx)(s.code,{children:"import/*"})," \u2192 ",(0,i.jsx)(s.code,{children:"import-x/*"})]}),"\n",(0,i.jsxs)(s.p,{children:["Update ",(0,i.jsx)(s.strong,{children:"eslint-disable"})," comments when you touch files:"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Legacy rule name"}),(0,i.jsx)(s.th,{children:"New rule name"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import/no-unresolved"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-unresolved"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import/extensions"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/extensions"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import/no-named-as-default"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-named-as-default"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"\u2026"}),(0,i.jsxs)(s.td,{children:["Prefix ",(0,i.jsx)(s.code,{children:"import/"})," \u2192 ",(0,i.jsx)(s.code,{children:"import-x/"})]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"still-off-same-as-legacy-pui-config",children:"Still off (same as legacy PUI config)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Status"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/imports-first"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/newline-after-import"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-dynamic-require"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-extraneous-dependencies"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-named-as-default"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-webpack-loader-syntax"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/prefer-default-export"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/default"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/namespace"})}),(0,i.jsx)(s.td,{children:"off"})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"still-on",children:"Still on"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Setting"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-unresolved"})}),(0,i.jsx)(s.td,{children:"error, strict casing"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/extensions"})}),(0,i.jsx)(s.td,{children:"never (json/js ignorePackages)"})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"formatting-removed-from-eslint",children:"Formatting: removed from ESLint"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Legacy"}),(0,i.jsx)(s.th,{children:"Flat config"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"prettier/prettier"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"error"})," (via ",(0,i.jsx)(s.code,{children:"plugin:prettier/recommended"}),")"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"off"})," \u2014 run Prettier separately"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"indent"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"error"})," (2 spaces, SwitchCase: 1)"]}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"removed"})})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Action:"})," Rely on ",(0,i.jsx)(s.code,{children:"prettier --write"})," / ",(0,i.jsx)(s.code,{children:"lint-staged"})," for formatting. Do not expect ESLint to fail on quote/semicolon/indent issues."]}),"\n",(0,i.jsxs)(s.p,{children:["Legacy ",(0,i.jsx)(s.code,{children:"eslint-disable prettier/prettier"})," comments still work (no-op rule registered as off)."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"new-rules-you-may-see-after-upgrade",children:"New rules you may see after upgrade"}),"\n",(0,i.jsxs)(s.p,{children:["These are the main ",(0,i.jsx)(s.strong,{children:"new or stricter"})," checks teams notice beyond \u201csame PUI rules as before.\u201d"]}),"\n",(0,i.jsx)(s.h3,{id:"typescript--newly-explicit-in-pui-config",children:"TypeScript \u2014 newly explicit in PUI config"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Severity"}),(0,i.jsx)(s.th,{children:"What it catches"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/consistent-type-imports"})}),(0,i.jsx)(s.td,{children:"error"}),(0,i.jsxs)(s.td,{children:["Use ",(0,i.jsx)(s.code,{children:"import type { Foo }"})," for type-only imports"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-import-type-side-effects"})}),(0,i.jsx)(s.td,{children:"error"}),(0,i.jsxs)(s.td,{children:["TS 5+ ",(0,i.jsx)(s.code,{children:"import type"})," side-effect hygiene"]})]})]})]}),"\n",(0,i.jsxs)(s.h3,{id:"typescript--from-recommendedtypechecked-v8-bundle",children:["TypeScript \u2014 from ",(0,i.jsx)(s.code,{children:"recommendedTypeChecked"})," (v8 bundle)"]}),"\n",(0,i.jsxs)(s.p,{children:["Already largely covered by legacy ",(0,i.jsx)(s.code,{children:"recommended-requiring-type-checking"}),", but stricter defaults / renames may surface more issues, including:"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Typical issue"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-misused-promises"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"async"})," handler passed where ",(0,i.jsx)(s.code,{children:"void"})," is expected (e.g. some callbacks)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-assignment"})}),(0,i.jsxs)(s.td,{children:["Assigning ",(0,i.jsx)(s.code,{children:"any"})," to a typed variable"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-member-access"})}),(0,i.jsxs)(s.td,{children:["Property access on ",(0,i.jsx)(s.code,{children:"any"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-call"})}),(0,i.jsxs)(s.td,{children:["Calling an ",(0,i.jsx)(s.code,{children:"any"})," value"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-argument"})}),(0,i.jsxs)(s.td,{children:["Passing ",(0,i.jsx)(s.code,{children:"any"})," into a typed parameter"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-return"})}),(0,i.jsxs)(s.td,{children:["Returning ",(0,i.jsx)(s.code,{children:"any"})," from a typed function"]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note:"})," Test files (",(0,i.jsx)(s.code,{children:"**/*.{test,spec}.*"}),") disable the ",(0,i.jsx)(s.code,{children:"no-unsafe-*"})," and ",(0,i.jsx)(s.code,{children:"unbound-method"})," rules in the shared config to reduce noise."]}),"\n",(0,i.jsx)(s.h3,{id:"react--new-in-pui-cli-shared-config",children:"React \u2014 new in pui-cli shared config"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Severity"}),(0,i.jsx)(s.th,{children:"Notes"})]})}),(0,i.jsx)(s.tbody,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react-hooks/exhaustive-deps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"warn"})}),(0,i.jsxs)(s.td,{children:["Missing deps in ",(0,i.jsx)(s.code,{children:"useEffect"})," / ",(0,i.jsx)(s.code,{children:"useCallback"})," / ",(0,i.jsx)(s.code,{children:"useMemo"})," \u2014 was not in legacy pui-cli (only ",(0,i.jsx)(s.code,{children:"rules-of-hooks"}),")"]})]})})]}),"\n",(0,i.jsx)(s.h3,{id:"unused-variables",children:"Unused variables"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Legacy"}),(0,i.jsx)(s.th,{children:"Flat config"})]})}),(0,i.jsx)(s.tbody,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-unused-vars"})," on TS files"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unused-vars"})," with ",(0,i.jsx)(s.code,{children:"ignoreRestSiblings"}),", ",(0,i.jsx)(s.code,{children:"argsIgnorePattern: '^_'"})]})]})})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"airbnb-removal--practical-impact",children:"Airbnb removal \u2014 practical impact"}),"\n",(0,i.jsxs)(s.p,{children:["We no longer extend Airbnb. You should ",(0,i.jsx)(s.strong,{children:"not"})," expect every Airbnb rule to have a 1:1 replacement. Common behavioral changes:"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"You might have relied on (Airbnb)"}),(0,i.jsx)(s.th,{children:"After migration"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Stricter React patterns (e.g. some JSX prop rules)"}),(0,i.jsxs)(s.td,{children:["Only if still in ",(0,i.jsx)(s.code,{children:"eslint-plugin-react"})," recommended or our explicit ",(0,i.jsx)(s.code,{children:"reactRules"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import/prefer-default-export"})}),(0,i.jsxs)(s.td,{children:["Still ",(0,i.jsx)(s.strong,{children:"off"})," in PUI config"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react/jsx-props-no-spreading"})}),(0,i.jsxs)(s.td,{children:["Still ",(0,i.jsx)(s.strong,{children:"off"})," in PUI config"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Many opinionated React/a11y defaults from Airbnb"}),(0,i.jsxs)(s.td,{children:["Replaced by ",(0,i.jsx)(s.strong,{children:"plugin recommended"})," sets + PUI overrides above"]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["If lint gets ",(0,i.jsx)(s.strong,{children:"looser"})," in some areas, that is expected. If it gets ",(0,i.jsx)(s.strong,{children:"stricter"}),", it is usually from ",(0,i.jsx)(s.strong,{children:"type-checked TypeScript"})," or ",(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"consistent-type-imports"})}),", not from Airbnb."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"file-type-overrides-flat-config-only",children:"File-type overrides (flat config only)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Files"}),(0,i.jsx)(s.th,{children:"Rules relaxed"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"**/*.d.ts"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@typescript-eslint/no-explicit-any"}),", ",(0,i.jsx)(s.code,{children:"@typescript-eslint/no-empty-object-type"})," off"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"**/*.{test,spec}.{js,jsx,ts,tsx}"}),", ",(0,i.jsx)(s.code,{children:"**/__tests__/**"}),", ",(0,i.jsx)(s.code,{children:"lib/**/tests/**"}),", ",(0,i.jsx)(s.code,{children:"app/**/tests/**"}),", etc."]}),(0,i.jsxs)(s.td,{children:["Jest + Testing Library; ",(0,i.jsx)(s.code,{children:"no-unsafe-*"})," off; ",(0,i.jsx)(s.code,{children:"no-unsafe-declaration-merging"}),", ",(0,i.jsx)(s.code,{children:"no-unsafe-enum-comparison"}),", ",(0,i.jsx)(s.code,{children:"await-thenable"}),", ",(0,i.jsx)(s.code,{children:"prefer-promise-reject-errors"}),", ",(0,i.jsx)(s.code,{children:"prefer-const"}),", etc. off in tests"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"**/*.checksum*.js"}),", ",(0,i.jsx)(s.code,{children:"**/*.endpoint.js"}),", versioned ",(0,i.jsx)(s.code,{children:"tests/**/latest"})," and ",(0,i.jsx)(s.code,{children:"tests/**/X.Y"})," assets"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-unused-vars"}),", ",(0,i.jsx)(s.code,{children:"no-console"}),", ",(0,i.jsx)(s.code,{children:"max-lines"}),", ",(0,i.jsx)(s.code,{children:"max-statements"}),", ",(0,i.jsx)(s.code,{children:"complexity"})," off (fixture JS only)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"**/lint-config/**"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"max-lines"})," off; some ",(0,i.jsx)(s.code,{children:"import-x"})," rules off"]})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"ignore-patterns",children:"Ignore patterns"}),"\n",(0,i.jsxs)(s.p,{children:["Legacy ",(0,i.jsx)(s.code,{children:".eslintignore"})," entries are merged into the shared flat config ",(0,i.jsx)(s.code,{children:"ignores"}),", including:"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"build"}),", ",(0,i.jsx)(s.code,{children:"node_modules"}),", ",(0,i.jsx)(s.code,{children:"dist"}),", ",(0,i.jsx)(s.code,{children:"reports"}),", ",(0,i.jsx)(s.code,{children:"coverage"}),", ",(0,i.jsx)(s.code,{children:"demo"}),", ",(0,i.jsx)(s.code,{children:"docs"}),", ",(0,i.jsx)(s.code,{children:"temp"}),", ",(0,i.jsx)(s.code,{children:".tmp"}),", ",(0,i.jsx)(s.code,{children:"public"}),", ",(0,i.jsx)(s.code,{children:"webroot"}),", ",(0,i.jsx)(s.code,{children:"cdn"}),", ",(0,i.jsx)(s.code,{children:".docusaurus"}),", ",(0,i.jsx)(s.code,{children:"vendor/*.js"}),", ",(0,i.jsx)(s.code,{children:".nx"}),", ",(0,i.jsx)(s.code,{children:"pnpm-lock.yaml"}),", ",(0,i.jsx)(s.code,{children:".scannerwork"}),", ",(0,i.jsx)(s.code,{children:"stats.json"}),", ",(0,i.jsx)(s.code,{children:"jsconfig.json"}),", ",(0,i.jsx)(s.code,{children:"allure-report"}),", ",(0,i.jsx)(s.code,{children:"docs/api"})]}),"\n",(0,i.jsxs)(s.p,{children:["Repo-specific paths should still be added in ",(0,i.jsx)(s.strong,{children:"your"})," ",(0,i.jsx)(s.code,{children:"eslint.config.mjs"})," if needed:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-js",children:"import { eslintFlatConfig } from '@elliemae/pui-cli/eslint';\n\nexport default [\n ...eslintFlatConfig,\n { ignores: ['my-generated-folder/**'] },\n];\n"})}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"typescript-project-resolution",children:"TypeScript project resolution"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{}),(0,i.jsx)(s.th,{children:"Legacy"}),(0,i.jsx)(s.th,{children:"Flat config"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Option"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"parserOptions.project: true"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"parserOptions.projectService: true"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Root"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"tsconfigRootDir: process.cwd()"})}),(0,i.jsxs)(s.td,{children:["Same (",(0,i.jsx)(s.code,{children:"process.cwd()"})," when lint runs)"]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Monorepo packages: run lint from each package root (or ensure ",(0,i.jsx)(s.code,{children:"tsconfig"})," is discoverable). Same guidance as before, but ",(0,i.jsx)(s.code,{children:"projectService"})," is faster and less brittle than ",(0,i.jsx)(s.code,{children:"project: true"}),"."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"quick-fix-cheat-sheet",children:"Quick fix cheat sheet"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Lint message / area"}),(0,i.jsx)(s.th,{children:"What to do"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"import/..."})," rule id in comment"]}),(0,i.jsxs)(s.td,{children:["Rename to ",(0,i.jsx)(s.code,{children:"import-x/..."})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"consistent-type-imports"})}),(0,i.jsxs)(s.td,{children:["Change to ",(0,i.jsx)(s.code,{children:"import type { X }"})," or inline ",(0,i.jsx)(s.code,{children:"import { type X }"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"no-floating-promises"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"void fn()"}),", ",(0,i.jsx)(s.code,{children:".catch()"}),", or ",(0,i.jsx)(s.code,{children:"await"})," in async context"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"no-misused-promises"})}),(0,i.jsxs)(s.td,{children:["Usually fixed by shared config (",(0,i.jsx)(s.code,{children:"attributes: false"}),"); otherwise wrap handler or fix callback type"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"exhaustive-deps"})," warning"]}),(0,i.jsx)(s.td,{children:"Fix dependency array or document intentional omission"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Formatting (quotes, indent)"}),(0,i.jsx)(s.td,{children:"Run Prettier \u2014 not ESLint"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"prettier/prettier"})," in disable comment"]}),(0,i.jsx)(s.td,{children:"Harmless; rule is off in ESLint"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-extraneous-dependencies"})," on app or ",(0,i.jsx)(s.code,{children:".babelrc.cjs"})]}),(0,i.jsxs)(s.td,{children:["Rule is ",(0,i.jsx)(s.strong,{children:"off"})," (legacy parity; ",(0,i.jsx)(s.code,{children:"app-react-dependencies"})," meta-package)"]})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"config-entry-points-reference",children:"Config entry points (reference)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"App type"}),(0,i.jsx)(s.th,{children:"Legacy export"}),(0,i.jsx)(s.th,{children:"Flat export"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"React + TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslintConfig"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslintFlatConfig"})," / ",(0,i.jsx)(s.code,{children:"eslintFlatConfigStrict"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Non-React TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslintBaseConfig"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslintFlatBaseConfig"})," / ",(0,i.jsx)(s.code,{children:"eslintFlatBaseConfigStrict"})]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Legacy ",(0,i.jsx)(s.code,{children:".eslintrc.cjs"})," exports remain in the package for one transition release but are ",(0,i.jsx)(s.strong,{children:"deprecated"}),"."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"post-migration-tune-ups-alpha-flat-config",children:"Post-migration tune-ups (alpha flat config)"}),"\n",(0,i.jsx)(s.p,{children:"The shared flat config includes pragmatic defaults to reduce migration noise while keeping high-value checks."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Change"}),(0,i.jsx)(s.th,{children:"Behavior"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-misused-promises"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"checksVoidReturn.attributes: false"})," \u2014 async ",(0,i.jsx)(s.code,{children:"onClick"})," / JSX handlers allowed"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-*"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"warn"})," in app code (not error); ",(0,i.jsx)(s.strong,{children:"off"})," in test globs (",(0,i.jsx)(s.code,{children:"*.{test,spec}.*"}),", ",(0,i.jsx)(s.code,{children:"lib/**/tests/**"}),", etc.)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-extraneous-dependencies"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"off"})," (legacy parity; apps use ",(0,i.jsx)(s.code,{children:"@elliemae/app-react-dependencies"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"JSDoc"}),(0,i.jsxs)(s.td,{children:["Full ",(0,i.jsx)(s.code,{children:"jsdoc/recommended"})," ",(0,i.jsx)(s.strong,{children:"removed"}),"; only legacy ",(0,i.jsx)(s.code,{children:"require-jsdoc: off"})," + noisy rules explicitly off"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Testing Library"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"dom"})," rules on test files; ",(0,i.jsx)(s.strong,{children:"react"})," rules on ",(0,i.jsx)(s.code,{children:"*.{test,spec}.{tsx,jsx}"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"WDIO"}),(0,i.jsxs)(s.td,{children:["Globals + rules on ",(0,i.jsx)(s.code,{children:"*.func.spec.js"}),", ",(0,i.jsx)(s.code,{children:"*.visual.spec.js"}),", ",(0,i.jsx)(s.code,{children:"*e2e*"}),", and ",(0,i.jsx)(s.code,{children:"**/e2e/**"})," (page-objects, etc.)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Storybook"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"react/jsx-props-no-spreading"})," off (React config); ",(0,i.jsx)(s.code,{children:"eslint-plugin-storybook@10"})," flat preset (no compat shim)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint.config.*"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"import-x/no-unresolved"})," off"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"scripts/**"}),", ",(0,i.jsx)(s.code,{children:"ci_cd/**"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-console"}),", ",(0,i.jsx)(s.code,{children:"max-lines"}),", ",(0,i.jsx)(s.code,{children:"complexity"})," off"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react-hooks/exhaustive-deps"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"warn"})," (not error) until repos are clean"]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"eslint-10-plugin-compatibility",children:"ESLint 10 plugin compatibility"}),"\n",(0,i.jsxs)(s.p,{children:["Only plugins that still call removed ",(0,i.jsx)(s.code,{children:"context.getFilename()"})," / ",(0,i.jsx)(s.code,{children:"getScope()"})," APIs are wrapped via ",(0,i.jsx)(s.code,{children:"@eslint/compat"})," v2 ",(0,i.jsx)(s.code,{children:"fixupPluginRules"})," in ",(0,i.jsx)(s.code,{children:"lib/lint-config/eslint/flat/compat.mjs"}),":"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Plugin"}),(0,i.jsx)(s.th,{children:"Wrapped?"}),(0,i.jsx)(s.th,{children:"Reason"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint-plugin-react"})}),(0,i.jsx)(s.td,{children:"Yes"}),(0,i.jsxs)(s.td,{children:["Uses legacy context APIs (",(0,i.jsx)(s.code,{children:"display-name"}),", etc.)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint-plugin-redux-saga"})}),(0,i.jsx)(s.td,{children:"Yes"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-yield-in-race"})," uses ",(0,i.jsx)(s.code,{children:"getScope()"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint-plugin-storybook"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{children:"v10 flat preset is ESLint 10\u2013compatible"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint-plugin-wdio"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsxs)(s.td,{children:["Use nested plugin from ",(0,i.jsx)(s.code,{children:"flat/recommended"})," (see ",(0,i.jsx)(s.code,{children:"presets.mjs"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"typescript-eslint"}),", ",(0,i.jsx)(s.code,{children:"import-x"}),", ",(0,i.jsx)(s.code,{children:"jest"}),", ",(0,i.jsx)(s.code,{children:"react-hooks"}),", ",(0,i.jsx)(s.code,{children:"jsx-a11y"}),", ",(0,i.jsx)(s.code,{children:"testing-library"})]}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{children:"ESLint 10\u2013compatible; no shim overhead"})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"@eslint/compat"})," ",(0,i.jsx)(s.strong,{children:"v2+"})," with ESLint 10. v1 ",(0,i.jsx)(s.code,{children:"fixupPluginRules"})," lacks ESLint 10 context patches."]}),"\n",(0,i.jsx)(s.h3,{id:"config-performance-notes",children:"Config performance notes"}),"\n",(0,i.jsx)(s.p,{children:"The shared flat config is structured for faster lint runs:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Preset rule spreads are computed once in ",(0,i.jsx)(s.code,{children:"presets.mjs"})," (not per factory call)."]}),"\n",(0,i.jsx)(s.li,{children:"Jest and Testing Library plugins apply only to test-like file globs (not all source files)."}),"\n",(0,i.jsx)(s.li,{children:"WDIO plugin applies only to e2e / visual / func spec files."}),"\n",(0,i.jsxs)(s.li,{children:["Unused ",(0,i.jsx)(s.code,{children:"eslint-plugin-prettier"})," and ",(0,i.jsx)(s.code,{children:"eslint-plugin-jsdoc"})," were removed (Prettier stays in ",(0,i.jsx)(s.code,{children:"lint-staged"}),"; no JSDoc rules enforced)."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-eslint-comments"})," was removed (incompatible with ESLint 10; rules were low-value)."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Lint toolchain (pui-cli 9 alpha):"})," ESLint 10, Prettier 3, Stylelint 17, ",(0,i.jsx)(s.code,{children:"eslint-plugin-react-hooks"})," 7, ",(0,i.jsx)(s.code,{children:"typescript-eslint"})," 8.56+, Commitlint 21, lint-staged 17."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"createBaseFlatConfigs()"})," caches the two variants (default + strict)."]}),"\n"]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h3,{id:"strict-exports",children:"Strict exports"}),"\n",(0,i.jsx)(s.p,{children:"Use when the default config is clean and you want full type-safety enforcement:"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"App type"}),(0,i.jsx)(s.th,{children:"Export"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"React + TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslintFlatConfigStrict"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Non-React TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslintFlatBaseConfigStrict"})})]})]})]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-js",children:"import { eslintFlatConfigStrict } from '@elliemae/pui-cli/eslint';\n\nexport default eslintFlatConfigStrict;\n"})}),"\n",(0,i.jsx)(s.p,{children:"Compared to the default flat config, strict mode:"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Default"}),(0,i.jsx)(s.th,{children:"Strict"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-*"})}),(0,i.jsx)(s.td,{children:"warn in app code"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"error"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react-hooks/exhaustive-deps"})}),(0,i.jsx)(s.td,{children:"warn"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"error"})," (React config only)"]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Tests, Storybook, and other file overrides are unchanged. Strict does ",(0,i.jsx)(s.strong,{children:"not"})," enable ",(0,i.jsx)(s.code,{children:"typescript-eslint/strictTypeChecked"})," (can be added per-repo later)."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"questions",children:"Questions?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Channel:"})," ui-platform-chat"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Source of truth in repo:"})," ",(0,i.jsx)(s.code,{children:"lib/lint-config/eslint/flat/"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Legacy reference:"})," ",(0,i.jsx)(s.code,{children:"lib/lint-config/eslint/*.cjs"})," (frozen snapshot of old behavior)"]}),"\n"]})]})}function x(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},6607(e,s,n){n.d(s,{R:()=>c,x:()=>t});var r=n(758);const i={},d=r.createContext(i);function c(e){const s=r.useContext(d);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),r.createElement(d.Provider,{value:s},e.children)}}}]);
1
+ "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[1019],{952(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>x,frontMatter:()=>c,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"eslint-rules-migration","title":"ESLint rules migration guide (legacy \u2192 ESLint 10 flat config)","description":"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).","source":"@site/docs/eslint-rules-migration.md","sourceDirName":".","slug":"/eslint-rules-migration","permalink":"/cli/eslint-rules-migration","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/eslint-rules-migration.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"vitestConfig","permalink":"/cli/api/variables/vitestConfig"},"next":{"title":"PUI CLI Documentation","permalink":"/cli/"}}');var i=n(6070),d=n(6607);const c={},t="ESLint rules migration guide (legacy \u2192 ESLint 10 flat config)",l={},o=[{value:"At a glance",id:"at-a-glance",level:2},{value:"How to upgrade a repo",id:"how-to-upgrade-a-repo",level:2},{value:"Presets: what was removed vs added",id:"presets-what-was-removed-vs-added",level:2},{value:"Removed (no longer extended)",id:"removed-no-longer-extended",level:3},{value:"Still included (equivalent or better)",id:"still-included-equivalent-or-better",level:3},{value:"Optional (not enabled by default)",id:"optional-not-enabled-by-default",level:3},{value:"PUI custom rules \u2014 unchanged",id:"pui-custom-rules--unchanged",level:2},{value:"TypeScript (explicit, same as before)",id:"typescript-explicit-same-as-before",level:3},{value:"React (explicit, same as before)",id:"react-explicit-same-as-before",level:3},{value:"E2E specs (unchanged)",id:"e2e-specs-unchanged",level:3},{value:"Import rules: <code>import/*</code> \u2192 <code>import-x/*</code>",id:"import-rules-import--import-x",level:2},{value:"Still off (same as legacy PUI config)",id:"still-off-same-as-legacy-pui-config",level:3},{value:"Still on",id:"still-on",level:3},{value:"Formatting: removed from ESLint",id:"formatting-removed-from-eslint",level:2},{value:"New rules you may see after upgrade",id:"new-rules-you-may-see-after-upgrade",level:2},{value:"TypeScript \u2014 newly explicit in PUI config",id:"typescript--newly-explicit-in-pui-config",level:3},{value:"TypeScript \u2014 from <code>recommendedTypeChecked</code> (v8 bundle)",id:"typescript--from-recommendedtypechecked-v8-bundle",level:3},{value:"React \u2014 new in pui-cli shared config",id:"react--new-in-pui-cli-shared-config",level:3},{value:"Unused variables",id:"unused-variables",level:3},{value:"Airbnb removal \u2014 practical impact",id:"airbnb-removal--practical-impact",level:2},{value:"File-type overrides (flat config only)",id:"file-type-overrides-flat-config-only",level:2},{value:"Ignore patterns",id:"ignore-patterns",level:2},{value:"TypeScript project resolution",id:"typescript-project-resolution",level:2},{value:"Quick fix cheat sheet",id:"quick-fix-cheat-sheet",level:2},{value:"Config entry points (reference)",id:"config-entry-points-reference",level:2},{value:"Post-migration tune-ups (alpha flat config)",id:"post-migration-tune-ups-alpha-flat-config",level:2},{value:"ESLint 10 plugin compatibility",id:"eslint-10-plugin-compatibility",level:3},{value:"Config performance notes",id:"config-performance-notes",level:3},{value:"Strict exports",id:"strict-exports",level:3},{value:"Questions?",id:"questions",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"eslint-rules-migration-guide-legacy--eslint-10-flat-config",children:"ESLint rules migration guide (legacy \u2192 ESLint 10 flat config)"})}),"\n",(0,i.jsxs)(s.p,{children:["This document compares the ",(0,i.jsx)(s.strong,{children:"previous"})," ",(0,i.jsx)(s.code,{children:"@elliemae/pui-cli"})," ESLint setup (ESLint 8 + ",(0,i.jsx)(s.code,{children:".eslintrc.cjs"})," + Airbnb) with the ",(0,i.jsx)(s.strong,{children:"current"})," setup (ESLint 10 + ",(0,i.jsx)(s.code,{children:"eslint.config.mjs"})," + ",(0,i.jsx)(s.code,{children:"typescript-eslint"})," v8 flat config)."]}),"\n",(0,i.jsxs)(s.p,{children:["For the full pui-cli 9 upgrade path (Node 24, pnpm 11, CI, Cursor skills), see ",(0,i.jsx)(s.a,{href:"/cli/pui-cli-9-migration",children:"pui-cli 9 migration guide"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Use it when upgrading apps/libraries and explaining new lint failures to your team."}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"at-a-glance",children:"At a glance"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Topic"}),(0,i.jsx)(s.th,{children:"Before (legacy)"}),(0,i.jsx)(s.th,{children:"After (flat config)"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Config format"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:".eslintrc.cjs"})," + ",(0,i.jsx)(s.code,{children:".eslintignore"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint.config.mjs"})," (ignores built-in)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"ESLint"}),(0,i.jsx)(s.td,{children:"8.x"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"10.x"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"TypeScript lint"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@typescript-eslint"})," v5, ",(0,i.jsx)(s.code,{children:"project: true"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"typescript-eslint"})," v8, ",(0,i.jsx)(s.code,{children:"projectService: true"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"JS parser"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@babel/eslint-parser"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@eslint/js"})," recommended (no Babel parser for lint)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Style presets"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"Airbnb"})," + ",(0,i.jsx)(s.strong,{children:"airbnb-typescript"})]}),(0,i.jsx)(s.td,{children:"Removed \u2014 rules re-expressed explicitly"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Import plugin"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-import"})," (",(0,i.jsx)(s.code,{children:"import/*"}),")"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-import-x"})," (",(0,i.jsx)(s.code,{children:"import-x/*"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Prettier in ESLint"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"prettier/prettier"})," ",(0,i.jsx)(s.strong,{children:"error"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"Not enforced in ESLint"})," \u2014 use Prettier in ",(0,i.jsx)(s.code,{children:"lint-staged"})," / CI"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Indent in ESLint"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"indent"})," ",(0,i.jsx)(s.strong,{children:"error"})]}),(0,i.jsx)(s.td,{children:"Removed \u2014 Prettier owns formatting"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Type-aware TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"recommended-requiring-type-checking"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"recommendedTypeChecked"})," (v8 equivalent)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Consumer import"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"require('@elliemae/pui-cli').eslintConfig"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import { eslintFlatConfig } from '@elliemae/pui-cli/eslint'"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Strict import"}),(0,i.jsx)(s.td,{children:"\u2014"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslintFlatConfigStrict"})," / ",(0,i.jsx)(s.code,{children:"eslintFlatBaseConfigStrict"})]})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"how-to-upgrade-a-repo",children:"How to upgrade a repo"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-js",children:"// eslint.config.mjs \u2014 React apps / libraries\nimport { eslintFlatConfig } from '@elliemae/pui-cli/eslint';\n\nexport default eslintFlatConfig;\n"})}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-js",children:"// eslint.config.mjs \u2014 Node / TS services (non-React)\nimport { eslintFlatBaseConfig } from '@elliemae/pui-cli/eslint';\n\nexport default eslintFlatBaseConfig;\n"})}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Upgrade ",(0,i.jsx)(s.code,{children:"@elliemae/pui-cli"})," to the alpha release that ships flat config."]}),"\n",(0,i.jsxs)(s.li,{children:["Add ",(0,i.jsx)(s.code,{children:"eslint.config.mjs"})," as above."]}),"\n",(0,i.jsxs)(s.li,{children:["Delete ",(0,i.jsx)(s.code,{children:".eslintrc.cjs"})," and ",(0,i.jsx)(s.code,{children:".eslintignore"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Run ",(0,i.jsx)(s.code,{children:"pui-cli lint"})," and ",(0,i.jsx)(s.code,{children:"pui-cli lint --fix"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"presets-what-was-removed-vs-added",children:"Presets: what was removed vs added"}),"\n",(0,i.jsx)(s.h3,{id:"removed-no-longer-extended",children:"Removed (no longer extended)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Legacy extend"}),(0,i.jsx)(s.th,{children:"Impact"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"airbnb"})," / ",(0,i.jsx)(s.code,{children:"airbnb/hooks"})]}),(0,i.jsxs)(s.td,{children:["React style rules from Airbnb (e.g. ",(0,i.jsx)(s.code,{children:"react/jsx-props-no-spreading"}),", ",(0,i.jsx)(s.code,{children:"react/no-array-index-key"}),", stricter JSX patterns) are ",(0,i.jsx)(s.strong,{children:"gone"})," unless we set them explicitly in PUI config."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"airbnb-base"})}),(0,i.jsx)(s.td,{children:"Same for non-React JS."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"airbnb-typescript"})," / ",(0,i.jsx)(s.code,{children:"airbnb-typescript/base"})]}),(0,i.jsx)(s.td,{children:"Airbnb + TypeScript combo rules removed."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:prettier/recommended"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"prettier/prettier"})," is no longer an ESLint error."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:import/recommended"})}),(0,i.jsxs)(s.td,{children:["Replaced by ",(0,i.jsx)(s.code,{children:"eslint-plugin-import-x"})," flat recommended."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:mdx/recommended"})}),(0,i.jsx)(s.td,{children:"MDX-specific ESLint block removed from shared React config (Storybook flat config remains)."})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"still-included-equivalent-or-better",children:"Still included (equivalent or better)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Area"}),(0,i.jsx)(s.th,{children:"Legacy"}),(0,i.jsx)(s.th,{children:"Flat config"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Core JS"}),(0,i.jsx)(s.td,{children:"ESLint recommended (via Airbnb + plugins)"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@eslint/js"})," ",(0,i.jsx)(s.strong,{children:"recommended"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"TypeScript"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@typescript-eslint/recommended"})," + ",(0,i.jsx)(s.strong,{children:"recommended-requiring-type-checking"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"typescript-eslint"})," ",(0,i.jsx)(s.strong,{children:"recommendedTypeChecked"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"React"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"plugin:react/recommended"})," (via Airbnb)"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-react"})," ",(0,i.jsx)(s.strong,{children:"recommended"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Hooks"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"react-hooks/rules-of-hooks"})," (explicit); ",(0,i.jsx)(s.strong,{children:"no"})," ",(0,i.jsx)(s.code,{children:"exhaustive-deps"})," in old pui-cli"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"rules-of-hooks"})," ",(0,i.jsx)(s.strong,{children:"error"})," + ",(0,i.jsxs)(s.strong,{children:[(0,i.jsx)(s.code,{children:"exhaustive-deps"})," warn"]})," (new)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"a11y"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:jsx-a11y/recommended"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-jsx-a11y"})," flat ",(0,i.jsx)(s.strong,{children:"recommended"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Jest"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:jest/recommended"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-jest"})," ",(0,i.jsx)(s.strong,{children:"recommended"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Testing Library"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:testing-library/dom"})}),(0,i.jsxs)(s.td,{children:["Same (",(0,i.jsx)(s.strong,{children:"dom"})," rules only)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"WDIO"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:wdio/recommended"})}),(0,i.jsx)(s.td,{children:"Same"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Redux Saga"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:redux-saga/recommended"})}),(0,i.jsx)(s.td,{children:"Same"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Storybook"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"plugin:storybook/recommended"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-storybook"})," flat ",(0,i.jsx)(s.strong,{children:"recommended"})," (v10, Storybook 10\u2013compatible)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Prettier conflict"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-config-prettier"})," via ",(0,i.jsx)(s.code,{children:"plugin:prettier/recommended"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslint-config-prettier"})," only (disables conflicting ESLint style rules)"]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"optional-not-enabled-by-default",children:"Optional (not enabled by default)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Preset"}),(0,i.jsx)(s.th,{children:"Status"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"typescript-eslint/strictTypeChecked"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"Not"})," enabled \u2014 optional stricter tier for a later rollout"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"typescript-eslint/stylistic*"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"Not"})," enabled \u2014 Prettier is the source of truth for formatting"]})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"pui-custom-rules--unchanged",children:"PUI custom rules \u2014 unchanged"}),"\n",(0,i.jsxs)(s.p,{children:["These explicit PUI rules are ",(0,i.jsx)(s.strong,{children:"the same"})," in spirit (same limits and overrides):"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsxs)(s.th,{children:["JS (",(0,i.jsx)(s.code,{children:".js"}),")"]}),(0,i.jsxs)(s.th,{children:["TS (",(0,i.jsx)(s.code,{children:".ts"}),"/",(0,i.jsx)(s.code,{children:".tsx"}),")"]})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"complexity"})}),(0,i.jsx)(s.td,{children:"max 10"}),(0,i.jsx)(s.td,{children:"max 10"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-depth"})}),(0,i.jsx)(s.td,{children:"max 4"}),(0,i.jsx)(s.td,{children:"max 4"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-nested-callbacks"})}),(0,i.jsx)(s.td,{children:"max 3"}),(0,i.jsx)(s.td,{children:"max 3"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-params"})}),(0,i.jsx)(s.td,{children:"max 3"}),(0,i.jsx)(s.td,{children:"max 3"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-statements"})}),(0,i.jsx)(s.td,{children:"max 20"}),(0,i.jsx)(s.td,{children:"max 20"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"max-lines"})}),(0,i.jsx)(s.td,{children:"120"}),(0,i.jsx)(s.td,{children:"200"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"no-console"})}),(0,i.jsx)(s.td,{children:"warn"}),(0,i.jsx)(s.td,{children:"warn"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"no-param-reassign"})}),(0,i.jsx)(s.td,{children:"props: false"}),(0,i.jsx)(s.td,{children:"props: false"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"arrow-body-style"})}),(0,i.jsx)(s.td,{children:"as-needed"}),(0,i.jsx)(s.td,{children:"as-needed"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"prefer-template"})}),(0,i.jsx)(s.td,{children:"error"}),(0,i.jsx)(s.td,{children:"error"})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"typescript-explicit-same-as-before",children:"TypeScript (explicit, same as before)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Setting"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-floating-promises"})}),(0,i.jsxs)(s.td,{children:["error, ",(0,i.jsx)(s.code,{children:"ignoreIIFE: true"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/unbound-method"})}),(0,i.jsxs)(s.td,{children:["error, ",(0,i.jsx)(s.code,{children:"ignoreStatic: true"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-use-before-define"})}),(0,i.jsx)(s.td,{children:"functions: false, classes/variables/typedefs: true"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/explicit-module-boundary-types"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/explicit-function-return-type"})}),(0,i.jsx)(s.td,{children:"off"})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"react-explicit-same-as-before",children:"React (explicit, same as before)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Setting"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react/function-component-definition"})}),(0,i.jsx)(s.td,{children:"named components: arrow-function"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react/react-in-jsx-scope"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react/prop-types"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"jsx-a11y/heading-has-content"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"jsx-a11y/label-has-associated-control"})}),(0,i.jsxs)(s.td,{children:["on, ",(0,i.jsx)(s.code,{children:"controlComponents: ['Input']"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"redux-saga/no-yield-in-race"})}),(0,i.jsx)(s.td,{children:"error"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"redux-saga/yield-effects"})}),(0,i.jsx)(s.td,{children:"error"})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"e2e-specs-unchanged",children:"E2E specs (unchanged)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Files"}),(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Setting"})]})}),(0,i.jsx)(s.tbody,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"*.func.spec.js"}),", ",(0,i.jsx)(s.code,{children:"*.visual.spec.js"})]}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"jest/valid-expect"})}),(0,i.jsx)(s.td,{children:"off"})]})})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsxs)(s.h2,{id:"import-rules-import--import-x",children:["Import rules: ",(0,i.jsx)(s.code,{children:"import/*"})," \u2192 ",(0,i.jsx)(s.code,{children:"import-x/*"})]}),"\n",(0,i.jsxs)(s.p,{children:["Update ",(0,i.jsx)(s.strong,{children:"eslint-disable"})," comments when you touch files:"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Legacy rule name"}),(0,i.jsx)(s.th,{children:"New rule name"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import/no-unresolved"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-unresolved"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import/extensions"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/extensions"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import/no-named-as-default"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-named-as-default"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"\u2026"}),(0,i.jsxs)(s.td,{children:["Prefix ",(0,i.jsx)(s.code,{children:"import/"})," \u2192 ",(0,i.jsx)(s.code,{children:"import-x/"})]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"still-off-same-as-legacy-pui-config",children:"Still off (same as legacy PUI config)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Status"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/imports-first"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/newline-after-import"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-dynamic-require"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-extraneous-dependencies"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-named-as-default"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-webpack-loader-syntax"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/prefer-default-export"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/default"})}),(0,i.jsx)(s.td,{children:"off"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/namespace"})}),(0,i.jsx)(s.td,{children:"off"})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"still-on",children:"Still on"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Setting"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-unresolved"})}),(0,i.jsx)(s.td,{children:"error, strict casing"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/extensions"})}),(0,i.jsx)(s.td,{children:"never (json/js ignorePackages)"})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"formatting-removed-from-eslint",children:"Formatting: removed from ESLint"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Legacy"}),(0,i.jsx)(s.th,{children:"Flat config"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"prettier/prettier"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"error"})," (via ",(0,i.jsx)(s.code,{children:"plugin:prettier/recommended"}),")"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"off"})," \u2014 run Prettier separately"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"indent"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"error"})," (2 spaces, SwitchCase: 1)"]}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"removed"})})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Action:"})," Rely on ",(0,i.jsx)(s.code,{children:"prettier --write"})," / ",(0,i.jsx)(s.code,{children:"lint-staged"})," for formatting. Do not expect ESLint to fail on quote/semicolon/indent issues."]}),"\n",(0,i.jsxs)(s.p,{children:["Legacy ",(0,i.jsx)(s.code,{children:"eslint-disable prettier/prettier"})," comments still work (no-op rule registered as off)."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"new-rules-you-may-see-after-upgrade",children:"New rules you may see after upgrade"}),"\n",(0,i.jsxs)(s.p,{children:["These are the main ",(0,i.jsx)(s.strong,{children:"new or stricter"})," checks teams notice beyond \u201csame PUI rules as before.\u201d"]}),"\n",(0,i.jsx)(s.h3,{id:"typescript--newly-explicit-in-pui-config",children:"TypeScript \u2014 newly explicit in PUI config"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Severity"}),(0,i.jsx)(s.th,{children:"What it catches"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/consistent-type-imports"})}),(0,i.jsx)(s.td,{children:"error"}),(0,i.jsxs)(s.td,{children:["Use ",(0,i.jsx)(s.code,{children:"import type { Foo }"})," for type-only imports"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-import-type-side-effects"})}),(0,i.jsx)(s.td,{children:"error"}),(0,i.jsxs)(s.td,{children:["TS 5+ ",(0,i.jsx)(s.code,{children:"import type"})," side-effect hygiene"]})]})]})]}),"\n",(0,i.jsxs)(s.h3,{id:"typescript--from-recommendedtypechecked-v8-bundle",children:["TypeScript \u2014 from ",(0,i.jsx)(s.code,{children:"recommendedTypeChecked"})," (v8 bundle)"]}),"\n",(0,i.jsxs)(s.p,{children:["Already largely covered by legacy ",(0,i.jsx)(s.code,{children:"recommended-requiring-type-checking"}),", but stricter defaults / renames may surface more issues, including:"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Typical issue"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-misused-promises"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"async"})," handler passed where ",(0,i.jsx)(s.code,{children:"void"})," is expected (e.g. some callbacks)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-assignment"})}),(0,i.jsxs)(s.td,{children:["Assigning ",(0,i.jsx)(s.code,{children:"any"})," to a typed variable"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-member-access"})}),(0,i.jsxs)(s.td,{children:["Property access on ",(0,i.jsx)(s.code,{children:"any"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-call"})}),(0,i.jsxs)(s.td,{children:["Calling an ",(0,i.jsx)(s.code,{children:"any"})," value"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-argument"})}),(0,i.jsxs)(s.td,{children:["Passing ",(0,i.jsx)(s.code,{children:"any"})," into a typed parameter"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-return"})}),(0,i.jsxs)(s.td,{children:["Returning ",(0,i.jsx)(s.code,{children:"any"})," from a typed function"]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note:"})," Test files (",(0,i.jsx)(s.code,{children:"**/*.{test,spec}.*"}),") disable the ",(0,i.jsx)(s.code,{children:"no-unsafe-*"})," and ",(0,i.jsx)(s.code,{children:"unbound-method"})," rules in the shared config to reduce noise."]}),"\n",(0,i.jsx)(s.h3,{id:"react--new-in-pui-cli-shared-config",children:"React \u2014 new in pui-cli shared config"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Severity"}),(0,i.jsx)(s.th,{children:"Notes"})]})}),(0,i.jsx)(s.tbody,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react-hooks/exhaustive-deps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"warn"})}),(0,i.jsxs)(s.td,{children:["Missing deps in ",(0,i.jsx)(s.code,{children:"useEffect"})," / ",(0,i.jsx)(s.code,{children:"useCallback"})," / ",(0,i.jsx)(s.code,{children:"useMemo"})," \u2014 was not in legacy pui-cli (only ",(0,i.jsx)(s.code,{children:"rules-of-hooks"}),")"]})]})})]}),"\n",(0,i.jsx)(s.h3,{id:"unused-variables",children:"Unused variables"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Legacy"}),(0,i.jsx)(s.th,{children:"Flat config"})]})}),(0,i.jsx)(s.tbody,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-unused-vars"})," on TS files"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unused-vars"})," with ",(0,i.jsx)(s.code,{children:"ignoreRestSiblings"}),", ",(0,i.jsx)(s.code,{children:"argsIgnorePattern: '^_'"})]})]})})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"airbnb-removal--practical-impact",children:"Airbnb removal \u2014 practical impact"}),"\n",(0,i.jsxs)(s.p,{children:["We no longer extend Airbnb. You should ",(0,i.jsx)(s.strong,{children:"not"})," expect every Airbnb rule to have a 1:1 replacement. Common behavioral changes:"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"You might have relied on (Airbnb)"}),(0,i.jsx)(s.th,{children:"After migration"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Stricter React patterns (e.g. some JSX prop rules)"}),(0,i.jsxs)(s.td,{children:["Only if still in ",(0,i.jsx)(s.code,{children:"eslint-plugin-react"})," recommended or our explicit ",(0,i.jsx)(s.code,{children:"reactRules"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import/prefer-default-export"})}),(0,i.jsxs)(s.td,{children:["Still ",(0,i.jsx)(s.strong,{children:"off"})," in PUI config"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react/jsx-props-no-spreading"})}),(0,i.jsxs)(s.td,{children:["Still ",(0,i.jsx)(s.strong,{children:"off"})," in PUI config"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Many opinionated React/a11y defaults from Airbnb"}),(0,i.jsxs)(s.td,{children:["Replaced by ",(0,i.jsx)(s.strong,{children:"plugin recommended"})," sets + PUI overrides above"]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["If lint gets ",(0,i.jsx)(s.strong,{children:"looser"})," in some areas, that is expected. If it gets ",(0,i.jsx)(s.strong,{children:"stricter"}),", it is usually from ",(0,i.jsx)(s.strong,{children:"type-checked TypeScript"})," or ",(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.code,{children:"consistent-type-imports"})}),", not from Airbnb."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"file-type-overrides-flat-config-only",children:"File-type overrides (flat config only)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Files"}),(0,i.jsx)(s.th,{children:"Rules relaxed"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"**/*.d.ts"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"@typescript-eslint/no-explicit-any"}),", ",(0,i.jsx)(s.code,{children:"@typescript-eslint/no-empty-object-type"})," off"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"**/*.{test,spec}.{js,jsx,ts,tsx}"}),", ",(0,i.jsx)(s.code,{children:"**/__tests__/**"}),", ",(0,i.jsx)(s.code,{children:"lib/**/tests/**"}),", ",(0,i.jsx)(s.code,{children:"app/**/tests/**"}),", etc."]}),(0,i.jsxs)(s.td,{children:["Jest + Testing Library; ",(0,i.jsx)(s.code,{children:"no-unsafe-*"})," off; ",(0,i.jsx)(s.code,{children:"no-unsafe-declaration-merging"}),", ",(0,i.jsx)(s.code,{children:"no-unsafe-enum-comparison"}),", ",(0,i.jsx)(s.code,{children:"await-thenable"}),", ",(0,i.jsx)(s.code,{children:"prefer-promise-reject-errors"}),", ",(0,i.jsx)(s.code,{children:"prefer-const"}),", etc. off in tests"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"**/*.checksum*.js"}),", ",(0,i.jsx)(s.code,{children:"**/*.endpoint.js"}),", versioned ",(0,i.jsx)(s.code,{children:"tests/**/latest"})," and ",(0,i.jsx)(s.code,{children:"tests/**/X.Y"})," assets"]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-unused-vars"}),", ",(0,i.jsx)(s.code,{children:"no-console"}),", ",(0,i.jsx)(s.code,{children:"max-lines"}),", ",(0,i.jsx)(s.code,{children:"max-statements"}),", ",(0,i.jsx)(s.code,{children:"complexity"})," off (fixture JS only)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"**/lint-config/**"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"max-lines"})," off; some ",(0,i.jsx)(s.code,{children:"import-x"})," rules off"]})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"ignore-patterns",children:"Ignore patterns"}),"\n",(0,i.jsxs)(s.p,{children:["Legacy ",(0,i.jsx)(s.code,{children:".eslintignore"})," entries are merged into the shared flat config ",(0,i.jsx)(s.code,{children:"ignores"}),", including:"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"build"}),", ",(0,i.jsx)(s.code,{children:"node_modules"}),", ",(0,i.jsx)(s.code,{children:"dist"}),", ",(0,i.jsx)(s.code,{children:"reports"}),", ",(0,i.jsx)(s.code,{children:"coverage"}),", ",(0,i.jsx)(s.code,{children:"demo"}),", ",(0,i.jsx)(s.code,{children:"docs"}),", ",(0,i.jsx)(s.code,{children:"temp"}),", ",(0,i.jsx)(s.code,{children:".tmp"}),", ",(0,i.jsx)(s.code,{children:"public"}),", ",(0,i.jsx)(s.code,{children:"webroot"}),", ",(0,i.jsx)(s.code,{children:"cdn"}),", ",(0,i.jsx)(s.code,{children:".docusaurus"}),", ",(0,i.jsx)(s.code,{children:"vendor/*.js"}),", ",(0,i.jsx)(s.code,{children:".nx"}),", ",(0,i.jsx)(s.code,{children:"pnpm-lock.yaml"}),", ",(0,i.jsx)(s.code,{children:".scannerwork"}),", ",(0,i.jsx)(s.code,{children:"stats.json"}),", ",(0,i.jsx)(s.code,{children:"jsconfig.json"}),", ",(0,i.jsx)(s.code,{children:"allure-report"}),", ",(0,i.jsx)(s.code,{children:"docs/api"})]}),"\n",(0,i.jsxs)(s.p,{children:["Repo-specific paths should still be added in ",(0,i.jsx)(s.strong,{children:"your"})," ",(0,i.jsx)(s.code,{children:"eslint.config.mjs"})," if needed:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-js",children:"import { eslintFlatConfig } from '@elliemae/pui-cli/eslint';\n\nexport default [\n ...eslintFlatConfig,\n { ignores: ['my-generated-folder/**'] },\n];\n"})}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"typescript-project-resolution",children:"TypeScript project resolution"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{}),(0,i.jsx)(s.th,{children:"Legacy"}),(0,i.jsx)(s.th,{children:"Flat config"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Option"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"parserOptions.project: true"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"parserOptions.projectService: true"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Root"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"tsconfigRootDir: process.cwd()"})}),(0,i.jsxs)(s.td,{children:["Same (",(0,i.jsx)(s.code,{children:"process.cwd()"})," when lint runs)"]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Monorepo packages: run lint from each package root (or ensure ",(0,i.jsx)(s.code,{children:"tsconfig"})," is discoverable). Same guidance as before, but ",(0,i.jsx)(s.code,{children:"projectService"})," is faster and less brittle than ",(0,i.jsx)(s.code,{children:"project: true"}),"."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"quick-fix-cheat-sheet",children:"Quick fix cheat sheet"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Lint message / area"}),(0,i.jsx)(s.th,{children:"What to do"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"import/..."})," rule id in comment"]}),(0,i.jsxs)(s.td,{children:["Rename to ",(0,i.jsx)(s.code,{children:"import-x/..."})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"consistent-type-imports"})}),(0,i.jsxs)(s.td,{children:["Change to ",(0,i.jsx)(s.code,{children:"import type { X }"})," or inline ",(0,i.jsx)(s.code,{children:"import { type X }"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"no-floating-promises"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"void fn()"}),", ",(0,i.jsx)(s.code,{children:".catch()"}),", or ",(0,i.jsx)(s.code,{children:"await"})," in async context"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"no-misused-promises"})}),(0,i.jsxs)(s.td,{children:["Usually fixed by shared config (",(0,i.jsx)(s.code,{children:"attributes: false"}),"); otherwise wrap handler or fix callback type"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"exhaustive-deps"})," warning"]}),(0,i.jsx)(s.td,{children:"Fix dependency array or document intentional omission"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Formatting (quotes, indent)"}),(0,i.jsx)(s.td,{children:"Run Prettier \u2014 not ESLint"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"prettier/prettier"})," in disable comment"]}),(0,i.jsx)(s.td,{children:"Harmless; rule is off in ESLint"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-extraneous-dependencies"})," on app or ",(0,i.jsx)(s.code,{children:".babelrc.cjs"})]}),(0,i.jsxs)(s.td,{children:["Rule is ",(0,i.jsx)(s.strong,{children:"off"})," (legacy parity; ",(0,i.jsx)(s.code,{children:"app-react-dependencies"})," meta-package)"]})]})]})]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"config-entry-points-reference",children:"Config entry points (reference)"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"App type"}),(0,i.jsx)(s.th,{children:"Legacy export"}),(0,i.jsx)(s.th,{children:"Flat export"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"React + TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslintConfig"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslintFlatConfig"})," / ",(0,i.jsx)(s.code,{children:"eslintFlatConfigStrict"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Non-React TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslintBaseConfig"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"eslintFlatBaseConfig"})," / ",(0,i.jsx)(s.code,{children:"eslintFlatBaseConfigStrict"})]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Legacy ",(0,i.jsx)(s.code,{children:".eslintrc.cjs"})," exports remain in the package for one transition release but are ",(0,i.jsx)(s.strong,{children:"deprecated"}),"."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"post-migration-tune-ups-alpha-flat-config",children:"Post-migration tune-ups (alpha flat config)"}),"\n",(0,i.jsx)(s.p,{children:"The shared flat config includes pragmatic defaults to reduce migration noise while keeping high-value checks."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Change"}),(0,i.jsx)(s.th,{children:"Behavior"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-misused-promises"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"checksVoidReturn.attributes: false"})," \u2014 async ",(0,i.jsx)(s.code,{children:"onClick"})," / JSX handlers allowed"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-*"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"warn"})," in app code (not error); ",(0,i.jsx)(s.strong,{children:"off"})," in test globs (",(0,i.jsx)(s.code,{children:"*.{test,spec}.*"}),", ",(0,i.jsx)(s.code,{children:"lib/**/tests/**"}),", etc.)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"import-x/no-extraneous-dependencies"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"off"})," (legacy parity; apps use ",(0,i.jsx)(s.code,{children:"@elliemae/app-react-dependencies"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"JSDoc"}),(0,i.jsxs)(s.td,{children:["Full ",(0,i.jsx)(s.code,{children:"jsdoc/recommended"})," ",(0,i.jsx)(s.strong,{children:"removed"}),"; only legacy ",(0,i.jsx)(s.code,{children:"require-jsdoc: off"})," + noisy rules explicitly off"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Testing Library"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"dom"})," rules on test files; ",(0,i.jsx)(s.strong,{children:"react"})," rules on ",(0,i.jsx)(s.code,{children:"*.{test,spec}.{tsx,jsx}"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"WDIO"}),(0,i.jsxs)(s.td,{children:["Globals + rules on ",(0,i.jsx)(s.code,{children:"*.func.spec.js"}),", ",(0,i.jsx)(s.code,{children:"*.visual.spec.js"}),", ",(0,i.jsx)(s.code,{children:"*e2e*"}),", and ",(0,i.jsx)(s.code,{children:"**/e2e/**"})," (page-objects, etc.)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Storybook"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"react/jsx-props-no-spreading"})," off (React config); ",(0,i.jsx)(s.code,{children:"eslint-plugin-storybook@10"})," flat preset (no compat shim)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint.config.*"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"import-x/no-unresolved"})," off"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"scripts/**"}),", ",(0,i.jsx)(s.code,{children:"ci_cd/**"})]}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-console"}),", ",(0,i.jsx)(s.code,{children:"max-lines"}),", ",(0,i.jsx)(s.code,{children:"complexity"})," off"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react-hooks/exhaustive-deps"})}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"warn"})," (not error) until repos are clean"]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"eslint-10-plugin-compatibility",children:"ESLint 10 plugin compatibility"}),"\n",(0,i.jsxs)(s.p,{children:["Only plugins that still call removed ",(0,i.jsx)(s.code,{children:"context.getFilename()"})," / ",(0,i.jsx)(s.code,{children:"getScope()"})," APIs are wrapped via ",(0,i.jsx)(s.code,{children:"@eslint/compat"})," v2 ",(0,i.jsx)(s.code,{children:"fixupPluginRules"})," in ",(0,i.jsx)(s.code,{children:"lib/lint-config/eslint/flat/compat.mjs"}),":"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Plugin"}),(0,i.jsx)(s.th,{children:"Wrapped?"}),(0,i.jsx)(s.th,{children:"Reason"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint-plugin-react"})}),(0,i.jsx)(s.td,{children:"Yes"}),(0,i.jsxs)(s.td,{children:["Uses legacy context APIs (",(0,i.jsx)(s.code,{children:"display-name"}),", etc.)"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint-plugin-redux-saga"})}),(0,i.jsx)(s.td,{children:"Yes"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"no-yield-in-race"})," uses ",(0,i.jsx)(s.code,{children:"getScope()"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint-plugin-storybook"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{children:"v10 flat preset is ESLint 10\u2013compatible"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslint-plugin-wdio"})}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsxs)(s.td,{children:["Use nested plugin from ",(0,i.jsx)(s.code,{children:"flat/recommended"})," (see ",(0,i.jsx)(s.code,{children:"presets.mjs"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.code,{children:"typescript-eslint"}),", ",(0,i.jsx)(s.code,{children:"import-x"}),", ",(0,i.jsx)(s.code,{children:"jest"}),", ",(0,i.jsx)(s.code,{children:"react-hooks"}),", ",(0,i.jsx)(s.code,{children:"jsx-a11y"}),", ",(0,i.jsx)(s.code,{children:"testing-library"})]}),(0,i.jsx)(s.td,{children:"No"}),(0,i.jsx)(s.td,{children:"ESLint 10\u2013compatible; no shim overhead"})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"@eslint/compat"})," ",(0,i.jsx)(s.strong,{children:"v2+"})," with ESLint 10. v1 ",(0,i.jsx)(s.code,{children:"fixupPluginRules"})," lacks ESLint 10 context patches."]}),"\n",(0,i.jsx)(s.h3,{id:"config-performance-notes",children:"Config performance notes"}),"\n",(0,i.jsx)(s.p,{children:"The shared flat config is structured for faster lint runs:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Preset rule spreads are computed once in ",(0,i.jsx)(s.code,{children:"presets.mjs"})," (not per factory call)."]}),"\n",(0,i.jsx)(s.li,{children:"Jest and Testing Library plugins apply only to test-like file globs (not all source files)."}),"\n",(0,i.jsx)(s.li,{children:"WDIO plugin applies only to e2e / visual / func spec files."}),"\n",(0,i.jsxs)(s.li,{children:["Unused ",(0,i.jsx)(s.code,{children:"eslint-plugin-prettier"})," and ",(0,i.jsx)(s.code,{children:"eslint-plugin-jsdoc"})," were removed (Prettier stays in ",(0,i.jsx)(s.code,{children:"lint-staged"}),"; no JSDoc rules enforced)."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"eslint-plugin-eslint-comments"})," was removed (incompatible with ESLint 10; rules were low-value)."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Lint toolchain (pui-cli 9 alpha):"})," ESLint 10, Prettier 3, Stylelint 17, ",(0,i.jsx)(s.code,{children:"eslint-plugin-react-hooks"})," 7, ",(0,i.jsx)(s.code,{children:"typescript-eslint"})," 8.56+, Commitlint 21, lint-staged 17."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"createBaseFlatConfigs()"})," caches the two variants (default + strict)."]}),"\n"]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h3,{id:"strict-exports",children:"Strict exports"}),"\n",(0,i.jsx)(s.p,{children:"Use when the default config is clean and you want full type-safety enforcement:"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"App type"}),(0,i.jsx)(s.th,{children:"Export"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"React + TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslintFlatConfigStrict"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Non-React TS"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"eslintFlatBaseConfigStrict"})})]})]})]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-js",children:"import { eslintFlatConfigStrict } from '@elliemae/pui-cli/eslint';\n\nexport default eslintFlatConfigStrict;\n"})}),"\n",(0,i.jsx)(s.p,{children:"Compared to the default flat config, strict mode:"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Rule"}),(0,i.jsx)(s.th,{children:"Default"}),(0,i.jsx)(s.th,{children:"Strict"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"@typescript-eslint/no-unsafe-*"})}),(0,i.jsx)(s.td,{children:"warn in app code"}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"error"})})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"react-hooks/exhaustive-deps"})}),(0,i.jsx)(s.td,{children:"warn"}),(0,i.jsxs)(s.td,{children:[(0,i.jsx)(s.strong,{children:"error"})," (React config only)"]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Tests, Storybook, and other file overrides are unchanged. Strict does ",(0,i.jsx)(s.strong,{children:"not"})," enable ",(0,i.jsx)(s.code,{children:"typescript-eslint/strictTypeChecked"})," (can be added per-repo later)."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"questions",children:"Questions?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Channel:"})," ui-platform-chat"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Source of truth in repo:"})," ",(0,i.jsx)(s.code,{children:"lib/lint-config/eslint/flat/"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Legacy reference:"})," ",(0,i.jsx)(s.code,{children:"lib/lint-config/eslint/*.cjs"})," (frozen snapshot of old behavior)"]}),"\n"]})]})}function x(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},6607(e,s,n){n.d(s,{R:()=>c,x:()=>t});var r=n(758);const i={},d=r.createContext(i);function c(e){const s=r.useContext(d);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),r.createElement(d.Provider,{value:s},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[1380],{5293(e,n,i){i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>a,frontMatter:()=>d,metadata:()=>l,toc:()=>o});const l=JSON.parse('{"id":"stylelint-migration","title":"Stylelint migration guide (pui-cli 8 \u2192 9 / Stylelint 17)","description":"This document covers Stylelint changes shipped with pui-cli 9 (Stylelint 17.x).","source":"@site/docs/stylelint-migration.md","sourceDirName":".","slug":"/stylelint-migration","permalink":"/cli/stylelint-migration","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/stylelint-migration.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Trust SSL Certificate Guide","permalink":"/cli/ssl-certificate-setup"},"next":{"title":"Usage Guide","permalink":"/cli/usage-guide"}}');var s=i(6070),t=i(6607);const d={},r="Stylelint migration guide (pui-cli 8 \u2192 9 / Stylelint 17)",c={},o=[{value:"At a glance",id:"at-a-glance",level:2},{value:"Why <code>stylelint-config-styled-components</code> was removed",id:"why-stylelint-config-styled-components-was-removed",level:2},{value:"How to upgrade a repo",id:"how-to-upgrade-a-repo",level:2},{value:"ESM config",id:"esm-config",level:3},{value:"Stylelint 17 breaking changes (summary)",id:"stylelint-17-breaking-changes-summary",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"<code>Unknown rule no-missing-end-of-source-newline</code>",id:"unknown-rule-no-missing-end-of-source-newline",level:3},{value:"<code>No rules found within configuration</code>",id:"no-rules-found-within-configuration",level:3},{value:"Styled-components files not linted",id:"styled-components-files-not-linted",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"stylelint-migration-guide-pui-cli-8--9--stylelint-17",children:"Stylelint migration guide (pui-cli 8 \u2192 9 / Stylelint 17)"})}),"\n",(0,s.jsxs)(n.p,{children:["This document covers Stylelint changes shipped with ",(0,s.jsx)(n.strong,{children:"pui-cli 9"})," (Stylelint ",(0,s.jsx)(n.strong,{children:"17.x"}),")."]}),"\n",(0,s.jsxs)(n.p,{children:["For the full pui-cli 9 upgrade path, see ",(0,s.jsx)(n.a,{href:"/cli/pui-cli-9-migration",children:"pui-cli 9 migration guide"}),"."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"at-a-glance",children:"At a glance"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Topic"}),(0,s.jsx)(n.th,{children:"Before (pui-cli 8)"}),(0,s.jsx)(n.th,{children:"After (pui-cli 9)"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Stylelint"}),(0,s.jsx)(n.td,{children:"15.x"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"17.x"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Recommended preset"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"stylelint-config-recommended@14"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"stylelint-config-recommended@18"})})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Styled-components"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"stylelint-config-styled-components"})," in ",(0,s.jsx)(n.code,{children:"extends"})]}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Removed"})," \u2014 rules inlined in shared config"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"CSS-in-JS syntax"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"stylelint-processor-styled-components"})," / processors"]}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"postcss-styled-syntax"})})," via ",(0,s.jsx)(n.code,{children:"customSyntax"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Config format"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"stylelint.config.cjs"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"stylelint.config.mjs"})})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Consumer import"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"require('@elliemae/pui-cli').stylelintConfig"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"import { stylelintConfig } from '@elliemae/pui-cli/stylelint'"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Package exports"}),(0,s.jsx)(n.td,{children:"CJS + ESM dual entry"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"ESM only"})," in pui-cli 9"]})]})]})]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsxs)(n.h2,{id:"why-stylelint-config-styled-components-was-removed",children:["Why ",(0,s.jsx)(n.code,{children:"stylelint-config-styled-components"})," was removed"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"stylelint-config-styled-components@0.1.1"})," is unmaintained and references rules removed in Stylelint 17 (for example ",(0,s.jsx)(n.code,{children:"no-missing-end-of-source-newline"}),"). That caused config load failures after the Stylelint 17 upgrade."]}),"\n",(0,s.jsx)(n.p,{children:"The shared pui-cli config now inlines the small set of rules that package provided:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Rule"}),(0,s.jsx)(n.th,{children:"Value"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"value-no-vendor-prefix"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"true"})}),(0,s.jsx)(n.td,{children:"Same as styled-components preset"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"property-no-vendor-prefix"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"true"})}),(0,s.jsx)(n.td,{children:"Same as styled-components preset"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"no-empty-source"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"null"})}),(0,s.jsx)(n.td,{children:"Styled template files may be empty"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"selector-type-no-unknown"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"null"})}),(0,s.jsx)(n.td,{children:"Allow styled-components DOM shims"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"function-no-unknown"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"null"})}),(0,s.jsx)(n.td,{children:"Allow CSS-in-JS helper functions"})]})]})]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"how-to-upgrade-a-repo",children:"How to upgrade a repo"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Upgrade ",(0,s.jsx)(n.code,{children:"@elliemae/pui-cli"})," to v9 (Stylelint 17 is bundled as a dependency)."]}),"\n",(0,s.jsx)(n.li,{children:"Replace your Stylelint config with the shared config (see below)."}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Delete"})," any local workaround that filters ",(0,s.jsx)(n.code,{children:"stylelint-config-styled-components"})," from ",(0,s.jsx)(n.code,{children:"extends"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Run ",(0,s.jsx)(n.code,{children:"pui-cli lint"})," (or ",(0,s.jsx)(n.code,{children:"pui-cli lint --css"}),")."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"esm-config",children:"ESM config"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-javascript",children:"// stylelint.config.mjs\nimport { stylelintConfig } from '@elliemae/pui-cli/stylelint';\n\nexport default stylelintConfig;\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"pui-cli lint"})," auto-detects ",(0,s.jsx)(n.code,{children:"stylelint.config.mjs"})," first, then falls back to a local ",(0,s.jsx)(n.code,{children:"stylelint.config.cjs"})," in the consumer repo (must not use ",(0,s.jsx)(n.code,{children:"require('@elliemae/pui-cli')"})," \u2014 that entry is removed in pui-cli 9)."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"stylelint-17-breaking-changes-summary",children:"Stylelint 17 breaking changes (summary)"}),"\n",(0,s.jsxs)(n.p,{children:["Stylelint 17 is ESM-only internally and requires ",(0,s.jsx)(n.strong,{children:"Node.js 20.19+"})," (pui-cli 9 requires Node 24). Notable changes that may affect CI or custom plugins:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsxs)(n.strong,{children:["Default ",(0,s.jsx)(n.code,{children:"fix"})," mode"]})," is now ",(0,s.jsx)(n.code,{children:"strict"})," (fixes only when the whole file can be safely autofixed)."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Vendor-prefix rules"})," have consistent behaviour for ",(0,s.jsx)(n.code,{children:"ignore*: []"})," options."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Removed"})," legacy CommonJS API surface (",(0,s.jsx)(n.code,{children:"output"})," on resolved results, etc.)."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Full upstream details: ",(0,s.jsx)(n.a,{href:"https://stylelint.io/migration-guide/to-17",children:"Stylelint 17 migration guide"}),"."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,s.jsx)(n.h3,{id:"unknown-rule-no-missing-end-of-source-newline",children:(0,s.jsx)(n.code,{children:"Unknown rule no-missing-end-of-source-newline"})}),"\n",(0,s.jsxs)(n.p,{children:["A dependency or local config still extends ",(0,s.jsx)(n.code,{children:"stylelint-config-styled-components"})," or sets removed rules. Remove that extend and use the pui-cli shared config."]}),"\n",(0,s.jsx)(n.h3,{id:"no-rules-found-within-configuration",children:(0,s.jsx)(n.code,{children:"No rules found within configuration"})}),"\n",(0,s.jsxs)(n.p,{children:["The Stylelint CLI must receive a config whose ",(0,s.jsx)(n.strong,{children:"default export"})," is the config object \u2014 not ",(0,s.jsx)(n.code,{children:"{ stylelintConfig: { ... } }"}),". Re-export correctly:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-javascript",children:"import { stylelintConfig } from '@elliemae/pui-cli/stylelint';\n\nexport default stylelintConfig;\n"})}),"\n",(0,s.jsx)(n.h3,{id:"styled-components-files-not-linted",children:"Styled-components files not linted"}),"\n",(0,s.jsxs)(n.p,{children:["Ensure files are included in the lint glob (",(0,s.jsx)(n.code,{children:"app/**"}),", ",(0,s.jsx)(n.code,{children:"lib/**"})," with ",(0,s.jsx)(n.code,{children:".{js,jsx,ts,tsx}"})," extensions). The shared config sets ",(0,s.jsx)(n.code,{children:"customSyntax: 'postcss-styled-syntax'"})," for CSS-in-JS."]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},6607(e,n,i){i.d(n,{R:()=>d,x:()=>r});var l=i(758);const s={},t=l.createContext(s);function d(e){const n=l.useContext(t);return l.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),l.createElement(t.Provider,{value:n},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[2960],{7488(e,t,i){i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"api/variables/prettierConfig","title":"prettierConfig","description":"","source":"@site/docs/api/variables/prettierConfig.md","sourceDirName":"api/variables","slug":"/api/variables/prettierConfig","permalink":"/cli/api/variables/prettierConfig","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/api/variables/prettierConfig.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"lintStagedConfig","permalink":"/cli/api/variables/lintStagedConfig"},"next":{"title":"stylelintConfig","permalink":"/cli/api/variables/stylelintConfig"}}');var r=i(6070),a=i(6607);const o={},s="prettierConfig",l={},c=[];function p(e){const t={code:"code",h1:"h1",header:"header",pre:"pre",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"prettierconfig",children:"prettierConfig"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ts",children:"const prettierConfig: Config;\n"})})]})}function d(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},6607(e,t,i){i.d(t,{R:()=>o,x:()=>s});var n=i(758);const r={},a=n.createContext(r);function o(e){const t=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[594],{3302(e,i,t){t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>c,default:()=>o,frontMatter:()=>l,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"api/index","title":"Cli API","description":"Functions","source":"@site/docs/api/index.md","sourceDirName":"api","slug":"/api/","permalink":"/cli/api/","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/api/index.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","next":{"title":"loadRoutes()","permalink":"/cli/api/functions/loadRoutes"}}');var s=t(6070),r=t(6607);const l={},c="Cli API",d={},a=[{value:"Functions",id:"functions",level:2},{value:"Type Aliases",id:"type-aliases",level:2},{value:"Variables",id:"variables",level:2}];function h(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"cli-api",children:"Cli API"})}),"\n",(0,s.jsx)(i.h2,{id:"functions",children:"Functions"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Function"}),(0,s.jsx)(i.th,{children:"Description"})]})}),(0,s.jsx)(i.tbody,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/functions/loadRoutes",children:"loadRoutes"})}),(0,s.jsx)(i.td,{children:"-"})]})})]}),"\n",(0,s.jsx)(i.h2,{id:"type-aliases",children:"Type Aliases"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Type Alias"}),(0,s.jsx)(i.th,{children:"Description"})]})}),(0,s.jsx)(i.tbody,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/type-aliases/LIB_NAME",children:"LIB_NAME"})}),(0,s.jsx)(i.td,{children:"-"})]})})]}),"\n",(0,s.jsx)(i.h2,{id:"variables",children:"Variables"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Variable"}),(0,s.jsx)(i.th,{children:"Description"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/babelConfig",children:"babelConfig"})}),(0,s.jsx)(i.td,{children:"-"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/commitlintConfig",children:"commitlintConfig"})}),(0,s.jsx)(i.td,{children:"-"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/eslintFlatBaseConfig",children:"eslintFlatBaseConfig"})}),(0,s.jsx)(i.td,{children:"Flat ESLint config for non-React TypeScript libraries and services."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/eslintFlatBaseConfigStrict",children:"eslintFlatBaseConfigStrict"})}),(0,s.jsxs)(i.td,{children:["Strict flat ESLint config for non-React TypeScript (",(0,s.jsx)(i.code,{children:"no-unsafe-*"})," as error)."]})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/eslintFlatConfig",children:"eslintFlatConfig"})}),(0,s.jsx)(i.td,{children:"Flat ESLint config for React + TypeScript PUI apps."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/eslintFlatConfigStrict",children:"eslintFlatConfigStrict"})}),(0,s.jsxs)(i.td,{children:["Strict flat ESLint config for React + TypeScript (errors on ",(0,s.jsx)(i.code,{children:"no-unsafe-*"})," and ",(0,s.jsx)(i.code,{children:"exhaustive-deps"}),")."]})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/jestConfig",children:"jestConfig"})}),(0,s.jsx)(i.td,{children:"-"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/jestNodeConfig",children:"jestNodeConfig"})}),(0,s.jsx)(i.td,{children:"-"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/lintStagedConfig",children:"lintStagedConfig"})}),(0,s.jsx)(i.td,{children:"-"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/prettierConfig",children:"prettierConfig"})}),(0,s.jsx)(i.td,{children:"-"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/stylelintConfig",children:"stylelintConfig"})}),(0,s.jsx)(i.td,{children:"-"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:(0,s.jsx)(i.a,{href:"/cli/api/variables/vitestConfig",children:"vitestConfig"})}),(0,s.jsx)(i.td,{children:"-"})]})]})]})]})}function o(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},6607(e,i,t){t.d(i,{R:()=>l,x:()=>c});var n=t(758);const s={},r=n.createContext(s);function l(e){const i=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[9647],{1923(e,l,a){a.r(l),a.d(l,{default:()=>n});a(758);var i=a(3526),s=a(4152),r=a(3787),u=a(389),c=a(7128),h=a(6070);function n(e){return(0,h.jsx)(r.e3,{className:(0,i.A)(s.G.wrapper.docsPages),children:(0,h.jsx)(c.A,{children:(0,u.v)(e.route.routes)})})}}}]);
@@ -1 +1 @@
1
- "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[1091],{9441(e,i,n){n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>c,default:()=>a,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"ssl-certificate-setup","title":"Trust SSL Certificate Guide","description":"This guide explains how to trust the self-signed CA certificate on different operating systems and browsers so your HTTPS connection works without warnings.","source":"@site/docs/ssl-certificate-setup.md","sourceDirName":".","slug":"/ssl-certificate-setup","permalink":"/cli/ssl-certificate-setup","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/ssl-certificate-setup.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"pui-cli 9 migration guide","permalink":"/cli/pui-cli-9-migration"},"next":{"title":"Stylelint migration guide (pui-cli 8 \u2192 9 / Stylelint 17)","permalink":"/cli/stylelint-migration"}}');var r=n(6070),l=n(6607);const t={},c="Trust SSL Certificate Guide",o={},d=[{value:"\ud83d\udccb Table of Contents",id:"-table-of-contents",level:2},{value:"\ud83c\udf4e macOS",id:"-macos",level:2},{value:"Via Keychain Access",id:"via-keychain-access",level:3},{value:"Remove Certificate from macOS",id:"remove-certificate-from-macos",level:3},{value:"\ud83e\ude9f Windows",id:"-windows",level:2},{value:"Via Certificate Manager",id:"via-certificate-manager",level:3},{value:"Remove Certificate from Windows",id:"remove-certificate-from-windows",level:3},{value:"\ud83e\udd8a Firefox (All Platforms)",id:"-firefox-all-platforms",level:2},{value:"Import Certificate to Firefox",id:"import-certificate-to-firefox",level:3},{value:"Remove Certificate from Firefox",id:"remove-certificate-from-firefox",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Still seeing &quot;Not Secure&quot; warning?",id:"still-seeing-not-secure-warning",level:3},{value:"Browser not trusting certificate?",id:"browser-not-trusting-certificate",level:3},{value:"Certificate Details",id:"certificate-details",level:2},{value:"Security Notes",id:"security-notes",level:2},{value:"Regenerate Certificates",id:"regenerate-certificates",level:2}];function h(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"trust-ssl-certificate-guide",children:"Trust SSL Certificate Guide"})}),"\n",(0,r.jsx)(i.p,{children:"This guide explains how to trust the self-signed CA certificate on different operating systems and browsers so your HTTPS connection works without warnings."}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"-table-of-contents",children:"\ud83d\udccb Table of Contents"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"#-macos",children:"macOS"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"#-windows",children:"Windows"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"#-firefox-all-platforms",children:"Firefox (All Platforms)"})}),"\n"]}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"-macos",children:"\ud83c\udf4e macOS"}),"\n",(0,r.jsx)(i.h3,{id:"via-keychain-access",children:"Via Keychain Access"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Locate the certificate file:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Open Finder and navigate to the ",(0,r.jsx)(i.code,{children:"certs"})," folder"]}),"\n",(0,r.jsxs)(i.li,{children:["Find the file ",(0,r.jsx)(i.code,{children:"ca-cert.pem"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Import the certificate:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Double-click"})," ",(0,r.jsx)(i.code,{children:"ca-cert.pem"})]}),"\n",(0,r.jsxs)(i.li,{children:["In the popup dialog, select ",(0,r.jsx)(i.strong,{children:'"login"'})," keychain"]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Add"'})]}),"\n",(0,r.jsx)(i.li,{children:"Enter your macOS password if prompted"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Trust the certificate:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Press ",(0,r.jsx)(i.code,{children:"Cmd + Space"})," and type ",(0,r.jsx)(i.strong,{children:'"Keychain Access"'})," to open the app"]}),"\n",(0,r.jsxs)(i.li,{children:["In the left sidebar, click ",(0,r.jsx)(i.strong,{children:'"login"'})," keychain"]}),"\n",(0,r.jsxs)(i.li,{children:["In the bottom-left category selector, choose ",(0,r.jsx)(i.strong,{children:'"Certificates"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Search for ",(0,r.jsx)(i.strong,{children:'"localhost"'})," in the search box (top right)"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Set trust level:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Double-click"}),' the "localhost" certificate']}),"\n",(0,r.jsxs)(i.li,{children:["Click the ",(0,r.jsx)(i.strong,{children:"\u25b6 triangle"})," next to ",(0,r.jsx)(i.strong,{children:'"Trust"'})," to expand the section"]}),"\n",(0,r.jsxs)(i.li,{children:["Change ",(0,r.jsx)(i.strong,{children:'"When using this certificate"'})," dropdown to ",(0,r.jsx)(i.strong,{children:'"Always Trust"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Optionally, set ",(0,r.jsx)(i.strong,{children:'"Secure Sockets Layer (SSL)"'})," to ",(0,r.jsx)(i.strong,{children:'"Always Trust"'})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Save changes:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Close the certificate window"}),"\n",(0,r.jsx)(i.li,{children:"Enter your macOS password when prompted"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Restart your browser"})," (important!)"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Test:"})," Visit ",(0,r.jsx)(i.code,{children:"https://localhost:8443"})," - should show secure! \ud83d\udd12"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"remove-certificate-from-macos",children:"Remove Certificate from macOS"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Via Keychain Access:"})}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"Open Keychain Access"}),"\n",(0,r.jsx)(i.li,{children:'Find "localhost" certificate'}),"\n",(0,r.jsxs)(i.li,{children:["Right-click \u2192 ",(0,r.jsx)(i.strong,{children:'Delete "localhost"'})]}),"\n",(0,r.jsx)(i.li,{children:"Enter password"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Via Command Line:"})}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-bash",children:'# From login keychain\nsecurity delete-certificate -c "localhost" ~/Library/Keychains/login.keychain-db\n'})}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"-windows",children:"\ud83e\ude9f Windows"}),"\n",(0,r.jsx)(i.h3,{id:"via-certificate-manager",children:"Via Certificate Manager"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Open Certificate Manager:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Press ",(0,r.jsx)(i.code,{children:"Win + R"})," to open Run dialog"]}),"\n",(0,r.jsxs)(i.li,{children:["Type ",(0,r.jsx)(i.code,{children:"certmgr.msc"})," and press Enter"]}),"\n",(0,r.jsx)(i.li,{children:'Or search for "Manage user certificates" in Start menu'}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Import the certificate:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In the left panel, expand ",(0,r.jsx)(i.strong,{children:'"Trusted Root Certification Authorities"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Right-click on ",(0,r.jsx)(i.strong,{children:'"Certificates"'})," folder"]}),"\n",(0,r.jsxs)(i.li,{children:["Select ",(0,r.jsx)(i.strong,{children:"Action"})," \u2192 ",(0,r.jsx)(i.strong,{children:"All Tasks"})," \u2192 ",(0,r.jsx)(i.strong,{children:"Import..."})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Certificate Import Wizard:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Next"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Browse..."'})," and navigate to your ",(0,r.jsx)(i.code,{children:"certs"})," folder"]}),"\n",(0,r.jsxs)(i.li,{children:["Change file type filter to ",(0,r.jsxs)(i.strong,{children:['"All Files (',(0,r.jsx)(i.em,{children:"."}),')"']})]}),"\n",(0,r.jsxs)(i.li,{children:["Select ",(0,r.jsx)(i.strong,{children:(0,r.jsx)(i.code,{children:"ca-cert.pem"})})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Open"'})," then ",(0,r.jsx)(i.strong,{children:'"Next"'})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Choose certificate store:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Select ",(0,r.jsx)(i.strong,{children:'"Place all certificates in the following store"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Ensure it says ",(0,r.jsx)(i.strong,{children:'"Trusted Root Certification Authorities"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Next"'})," then ",(0,r.jsx)(i.strong,{children:'"Finish"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"OK"'})," on the success message"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Verify installation:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In Certificate Manager, navigate to ",(0,r.jsx)(i.strong,{children:'"Trusted Root Certification Authorities"'})," \u2192 ",(0,r.jsx)(i.strong,{children:'"Certificates"'})]}),"\n",(0,r.jsx)(i.li,{children:'You should see "localhost" or "Development" in the list'}),"\n",(0,r.jsx)(i.li,{children:"Double-click to view details"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Restart your browser"})," (close all windows completely)"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Test:"})," Visit ",(0,r.jsx)(i.code,{children:"https://localhost:8443"})," - should show secure! \ud83d\udd12"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"remove-certificate-from-windows",children:"Remove Certificate from Windows"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["Open Certificate Manager (",(0,r.jsx)(i.code,{children:"certmgr.msc"}),")"]}),"\n",(0,r.jsxs)(i.li,{children:["Navigate to ",(0,r.jsx)(i.strong,{children:'"Trusted Root Certification Authorities"'})," \u2192 ",(0,r.jsx)(i.strong,{children:'"Certificates"'})]}),"\n",(0,r.jsx)(i.li,{children:'Find "localhost" certificate'}),"\n",(0,r.jsxs)(i.li,{children:["Right-click \u2192 ",(0,r.jsx)(i.strong,{children:"Delete"})]}),"\n",(0,r.jsx)(i.li,{children:"Confirm deletion"}),"\n"]}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"-firefox-all-platforms",children:"\ud83e\udd8a Firefox (All Platforms)"}),"\n",(0,r.jsx)(i.p,{children:"Firefox uses its own certificate store, independent of the operating system."}),"\n",(0,r.jsx)(i.h3,{id:"import-certificate-to-firefox",children:"Import Certificate to Firefox"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Open Firefox Settings:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Click menu (\u2630) \u2192 ",(0,r.jsx)(i.strong,{children:"Settings"})]}),"\n",(0,r.jsxs)(i.li,{children:["Or type ",(0,r.jsx)(i.code,{children:"about:preferences"})," in the address bar"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Navigate to Privacy & Security:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Privacy & Security"'})," in the left sidebar"]}),"\n",(0,r.jsxs)(i.li,{children:["Or go directly to ",(0,r.jsx)(i.code,{children:"about:preferences#privacy"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Access Certificates:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Scroll down to the ",(0,r.jsx)(i.strong,{children:'"Security"'})," section"]}),"\n",(0,r.jsxs)(i.li,{children:["Find ",(0,r.jsx)(i.strong,{children:'"Certificates"'})," heading"]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"View Certificates..."'})," button"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Import CA Certificate:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In the Certificate Manager window, click the ",(0,r.jsx)(i.strong,{children:'"Authorities"'})," tab"]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Import..."'})," button"]}),"\n",(0,r.jsxs)(i.li,{children:["Navigate to your ",(0,r.jsx)(i.code,{children:"certs"})," folder"]}),"\n",(0,r.jsxs)(i.li,{children:["Select ",(0,r.jsx)(i.strong,{children:(0,r.jsx)(i.code,{children:"ca-cert.pem"})})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Open"'})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Set trust options:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In the popup dialog, check:","\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["\u2705 ",(0,r.jsx)(i.strong,{children:'"Trust this CA to identify websites"'})]}),"\n",(0,r.jsxs)(i.li,{children:["\u2705 ",(0,r.jsx)(i.strong,{children:'"Trust this CA to identify email users"'})," (optional)"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"OK"'})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Verify import:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In the Authorities tab, look for ",(0,r.jsx)(i.strong,{children:'"Development"'})," or organization name"]}),"\n",(0,r.jsx)(i.li,{children:'Expand it to find "localhost"'}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Close and restart Firefox"})}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Test:"})," Visit ",(0,r.jsx)(i.code,{children:"https://localhost:8443"})," - should show secure! \ud83d\udd12"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"remove-certificate-from-firefox",children:"Remove Certificate from Firefox"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["Go to ",(0,r.jsx)(i.code,{children:"about:preferences#privacy"})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"View Certificates"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Authorities"'})," tab"]}),"\n",(0,r.jsxs)(i.li,{children:["Find ",(0,r.jsx)(i.strong,{children:'"Development"'})," \u2192 ",(0,r.jsx)(i.strong,{children:'"localhost"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Select it and click ",(0,r.jsx)(i.strong,{children:'"Delete or Distrust..."'})]}),"\n",(0,r.jsx)(i.li,{children:"Confirm deletion"}),"\n"]}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,r.jsx)(i.h3,{id:"still-seeing-not-secure-warning",children:'Still seeing "Not Secure" warning?'}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Restart your browser"})," - Browsers cache certificate trust settings"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Check the certificate is in login keychain"})," - Look in Keychain Access"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Verify trust settings"}),' - Must be set to "Always Trust"']}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Clear browser cache"})," - Especially SSL state"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Check hostname"})," - Must use ",(0,r.jsx)(i.code,{children:"localhost"}),", not ",(0,r.jsx)(i.code,{children:"127.0.0.1"})]}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"browser-not-trusting-certificate",children:"Browser not trusting certificate?"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Chrome/Edge (Windows):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"These browsers use the Windows certificate store"}),"\n",(0,r.jsx)(i.li,{children:'Make sure you imported to "Trusted Root Certification Authorities"'}),"\n",(0,r.jsx)(i.li,{children:"Restart the browser completely"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Chrome/Safari (macOS):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"These browsers use the macOS Keychain"}),"\n",(0,r.jsx)(i.li,{children:'Make sure certificate is in "login" keychain'}),"\n",(0,r.jsx)(i.li,{children:'Trust must be set to "Always Trust"'}),"\n",(0,r.jsx)(i.li,{children:"Restart the browser completely"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Firefox (All Platforms):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Firefox has its own certificate store"}),"\n",(0,r.jsxs)(i.li,{children:["See ",(0,r.jsx)(i.a,{href:"#firefox-all-platforms",children:"Firefox section"})," above"]}),"\n",(0,r.jsx)(i.li,{children:"Must import the certificate directly into Firefox"}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"certificate-details",children:"Certificate Details"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"CA Certificate (ca-cert.pem):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Type: Root CA Certificate"}),"\n",(0,r.jsx)(i.li,{children:"Validity: 5 years (1825 days)"}),"\n",(0,r.jsx)(i.li,{children:"Purpose: Sign server certificates"}),"\n",(0,r.jsx)(i.li,{children:"Trust: Add to system trust store"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Server Certificate (cert.pem):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Type: Server Certificate"}),"\n",(0,r.jsx)(i.li,{children:"Validity: 2+ years (825 days)"}),"\n",(0,r.jsx)(i.li,{children:"Signed by: Our CA"}),"\n",(0,r.jsx)(i.li,{children:"Hostnames: localhost, *.localhost, 127.0.0.1"}),"\n",(0,r.jsx)(i.li,{children:"Purpose: HTTPS server"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Private Keys:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"ca-key.pem"}),": CA private key (password protected)"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"key.pem"}),": Server private key (no password for convenience)"]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"security-notes",children:"Security Notes"}),"\n",(0,r.jsxs)(i.p,{children:["\u26a0\ufe0f ",(0,r.jsx)(i.strong,{children:"These certificates are for local development only!"})]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Never use these certificates in production"}),"\n",(0,r.jsxs)(i.li,{children:["Keep ",(0,r.jsx)(i.code,{children:"ca-key.pem"})," secure (it can sign certificates)"]}),"\n",(0,r.jsxs)(i.li,{children:["The CA password is: ",(0,r.jsx)(i.code,{children:"uiplatform"})," (change if needed)"]}),"\n",(0,r.jsx)(i.li,{children:"Don't commit private keys to version control"}),"\n",(0,r.jsxs)(i.li,{children:["Add to ",(0,r.jsx)(i.code,{children:".gitignore"}),": ",(0,r.jsx)(i.code,{children:"*.pem"}),", ",(0,r.jsx)(i.code,{children:"*.key"})]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"regenerate-certificates",children:"Regenerate Certificates"}),"\n",(0,r.jsx)(i.p,{children:"If you need to regenerate the certificates:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-bash",children:"cd ssl\n./generate-certs.sh\n"})}),"\n",(0,r.jsx)(i.p,{children:"Then re-trust the new CA certificate using the steps above."})]})}function a(e={}){const{wrapper:i}={...(0,l.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},6607(e,i,n){n.d(i,{R:()=>t,x:()=>c});var s=n(758);const r={},l=s.createContext(r);function t(e){const i=s.useContext(l);return s.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]);
1
+ "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[1091],{5882(e,i,n){n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>c,default:()=>a,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"ssl-certificate-setup","title":"Trust SSL Certificate Guide","description":"This guide explains how to trust the self-signed CA certificate on different operating systems and browsers so your HTTPS connection works without warnings.","source":"@site/docs/ssl-certificate-setup.md","sourceDirName":".","slug":"/ssl-certificate-setup","permalink":"/cli/ssl-certificate-setup","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/ssl-certificate-setup.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"pui-cli 9 migration guide","permalink":"/cli/pui-cli-9-migration"},"next":{"title":"Stylelint migration guide (pui-cli 8 \u2192 9 / Stylelint 17)","permalink":"/cli/stylelint-migration"}}');var r=n(6070),l=n(6607);const t={},c="Trust SSL Certificate Guide",o={},d=[{value:"\ud83d\udccb Table of Contents",id:"-table-of-contents",level:2},{value:"\ud83c\udf4e macOS",id:"-macos",level:2},{value:"Via Keychain Access",id:"via-keychain-access",level:3},{value:"Remove Certificate from macOS",id:"remove-certificate-from-macos",level:3},{value:"\ud83e\ude9f Windows",id:"-windows",level:2},{value:"Via Certificate Manager",id:"via-certificate-manager",level:3},{value:"Remove Certificate from Windows",id:"remove-certificate-from-windows",level:3},{value:"\ud83e\udd8a Firefox (All Platforms)",id:"-firefox-all-platforms",level:2},{value:"Import Certificate to Firefox",id:"import-certificate-to-firefox",level:3},{value:"Remove Certificate from Firefox",id:"remove-certificate-from-firefox",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Still seeing &quot;Not Secure&quot; warning?",id:"still-seeing-not-secure-warning",level:3},{value:"Browser not trusting certificate?",id:"browser-not-trusting-certificate",level:3},{value:"Certificate Details",id:"certificate-details",level:2},{value:"Security Notes",id:"security-notes",level:2},{value:"Regenerate Certificates",id:"regenerate-certificates",level:2}];function h(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"trust-ssl-certificate-guide",children:"Trust SSL Certificate Guide"})}),"\n",(0,r.jsx)(i.p,{children:"This guide explains how to trust the self-signed CA certificate on different operating systems and browsers so your HTTPS connection works without warnings."}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"-table-of-contents",children:"\ud83d\udccb Table of Contents"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"#-macos",children:"macOS"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"#-windows",children:"Windows"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"#-firefox-all-platforms",children:"Firefox (All Platforms)"})}),"\n"]}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"-macos",children:"\ud83c\udf4e macOS"}),"\n",(0,r.jsx)(i.h3,{id:"via-keychain-access",children:"Via Keychain Access"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Locate the certificate file:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Open Finder and navigate to the ",(0,r.jsx)(i.code,{children:"certs"})," folder"]}),"\n",(0,r.jsxs)(i.li,{children:["Find the file ",(0,r.jsx)(i.code,{children:"ca-cert.pem"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Import the certificate:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Double-click"})," ",(0,r.jsx)(i.code,{children:"ca-cert.pem"})]}),"\n",(0,r.jsxs)(i.li,{children:["In the popup dialog, select ",(0,r.jsx)(i.strong,{children:'"login"'})," keychain"]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Add"'})]}),"\n",(0,r.jsx)(i.li,{children:"Enter your macOS password if prompted"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Trust the certificate:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Press ",(0,r.jsx)(i.code,{children:"Cmd + Space"})," and type ",(0,r.jsx)(i.strong,{children:'"Keychain Access"'})," to open the app"]}),"\n",(0,r.jsxs)(i.li,{children:["In the left sidebar, click ",(0,r.jsx)(i.strong,{children:'"login"'})," keychain"]}),"\n",(0,r.jsxs)(i.li,{children:["In the bottom-left category selector, choose ",(0,r.jsx)(i.strong,{children:'"Certificates"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Search for ",(0,r.jsx)(i.strong,{children:'"localhost"'})," in the search box (top right)"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Set trust level:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Double-click"}),' the "localhost" certificate']}),"\n",(0,r.jsxs)(i.li,{children:["Click the ",(0,r.jsx)(i.strong,{children:"\u25b6 triangle"})," next to ",(0,r.jsx)(i.strong,{children:'"Trust"'})," to expand the section"]}),"\n",(0,r.jsxs)(i.li,{children:["Change ",(0,r.jsx)(i.strong,{children:'"When using this certificate"'})," dropdown to ",(0,r.jsx)(i.strong,{children:'"Always Trust"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Optionally, set ",(0,r.jsx)(i.strong,{children:'"Secure Sockets Layer (SSL)"'})," to ",(0,r.jsx)(i.strong,{children:'"Always Trust"'})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Save changes:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Close the certificate window"}),"\n",(0,r.jsx)(i.li,{children:"Enter your macOS password when prompted"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Restart your browser"})," (important!)"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Test:"})," Visit ",(0,r.jsx)(i.code,{children:"https://localhost:8443"})," - should show secure! \ud83d\udd12"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"remove-certificate-from-macos",children:"Remove Certificate from macOS"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Via Keychain Access:"})}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"Open Keychain Access"}),"\n",(0,r.jsx)(i.li,{children:'Find "localhost" certificate'}),"\n",(0,r.jsxs)(i.li,{children:["Right-click \u2192 ",(0,r.jsx)(i.strong,{children:'Delete "localhost"'})]}),"\n",(0,r.jsx)(i.li,{children:"Enter password"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Via Command Line:"})}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-bash",children:'# From login keychain\nsecurity delete-certificate -c "localhost" ~/Library/Keychains/login.keychain-db\n'})}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"-windows",children:"\ud83e\ude9f Windows"}),"\n",(0,r.jsx)(i.h3,{id:"via-certificate-manager",children:"Via Certificate Manager"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Open Certificate Manager:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Press ",(0,r.jsx)(i.code,{children:"Win + R"})," to open Run dialog"]}),"\n",(0,r.jsxs)(i.li,{children:["Type ",(0,r.jsx)(i.code,{children:"certmgr.msc"})," and press Enter"]}),"\n",(0,r.jsx)(i.li,{children:'Or search for "Manage user certificates" in Start menu'}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Import the certificate:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In the left panel, expand ",(0,r.jsx)(i.strong,{children:'"Trusted Root Certification Authorities"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Right-click on ",(0,r.jsx)(i.strong,{children:'"Certificates"'})," folder"]}),"\n",(0,r.jsxs)(i.li,{children:["Select ",(0,r.jsx)(i.strong,{children:"Action"})," \u2192 ",(0,r.jsx)(i.strong,{children:"All Tasks"})," \u2192 ",(0,r.jsx)(i.strong,{children:"Import..."})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Certificate Import Wizard:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Next"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Browse..."'})," and navigate to your ",(0,r.jsx)(i.code,{children:"certs"})," folder"]}),"\n",(0,r.jsxs)(i.li,{children:["Change file type filter to ",(0,r.jsxs)(i.strong,{children:['"All Files (',(0,r.jsx)(i.em,{children:"."}),')"']})]}),"\n",(0,r.jsxs)(i.li,{children:["Select ",(0,r.jsx)(i.strong,{children:(0,r.jsx)(i.code,{children:"ca-cert.pem"})})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Open"'})," then ",(0,r.jsx)(i.strong,{children:'"Next"'})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Choose certificate store:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Select ",(0,r.jsx)(i.strong,{children:'"Place all certificates in the following store"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Ensure it says ",(0,r.jsx)(i.strong,{children:'"Trusted Root Certification Authorities"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Next"'})," then ",(0,r.jsx)(i.strong,{children:'"Finish"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"OK"'})," on the success message"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Verify installation:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In Certificate Manager, navigate to ",(0,r.jsx)(i.strong,{children:'"Trusted Root Certification Authorities"'})," \u2192 ",(0,r.jsx)(i.strong,{children:'"Certificates"'})]}),"\n",(0,r.jsx)(i.li,{children:'You should see "localhost" or "Development" in the list'}),"\n",(0,r.jsx)(i.li,{children:"Double-click to view details"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Restart your browser"})," (close all windows completely)"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Test:"})," Visit ",(0,r.jsx)(i.code,{children:"https://localhost:8443"})," - should show secure! \ud83d\udd12"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"remove-certificate-from-windows",children:"Remove Certificate from Windows"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["Open Certificate Manager (",(0,r.jsx)(i.code,{children:"certmgr.msc"}),")"]}),"\n",(0,r.jsxs)(i.li,{children:["Navigate to ",(0,r.jsx)(i.strong,{children:'"Trusted Root Certification Authorities"'})," \u2192 ",(0,r.jsx)(i.strong,{children:'"Certificates"'})]}),"\n",(0,r.jsx)(i.li,{children:'Find "localhost" certificate'}),"\n",(0,r.jsxs)(i.li,{children:["Right-click \u2192 ",(0,r.jsx)(i.strong,{children:"Delete"})]}),"\n",(0,r.jsx)(i.li,{children:"Confirm deletion"}),"\n"]}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"-firefox-all-platforms",children:"\ud83e\udd8a Firefox (All Platforms)"}),"\n",(0,r.jsx)(i.p,{children:"Firefox uses its own certificate store, independent of the operating system."}),"\n",(0,r.jsx)(i.h3,{id:"import-certificate-to-firefox",children:"Import Certificate to Firefox"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Open Firefox Settings:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Click menu (\u2630) \u2192 ",(0,r.jsx)(i.strong,{children:"Settings"})]}),"\n",(0,r.jsxs)(i.li,{children:["Or type ",(0,r.jsx)(i.code,{children:"about:preferences"})," in the address bar"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Navigate to Privacy & Security:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Privacy & Security"'})," in the left sidebar"]}),"\n",(0,r.jsxs)(i.li,{children:["Or go directly to ",(0,r.jsx)(i.code,{children:"about:preferences#privacy"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Access Certificates:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Scroll down to the ",(0,r.jsx)(i.strong,{children:'"Security"'})," section"]}),"\n",(0,r.jsxs)(i.li,{children:["Find ",(0,r.jsx)(i.strong,{children:'"Certificates"'})," heading"]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"View Certificates..."'})," button"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Import CA Certificate:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In the Certificate Manager window, click the ",(0,r.jsx)(i.strong,{children:'"Authorities"'})," tab"]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Import..."'})," button"]}),"\n",(0,r.jsxs)(i.li,{children:["Navigate to your ",(0,r.jsx)(i.code,{children:"certs"})," folder"]}),"\n",(0,r.jsxs)(i.li,{children:["Select ",(0,r.jsx)(i.strong,{children:(0,r.jsx)(i.code,{children:"ca-cert.pem"})})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Open"'})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Set trust options:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In the popup dialog, check:","\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["\u2705 ",(0,r.jsx)(i.strong,{children:'"Trust this CA to identify websites"'})]}),"\n",(0,r.jsxs)(i.li,{children:["\u2705 ",(0,r.jsx)(i.strong,{children:'"Trust this CA to identify email users"'})," (optional)"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"OK"'})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Verify import:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["In the Authorities tab, look for ",(0,r.jsx)(i.strong,{children:'"Development"'})," or organization name"]}),"\n",(0,r.jsx)(i.li,{children:'Expand it to find "localhost"'}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Close and restart Firefox"})}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Test:"})," Visit ",(0,r.jsx)(i.code,{children:"https://localhost:8443"})," - should show secure! \ud83d\udd12"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"remove-certificate-from-firefox",children:"Remove Certificate from Firefox"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:["Go to ",(0,r.jsx)(i.code,{children:"about:preferences#privacy"})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"View Certificates"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Click ",(0,r.jsx)(i.strong,{children:'"Authorities"'})," tab"]}),"\n",(0,r.jsxs)(i.li,{children:["Find ",(0,r.jsx)(i.strong,{children:'"Development"'})," \u2192 ",(0,r.jsx)(i.strong,{children:'"localhost"'})]}),"\n",(0,r.jsxs)(i.li,{children:["Select it and click ",(0,r.jsx)(i.strong,{children:'"Delete or Distrust..."'})]}),"\n",(0,r.jsx)(i.li,{children:"Confirm deletion"}),"\n"]}),"\n",(0,r.jsx)(i.hr,{}),"\n",(0,r.jsx)(i.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,r.jsx)(i.h3,{id:"still-seeing-not-secure-warning",children:'Still seeing "Not Secure" warning?'}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Restart your browser"})," - Browsers cache certificate trust settings"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Check the certificate is in login keychain"})," - Look in Keychain Access"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Verify trust settings"}),' - Must be set to "Always Trust"']}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Clear browser cache"})," - Especially SSL state"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Check hostname"})," - Must use ",(0,r.jsx)(i.code,{children:"localhost"}),", not ",(0,r.jsx)(i.code,{children:"127.0.0.1"})]}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"browser-not-trusting-certificate",children:"Browser not trusting certificate?"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Chrome/Edge (Windows):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"These browsers use the Windows certificate store"}),"\n",(0,r.jsx)(i.li,{children:'Make sure you imported to "Trusted Root Certification Authorities"'}),"\n",(0,r.jsx)(i.li,{children:"Restart the browser completely"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Chrome/Safari (macOS):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"These browsers use the macOS Keychain"}),"\n",(0,r.jsx)(i.li,{children:'Make sure certificate is in "login" keychain'}),"\n",(0,r.jsx)(i.li,{children:'Trust must be set to "Always Trust"'}),"\n",(0,r.jsx)(i.li,{children:"Restart the browser completely"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Firefox (All Platforms):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Firefox has its own certificate store"}),"\n",(0,r.jsxs)(i.li,{children:["See ",(0,r.jsx)(i.a,{href:"#firefox-all-platforms",children:"Firefox section"})," above"]}),"\n",(0,r.jsx)(i.li,{children:"Must import the certificate directly into Firefox"}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"certificate-details",children:"Certificate Details"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"CA Certificate (ca-cert.pem):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Type: Root CA Certificate"}),"\n",(0,r.jsx)(i.li,{children:"Validity: 5 years (1825 days)"}),"\n",(0,r.jsx)(i.li,{children:"Purpose: Sign server certificates"}),"\n",(0,r.jsx)(i.li,{children:"Trust: Add to system trust store"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Server Certificate (cert.pem):"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Type: Server Certificate"}),"\n",(0,r.jsx)(i.li,{children:"Validity: 2+ years (825 days)"}),"\n",(0,r.jsx)(i.li,{children:"Signed by: Our CA"}),"\n",(0,r.jsx)(i.li,{children:"Hostnames: localhost, *.localhost, 127.0.0.1"}),"\n",(0,r.jsx)(i.li,{children:"Purpose: HTTPS server"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.strong,{children:"Private Keys:"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"ca-key.pem"}),": CA private key (password protected)"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"key.pem"}),": Server private key (no password for convenience)"]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"security-notes",children:"Security Notes"}),"\n",(0,r.jsxs)(i.p,{children:["\u26a0\ufe0f ",(0,r.jsx)(i.strong,{children:"These certificates are for local development only!"})]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Never use these certificates in production"}),"\n",(0,r.jsxs)(i.li,{children:["Keep ",(0,r.jsx)(i.code,{children:"ca-key.pem"})," secure (it can sign certificates)"]}),"\n",(0,r.jsxs)(i.li,{children:["The CA password is: ",(0,r.jsx)(i.code,{children:"uiplatform"})," (change if needed)"]}),"\n",(0,r.jsx)(i.li,{children:"Don't commit private keys to version control"}),"\n",(0,r.jsxs)(i.li,{children:["Add to ",(0,r.jsx)(i.code,{children:".gitignore"}),": ",(0,r.jsx)(i.code,{children:"*.pem"}),", ",(0,r.jsx)(i.code,{children:"*.key"})]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"regenerate-certificates",children:"Regenerate Certificates"}),"\n",(0,r.jsx)(i.p,{children:"If you need to regenerate the certificates:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-bash",children:"cd ssl\n./generate-certs.sh\n"})}),"\n",(0,r.jsx)(i.p,{children:"Then re-trust the new CA certificate using the steps above."})]})}function a(e={}){const{wrapper:i}={...(0,l.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},6607(e,i,n){n.d(i,{R:()=>t,x:()=>c});var s=n(758);const r={},l=s.createContext(r);function t(e){const i=s.useContext(l);return s.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[2113],{4334(e,s,t){t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>x,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"api/variables/lintStagedConfig","title":"lintStagedConfig","description":"Type Declaration","source":"@site/docs/api/variables/lintStagedConfig.md","sourceDirName":"api/variables","slug":"/api/variables/lintStagedConfig","permalink":"/cli/api/variables/lintStagedConfig","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/api/variables/lintStagedConfig.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"jestNodeConfig","permalink":"/cli/api/variables/jestNodeConfig"},"next":{"title":"prettierConfig","permalink":"/cli/api/variables/prettierConfig"}}');var i=t(6070),l=t(6607);const r={},a="lintStagedConfig",d={},c=[{value:"Type Declaration",id:"type-declaration",level:2},{value:"*.{js,ts,jsx,tsx,md,mdx,html,css,json}",id:"jstsjsxtsxmdmdxhtmlcssjson",level:4},{value:"*.{js,ts,jsx,tsx}",id:"jstsjsxtsx",level:4},{value:"Parameters",id:"parameters",level:5},{value:"files",id:"files",level:6},{value:"Returns",id:"returns",level:5},{value:"*.{ts,tsx}",id:"tstsx",level:4},{value:"Parameters",id:"parameters-1",level:5},{value:"files",id:"files-1",level:6},{value:"Returns",id:"returns-1",level:5}];function o(e){const s={code:"code",h1:"h1",h2:"h2",h4:"h4",h5:"h5",h6:"h6",header:"header",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"lintstagedconfig",children:"lintStagedConfig"})}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-ts",children:"const lintStagedConfig: {\n *.{js,ts,jsx,tsx,md,mdx,html,css,json}: string[];\n *.{js,ts,jsx,tsx}: (files: any) => string[];\n *.{ts,tsx}: (files: any) => string[];\n};\n"})}),"\n",(0,i.jsx)(s.h2,{id:"type-declaration",children:"Type Declaration"}),"\n",(0,i.jsx)(s.h4,{id:"jstsjsxtsxmdmdxhtmlcssjson",children:"*.{js,ts,jsx,tsx,md,mdx,html,css,json}"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-ts",children:"*.{js,ts,jsx,tsx,md,mdx,html,css,json}: string[];\n"})}),"\n",(0,i.jsx)(s.h4,{id:"jstsjsxtsx",children:"*.{js,ts,jsx,tsx}"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-ts",children:"*.{js,ts,jsx,tsx}: (files: any) => string[];\n"})}),"\n",(0,i.jsx)(s.h5,{id:"parameters",children:"Parameters"}),"\n",(0,i.jsx)(s.h6,{id:"files",children:"files"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"any"})}),"\n",(0,i.jsx)(s.h5,{id:"returns",children:"Returns"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"string"}),"[]"]}),"\n",(0,i.jsx)(s.h4,{id:"tstsx",children:"*.{ts,tsx}"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-ts",children:"*.{ts,tsx}: (files: any) => string[];\n"})}),"\n",(0,i.jsx)(s.h5,{id:"parameters-1",children:"Parameters"}),"\n",(0,i.jsx)(s.h6,{id:"files-1",children:"files"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"any"})}),"\n",(0,i.jsx)(s.h5,{id:"returns-1",children:"Returns"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"string"}),"[]"]})]})}function x(e={}){const{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},6607(e,s,t){t.d(s,{R:()=>r,x:()=>a});var n=t(758);const i={},l=n.createContext(i);function r(e){const s=n.useContext(l);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(l.Provider,{value:s},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(globalThis.webpackChunk_elliemae_pui_cli=globalThis.webpackChunk_elliemae_pui_cli||[]).push([[6688],{5583(e,n,s){s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>t,default:()=>c,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"api/variables/jestNodeConfig","title":"jestNodeConfig","description":"Type Declaration","source":"@site/docs/api/variables/jestNodeConfig.md","sourceDirName":"api/variables","slug":"/api/variables/jestNodeConfig","permalink":"/cli/api/variables/jestNodeConfig","draft":false,"unlisted":false,"editUrl":"https://git.elliemae.io/platform-ui/pui-cli.git/docs/api/variables/jestNodeConfig.md","tags":[],"version":"current","frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"jestConfig","permalink":"/cli/api/variables/jestConfig"},"next":{"title":"lintStagedConfig","permalink":"/cli/api/variables/lintStagedConfig"}}');var a=s(6070),l=s(6607);const i={},t="jestNodeConfig",o={},d=[{value:"Type Declaration",id:"type-declaration",level:2},{value:"collectCoverageFrom",id:"collectcoveragefrom",level:3},{value:"coverageDirectory",id:"coveragedirectory",level:3},{value:"coverageReporters",id:"coveragereporters",level:3},{value:"coverageThreshold",id:"coveragethreshold",level:3},{value:"globals",id:"globals",level:3},{value:"globals.__webpack_public_path__",id:"globals__webpack_public_path__",level:4},{value:"globals.APP_CONFIG",id:"globalsapp_config",level:4},{value:"moduleDirectories",id:"moduledirectories",level:3},{value:"moduleFileExtensions",id:"modulefileextensions",level:3},{value:"moduleNameMapper",id:"modulenamemapper",level:3},{value:"moduleNameMapper..*.(css|scss)$",id:"modulenamemappercssscss",level:4},{value:"moduleNameMapper..*.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|ico)$",id:"modulenamemapperjpgjpegpnggifeototfwebpttfwoffwoff2mp4webmwavmp3m4aaacogaico",level:4},{value:"moduleNameMapper..*.html(?:?[a-zA-Z]+)?$",id:"modulenamemapperhtmla-za-z",level:4},{value:"moduleNameMapper..*.svg(?:?[a-zA-Z]+)?$",id:"modulenamemappersvga-za-z",level:4},{value:"moduleNameMapper..*\\webpack-hmr(.[t|j]s)?$",id:"modulenamemapperwebpack-hmrtjs",level:4},{value:"moduleNameMapper..*frame.html(?:?[a-zA-Z]+)?$",id:"modulenamemapperframehtmla-za-z",level:4},{value:"moduleNameMapper..*iframe.html(?:?[a-zA-Z]+)?$",id:"modulenamemapperiframehtmla-za-z",level:4},{value:"moduleNameMapper.@elliemae/pui-app-loader",id:"modulenamemapperelliemaepui-app-loader",level:4},{value:"moduleNameMapper.@elliemae/pui-diagnostics",id:"modulenamemapperelliemaepui-diagnostics",level:4},{value:"moduleNameMapper.@elliemae/pui-logrocket",id:"modulenamemapperelliemaepui-logrocket",level:4},{value:"moduleNameMapper.@elliemae/pui-user-monitoring",id:"modulenamemapperelliemaepui-user-monitoring",level:4},{value:"moduleNameMapper.^d3-(.*)$",id:"modulenamemapperd3-",level:4},{value:"moduleNameMapper.d3",id:"modulenamemapperd3",level:4},{value:"moduleNameMapper.react-spring/renderprops",id:"modulenamemapperreact-springrenderprops",level:4},{value:"moduleNameMapper.react-spring/web",id:"modulenamemapperreact-springweb",level:4},{value:"resolver",id:"resolver",level:3},{value:"setupFiles",id:"setupfiles",level:3},{value:"setupFilesAfterEnv",id:"setupfilesafterenv",level:3},{value:"snapshotSerializers",id:"snapshotserializers",level:3},{value:"testEnvironment",id:"testenvironment",level:3},{value:"testEnvironmentOptions",id:"testenvironmentoptions",level:3},{value:"testEnvironmentOptions.resources",id:"testenvironmentoptionsresources",level:4},{value:"testEnvironmentOptions.url",id:"testenvironmentoptionsurl",level:4},{value:"testRegex",id:"testregex",level:3},{value:"testResultsProcessor",id:"testresultsprocessor",level:3},{value:"testTimeout",id:"testtimeout",level:3},{value:"transform",id:"transform",level:3},{value:"transform.^.+.[jt]sx?$",id:"transformjtsx",level:4},{value:"transformIgnorePatterns",id:"transformignorepatterns",level:3},{value:"watchPlugins",id:"watchplugins",level:3}];function p(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",pre:"pre",...(0,l.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"jestnodeconfig",children:"jestNodeConfig"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"const jestNodeConfig: {\n collectCoverageFrom: string[];\n coverageDirectory: string;\n coverageReporters: string[];\n coverageThreshold: {\n };\n globals: {\n __webpack_public_path__: string;\n APP_CONFIG: string | NonSharedBuffer;\n };\n moduleDirectories: string[];\n moduleFileExtensions: string[];\n moduleNameMapper: {\n .*\\.(css|scss)$: string;\n .*\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|ico)$: string;\n .*\\.html(?:\\?[a-zA-Z]+)?$: string;\n .*\\.svg(?:\\?[a-zA-Z]+)?$: string;\n .*\\webpack-hmr(.[t|j]s)?$: string;\n .*frame\\.html(?:\\?[a-zA-Z]+)?$: string;\n .*iframe\\.html(?:\\?[a-zA-Z]+)?$: string;\n @elliemae/pui-app-loader: string;\n @elliemae/pui-diagnostics: string;\n @elliemae/pui-logrocket: string;\n @elliemae/pui-user-monitoring: string;\n ^d3-(.*)$: string;\n d3: string;\n react-spring/renderprops: string;\n react-spring/web: string;\n };\n resolver: string;\n setupFiles: never[];\n setupFilesAfterEnv: never[];\n snapshotSerializers: never[];\n testEnvironment: string;\n testEnvironmentOptions: {\n resources: string;\n url: string;\n };\n testRegex: string;\n testResultsProcessor: string;\n testTimeout: number;\n transform: {\n ^.+\\.[jt]sx?$: any[];\n };\n transformIgnorePatterns: never[];\n watchPlugins: string[];\n};\n"})}),"\n",(0,a.jsx)(n.h2,{id:"type-declaration",children:"Type Declaration"}),"\n",(0,a.jsx)(n.h3,{id:"collectcoveragefrom",children:"collectCoverageFrom"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"collectCoverageFrom: string[];\n"})}),"\n",(0,a.jsx)(n.h3,{id:"coveragedirectory",children:"coverageDirectory"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"coverageDirectory: string = 'reports';\n"})}),"\n",(0,a.jsx)(n.h3,{id:"coveragereporters",children:"coverageReporters"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"coverageReporters: string[];\n"})}),"\n",(0,a.jsx)(n.h3,{id:"coveragethreshold",children:"coverageThreshold"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"coverageThreshold: {\n} = {};\n"})}),"\n",(0,a.jsx)(n.h3,{id:"globals",children:"globals"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"globals: {\n __webpack_public_path__: string;\n APP_CONFIG: string | NonSharedBuffer;\n};\n"})}),"\n",(0,a.jsx)(n.h4,{id:"globals__webpack_public_path__",children:"globals.__webpack_public_path__"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"__webpack_public_path__: string = '/';\n"})}),"\n",(0,a.jsx)(n.h4,{id:"globalsapp_config",children:"globals.APP_CONFIG"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"APP_CONFIG: string | NonSharedBuffer;\n"})}),"\n",(0,a.jsx)(n.h3,{id:"moduledirectories",children:"moduleDirectories"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"moduleDirectories: string[];\n"})}),"\n",(0,a.jsx)(n.h3,{id:"modulefileextensions",children:"moduleFileExtensions"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"moduleFileExtensions: string[];\n"})}),"\n",(0,a.jsx)(n.h3,{id:"modulenamemapper",children:"moduleNameMapper"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"moduleNameMapper: {\n .*\\.(css|scss)$: string;\n .*\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|ico)$: string;\n .*\\.html(?:\\?[a-zA-Z]+)?$: string;\n .*\\.svg(?:\\?[a-zA-Z]+)?$: string;\n .*\\webpack-hmr(.[t|j]s)?$: string;\n .*frame\\.html(?:\\?[a-zA-Z]+)?$: string;\n .*iframe\\.html(?:\\?[a-zA-Z]+)?$: string;\n @elliemae/pui-app-loader: string;\n @elliemae/pui-diagnostics: string;\n @elliemae/pui-logrocket: string;\n @elliemae/pui-user-monitoring: string;\n ^d3-(.*)$: string;\n d3: string;\n react-spring/renderprops: string;\n react-spring/web: string;\n};\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemappercssscss",children:"moduleNameMapper..*.(css|scss)$"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:".*\\.(css|scss)$: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperjpgjpegpnggifeototfwebpttfwoffwoff2mp4webmwavmp3m4aaacogaico",children:"moduleNameMapper..*.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|ico)$"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:".*\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|ico)$: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperhtmla-za-z",children:"moduleNameMapper..*.html(?:?[a-zA-Z]+)?$"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:".*\\.html(?:\\?[a-zA-Z]+)?$: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemappersvga-za-z",children:"moduleNameMapper..*.svg(?:?[a-zA-Z]+)?$"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:".*\\.svg(?:\\?[a-zA-Z]+)?$: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperwebpack-hmrtjs",children:"moduleNameMapper..*\\webpack-hmr(.[t|j]s)?$"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:".*\\webpack-hmr(.[t|j]s)?$: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperframehtmla-za-z",children:"moduleNameMapper..*frame.html(?:?[a-zA-Z]+)?$"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:".*frame\\.html(?:\\?[a-zA-Z]+)?$: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperiframehtmla-za-z",children:"moduleNameMapper..*iframe.html(?:?[a-zA-Z]+)?$"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:".*iframe\\.html(?:\\?[a-zA-Z]+)?$: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperelliemaepui-app-loader",children:"moduleNameMapper.@elliemae/pui-app-loader"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"@elliemae/pui-app-loader: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperelliemaepui-diagnostics",children:"moduleNameMapper.@elliemae/pui-diagnostics"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"@elliemae/pui-diagnostics: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperelliemaepui-logrocket",children:"moduleNameMapper.@elliemae/pui-logrocket"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"@elliemae/pui-logrocket: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperelliemaepui-user-monitoring",children:"moduleNameMapper.@elliemae/pui-user-monitoring"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"@elliemae/pui-user-monitoring: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperd3-",children:"moduleNameMapper.^d3-(.*)$"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"^d3-(.*)$: string = '<rootDir>/node_modules/d3-$1/dist/d3-$1.min.js';\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperd3",children:"moduleNameMapper.d3"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"d3: string = '<rootDir>/node_modules/d3/dist/d3.min.js';\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperreact-springrenderprops",children:"moduleNameMapper.react-spring/renderprops"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"react-spring/renderprops: string;\n"})}),"\n",(0,a.jsx)(n.h4,{id:"modulenamemapperreact-springweb",children:"moduleNameMapper.react-spring/web"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"react-spring/web: string;\n"})}),"\n",(0,a.jsx)(n.h3,{id:"resolver",children:"resolver"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"resolver: string;\n"})}),"\n",(0,a.jsx)(n.h3,{id:"setupfiles",children:"setupFiles"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"setupFiles: never[] = [];\n"})}),"\n",(0,a.jsx)(n.h3,{id:"setupfilesafterenv",children:"setupFilesAfterEnv"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"setupFilesAfterEnv: never[] = [];\n"})}),"\n",(0,a.jsx)(n.h3,{id:"snapshotserializers",children:"snapshotSerializers"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"snapshotSerializers: never[] = [];\n"})}),"\n",(0,a.jsx)(n.h3,{id:"testenvironment",children:"testEnvironment"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"testEnvironment: string = 'node';\n"})}),"\n",(0,a.jsx)(n.h3,{id:"testenvironmentoptions",children:"testEnvironmentOptions"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"testEnvironmentOptions: {\n resources: string;\n url: string;\n};\n"})}),"\n",(0,a.jsx)(n.h4,{id:"testenvironmentoptionsresources",children:"testEnvironmentOptions.resources"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"resources: string = 'usable';\n"})}),"\n",(0,a.jsx)(n.h4,{id:"testenvironmentoptionsurl",children:"testEnvironmentOptions.url"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"url: string;\n"})}),"\n",(0,a.jsx)(n.h3,{id:"testregex",children:"testRegex"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"testRegex: string = '(app|lib).*/tests/.*\\.test\\.[jt]sx?$';\n"})}),"\n",(0,a.jsx)(n.h3,{id:"testresultsprocessor",children:"testResultsProcessor"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"testResultsProcessor: string = 'jest-sonar-reporter';\n"})}),"\n",(0,a.jsx)(n.h3,{id:"testtimeout",children:"testTimeout"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"testTimeout: number = 5000;\n"})}),"\n",(0,a.jsx)(n.h3,{id:"transform",children:"transform"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"transform: {\n ^.+\\.[jt]sx?$: any[];\n};\n"})}),"\n",(0,a.jsx)(n.h4,{id:"transformjtsx",children:"transform.^.+.[jt]sx?$"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"^.+\\.[jt]sx?$: any[];\n"})}),"\n",(0,a.jsx)(n.h3,{id:"transformignorepatterns",children:"transformIgnorePatterns"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"transformIgnorePatterns: never[] = [];\n"})}),"\n",(0,a.jsx)(n.h3,{id:"watchplugins",children:"watchPlugins"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ts",children:"watchPlugins: string[];\n"})})]})}function c(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},6607(e,n,s){s.d(n,{R:()=>i,x:()=>t});var r=s(758);const a={},l=r.createContext(a);function i(e){const n=r.useContext(l);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(l.Provider,{value:n},e.children)}}}]);