declare namespace MagicNode {
  import * as koa from 'koa';

  type Context = koa.Context & {
    ignoreFormat: boolean;
    request: {
      params: {
        [key: string]: any;
      };
      body: {
        [key: string]: any;
      };
    };
    files: {
      filename: string;
      fieldName: string;
      mimeType: string;
      data: any;
    }[];
  };
}

/**
 * 路由定义
 */
declare class Route {
  /**
   * 路由定义id
   */
  id: string;
  /**
   * 请求方式
   */
  method: string;
  /**
   * 路由路径
   */
  path: string;
  /**
   * 接口选项
   */
  options: { [key: string]: string };
}

/**
 * 上下文
 */
declare const ctx: MagicNode.Context;

/**
 * 继续执行
 */
declare const next: () => Promise<void> | void;

/**
 * 路由定义
 */
declare const route: Route;

/**
 * 业务状态码
 */
declare const BizErrorEnum: {
  UNKNOWN: string;
  [key: string]: string;
};

/**
 * 业务异常
 */
declare class BizError extends Error {
  constructor(message?: string, code?: string | number);
}

/**
 * 生成uuid
 */
declare const uuid: () => string;
/**
 * 判断字符串是否为空或空字符串
 */
declare const is_blank: (str: string) => boolean;
/**
 * 判断字符串是否不为空或空字符串
 */
declare const not_blank: (str: string) => boolean;
/**
 * 判断字符串是否为空字符串
 */
declare const is_empty: (str: string) => boolean;
/**
 * 判断字符串是否不为空字符串
 */
declare const not_empty: (str: string) => boolean;
/**
 * 判断字符串是否为空
 */
declare const is_null: (obj: any) => boolean;
/**
 * 判断字符串是否不为空
 */
declare const not_null: (obj: any) => boolean;
/**
 * 对空值进行判断，返回特定值
 */
declare const ifnull: (obj: any, defaultValue: any) => any;
/**
 * dayjs模块
 */
declare const dayjs: typeof import('dayjs');
/**
 * 获取当前时间
 */
declare const now: () => import('dayjs').Dayjs;

/**
 * Unix时间戳(毫秒)
 * `返回当前实例的 UNIX 时间戳，13位数字，毫秒`
 */
declare const current_timestamp_millis: () => number;

/**
 * Unix时间戳
 * `返回当前实例的 UNIX 时间戳，10位数字，秒。`
 */
declare const current_timestamp: () => number;

/**
 * 导入函数
 */
interface ImportFunction {
  /**
   * @param functionPath 函数路径
   */
  (functionPath: string): any;
}

/**
 * 导入函数
 */
declare const importFunction: ImportFunction;

/**
 * 导入模块
 */
interface ImportModule {
  /**
   * @param moduleName 模块名称
   */
  (moduleName: string): Promise<any>;
}

/**
 * 导入模块
 */
declare const importModule: ImportModule;
