react-schema
Version:
Use react like PropTypes for generic object validation.
72 lines (55 loc) • 1.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.analyze = exports.defineAnalyzer = undefined;
var _getTypeName = require('./utils/getTypeName');
var _getTypeName2 = _interopRequireDefault(_getTypeName);
var _clone = require('./utils/clone');
var _clone2 = _interopRequireDefault(_clone);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var analyzers = {};
var defineAnalyzer = exports.defineAnalyzer = function defineAnalyzer(type, analyzer) {
analyzers[type] = analyzer;
};
var analyze = exports.analyze = function analyze(checker) {
var nodeInfo = void 0;
if (checker && checker.$meta) {
var analyzer = analyzers[checker.$meta.type];
if (analyzer) {
nodeInfo = (0, _clone2.default)(analyzer(checker.$meta.args));
}
}
if (!nodeInfo) {
nodeInfo = { type: 'literal', value: (0, _getTypeName2.default)(checker) || null };
}
// We can infer whether `isRequired` was used by checking if the generated
// checker still has this property or not.
if (typeof checker === 'function' && !checker.hasOwnProperty('isRequired')) {
nodeInfo.isRequired = true;
}
return nodeInfo;
};
defineAnalyzer('shape', function (properties) {
var nodeInfo = {};
nodeInfo.type = 'shape';
nodeInfo.properties = Object.keys(properties).map(function (key) {
var childAST = (0, _clone2.default)(analyze(properties[key]));
childAST.name = key;
return childAST;
});
return nodeInfo;
});
defineAnalyzer('arrayOf', function (element) {
var nodeInfo = {};
nodeInfo.type = 'arrayOf';
nodeInfo.element = analyze(element);
return nodeInfo;
});
defineAnalyzer('oneOfType', function (types) {
var nodeInfo = {};
nodeInfo.type = 'oneOfType';
nodeInfo.types = types.map(analyze);
return nodeInfo;
});
//# sourceMappingURL=PropTypeAnalyzer.js.map