UNPKG

dbl-components

Version:

Framework based on bootstrap 5

51 lines 11.4 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=exports.HashRouterSchema=exports.BrowserRouterSchema=void 0;var _react=_interopRequireWildcard(require("react"));var _propTypes=_interopRequireDefault(require("prop-types"));var _reactRouterDom=require("react-router-dom");var _dblUtils=require("dbl-utils");var _controllers=_interopRequireDefault(require("../controllers"));var _withRouteWrapper=_interopRequireDefault(require("./with-route-wrapper"));function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,n=new WeakMap;return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,"default":e};if(null===e||"object"!=_typeof(e)&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f)}for(var _t in e)"default"!==_t&&{}.hasOwnProperty.call(e,_t)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t))&&(i.get||i.set)?o(f,_t,i):f[_t]=e[_t]);return f})(e,t)}function _extends(){return _extends=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var r in t)({}).hasOwnProperty.call(t,r)&&(n[r]=t[r])}return n},_extends.apply(null,arguments)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}var routePropTypes={path:_propTypes["default"].oneOfType([_propTypes["default"].string,_propTypes["default"].arrayOf(_propTypes["default"].string)]).isRequired,content:_propTypes["default"].any.isRequired,name:_propTypes["default"].string,component:_propTypes["default"].string,exact:_propTypes["default"].bool,strict:_propTypes["default"].bool,location:_propTypes["default"].object,sensitive:_propTypes["default"].bool,routes:_propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].shape(void 0)),_propTypes["default"].shape(void 0)])};var schemaPropTypes={test:_propTypes["default"].bool,theme:_propTypes["default"].string,routes:routePropTypes.routes,defaultController:_propTypes["default"].func};var schemaDefaultProps={routes:[],defaultController:_controllers["default"].Controller};/** * Controller that renders a React Router `<Routes>` tree from a schema. * * @example * ```jsx * <BrowserRouterSchema routes={[{ path: '/', component: 'Controller' }]} /> * ``` */var SchemaController=exports["default"]=/*#__PURE__*/function(_React$Component){function SchemaController(props){var _this;_classCallCheck(this,SchemaController);_this=_callSuper(this,SchemaController,[props]);_defineProperty(_this,"routeNodes",[]);_defineProperty(_this,"state",{});/** * Recursively processes a route definition and returns a React Router `<Route>` * element. Intended to be used as a callback, for example * `routes.map(this.views)`. * * @param {Object} route - Route definition. * @param {number} [i] - Index of the current route. * @returns {JSX.Element} The generated `<Route>` element. */_defineProperty(_this,"views",function(route,i){var Controller=_controllers["default"][route.component]||_this.props.defaultController||_controllers["default"].Controller;route.test=route.test||_this.props.test;var WrappedController=(0,_withRouteWrapper["default"])(Controller,route);var subroutes=false;if(Array.isArray(route.routes))subroutes=[];else if(_typeof(route.routes)==="object"){subroutes=[];route.routes=Object.keys(route.routes).map(function(name){return _objectSpread({name:name},route.routes[name])})}if(subroutes){var mapRoutes=function mapRoutes(subRoute,i){subRoute=JSON.parse(JSON.stringify(subRoute));return _this.views(subRoute,i)};subroutes=route.routes.map(mapRoutes)}var routeProps={path:route.path,index:route.index,action:route.action,caseSensitive:route.caseSensitive,Component:route.Component,ErrorBoundary:route.ErrorBoundary,errorElement:route.errorElement,handle:route.handle,hasErrorBoundary:route.hasErrorBoundary,HydrateFallback:route.HydrateFallback,hydrateFallbackElement:route.hydrateFallbackElement,id:route.id,lazy:route.lazy,loader:route.loader,shouldRevalidate:route.shouldRevalidate,element:/*#__PURE__*/_react["default"].createElement(WrappedController,route,subroutes.length>0?/*#__PURE__*/_react["default"].createElement(_reactRouterDom.Outlet,null):null)};var key=i||typeof i==="number"?i+"-"+route.name:route.name;return/*#__PURE__*/_react["default"].createElement(_reactRouterDom.Route,_extends({key:key},routeProps),subroutes.length>0&&subroutes)});_this.routesHash=(0,_dblUtils.hash)(JSON.stringify(props.routes));_this.buildRoutes();return _this}/** * Builds the route elements from the provided schema and updates the hash used * to detect changes between renders. * * @private */_inherits(SchemaController,_React$Component);return _createClass(SchemaController,[{key:"buildRoutes",value:function buildRoutes(){var _this2=this;// Create a clone of the incoming routes var schemaStr=JSON.stringify(this.props.routes);var routesSchema=JSON.parse(schemaStr);var routes;if(Array.isArray(routesSchema))routes=routesSchema.map(this.views);else if(_typeof(routesSchema)==="object"&&routesSchema.name)routes=this.views(routesSchema);else if(_typeof(routesSchema)==="object")routes=Object.keys(routesSchema).map(function(name,i){return _this2.views(_objectSpread({name:name},routesSchema[name]),i)});// Direct assignment this.routeNodes=routes;this.routesHash=(0,_dblUtils.hash)(JSON.stringify(this.props.routes))}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){// Check if the schema has changed var newHash=(0,_dblUtils.hash)(JSON.stringify(this.props.routes));if(this.routesHash!==newHash){this.buildRoutes();this.forceUpdate()}}},{key:"render",value:function render(){var theme=this.props.theme;return/*#__PURE__*/_react["default"].createElement(_react["default"].Fragment,null,!!theme&&/*#__PURE__*/_react["default"].createElement("link",{rel:"stylesheet",type:"text/css",href:theme}),/*#__PURE__*/_react["default"].createElement(_reactRouterDom.Routes,null,this.routeNodes))}}])}(_react["default"].Component);/** * Internal wrapper that dispatches location changes and renders the schema * controller. * * @param {Object} props - Props passed to {@link SchemaController}. * @returns {JSX.Element} The rendered controller. */_defineProperty(SchemaController,"jsClass","SchemaController");_defineProperty(SchemaController,"propTypes",schemaPropTypes);_defineProperty(SchemaController,"defaultProps",schemaDefaultProps);var RouterSchema=function RouterSchema(props){var location=(0,_reactRouterDom.useLocation)();(0,_react.useEffect)(function(){_dblUtils.eventHandler.dispatch("location",location)},[location.pathname]);return/*#__PURE__*/_react["default"].createElement(SchemaController,props)};/** * Renders the schema inside a {@link BrowserRouter}. * * @param {Object} incomingProps - Props containing the route schema. * @returns {JSX.Element} The browser router with the schema. * * @example * ```jsx * <BrowserRouterSchema routes={[{ path: '/', component: 'Controller' }]} /> * ``` */var BrowserRouterSchema=exports.BrowserRouterSchema=function BrowserRouterSchema(incomingProps){var props=_objectSpread(_objectSpread({},schemaDefaultProps),incomingProps);return/*#__PURE__*/_react["default"].createElement(_reactRouterDom.BrowserRouter,null,/*#__PURE__*/_react["default"].createElement(RouterSchema,props))};BrowserRouterSchema.propTypes=schemaPropTypes;/** * Renders the schema inside a {@link HashRouter}. * * @param {Object} incomingProps - Props containing the route schema. * @returns {JSX.Element} The hash router with the schema. * * @example * ```jsx * <HashRouterSchema routes={[{ path: '/', component: 'Controller' }]} /> * ``` */var HashRouterSchema=exports.HashRouterSchema=function HashRouterSchema(incomingProps){var props=_objectSpread(_objectSpread({},schemaDefaultProps),incomingProps);return/*#__PURE__*/_react["default"].createElement(_reactRouterDom.HashRouter,null,/*#__PURE__*/_react["default"].createElement(RouterSchema,props))};HashRouterSchema.propTypes=schemaPropTypes; //# sourceMappingURL=react-router-schema.js.map