1"use strict";
2
3exports.__esModule = true;
4exports.DEPRECATED_KEYS = exports.BUILDER_KEYS = exports.NODE_FIELDS = exports.ALIAS_KEYS = exports.VISITOR_KEYS = undefined;
5
6var _getIterator2 = require("babel-runtime/core-js/get-iterator");
7
8var _getIterator3 = _interopRequireDefault(_getIterator2);
9
10var _stringify = require("babel-runtime/core-js/json/stringify");
11
12var _stringify2 = _interopRequireDefault(_stringify);
13
14var _typeof2 = require("babel-runtime/helpers/typeof");
15
16var _typeof3 = _interopRequireDefault(_typeof2);
17
18exports.assertEach = assertEach;
19exports.assertOneOf = assertOneOf;
20exports.assertNodeType = assertNodeType;
21exports.assertNodeOrValueType = assertNodeOrValueType;
22exports.assertValueType = assertValueType;
23exports.chain = chain;
24exports.default = defineType;
25
26var _index = require("../index");
27
28var t = _interopRequireWildcard(_index);
29
30function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
31
32function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
34var VISITOR_KEYS = exports.VISITOR_KEYS = {};
35var ALIAS_KEYS = exports.ALIAS_KEYS = {};
36var NODE_FIELDS = exports.NODE_FIELDS = {};
37var BUILDER_KEYS = exports.BUILDER_KEYS = {};
38var DEPRECATED_KEYS = exports.DEPRECATED_KEYS = {};
39
40function getType(val) {
41  if (Array.isArray(val)) {
42    return "array";
43  } else if (val === null) {
44    return "null";
45  } else if (val === undefined) {
46    return "undefined";
47  } else {
48    return typeof val === "undefined" ? "undefined" : (0, _typeof3.default)(val);
49  }
50}
51
52function assertEach(callback) {
53  function validator(node, key, val) {
54    if (!Array.isArray(val)) return;
55
56    for (var i = 0; i < val.length; i++) {
57      callback(node, key + "[" + i + "]", val[i]);
58    }
59  }
60  validator.each = callback;
61  return validator;
62}
63
64function assertOneOf() {
65  for (var _len = arguments.length, vals = Array(_len), _key = 0; _key < _len; _key++) {
66    vals[_key] = arguments[_key];
67  }
68
69  function validate(node, key, val) {
70    if (vals.indexOf(val) < 0) {
71      throw new TypeError("Property " + key + " expected value to be one of " + (0, _stringify2.default)(vals) + " but got " + (0, _stringify2.default)(val));
72    }
73  }
74
75  validate.oneOf = vals;
76
77  return validate;
78}
79
80function assertNodeType() {
81  for (var _len2 = arguments.length, types = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
82    types[_key2] = arguments[_key2];
83  }
84
85  function validate(node, key, val) {
86    var valid = false;
87
88    for (var _iterator = types, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
89      var _ref;
90
91      if (_isArray) {
92        if (_i >= _iterator.length) break;
93        _ref = _iterator[_i++];
94      } else {
95        _i = _iterator.next();
96        if (_i.done) break;
97        _ref = _i.value;
98      }
99
100      var type = _ref;
101
102      if (t.is(type, val)) {
103        valid = true;
104        break;
105      }
106    }
107
108    if (!valid) {
109      throw new TypeError("Property " + key + " of " + node.type + " expected node to be of a type " + (0, _stringify2.default)(types) + " " + ("but instead got " + (0, _stringify2.default)(val && val.type)));
110    }
111  }
112
113  validate.oneOfNodeTypes = types;
114
115  return validate;
116}
117
118function assertNodeOrValueType() {
119  for (var _len3 = arguments.length, types = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
120    types[_key3] = arguments[_key3];
121  }
122
123  function validate(node, key, val) {
124    var valid = false;
125
126    for (var _iterator2 = types, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
127      var _ref2;
128
129      if (_isArray2) {
130        if (_i2 >= _iterator2.length) break;
131        _ref2 = _iterator2[_i2++];
132      } else {
133        _i2 = _iterator2.next();
134        if (_i2.done) break;
135        _ref2 = _i2.value;
136      }
137
138      var type = _ref2;
139
140      if (getType(val) === type || t.is(type, val)) {
141        valid = true;
142        break;
143      }
144    }
145
146    if (!valid) {
147      throw new TypeError("Property " + key + " of " + node.type + " expected node to be of a type " + (0, _stringify2.default)(types) + " " + ("but instead got " + (0, _stringify2.default)(val && val.type)));
148    }
149  }
150
151  validate.oneOfNodeOrValueTypes = types;
152
153  return validate;
154}
155
156function assertValueType(type) {
157  function validate(node, key, val) {
158    var valid = getType(val) === type;
159
160    if (!valid) {
161      throw new TypeError("Property " + key + " expected type of " + type + " but got " + getType(val));
162    }
163  }
164
165  validate.type = type;
166
167  return validate;
168}
169
170function chain() {
171  for (var _len4 = arguments.length, fns = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
172    fns[_key4] = arguments[_key4];
173  }
174
175  function validate() {
176    for (var _iterator3 = fns, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
177      var _ref3;
178
179      if (_isArray3) {
180        if (_i3 >= _iterator3.length) break;
181        _ref3 = _iterator3[_i3++];
182      } else {
183        _i3 = _iterator3.next();
184        if (_i3.done) break;
185        _ref3 = _i3.value;
186      }
187
188      var fn = _ref3;
189
190      fn.apply(undefined, arguments);
191    }
192  }
193  validate.chainOf = fns;
194  return validate;
195}
196
197function defineType(type) {
198  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
199
200  var inherits = opts.inherits && store[opts.inherits] || {};
201
202  opts.fields = opts.fields || inherits.fields || {};
203  opts.visitor = opts.visitor || inherits.visitor || [];
204  opts.aliases = opts.aliases || inherits.aliases || [];
205  opts.builder = opts.builder || inherits.builder || opts.visitor || [];
206
207  if (opts.deprecatedAlias) {
208    DEPRECATED_KEYS[opts.deprecatedAlias] = type;
209  }
210
211  for (var _iterator4 = opts.visitor.concat(opts.builder), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : (0, _getIterator3.default)(_iterator4);;) {
212    var _ref4;
213
214    if (_isArray4) {
215      if (_i4 >= _iterator4.length) break;
216      _ref4 = _iterator4[_i4++];
217    } else {
218      _i4 = _iterator4.next();
219      if (_i4.done) break;
220      _ref4 = _i4.value;
221    }
222
223    var _key5 = _ref4;
224
225    opts.fields[_key5] = opts.fields[_key5] || {};
226  }
227
228  for (var key in opts.fields) {
229    var field = opts.fields[key];
230
231    if (opts.builder.indexOf(key) === -1) {
232      field.optional = true;
233    }
234    if (field.default === undefined) {
235      field.default = null;
236    } else if (!field.validate) {
237      field.validate = assertValueType(getType(field.default));
238    }
239  }
240
241  VISITOR_KEYS[type] = opts.visitor;
242  BUILDER_KEYS[type] = opts.builder;
243  NODE_FIELDS[type] = opts.fields;
244  ALIAS_KEYS[type] = opts.aliases;
245
246  store[type] = opts;
247}
248
249var store = {};