@@ -5,8 +5,12 @@ import https from 'https';
55import { GITHUB_CONFIG } from './shared/config/GitHub.config' ;
66import { BUILTIN_THEME , THEME_GITHUB_PATH } from './shared/config/Theme.config' ;
77import { ENGLISH } from './shared/config/DefaultLanguage.config' ;
8- import type { ThemeDefinition , LocalThemeState } from './shared/types/Theme.types' ;
9- import type { LanguageDefinition , LocalLanguageState } from './shared/types/Language.types' ;
8+ import type { ThemeDefinition , LocalThemeState , ThemePreview } from './shared/types/Theme.types' ;
9+ import type {
10+ LanguageDefinition ,
11+ LocalLanguageState ,
12+ LanguagePreview ,
13+ } from './shared/types/Language.types' ;
1014
1115function dataDir ( ) : string {
1216 return app . getPath ( 'userData' ) ;
@@ -93,6 +97,53 @@ export async function fetchRemoteThemes(): Promise<{
9397 }
9498}
9599
100+ export async function fetchRemoteThemePreviews ( ) : Promise < {
101+ ok : boolean ;
102+ themes ?: ThemePreview [ ] ;
103+ error ?: string ;
104+ } > {
105+ try {
106+ const listing = await httpsGetJson ( contentsUrl ( THEME_GITHUB_PATH ) ) ;
107+ if ( ! Array . isArray ( listing ) ) return { ok : false , error : 'Themes folder not found' } ;
108+ const themes : ThemePreview [ ] = [ ] ;
109+ for ( const f of ( listing as Array < { name : string } > ) . filter ( ( f ) => f . name . endsWith ( '.json' ) ) ) {
110+ try {
111+ const theme = ( await httpsGetJson ( rawUrl ( THEME_GITHUB_PATH , f . name ) ) ) as ThemeDefinition ;
112+ if ( theme . id && theme . name && theme . colors ) {
113+ themes . push ( {
114+ id : theme . id ,
115+ name : theme . name ,
116+ filename : f . name ,
117+ previewColors : {
118+ accent : theme . colors . accent ,
119+ 'base-900' : theme . colors [ 'base-900' ] ,
120+ 'surface-raised' : theme . colors [ 'surface-raised' ] ,
121+ 'text-primary' : theme . colors [ 'text-primary' ] ,
122+ } ,
123+ } ) ;
124+ }
125+ } catch {
126+ /* skip */
127+ }
128+ }
129+ return { ok : true , themes } ;
130+ } catch ( e ) {
131+ return { ok : false , error : String ( e ) } ;
132+ }
133+ }
134+
135+ export async function fetchRemoteThemeByFile (
136+ filename : string
137+ ) : Promise < { ok : boolean ; theme ?: ThemeDefinition ; error ?: string } > {
138+ try {
139+ const theme = ( await httpsGetJson ( rawUrl ( THEME_GITHUB_PATH , filename ) ) ) as ThemeDefinition ;
140+ if ( theme . id && theme . name && theme . colors ) return { ok : true , theme } ;
141+ return { ok : false , error : 'Invalid theme' } ;
142+ } catch ( e ) {
143+ return { ok : false , error : String ( e ) } ;
144+ }
145+ }
146+
96147// ─── Languages ────────────────────────────────────────────────────────────────
97148
98149const LANG_FILE = 'language-state.json' ;
@@ -142,6 +193,47 @@ export async function fetchRemoteLanguages(): Promise<{
142193 }
143194}
144195
196+ export async function fetchRemoteLanguagePreviews ( ) : Promise < {
197+ ok : boolean ;
198+ languages ?: LanguagePreview [ ] ;
199+ error ?: string ;
200+ } > {
201+ try {
202+ const listing = await httpsGetJson ( contentsUrl ( GITHUB_CONFIG . languagesPath ) ) ;
203+ if ( ! Array . isArray ( listing ) ) return { ok : false , error : 'Languages folder not found' } ;
204+ const languages : LanguagePreview [ ] = [ ] ;
205+ for ( const f of ( listing as Array < { name : string } > ) . filter ( ( f ) => f . name . endsWith ( '.json' ) ) ) {
206+ try {
207+ const lang = ( await httpsGetJson (
208+ rawUrl ( GITHUB_CONFIG . languagesPath , f . name )
209+ ) ) as LanguageDefinition ;
210+ if ( lang . id && lang . name ) {
211+ languages . push ( { id : lang . id , name : lang . name , filename : f . name } ) ;
212+ }
213+ } catch {
214+ /* skip */
215+ }
216+ }
217+ return { ok : true , languages } ;
218+ } catch ( e ) {
219+ return { ok : false , error : String ( e ) } ;
220+ }
221+ }
222+
223+ export async function fetchRemoteLanguageByFile (
224+ filename : string
225+ ) : Promise < { ok : boolean ; language ?: LanguageDefinition ; error ?: string } > {
226+ try {
227+ const lang = ( await httpsGetJson (
228+ rawUrl ( GITHUB_CONFIG . languagesPath , filename )
229+ ) ) as LanguageDefinition ;
230+ if ( lang . id && lang . name && lang . strings ) return { ok : true , language : lang } ;
231+ return { ok : false , error : 'Invalid language' } ;
232+ } catch ( e ) {
233+ return { ok : false , error : String ( e ) } ;
234+ }
235+ }
236+
145237// ─── Dev mode: load from local project directories ────────────────────────────
146238
147239function projectRoot ( ) : string {
0 commit comments