mirror of
https://github.com/ajnart/homarr.git
synced 2026-02-26 16:30:57 +01:00
feat: Add Simple-Icons and Selfh.st collections (#1118)
* feat: Add Simple-Icons and Selfh.st collections refactor: icon file path parsing * refactor: allowed extensions check
This commit is contained in:
@@ -11,6 +11,22 @@ const repositories = [
|
||||
new URL("https://api.github.com/repos/walkxcode/dashboard-icons/git/trees/main?recursive=true"),
|
||||
"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/{0}",
|
||||
),
|
||||
new GitHubIconRepository(
|
||||
"selfh.st",
|
||||
"selfhst/icons",
|
||||
"CC0-1.0",
|
||||
new URL("https://github.com/selfhst/icons"),
|
||||
new URL("https://api.github.com/repos/selfhst/icons/git/trees/main?recursive=true"),
|
||||
"https://cdn.jsdelivr.net/gh/selfhst/icons/{0}",
|
||||
),
|
||||
new GitHubIconRepository(
|
||||
"SimpleIcons",
|
||||
"simple-icons/simple-icons",
|
||||
"CC0-1.0",
|
||||
new URL("https://github.com/simple-icons/simple-icons"),
|
||||
new URL("https://api.github.com/repos/simple-icons/simple-icons/git/trees/master?recursive=true"),
|
||||
"https://cdn.simpleicons.org/{1}",
|
||||
),
|
||||
new JsdelivrIconRepository(
|
||||
"Papirus",
|
||||
"PapirusDevelopmentTeam/papirus-icon-theme",
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { parse } from "path";
|
||||
|
||||
import { fetchWithTimeout } from "@homarr/common";
|
||||
|
||||
import type { IconRepositoryLicense } from "../types/icon-repository-license";
|
||||
@@ -27,19 +29,23 @@ export class GitHubIconRepository extends IconRepository {
|
||||
return {
|
||||
success: true,
|
||||
icons: listOfFiles.tree
|
||||
.filter((treeItem) =>
|
||||
this.allowedImageFileTypes.some((allowedExtension) => treeItem.path.includes(allowedExtension)),
|
||||
.filter(({ path }) =>
|
||||
this.allowedImageFileTypes.some((allowedImageFileType) => parse(path).ext === allowedImageFileType),
|
||||
)
|
||||
.map((treeItem) => {
|
||||
const fileNameWithExtension = this.getFileNameWithoutExtensionFromPath(treeItem.path);
|
||||
.map(({ path, size: sizeInBytes, sha: checksum }) => {
|
||||
const file = parse(path);
|
||||
const fileNameWithExtension = file.base;
|
||||
const imageUrl = new URL(
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
this.repositoryBlobUrlTemplate!.replace("{0}", path).replace("{1}", file.name),
|
||||
);
|
||||
|
||||
return {
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
imageUrl: new URL(this.repositoryBlobUrlTemplate!.replace("{0}", treeItem.path)),
|
||||
fileNameWithExtension: fileNameWithExtension,
|
||||
imageUrl,
|
||||
fileNameWithExtension,
|
||||
local: false,
|
||||
sizeInBytes: treeItem.size,
|
||||
checksum: treeItem.sha,
|
||||
sizeInBytes,
|
||||
checksum,
|
||||
};
|
||||
}),
|
||||
slug: this.slug,
|
||||
|
||||
@@ -29,8 +29,4 @@ export abstract class IconRepository {
|
||||
}
|
||||
|
||||
protected abstract getAllIconsInternalAsync(): Promise<RepositoryIconGroup>;
|
||||
|
||||
protected getFileNameWithoutExtensionFromPath(path: string) {
|
||||
return path.replace(/^.*[\\/]/, "");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { parse } from "path";
|
||||
|
||||
import { fetchWithTimeout } from "@homarr/common";
|
||||
|
||||
import type { IconRepositoryLicense } from "../types/icon-repository-license";
|
||||
@@ -23,18 +25,19 @@ export class JsdelivrIconRepository extends IconRepository {
|
||||
return {
|
||||
success: true,
|
||||
icons: listOfFiles.files
|
||||
.filter((file) =>
|
||||
this.allowedImageFileTypes.some((allowedImageFileType) => file.name.includes(allowedImageFileType)),
|
||||
.filter(({ name: path }) =>
|
||||
this.allowedImageFileTypes.some((allowedImageFileType) => parse(path).ext === allowedImageFileType),
|
||||
)
|
||||
.map((file) => {
|
||||
const fileNameWithExtension = this.getFileNameWithoutExtensionFromPath(file.name);
|
||||
.map(({ name: path, size: sizeInBytes, hash: checksum }) => {
|
||||
const file = parse(path);
|
||||
const fileNameWithExtension = file.base;
|
||||
|
||||
return {
|
||||
imageUrl: new URL(this.repositoryBlobUrlTemplate.replace("{0}", file.name)),
|
||||
fileNameWithExtension: fileNameWithExtension,
|
||||
imageUrl: new URL(this.repositoryBlobUrlTemplate.replace("{0}", path).replace("{1}", file.name)),
|
||||
fileNameWithExtension,
|
||||
local: false,
|
||||
sizeInBytes: file.size,
|
||||
checksum: file.hash,
|
||||
sizeInBytes,
|
||||
checksum,
|
||||
};
|
||||
}),
|
||||
slug: this.slug,
|
||||
|
||||
@@ -1 +1 @@
|
||||
export type IconRepositoryLicense = "MIT" | "GPL-3.0" | undefined;
|
||||
export type IconRepositoryLicense = "MIT" | "GPL-3.0" | "CC0-1.0" | undefined;
|
||||
|
||||
Reference in New Issue
Block a user