{"version":3,"file":"ngx-order-pipe.mjs","sources":["../../src/app/order-pipe/ngx-order.pipe.ts","../../src/app/order-pipe/ngx-order.module.ts","../../ngx-order-pipe.ts"],"sourcesContent":["import { Pipe, PipeTransform } from \"@angular/core\";\n\n@Pipe({\n  name: \"orderBy\",\n  pure: false,\n})\nexport class OrderPipe implements PipeTransform {\n  /**\n   * Check if a value is a string\n   *\n   * @param value\n   */\n  static isString(value: any): boolean {\n    return typeof value === \"string\" || value instanceof String;\n  }\n\n  /**\n   * Sorts values ignoring the case\n   *\n   * @param a\n   * @param b\n   */\n  static caseInsensitiveSort(a: any, b: any) {\n    if (OrderPipe.isString(a) && OrderPipe.isString(b)) {\n      return a.localeCompare(b);\n    }\n    return OrderPipe.defaultCompare(a, b);\n  }\n\n  /**\n   * Default compare method\n   *\n   * @param a\n   * @param b\n   */\n  static defaultCompare(a: any, b: any) {\n    if (a && a instanceof Date) {\n      a = a.getTime();\n    }\n    if (b && b instanceof Date) {\n      b = b.getTime();\n    }\n\n    if (a === b) {\n      return 0;\n    }\n    if (a == null) {\n      return 1;\n    }\n    if (b == null) {\n      return -1;\n    }\n    return a > b ? 1 : -1;\n  }\n\n  /**\n   * Parse expression, split into items\n   * @param expression\n   * @returns {string[]}\n   */\n  static parseExpression(expression: string): string[] {\n    expression = expression.replace(/\\[(\\w+)\\]/g, \".$1\");\n    expression = expression.replace(/^\\./, \"\");\n    return expression.split(\".\");\n  }\n\n  /**\n   * Get value by expression\n   *\n   * @param object\n   * @param expression\n   * @returns {any}\n   */\n  static getValue(object: any, expression: string[]): any {\n    for (let i = 0, n = expression.length; i < n; ++i) {\n      if (!object) {\n        return;\n      }\n      const k = expression[i];\n      if (!(k in object)) {\n        return;\n      }\n      if (typeof object[k] === \"function\") {\n        object = object[k]();\n      } else {\n        object = object[k];\n      }\n    }\n\n    return object;\n  }\n\n  /**\n   * Set value by expression\n   *\n   * @param object\n   * @param value\n   * @param expression\n   */\n  static setValue(object: any, value: any, expression: string[]) {\n    let i;\n    for (i = 0; i < expression.length - 1; i++) {\n      object = object[expression[i]];\n    }\n\n    object[expression[i]] = value;\n  }\n\n  transform(\n    value: any | any[],\n    expression?: any,\n    reverse?: boolean,\n    isCaseInsensitive: boolean = false,\n    comparator?: Function\n  ): any {\n    if (!value) {\n      return value;\n    }\n\n    if (Array.isArray(expression)) {\n      return this.multiExpressionTransform(\n        value,\n        expression.slice(),\n        reverse,\n        isCaseInsensitive,\n        comparator\n      );\n    }\n\n    if (Array.isArray(value)) {\n      return this.sortArray(\n        value.slice(),\n        expression,\n        reverse,\n        isCaseInsensitive,\n        comparator\n      );\n    }\n\n    if (typeof value === \"object\") {\n      return this.transformObject(\n        Object.assign({}, value),\n        expression,\n        reverse,\n        isCaseInsensitive,\n        comparator\n      );\n    }\n\n    return value;\n  }\n\n  /**\n   * Sort array, returns sorted array\n   *\n   * @param array\n   * @param expression\n   * @param reverse\n   * @param isCaseInsensitive\n   * @param comparator\n   * @returns {Type[]}\n   */\n  private sortArray<Type>(\n    array: Type[],\n    expression?: any,\n    reverse?: boolean,\n    isCaseInsensitive?: boolean,\n    comparator?: Function\n  ): Type[] {\n    const isDeepLink = expression && expression.indexOf(\".\") !== -1;\n\n    if (isDeepLink) {\n      expression = OrderPipe.parseExpression(expression);\n    }\n\n    let compareFn: Function;\n\n    if (comparator && typeof comparator === \"function\") {\n      compareFn = comparator;\n    } else {\n      compareFn = isCaseInsensitive\n        ? OrderPipe.caseInsensitiveSort\n        : OrderPipe.defaultCompare;\n    }\n\n    const sortedArray: any[] = array.sort((a: any, b: any): number => {\n      if (!expression) {\n        return compareFn(a, b);\n      }\n\n      if (!isDeepLink) {\n        if (a && b) {\n          return compareFn(a[expression], b[expression]);\n        }\n        return compareFn(a, b);\n      }\n\n      return compareFn(\n        OrderPipe.getValue(a, expression),\n        OrderPipe.getValue(b, expression)\n      );\n    });\n\n    if (reverse) {\n      return sortedArray.reverse();\n    }\n\n    return sortedArray;\n  }\n\n  /**\n   * Transform Object\n   *\n   * @param value\n   * @param expression\n   * @param reverse\n   * @param isCaseInsensitive\n   * @param comparator\n   * @returns {any[]}\n   */\n  private transformObject(\n    value: any | any[],\n    expression?: any,\n    reverse?: boolean,\n    isCaseInsensitive?: boolean,\n    comparator?: Function\n  ): any {\n    const parsedExpression = OrderPipe.parseExpression(expression);\n    let lastPredicate: any = parsedExpression.pop();\n    let oldValue = OrderPipe.getValue(value, parsedExpression);\n\n    if (!Array.isArray(oldValue)) {\n      parsedExpression.push(lastPredicate);\n      lastPredicate = null;\n      oldValue = OrderPipe.getValue(value, parsedExpression);\n    }\n\n    if (!oldValue) {\n      return value;\n    }\n\n    OrderPipe.setValue(\n      value,\n      this.transform(oldValue, lastPredicate, reverse, isCaseInsensitive),\n      parsedExpression\n    );\n    return value;\n  }\n\n  /**\n   * Apply multiple expressions\n   *\n   * @param value\n   * @param {any[]} expressions\n   * @param {boolean} reverse\n   * @param {boolean} isCaseInsensitive\n   * @param {Function} comparator\n   * @returns {any}\n   */\n  private multiExpressionTransform(\n    value: any,\n    expressions: any[],\n    reverse?: boolean,\n    isCaseInsensitive: boolean = false,\n    comparator?: Function\n  ): any {\n    return expressions.reverse().reduce((result: any, expression: any) => {\n      return this.transform(\n        result,\n        expression,\n        reverse,\n        isCaseInsensitive,\n        comparator\n      );\n    }, value);\n  }\n}\n","/**\n * Created by vadimdez on 20/01/2017.\n */\nimport { NgModule } from '@angular/core';\nimport { OrderPipe } from './ngx-order.pipe';\n\n@NgModule({\n  declarations: [OrderPipe],\n  exports: [OrderPipe],\n  providers: [OrderPipe]\n})\nexport class OrderModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;MAMa,SAAS,CAAA;AACpB;;;;AAIG;IACH,OAAO,QAAQ,CAAC,KAAU,EAAA;QACxB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,MAAM,CAAC;KAC7D;AAED;;;;;AAKG;AACH,IAAA,OAAO,mBAAmB,CAAC,CAAM,EAAE,CAAM,EAAA;AACvC,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;AAClD,YAAA,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SAC3B;QACD,OAAO,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACvC;AAED;;;;;AAKG;AACH,IAAA,OAAO,cAAc,CAAC,CAAM,EAAE,CAAM,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE;AAC1B,YAAA,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;SACjB;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE;AAC1B,YAAA,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;SACjB;AAED,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACX,YAAA,OAAO,CAAC,CAAC;SACV;AACD,QAAA,IAAI,CAAC,IAAI,IAAI,EAAE;AACb,YAAA,OAAO,CAAC,CAAC;SACV;AACD,QAAA,IAAI,CAAC,IAAI,IAAI,EAAE;YACb,OAAO,CAAC,CAAC,CAAC;SACX;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;KACvB;AAED;;;;AAIG;IACH,OAAO,eAAe,CAAC,UAAkB,EAAA;QACvC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACrD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC3C,QAAA,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KAC9B;AAED;;;;;;AAMG;AACH,IAAA,OAAO,QAAQ,CAAC,MAAW,EAAE,UAAoB,EAAA;AAC/C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;YACjD,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO;aACR;AACD,YAAA,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AACxB,YAAA,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE;gBAClB,OAAO;aACR;YACD,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE;AACnC,gBAAA,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;aACtB;iBAAM;AACL,gBAAA,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;aACpB;SACF;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;;;;;AAMG;AACH,IAAA,OAAO,QAAQ,CAAC,MAAW,EAAE,KAAU,EAAE,UAAoB,EAAA;AAC3D,QAAA,IAAI,CAAC,CAAC;AACN,QAAA,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;SAChC;QAED,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;KAC/B;IAED,SAAS,CACP,KAAkB,EAClB,UAAgB,EAChB,OAAiB,EACjB,iBAAA,GAA6B,KAAK,EAClC,UAAqB,EAAA;QAErB,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AAC7B,YAAA,OAAO,IAAI,CAAC,wBAAwB,CAClC,KAAK,EACL,UAAU,CAAC,KAAK,EAAE,EAClB,OAAO,EACP,iBAAiB,EACjB,UAAU,CACX,CAAC;SACH;AAED,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO,IAAI,CAAC,SAAS,CACnB,KAAK,CAAC,KAAK,EAAE,EACb,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,UAAU,CACX,CAAC;SACH;AAED,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,IAAI,CAAC,eAAe,CACzB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EACxB,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,UAAU,CACX,CAAC;SACH;AAED,QAAA,OAAO,KAAK,CAAC;KACd;AAED;;;;;;;;;AASG;IACK,SAAS,CACf,KAAa,EACb,UAAgB,EAChB,OAAiB,EACjB,iBAA2B,EAC3B,UAAqB,EAAA;AAErB,QAAA,MAAM,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhE,IAAI,UAAU,EAAE;AACd,YAAA,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;SACpD;AAED,QAAA,IAAI,SAAmB,CAAC;AAExB,QAAA,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE;YAClD,SAAS,GAAG,UAAU,CAAC;SACxB;aAAM;AACL,YAAA,SAAS,GAAG,iBAAiB;kBACzB,SAAS,CAAC,mBAAmB;AAC/B,kBAAE,SAAS,CAAC,cAAc,CAAC;SAC9B;QAED,MAAM,WAAW,GAAU,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAY;YAC/D,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACxB;YAED,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,IAAI,CAAC,IAAI,CAAC,EAAE;AACV,oBAAA,OAAO,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;iBAChD;AACD,gBAAA,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACxB;YAED,OAAO,SAAS,CACd,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,EACjC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAClC,CAAC;AACJ,SAAC,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC;SAC9B;AAED,QAAA,OAAO,WAAW,CAAC;KACpB;AAED;;;;;;;;;AASG;IACK,eAAe,CACrB,KAAkB,EAClB,UAAgB,EAChB,OAAiB,EACjB,iBAA2B,EAC3B,UAAqB,EAAA;QAErB,MAAM,gBAAgB,GAAG,SAAS,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AAC/D,QAAA,IAAI,aAAa,GAAQ,gBAAgB,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAE3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC5B,YAAA,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrC,aAAa,GAAG,IAAI,CAAC;YACrB,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;SACxD;QAED,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,KAAK,CAAC;SACd;QAED,SAAS,CAAC,QAAQ,CAChB,KAAK,EACL,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,CAAC,EACnE,gBAAgB,CACjB,CAAC;AACF,QAAA,OAAO,KAAK,CAAC;KACd;AAED;;;;;;;;;AASG;IACK,wBAAwB,CAC9B,KAAU,EACV,WAAkB,EAClB,OAAiB,EACjB,iBAAA,GAA6B,KAAK,EAClC,UAAqB,EAAA;AAErB,QAAA,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,MAAW,EAAE,UAAe,KAAI;AACnE,YAAA,OAAO,IAAI,CAAC,SAAS,CACnB,MAAM,EACN,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,UAAU,CACX,CAAC;SACH,EAAE,KAAK,CAAC,CAAC;KACX;uGA7QU,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;qGAAT,SAAS,EAAA,IAAA,EAAA,SAAA,EAAA,IAAA,EAAA,KAAA,EAAA,CAAA,CAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBAJrB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,IAAI,EAAE,KAAK;AACZ,iBAAA,CAAA;;;ACLD;;AAEG;MASU,WAAW,CAAA;uGAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;wGAAX,WAAW,EAAA,YAAA,EAAA,CAJP,SAAS,CAAA,EAAA,OAAA,EAAA,CACd,SAAS,CAAA,EAAA,CAAA,CAAA;wGAGR,WAAW,EAAA,SAAA,EAFX,CAAC,SAAS,CAAC,EAAA,CAAA,CAAA;;2FAEX,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAC,SAAS,CAAC;oBACzB,OAAO,EAAE,CAAC,SAAS,CAAC;oBACpB,SAAS,EAAE,CAAC,SAAS,CAAC;AACvB,iBAAA,CAAA;;;ACVD;;AAEG;;;;"}