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";
module.metadata = {
"stability": "unstable"
};
const { Cc, Ci } = require('chrome');
const { isValidURI, URL } = require('../url');
const { contract } = require('../util/contract');
const { extend } = require('../util/object');
// map of property validations
const validItem = {
id: {
is: ['number', 'undefined', 'null'],
},
group: {
is: ['object', 'number', 'undefined', 'null'],
ok: function (value) {
return value &&
(value.toString && value.toString() === '[object Group]') ||
typeof value === 'number' ||
value.type === 'group';
},
msg: 'The `group` property must be a valid Group object'
},
index: {
is: ['undefined', 'null', 'number'],
map: value => value == null ? -1 : value,
msg: 'The `index` property must be a number.'
},
updated: {
is: ['number', 'undefined']
}
};
const validTitle = {
title: {
is: ['string'],
msg: 'The `title` property must be defined.'
}
};
const validURL = {
url: {
is: ['string'],
ok: isValidURI,
msg: 'The `url` property must be a valid URL.'
}
};
const validTags = {
tags: {
is: ['object'],
ok: tags => tags instanceof Set,
map: function (tags) {
if (Array.isArray(tags))
return new Set(tags);
if (tags == null)
return new Set();
return tags;
},
msg: 'The `tags` property must be a Set, or an array'
}
};
exports.bookmarkContract = contract(
extend(validItem, validTitle, validURL, validTags));
exports.separatorContract = contract(validItem);
exports.groupContract = contract(extend(validItem, validTitle));
|