Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion languages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@
"panels.settings": "Anwendungseinstellungen",
"panels.faq": "FAQ",
"panels.utilities": "Werkzeuge",
"panels.developer": "Entwickler",
"panels.developer": "Entwickleroptionen",
"dev.mode": "Entwicklermodus",
"faq.searchPlaceholder": "FAQ durchsuchen...",
"faq.noResults": "Keine Ergebnisse gefunden.",
Expand Down
75 changes: 55 additions & 20 deletions src/main/AssetManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,18 @@ function httpsGetJson(url: string): Promise<unknown> {
let data = '';
res.on('data', (c) => (data += c));
res.on('end', () => {
try { resolve(JSON.parse(data)); }
catch { reject(new Error('JSON parse error')); }
try {
resolve(JSON.parse(data));
} catch {
reject(new Error('JSON parse error'));
}
});
});
req.on('error', reject);
req.setTimeout(10000, () => { req.destroy(); reject(new Error('Timeout')); });
req.setTimeout(10000, () => {
req.destroy();
reject(new Error('Timeout'));
});
});
}

Expand Down Expand Up @@ -80,7 +86,11 @@ export function setActiveTheme(themeId: string): ThemeDefinition {
return getActiveTheme();
}

export async function fetchRemoteThemes(): Promise<{ ok: boolean; themes?: ThemeDefinition[]; error?: string }> {
export async function fetchRemoteThemes(): Promise<{
ok: boolean;
themes?: ThemeDefinition[];
error?: string;
}> {
try {
const listing = await httpsGetJson(contentsUrl(THEME_GITHUB_PATH));
if (!Array.isArray(listing)) return { ok: false, error: 'Themes folder not found' };
Expand All @@ -89,24 +99,30 @@ export async function fetchRemoteThemes(): Promise<{ ok: boolean; themes?: Theme
try {
const theme = (await httpsGetJson(rawUrl(THEME_GITHUB_PATH, f.name))) as ThemeDefinition;
if (theme.id && theme.name && theme.colors) themes.push(theme);
} catch { /* skip */ }
} catch {
/* skip */
}
}
return { ok: true, themes };
} catch (e) {
return { ok: false, error: String(e) };
}
}

