{"version":3,"file":"yunzhi-ng-mock-api.mjs","sources":["../../../../projects/yunzhi/ng-mock-api/src/lib/utils.ts","../../../../projects/yunzhi/ng-mock-api/src/lib/delay-handler.ts","../../../../projects/yunzhi/ng-mock-api/src/lib/mock-api.service.ts","../../../../projects/yunzhi/ng-mock-api/src/lib/mock-api.interceptor.ts","../../../../projects/yunzhi/ng-mock-api/src/lib/mock-api.types.ts","../../../../projects/yunzhi/ng-mock-api/src/public-api.ts","../../../../projects/yunzhi/ng-mock-api/src/yunzhi-ng-mock-api.ts"],"sourcesContent":["/**\n * 对字符串进行简单的加密\n * @param sourceString 字符串\n * @return hash值\n */\nexport function hash(sourceString: string): number {\n  let hashCode = 0;\n  let i;\n  let chr;\n  for (i = 0; i < sourceString.length; i++) {\n    chr = sourceString.charCodeAt(i);\n    // tslint:disable-next-line:no-bitwise\n    hashCode = ((hashCode << 5) - hashCode) + chr;\n    // tslint:disable-next-line:no-bitwise\n    hashCode |= 0; // Convert to 32bit integer\n  }\n  return hashCode;\n}\n\nexport const randomNumber = (range = 1000) => {\n  return Math.floor(Math.random() * range);\n};\n\n/**\n * 转换为loading字样\n * @param target 目标字符串\n * @param suffix 后缀\n * @param length 长度\n * @example\n * '请稍候' => '请稍候.'\n * '请稍候.' => '请稍候..'\n * '请稍候..' => '请稍候...'\n * '请稍候...' => '请稍候'\n */\nexport function convertToLoadingFormat(target: string, suffix = '.', length = 3): string {\n  const strings = target.split(suffix);\n  if (strings.length <= length) {\n    target += '.';\n  } else {\n    target = strings[0];\n  }\n  return target;\n}\n\n/**\n * 当值为undefined或null时返回默认值\n * @param value 传入值\n * @param defaultValue 默认值\n */\nexport function getDefaultWhenValueIsInValid<T>(value: T, defaultValue: T): T {\n  if (value === undefined || value === null || Number.isNaN(value) ) {\n    return defaultValue;\n  }\n\n  return value;\n}\n\n\n\nexport class Assert {\n  /**\n   * 断言是数组\n   * @param value 断言的值\n   * @param message 出错提示\n   */\n  static isArray(value: any, message: string): void {\n    if (!isNotNullOrUndefined(value) || !Array.isArray(value)) {\n      throw new Error(message);\n    }\n  }\n  /**\n   * 断言被定义\n   * undefined 异常\n   * null 成功\n   * other 成功\n   * @param args 多参数\n   */\n  static isDefined(...args: any[]): void {\n    const message = this.validateArgs(args);\n    args.forEach(value => {\n      if (!isDefined(value)) {\n        throw new Error(message);\n      }\n    });\n  }\n\n  /**\n   * 断言有整型（不包含NaN)\n   * @param args\n   */\n  static isInteger(...args: any[]): void {\n    const message = this.validateArgs(args);\n    args.forEach(value => {\n      if (!Number.isInteger(value)) {\n        throw new Error(message);\n      }\n    });\n  }\n\n  static isObject(...args: any[]): void {\n    const message = this.validateArgs(args);\n    args.forEach(arg => {\n      const type = typeof arg;\n      const isObject = type === 'function' || type === 'object' && !!arg;\n      if (!isObject) {\n        throw new Error(message);\n      }\n    });\n  }\n\n  /**\n   * 断言输入的值为字符串\n   * @param args 字符串1，字符串2...提示信息\n   */\n  static isString(...args: any[]): void {\n    const message = this.validateArgs(args);\n    args.forEach(value => {\n      if (typeof value !== 'string') {\n        throw new Error(message);\n      }\n    });\n  }\n\n  static isNotNullOrUndefined(...args: any[]): void {\n    const message = this.validateArgs(args);\n    args.forEach((value, index) => {\n      if (!isNotNullOrUndefined(value)) {\n        throw new Error(`${message}:${index}`);\n      }\n    });\n  }\n\n  /**\n   * 校验参考并返回参数的最后一项做为message提示消息返回\n   * @param args 多个参数\n   */\n  private static validateArgs(args: any[]): string {\n    if (args.length < 2) {\n      throw new Error('最少输入两个参数');\n    }\n\n    if (typeof (args[args.length - 1]) !== 'string') {\n      throw new Error('最后一个参数必须为字符串');\n    }\n\n    return args.pop();\n  }\n\n  static isUndefined(param: any): void {\n    if (typeof param !== 'undefined') {\n      throw new Error('变量已定义');\n    }\n  }\n\n  /**\n   * 断言为null\n   * null 成功\n   * undefined 异常\n   * other 异常\n   * @param param 输入\n   */\n  static isNull(param: any): void {\n    if (typeof param === 'undefined' || param !== null) {\n      throw new Error('变量非空');\n    }\n  }\n\n  /**\n   * 断言类型为number\n   * @param args 最少输入两个参数，前面的参数为校验值，最后一个提示信息\n   */\n  static isNumber(...args: any[]): void {\n    const message = this.validateArgs(args);\n    args.forEach(value => {\n      if (typeof value !== 'number') {\n        throw new Error(message);\n      }\n    });\n  }\n\n  static isTrue(...args: any[]): void {\n    const message = this.validateArgs(args);\n    args.forEach(value => {\n      if (value !== true) {\n        throw new Error(message);\n      }\n    });\n  }\n}\n\n/**\n * 是否不为null或undefined\n * undefined -> false\n * null -> false\n * other -> true\n * @param value 值\n */\nexport function isNotNullOrUndefined<T>(value: T | undefined | null): value is T {\n  return value as T !== undefined && value as T !== null;\n}\n\n/**\n * 为null或undefined\n * @param value 值\n */\nexport function isNullOrUndefined<T>(value: T | undefined | null): value is T {\n  return !isNotNullOrUndefined(value);\n}\n\n/**\n * 是否被定义\n * undefined -> false\n * other -> true\n * @param value 校验值\n */\nexport function isDefined<T>(value: T | undefined): value is T {\n  return value as T !== undefined;\n}\n\nexport function uniqueId(): string {\n  return '_' + Math.random().toString(36).substr(2, 9);\n}\n\n/**\n * 只包含属性而不包含方法\n * https://stackoverflow.com/questions/52692606/how-to-declare-a-type-in-typescript-that-only-includes-objects-and-not-functions\n */\nexport interface UnknownProperty {\n  [k: string]: unknown;\n}\n\n\n// 解码\nconst decodeUnicode = (str: string): string => {\n  str = '\\\\u' + str;\n  str = str.replace(/\\\\/g, '%');\n\n  str = unescape(str);\n  str = str.replace(/%/g, '\\\\');\n  return str;\n};\n\nexport class Random {\n  /**\n   * 获取随机数据\n   * @param width 位宽\n   */\n  static nextNumber(width = 32): number {\n    let range = 1;\n    while (width > 0) {\n      range = range * 2;\n      width--;\n    }\n\n    return Math.floor(Math.random() * range);\n  }\n\n  /**\n   * 获取随机字符串\n   * @param prefix 返回字符串的前缀\n   * @param length 字符串长度\n   */\n  static nextString(prefix = '', length = 4): string {\n    let result = '';\n    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n    const charactersLength = characters.length;\n    for (let i = 0; i < length; i++) {\n      result += characters.charAt(Math.floor(Math.random() * charactersLength));\n    }\n    return prefix + result;\n  }\n}\n\n/*\n* 获取取机的中文字符串\n*/\nexport const randomChineseString = (preString = '', length = 3): string => {\n  let name = '';\n  for (let i = 0; i < length; i++) {\n    let unicodeNum = '';\n    unicodeNum = randomNumberByRange(0x4e00, 0x9fa5).toString(16);\n    name += decodeUnicode(unicodeNum);\n  }\n  return preString + name;\n};\n\n/**\n * 获取指定范围内的随机数\n * @param min 最小值\n * @param max 最大值\n */\nconst randomNumberByRange = (min = 0, max = 1000): number => {\n  return Math.floor(Math.random() * (min - max) + max);\n};\n\n/**\n * 随机时间戳\n * @param day 随机生成的时间范围（天）\n * @param baseDate 生成时间范围基于某天\n * @sample\n * randomTimestamp(10, new Date(2020, 7, 12))\n * 返回：2020年7月12日前后10天的随机一天\n */\nexport const randomTimestamp = (day = 7, baseDate = new Date()) => {\n  const range = 1000 * 60 * 60 * 24 * day * 2;\n  return baseDate.getTime() + randomNumber(range) - range / 2;\n};\n\n\nexport const randomBoolean = () => {\n  return randomNumber(10) % 2 === 0;\n};\n\nexport const randomString = (prefix = '', length = 4) => {\n  let result = '';\n  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n  const charactersLength = characters.length;\n  for (let i = 0; i < length; i++) {\n    result += characters.charAt(Math.floor(Math.random() * charactersLength));\n  }\n  return prefix + result;\n};\n","import {of} from 'rxjs';\nimport {delay} from 'rxjs/operators';\nimport {HttpErrorResponse, HttpEvent, HttpResponse} from '@angular/common/http';\nimport {DelayHandlerInterface} from './delay-handler.interface';\nimport {randomNumber} from './utils';\nimport {Subscriber} from 'rxjs/internal/Subscriber';\n\n/**\n * 延时处理器.\n */\nexport class DelayHandler implements DelayHandlerInterface {\n\n  constructor() {\n  }\n\n  /**\n   * 发生错误时延时调用error方法\n   * @param message 错误信息\n   * @param subscriber 订阅者\n   */\n  error(message: any, subscriber: Subscriber<HttpErrorResponse>): void {\n    this.randomDelayCallback(() => {\n      subscriber.error(new HttpErrorResponse({\n        status: 0,\n        error: message,\n        statusText: 'network error'\n      }));\n      subscriber.complete();\n    });\n  }\n\n  /**\n   * 使用随机的延时返回数据\n   * @param data 数据\n   * @param subscriber 订阅者\n   */\n  next<T>(data: T, subscriber: Subscriber<HttpEvent<T>>): void {\n    this.randomDelayCallback(() => {\n      subscriber.next(new HttpResponse({body: data}));\n      subscriber.complete();\n    });\n  }\n\n  private randomDelayCallback(callbackFn: () => void): void {\n    of(null).pipe(delay(randomNumber() % 6 * 100)).subscribe(() => {\n      callbackFn();\n    });\n  }\n}\n","import {\n  HttpErrorResponse,\n  HttpEvent,\n  HttpHeaders,\n  HttpParams, HttpRequest, HttpResponseBase\n} from '@angular/common/http';\nimport {Observable} from 'rxjs';\nimport {Type} from '@angular/core';\nimport {MockApiInterface} from './mock-api.interface';\nimport {isNotNullOrUndefined} from './utils';\nimport {DelayHandlerInterface} from './delay-handler.interface';\nimport {RequestHandler, RequestMethodType} from './mock-api.types';\n\n/**\n * 模拟API\n */\nexport class MockApiService {\n  /**\n   * 路由信息\n   * Record<请求方法, Record<请求地址（正则表达式）, 回调函数<模拟返回的实体类型>>>\n   */\n  routers = {} as Record<RequestMethodType, Record<string, any | RequestHandler<any>>>;\n\n  public static getMockApiService(mockObservable: DelayHandlerInterface): MockApiService {\n    return new MockApiService(mockObservable);\n  }\n\n\n  /**\n   * 注册模拟接口\n   * @param classes 接口类型\n   */\n  registerMockApis(classes: Type<MockApiInterface>[]): void {\n    classes.forEach(clazz => {\n      const instance = new clazz();\n      const injectors = instance.getInjectors();\n      injectors.forEach(injector => {\n        this.registerMockApi(injector.method!, injector.url, injector.result);\n      });\n    });\n  }\n\n  /**\n   * 获取url中匹配path后的参数，未匹配成功返回null\n   * @param url URL 比如：\n   * @param path 路径\n   */\n  getHttpParams(url: string, path: string): { [key: string]: string } | null {\n    if (!path.startsWith('/')) {\n      path = '/' + path;\n    }\n\n    if (!url.startsWith('/')) {\n      url = '/' + url;\n    }\n\n    if (path.endsWith('/')) {\n      path = path.slice(0, path.length - 1);\n    }\n\n    if (url.endsWith('/')) {\n      url = url.slice(0, url.length - 1);\n    }\n\n    const urlParts = url.split('/');\n    const pathParts = path.split('/');\n\n    if (urlParts.length !== pathParts.length) {\n      return null;\n    }\n\n    const params: { [key: string]: string } = {};\n\n    for (let i = 0; i < pathParts.length; i++) {\n      const pathPart = pathParts[i];\n      if (pathPart.startsWith(':')) {\n        const paramName = pathPart.slice(1);\n        params[paramName] = urlParts[i];\n      } else if (pathPart !== urlParts[i]) {\n        return null;\n      }\n    }\n\n    return params;\n  }\n\n  /**\n   * 循环调用从而完成所有的接口注册\n   */\n  private constructor(private delayHandler: DelayHandlerInterface) {\n  }\n\n  /**\n   * 注册模拟接口\n   * @param method 请求方法\n   * @param url 请求地址\n   * @param handlerOrResult 获取数据源方法\n   */\n  registerMockApi<T>(method: RequestMethodType,\n                     url: string,\n                     handlerOrResult: T | RequestHandler<T>): void {\n    if (method === null || method === undefined) {\n      method = 'GET';\n    }\n    if (undefined === this.routers[method] || null === this.routers[method]) {\n      this.routers[method] = {} as Record<string, RequestHandler<T>>;\n    }\n\n    if (isNotNullOrUndefined(this.routers[method][url])) {\n      throw Error(`在地址${url}已存在${method}的路由记录`);\n    }\n\n    this.routers[method][url] = handlerOrResult;\n  }\n\n  request<R>(request: HttpRequest<any>): Observable<HttpEvent<R>>;\n  /**\n   * 所有的GET\\POST\\DELETE\\PUT\\PATCH方法最终均调用request方法。\n   * 如果当前request不能够满足需求，则请移步angular官方提供的HttpClient\n   *\n   * 该方法先根据method进行匹配，接着根据URL进行正则表达式的匹配。\n   * 匹配成功后将参数传入接口并获取模拟接口的返回值\n   *\n   * @param method 请求方法\n   * @param url 请求地址\n   * @param options 选项\n   */\n  request<R>(method: string, url: string, options: {\n    body?: any;\n    headers?: HttpHeaders | {\n      [header: string]: string | string[];\n    };\n    reportProgress?: boolean;\n    observe: 'body';\n    params?: HttpParams | {\n      [param: string]: string | string[];\n    };\n    responseType?: 'json';\n    withCredentials?: boolean;\n  }): Observable<R>;\n  request<R>(arg0: any, ...args: any[]): any {\n    // 初化始信息\n    let url: string;\n    let options: {\n      body?: any;\n      headers?: HttpHeaders | {\n        [header: string]: string | string[];\n      };\n      reportProgress?: boolean;\n      observe: 'body';\n      params?: HttpParams | {\n        [param: string]: string | string[];\n      };\n      responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n      withCredentials?: boolean;\n    };\n    let method: RequestMethodType;\n\n    // 根据请求参数类型,初始化请求基本信息\n    if (arg0 instanceof HttpRequest) {\n      method = arg0.method.toUpperCase() as RequestMethodType;\n      url = arg0.url;\n      options = {\n        body: arg0.body,\n        headers: arg0.headers,\n        reportProgress: arg0.reportProgress,\n        observe: 'body',\n        params: arg0.params,\n        responseType: arg0.responseType,\n        withCredentials: arg0.withCredentials\n      };\n    } else {\n      method = arg0;\n      url = args[0];\n      options = args[1];\n    }\n\n    // 根据请求数据,查找注册的API\n    let requestHandler = null as RequestHandler<R> | R;\n    const pathRecord = this.routers[method] as Record<string, RequestHandler<R> | R>;\n\n    let found = false;\n    let httpParams = undefined;\n    for (const path in pathRecord) {\n      if (pathRecord.hasOwnProperty(path) && !found) {\n        httpParams = this.getHttpParams(url, path);\n        if (!!httpParams) {\n          requestHandler = pathRecord[path];\n          found = true;\n        }\n      }\n    }\n\n    // 未找到API则报错\n    if (!found) {\n      return new Observable<HttpErrorResponse>(subscriber => {\n        const message = `yzMockApi Error: can't find mock result data: \\n` +\n          `1. pls make sure the request's url '${url}' and method '${method}' is right. \\n` +\n          `2. pls make sure your mockApi file has been added to the module HttpInterceptor.`;\n        console.error(message);\n        this.delayHandler.error(message, subscriber);\n      });\n    }\n\n    // requestHandler可能是回调,也可能是返回值.在此做类型的判断.\n    let result = null as Observable<HttpEvent<R>> | R;\n    if (typeof requestHandler === 'function') {\n      requestHandler = requestHandler as RequestHandler<R>;\n      result = requestHandler(httpParams as {[key: string]: string}, options);\n    } else {\n      requestHandler = requestHandler as R;\n      result = requestHandler;\n    }\n\n    // 按最终结果的类型分别返回\n    if (result instanceof Observable) {\n      return result;\n    } else if (result instanceof HttpResponseBase) {\n      return new Observable(ob => {\n        ob.next(result);\n        ob.complete();\n      });\n    } else {\n      // 一般数据时加入延时\n      return new Observable<HttpEvent<R>>(observable1 => {\n        this.delayHandler.next(result, observable1);\n      });\n    }\n  }\n}\n","import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {Observable} from 'rxjs';\nimport {DelayHandler} from './delay-handler';\nimport {MockApiService} from './mock-api.service';\nimport {Type} from '@angular/core';\nimport {MockApiInterface} from './mock-api.interface';\n\n/**\n * 模拟拦截器.\n */\nexport class MockApiInterceptor implements HttpInterceptor {\n  /**\n   * 此静态变量应该变到构造函数中初始化.\n   * 区别：\n   * 1. 属性初始化：其它文件import本文件时执行\n   * 2. 构造函数：实例化时执行\n   */\n  private static mockApiService: MockApiService | undefined;\n\n  /**\n   * 配置信息\n   */\n  private static config = {} as {filter?: (req: HttpRequest<any>) => boolean};\n\n  /**\n   * 启动时注册API\n   * @param mockApis 模拟API\n   * @param config 配置信息\n   */\n  static forRoot(mockApis: Type<MockApiInterface>[], config?: {filter?: (req: HttpRequest<any>) => boolean}): Type<HttpInterceptor> {\n    const mockApiService = MockApiService.getMockApiService(\n      new DelayHandler()\n    );\n\n    mockApiService.registerMockApis(mockApis);\n    MockApiInterceptor.mockApiService = mockApiService;\n    MockApiInterceptor.config = config ? config : {};\n    return MockApiInterceptor;\n  }\n\n  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n    if (MockApiInterceptor.config && typeof MockApiInterceptor.config.filter === 'function') {\n      try {\n        if (!MockApiInterceptor.config.filter(req)) {\n          return next.handle(req);\n        }\n      } catch (e) {\n        console.warn(\"在调用过滤器时发生异常\", e);\n      }\n    }\n    return MockApiInterceptor.mockApiService!.request<HttpRequest<any>>(req);\n  }\n}\n","import {Observable} from 'rxjs';\nimport {HttpEvent, HttpHeaders, HttpParams} from '@angular/common/http';\n\n/**\n * 请求的5种类型\n */\nexport  type RequestMethodType = 'GET' | 'POST' | 'DELETE' | 'PUT' | 'PATCH';\n\n/**\n * 请求处理器.\n * @param delayNext 用于发送模拟延迟的数据\n * @param urlMatches URL匹配信息\n * @param options 其它请求选项\n */\nexport type RequestHandler<T>\n  = (urlMatches: {[key: string]: string},\n     options: RequestOptions) => Observable<HttpEvent<T>> | T;\n/**\n * 请求选项\n */\nexport type RequestOptions = {\n  body?: any;\n  headers?: HttpHeaders | {\n    [header: string]: string | string[];\n  };\n  reportProgress?: boolean;\n  observe: 'body' | 'events' | 'response';\n  params?: HttpParams | {\n    [param: string]: string | string[];\n  };\n  responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n  withCredentials?: boolean;\n};\n\n/**\n * 此文中Benson对构造函数的重载回答的真好!\n * https://www.itranslater.com/qa/details/2109909368035607552\n */\nexport class ApiInjector {\n  method?: RequestMethodType;\n  /**\n   * 请求地址\n   */\n  url: string;\n  /**\n   * 对当前接口的描述\n   */\n  description?: string;\n  /**\n   * 返回结果,优先获取\n   */\n  result?: any | RequestHandler<any>;\n\n  constructor(obj: ApiInjector = {} as ApiInjector) {\n    this.method = obj.method;\n    this.url = obj.url;\n    this.description = obj.description;\n    this.result = obj.result;\n  }\n}\n","/*\n * Public API Surface of mock-api\n */\nexport * from './lib/mock-api.interface';\nexport * from './lib/mock-api.interceptor';\nexport * from './lib/mock-api.service';\nexport * from './lib/mock-api.types';\nexport * from './lib/delay-handler.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}