diff options
| author | Shin'ya Ueoka <ueokande@i-beam.org> | 2018-01-04 20:34:33 +0900 | 
|---|---|---|
| committer | Shin'ya Ueoka <ueokande@i-beam.org> | 2018-01-05 22:55:25 +0900 | 
| commit | e19f89f16248ed4bf28deaa9ab4b5204061df5eb (patch) | |
| tree | 74ca100c101dba61f2086631cd0ee9c0fc8d3e27 | |
| parent | fbdec04786e28bad45021bef4a74e7077e34282f (diff) | |
add property to settings
| -rw-r--r-- | src/shared/settings/property-types.js | 6 | ||||
| -rw-r--r-- | src/shared/settings/validator.js | 17 | ||||
| -rw-r--r-- | src/shared/settings/values.js | 18 | ||||
| -rw-r--r-- | test/shared/settings/values.test.js | 29 | 
4 files changed, 61 insertions, 9 deletions
diff --git a/src/shared/settings/property-types.js b/src/shared/settings/property-types.js new file mode 100644 index 0000000..bcfa809 --- /dev/null +++ b/src/shared/settings/property-types.js @@ -0,0 +1,6 @@ +export default { +  // TODO describe property types here +  // mystr: 'string', +  // mynum: 'number', +  // mybool: 'boolean', +}; diff --git a/src/shared/settings/validator.js b/src/shared/settings/validator.js index 949ab29..6fadac7 100644 --- a/src/shared/settings/validator.js +++ b/src/shared/settings/validator.js @@ -1,6 +1,7 @@  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) => {    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) => {    validateInvalidTopKeys(settings);    if (settings.keymaps) { @@ -56,6 +68,9 @@ const validate = (settings) => {    if (settings.search) {      validateSearch(settings.search);    } +  if (settings.properties) { +    validateProperties(settings.properties); +  }  };  export { validate }; diff --git a/src/shared/settings/values.js b/src/shared/settings/values.js index 4e55fa0..5027ba5 100644 --- a/src/shared/settings/values.js +++ b/src/shared/settings/values.js @@ -44,9 +44,12 @@ const valueFromForm = (form) => {      }    } -  let blacklist = form.blacklist; - -  return { keymaps, search, blacklist }; +  return { +    keymaps, +    search, +    blacklist: form.blacklist, +    properties: form.properties +  };  };  const jsonFromValue = (value) => { @@ -78,9 +81,12 @@ const formFromValue = (value, allowedOps) => {      }    } -  let blacklist = value.blacklist; - -  return { keymaps, search, blacklist }; +  return { +    keymaps, +    search, +    blacklist: value.blacklist, +    properties: value.properties, +  };  };  const jsonFromForm = (form) => { diff --git a/test/shared/settings/values.test.js b/test/shared/settings/values.test.js index 2632cd7..62cfb5f 100644 --- a/test/shared/settings/values.test.js +++ b/test/shared/settings/values.test.js @@ -7,13 +7,21 @@ describe("settings values", () => {        let json = `{          "keymaps": { "0": {"type": "scroll.home"}},          "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);        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.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={}']],          },          blacklist: ['*.slack.com'], +        "properties": { +          "mystr": "value", +          "mynum": 123, +          "mybool": true, +        }        };        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(value.search).to.deep.equal({ default: "google", engines: { google: "https://google.com/search?q={}"} });        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', () => { @@ -45,6 +61,7 @@ describe("settings values", () => {        expect(value).to.not.have.key('keymaps');        expect(value).to.not.have.key('search');        expect(value).to.not.have.key('blacklist'); +      expect(value).to.not.have.key('properties');      });      it('override keymaps', () => { @@ -96,7 +113,12 @@ describe("settings values", () => {            0: { type: 'scroll.home' },          },          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 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.blacklist).to.have.lengthOf(1);        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);      });    });  });  | 
