Skip to content

Commit cacde0f

Browse files
committed
fix: merge new external plugin presets into runtime settings
1 parent 0e4f4a0 commit cacde0f

3 files changed

Lines changed: 51 additions & 3 deletions

File tree

packages/tego/src/__tests__/utils.test.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, expect, it } from 'vitest';
22

3-
import { convertEnvToSettings } from '../utils';
3+
import { convertEnvToSettings, mergeExternalPluginPresets } from '../utils';
44

55
describe('convertEnvToSettings', () => {
66
it('should convert flat env into structured settings object', () => {
@@ -22,3 +22,32 @@ describe('convertEnvToSettings', () => {
2222
expect(result.env.INIT_APP_LANG).toBe('zh-CN');
2323
});
2424
});
25+
26+
describe('mergeExternalPluginPresets', () => {
27+
it('should append plugins added by a newer default preset', () => {
28+
const defaults = [
29+
{ name: 'existing', enabledByDefault: true },
30+
{ name: 'new-plugin', enabledByDefault: false },
31+
];
32+
const runtime = [{ name: 'existing', enabledByDefault: true }];
33+
34+
expect(mergeExternalPluginPresets(defaults, runtime)).toEqual(defaults);
35+
});
36+
37+
it('should preserve runtime overrides for existing plugins', () => {
38+
const defaults = [{ name: 'existing', enabledByDefault: true }];
39+
const runtime = [{ name: 'existing', enabledByDefault: false }];
40+
41+
expect(mergeExternalPluginPresets(defaults, runtime)).toEqual(runtime);
42+
});
43+
44+
it('should preserve runtime-only plugins without creating duplicates', () => {
45+
const defaults = [{ name: 'existing', enabledByDefault: true }];
46+
const runtime = [
47+
{ name: 'existing', enabledByDefault: false },
48+
{ name: 'private-plugin', enabledByDefault: false },
49+
];
50+
51+
expect(mergeExternalPluginPresets(defaults, runtime)).toEqual(runtime);
52+
});
53+
});

packages/tego/src/constants.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,23 @@ import TachybaseGlobal from '@tachybase/globals';
44

55
import _ from 'lodash';
66

7-
import { convertEnvToSettings, parseEnvironment } from './utils';
7+
import { convertEnvToSettings, mergeExternalPluginPresets, parseEnvironment } from './utils';
88

99
// 解析环境变量
1010
parseEnvironment();
1111

1212
// 读取配置
13+
const defaultSettingsPath = path.join(__dirname, '../presets/settings.js');
1314
if (!fs.existsSync(`${process.env.TEGO_RUNTIME_HOME}/settings.js`)) {
1415
fs.mkdirSync(`${process.env.TEGO_RUNTIME_HOME}`, { recursive: true });
15-
fs.copyFileSync(path.join(__dirname, '../presets/settings.js'), `${process.env.TEGO_RUNTIME_HOME}/settings.js`);
16+
fs.copyFileSync(defaultSettingsPath, `${process.env.TEGO_RUNTIME_HOME}/settings.js`);
1617
}
18+
const defaultSettings = require(defaultSettingsPath);
1719
const baseSettings = require(`${process.env.TEGO_RUNTIME_HOME}/settings.js`);
20+
baseSettings.presets.externalPlugins = mergeExternalPluginPresets(
21+
defaultSettings.presets.externalPlugins,
22+
baseSettings.presets.externalPlugins,
23+
);
1824

1925
// 用环境变量覆盖 settings.js 的配置 (环境变量优先)
2026
const envSettings = convertEnvToSettings(process.env as any);

packages/tego/src/utils.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,16 @@ export function convertEnvToSettings(flatEnv: Record<string, string | undefined>
274274

275275
return settings;
276276
}
277+
278+
export interface ExternalPluginPreset {
279+
name: string;
280+
enabledByDefault: boolean;
281+
}
282+
283+
export function mergeExternalPluginPresets(
284+
defaultPlugins: ExternalPluginPreset[] = [],
285+
runtimePlugins: ExternalPluginPreset[] = [],
286+
) {
287+
const runtimePluginNames = new Set(runtimePlugins.map((plugin) => plugin.name));
288+
return [...runtimePlugins, ...defaultPlugins.filter((plugin) => !runtimePluginNames.has(plugin.name))];
289+
}

0 commit comments

Comments
 (0)