add property to settings
This commit is contained in:
parent
fbdec04786
commit
e19f89f162
4 changed files with 61 additions and 9 deletions
6
src/shared/settings/property-types.js
Normal file
6
src/shared/settings/property-types.js
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
export default {
|
||||||
|
// TODO describe property types here
|
||||||
|
// mystr: 'string',
|
||||||
|
// mynum: 'number',
|
||||||
|
// mybool: 'boolean',
|
||||||
|
};
|
|
@ -1,6 +1,7 @@
|
||||||
import operations from 'shared/operations';
|
import operations from 'shared/operations';
|
||||||
|
import propertyTypes from './property-types';
|
||||||
|
|
||||||
const VALID_TOP_KEYS = ['keymaps', 'search', 'blacklist'];
|
const VALID_TOP_KEYS = ['keymaps', 'search', 'blacklist', 'properties'];
|
||||||
const VALID_OPERATION_VALUES = Object.keys(operations).map((key) => {
|
const VALID_OPERATION_VALUES = Object.keys(operations).map((key) => {
|
||||||
return operations[key];
|
return operations[key];
|
||||||
});
|
});
|
||||||
|
@ -48,6 +49,17 @@ const validateSearch = (search) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const validateProperties = (properties) => {
|
||||||
|
for (let name of Object.keys(properties)) {
|
||||||
|
if (!propertyTypes[name]) {
|
||||||
|
throw new Error(`Unknown property name: "${name}"`);
|
||||||
|
}
|
||||||
|
if (typeof properties[name] !== propertyTypes[name]) {
|
||||||
|
throw new Error(`Invalid type for property: "${name}"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const validate = (settings) => {
|
const validate = (settings) => {
|
||||||
validateInvalidTopKeys(settings);
|
validateInvalidTopKeys(settings);
|
||||||
if (settings.keymaps) {
|
if (settings.keymaps) {
|
||||||
|
@ -56,6 +68,9 @@ const validate = (settings) => {
|
||||||
if (settings.search) {
|
if (settings.search) {
|
||||||
validateSearch(settings.search);
|
validateSearch(settings.search);
|
||||||
}
|
}
|
||||||
|
if (settings.properties) {
|
||||||
|
validateProperties(settings.properties);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export { validate };
|
export { validate };
|
||||||
|
|
|
@ -44,9 +44,12 @@ const valueFromForm = (form) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let blacklist = form.blacklist;
|
return {
|
||||||
|
keymaps,
|
||||||
return { keymaps, search, blacklist };
|
search,
|
||||||
|
blacklist: form.blacklist,
|
||||||
|
properties: form.properties
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const jsonFromValue = (value) => {
|
const jsonFromValue = (value) => {
|
||||||
|
@ -78,9 +81,12 @@ const formFromValue = (value, allowedOps) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let blacklist = value.blacklist;
|
return {
|
||||||
|
keymaps,
|
||||||
return { keymaps, search, blacklist };
|
search,
|
||||||
|
blacklist: value.blacklist,
|
||||||
|
properties: value.properties,
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const jsonFromForm = (form) => {
|
const jsonFromForm = (form) => {
|
||||||
|
|
|
@ -7,13 +7,21 @@ describe("settings values", () => {
|
||||||
let json = `{
|
let json = `{
|
||||||
"keymaps": { "0": {"type": "scroll.home"}},
|
"keymaps": { "0": {"type": "scroll.home"}},
|
||||||
"search": { "default": "google", "engines": { "google": "https://google.com/search?q={}" }},
|
"search": { "default": "google", "engines": { "google": "https://google.com/search?q={}" }},
|
||||||
"blacklist": [ "*.slack.com"]
|
"blacklist": [ "*.slack.com"],
|
||||||
|
"properties": {
|
||||||
|
"mystr": "value",
|
||||||
|
"mynum": 123,
|
||||||
|
"mybool": true
|
||||||
|
}
|
||||||
}`;
|
}`;
|
||||||
let value = values.valueFromJson(json);
|
let value = values.valueFromJson(json);
|
||||||
|
|
||||||
expect(value.keymaps).to.deep.equal({ 0: {type: "scroll.home"}});
|
expect(value.keymaps).to.deep.equal({ 0: {type: "scroll.home"}});
|
||||||
expect(value.search).to.deep.equal({ default: "google", engines: { google: "https://google.com/search?q={}"} });
|
expect(value.search).to.deep.equal({ default: "google", engines: { google: "https://google.com/search?q={}"} });
|
||||||
expect(value.blacklist).to.deep.equal(["*.slack.com"]);
|
expect(value.blacklist).to.deep.equal(["*.slack.com"]);
|
||||||
|
expect(value.properties).to.have.property('mystr', 'value');
|
||||||
|
expect(value.properties).to.have.property('mynum', 123);
|
||||||
|
expect(value.properties).to.have.property('mybool', true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -29,6 +37,11 @@ describe("settings values", () => {
|
||||||
engines: [['google', 'https://google.com/search?q={}']],
|
engines: [['google', 'https://google.com/search?q={}']],
|
||||||
},
|
},
|
||||||
blacklist: ['*.slack.com'],
|
blacklist: ['*.slack.com'],
|
||||||
|
"properties": {
|
||||||
|
"mystr": "value",
|
||||||
|
"mynum": 123,
|
||||||
|
"mybool": true,
|
||||||
|
}
|
||||||
};
|
};
|
||||||
let value = values.valueFromForm(form);
|
let value = values.valueFromForm(form);
|
||||||
|
|
||||||
|
@ -37,6 +50,9 @@ describe("settings values", () => {
|
||||||
expect(JSON.stringify(value.search)).to.deep.equal(JSON.stringify({ default: "google", engines: { google: "https://google.com/search?q={}"} }));
|
expect(JSON.stringify(value.search)).to.deep.equal(JSON.stringify({ default: "google", engines: { google: "https://google.com/search?q={}"} }));
|
||||||
expect(value.search).to.deep.equal({ default: "google", engines: { google: "https://google.com/search?q={}"} });
|
expect(value.search).to.deep.equal({ default: "google", engines: { google: "https://google.com/search?q={}"} });
|
||||||
expect(value.blacklist).to.deep.equal(["*.slack.com"]);
|
expect(value.blacklist).to.deep.equal(["*.slack.com"]);
|
||||||
|
expect(value.properties).to.have.property('mystr', 'value');
|
||||||
|
expect(value.properties).to.have.property('mynum', 123);
|
||||||
|
expect(value.properties).to.have.property('mybool', true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('convert from empty form', () => {
|
it('convert from empty form', () => {
|
||||||
|
@ -45,6 +61,7 @@ describe("settings values", () => {
|
||||||
expect(value).to.not.have.key('keymaps');
|
expect(value).to.not.have.key('keymaps');
|
||||||
expect(value).to.not.have.key('search');
|
expect(value).to.not.have.key('search');
|
||||||
expect(value).to.not.have.key('blacklist');
|
expect(value).to.not.have.key('blacklist');
|
||||||
|
expect(value).to.not.have.key('properties');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('override keymaps', () => {
|
it('override keymaps', () => {
|
||||||
|
@ -96,7 +113,12 @@ describe("settings values", () => {
|
||||||
0: { type: 'scroll.home' },
|
0: { type: 'scroll.home' },
|
||||||
},
|
},
|
||||||
search: { default: 'google', engines: { google: 'https://google.com/search?q={}' }},
|
search: { default: 'google', engines: { google: 'https://google.com/search?q={}' }},
|
||||||
blacklist: [ '*.slack.com']
|
blacklist: [ '*.slack.com'],
|
||||||
|
properties: {
|
||||||
|
"mystr": "value",
|
||||||
|
"mynum": 123,
|
||||||
|
"mybool": true,
|
||||||
|
}
|
||||||
};
|
};
|
||||||
let allowed = ['scroll.vertically?{"count":1}', 'scroll.home' ];
|
let allowed = ['scroll.vertically?{"count":1}', 'scroll.home' ];
|
||||||
let form = values.formFromValue(value, allowed);
|
let form = values.formFromValue(value, allowed);
|
||||||
|
@ -109,6 +131,9 @@ describe("settings values", () => {
|
||||||
expect(form.search).to.have.deep.property('engines', [['google', 'https://google.com/search?q={}']]);
|
expect(form.search).to.have.deep.property('engines', [['google', 'https://google.com/search?q={}']]);
|
||||||
expect(form.blacklist).to.have.lengthOf(1);
|
expect(form.blacklist).to.have.lengthOf(1);
|
||||||
expect(form.blacklist).to.include('*.slack.com');
|
expect(form.blacklist).to.include('*.slack.com');
|
||||||
|
expect(form.properties).to.have.property('mystr', 'value');
|
||||||
|
expect(form.properties).to.have.property('mynum', 123);
|
||||||
|
expect(form.properties).to.have.property('mybool', true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Reference in a new issue