1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _util = require('util');
|
8 |
|
9 | var _util2 = _interopRequireDefault(_util);
|
10 |
|
11 | var _Schema = require('./Schema');
|
12 |
|
13 | var _Schema2 = _interopRequireDefault(_Schema);
|
14 |
|
15 | var _Error = require('../Error');
|
16 |
|
17 | var _Error2 = _interopRequireDefault(_Error);
|
18 |
|
19 | var _Reference = require('../Reference');
|
20 |
|
21 | var _Reference2 = _interopRequireDefault(_Reference);
|
22 |
|
23 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
24 |
|
25 | class 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 |
|
196 | exports.default = BooleanSchema; |
\ | No newline at end of file |