parent
2116ac90a6
commit
574692551a
16 changed files with 179 additions and 236 deletions
@ -1,50 +0,0 @@ |
|||||||
export type Type = string | number | boolean; |
|
||||||
|
|
||||||
export class Def { |
|
||||||
private name0: string; |
|
||||||
|
|
||||||
private description0: string; |
|
||||||
|
|
||||||
private defaultValue0: Type; |
|
||||||
|
|
||||||
constructor( |
|
||||||
name: string, |
|
||||||
description: string, |
|
||||||
defaultValue: Type, |
|
||||||
) { |
|
||||||
this.name0 = name; |
|
||||||
this.description0 = description; |
|
||||||
this.defaultValue0 = defaultValue; |
|
||||||
} |
|
||||||
|
|
||||||
public get name(): string { |
|
||||||
return this.name0; |
|
||||||
} |
|
||||||
|
|
||||||
public get defaultValue(): Type { |
|
||||||
return this.defaultValue0; |
|
||||||
} |
|
||||||
|
|
||||||
public get description(): Type { |
|
||||||
return this.description0; |
|
||||||
} |
|
||||||
|
|
||||||
public get type(): string { |
|
||||||
return typeof this.defaultValue; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
export const defs: Def[] = [ |
|
||||||
new Def( |
|
||||||
'hintchars', |
|
||||||
'hint characters on follow mode', |
|
||||||
'abcdefghijklmnopqrstuvwxyz'), |
|
||||||
new Def( |
|
||||||
'smoothscroll', |
|
||||||
'smooth scroll', |
|
||||||
false), |
|
||||||
new Def( |
|
||||||
'complete', |
|
||||||
'which are completed at the open page', |
|
||||||
'sbh'), |
|
||||||
]; |
|
@ -1,56 +0,0 @@ |
|||||||
export type Type = string | number | boolean; |
|
||||||
|
|
||||||
export class Def { |
|
||||||
private name0: string; |
|
||||||
|
|
||||||
private description0: string; |
|
||||||
|
|
||||||
private defaultValue0: Type; |
|
||||||
|
|
||||||
constructor( |
|
||||||
name: string, |
|
||||||
description: string, |
|
||||||
defaultValue: Type, |
|
||||||
) { |
|
||||||
this.name0 = name; |
|
||||||
this.description0 = description; |
|
||||||
this.defaultValue0 = defaultValue; |
|
||||||
} |
|
||||||
|
|
||||||
public get name(): string { |
|
||||||
return this.name0; |
|
||||||
} |
|
||||||
|
|
||||||
public get defaultValue(): Type { |
|
||||||
return this.defaultValue0; |
|
||||||
} |
|
||||||
|
|
||||||
public get description(): Type { |
|
||||||
return this.description0; |
|
||||||
} |
|
||||||
|
|
||||||
public get type(): string { |
|
||||||
return typeof this.defaultValue; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
export const defs: Def[] = [ |
|
||||||
new Def( |
|
||||||
'hintchars', |
|
||||||
'hint characters on follow mode', |
|
||||||
'abcdefghijklmnopqrstuvwxyz'), |
|
||||||
new Def( |
|
||||||
'smoothscroll', |
|
||||||
'smooth scroll', |
|
||||||
false), |
|
||||||
new Def( |
|
||||||
'complete', |
|
||||||
'which are completed at the open page', |
|
||||||
'sbh'), |
|
||||||
]; |
|
||||||
|
|
||||||
export const defaultValues = { |
|
||||||
hintchars: 'abcdefghijklmnopqrstuvwxyz', |
|
||||||
smoothscroll: false, |
|
||||||
complete: 'sbh', |
|
||||||
}; |
|
@ -0,0 +1,110 @@ |
|||||||
|
export type PropertiesJSON = { |
||||||
|
hintchars?: string; |
||||||
|
smoothscroll?: boolean; |
||||||
|
complete?: string; |
||||||
|
}; |
||||||
|
|
||||||
|
export type PropertyTypes = { |
||||||
|
hintchars: string; |
||||||
|
smoothscroll: string; |
||||||
|
complete: string; |
||||||
|
}; |
||||||
|
|
||||||
|
type PropertyName = 'hintchars' | 'smoothscroll' | 'complete'; |
||||||
|
|
||||||
|
type PropertyDef = { |
||||||
|
name: PropertyName; |
||||||
|
description: string; |
||||||
|
defaultValue: string | number | boolean; |
||||||
|
type: 'string' | 'number' | 'boolean'; |
||||||
|
}; |
||||||
|
|
||||||
|
const defs: PropertyDef[] = [ |
||||||
|
{ |
||||||
|
name: 'hintchars', |
||||||
|
description: 'hint characters on follow mode', |
||||||
|
defaultValue: 'abcdefghijklmnopqrstuvwxyz', |
||||||
|
type: 'string', |
||||||
|
}, { |
||||||
|
name: 'smoothscroll', |
||||||
|
description: 'smooth scroll', |
||||||
|
defaultValue: false, |
||||||
|
type: 'boolean', |
||||||
|
}, { |
||||||
|
name: 'complete', |
||||||
|
description: 'which are completed at the open page', |
||||||
|
defaultValue: 'sbh', |
||||||
|
type: 'string', |
||||||
|
} |
||||||
|
]; |
||||||
|
|
||||||
|
const defaultValues = { |
||||||
|
hintchars: 'abcdefghijklmnopqrstuvwxyz', |
||||||
|
smoothscroll: false, |
||||||
|
complete: 'sbh', |
||||||
|
}; |
||||||
|
|
||||||
|
export default class Properties { |
||||||
|
public hintchars: string; |
||||||
|
|
||||||
|
public smoothscroll: boolean; |
||||||
|
|
||||||
|
public complete: string; |
||||||
|
|
||||||
|
constructor({ |
||||||
|
hintchars, |
||||||
|
smoothscroll, |
||||||
|
complete, |
||||||
|
}: { |
||||||
|
hintchars?: string; |
||||||
|
smoothscroll?: boolean; |
||||||
|
complete?: string; |
||||||
|
}) { |
||||||
|
this.hintchars = hintchars || defaultValues.hintchars; |
||||||
|
this.smoothscroll = smoothscroll || defaultValues.smoothscroll; |
||||||
|
this.complete = complete || defaultValues.complete; |
||||||
|
} |
||||||
|
|
||||||
|
static fromJSON(json: any): Properties { |
||||||
|
let defNames: Set<string> = new Set(defs.map(def => def.name)); |
||||||
|
let unknownName = Object.keys(json).find(name => !defNames.has(name)); |
||||||
|
if (unknownName) { |
||||||
|
throw new TypeError(`Unknown property name: "${unknownName}"`); |
||||||
|
} |
||||||
|
|
||||||
|
for (let def of defs) { |
||||||
|
if (!Object.prototype.hasOwnProperty.call(json, def.name)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (typeof json[def.name] !== def.type) { |
||||||
|
throw new TypeError( |
||||||
|
`property "${def.name}" is not ${def.type}`); |
||||||
|
} |
||||||
|
} |
||||||
|
return new Properties(json); |
||||||
|
} |
||||||
|
|
||||||
|
static types(): PropertyTypes { |
||||||
|
return { |
||||||
|
hintchars: 'string', |
||||||
|
smoothscroll: 'boolean', |
||||||
|
complete: 'string', |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
static def(name: string): PropertyDef | undefined { |
||||||
|
return defs.find(p => p.name === name); |
||||||
|
} |
||||||
|
|
||||||
|
static defs(): PropertyDef[] { |
||||||
|
return defs; |
||||||
|
} |
||||||
|
|
||||||
|
toJSON(): PropertiesJSON { |
||||||
|
return { |
||||||
|
hintchars: this.hintchars, |
||||||
|
smoothscroll: this.smoothscroll, |
||||||
|
complete: this.complete, |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -1,18 +0,0 @@ |
|||||||
import * as settings from 'shared/settings'; |
|
||||||
|
|
||||||
describe('properties', () => { |
|
||||||
describe('Def class', () => { |
|
||||||
it('returns property definitions', () => { |
|
||||||
let def = new proerties.Def( |
|
||||||
'smoothscroll', |
|
||||||
'smooth scroll', |
|
||||||
false); |
|
||||||
|
|
||||||
expect(def.name).to.equal('smoothscroll'); |
|
||||||
expect(def.describe).to.equal('smooth scroll'); |
|
||||||
expect(def.defaultValue).to.equal(false); |
|
||||||
expect(def.type).to.equal('boolean'); |
|
||||||
}); |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
@ -1,18 +0,0 @@ |
|||||||
import * as settings from 'shared/settings'; |
|
||||||
|
|
||||||
describe('properties', () => { |
|
||||||
describe('Def class', () => { |
|
||||||
it('returns property definitions', () => { |
|
||||||
let def = new proerties.Def( |
|
||||||
'smoothscroll', |
|
||||||
'smooth scroll', |
|
||||||
false); |
|
||||||
|
|
||||||
expect(def.name).to.equal('smoothscroll'); |
|
||||||
expect(def.describe).to.equal('smooth scroll'); |
|
||||||
expect(def.defaultValue).to.equal(false); |
|
||||||
expect(def.type).to.equal('boolean'); |
|
||||||
}); |
|
||||||
}); |
|
||||||
}); |
|
||||||
|
|
@ -0,0 +1,30 @@ |
|||||||
|
import Properties from '../../../src/shared/settings/Properties'; |
||||||
|
import { expect } from 'chai'; |
||||||
|
|
||||||
|
describe('Properties', () => { |
||||||
|
describe('#propertiesValueOf', () => { |
||||||
|
it('returns with default properties by empty settings', () => { |
||||||
|
let props = Properties.fromJSON({}); |
||||||
|
expect(props).to.deep.equal({ |
||||||
|
hintchars: "abcdefghijklmnopqrstuvwxyz", |
||||||
|
smoothscroll: false, |
||||||
|
complete: "sbh" |
||||||
|
}) |
||||||
|
}); |
||||||
|
|
||||||
|
it('returns properties by valid settings', () => { |
||||||
|
let props = Properties.fromJSON({ |
||||||
|
hintchars: "abcdefgh", |
||||||
|
smoothscroll: false, |
||||||
|
complete: "sbh" |
||||||
|
}); |
||||||
|
|
||||||
|
expect(props).to.deep.equal({ |
||||||
|
hintchars: "abcdefgh", |
||||||
|
smoothscroll: false, |
||||||
|
complete: "sbh" |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
Reference in new issue