@elliemae/pui-cli 9.0.0-alpha.1 → 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 +4 -4
- 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/prop-types-shim.js +0 -1
- 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 +4 -4
- 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/prop-types-shim.js +0 -1
- package/dist/esm/webpack/webpack.lib.base.babel.js +0 -8
- 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 -1
- 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 +92 -86
- package/dist/types/lib/release.config.d.cts +0 -7
- package/dist/types/lib/semantic-release-plugin.d.cts +0 -1
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/** Shared rule sets migrated from legacy eslintrc (common.cjs + typescript/*.cjs). */
|
|
2
|
+
|
|
3
|
+
export const baseRules = {
|
|
4
|
+
'arrow-body-style': ['error', 'as-needed'],
|
|
5
|
+
'class-methods-use-this': 'off',
|
|
6
|
+
'import-x/imports-first': 'off',
|
|
7
|
+
'import-x/newline-after-import': 'off',
|
|
8
|
+
'import-x/no-dynamic-require': 'off',
|
|
9
|
+
// Off — legacy parity; PUI apps import via @elliemae/app-react-dependencies (not direct package.json entries).
|
|
10
|
+
'import-x/no-extraneous-dependencies': 'off',
|
|
11
|
+
'import-x/no-named-as-default': 'off',
|
|
12
|
+
'import-x/no-unresolved': [
|
|
13
|
+
'error',
|
|
14
|
+
{ caseSensitive: true, caseSensitiveStrict: true },
|
|
15
|
+
],
|
|
16
|
+
'import-x/no-webpack-loader-syntax': 'off',
|
|
17
|
+
'import-x/prefer-default-export': 'off',
|
|
18
|
+
'import-x/default': 'off',
|
|
19
|
+
'import-x/namespace': 'off',
|
|
20
|
+
'import-x/extensions': [
|
|
21
|
+
'error',
|
|
22
|
+
'never',
|
|
23
|
+
{
|
|
24
|
+
json: 'ignorePackages',
|
|
25
|
+
js: 'ignorePackages',
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
complexity: ['error', { max: 10 }],
|
|
29
|
+
'max-depth': ['error', { max: 4 }],
|
|
30
|
+
'max-lines-per-function': 'off',
|
|
31
|
+
'max-nested-callbacks': ['error', { max: 3 }],
|
|
32
|
+
'max-params': ['error', { max: 3 }],
|
|
33
|
+
'max-statements': ['error', { max: 20 }],
|
|
34
|
+
'max-len': 'off',
|
|
35
|
+
'newline-per-chained-call': 'off',
|
|
36
|
+
'no-confusing-arrow': 'off',
|
|
37
|
+
'no-console': 'warn',
|
|
38
|
+
'no-param-reassign': ['error', { props: false }],
|
|
39
|
+
'prefer-template': 'error',
|
|
40
|
+
'require-yield': 'off',
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/** Relaxed type-checked rules for test files (shared by default and strict configs). */
|
|
44
|
+
export const typescriptTestRelaxedRules = {
|
|
45
|
+
'@typescript-eslint/no-unsafe-assignment': 'off',
|
|
46
|
+
'@typescript-eslint/no-unsafe-member-access': 'off',
|
|
47
|
+
'@typescript-eslint/no-unsafe-call': 'off',
|
|
48
|
+
'@typescript-eslint/no-unsafe-argument': 'off',
|
|
49
|
+
'@typescript-eslint/no-unsafe-return': 'off',
|
|
50
|
+
'@typescript-eslint/unbound-method': 'off',
|
|
51
|
+
'@typescript-eslint/no-unsafe-declaration-merging': 'off',
|
|
52
|
+
'@typescript-eslint/no-unsafe-enum-comparison': 'off',
|
|
53
|
+
'@typescript-eslint/await-thenable': 'off',
|
|
54
|
+
'@typescript-eslint/prefer-promise-reject-errors': 'off',
|
|
55
|
+
'no-constant-binary-expression': 'off',
|
|
56
|
+
'valid-typeof': 'off',
|
|
57
|
+
'prefer-const': 'off',
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/** Relaxed core rules for generated test fixture JS (checksum mocks, etc.). */
|
|
61
|
+
export const testFixtureRelaxedRules = {
|
|
62
|
+
'no-unused-vars': 'off',
|
|
63
|
+
'no-console': 'off',
|
|
64
|
+
'max-lines': 'off',
|
|
65
|
+
'max-statements': 'off',
|
|
66
|
+
complexity: 'off',
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const jsRules = {
|
|
70
|
+
...baseRules,
|
|
71
|
+
'max-lines': ['error', { max: 120, skipComments: true }],
|
|
72
|
+
'no-unused-vars': 'error',
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const typescriptRules = {
|
|
76
|
+
...baseRules,
|
|
77
|
+
'max-lines': ['error', { max: 200, skipComments: true }],
|
|
78
|
+
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
|
79
|
+
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
80
|
+
'@typescript-eslint/no-use-before-define': [
|
|
81
|
+
'error',
|
|
82
|
+
{ functions: false, classes: true, variables: true, typedefs: true },
|
|
83
|
+
],
|
|
84
|
+
'@typescript-eslint/unbound-method': ['error', { ignoreStatic: true }],
|
|
85
|
+
'@typescript-eslint/no-floating-promises': ['error', { ignoreIIFE: true }],
|
|
86
|
+
'@typescript-eslint/no-misused-promises': [
|
|
87
|
+
'error',
|
|
88
|
+
{ checksVoidReturn: { attributes: false } },
|
|
89
|
+
],
|
|
90
|
+
'@typescript-eslint/no-unsafe-assignment': 'warn',
|
|
91
|
+
'@typescript-eslint/no-unsafe-member-access': 'warn',
|
|
92
|
+
'@typescript-eslint/no-unsafe-call': 'warn',
|
|
93
|
+
'@typescript-eslint/no-unsafe-argument': 'warn',
|
|
94
|
+
'@typescript-eslint/no-unsafe-return': 'warn',
|
|
95
|
+
'@typescript-eslint/consistent-type-imports': [
|
|
96
|
+
'error',
|
|
97
|
+
{ prefer: 'type-imports', fixStyle: 'inline-type-imports' },
|
|
98
|
+
],
|
|
99
|
+
'@typescript-eslint/no-import-type-side-effects': 'error',
|
|
100
|
+
'no-unused-vars': 'off',
|
|
101
|
+
'@typescript-eslint/no-unused-vars': [
|
|
102
|
+
'error',
|
|
103
|
+
{ argsIgnorePattern: '^_', ignoreRestSiblings: true },
|
|
104
|
+
],
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/** Stricter TypeScript rules (error on unsafe any usage). */
|
|
108
|
+
export const typescriptStrictRules = {
|
|
109
|
+
...typescriptRules,
|
|
110
|
+
'@typescript-eslint/no-unsafe-assignment': 'error',
|
|
111
|
+
'@typescript-eslint/no-unsafe-member-access': 'error',
|
|
112
|
+
'@typescript-eslint/no-unsafe-call': 'error',
|
|
113
|
+
'@typescript-eslint/no-unsafe-argument': 'error',
|
|
114
|
+
'@typescript-eslint/no-unsafe-return': 'error',
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export const reactRules = {
|
|
118
|
+
'jsx-a11y/aria-props': 'error',
|
|
119
|
+
'jsx-a11y/heading-has-content': 'off',
|
|
120
|
+
'jsx-a11y/label-has-associated-control': [
|
|
121
|
+
'error',
|
|
122
|
+
{
|
|
123
|
+
controlComponents: ['Input'],
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
'jsx-a11y/label-has-for': 'off',
|
|
127
|
+
'jsx-a11y/mouse-events-have-key-events': 'error',
|
|
128
|
+
'jsx-a11y/role-has-required-aria-props': 'error',
|
|
129
|
+
'jsx-a11y/role-supports-aria-props': 'error',
|
|
130
|
+
'react/destructuring-assignment': 'off',
|
|
131
|
+
'react-hooks/rules-of-hooks': 'error',
|
|
132
|
+
'react-hooks/exhaustive-deps': 'warn',
|
|
133
|
+
'react/jsx-closing-tag-location': 'off',
|
|
134
|
+
'react/forbid-prop-types': 'off',
|
|
135
|
+
'react/jsx-first-prop-new-line': ['error', 'multiline'],
|
|
136
|
+
'react/jsx-no-target-blank': 'off',
|
|
137
|
+
'react/jsx-props-no-spreading': 'off',
|
|
138
|
+
'react/jsx-uses-vars': 'error',
|
|
139
|
+
'react/require-default-props': 'off',
|
|
140
|
+
'react/require-extension': 'off',
|
|
141
|
+
'react/self-closing-comp': 'off',
|
|
142
|
+
'react/sort-comp': 'off',
|
|
143
|
+
'react/react-in-jsx-scope': 'off',
|
|
144
|
+
'react/jsx-filename-extension': [
|
|
145
|
+
'warn',
|
|
146
|
+
{ extensions: ['.js', '.jsx', '.tsx', '.mdx'] },
|
|
147
|
+
],
|
|
148
|
+
'react/function-component-definition': [
|
|
149
|
+
'error',
|
|
150
|
+
{ namedComponents: 'arrow-function' },
|
|
151
|
+
],
|
|
152
|
+
'react/prop-types': 'off',
|
|
153
|
+
'redux-saga/no-yield-in-race': 'error',
|
|
154
|
+
'redux-saga/yield-effects': 'error',
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/** Stricter React rules (exhaustive-deps as error). */
|
|
158
|
+
export const reactStrictRules = {
|
|
159
|
+
...reactRules,
|
|
160
|
+
'react-hooks/exhaustive-deps': 'error',
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
export const ignorePatterns = [
|
|
164
|
+
'**/build/**',
|
|
165
|
+
'**/node_modules/**',
|
|
166
|
+
'**/dist/**',
|
|
167
|
+
'**/reports/**',
|
|
168
|
+
'**/allure-report/**',
|
|
169
|
+
'**/coverage/**',
|
|
170
|
+
'**/demo/**',
|
|
171
|
+
'**/docs/**',
|
|
172
|
+
'**/docs/api/**',
|
|
173
|
+
'**/temp/**',
|
|
174
|
+
'**/.tmp/**',
|
|
175
|
+
'**/public/**',
|
|
176
|
+
'**/webroot/**',
|
|
177
|
+
'**/cdn/**',
|
|
178
|
+
'**/.docusaurus/**',
|
|
179
|
+
'**/vendor/*.js',
|
|
180
|
+
'**/.nx/**',
|
|
181
|
+
'**/pnpm-lock.yaml',
|
|
182
|
+
'**/.scannerwork/**',
|
|
183
|
+
'**/stats.json',
|
|
184
|
+
'**/jsconfig.json',
|
|
185
|
+
];
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** @type {import('stylelint').Config} */
|
|
2
|
+
export const stylelintConfig = {
|
|
3
|
+
ignoreFiles: [
|
|
4
|
+
'/dist/**/*',
|
|
5
|
+
'/coverage/**/*',
|
|
6
|
+
'/build/**/*',
|
|
7
|
+
'/reports/**/*',
|
|
8
|
+
'/temp/**/*',
|
|
9
|
+
'/docs/**/*',
|
|
10
|
+
'/demo/**/*',
|
|
11
|
+
'/node_modules/**/*',
|
|
12
|
+
'/vendor/**/*',
|
|
13
|
+
],
|
|
14
|
+
customSyntax: 'postcss-styled-syntax',
|
|
15
|
+
extends: ['stylelint-config-recommended'],
|
|
16
|
+
rules: {
|
|
17
|
+
'selector-type-no-unknown': null,
|
|
18
|
+
'function-no-unknown': null,
|
|
19
|
+
// Formerly from stylelint-config-styled-components (unmaintained; references
|
|
20
|
+
// removed rules like no-missing-end-of-source-newline in Stylelint 17).
|
|
21
|
+
'value-no-vendor-prefix': true,
|
|
22
|
+
'property-no-vendor-prefix': true,
|
|
23
|
+
'no-empty-source': null,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default stylelintConfig;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { stylelintConfig, default } from './config.mjs';
|
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
"/coverage/**/*",
|
|
5
|
-
"/build/**/*",
|
|
6
|
-
"/reports/**/*",
|
|
7
|
-
"/temp/**/*",
|
|
8
|
-
"/docs/**/*",
|
|
9
|
-
"/demo/**/*",
|
|
10
|
-
"/node_modules/**/*",
|
|
11
|
-
"/vendor/**/*",
|
|
12
|
-
],
|
|
13
|
-
customSyntax: "postcss-styled-syntax",
|
|
14
|
-
extends: [
|
|
15
|
-
"stylelint-config-recommended",
|
|
16
|
-
"stylelint-config-styled-components",
|
|
17
|
-
],
|
|
18
|
-
rules: { "selector-type-no-unknown": null, "function-no-unknown": null },
|
|
19
|
-
};
|
|
1
|
+
const { stylelintConfig } = require('./stylelint/export.mjs');
|
|
2
|
+
|
|
3
|
+
exports.stylelintConfig = stylelintConfig;
|
|
@@ -1,22 +1,30 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
|
-
const {
|
|
2
|
+
const { execFileSync } = require('child_process');
|
|
3
3
|
|
|
4
4
|
const WORKSPACE_DIR_ENV_VAR = 'NPM_CONFIG_WORKSPACE_DIR';
|
|
5
5
|
const WORKSPACE_MANIFEST_FILENAME = 'pnpm-workspace.yaml';
|
|
6
6
|
|
|
7
|
+
const findUpCli = path.join(
|
|
8
|
+
path.dirname(require.resolve('find-up-cli/package.json')),
|
|
9
|
+
'cli.js',
|
|
10
|
+
);
|
|
11
|
+
|
|
7
12
|
const getPNPMWorkspaceLocation = (cwd) => {
|
|
8
|
-
let location = null;
|
|
9
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
10
13
|
for (const fileName of [WORKSPACE_MANIFEST_FILENAME, 'pnpm-workspace.yml']) {
|
|
11
14
|
try {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
const location = execFileSync(
|
|
16
|
+
process.execPath,
|
|
17
|
+
[findUpCli, fileName, `--cwd=${cwd}`],
|
|
18
|
+
{ encoding: 'utf8' },
|
|
19
|
+
).trim();
|
|
20
|
+
if (location) {
|
|
21
|
+
return location;
|
|
22
|
+
}
|
|
23
|
+
} catch {
|
|
16
24
|
// ignore
|
|
17
25
|
}
|
|
18
26
|
}
|
|
19
|
-
return
|
|
27
|
+
return null;
|
|
20
28
|
};
|
|
21
29
|
|
|
22
30
|
exports.findMonoRepoRoot = (cwd = process.cwd()) => {
|
|
@@ -32,20 +32,17 @@ __export(utils_exports, {
|
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(utils_exports);
|
|
34
34
|
var import_node_path = __toESM(require("node:path"), 1);
|
|
35
|
-
var
|
|
35
|
+
var import_find_up = require("find-up");
|
|
36
36
|
const WORKSPACE_DIR_ENV_VAR = "NPM_CONFIG_WORKSPACE_DIR";
|
|
37
37
|
const WORKSPACE_MANIFEST_FILENAME = "pnpm-workspace.yaml";
|
|
38
38
|
const getPNPMWorkspaceLocation = (cwd) => {
|
|
39
|
-
let location = null;
|
|
40
39
|
for (const fileName of [WORKSPACE_MANIFEST_FILENAME, "pnpm-workspace.yml"]) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
location
|
|
44
|
-
break;
|
|
45
|
-
} catch (err) {
|
|
40
|
+
const location = (0, import_find_up.findUpSync)(fileName, { cwd });
|
|
41
|
+
if (location) {
|
|
42
|
+
return location;
|
|
46
43
|
}
|
|
47
44
|
}
|
|
48
|
-
return
|
|
45
|
+
return null;
|
|
49
46
|
};
|
|
50
47
|
const findMonoRepoRoot = (cwd = process.cwd()) => {
|
|
51
48
|
const workspaceManifestDirEnvVar = process.env[WORKSPACE_DIR_ENV_VAR] ?? process.env[WORKSPACE_DIR_ENV_VAR.toLowerCase()];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
/** @type {import('semantic-release').GlobalConfig} */
|
|
2
|
+
export default {
|
|
2
3
|
branches: [
|
|
3
4
|
'+([0-9])?(.{+([0-9]),x}).x',
|
|
4
5
|
'master',
|
|
@@ -21,7 +22,7 @@ module.exports = {
|
|
|
21
22
|
},
|
|
22
23
|
],
|
|
23
24
|
'@semantic-release/npm',
|
|
24
|
-
'./semantic-release-plugin.
|
|
25
|
+
'./semantic-release-plugin.mjs',
|
|
25
26
|
'@semantic-release/github',
|
|
26
27
|
],
|
|
27
28
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Semantic Release plugin to write publish info and set dist tag
|
|
6
6
|
* @see https://semantic-release.gitbook.io/semantic-release/developer-guide/plugin
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
export default {
|
|
9
9
|
success: async (pluginConfig, context) => {
|
|
10
10
|
const { nextRelease, logger } = context;
|
|
11
11
|
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: migrate-to-pui-cli-9
|
|
3
|
+
description: >-
|
|
4
|
+
Migrate a PUI app or library to pui-cli 9 (Node 24, pnpm 11, ESLint 10 flat config, Stylelint 17,
|
|
5
|
+
Husky 9, Vitest 4, semantic-release 25). Use when upgrading @elliemae/pui-cli, migrating from
|
|
6
|
+
.eslintrc.cjs to eslint.config.mjs, release.config.cjs to release.config.mjs, upgrading Husky 8
|
|
7
|
+
hooks, fixing Vitest 4 / coverage-v8 breakages, or adopting shared configs from pui-cli.
|
|
8
|
+
App/library production builds stay on Webpack.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Migrate to pui-cli 9
|
|
12
|
+
|
|
13
|
+
Upgrades a PUI repo from pui-cli 8 (ESLint 8 + `.eslintrc.cjs`) to pui-cli 9
|
|
14
|
+
(ESLint 10 + `eslint.config.mjs` + Node 24 + pnpm 11). Production bundling remains Webpack;
|
|
15
|
+
Vitest 4 uses Vite only as the test runner when you run `pui-cli vitest`.
|
|
16
|
+
|
|
17
|
+
## Pre-flight: Toolchain
|
|
18
|
+
|
|
19
|
+
| Requirement | Version |
|
|
20
|
+
| ------------------- | --------------------------------- |
|
|
21
|
+
| Node.js | **24** (see repo `.node-version`) |
|
|
22
|
+
| pnpm | **11** |
|
|
23
|
+
| `@elliemae/pui-cli` | **9.x** (alpha/beta until GA) |
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
fnm use 24 # or nvm/volta equivalent
|
|
27
|
+
corepack enable
|
|
28
|
+
pnpm install
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Migration steps (phased PRs recommended)
|
|
32
|
+
|
|
33
|
+
### Phase 1 — Toolchain only
|
|
34
|
+
|
|
35
|
+
1. Update `.node-version` to `24` if needed.
|
|
36
|
+
2. Ensure CI Jenkins/docker images use Node 24.
|
|
37
|
+
3. Upgrade pnpm to 11 (`packageManager` field in root `package.json`).
|
|
38
|
+
4. Run `pnpm install`, `pnpm test`, `pnpm run build` — fix any Node/pnpm breakages only.
|
|
39
|
+
|
|
40
|
+
### Phase 2 — Bump pui-cli
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pnpm add -D @elliemae/pui-cli@9
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Re-run install and smoke-test build/test without ESLint changes yet if the bump is large.
|
|
47
|
+
|
|
48
|
+
### Phase 3 — ESLint 10 flat config
|
|
49
|
+
|
|
50
|
+
**React apps and libraries:**
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
// eslint.config.mjs
|
|
54
|
+
import { eslintFlatConfig } from '@elliemae/pui-cli/eslint';
|
|
55
|
+
|
|
56
|
+
export default eslintFlatConfig;
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Node / TS services (non-React):**
|
|
60
|
+
|
|
61
|
+
```js
|
|
62
|
+
// eslint.config.mjs
|
|
63
|
+
import { eslintFlatBaseConfig } from '@elliemae/pui-cli/eslint';
|
|
64
|
+
|
|
65
|
+
export default eslintFlatBaseConfig;
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Then:
|
|
69
|
+
|
|
70
|
+
1. Delete `.eslintrc.cjs` and `.eslintignore` (ignores are in the shared config).
|
|
71
|
+
2. Run `pnpm exec pui-cli lint --fix`.
|
|
72
|
+
3. Run `pnpm exec pui-cli lint` until **zero errors** (warnings may remain).
|
|
73
|
+
|
|
74
|
+
**Strict mode** (only after default config is clean):
|
|
75
|
+
|
|
76
|
+
```js
|
|
77
|
+
import { eslintFlatConfigStrict } from '@elliemae/pui-cli/eslint';
|
|
78
|
+
export default eslintFlatConfigStrict;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Phase 4 — Repo-specific overrides (if needed)
|
|
82
|
+
|
|
83
|
+
Add overrides **after** importing the shared config only when lint debt blocks the migration:
|
|
84
|
+
|
|
85
|
+
```js
|
|
86
|
+
import { eslintFlatConfig } from '@elliemae/pui-cli/eslint';
|
|
87
|
+
|
|
88
|
+
export default [
|
|
89
|
+
...eslintFlatConfig,
|
|
90
|
+
{
|
|
91
|
+
rules: {
|
|
92
|
+
// Temporary: legacy had ~100 no-explicit-any warnings via @typescript-eslint v5
|
|
93
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Remove overrides in a follow-up debt PR. Do not copy Airbnb or legacy `.eslintrc` rules.
|
|
100
|
+
|
|
101
|
+
### Phase 5 — Husky 9 (if `.husky/` exists)
|
|
102
|
+
|
|
103
|
+
Skip this phase if the repo has no git hooks. Most PUI apps/libs copied hooks from pui-cli boilerplate and still use Husky 8.
|
|
104
|
+
|
|
105
|
+
1. Upgrade and remove deprecated package:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
pnpm add -D husky@9
|
|
109
|
+
pnpm remove husky-init # if present
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
2. Update `package.json` `prepare` script:
|
|
113
|
+
|
|
114
|
+
```diff
|
|
115
|
+
- "prepare": "[ -n \"$CI\" ] || husky install"
|
|
116
|
+
+ "prepare": "[ -n \"$CI\" ] || husky"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
3. Simplify each hook in `.husky/` — remove the shebang and `husky.sh` source. Keep only the command(s):
|
|
120
|
+
|
|
121
|
+
**`.husky/pre-commit`** (typical PUI repo):
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
pnpm -s dlx lint-staged
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**`.husky/commit-msg`** (if commitlint is enabled):
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
pnpm exec commitlint --edit $1
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
```diff
|
|
134
|
+
- #!/bin/sh
|
|
135
|
+
- . "$(dirname "$0")/_/husky.sh"
|
|
136
|
+
-
|
|
137
|
+
pnpm -s dlx lint-staged
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
4. Delete `.husky/.gitignore` if present (Husky 9 regenerates `.husky/_` on install).
|
|
141
|
+
|
|
142
|
+
5. Run `pnpm prepare`, then verify hooks with a test commit.
|
|
143
|
+
|
|
144
|
+
**Environment variable changes (Husky 9):**
|
|
145
|
+
|
|
146
|
+
| Husky 8 | Husky 9 |
|
|
147
|
+
| ----------------------------------------- | ------------- |
|
|
148
|
+
| `HUSKY_SKIP_HOOKS` / `HUSKY_SKIP_INSTALL` | `HUSKY=0` |
|
|
149
|
+
| `HUSKY_GIT_PARAMS` in commit-msg hooks | `$1`, `$2`, … |
|
|
150
|
+
|
|
151
|
+
Reference hooks: [pui-cli/.husky](https://git.elliemae.io/platform-ui/pui-cli/tree/master/.husky)
|
|
152
|
+
|
|
153
|
+
### Phase 6 — Stylelint 17 (if CSS / styled-components)
|
|
154
|
+
|
|
155
|
+
1. Simplify `stylelint.config.cjs` — remove `stylelint-config-styled-components` workarounds.
|
|
156
|
+
2. Optional ESM: `stylelint.config.mjs` importing `@elliemae/pui-cli/stylelint`.
|
|
157
|
+
3. Run `pnpm exec pui-cli lint` (CSS pass).
|
|
158
|
+
|
|
159
|
+
See [stylelint-migration.md](https://docs.pui.mortgagetech.q1.ice.com/cli/stylelint-migration) in pui-cli docs.
|
|
160
|
+
|
|
161
|
+
### Phase 7 — Vitest 4 (if using `pui-cli vitest`)
|
|
162
|
+
|
|
163
|
+
Skip if the repo uses Jest (`pui-cli test`) only.
|
|
164
|
+
|
|
165
|
+
1. Align devDependencies with pui-cli 9 (Vitest 4 stack):
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
pnpm add -D vitest@4 @vitest/coverage-v8@4 vite@8 @vitejs/plugin-react@6 vite-tsconfig-paths@6
|
|
169
|
+
pnpm remove @vitest/coverage-c8 @types/uuid # when upgrading uuid to 14+
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
2. Prefer extending shared config:
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
import { defineConfig, mergeConfig } from 'vitest/config';
|
|
176
|
+
import { vitestConfig } from '@elliemae/pui-cli/vitest';
|
|
177
|
+
|
|
178
|
+
export default mergeConfig(
|
|
179
|
+
vitestConfig,
|
|
180
|
+
defineConfig({
|
|
181
|
+
test: {
|
|
182
|
+
/* overrides */
|
|
183
|
+
},
|
|
184
|
+
}),
|
|
185
|
+
);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
3. Update custom Vitest 1.x options:
|
|
189
|
+
|
|
190
|
+
| Old | New |
|
|
191
|
+
| ------------------------- | ---------------------------- |
|
|
192
|
+
| `test.deps.optimizer.web` | `test.deps.optimizer.client` |
|
|
193
|
+
| `@vitest/coverage-c8` | `@vitest/coverage-v8` |
|
|
194
|
+
|
|
195
|
+
4. If `tsconfig.json` extends `@elliemae/pui-cli/app.tsconfig.json` or `library.tsconfig.json`, ensure pui-cli 9 is installed — shared tsconfigs use `moduleResolution: "bundler"`. Custom tsconfigs importing `vitest/config` may need the same.
|
|
196
|
+
|
|
197
|
+
5. Smoke-test: `pnpm exec pui-cli vitest --passWithNoTests`
|
|
198
|
+
|
|
199
|
+
### Phase 8 — semantic-release 25 (libraries that publish to npm)
|
|
200
|
+
|
|
201
|
+
Skip if the repo does not run `semantic-release` (most apps). Libraries with `release.config.cjs` extending `@elliemae/pui-cli/releaseConfig` must migrate — pui-cli 9 exports an ESM shareable config; semantic-release 25 loads ESM `extends` via dynamic `import()`.
|
|
202
|
+
|
|
203
|
+
1. Upgrade local pins if present:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
pnpm add -D semantic-release@25 @semantic-release/changelog@6 @semantic-release/exec@7 @semantic-release/git@10
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
2. Replace `release.config.cjs` with `release.config.mjs`:
|
|
210
|
+
|
|
211
|
+
```javascript
|
|
212
|
+
/** @type {import('semantic-release').GlobalConfig} */
|
|
213
|
+
export default {
|
|
214
|
+
extends: '@elliemae/pui-cli/releaseConfig',
|
|
215
|
+
};
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
3. Delete `release.config.cjs`.
|
|
219
|
+
|
|
220
|
+
4. Custom plugins: use relative `.mjs` paths with `export default`, or keep `.cjs` plugins by path.
|
|
221
|
+
|
|
222
|
+
5. Dry-run: `pnpm exec semantic-release --dry-run`
|
|
223
|
+
|
|
224
|
+
### Phase 9 — Verify
|
|
225
|
+
|
|
226
|
+
- [ ] `pnpm exec pui-cli lint` — 0 errors
|
|
227
|
+
- [ ] `pnpm exec pui-cli tscheck --files`
|
|
228
|
+
- [ ] `pnpm test` (or `pui-cli vitest` if applicable)
|
|
229
|
+
- [ ] `pnpm run build` (or `pui-cli build`) — Webpack, unchanged
|
|
230
|
+
- [ ] Pre-commit / lint-staged passes (after Husky 9 migration if applicable)
|
|
231
|
+
- [ ] CI green on the target branch
|
|
232
|
+
|
|
233
|
+
## Common lint fixes after upgrade
|
|
234
|
+
|
|
235
|
+
| Symptom | Fix |
|
|
236
|
+
| ------------------------------------ | ----------------------------------------------------------------------------------- |
|
|
237
|
+
| `import-x/no-unresolved` | Use `import type` for type-only imports |
|
|
238
|
+
| `@typescript-eslint/no-explicit-any` | Type the value or add targeted override (warn) during transition |
|
|
239
|
+
| `@typescript-eslint/no-unused-vars` | Remove or prefix with `_` |
|
|
240
|
+
| Stale `eslint-disable` comments | Remove disables for rules no longer in config |
|
|
241
|
+
| Test/fixture files flagged | Shared config includes `lib/**/tests/**` globs — ensure pui-cli 9.0.0+ |
|
|
242
|
+
| `.d.ts` files | pui-cli turns off `no-explicit-any` for `**/*.d.ts` |
|
|
243
|
+
| Cannot find module `vite` in tscheck | Set `moduleResolution: "bundler"` or extend pui-cli 9 tsconfig |
|
|
244
|
+
| Vitest `optimizer.web` unknown | Rename to `test.deps.optimizer.client` (Vitest 4) |
|
|
245
|
+
| Coverage fails after upgrade | Remove `@vitest/coverage-c8`; use `@vitest/coverage-v8@4` |
|
|
246
|
+
| `release.config.cjs` extends fails | Migrate to `release.config.mjs`; requires semantic-release 22+ (pui-cli 9 ships 25) |
|
|
247
|
+
|
|
248
|
+
Full rule comparison: [eslint-rules-migration.md](https://docs.pui.mortgagetech.q1.ice.com/cli/eslint-rules-migration) (also at `docs/eslint-rules-migration.md` in pui-cli).
|
|
249
|
+
|
|
250
|
+
## Install this skill in Cursor
|
|
251
|
+
|
|
252
|
+
From the consumer repo (after `@elliemae/pui-cli` is installed):
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
pnpm exec pui-cli skills install migrate-to-pui-cli-9 --target all
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Skills are copied to `.cursor/skills/`, `.claude/skills/`, and `.github/skills/` for Cursor, Claude Code, and GitHub Copilot.
|
|
259
|
+
|
|
260
|
+
## What NOT to change
|
|
261
|
+
|
|
262
|
+
- Application business logic — migration is tooling/config only
|
|
263
|
+
- Webpack/babel production build config — pui-cli 9 does not migrate apps to Vite for bundling
|
|
264
|
+
- Prettier / commitlint configs unless pui-cli 9 bumps those presets
|
|
265
|
+
|
|
266
|
+
## Additional resources
|
|
267
|
+
|
|
268
|
+
- [pui-cli 9 migration guide](https://docs.pui.mortgagetech.q1.ice.com/cli/pui-cli-9-migration)
|
|
269
|
+
- [ESLint rules migration guide](https://docs.pui.mortgagetech.q1.ice.com/cli/eslint-rules-migration)
|
|
270
|
+
- [Stylelint migration guide](https://docs.pui.mortgagetech.q1.ice.com/cli/stylelint-migration)
|
|
271
|
+
- Reference one-liner: `pui-react-boilerplate/eslint.config.mjs`
|
|
@@ -6,11 +6,11 @@ const { findMonoRepoRoot } = require('../monorepo/utils.cjs');
|
|
|
6
6
|
|
|
7
7
|
let isReactModule = true;
|
|
8
8
|
try {
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
require('react');
|
|
11
11
|
require('styled-components');
|
|
12
|
-
|
|
13
|
-
} catch
|
|
12
|
+
|
|
13
|
+
} catch {
|
|
14
14
|
isReactModule = false;
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -89,7 +89,7 @@ const jestConfig = {
|
|
|
89
89
|
'^.+\\.[jt]sx?$': ['@swc/jest', swcrcConfig],
|
|
90
90
|
},
|
|
91
91
|
transformIgnorePatterns: [
|
|
92
|
-
// eslint-disable-next-line
|
|
92
|
+
// eslint-disable-next-line no-useless-escape
|
|
93
93
|
'/node_modules/(?!(\@elliemae\/pui-cli|lodash-es|react-select|react-dates|d3|internmap|delaunator|robust-predicates))/',
|
|
94
94
|
],
|
|
95
95
|
globals: {
|
|
@@ -32,7 +32,7 @@ module.exports = (request, options) => {
|
|
|
32
32
|
}
|
|
33
33
|
const resolution = resolutions.find(({ matcher }) => matcher.test(request));
|
|
34
34
|
if (resolution) {
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
for (const extension of resolution.extensions) {
|
|
37
37
|
try {
|
|
38
38
|
return resolver(
|