From 8415fc8b6f9e8bd8eaa26559ce35a537e76c7911 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 10:07:57 +0300 Subject: [PATCH] perf(config): avoid quadratic dependency descriptor copying --- packages/cli-config/src/assign.ts | 2 +- packages/cli-config/src/loadConfig.ts | 54 ++++++++++++++------------- packages/cli-config/src/schema.ts | 1 + 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/packages/cli-config/src/assign.ts b/packages/cli-config/src/assign.ts index d67e56cab..46a5353a1 100644 --- a/packages/cli-config/src/assign.ts +++ b/packages/cli-config/src/assign.ts @@ -18,7 +18,7 @@ export default function assign(target: Object, ...sources: Object[]) { Object.getOwnPropertySymbols(source).forEach((sym) => { let descriptor = Object.getOwnPropertyDescriptor(source, sym); if (descriptor && descriptor.enumerable) { - descriptors[sym.toString()] = descriptor; + descriptors[sym] = descriptor; } }); Object.defineProperties(target, descriptors); diff --git a/packages/cli-config/src/loadConfig.ts b/packages/cli-config/src/loadConfig.ts index b01c2d03b..a05e206fd 100644 --- a/packages/cli-config/src/loadConfig.ts +++ b/packages/cli-config/src/loadConfig.ts @@ -107,7 +107,7 @@ export default function loadConfig({ get reactNativeVersion() { return getReactNativeVersion(initialConfig.reactNativePath); }, - dependencies: userConfig.dependencies, + dependencies: {...userConfig.dependencies}, commands: userConfig.commands, healthChecks: userConfig.healthChecks || [], platforms: userConfig.platforms, @@ -147,18 +147,7 @@ export default function loadConfig({ resolveNodeModuleDir(projectRoot, dependencyName); let config = readDependencyConfigFromDisk(root, dependencyName); - return assign({}, acc, { - dependencies: assign({}, acc.dependencies, { - get [dependencyName](): DependencyConfig { - return getDependencyConfig( - root, - dependencyName, - finalConfig, - config, - userConfig, - ); - }, - }), + const nextConfig = assign({}, acc, { commands: removeDuplicateCommands([ ...config.commands, ...acc.commands, @@ -173,6 +162,18 @@ export default function loadConfig({ }, healthChecks: [...acc.healthChecks, ...config.healthChecks], }) as Config; + assign(nextConfig.dependencies, { + get [dependencyName](): DependencyConfig { + return getDependencyConfig( + root, + dependencyName, + finalConfig, + config, + userConfig, + ); + }, + }); + return nextConfig; } catch { return acc; } @@ -205,7 +206,7 @@ export async function loadConfigAsync({ get reactNativeVersion() { return getReactNativeVersion(initialConfig.reactNativePath); }, - dependencies: userConfig.dependencies, + dependencies: {...userConfig.dependencies}, commands: userConfig.commands, healthChecks: userConfig.healthChecks || [], platforms: userConfig.platforms, @@ -249,18 +250,7 @@ export async function loadConfigAsync({ dependencyName, ); - return assign({}, acc, { - dependencies: assign({}, acc.dependencies, { - get [dependencyName](): DependencyConfig { - return getDependencyConfig( - root, - dependencyName, - finalConfig, - config, - userConfig, - ); - }, - }), + const nextConfig = assign({}, acc, { commands: removeDuplicateCommands([ ...config.commands, ...acc.commands, @@ -275,6 +265,18 @@ export async function loadConfigAsync({ }, healthChecks: [...acc.healthChecks, ...config.healthChecks], }) as Config; + assign(nextConfig.dependencies, { + get [dependencyName](): DependencyConfig { + return getDependencyConfig( + root, + dependencyName, + finalConfig, + config, + userConfig, + ); + }, + }); + return nextConfig; } catch { return acc; } diff --git a/packages/cli-config/src/schema.ts b/packages/cli-config/src/schema.ts index 0eb8e5013..143808907 100644 --- a/packages/cli-config/src/schema.ts +++ b/packages/cli-config/src/schema.ts @@ -46,6 +46,7 @@ const healthCheck = t.object({ healthchecks: t.array().items( t.object({ label: t.string().required(), + visible: t.bool(), isRequired: t.bool(), description: t.string(), getDiagnostics: t.func(),