summaryrefslogtreecommitdiffstats
path: root/toolkit/jetpack/sdk/ui/button/contract.js
blob: ce6e33d958b5d3d09a7aec34160b76e84f7a4d15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
'use strict';

const { contract } = require('../../util/contract');
const { isLocalURL } = require('../../url');
const { isNil, isObject, isString } = require('../../lang/type');
const { required, either, string, boolean, object, number } = require('../../deprecated/api-utils');
const { merge } = require('../../util/object');
const { freeze } = Object;

const isIconSet = (icons) =>
  Object.keys(icons).
    every(size => String(size >>> 0) === size && isLocalURL(icons[size]));

var iconSet = {
  is: either(object, string),
  map: v => isObject(v) ? freeze(merge({}, v)) : v,
  ok: v => (isString(v) && isLocalURL(v)) || (isObject(v) && isIconSet(v)),
  msg: 'The option "icon" must be a local URL or an object with ' +
    'numeric keys / local URL values pair.'
}

var id = {
  is: string,
  ok: v => /^[a-z-_][a-z0-9-_]*$/i.test(v),
  msg: 'The option "id" must be a valid alphanumeric id (hyphens and ' +
        'underscores are allowed).'
};

var label = {
  is: string,
  ok: v => isNil(v) || v.trim().length > 0,
  msg: 'The option "label" must be a non empty string'
}

var badge = {
  is: either(string, number),
  msg: 'The option "badge" must be a string or a number'
}

var badgeColor = {
  is: string,
  msg: 'The option "badgeColor" must be a string'
}

var stateContract = contract({
  label: label,
  icon: iconSet,
  disabled: boolean,
  badge: badge,
  badgeColor: badgeColor
});

exports.stateContract = stateContract;

var buttonContract = contract(merge({}, stateContract.rules, {
  id: required(id),
  label: required(label),
  icon: required(iconSet)
}));

exports.buttonContract = buttonContract;

exports.toggleStateContract = contract(merge({
  checked: boolean
}, stateContract.rules));

exports.toggleButtonContract = contract(merge({
  checked: boolean
}, buttonContract.rules));