diff --git a/.size-limit.js b/.size-limit.js index a1f3b97a44..8e8736e4c1 100644 --- a/.size-limit.js +++ b/.size-limit.js @@ -45,7 +45,7 @@ module.exports = [ }, { path: "packages/brick-kit/dist/index.esm.js", - limit: "110 KB", + limit: "111 KB", }, { path: "packages/brick-types/dist/index.esm.js", diff --git a/packages/brick-kit/src/core/Kernel.spec.ts b/packages/brick-kit/src/core/Kernel.spec.ts index ed444083f3..85a93cba43 100644 --- a/packages/brick-kit/src/core/Kernel.spec.ts +++ b/packages/brick-kit/src/core/Kernel.spec.ts @@ -506,6 +506,7 @@ describe("Kernel", () => { const appHello: any = { app: { id: "hello", + defaultConfig: { configA: { key1: "value1" } }, }, }; mockStandaloneBootstrap.mockResolvedValueOnce({ @@ -519,7 +520,8 @@ describe("Kernel", () => { }, ], userConfig: { - configA: "valueA", + configA: { key2: "value2" }, + configB: "valueB", }, }); spyOnCheckLogin.mockResolvedValueOnce({ @@ -538,7 +540,12 @@ describe("Kernel", () => { expect(spyOnRuntimeMicroAppStandalone).toBeCalledTimes(1); expect(kernel.bootstrapData.storyboards[0].app.userConfig).toEqual({ - configA: "valueA", + configA: { key2: "value2" }, + configB: "valueB", + }); + expect(kernel.bootstrapData.storyboards[0].app.config).toEqual({ + configA: { key1: "value1", key2: "value2" }, + configB: "valueB", }); }); diff --git a/packages/brick-kit/src/core/Kernel.ts b/packages/brick-kit/src/core/Kernel.ts index df1e193b75..081b69cda1 100644 --- a/packages/brick-kit/src/core/Kernel.ts +++ b/packages/brick-kit/src/core/Kernel.ts @@ -1,4 +1,4 @@ -import { cloneDeep, pick } from "lodash"; +import { cloneDeep, merge, pick } from "lodash"; import { loadScript, prefetchScript, @@ -10,6 +10,7 @@ import { getDllAndDepsByResource, scanProcessorsInAny, CustomApiInfo, + deepFreeze, } from "@next-core/brick-utils"; import i18next from "i18next"; import * as AuthSdk from "@next-sdk/auth-sdk"; @@ -223,7 +224,7 @@ export class Kernel { templatePackages: [], ...data, } as BootstrapData; - // Merge `app.defaultConfig` and `app.userConfig` to `app.config`. + // Merge `app.defaultConfig` and `app.userConfig` to `app.config`. Should merge config again in standalone mode when doFulfilStoryboard because static bootstrap.json do not have userConfig. processBootstrapResponse(bootstrapResponse); this.bootstrapData = { ...bootstrapResponse, @@ -279,11 +280,14 @@ export class Kernel { ); } if (appRuntimeData) { - // merge user config + // Merge `app.defaultConfig` and `app.userConfig` to `app.config`. storyboard.app.userConfig = { ...storyboard.app.userConfig, ...appRuntimeData.userConfig, }; + storyboard.app.config = deepFreeze( + merge({}, storyboard.app.defaultConfig, storyboard.app.userConfig) + ); // get inject menus (Actually, appRuntimeData contains both main and inject menus) storyboard.meta = { ...storyboard.meta,