Make Blacklist class
This commit is contained in:
parent
574692551a
commit
b86b4680b6
12 changed files with 139 additions and 149 deletions
|
@ -1,8 +1,6 @@
|
|||
import { injectable } from 'tsyringe';
|
||||
import AddonEnabledUseCase from '../usecases/AddonEnabledUseCase';
|
||||
import SettingUseCase from '../usecases/SettingUseCase';
|
||||
import * as blacklists from '../../shared/blacklists';
|
||||
|
||||
import * as messages from '../../shared/messages';
|
||||
|
||||
@injectable()
|
||||
|
@ -17,9 +15,7 @@ export default class SettingController {
|
|||
async initSettings(): Promise<void> {
|
||||
try {
|
||||
let current = await this.settingUseCase.reload();
|
||||
let disabled = blacklists.includes(
|
||||
current.blacklist, window.location.href,
|
||||
);
|
||||
let disabled = current.blacklist.includes(window.location.href);
|
||||
if (disabled) {
|
||||
this.addonEnabledUseCase.disable();
|
||||
} else {
|
||||
|
|
|
@ -11,8 +11,8 @@ import SettingData, {
|
|||
FormKeymaps, FormSearch, FormSettings, JSONTextSettings,
|
||||
} from '../../shared/SettingData';
|
||||
import { State as AppState } from '../reducers/setting';
|
||||
import * as settings from '../../shared/Settings';
|
||||
import Properties from '../../shared/settings/Properties';
|
||||
import Blacklist from '../../shared/settings/Blacklist';
|
||||
|
||||
const DO_YOU_WANT_TO_CONTINUE =
|
||||
'Some settings in JSON can be lost when migrating. ' +
|
||||
|
@ -143,7 +143,7 @@ class SettingsComponent extends React.Component<Props> {
|
|||
let data = new SettingData({
|
||||
source: this.props.source,
|
||||
form: (this.props.form as FormSettings).buildWithBlacklist(
|
||||
settings.blacklistValueOf(value)),
|
||||
Blacklist.fromJSON(value)),
|
||||
});
|
||||
this.props.dispatch(settingActions.set(data));
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -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([]),
|
||||
};
|
||||
|
|
|
@ -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 };
|
39
src/shared/settings/Blacklist.ts
Normal file
39
src/shared/settings/Blacklist.ts
Normal 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);
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
const fromWildcard = (pattern: string): RegExp => {
|
||||
let regexStr = '^' + pattern.replace(/\*/g, '.*') + '$';
|
||||
return new RegExp(regexStr);
|
||||
};
|
||||
|
||||
export { fromWildcard };
|
Reference in a new issue