67 lines
2.0 KiB
TypeScript
67 lines
2.0 KiB
TypeScript
import { getSafeApplicationUrl } from "../common/application-url";
|
|
|
|
export const directBookmarkPrefix = "url:";
|
|
|
|
export interface BookmarkItem {
|
|
id: string;
|
|
name: string;
|
|
description: string | null;
|
|
iconUrl?: string;
|
|
href: string | null;
|
|
}
|
|
|
|
export const normalizeBookmarkUrl = (value: string): string | undefined => {
|
|
const trimmedValue = value.trim();
|
|
if (trimmedValue.length === 0) return undefined;
|
|
|
|
const directUrl = getSafeApplicationUrl(trimmedValue);
|
|
if (directUrl) return directUrl;
|
|
|
|
if (/^(?:localhost(?::\d+)?|(?:[\w-]+\.)+[\w-]+(?::\d+)?)(?:[/?#].*)?$/i.test(trimmedValue)) {
|
|
return getSafeApplicationUrl(`https://${trimmedValue}`);
|
|
}
|
|
|
|
return undefined;
|
|
};
|
|
|
|
export const getDirectBookmarkValue = (url: string) => `${directBookmarkPrefix}${url}`;
|
|
|
|
export const getDirectBookmarkUrl = (value: string): string | undefined => {
|
|
if (!value.startsWith(directBookmarkPrefix)) return undefined;
|
|
return normalizeBookmarkUrl(value.slice(directBookmarkPrefix.length));
|
|
};
|
|
|
|
export const getBookmarkFaviconUrl = (href: string | null): string | undefined => {
|
|
const safeUrl = getSafeApplicationUrl(href);
|
|
if (!safeUrl) return undefined;
|
|
|
|
const url = new URL(safeUrl);
|
|
return `${url.origin}/favicon.ico`;
|
|
};
|
|
|
|
export const createDirectBookmark = (url: string): BookmarkItem | undefined => {
|
|
const href = normalizeBookmarkUrl(url);
|
|
if (!href) return undefined;
|
|
|
|
const parsedUrl = new URL(href);
|
|
return {
|
|
id: getDirectBookmarkValue(href),
|
|
name: parsedUrl.hostname,
|
|
description: null,
|
|
href,
|
|
};
|
|
};
|
|
|
|
export const splitBookmarkUrls = (value: string) =>
|
|
value.split(/\r?\n+/).flatMap((line) => {
|
|
const trimmedLine = line.trim();
|
|
if (trimmedLine.length === 0) return [];
|
|
|
|
const commaSeparatedValues = trimmedLine.split(",").map((part) => part.trim());
|
|
if (commaSeparatedValues.length > 1 && commaSeparatedValues.every((part) => normalizeBookmarkUrl(part))) {
|
|
return commaSeparatedValues;
|
|
}
|
|
|
|
return [trimmedLine];
|
|
});
|