Skip to content

Commit

Permalink
feat: early preference support configure prefix (#3584)
Browse files Browse the repository at this point in the history
  • Loading branch information
bytemain authored Apr 25, 2024
1 parent 6970c6b commit 33d87d1
Show file tree
Hide file tree
Showing 12 changed files with 66 additions and 41 deletions.
13 changes: 8 additions & 5 deletions packages/core-browser/src/bootstrap/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
ContributionProvider,
DefaultStorageProvider,
Deferred,
DisposableCollection,
GeneralSettingsId,
IAppLifeCycleService,
IApplicationService,
Expand Down Expand Up @@ -89,6 +90,7 @@ export class ClientApp implements IClientApp, IDisposable {
public injector: Injector;
public config: AppConfig;
public commandRegistry: CommandRegistry;
public runtime: ElectronRendererRuntime | BrowserRuntime;

private logger: ILogServiceClient;
private connectionPath: UrlProvider;
Expand All @@ -98,7 +100,8 @@ export class ClientApp implements IClientApp, IDisposable {
private contributionsProvider: ContributionProvider<ClientAppContribution>;
private nextMenuRegistry: MenuRegistryImpl;
private stateService: ClientAppStateService;
runtime: ElectronRendererRuntime | BrowserRuntime;

protected _disposables = new DisposableCollection();

constructor(protected opts: IClientAppOpts) {
const {
Expand Down Expand Up @@ -618,9 +621,9 @@ export class ClientApp implements IClientApp, IDisposable {
}

protected initEarlyPreference(workspaceDir: string) {
registerLocalStorageProvider(GeneralSettingsId.Theme, workspaceDir);
registerLocalStorageProvider(GeneralSettingsId.Icon, workspaceDir);
registerLocalStorageProvider(GeneralSettingsId.Language, workspaceDir);
this._disposables.push(registerLocalStorageProvider(GeneralSettingsId.Theme, workspaceDir));
this._disposables.push(registerLocalStorageProvider(GeneralSettingsId.Icon, workspaceDir));
this._disposables.push(registerLocalStorageProvider(GeneralSettingsId.Language, workspaceDir));
}

public async dispose() {
Expand All @@ -633,7 +636,7 @@ export class ClientApp implements IClientApp, IDisposable {
if (isOSX) {
document.body.removeEventListener('wheel', this._handleWheel);
}

this._disposables.dispose();
this.disposeSideEffect();
}

Expand Down
5 changes: 2 additions & 3 deletions packages/core-browser/src/common/common.define.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ export interface ClientAppContribution {
onStart?(app: IClientApp): MaybePromise<void>;

/**
* 大部分模块启动完成
* @param app
* Most of the modules have been started.
*/
onDidStart?(app: IClientApp): MaybePromise<void>;

Expand Down Expand Up @@ -49,7 +48,7 @@ export interface ClientAppContribution {
onDisposeSideEffects?(app: IClientApp): void;

/**
*
* Called When the application is reconnected.
*/
onReconnect?(app: IClientApp): void;
}
45 changes: 32 additions & 13 deletions packages/core-browser/src/preferences/early-preferences.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Event, GeneralSettingsId, PreferenceItem, getLanguageId } from '@opensumi/ide-core-common';
import { Disposable, Event, GeneralSettingsId, PreferenceItem, getLanguageId } from '@opensumi/ide-core-common';

import { IPreferences } from '../bootstrap';

Expand All @@ -16,9 +16,16 @@ const providers = new Map<string, IExternalPreferenceProvider>();

export function registerExternalPreferenceProvider<T>(name: string, provider: IExternalPreferenceProvider<T>) {
if (providers.get(name)) {
return; // 不可覆盖,先注册的生效
// 不可覆盖,先注册的生效
return Disposable.NULL;
}
providers.set(name, provider);

return {
dispose() {
providers.delete(name);
},
};
}

export function getExternalPreferenceProvider(name: string) {
Expand Down Expand Up @@ -59,14 +66,26 @@ export function getPreferenceLanguageId(defaultPreferences?: IPreferences): stri
}

// 默认使用 localStorage
export function registerLocalStorageProvider(key: string, workspaceFolder?: string) {
export function registerLocalStorageProvider(key: string, workspaceFolder?: string, prefix = '') {
function getScopePrefix(scope: PreferenceScope) {
if (scope === PreferenceScope.Workspace) {
return workspaceFolder;
let text: string = '';
if (scope === PreferenceScope.Workspace && workspaceFolder) {
text = workspaceFolder;
} else {
text = scope.toString();
}
return scope;

if (prefix) {
return prefix + ':' + text;
}
return text;
}

function createLocalStorageKey(scope: PreferenceScope) {
return getScopePrefix(scope) + `:${key}`;
}
registerExternalPreferenceProvider<string>(key, {

return registerExternalPreferenceProvider<string>(key, {
set: (value, scope) => {
if (scope >= PreferenceScope.Folder) {
// earlyPreference不支持针对作用域大于等于Folder的值设置
Expand All @@ -78,17 +97,17 @@ export function registerLocalStorageProvider(key: string, workspaceFolder?: stri
return;
}

if ((global as any).localStorage) {
if (global.localStorage) {
if (value !== undefined) {
localStorage.setItem(getScopePrefix(scope) + `:${key}`, value);
localStorage.setItem(createLocalStorageKey(scope), value);
} else {
localStorage.removeItem(getScopePrefix(scope) + `:${key}`);
localStorage.removeItem(createLocalStorageKey(scope));
}
}
},
get: (scope) => {
if ((global as any).localStorage) {
return localStorage.getItem(getScopePrefix(scope) + `:${key}`) || undefined;
if (global.localStorage) {
return localStorage.getItem(createLocalStorageKey(scope)) || undefined;
}
},
});
Expand All @@ -104,7 +123,7 @@ export function getExternalPreference<T>(
: PreferenceScope.getReversedScopes();
for (const scope of scopes) {
const value = providers.get(preferenceName)?.get(scope);
if (value !== undefined) {
if (value) {
return {
value,
scope,
Expand Down
4 changes: 3 additions & 1 deletion packages/core-browser/src/preferences/preference-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,9 @@ export abstract class PreferenceProvider implements IDisposable {
return this.doResolve<T>(preferenceName, resourceUri, language).value;
}

// @final 不要 override 这个
/**
* @final
*/
public resolve<T>(preferenceName: string, resourceUri?: string, language?: string): PreferenceResolveResult<T> {
if (PreferenceProvider.PreferenceDelegatesReverse[preferenceName]) {
const res = this.getDelegateToValueFromDelegated(preferenceName);
Expand Down
2 changes: 1 addition & 1 deletion packages/core-common/src/preferences/preference-scope.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export namespace PreferenceScope {
return names;
}

// 转义 vscode 中对configuration中scope的定义
// 转义 vscode 中对 configuration 中 scope 的定义
export function fromString(strScope: string): PreferenceScope | undefined {
switch (strScope) {
case 'application':
Expand Down
5 changes: 3 additions & 2 deletions packages/startup/entry/web/render-app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
console.time('Render');

import { Injector } from '@opensumi/di';
import { IClientAppOpts, SlotLocation } from '@opensumi/ide-core-browser';
import { IClientAppOpts, SlotLocation, registerLocalStorageProvider } from '@opensumi/ide-core-browser';
import { ClientApp } from '@opensumi/ide-core-browser/lib/bootstrap/app';
import { uuid } from '@opensumi/ide-core-common';
import { GeneralSettingsId, uuid } from '@opensumi/ide-core-common';
import { ExpressFileServerModule } from '@opensumi/ide-express-file-server/lib/browser';
import { defaultConfig } from '@opensumi/ide-main-layout/lib/browser/default-config';
import { RemoteOpenerModule } from '@opensumi/ide-remote-opener/lib/browser';
Expand Down Expand Up @@ -41,6 +41,7 @@ export async function renderApp(opts: IClientAppOpts) {
// eslint-disable-next-line no-console
console.timeEnd('Render');
};
registerLocalStorageProvider(GeneralSettingsId.Theme, opts.workspaceDir || '', 'prefix1');

const app = new ClientApp(opts);

Expand Down
12 changes: 6 additions & 6 deletions packages/storage/__tests__/browser/storage.service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,8 @@ describe('StorageProvider should be work', () => {
const extensions = ['opensumi.test.extension'];
await extensionStorage.set('extensions', extensions);
expect(extensionStorage.get('extensions')).toEqual(extensions);
const browserLocalStroage = injector.get(ScopedBrowserStorageService, [MockWorkspaceService.workspace.uri]);
const cache = browserLocalStroage.getData<any>(STORAGE_NAMESPACE.EXTENSIONS.path.toString());
const browserLocalStorage = injector.get(ScopedBrowserStorageService, [MockWorkspaceService.workspace.uri]);
const cache = browserLocalStorage.getData<any>(STORAGE_NAMESPACE.EXTENSIONS.path.toString());
expect(typeof cache?.expires).toBe('undefined');
expect(cache?.extensions).toBe(JSON.stringify(extensions));
});
Expand All @@ -155,8 +155,8 @@ describe('StorageProvider should be work', () => {
const recents = ['opensumi.test.recent'];
await recentStorage.set('recents', recents);
expect(recentStorage.get('recents')).toEqual(recents);
const browserLocalStroage = injector.get(GlobalBrowserStorageService);
const cache = browserLocalStroage.getData<any>(STORAGE_NAMESPACE.GLOBAL_RECENT_DATA.path.toString());
const browserLocalStorage = injector.get(GlobalBrowserStorageService);
const cache = browserLocalStorage.getData<any>(STORAGE_NAMESPACE.GLOBAL_RECENT_DATA.path.toString());
expect(cache?.expires).toBeUndefined();
expect(cache?.recents).toBe(JSON.stringify(recents));
});
Expand All @@ -170,8 +170,8 @@ describe('StorageProvider should be work', () => {
const test = ['test'];
await extensionStorage.set('test', test);
expect(extensionStorage.get('test')).toEqual(test);
const browserLocalStroage = injector.get(ScopedBrowserStorageService, [MockWorkspaceService.workspace.uri]);
const cache = browserLocalStroage.getData<any>(customId.path.toString());
const browserLocalStorage = injector.get(ScopedBrowserStorageService, [MockWorkspaceService.workspace.uri]);
const cache = browserLocalStorage.getData<any>(customId.path.toString());
expect(cache?.expires).toBeUndefined();
expect(cache?.test).toBeUndefined();
});
Expand Down
2 changes: 1 addition & 1 deletion packages/storage/src/browser/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ export class Storage implements IStorage {
insert: this.mapToJson(this.pendingInserts),
delete: Array.from(this.pendingDeletes),
};
// 同时在 LocalStroage 中同步缓存变化
// 同时在 LocalStorage 中同步缓存变化
if (this.browserLocalStorage) {
let cache = this.mapToJson(this.cache);
for (const del of updateRequest?.delete || []) {
Expand Down
2 changes: 1 addition & 1 deletion packages/terminal-next/src/browser/terminal.restore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export class TerminalRestore extends Disposable implements ITerminalRestore {
restore() {
const key = this.storageKey;
const history = this.scopedBrowserStorageService.getData<ITerminalBrowserHistory>(key);
// this.scopedBrowserStorageService.removeData(key); // 触发恢复之后清除掉缓存

if (history) {
try {
return this.controller.recovery(history);
Expand Down
7 changes: 5 additions & 2 deletions packages/theme/src/browser/theme.contribution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
CommandRegistry,
Domain,
GeneralSettingsId,
ILogger,
Mode,
PreferenceScope,
PreferenceService,
Expand All @@ -20,7 +21,6 @@ import { IMenuRegistry, MenuContribution, MenuId } from '@opensumi/ide-core-brow
import {
BuiltinTheme,
BuiltinThemeComparator,
DEFAULT_PRODUCT_ICON_THEME_ID,
DEFAULT_THEME_ID,
IIconService,
IProductIconService,
Expand Down Expand Up @@ -66,6 +66,9 @@ export class ThemeContribution implements MenuContribution, CommandContribution,
@Autowired(ISemanticTokenRegistry)
protected readonly semanticTokenRegistry: ISemanticTokenRegistry;

@Autowired(ILogger)
protected readonly logger: ILogger;

async initialize() {
this.registerDefaultColorTheme();

Expand Down Expand Up @@ -204,7 +207,7 @@ export class ThemeContribution implements MenuContribution, CommandContribution,
const selector = this.semanticTokenRegistry.parseTokenSelector(selectorString);
this.semanticTokenRegistry.registerTokenStyleDefault(selector, { scopesToProbe });
} catch (e) {
// ignore error
this.logger.error('Failed to register token style default', e);
}
}

Expand Down
8 changes: 3 additions & 5 deletions packages/theme/src/browser/workbench.theme.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ import {
selectionBackground,
} from '../common/color-registry';
import { ThemeChangedEvent } from '../common/event';
import { getIconRegistry } from '../common/icon-registry';
import {
ColorIdentifier,
DEFAULT_THEME_ID,
Expand Down Expand Up @@ -77,8 +76,6 @@ const tokenGroupToScopesMap = {
export class WorkbenchThemeService extends WithEventBus implements IThemeService {
private colorRegistry = getColorRegistry();

private iconRegistry = getIconRegistry();

private colorClassNameMap = new Map<string, string>();

colorThemeLoaded: Deferred<void> = new Deferred();
Expand Down Expand Up @@ -307,13 +304,14 @@ export class WorkbenchThemeService extends WithEventBus implements IThemeService
}

protected doSetPreferenceSchema() {
const enums = this.getAvailableThemeInfos().map((info) => info.themeId);
this.preferenceSchemaProvider.setSchema(
{
properties: {
[COLOR_THEME_SETTING]: {
type: 'string',
default: 'Default Dark+',
enum: this.getAvailableThemeInfos().map((info) => info.themeId),
default: enums[0],
enum: enums,
},
},
},
Expand Down
2 changes: 1 addition & 1 deletion packages/theme/src/common/theme.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@ export function getThemeId(contribution: IThemeContribution) {

function toCSSSelector(extensionId: string, path: string) {
if (path.indexOf('./') === 0) {
path = path.substr(2);
path = path.substring(2);
}
let str = `${extensionId}-${path}`;

Expand Down

0 comments on commit 33d87d1

Please sign in to comment.