UNPKG

@schema-render/core-react

Version:

Through a set of simple JSON Schema, efficiently build a set of forms.

187 lines (186 loc) 7.88 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { default: function() { return traverseSchema; }, isInvalidTraverseSchema: function() { return isInvalidTraverseSchema; } }); var _tinyLodash = require("./tinyLodash"); function _array_like_to_array(arr, len) { if (len == null || len > arr.length) len = arr.length; for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i]; return arr2; } function _array_without_holes(arr) { if (Array.isArray(arr)) return _array_like_to_array(arr); } function _define_property(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _iterable_to_array(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _non_iterable_spread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _object_spread(target) { for(var i = 1; i < arguments.length; i++){ var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === "function") { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function(key) { _define_property(target, key, source[key]); }); } return target; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function(sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _object_spread_props(target, source) { source = source != null ? source : {}; if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function(key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _to_consumable_array(arr) { return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread(); } function _type_of(obj) { "@swc/helpers - typeof"; return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj; } function _unsupported_iterable_to_array(o, minLen) { if (!o) return; if (typeof o === "string") return _array_like_to_array(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen); } function isInvalidTraverseSchema(param) { var properties = param.properties; return !properties || (typeof properties === "undefined" ? "undefined" : _type_of(properties)) !== 'object' || Array.isArray(properties); } function traverseSchema(schema, visitor, options) { var opts = _object_spread({ mapKey: 'renderType', ignoreCase: true, clone: true, initialState: {}, initialStore: {} }, options); var finalSchema = opts.clone ? (0, _tinyLodash.cloneDeep)(schema) : schema; // 将 visitor 转换成小写 visitor = (0, _tinyLodash.mapKeys)(visitor, function(_, key) { return key.toLowerCase(); }); var traverse = function(param) { var _$schema = param.schema, path = param.path, state = param.state, store = param.store; if (isInvalidTraverseSchema(_$schema)) return; Object.keys(_$schema.properties).forEach(function(field) { var // 节点进入事件 _$$_enter, _special_enter, /** * 节点退出事件 */ _$$_exit, _$$Object_exit, _special_exit; var subSchema = _$schema.properties[field]; var subPath = _to_consumable_array(path).concat([ field ]); var currentState = (0, _tinyLodash.cloneDeep)(state); var params = { schema: subSchema, parentSchema: _$schema, path: subPath, field: field, state: currentState, store: store }; var innerTraverse = function(innerParams) { traverse(_object_spread_props(_object_spread({ schema: subSchema, path: subPath, state: currentState }, innerParams), { store: store })); }; var _visitor_$$; // $$: 匹配所有的节点类型 var $$ = (_visitor_$$ = visitor.$$) !== null && _visitor_$$ !== void 0 ? _visitor_$$ : {}; var _visitor_$$object; var $$Object = (_visitor_$$object = visitor.$$object) !== null && _visitor_$$object !== void 0 ? _visitor_$$object : {}; (_$$_enter = $$.enter) === null || _$$_enter === void 0 ? void 0 : _$$_enter.call($$, _object_spread_props(_object_spread({}, params), { traverse: innerTraverse })); var _subSchema_opts_mapKey; // special: 匹配特定的节点类型 var nodeType = (_subSchema_opts_mapKey = subSchema[opts.mapKey]) !== null && _subSchema_opts_mapKey !== void 0 ? _subSchema_opts_mapKey : ''; nodeType = opts.ignoreCase ? (0, _tinyLodash.toLower)(nodeType) : nodeType; var isObjectLike = (0, _tinyLodash.toLower)(nodeType).startsWith('object'); // 对象类型进入事件 if (isObjectLike) { var _$$Object_enter; (_$$Object_enter = $$Object.enter) === null || _$$Object_enter === void 0 ? void 0 : _$$Object_enter.call($$Object, _object_spread_props(_object_spread({}, params), { traverse: innerTraverse })); } var _visitor_nodeType; // 特定节点进入事件 var special = (_visitor_nodeType = visitor[nodeType]) !== null && _visitor_nodeType !== void 0 ? _visitor_nodeType : {}; (_special_enter = special.enter) === null || _special_enter === void 0 ? void 0 : _special_enter.call(special, _object_spread_props(_object_spread({}, params), { traverse: innerTraverse })); (_$$_exit = $$.exit) === null || _$$_exit === void 0 ? void 0 : _$$_exit.call($$, params); isObjectLike && ((_$$Object_exit = $$Object.exit) === null || _$$Object_exit === void 0 ? void 0 : _$$Object_exit.call($$Object, params)); (_special_exit = special.exit) === null || _special_exit === void 0 ? void 0 : _special_exit.call(special, params); }); }; traverse({ schema: finalSchema, path: [], state: opts.initialState, store: opts.initialStore }); return finalSchema; }