2022-10-18 19:43:23 +00:00
|
|
|
export const matcherTypes = ['hostname'] as const;
|
|
|
|
export const redirectTypes = ['hostname', 'simple'] as const;
|
2022-10-05 17:08:17 +00:00
|
|
|
|
2022-10-18 19:43:23 +00:00
|
|
|
export type MatcherType = typeof matcherTypes[number];
|
|
|
|
export type RedirectType = typeof redirectTypes[number];
|
|
|
|
|
2022-10-18 20:21:55 +00:00
|
|
|
export function narrowMatchType(value: string): value is MatcherType {
|
|
|
|
return matcherTypes.includes(value as MatcherType);
|
2022-10-18 19:43:23 +00:00
|
|
|
}
|
|
|
|
|
2022-10-18 20:21:55 +00:00
|
|
|
export function narrowRedirectType(value: string): value is RedirectType {
|
|
|
|
return redirectTypes.includes(value as RedirectType);
|
2022-10-18 19:43:23 +00:00
|
|
|
}
|
2022-10-05 17:08:17 +00:00
|
|
|
|
2022-10-12 22:04:51 +00:00
|
|
|
export type Matcher = {
|
2022-10-18 19:43:23 +00:00
|
|
|
matcherType: MatcherType;
|
2022-10-12 22:04:51 +00:00
|
|
|
toMatch: string;
|
|
|
|
};
|
|
|
|
|
2022-10-18 19:43:23 +00:00
|
|
|
export type RedirectParameters = {
|
2022-10-18 20:21:55 +00:00
|
|
|
redirectType: RedirectType;
|
2022-10-18 19:43:23 +00:00
|
|
|
};
|
|
|
|
|
2022-10-05 17:08:17 +00:00
|
|
|
export abstract class Redirect<P extends RedirectParameters> {
|
2022-10-12 22:04:51 +00:00
|
|
|
constructor(public parameters: P & Matcher) {}
|
|
|
|
|
|
|
|
public isMatch(url: URL): boolean {
|
2022-10-18 19:43:23 +00:00
|
|
|
if (this.parameters.matcherType === 'hostname') {
|
2022-10-18 20:23:41 +00:00
|
|
|
const hostname = url.hostname.startsWith('www.')
|
|
|
|
? url.hostname.slice(4)
|
|
|
|
: url.hostname;
|
|
|
|
return hostname === this.parameters.toMatch;
|
2022-10-12 22:04:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2022-10-05 17:08:17 +00:00
|
|
|
|
|
|
|
public abstract redirect(url: URL | string): URL;
|
2022-10-18 20:00:42 +00:00
|
|
|
|
|
|
|
public abstract get redirectValue(): string;
|
|
|
|
|
|
|
|
public abstract set redirectValue(value: string);
|
2022-10-05 17:08:17 +00:00
|
|
|
}
|