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