canonical
Version:
Canonical code style linter and formatter for JavaScript, SCSS, CSS and JSON.
245 lines (192 loc) • 6.57 kB
JavaScript
/* @noflow */
;
var _getIterator = require("babel-runtime/core-js/get-iterator")["default"];
var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"];
exports.__esModule = true;
exports.assertEach = assertEach;
exports.assertOneOf = assertOneOf;
exports.assertNodeType = assertNodeType;
exports.assertNodeOrValueType = assertNodeOrValueType;
exports.assertValueType = assertValueType;
exports.chain = chain;
exports["default"] = defineType;
var _index = require("../index");
var t = _interopRequireWildcard(_index);
var VISITOR_KEYS = {};
exports.VISITOR_KEYS = VISITOR_KEYS;
var ALIAS_KEYS = {};
exports.ALIAS_KEYS = ALIAS_KEYS;
var NODE_FIELDS = {};
exports.NODE_FIELDS = NODE_FIELDS;
var BUILDER_KEYS = {};
exports.BUILDER_KEYS = BUILDER_KEYS;
var DEPRECATED_KEYS = {};
exports.DEPRECATED_KEYS = DEPRECATED_KEYS;
function getType(val) {
if (Array.isArray(val)) {
return "array";
} else if (val === null) {
return "null";
} else if (val === undefined) {
return "undefined";
} else {
return typeof val;
}
}
function assertEach(callback /*: Function*/) /*: Function*/ {
function validator(node, key, val) {
if (!Array.isArray(val)) return;
for (var i = 0; i < val.length; i++) {
callback(node, key + "[" + i + "]", val[i]);
}
}
validator.each = callback;
return validator;
}
function assertOneOf() /*: Function*/ {
for (var _len = arguments.length, vals = Array(_len), _key = 0; _key < _len; _key++) {
vals[_key] = arguments[_key];
}
function validate(node, key, val) {
if (vals.indexOf(val) < 0) {
throw new TypeError("Property " + key + " expected value to be one of " + JSON.stringify(vals) + " but got " + JSON.stringify(val));
}
}
validate.oneOf = vals;
return validate;
}
function assertNodeType() /*: Function*/ {
for (var _len2 = arguments.length, types = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
types[_key2] = arguments[_key2];
}
function validate(node, key, val) {
var valid = false;
for (var _iterator = types, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var type = _ref;
if (t.is(type, val)) {
valid = true;
break;
}
}
if (!valid) {
throw new TypeError("Property " + key + " of " + node.type + " expected node to be of a type " + JSON.stringify(types) + " but instead got " + JSON.stringify(val && val.type));
}
}
validate.oneOfNodeTypes = types;
return validate;
}
function assertNodeOrValueType() /*: Function*/ {
for (var _len3 = arguments.length, types = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
types[_key3] = arguments[_key3];
}
function validate(node, key, val) {
var valid = false;
for (var _iterator2 = types, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
var _ref2;
if (_isArray2) {
if (_i2 >= _iterator2.length) break;
_ref2 = _iterator2[_i2++];
} else {
_i2 = _iterator2.next();
if (_i2.done) break;
_ref2 = _i2.value;
}
var type = _ref2;
if (getType(val) === type || t.is(type, val)) {
valid = true;
break;
}
}
if (!valid) {
throw new TypeError("Property " + key + " of " + node.type + " expected node to be of a type " + JSON.stringify(types) + " but instead got " + JSON.stringify(val && val.type));
}
}
validate.oneOfNodeOrValueTypes = types;
return validate;
}
function assertValueType(type /*: string*/) /*: Function*/ {
function validate(node, key, val) {
var valid = getType(val) === type;
if (!valid) {
throw new TypeError("Property " + key + " expected type of " + type + " but got " + getType(val));
}
}
validate.type = type;
return validate;
}
function chain() /*: Function*/ {
for (var _len4 = arguments.length, fns = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
fns[_key4] = arguments[_key4];
}
function validate() {
for (var _iterator3 = fns, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
var _ref3;
if (_isArray3) {
if (_i3 >= _iterator3.length) break;
_ref3 = _iterator3[_i3++];
} else {
_i3 = _iterator3.next();
if (_i3.done) break;
_ref3 = _i3.value;
}
var fn = _ref3;
fn.apply(undefined, arguments);
}
}
validate.chainOf = fns;
return validate;
}
function defineType(type /*: string*/) {
var opts /*: {
fields?: Object;
visitor?: Array<string>;
aliases?: Array<string>;
builder?: Array<string>;
inherits?: string;
}*/ = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var inherits = opts.inherits && store[opts.inherits] || {};
opts.fields = opts.fields || inherits.fields || {};
opts.visitor = opts.visitor || inherits.visitor || [];
opts.aliases = opts.aliases || inherits.aliases || [];
opts.builder = opts.builder || inherits.builder || opts.visitor || [];
if (opts.deprecatedAlias) {
DEPRECATED_KEYS[opts.deprecatedAlias] = type;
}
// ensure all field keys are represented in `fields`
for (var _iterator4 = (opts.visitor.concat(opts.builder) /*: Array<string>*/), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
var _ref4;
if (_isArray4) {
if (_i4 >= _iterator4.length) break;
_ref4 = _iterator4[_i4++];
} else {
_i4 = _iterator4.next();
if (_i4.done) break;
_ref4 = _i4.value;
}
var key = _ref4;
opts.fields[key] = opts.fields[key] || {};
}
for (var key in opts.fields) {
var field = opts.fields[key];
if (field["default"] === undefined) {
field["default"] = null;
} else if (!field.validate) {
field.validate = assertValueType(getType(field["default"]));
}
}
VISITOR_KEYS[type] = opts.visitor;
BUILDER_KEYS[type] = opts.builder;
NODE_FIELDS[type] = opts.fields;
ALIAS_KEYS[type] = opts.aliases;
store[type] = opts;
}
var store = {};