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 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 };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue