From 1e08473156876b128c7d8eca9af1c87759288425 Mon Sep 17 00:00:00 2001 From: valley Date: Sun, 3 Aug 2025 16:49:37 +0900 Subject: [PATCH 1/4] refactor: ConfigPreset type safety and migrate lodash to es-toolkit --- packages/react-router-dev/config/config.ts | 20 +++++++++++--------- packages/react-router-dev/config/routes.ts | 2 +- packages/react-router-dev/package.json | 3 +-- packages/react-router-dev/vite/plugin.ts | 3 +-- pnpm-lock.yaml | 19 ++++++++----------- 5 files changed, 22 insertions(+), 25 deletions(-) diff --git a/packages/react-router-dev/config/config.ts b/packages/react-router-dev/config/config.ts index b5bd6ea254..a4c31b7c26 100644 --- a/packages/react-router-dev/config/config.ts +++ b/packages/react-router-dev/config/config.ts @@ -9,10 +9,7 @@ import chokidar, { type EmitArgs as ChokidarEmitArgs, } from "chokidar"; import colors from "picocolors"; -import pick from "lodash/pick"; -import omit from "lodash/omit"; -import cloneDeep from "lodash/cloneDeep"; -import isEqual from "lodash/isEqual"; +import { pick, omit, cloneDeep, isEqual } from "es-toolkit"; import { type RouteManifest, @@ -391,7 +388,7 @@ async function resolveConfig({ // Prevent mutations to the user config reactRouterUserConfig = deepFreeze(cloneDeep(reactRouterUserConfig)); - let presets: ReactRouterConfig[] = ( + let presets: ConfigPreset[] = ( await Promise.all( (reactRouterUserConfig.presets ?? []).map(async (preset) => { if (!preset.name) { @@ -404,10 +401,15 @@ async function resolveConfig({ return null; } - let configPreset: ReactRouterConfig = omit( - await preset.reactRouterConfig({ reactRouterUserConfig }), - excludedConfigPresetKeys, - ); + let presetResult = await preset.reactRouterConfig({ + reactRouterUserConfig, + }); + + let configPreset = presetResult; + + if ("presets" in presetResult) { + configPreset = omit(presetResult, excludedConfigPresetKeys); + } return configPreset; }), diff --git a/packages/react-router-dev/config/routes.ts b/packages/react-router-dev/config/routes.ts index fa94d482f7..59fd70091d 100644 --- a/packages/react-router-dev/config/routes.ts +++ b/packages/react-router-dev/config/routes.ts @@ -1,6 +1,6 @@ import * as Path from "pathe"; import * as v from "valibot"; -import pick from "lodash/pick"; +import { pick } from "es-toolkit/compat"; import invariant from "../invariant"; diff --git a/packages/react-router-dev/package.json b/packages/react-router-dev/package.json index ee43e86487..882542d88a 100644 --- a/packages/react-router-dev/package.json +++ b/packages/react-router-dev/package.json @@ -87,7 +87,6 @@ "es-module-lexer": "^1.3.1", "exit-hook": "2.2.1", "jsesc": "3.0.2", - "lodash": "^4.17.21", "pathe": "^1.1.2", "picocolors": "^1.1.1", "prettier": "^3.6.2", @@ -106,7 +105,7 @@ "@types/dedent": "^0.7.0", "@types/express": "^4.17.9", "@types/jsesc": "^3.0.1", - "@types/lodash": "^4.14.182", + "es-toolkit": "^1.39.7", "@types/node": "^20.0.0", "@types/npmcli__package-json": "^4.0.0", "@types/set-cookie-parser": "^2.4.1", diff --git a/packages/react-router-dev/vite/plugin.ts b/packages/react-router-dev/vite/plugin.ts index 27981b7438..e346576c23 100644 --- a/packages/react-router-dev/vite/plugin.ts +++ b/packages/react-router-dev/vite/plugin.ts @@ -32,10 +32,9 @@ import { parse as esModuleLexer, } from "es-module-lexer"; import { escapePath as escapePathAsGlob } from "tinyglobby"; -import pick from "lodash/pick"; +import { pick, kebabCase } from "es-toolkit/compat"; import jsesc from "jsesc"; import colors from "picocolors"; -import kebabCase from "lodash/kebabCase"; import * as Typegen from "../typegen"; import type { RouteManifestEntry, RouteManifest } from "../config/routes"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 994b7704b9..d88316d620 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1147,9 +1147,6 @@ importers: jsesc: specifier: 3.0.2 version: 3.0.2 - lodash: - specifier: ^4.17.21 - version: 4.17.21 pathe: specifier: ^1.1.2 version: 1.1.2 @@ -1199,9 +1196,6 @@ importers: '@types/jsesc': specifier: ^3.0.1 version: 3.0.3 - '@types/lodash': - specifier: ^4.14.182 - version: 4.17.0 '@types/node': specifier: ^20.0.0 version: 20.11.30 @@ -1214,6 +1208,9 @@ importers: '@types/set-cookie-parser': specifier: ^2.4.1 version: 2.4.7 + es-toolkit: + specifier: ^1.39.7 + version: 1.39.8 esbuild-register: specifier: ^3.6.0 version: 3.6.0(esbuild@0.25.4) @@ -4929,9 +4926,6 @@ packages: '@types/lambda-tester@3.6.2': resolution: {integrity: sha512-nQRUx0AuvTq5KOz1SaxMOOFJvnybo1oAzvSy/p9bVGthZVvg1Dar/051mhMuzdN1DWg++bs+eGq1MdCbm6wjSQ==} - '@types/lodash@4.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} @@ -6231,6 +6225,9 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es-toolkit@1.39.8: + resolution: {integrity: sha512-A8QO9TfF+rltS8BXpdu8OS+rpGgEdnRhqIVxO/ZmNvnXBYgOdSsxukT55ELyP94gZIntWJ+Li9QRrT2u1Kitpg==} + esbuild-register@3.6.0: resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: @@ -13323,8 +13320,6 @@ snapshots: dependencies: '@types/aws-lambda': 8.10.141 - '@types/lodash@4.17.0': {} - '@types/mdast@3.0.15': dependencies: '@types/unist': 2.0.10 @@ -14969,6 +14964,8 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es-toolkit@1.39.8: {} + esbuild-register@3.6.0(esbuild@0.25.0): dependencies: debug: 4.4.1 From 9b494bde43de189ac92610291a722c864fe0b196 Mon Sep 17 00:00:00 2001 From: valley Date: Sun, 3 Aug 2025 17:32:38 +0900 Subject: [PATCH 2/4] feat: change result name --- packages/react-router-dev/config/config.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react-router-dev/config/config.ts b/packages/react-router-dev/config/config.ts index a4c31b7c26..eceec2a4d5 100644 --- a/packages/react-router-dev/config/config.ts +++ b/packages/react-router-dev/config/config.ts @@ -401,14 +401,14 @@ async function resolveConfig({ return null; } - let presetResult = await preset.reactRouterConfig({ + let reactRouterConfig = await preset.reactRouterConfig({ reactRouterUserConfig, }); - let configPreset = presetResult; + let configPreset = reactRouterConfig; - if ("presets" in presetResult) { - configPreset = omit(presetResult, excludedConfigPresetKeys); + if ("presets" in reactRouterConfig) { + configPreset = omit(reactRouterConfig, excludedConfigPresetKeys); } return configPreset; From a64317b0986a37578d631643871388d400c29c72 Mon Sep 17 00:00:00 2001 From: valley Date: Sun, 3 Aug 2025 17:37:48 +0900 Subject: [PATCH 3/4] add: contributors.yml --- contributors.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.yml b/contributors.yml index 1866d7c80a..0ad364be7b 100644 --- a/contributors.yml +++ b/contributors.yml @@ -76,6 +76,7 @@ - ChristophP - christowiz - clavery +- cksal0805 - clonemycode - Cmoen11 - codeape2 From 1929d95b886a7f44d6a0a019808cffd401e7e468 Mon Sep 17 00:00:00 2001 From: valley Date: Mon, 4 Aug 2025 14:44:45 +0900 Subject: [PATCH 4/4] fix: test error --- packages/react-router-dev/config/config.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/react-router-dev/config/config.ts b/packages/react-router-dev/config/config.ts index eceec2a4d5..27bbcba07a 100644 --- a/packages/react-router-dev/config/config.ts +++ b/packages/react-router-dev/config/config.ts @@ -405,13 +405,11 @@ async function resolveConfig({ reactRouterUserConfig, }); - let configPreset = reactRouterConfig; - - if ("presets" in reactRouterConfig) { - configPreset = omit(reactRouterConfig, excludedConfigPresetKeys); + if (reactRouterConfig != null && "presets" in reactRouterConfig) { + reactRouterConfig = omit(reactRouterConfig, excludedConfigPresetKeys); } - return configPreset; + return reactRouterConfig; }), ) ).filter(function isNotNull(value: T | null): value is T {