Skip to content
Closed
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
17 changes: 3 additions & 14 deletions src/__tests__/mocks/fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export const mockSearchResponse = {
Metadata: {
Repository: 'ScoopInstaller/Main',
OfficialRepository: true,
OfficialRepositoryName: 'main',
RepositoryStars: 5000,
BranchName: 'master',
FilePath: 'bucket/git.json',
Expand All @@ -44,6 +45,7 @@ export const mockSearchResponse = {
Metadata: {
Repository: 'ScoopInstaller/Extras',
OfficialRepository: true,
OfficialRepositoryName: 'extras',
RepositoryStars: 3500,
BranchName: 'master',
FilePath: 'bucket/github.json',
Expand Down Expand Up @@ -78,6 +80,7 @@ export const mockManifest = {
Metadata: {
Repository: 'ScoopInstaller/Main',
OfficialRepository: true,
OfficialRepositoryName: 'main',
RepositoryStars: 5000,
BranchName: 'master',
FilePath: 'bucket/nodejs.json',
Expand Down Expand Up @@ -117,20 +120,6 @@ export const mockBucketsResponse = {
],
};

// Mock GitHub buckets.json response
export const mockGitHubBucketsJson = [
{
name: 'main',
repository: 'https://github.com/ScoopInstaller/Main',
official: true,
},
{
name: 'extras',
repository: 'https://github.com/ScoopInstaller/Extras',
official: true,
},
];

// Mock error response
export const mockErrorResponse = {
error: {
Expand Down
4 changes: 1 addition & 3 deletions src/components/Search.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,7 @@ beforeEach(() => {
mockSearchResult.mockClear();
mockSearchPagination.mockClear();

(globalThis.fetch as unknown as Mock) = vi.fn().mockResolvedValue({
json: vi.fn().mockResolvedValue({ Official: 'main' }),
});
(globalThis.fetch as unknown as Mock) = vi.fn();

(window as unknown as { scrollTo: () => void }).scrollTo = vi.fn();

Expand Down
17 changes: 0 additions & 17 deletions src/components/Search.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ const Search = (): JSX.Element => {
);
const [installBucketName, setInstallBucketName] = useState<boolean>(getInstallBucketNameFromSearchParams());
const [searchResults, setSearchResults] = useState<SearchResultsJson>();
const [officialRepositories, setOfficialRepositories] = useState<{ [key: string]: string }>({});
const [selectedResult, setSelectedResult] = useState<ManifestJson | null>();
const [selectedResultId, setSelectedResultId] = useState<string>(getSelectedResultFromSearchParams);
const selectedResultRef = useRef<HTMLDivElement>(null);
Expand Down Expand Up @@ -184,20 +183,6 @@ const Search = (): JSX.Element => {
updateSearchParams(SEARCH_PARAM_SELECTED_RESULT, selectedResultId, false);
}, [selectedResultId, searchResults, updateSearchParams]);

useEffect(() => {
fetch('https://cdn.jsdelivr.net/gh/ScoopInstaller/Scoop/buckets.json')
.then((response) => response.json())
.then((response) => {
const json = response as { [key: string]: string };
const mapping: { [key: string]: string } = {};
Object.keys(json).forEach((key) => {
mapping[json[key]] = key;
});
setOfficialRepositories(mapping);
})
.catch((error) => console.log(error));
}, []);

const handleQueryChange = useCallback(
(newQuery: string): void => {
updateSearchParams(SEARCH_PARAM_QUERY, newQuery, false);
Expand Down Expand Up @@ -318,7 +303,6 @@ const Search = (): JSX.Element => {
cardRef={searchResult.id === selectedResultId ? selectedResultRef : undefined}
key={searchResult.id}
result={searchResult}
officialRepositories={officialRepositories}
installBucketName={installBucketName}
onCopyToClipboard={handleCopyToClipboard}
onResultSelected={handleResultSelected}
Expand Down Expand Up @@ -351,7 +335,6 @@ const Search = (): JSX.Element => {
{selectedResult && (
<SearchResult
result={selectedResult}
officialRepositories={officialRepositories}
installBucketName={installBucketName}
onCopyToClipboard={handleCopyToClipboard}
/>
Expand Down
1 change: 1 addition & 0 deletions src/components/SearchProcessor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ const SearchProcessor = (props: SearchProcessorProps): JSX.Element => {
'Metadata/Repository',
'Metadata/FilePath',
'Metadata/OfficialRepository',
'Metadata/OfficialRepositoryName',
'Metadata/RepositoryStars',
'Metadata/Committed',
'Metadata/Sha',
Expand Down
6 changes: 0 additions & 6 deletions src/components/SearchResult.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,8 @@ describe('SearchResult', () => {
const mockOnCopyToClipboard = vi.fn();
const mockOnResultSelected = vi.fn();

const officialRepositories = {
'ScoopInstaller/Main': 'main',
'ScoopInstaller/Extras': 'extras',
};

const defaultProps = {
result: jsonConvert.deserializeObject(mockManifest, ManifestJsonClass),
officialRepositories,
installBucketName: false,
onCopyToClipboard: mockOnCopyToClipboard,
onResultSelected: mockOnResultSelected,
Expand Down
9 changes: 5 additions & 4 deletions src/components/SearchResult.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,14 @@ dayjs.extend(relativeTime);

type SearchResultProps = {
result: ManifestJson;
officialRepositories: { [key: string]: string };
installBucketName: boolean;
onCopyToClipboard: (content: string) => void;
onResultSelected?: (result: ManifestJson) => void;
cardRef?: React.RefObject<HTMLDivElement | null>;
};

const SearchResult = (props: SearchResultProps): JSX.Element => {
const { result, officialRepositories, installBucketName, onCopyToClipboard, onResultSelected, cardRef } = props;
const { result, installBucketName, onCopyToClipboard, onResultSelected, cardRef } = props;
const homepageRef = useRef<HTMLSpanElement>(null);
const [homepageTooltipHidden, setHomepageTooltipHidden] = useState<boolean>(false);

Expand Down Expand Up @@ -113,13 +112,15 @@ const SearchResult = (props: SearchResultProps): JSX.Element => {

// Use known repository name for official repositories and keep only organization+repo for community repositories
const formattedHighlightedRepository = metadata.repositoryOfficial
? highlightedRepository?.toString().replace(metadata.repository, officialRepositories[metadata.repository])
? highlightedRepository
?.toString()
.replace(metadata.repository, metadata.officialRepositoryName || metadata.repository)
: highlightedRepository?.toString().replace(/^(<mark>|)(?:.*?\/){3}(.+)$/, '$1$2');

const versionPrefix = version.length > 0 && /^\d/.test(version) && 'v';

const bucketName = metadata.repositoryOfficial
? officialRepositories[metadata.repository] ||
? metadata.officialRepositoryName ||
metadata.repository.substring(metadata.repository.lastIndexOf('/') + 1).toLowerCase()
: `${extractPathFromUrl(metadata.repository, '_')}`;
const bucketUrl = metadata.repositoryOfficial ? '' : `${metadata.repository}`;
Expand Down
9 changes: 9 additions & 0 deletions src/serialization/MetadataJson.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ describe('MetadataJson', () => {
const metadata = {
Repository: 'ScoopInstaller/Main',
OfficialRepository: true,
OfficialRepositoryName: 'main',
RepositoryStars: 5000,
BranchName: 'master',
FilePath: 'bucket/git.json',
Expand All @@ -25,6 +26,7 @@ describe('MetadataJson', () => {

expect(result.repository).toBe('ScoopInstaller/Main');
expect(result.repositoryOfficial).toBe(true);
expect(result.officialRepositoryName).toBe('main');
expect(result.stars).toBe(5000);
expect(result.branchName).toBe('master');
expect(result.filePath).toBe('bucket/git.json');
Expand All @@ -46,6 +48,7 @@ describe('MetadataJson', () => {

expect(result.repository).toBe('user/repo');
expect(result.repositoryOfficial).toBe(false);
expect(result.officialRepositoryName).toBe('');
expect(result.stars).toBe(0);
expect(result.branchName).toBe('');
});
Expand All @@ -66,6 +69,7 @@ describe('MetadataJson', () => {
expect(result.committed.getFullYear()).toBe(2024);
expect(result.committed.getMonth()).toBe(0); // January = 0
expect(result.committed.getDate()).toBe(15);
expect(result.officialRepositoryName).toBe('');
});
});

Expand All @@ -74,6 +78,7 @@ describe('MetadataJson', () => {
const metadata = {
Repository: 'ScoopInstaller/Main',
OfficialRepository: true,
OfficialRepositoryName: 'main',
RepositoryStars: 5000,
FilePath: 'bucket/app.json',
Committed: '2024-01-01T00:00:00Z',
Expand All @@ -83,6 +88,7 @@ describe('MetadataJson', () => {
const result = jsonConvert.deserializeObject(metadata, MetadataJson);

expect(result.repositoryOfficial).toBe(true);
expect(result.officialRepositoryName).toBe('main');
});

it('should correctly identify non-official repository', () => {
Expand All @@ -98,6 +104,7 @@ describe('MetadataJson', () => {
const result = jsonConvert.deserializeObject(metadata, MetadataJson);

expect(result.repositoryOfficial).toBe(false);
expect(result.officialRepositoryName).toBe('');
});
});

Expand All @@ -121,6 +128,7 @@ describe('MetadataJson', () => {
const metadata = {
Repository: 'popular/repo',
OfficialRepository: true,
OfficialRepositoryName: 'extras',
RepositoryStars: 999999,
FilePath: 'bucket/app.json',
Committed: '2024-01-01T00:00:00Z',
Expand All @@ -130,6 +138,7 @@ describe('MetadataJson', () => {
const result = jsonConvert.deserializeObject(metadata, MetadataJson);

expect(result.stars).toBe(999999);
expect(result.officialRepositoryName).toBe('extras');
});
});
});
3 changes: 3 additions & 0 deletions src/serialization/MetadataJson.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ class MetadataJson {
@JsonProperty('OfficialRepository', Boolean)
repositoryOfficial = false;

@JsonProperty('OfficialRepositoryName', String, true)
officialRepositoryName?: string = '';

@JsonProperty('RepositoryStars', Number)
stars = 0;

Expand Down
Loading