UNPKG

6.5 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _util = require('util');
8
9var _util2 = _interopRequireDefault(_util);
10
11var _Schema = require('./Schema');
12
13var _Schema2 = _interopRequireDefault(_Schema);
14
15var _Error = require('../Error');
16
17var _Error2 = _interopRequireDefault(_Error);
18
19var _Reference = require('../Reference');
20
21var _Reference2 = _interopRequireDefault(_Reference);
22
23function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
25class BooleanSchema extends _Schema2.default {
26 constructor(base) {
27 super(base);
28
29 const set = this._setting;
30 set.truthy = new Set();
31 set.falsy = new Set();
32 set.format = new Map();
33
34 let raw = this._rules.descriptor.pop();
35 this._rules.descriptor.push(this._parserDescriptor, this._formatDescriptor, raw);
36 raw = this._rules.validator.pop();
37 this._rules.validator.push(this._parserValidator, this._formatValidator, raw);
38 }
39
40 truthy(...values) {
41 const set = this._setting;
42 const value = values.reduce((acc, val) => acc.concat(val), []);
43 if (value.length === 1 && value[0] === undefined) set.truthy.clear();else if (value.length === 1 && value[0] instanceof _Reference2.default) set.truthy = value[0];else {
44 set.truthy = new Set();
45 var _iteratorNormalCompletion = true;
46 var _didIteratorError = false;
47 var _iteratorError = undefined;
48
49 try {
50 for (var _iterator = value[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
51 const e = _step.value;
52
53 if (value === undefined) set.required = false;
54 set.truthy.add(e);
55 set.falsy.delete(e);
56 }
57 } catch (err) {
58 _didIteratorError = true;
59 _iteratorError = err;
60 } finally {
61 try {
62 if (!_iteratorNormalCompletion && _iterator.return) {
63 _iterator.return();
64 }
65 } finally {
66 if (_didIteratorError) {
67 throw _iteratorError;
68 }
69 }
70 }
71 }
72 return this;
73 }
74 falsy(...values) {
75 const set = this._setting;
76 const value = values.reduce((acc, val) => acc.concat(val), []);
77 if (value.length === 1 && value[0] === undefined) set.falsy.clear();else if (value.length === 1 && value[0] instanceof _Reference2.default) set.falsy = value[0];else {
78 set.falsy = new Set();
79 var _iteratorNormalCompletion2 = true;
80 var _didIteratorError2 = false;
81 var _iteratorError2 = undefined;
82
83 try {
84 for (var _iterator2 = value[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
85 const e = _step2.value;
86
87 if (value === undefined) set.required = false;
88 set.falsy.add(e);
89 set.truthy.delete(e);
90 }
91 } catch (err) {
92 _didIteratorError2 = true;
93 _iteratorError2 = err;
94 } finally {
95 try {
96 if (!_iteratorNormalCompletion2 && _iterator2.return) {
97 _iterator2.return();
98 }
99 } finally {
100 if (_didIteratorError2) {
101 throw _iteratorError2;
102 }
103 }
104 }
105 }
106 return this;
107 }
108
109 tolerant(flag = true) {
110 const set = this._setting;
111 if (flag) {
112 this.truthy(1, '1', 'true', 'on', 'yes', '+');
113 this.falsy(0, '0', 'false', 'off', 'no', '-');
114 } else {
115 set.truthy.clear();
116 set.falsy.clear();
117 }
118 return this;
119 }
120
121 insensitive(flag) {
122 return this._setFlag('insensitive', flag);
123 }
124
125 _parserDescriptor() {
126 const set = this._setting;
127 let msg = '';
128 let truthy = Array.from(set.truthy);
129 truthy.unshift(true);
130 truthy = truthy.map(e => `\`${_util2.default.inspect(e)}\``).join(', ').replace(/(.*),/, '$1 and');
131 let falsy = Array.from(set.falsy);
132 falsy.unshift(false);
133 falsy = falsy.map(e => `\`${_util2.default.inspect(e)}\``).join(', ').replace(/(.*),/, '$1 and');
134 msg = `A boolean which is \`true\` for ${truthy} and \`false\` for ${falsy}. `;
135 if (set.insensitive instanceof _Reference2.default) {
136 msg += `Strings are matched case insensitive depending on ${set.insensitive.description}. `;
137 } else if (set.insensitive) {
138 msg = 'Strings are matched insensitive for possible `true`/`false` values. ';
139 }
140 return msg.replace(/ $/, '\n');
141 }
142
143 _parserValidator(data) {
144 const check = this._check;
145 try {
146 this._checkArray('truthy');
147 this._checkArray('falsy');
148 this._checkBoolean('insensitive');
149 } catch (err) {
150 return Promise.reject(new _Error2.default(this, data, err.message));
151 }
152 if (check.insensitive) {
153 check.truthy = Array.from(check.truthy).map(e => typeof e === 'string' ? e.toLowerCase() : e);
154 check.falsy = Array.from(check.falsy).map(e => typeof e === 'string' ? e.toLowerCase() : e);
155 }
156 check.truthy.unshift(true);
157 check.falsy.unshift(false);
158
159 if (check.insensitive) data.value = data.value.toLowerCase();
160 if (check.truthy.includes(data.value)) data.value = true;else if (check.falsy.includes(data.value)) data.value = false;else {
161 return Promise.reject(new _Error2.default(this, data, 'A boolean value is needed but neither `true` nor `false` was given.'));
162 }
163
164 return Promise.resolve();
165 }
166
167 format(truthy, falsy) {
168 const set = this._setting;
169 if (truthy) set.format.set(true, truthy);else if (truthy === undefined) set.format.delete(true);
170 if (falsy) set.format.set(false, falsy);else if (falsy === undefined) set.format.delete(false);
171 return this;
172 }
173
174 _formatDescriptor() {
175 const set = this._setting;
176 return set.format.size ? `Strings are formatted using \`${_util2.default.inspect(set.format.get(true))}\` for \
177\`true\` and \`${_util2.default.inspect(set.format.get(false))}\` for \`false\`.\n` : '';
178 }
179
180 _formatValidator(data) {
181 const check = this._check;
182 try {
183 this._checkObject('format');
184 if (Object.keys(check.format).filter(e => e !== 'true' && e !== 'false').length) {
185 throw new Error('Only `true` and `false` settings are allowed in format()`');
186 }
187 } catch (err) {
188 return Promise.reject(new _Error2.default(this, data, err.message));
189 }
190
191 if (Object.keys(check.format).length) data.value = check.format[data.value] || data.value;
192 return Promise.resolve();
193 }
194}
195
196exports.default = BooleanSchema;
\No newline at end of file