{"version":3,"sources":["browser/monaco-indexed-db.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAC,UAAU,EAAuB,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAuB,KAAK,EAAE,YAAY,EAAqB,MAAM,kCAAkC,CAAC;AAE/G,KAAK,QAAQ,GAAG,OAAO,kCAAkC,EAAE,QAAQ,CAAC;AAepE,eAAO,MAAM,QAAQ,oCAAY,CAAC;AAElC,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;IACpC,IAAI,EAAE,QAAQ,CAAA;CACjB;AAED,yBAAiB,gBAAgB,CAAC;IAC9B,SAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,gBAAgB,CAEvE;CACJ;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAO7D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,UAAU,CAK5D;AAmBD,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,KAAK,CAiB3D;AAOD,qBAAa,kBAAmB,SAAQ,YAAY;IAChD,MAAM,CAAC,GAAG,IAAI,YAAY;IAW1B,aAAa,IAAI,IAAI;cAIL,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;CAKvD","file":"../../src/browser/monaco-indexed-db.d.ts","sourcesContent":["import * as idb from 'idb';\r\nimport {Disposable, DisposableCollection} from '@tartjs/core/lib/common';\r\nimport {BuiltinThemeProvider, Theme, ThemeService, ThemeServiceSymbol} from '@tartjs/core/lib/browser/theming';\r\n\r\ntype ThemeMix = import('./textmate/monaco-theme-registry').ThemeMix;\r\n\r\n// type ThemeMix = import('./textmate/monaco-theme-registry').ThemeMix;\r\n\r\nlet _monacoDB: Promise<idb.IDBPDatabase> | undefined;\r\nif ('indexedDB' in window) {\r\n    _monacoDB = idb.openDB('wm-monaco', 1, {\r\n        upgrade: db => {\r\n            if (!db.objectStoreNames.contains('themes')) {\r\n                db.createObjectStore('themes', {keyPath: 'id'});\r\n            }\r\n        }\r\n    });\r\n}\r\n\r\nexport const monacoDB = _monacoDB;\r\n\r\nexport interface MonacoThemeState {\r\n    id: string,\r\n    label: string,\r\n    description?: string,\r\n    uiTheme: monaco.editor.BuiltinTheme,\r\n    data: ThemeMix\r\n}\r\n\r\nexport namespace MonacoThemeState {\r\n    export function is(state: Object | undefined): state is MonacoThemeState {\r\n        return !!state && typeof state === 'object' && 'id' in state && 'label' in state && 'uiTheme' in state && 'data' in state;\r\n    }\r\n}\r\n\r\nexport async function getThemes(): Promise<MonacoThemeState[]> {\r\n    if (!monacoDB) {\r\n        return [];\r\n    }\r\n    const db = await monacoDB;\r\n    const result = await db.transaction('themes', 'readonly').objectStore('themes').getAll();\r\n    return result.filter(MonacoThemeState.is);\r\n}\r\n\r\nexport function putTheme(state: MonacoThemeState): Disposable {\r\n    const toDispose = new DisposableCollection(Disposable.create(() => { /* mark as not disposed */\r\n    }));\r\n    doPutTheme(state, toDispose);\r\n    return toDispose;\r\n}\r\n\r\nasync function doPutTheme(state: MonacoThemeState, toDispose: DisposableCollection): Promise<void> {\r\n    if (!monacoDB) {\r\n        return;\r\n    }\r\n    const db = await monacoDB;\r\n    if (toDispose.disposed) {\r\n        return;\r\n    }\r\n    const id = state.id;\r\n    await db.transaction('themes', 'readwrite').objectStore('themes').put(state);\r\n    if (toDispose.disposed) {\r\n        await deleteTheme(id);\r\n        return;\r\n    }\r\n    toDispose.push(Disposable.create(() => deleteTheme(id)));\r\n}\r\n\r\nexport async function deleteTheme(id: string): Promise<void> {\r\n    if (!monacoDB) {\r\n        return;\r\n    }\r\n    const db = await monacoDB;\r\n    await db.transaction('themes', 'readwrite').objectStore('themes').delete(id);\r\n}\r\n\r\nexport function stateToTheme(state: MonacoThemeState): Theme {\r\n    const {id, label, description, uiTheme, data} = state;\r\n    const type = uiTheme === 'vs' ? 'light' : uiTheme === 'vs-dark' ? 'dark' : 'hc';\r\n    const builtInTheme = uiTheme === 'vs' ? BuiltinThemeProvider.lightCss : BuiltinThemeProvider.darkCss;\r\n    return {\r\n        type,\r\n        id,\r\n        label,\r\n        description,\r\n        editorTheme: data.name!,\r\n        activate(): void {\r\n            builtInTheme.use();\r\n        },\r\n        deactivate(): void {\r\n            builtInTheme.unuse();\r\n        }\r\n    };\r\n}\r\n\r\nasync function getThemeFromDB(id: string): Promise<Theme | undefined> {\r\n    const matchingState = (await getThemes()).find(theme => theme.id === id);\r\n    return matchingState && stateToTheme(matchingState);\r\n}\r\n\r\nexport class ThemeServiceWithDB extends ThemeService {\r\n    static get(): ThemeService {\r\n        const global = window as any; // eslint-disable-line @typescript-eslint/no-explicit-any\r\n        if (!global[ThemeServiceSymbol]) {\r\n            const themeService = new ThemeServiceWithDB();\r\n            themeService.register(...BuiltinThemeProvider.themes);\r\n            themeService.startupTheme();\r\n            global[ThemeServiceSymbol] = themeService;\r\n        }\r\n        return global[ThemeServiceSymbol];\r\n    }\r\n\r\n    loadUserTheme(): void {\r\n        this.loadUserThemeWithDB();\r\n    }\r\n\r\n    protected async loadUserThemeWithDB(): Promise<void> {\r\n        const themeId = window.localStorage.getItem('theme') || this.defaultTheme.id;\r\n        const theme = this.themes[themeId] ?? await getThemeFromDB(themeId) ?? this.defaultTheme;\r\n        this.setCurrentTheme(theme.id);\r\n    }\r\n}\r\n\r\nThemeService.get = ThemeServiceWithDB.get;\r\n"]}