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 .github/workflows/pull_request_checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 10.28.2
version: 10.30.3
run_install: false

# Set up Node.js
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10.28.2
version: 10.30.3
run_install: false

- name: Setup Node.js
Expand Down Expand Up @@ -99,7 +99,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10.28.2
version: 10.30.3
run_install: false

- name: Install dependencies
Expand Down Expand Up @@ -170,7 +170,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10.28.2
version: 10.30.3
run_install: false

- name: Setup Node.js
Expand Down
6 changes: 4 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ All notable changes to this project will be documented in this file. Dates are d

Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).

#### [1.9.0](https://github.com/godotlauncher/launcher/compare/v1.8.1...1.9.0)
#### [v1.9.0](https://github.com/godotlauncher/launcher/compare/v1.8.1...v1.9.0)

> 9 February 2026
> 6 March 2026

- Fix/improve path overwrite [`#100`](https://github.com/godotlauncher/launcher/pull/100)
- Feat: Add project path overwrite [`#92`](https://github.com/godotlauncher/launcher/pull/92)
- feat(autoUpdater): enhance version comparison and channel handling [`4d872cc`](https://github.com/godotlauncher/launcher/commit/4d872cca1a8f18cf05cee155903258fff1ea55c8)

#### [v1.8.1](https://github.com/godotlauncher/launcher/compare/v1.8.0...v1.8.1)

Expand Down
2 changes: 1 addition & 1 deletion biome.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.14/schema.json",
"$schema": "https://biomejs.dev/schemas/2.4.5/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
Expand Down
Binary file modified docs/screenshots/screen_help_view_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_help_view_light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_installs_new_version_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_installs_new_version_light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_installs_view_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_installs_view_light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_projects_drop_overlay_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_projects_drop_overlay_light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_projects_new_project_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_projects_new_project_light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_projects_new_project_no_git_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_projects_new_project_no_git_light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_projects_new_project_no_tools_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_projects_view_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_projects_view_light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_settings_appearance_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_settings_appearance_light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_settings_behavior_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_settings_behavior_light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_settings_installs_dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screen_settings_installs_light.webp
Binary file modified docs/screenshots/screen_settings_projects_dark.webp
Binary file modified docs/screenshots/screen_settings_projects_light.webp
Binary file modified docs/screenshots/screen_settings_tools_dark.webp
Binary file modified docs/screenshots/screen_settings_tools_light.webp
Binary file modified docs/screenshots/screen_settings_updates_dark.webp
Binary file modified docs/screenshots/screen_settings_updates_light.webp
97 changes: 80 additions & 17 deletions e2e/documentationScreenshot.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ const SCREENSHOTS: ScreenshotConfig[] = [
},
];

const SAMPLE_INSTALLED_RELEASES = [
const SAMPLE_INSTALLED_RELEASES: InstalledRelease[] = [
{
version: '4.4.1-stable',
version_number: 4.4,
Expand Down Expand Up @@ -305,7 +305,7 @@ const SAMPLE_INSTALLED_RELEASES = [
},
];

const SAMPLE_PROJECTS = [
const SAMPLE_PROJECTS: ProjectDetails[] = [
{
name: 'My-Awesome-Game',
path: '/Users/docs/Godot/Projects/my-awesome-game',
Expand Down Expand Up @@ -358,7 +358,7 @@ const SAMPLE_AVAILABLE_RELEASES: ReleaseSummary[] =
const SAMPLE_AVAILABLE_PRERELEASES: ReleaseSummary[] =
SAMPLE_PRERELEASE_CACHE_FILE.releases;

const SAMPLE_PREFS = {
const SAMPLE_PREFS: UserPreferences = {
prefs_version: 3,
install_location: '/Users/docs/Godot/Editors',
config_location: '/Users/docs/.gd-launcher',
Expand Down Expand Up @@ -474,10 +474,16 @@ async function hideProjectsDropOverlay(page: ElectronPage) {

async function applyTheme(page: ElectronPage, theme: ThemeConfig) {
await page.emulateMedia({ colorScheme: theme.colorScheme });
await expect(page.getByTestId('btnSettings')).toBeVisible({
timeout: 15000,
});
await page.getByTestId('btnSettings').click();
await page.getByTestId('tabAppearance').click();
await page.getByTestId(theme.toggleTestId).check();
await page.waitForTimeout(400);
await expect(page.getByTestId('btnProjects')).toBeVisible({
timeout: 15000,
});
await page.getByTestId('btnProjects').click();
}

Expand Down Expand Up @@ -608,6 +614,68 @@ async function stubAppData(
);
}

async function prepareAppWithStubbedData(
page: ElectronPage,
electronApp: ElectronApplication,
) {
await stubAppData(
electronApp,
SAMPLE_PREFS,
SAMPLE_PROJECTS,
SAMPLE_INSTALLED_RELEASES,
SAMPLE_AVAILABLE_RELEASES,
SAMPLE_AVAILABLE_PRERELEASES,
);
await stubInstalledTools(electronApp, DEFAULT_TOOLS);
await page.reload();
await waitForPreloadScript(page);
await page.setViewportSize({ width: 1024, height: 600 });
}

async function ensureMainNavigationReady(
page: ElectronPage,
electronApp: ElectronApplication,
) {
const btnProjects = page.getByTestId('btnProjects');
const btnInstalls = page.getByTestId('btnInstalls');
const btnSettings = page.getByTestId('btnSettings');

for (let attempt = 1; attempt <= 3; attempt++) {
await prepareAppWithStubbedData(page, electronApp);
try {
await expect(btnProjects).toBeVisible({ timeout: 15000 });
await expect(btnInstalls).toBeVisible({ timeout: 15000 });
await expect(btnSettings).toBeVisible({ timeout: 15000 });
return;
} catch {
if (attempt === 3) {
const diagnostics = await page.evaluate(() => {
const testIds = Array.from(
document.querySelectorAll('[data-testid]'),
)
.map((el) => el.getAttribute('data-testid'))
.filter((value): value is string => Boolean(value));

return {
title: document.title,
testIds: testIds.slice(0, 25),
bodyText: document.body?.innerText
?.replace(/\s+/g, ' ')
.trim()
.slice(0, 250),
};
});

throw new Error(
`Main navigation did not render after retrying app bootstrap. Diagnostics: ${JSON.stringify(
diagnostics,
)}`,
);
}
}
}
}

test('captures documentation screenshots for each main view', async ({}, testInfo) => {
testInfo.setTimeout(240000);
const fixtureHome = await createFixtureHome();
Expand All @@ -619,8 +687,14 @@ test('captures documentation screenshots for each main view', async ({}, testInf
);
const existingNodeOptions = process.env.NODE_OPTIONS?.trim();
const requireOverrideOption = `--require "${overrideHomeScript}"`;
const launchEnv: NodeJS.ProcessEnv = {
...process.env,
const baseEnv = Object.fromEntries(
Object.entries(process.env).filter(
(entry): entry is [string, string] =>
typeof entry[1] === 'string',
),
);
const launchEnv: Record<string, string> = {
...baseEnv,
NODE_ENV: 'development',
APPDATA: path.join(fixtureHome, 'AppData', 'Roaming'),
LOCALAPPDATA: path.join(fixtureHome, 'AppData', 'Local'),
Expand All @@ -640,18 +714,7 @@ test('captures documentation screenshots for each main view', async ({}, testInf
try {
const mainPage = await electronApp.firstWindow();
await waitForPreloadScript(mainPage);
await stubAppData(
electronApp,
SAMPLE_PREFS,
SAMPLE_PROJECTS,
SAMPLE_INSTALLED_RELEASES,
SAMPLE_AVAILABLE_RELEASES,
SAMPLE_AVAILABLE_PRERELEASES,
);
await stubInstalledTools(electronApp, DEFAULT_TOOLS);
await mainPage.reload();
await waitForPreloadScript(mainPage);
await mainPage.setViewportSize({ width: 1024, height: 600 });
await ensureMainNavigationReady(mainPage, electronApp);
await mainPage.getByTestId('btnProjects').click();
await expect(
mainPage.getByRole('button', {
Expand Down
13 changes: 13 additions & 0 deletions e2e/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"extends": "../tsconfig.node.json",
"compilerOptions": {
"composite": false,
"incremental": false,
"noEmit": true,
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"types": ["node", "@playwright/test"],
"resolveJsonModule": true
},
"include": ["./**/*.ts", "../globals.d.ts", "../playwright.config.ts"],
"exclude": ["../node_modules"]
}
48 changes: 25 additions & 23 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "godot-launcher",
"private": true,
"version": "1.9.0-beta.2",
"packageManager": "pnpm@10.28.2",
"version": "1.9.0",
"packageManager": "pnpm@10.30.3",
"description": "Godot Launcher is a companion app for managing Godot projects with per-project editor settings.",
"keywords": [
"godot",
Expand Down Expand Up @@ -55,53 +55,55 @@
},
"dependencies": {
"clsx": "^2.1.1",
"core-util-is": "^1.0.3",
"decompress": "^4.2.1",
"electron-log": "^5.4.3",
"electron-updater": "^6.7.3",
"i18next": "^25.8.4",
"electron-updater": "^6.8.3",
"inherits": "^2.0.4",
"i18next": "^25.8.14",
"i18next-fs-backend": "^2.6.1",
"javascript-time-ago": "^2.6.2",
"lucide-react": "^0.563.0",
"process-nextick-args": "^2.0.1",
"javascript-time-ago": "^2.6.4",
"lucide-react": "^0.577.0",
"mustache": "^4.2.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"react-i18next": "^16.5.4",
"semver": "^7.7.4",
"which": "^6.0.0"
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.2",
"which": "^6.0.1"
},
"devDependencies": {
"@babel/helpers": "^7.28.6",
"@biomejs/biome": "^2.3.14",
"@biomejs/biome": "^2.4.5",
"@playwright/test": "^1.58.2",
"@tailwindcss/postcss": "^4.1.18",
"@tailwindcss/postcss": "^4.2.1",
"@tailwindcss/typography": "^0.5.19",
"@tailwindcss/vite": "^4.1.18",
"@tailwindcss/vite": "^4.2.1",
"@types/decompress": "^4.2.7",
"@types/mustache": "^4.2.6",
"@types/node": "^24",
"@types/react": "^19.2.13",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@types/semver": "^7.7.1",
"@types/which": "^3.0.4",
"@typescript-eslint/eslint-plugin": "^8.54.0",
"@typescript-eslint/parser": "^8.54.0",
"@vitejs/plugin-react": "^5.1.3",
"@typescript-eslint/eslint-plugin": "^8.56.1",
"@typescript-eslint/parser": "^8.56.1",
"@vitejs/plugin-react": "^5.1.4",
"@vitest/coverage-v8": "^4.0.18",
"auto-changelog": "^2.5.0",
"cross-env": "^10.1.0",
"daisyui": "^5.5.18",
"dotenv": "^17.2.4",
"daisyui": "^5.5.19",
"dotenv": "^17.3.1",
"dotenv-expand": "^12.0.3",
"electron": "^40.2.1",
"electron-builder": "^26.7.0",
"eslint": "^9.39.2",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-react-refresh": "^0.5.0",
"electron": "^40.7.0",
"electron-builder": "^26.8.1",
"npm-run-all": "^4.1.5",
"postcss": "^8.5.6",
"postcss": "^8.5.8",
"prettier": "^3.8.1",
"sharp": "^0.34.5",
"tailwindcss": "^4.1.18",
"tailwindcss": "^4.2.1",
"typescript": "^5.9.3",
"vite": "^7.3.1",
"vitest": "^4.0.18"
Expand Down
Loading