Make Blacklist class

This commit is contained in:
Shin'ya UEOKA 2019-10-05 06:39:20 +00:00
parent 574692551a
commit b86b4680b6
12 changed files with 139 additions and 149 deletions

View file

@ -3,6 +3,7 @@ import Settings, * as settings from './Settings';
import Keymaps from './settings/Keymaps';
import Search from './settings/Search';
import Properties from './settings/Properties';
import Blacklist from './settings/Blacklist';
export class FormKeymaps {
private data: {[op: string]: string};
@ -146,13 +147,13 @@ export class FormSettings {
private properties: Properties;
private blacklist: string[];
private blacklist: Blacklist;
constructor(
keymaps: FormKeymaps,
search: FormSearch,
properties: Properties,
blacklist: string[],
blacklist: Blacklist,
) {
this.keymaps = keymaps;
this.search = search;
@ -187,7 +188,7 @@ export class FormSettings {
);
}
buildWithBlacklist(blacklist: string[]): FormSettings {
buildWithBlacklist(blacklist: Blacklist): FormSettings {
return new FormSettings(
this.keymaps,
this.search,
@ -201,7 +202,7 @@ export class FormSettings {
keymaps: this.keymaps.toKeymaps().toJSON(),
search: this.search.toSearchSettings().toJSON(),
properties: this.properties.toJSON(),
blacklist: this.blacklist,
blacklist: this.blacklist.toJSON(),
});
}
@ -215,7 +216,7 @@ export class FormSettings {
keymaps: this.keymaps.toJSON(),
search: this.search.toJSON(),
properties: this.properties.toJSON(),
blacklist: this.blacklist,
blacklist: this.blacklist.toJSON(),
};
}
@ -229,7 +230,7 @@ export class FormSettings {
FormKeymaps.valueOf(o.keymaps),
FormSearch.valueOf(o.search),
Properties.fromJSON(o.properties),
settings.blacklistValueOf(o.blacklist),
Blacklist.fromJSON(o.blacklist),
);
}

View file

@ -1,26 +1,15 @@
import Keymaps from './settings/Keymaps';
import Search from './settings/Search';
import Properties from './settings/Properties';
import Blacklist from './settings/Blacklist';
export default interface Settings {
keymaps: Keymaps;
search: Search;
properties: Properties;
blacklist: string[];
blacklist: Blacklist;
}
export const blacklistValueOf = (o: any): string[] => {
if (!Array.isArray(o)) {
throw new TypeError(`"blacklist" is not an array of string`);
}
for (let x of o) {
if (typeof x !== 'string') {
throw new TypeError(`"blacklist" is not an array of string`);
}
}
return o as string[];
};
export const valueOf = (o: any): Settings => {
let settings = { ...DefaultSetting };
for (let key of Object.keys(o)) {
@ -35,7 +24,7 @@ export const valueOf = (o: any): Settings => {
settings.properties = Properties.fromJSON(o.properties);
break;
case 'blacklist':
settings.blacklist = blacklistValueOf(o.blacklist);
settings.blacklist = Blacklist.fromJSON(o.blacklist);
break;
default:
throw new TypeError('unknown setting: ' + key);
@ -49,7 +38,7 @@ export const toJSON = (settings: Settings): any => {
keymaps: settings.keymaps.toJSON(),
search: settings.search.toJSON(),
properties: settings.properties.toJSON(),
blacklist: settings.blacklist,
blacklist: settings.blacklist.toJSON(),
};
};
@ -134,5 +123,5 @@ export const DefaultSetting: Settings = {
smoothscroll: false,
complete: 'sbh'
}),
blacklist: []
blacklist: Blacklist.fromJSON([]),
};

View file

@ -1,13 +0,0 @@
import * as re from './utils/re';
const includes = (blacklist: string[], url: string): boolean => {
let u = new URL(url);
return blacklist.some((item) => {
if (!item.includes('/')) {
return re.fromWildcard(item).test(u.host);
}
return re.fromWildcard(item).test(u.host + u.pathname);
});
};
export { includes };

View file

@ -0,0 +1,39 @@
export type BlacklistJSON = string[];
const fromWildcard = (pattern: string): RegExp => {
let regexStr = '^' + pattern.replace(/\*/g, '.*') + '$';
return new RegExp(regexStr);
};
export default class Blacklist {
constructor(
private blacklist: string[],
) {
}
static fromJSON(json: any): Blacklist {
if (!Array.isArray(json)) {
throw new TypeError(`"blacklist" is not an array of string`);
}
for (let x of json) {
if (typeof x !== 'string') {
throw new TypeError(`"blacklist" is not an array of string`);
}
}
return new Blacklist(json);
}
toJSON(): BlacklistJSON {
return this.blacklist;
}
includes(url: string): boolean {
let u = new URL(url);
return this.blacklist.some((item) => {
if (!item.includes('/')) {
return fromWildcard(item).test(u.host);
}
return fromWildcard(item).test(u.host + u.pathname);
});
}
}

View file

@ -1,6 +0,0 @@
const fromWildcard = (pattern: string): RegExp => {
let regexStr = '^' + pattern.replace(/\*/g, '.*') + '$';
return new RegExp(regexStr);
};
export { fromWildcard };