@@ -6,9 +6,9 @@ import { normalizeTheme } from './normalize'
66import { ShikiError } from './error'
77
88export class Registry extends TextMateRegistry {
9- private _resolvedThemes : Record < string , ThemeRegistrationResolved > = { }
10- private _resolvedGrammars : Record < string , IGrammar > = { }
11- private _langMap : Record < string , LanguageRegistration > = { }
9+ private _resolvedThemes : Map < string , ThemeRegistrationResolved > = new Map ( )
10+ private _resolvedGrammars : Map < string , IGrammar > = new Map ( )
11+ private _langMap : Map < string , LanguageRegistration > = new Map ( )
1212 private _langGraph : Map < string , LanguageRegistration > = new Map ( )
1313
1414 private _textmateThemeCache = new WeakMap < IRawTheme , TextMateTheme > ( )
@@ -29,15 +29,15 @@ export class Registry extends TextMateRegistry {
2929
3030 public getTheme ( theme : ThemeRegistrationAny | string ) {
3131 if ( typeof theme === 'string' )
32- return this . _resolvedThemes [ theme ]
32+ return this . _resolvedThemes . get ( theme )
3333 else
3434 return this . loadTheme ( theme )
3535 }
3636
3737 public loadTheme ( theme : ThemeRegistrationAny ) : ThemeRegistrationResolved {
3838 const _theme = normalizeTheme ( theme )
3939 if ( _theme . name ) {
40- this . _resolvedThemes [ _theme . name ] = _theme
40+ this . _resolvedThemes . set ( _theme . name , _theme )
4141 // Reset cache
4242 this . _loadedThemesCache = null
4343 }
@@ -46,7 +46,7 @@ export class Registry extends TextMateRegistry {
4646
4747 public getLoadedThemes ( ) {
4848 if ( ! this . _loadedThemesCache )
49- this . _loadedThemesCache = Object . keys ( this . _resolvedThemes )
49+ this . _loadedThemesCache = [ ... this . _resolvedThemes . keys ( ) ]
5050 return this . _loadedThemesCache
5151 }
5252
@@ -76,14 +76,17 @@ export class Registry extends TextMateRegistry {
7676 resolved . add ( name )
7777 }
7878 }
79- return this . _resolvedGrammars [ name ]
79+ return this . _resolvedGrammars . get ( name )
8080 }
8181
8282 public async loadLanguage ( lang : LanguageRegistration ) {
8383 if ( this . getGrammar ( lang . name ) )
8484 return
8585
86- const embeddedLazilyBy = new Set ( Object . values ( this . _langMap ) . filter ( i => i . embeddedLangsLazy ?. includes ( lang . name ) ) )
86+ const embeddedLazilyBy = new Set (
87+ [ ...this . _langMap . values ( ) ]
88+ . filter ( i => i . embeddedLangsLazy ?. includes ( lang . name ) ) ,
89+ )
8790
8891 this . _resolver . addLanguage ( lang )
8992
@@ -95,7 +98,7 @@ export class Registry extends TextMateRegistry {
9598 // @ts -expect-error Private members, set this to override the previous grammar (that can be a stub)
9699 this . _syncRegistry . _rawGrammars . set ( lang . scopeName , lang )
97100 const g = await this . loadGrammarWithConfiguration ( lang . scopeName , 1 , grammarConfig )
98- this . _resolvedGrammars [ lang . name ] = g !
101+ this . _resolvedGrammars . set ( lang . name , g ! )
99102 if ( lang . aliases ) {
100103 lang . aliases . forEach ( ( alias ) => {
101104 this . _alias [ alias ] = lang . name
@@ -107,14 +110,14 @@ export class Registry extends TextMateRegistry {
107110 // If there is a language that embeds this language lazily, we need to reload it
108111 if ( embeddedLazilyBy . size ) {
109112 for ( const e of embeddedLazilyBy ) {
110- delete this . _resolvedGrammars [ e . name ]
113+ this . _resolvedGrammars . delete ( e . name )
111114 // Reset cache
112115 this . _loadedLanguagesCache = null
113116 // @ts -expect-error clear cache
114117 this . _syncRegistry ?. _injectionGrammars ?. delete ( e . scopeName )
115118 // @ts -expect-error clear cache
116119 this . _syncRegistry ?. _grammars ?. delete ( e . scopeName )
117- await this . loadLanguage ( this . _langMap [ e . name ] )
120+ await this . loadLanguage ( this . _langMap . get ( e . name ) ! )
118121 }
119122 }
120123 }
@@ -124,6 +127,15 @@ export class Registry extends TextMateRegistry {
124127 await this . loadLanguages ( this . _langs )
125128 }
126129
130+ public override dispose ( ) : void {
131+ super . dispose ( )
132+ this . _resolvedThemes . clear ( )
133+ this . _resolvedGrammars . clear ( )
134+ this . _langMap . clear ( )
135+ this . _langGraph . clear ( )
136+ this . _loadedThemesCache = null
137+ }
138+
127139 public async loadLanguages ( langs : LanguageRegistration [ ] ) {
128140 for ( const lang of langs )
129141 this . resolveEmbeddedLanguages ( lang )
@@ -146,17 +158,20 @@ export class Registry extends TextMateRegistry {
146158 }
147159
148160 public getLoadedLanguages ( ) {
149- if ( ! this . _loadedLanguagesCache )
150- this . _loadedLanguagesCache = Object . keys ( { ...this . _resolvedGrammars , ...this . _alias } )
161+ if ( ! this . _loadedLanguagesCache ) {
162+ this . _loadedLanguagesCache = [
163+ ...new Set ( [ ...this . _resolvedGrammars . keys ( ) , ...Object . keys ( this . _alias ) ] ) ,
164+ ]
165+ }
151166 return this . _loadedLanguagesCache
152167 }
153168
154169 private resolveEmbeddedLanguages ( lang : LanguageRegistration ) {
155- this . _langMap [ lang . name ] = lang
170+ this . _langMap . set ( lang . name , lang )
156171 this . _langGraph . set ( lang . name , lang )
157172 if ( lang . embeddedLangs ) {
158173 for ( const embeddedLang of lang . embeddedLangs )
159- this . _langGraph . set ( embeddedLang , this . _langMap [ embeddedLang ] )
174+ this . _langGraph . set ( embeddedLang , this . _langMap . get ( embeddedLang ) ! )
160175 }
161176 }
162177}
0 commit comments