export async function checkThemeUpdate(themeId: string): Promise<{ hasUpdate: boolean; remoteVersion: number; localVersion: number }> {
export async function checkThemeUpdate(
themeId: string
): Promise<{ hasUpdate: boolean; remoteVersion: number; localVersion: number }> {
const state = loadThemeState();
const local = state.themes.find((t) => t.id === themeId);
if (!local) return { hasUpdate: false, remoteVersion: 0, localVersion: 0 };

const result = await fetchRemoteThemes();
if (!result.ok || !result.themes) return { hasUpdate: false, remoteVersion: local.version, localVersion: local.version };
if (!result.ok || !result.themes)
return { hasUpdate: false, remoteVersion: local.version, localVersion: local.version };

const remote = result.themes.find((t) => t.id === themeId);
if (!remote) return { hasUpdate: false, remoteVersion: local.version, localVersion: local.version };
if (!remote)
return { hasUpdate: false, remoteVersion: local.version, localVersion: local.version };

return {
hasUpdate: remote.version > local.version,
Expand Down Expand Up @@ -177,33 +193,45 @@ export function setActiveLanguage(langId: string): LanguageDefinition {
return getActiveLanguage();
}

export async function fetchRemoteLanguages(): Promise<{ ok: boolean; languages?: LanguageDefinition[]; error?: string }> {
export async function fetchRemoteLanguages(): Promise<{
ok: boolean;
languages?: LanguageDefinition[];
error?: string;
}> {
try {
const listing = await httpsGetJson(contentsUrl(GITHUB_CONFIG.languagesPath));
if (!Array.isArray(listing)) return { ok: false, error: 'Languages folder not found' };
const languages: LanguageDefinition[] = [];
for (const f of (listing as Array<{ name: string }>).filter((f) => f.name.endsWith('.json'))) {
try {
const lang = (await httpsGetJson(rawUrl(GITHUB_CONFIG.languagesPath, f.name))) as LanguageDefinition;
const lang = (await httpsGetJson(
rawUrl(GITHUB_CONFIG.languagesPath, f.name)
)) as LanguageDefinition;
if (lang.id && lang.name && lang.strings) languages.push(lang);
} catch { /* skip */ }
} catch {
/* skip */
}
}
return { ok: true, languages };
} catch (e) {
return { ok: false, error: String(e) };
}
}

export async function checkLanguageUpdate(langId: string): Promise<{ hasUpdate: boolean; remoteVersion: number; localVersion: number }> {
export async function checkLanguageUpdate(
langId: string
): Promise<{ hasUpdate: boolean; remoteVersion: number; localVersion: number }> {
const state = loadLanguageState();
const local = state.languages.find((l) => l.id === langId);
if (!local) return { hasUpdate: false, remoteVersion: 0, localVersion: 0 };

const result = await fetchRemoteLanguages();
if (!result.ok || !result.languages) return { hasUpdate: false, remoteVersion: local.version, localVersion: local.version };
if (!result.ok || !result.languages)
return { hasUpdate: false, remoteVersion: local.version, localVersion: local.version };

const remote = result.languages.find((l) => l.id === langId);
if (!remote) return { hasUpdate: false, remoteVersion: local.version, localVersion: local.version };
if (!remote)
return { hasUpdate: false, remoteVersion: local.version, localVersion: local.version };

return {
hasUpdate: remote.version > local.version,
Expand All @@ -212,7 +240,9 @@ export async function checkLanguageUpdate(langId: string): Promise<{ hasUpdate:
};
}

export async function applyLanguageUpdate(langId: string): Promise<{ ok: boolean; error?: string }> {
export async function applyLanguageUpdate(
langId: string
): Promise<{ ok: boolean; error?: string }> {
const result = await fetchRemoteLanguages();
if (!result.ok || !result.languages) return { ok: false, error: result.error ?? 'Fetch failed' };

Expand Down Expand Up @@ -244,14 +274,17 @@ function projectRoot(): string {
export function loadLocalDevThemes(): ThemeDefinition[] {
const dir = path.join(projectRoot(), 'themes');
if (!fs.existsSync(dir)) return [];
return fs.readdirSync(dir)
return fs
.readdirSync(dir)
.filter((f) => f.endsWith('.json'))
.map((f) => {
try {
const raw = fs.readFileSync(path.join(dir, f), 'utf8');
const theme = JSON.parse(raw) as ThemeDefinition;
if (theme.id && theme.name && theme.colors) return theme;
} catch { /* skip */ }
} catch {
/* skip */
}
return null;
})
.filter((t): t is ThemeDefinition => t !== null);
Expand All @@ -260,14 +293,17 @@ export function loadLocalDevThemes(): ThemeDefinition[] {
export function loadLocalDevLanguages(): LanguageDefinition[] {
const dir = path.join(projectRoot(), 'languages');
if (!fs.existsSync(dir)) return [];
return fs.readdirSync(dir)
return fs
.readdirSync(dir)
.filter((f) => f.endsWith('.json'))
.map((f) => {
try {
const raw = fs.readFileSync(path.join(dir, f), 'utf8');
const lang = JSON.parse(raw) as LanguageDefinition;
if (lang.id && lang.name && lang.strings) return lang;
} catch { /* skip */ }
} catch {
/* skip */
}
return null;
})
.filter((l): l is LanguageDefinition => l !== null);
Expand All @@ -286,4 +322,3 @@ export function syncLocalDevAssets(): { themes: number; languages: number } {
}
return { themes: tc, languages: lc };
}

14 changes: 12 additions & 2 deletions src/main/FileLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,18 @@ export function getLogFiles(profileId: string): LogFileInfo[] {
filename,
filePath,
size: stat.size,
startedAt: match?.[1]?.replace(/_/g, ' ').replace(/-/g, ':').replace(/^(\d{4}):/, '$1-').replace(/:(\d{2}):/, '-$1 ') ?? '',
stoppedAt: match?.[2]?.replace(/_/g, ' ').replace(/-/g, ':').replace(/^(\d{4}):/, '$1-').replace(/:(\d{2}):/, '-$1 ') ?? undefined,
startedAt:
match?.[1]
?.replace(/_/g, ' ')
.replace(/-/g, ':')
.replace(/^(\d{4}):/, '$1-')
.replace(/:(\d{2}):/, '-$1 ') ?? '',
stoppedAt:
match?.[2]
?.replace(/_/g, ' ')
.replace(/-/g, ':')
.replace(/^(\d{4}):/, '$1-')
.replace(/:(\d{2}):/, '-$1 ') ?? undefined,
};
})
.sort((a, b) => b.filename.localeCompare(a.filename));
Expand Down
18 changes: 8 additions & 10 deletions src/main/ProcessManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,7 @@ class ProcessManager {
this.window = win;
}

private buildArgs(
profile: Profile,
resolvedJarPath: string
): { cmd: string; args: string[] } {
private buildArgs(profile: Profile, resolvedJarPath: string): { cmd: string; args: string[] } {
const cmd = profile.javaPath || 'java';
const args: string[] = [];
for (const a of profile.jvmArgs) if (a.enabled && a.value.trim()) args.push(a.value.trim());
Expand Down Expand Up @@ -303,7 +300,12 @@ class ProcessManager {
m.intentionallyStopped = true;
this.cancelRestartTimer(profileId);

this.pushSystem('stopping', profileId, String(m.process.pid ?? 0), 'Stopping process gracefully...');
this.pushSystem(
'stopping',
profileId,
String(m.process.pid ?? 0),
'Stopping process gracefully...'
);

gracefulStop(
m.process,
Expand Down Expand Up @@ -587,11 +589,7 @@ class ProcessManager {
}
}

private flushPartial(
profileId: string,
type: 'stdout' | 'stderr',
m: ManagedProcess
) {
private flushPartial(profileId: string, type: 'stdout' | 'stderr', m: ManagedProcess) {
const partialKey = type === 'stdout' ? 'stdoutPartial' : 'stderrPartial';
const text = m[partialKey].trim();
if (!text) return;
Expand Down
3 changes: 2 additions & 1 deletion src/main/ipc/Process.ipc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ export const ProcessIPC = {
handler: (_e: any, profileId: string) => {
const profile = getAllProfiles().find((p) => p.id === profileId);
if (!profile) return { ok: false, error: 'Profile not found' };
const dir = profile.workingDir || (profile.jarPath ? require('path').dirname(profile.jarPath) : '');
const dir =
profile.workingDir || (profile.jarPath ? require('path').dirname(profile.jarPath) : '');
if (!dir) return { ok: false, error: 'No working directory configured' };
shell.openPath(dir);
return { ok: true };
Expand Down
10 changes: 3 additions & 7 deletions src/main/shared/config/GitHub.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ export const GITHUB_CONFIG = {
templateMinVersion: 1,
apiBase: 'https://api.github.com',

trustedPublishers: [
{ login: 'timonmdy', label: 'Lead Developer' },
] as TrustedPublisher[],
trustedPublishers: [{ login: 'timonmdy', label: 'Lead Developer' }] as TrustedPublisher[],

automationAccounts: ['github-actions[bot]', 'github-actions'],
} as const;
Expand All @@ -39,13 +37,11 @@ export function rawTemplateUrl(filename: string): string {

export function getPublisherTrust(login: string): { level: TrustLevel; label: string } {
const trusted = GITHUB_CONFIG.trustedPublishers.find(
(p) => p.login.toLowerCase() === login.toLowerCase(),
(p) => p.login.toLowerCase() === login.toLowerCase()
);
if (trusted) return { level: 'trusted', label: trusted.label };

if (
GITHUB_CONFIG.automationAccounts.some((a) => a.toLowerCase() === login.toLowerCase())
) {
if (GITHUB_CONFIG.automationAccounts.some((a) => a.toLowerCase() === login.toLowerCase())) {
return { level: 'automation', label: 'GitHub Actions' };
}

Expand Down
Loading
Loading