From 123a8f82c2b595198e74bfbd7d2e11e454d18b28 Mon Sep 17 00:00:00 2001 From: SeDemal Date: Thu, 12 Sep 2024 22:48:23 +0200 Subject: [PATCH 1/2] feat: Add Simple-Icons and Selfh.st collections refactor: icon file path parsing --- packages/icons/src/icons-fetcher.ts | 16 +++++++++++++ .../repositories/github.icon-repository.ts | 24 +++++++++++-------- .../icons/src/repositories/icon-repository.ts | 4 ---- .../repositories/jsdelivr.icon-repository.ts | 19 ++++++++------- .../src/types/icon-repository-license.ts | 2 +- 5 files changed, 42 insertions(+), 23 deletions(-) diff --git a/packages/icons/src/icons-fetcher.ts b/packages/icons/src/icons-fetcher.ts index 32ba31af8..ba60296a7 100644 --- a/packages/icons/src/icons-fetcher.ts +++ b/packages/icons/src/icons-fetcher.ts @@ -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", diff --git a/packages/icons/src/repositories/github.icon-repository.ts b/packages/icons/src/repositories/github.icon-repository.ts index 695ade2a0..51e3397c4 100644 --- a/packages/icons/src/repositories/github.icon-repository.ts +++ b/packages/icons/src/repositories/github.icon-repository.ts @@ -1,3 +1,5 @@ +import { parse } from "path"; + import { fetchWithTimeout } from "@homarr/common"; import type { IconRepositoryLicense } from "../types/icon-repository-license"; @@ -27,19 +29,21 @@ export class GitHubIconRepository extends IconRepository { return { success: true, icons: listOfFiles.tree - .filter((treeItem) => - this.allowedImageFileTypes.some((allowedExtension) => treeItem.path.includes(allowedExtension)), - ) - .map((treeItem) => { - const fileNameWithExtension = this.getFileNameWithoutExtensionFromPath(treeItem.path); + .filter(({ path }) => this.allowedImageFileTypes.some((allowedExtension) => path.includes(allowedExtension))) + .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, diff --git a/packages/icons/src/repositories/icon-repository.ts b/packages/icons/src/repositories/icon-repository.ts index 358e48dfa..525ca1422 100644 --- a/packages/icons/src/repositories/icon-repository.ts +++ b/packages/icons/src/repositories/icon-repository.ts @@ -29,8 +29,4 @@ export abstract class IconRepository { } protected abstract getAllIconsInternalAsync(): Promise; - - protected getFileNameWithoutExtensionFromPath(path: string) { - return path.replace(/^.*[\\/]/, ""); - } } diff --git a/packages/icons/src/repositories/jsdelivr.icon-repository.ts b/packages/icons/src/repositories/jsdelivr.icon-repository.ts index 1c153d5b2..8bfb8353f 100644 --- a/packages/icons/src/repositories/jsdelivr.icon-repository.ts +++ b/packages/icons/src/repositories/jsdelivr.icon-repository.ts @@ -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) => path.includes(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, diff --git a/packages/icons/src/types/icon-repository-license.ts b/packages/icons/src/types/icon-repository-license.ts index a3ebe8728..1a01ca02d 100644 --- a/packages/icons/src/types/icon-repository-license.ts +++ b/packages/icons/src/types/icon-repository-license.ts @@ -1 +1 @@ -export type IconRepositoryLicense = "MIT" | "GPL-3.0" | undefined; +export type IconRepositoryLicense = "MIT" | "GPL-3.0" | "CC0-1.0" | undefined; From 212897a52b93caf9e4346ce92906af5000186b7c Mon Sep 17 00:00:00 2001 From: SeDemal Date: Thu, 12 Sep 2024 23:02:32 +0200 Subject: [PATCH 2/2] refactor: allowed extensions check --- packages/icons/src/repositories/github.icon-repository.ts | 4 +++- packages/icons/src/repositories/jsdelivr.icon-repository.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/icons/src/repositories/github.icon-repository.ts b/packages/icons/src/repositories/github.icon-repository.ts index 51e3397c4..eb5e92b90 100644 --- a/packages/icons/src/repositories/github.icon-repository.ts +++ b/packages/icons/src/repositories/github.icon-repository.ts @@ -29,7 +29,9 @@ export class GitHubIconRepository extends IconRepository { return { success: true, icons: listOfFiles.tree - .filter(({ path }) => this.allowedImageFileTypes.some((allowedExtension) => path.includes(allowedExtension))) + .filter(({ path }) => + this.allowedImageFileTypes.some((allowedImageFileType) => parse(path).ext === allowedImageFileType), + ) .map(({ path, size: sizeInBytes, sha: checksum }) => { const file = parse(path); const fileNameWithExtension = file.base; diff --git a/packages/icons/src/repositories/jsdelivr.icon-repository.ts b/packages/icons/src/repositories/jsdelivr.icon-repository.ts index 8bfb8353f..c611fcd7e 100644 --- a/packages/icons/src/repositories/jsdelivr.icon-repository.ts +++ b/packages/icons/src/repositories/jsdelivr.icon-repository.ts @@ -26,7 +26,7 @@ export class JsdelivrIconRepository extends IconRepository { success: true, icons: listOfFiles.files .filter(({ name: path }) => - this.allowedImageFileTypes.some((allowedImageFileType) => path.includes(allowedImageFileType)), + this.allowedImageFileTypes.some((allowedImageFileType) => parse(path).ext === allowedImageFileType), ) .map(({ name: path, size: sizeInBytes, hash: checksum }) => { const file = parse(path);