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