text: import React from 'react';
  import Exception from '../exception';
  import CheckPermissions from './checkPermissions';
  /**
   * 默认不能访问任何页面
   * default is "NULL"
   */
  const Exception403 = () => <Exception type="403" />;
  
  // Determine whether the incoming component has been instantiated
  // AuthorizedRoute is already instantiated
  // Authorized  render is already instantiated, children is no instantiated
  // Secured is not instantiated
  const checkIsInstantiation = target => {
    if (!React.isValidElement(target)) {
      return target;
    }
    return () => target;
  };
  
  /**
   * 用于判断是否拥有权限访问此view权限
   * authority 支持传入 string, function:()=>boolean|Promise
   * e.g. 'user' 只有user用户能访问
   * e.g. 'user,admin' user和 admin 都能访问
   * e.g. ()=>boolean 返回true能访问,返回false不能访问
   * e.g. Promise  then 能访问   catch不能访问
   * e.g. authority support incoming string, function: () => boolean | Promise
   * e.g. 'user' only user user can access
   * e.g. 'user, admin' user and admin can access
   * e.g. () => boolean true to be able to visit, return false can not be accessed
   * e.g. Promise then can not access the visit to catch
   * @param {string | function | Promise} authority
   * @param {ReactNode} error 非必需参数
   */
  const authorize = (authority, error) => {
    /**
     * conversion into a class
     * 防止传入字符串时找不到staticContext造成报错
     * String parameters can cause staticContext not found error
     */
    let classError = false;
    if (error) {
      classError = () => error;
    }
    if (!authority) {
      throw new Error('authority is required');
    }
    return function decideAuthority(target) {
      const component = CheckPermissions(authority, target, classError || Exception403);
      return checkIsInstantiation(component);
    };
  };
  
  export default authorize;
  