From 250cd5f616e69b5839c32737038df932e7ebd4bc Mon Sep 17 00:00:00 2001 From: sverhoeven Date: Fri, 17 Apr 2026 13:46:14 +0200 Subject: [PATCH 1/4] Inject translated module name into download url as `#t=` Refs https://github.com/jasp-stats/INTERNAL-jasp/issues/3162 --- src/App.tsx | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index eb69b3c..fd06319 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,7 +8,7 @@ import { useEffect, useId, useMemo, useState } from 'react'; import { useIntlayer, useMarkdownRenderer } from 'react-intlayer'; import { useDebounceValue } from 'usehooks-ts'; import { cn } from '@/lib/utils'; -import type { Release, Repository } from '@/types'; +import type { Asset, Release, Repository } from '@/types'; import type { Info } from '@/useJaspQtObject'; import { insideQt, useJaspQtObject } from '@/useJaspQtObject'; import { Button, buttonVariants } from './Button'; @@ -801,6 +801,40 @@ function RepositoryCard({ ); } +function enrichDownloadUrlInAsset(name: string, asset: Asset): Asset { + return { + ...asset, + downloadUrl: `${asset.downloadUrl}#t=${name}`, + }; +} + +function enrichDownloadUrlInActions( + name: string, + actions: AnyAction[], +): AnyAction[] { + return actions.map((action) => { + if ('asset' in action) { + return { + ...action, + asset: enrichDownloadUrlInAsset(name, action.asset), + }; + } + return action; + }); +} + +function enrichDownloadUrlInReleaseStats( + releaseStats: ReleaseStats, +): ReleaseStats { + return { + ...releaseStats, + actions: enrichDownloadUrlInActions( + releaseStats.repo.name, + releaseStats.actions, + ), + }; +} + function getInstallableReleaseStats( reposOfChannel: Repository[], info: Pick< @@ -809,9 +843,11 @@ function getInstallableReleaseStats( >, allowPreRelease: boolean, ): ReleaseStats[] { - return reposOfChannel.flatMap((repo) => - getInstallableReleaseStatsFromRepository(repo, info, allowPreRelease), - ); + return reposOfChannel + .flatMap((repo) => + getInstallableReleaseStatsFromRepository(repo, info, allowPreRelease), + ) + .map(enrichDownloadUrlInReleaseStats); } function getInstallableReleaseStatsFromRepository( From f3c2cfc411fa494d092830e95b4eaedc63e79177 Mon Sep 17 00:00:00 2001 From: sverhoeven Date: Fri, 17 Apr 2026 13:57:28 +0200 Subject: [PATCH 2/4] Bump package version to 0.9.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6e16b00..218072e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "modules-app", "private": true, "type": "module", - "version": "0.9.0", + "version": "0.9.1", "engines": { "node": ">=22.18.0" }, From c7ba7e27805cfe74e1cb049eb5fb211318b41e03 Mon Sep 17 00:00:00 2001 From: sverhoeven Date: Fri, 17 Apr 2026 14:42:05 +0200 Subject: [PATCH 3/4] Also check for module title in download url hash in tests --- src/App.browser.test.tsx | 2 +- src/App.qt.browser.test.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.browser.test.tsx b/src/App.browser.test.tsx index 0321314..7a3945e 100644 --- a/src/App.browser.test.tsx +++ b/src/App.browser.test.tsx @@ -389,7 +389,7 @@ describe('App component', () => { .element(installButton) .toHaveAttribute( 'href', - 'https://github.com/jasp-stats-modules/jaspAnova/releases/download/2cbd8a3e_R-4-4-1/jaspAnova_0.95.0_Windows_x86-64_R-4-5-1.JASPModule', + 'https://github.com/jasp-stats-modules/jaspAnova/releases/download/2cbd8a3e_R-4-4-1/jaspAnova_0.95.0_Windows_x86-64_R-4-5-1.JASPModule#t=jaspAnova', ); await expect diff --git a/src/App.qt.browser.test.tsx b/src/App.qt.browser.test.tsx index 07652da..f52d8bf 100644 --- a/src/App.qt.browser.test.tsx +++ b/src/App.qt.browser.test.tsx @@ -169,8 +169,8 @@ describe('App component (Qt mocked browser)', () => { expect(qtMockState.installMany).toHaveBeenCalledTimes(1); expect(qtMockState.installMany).toHaveBeenCalledWith( expect.arrayContaining([ - 'https://github.com/test/test/releases/download/v0.95.5-release.0/test1_MacOS_arm64.JASPModule', - 'https://github.com/test/test/releases/download/v0.95.5-release.0/test2_MacOS_arm64.JASPModule', + 'https://github.com/test/test/releases/download/v0.95.5-release.0/test1_MacOS_arm64.JASPModule#t=jaspAnova', + 'https://github.com/test/test/releases/download/v0.95.5-release.0/test2_MacOS_arm64.JASPModule#t=jaspBayesian', ]), ); }); From c6cd38d6afaa514cfcb97c04bbfe44f4eb882425 Mon Sep 17 00:00:00 2001 From: sverhoeven Date: Fri, 17 Apr 2026 14:50:18 +0200 Subject: [PATCH 4/4] Use URLSearchParams to construct download url hash Same as how it is parsed in the jasp-desktop --- src/App.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index fd06319..56c4ec1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -802,9 +802,10 @@ function RepositoryCard({ } function enrichDownloadUrlInAsset(name: string, asset: Asset): Asset { + const hashParams = new URLSearchParams({ t: name }).toString(); return { ...asset, - downloadUrl: `${asset.downloadUrl}#t=${name}`, + downloadUrl: `${asset.downloadUrl}#${hashParams}`, }; }