{"version":3,"file":"ctrl-ngx-csv.mjs","sources":["../../src/lib/util.ts","../../src/lib/csv.directive.ts","../../src/lib/csv.module.ts","../../src/lib/ctrl-ngx-csv.ts"],"sourcesContent":["/* eslint-disable prefer-arrow/prefer-arrow-functions */\nexport interface HeaderObj {\n  label: string;\n  key: string;\n}\n\nexport const isJsons = (array: any[]) =>\n  Array.isArray(array) &&\n  array.every(row => typeof row === 'object' && !(row instanceof Array));\n\nexport const isArrays = (array: any[]) =>\n  Array.isArray(array) && array.every(row => Array.isArray(row));\n\nexport function jsonsHeaders(array: object[]) {\n  return Array.from(\n    new Set(\n      array.map(item => Object.keys(item)).reduce((a, b) => [...a, ...b], []),\n    ),\n  );\n}\n\nexport function jsons2arrays(\n  jsons: { [key: string]: string }[],\n  headers?: string[] | HeaderObj[],\n) {\n  headers = headers || jsonsHeaders(jsons);\n\n  // allow headers to have custom labels, defaulting to having the header data key be the label\n  let headerLabels: string[] = headers as string[];\n  let headerKeys: string[] = headers as string[];\n  if (isJsons(headers)) {\n    headerLabels = (headers as HeaderObj[]).map(header => header.label);\n    headerKeys = (headers as HeaderObj[]).map(header => header.key);\n  }\n\n  const data = jsons.map(object =>\n    headerKeys.map(header => (header in object ? object[header] : '')),\n  );\n  return [headerLabels, ...data];\n}\n\nexport const elementOrEmpty = (element: any) =>\n  element || element === 0 ? element : '';\n\nexport function joiner(data: any, delimiter = ',') {\n  return data\n    .map((row: any, index: number) =>\n      row.map((element: any) => '\"' + elementOrEmpty(element) + '\"').join(delimiter),\n    )\n    .join(`\\n`);\n}\n\nexport function arrays2csv(\n  data: string[][],\n  headers?: string[] | HeaderObj[],\n  delimiter?: string,\n) {\n  return joiner(headers ? [headers, ...data] : data, delimiter);\n}\n\nexport function jsons2csv(\n  data: { [key: string]: string }[],\n  headers?: string[] | HeaderObj[],\n  delimiter?: string,\n) {\n  return joiner(jsons2arrays(data, headers), delimiter);\n}\n\nexport function string2csv(\n  data: string,\n  headers?: string[],\n  delimiter?: string,\n) {\n  return headers ? `${headers.join(delimiter)}\\n${data}` : data;\n}\n\nexport function toCSV(\n  data: string | string[][] | { [key: string]: string }[] | any[],\n  headers?: string[] | HeaderObj[],\n  delimiter?: string,\n) {\n  if (isJsons(data as any)) {\n    return jsons2csv(data as { [key: string]: string }[], headers, delimiter);\n  }\n  if (isArrays(data as any)) {\n    return arrays2csv(data as string[][], headers, delimiter);\n  }\n  if (typeof data === 'string') {\n    return string2csv(data, headers as string[], delimiter);\n  }\n  throw new TypeError(\n    `Data should be a \"String\", \"Array of arrays\" OR \"Array of objects\" `,\n  );\n}\n\nexport function blob(\n  data: string | string[][] | { [key: string]: string }[] | any[],\n  uFEFF = true,\n  headers?: string[] | HeaderObj[],\n  delimiter?: string,\n) {\n  const csv = toCSV(data, headers, delimiter);\n  return new Blob([uFEFF ? '\\uFEFF' : '', csv], { type: 'text/csv' });\n}\n\nexport function buildURI(\n  data: string | string[][] | { [key: string]: string }[] | any[],\n  uFEFF = true,\n  headers?: string[] | HeaderObj[],\n  delimiter?: string,\n) {\n  return URL.createObjectURL(blob(data, uFEFF, headers, delimiter));\n}\n","import { Directive, HostBinding, Input, OnChanges } from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\nimport { buildURI, HeaderObj } from './util';\n\n@Directive({ selector: '[csvLink]' })\nexport class CsvDirective implements OnChanges {\n  /** the body of the csv */\n  @Input() data: string | string[][] | { [key: string]: string }[] | any[] = [];\n  /** Set the first line of the csv */\n  @Input() headers?: string[] | HeaderObj[];\n  /** Set the seperator between values */\n  @Input() delimiter = ',';\n  /** Set the filename of the csv. Default is `data.csv` */\n  @Input()\n  set filename(a: string) {\n    this.download = a;\n  }\n  /** adds a Byte order mark to setup the csv as UTF-8  */\n  @Input() uFEFF = true;\n  @HostBinding() href?: SafeResourceUrl;\n  /** filename */\n  @HostBinding() download = 'data.csv';\n  @Input() @HostBinding() target = '_blank';\n\n  constructor(private sanitizer: DomSanitizer) {}\n\n  ngOnChanges() {\n    this.href = this.sanitizer.bypassSecurityTrustResourceUrl(\n      buildURI(this.data, this.uFEFF, this.headers, this.delimiter),\n    );\n  }\n}\n","import { NgModule } from '@angular/core';\n\nimport { CsvDirective } from './csv.directive';\n\n@NgModule({\n  declarations: [CsvDirective],\n  exports: [CsvDirective],\n})\nexport class CsvModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;AAMO,MAAM,OAAO,GAAG,CAAC,KAAY,KAClC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACpB,IAAA,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,EAAE,GAAG,YAAY,KAAK,CAAC,EAAE;AAElE,MAAM,QAAQ,GAAG,CAAC,KAAY,KACnC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAE3D,SAAU,YAAY,CAAC,KAAe,EAAA;IAC1C,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,GAAG,CACL,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CACxE,CACF,CAAC;AACJ,CAAC;AAEe,SAAA,YAAY,CAC1B,KAAkC,EAClC,OAAgC,EAAA;AAEhC,IAAA,OAAO,GAAG,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;;IAGzC,IAAI,YAAY,GAAa,OAAmB,CAAC;IACjD,IAAI,UAAU,GAAa,OAAmB,CAAC;AAC/C,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;AACpB,QAAA,YAAY,GAAI,OAAuB,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,QAAA,UAAU,GAAI,OAAuB,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;AACjE,KAAA;AAED,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,IAC3B,UAAU,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CACnE,CAAC;AACF,IAAA,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;AACjC,CAAC;MAEY,cAAc,GAAG,CAAC,OAAY,KACzC,OAAO,IAAI,OAAO,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG;SAE1B,MAAM,CAAC,IAAS,EAAE,SAAS,GAAG,GAAG,EAAA;AAC/C,IAAA,OAAO,IAAI;AACR,SAAA,GAAG,CAAC,CAAC,GAAQ,EAAE,KAAa,KAC3B,GAAG,CAAC,GAAG,CAAC,CAAC,OAAY,KAAK,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAC/E;SACA,IAAI,CAAC,CAAI,EAAA,CAAA,CAAC,CAAC;AAChB,CAAC;SAEe,UAAU,CACxB,IAAgB,EAChB,OAAgC,EAChC,SAAkB,EAAA;AAElB,IAAA,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC;AAChE,CAAC;SAEe,SAAS,CACvB,IAAiC,EACjC,OAAgC,EAChC,SAAkB,EAAA;IAElB,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;SAEe,UAAU,CACxB,IAAY,EACZ,OAAkB,EAClB,SAAkB,EAAA;AAElB,IAAA,OAAO,OAAO,GAAG,CAAG,EAAA,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA,CAAE,GAAG,IAAI,CAAC;AAChE,CAAC;SAEe,KAAK,CACnB,IAA+D,EAC/D,OAAgC,EAChC,SAAkB,EAAA;AAElB,IAAA,IAAI,OAAO,CAAC,IAAW,CAAC,EAAE;QACxB,OAAO,SAAS,CAAC,IAAmC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAC3E,KAAA;AACD,IAAA,IAAI,QAAQ,CAAC,IAAW,CAAC,EAAE;QACzB,OAAO,UAAU,CAAC,IAAkB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAC3D,KAAA;AACD,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,OAAO,UAAU,CAAC,IAAI,EAAE,OAAmB,EAAE,SAAS,CAAC,CAAC;AACzD,KAAA;AACD,IAAA,MAAM,IAAI,SAAS,CACjB,CAAA,mEAAA,CAAqE,CACtE,CAAC;AACJ,CAAC;AAEK,SAAU,IAAI,CAClB,IAA+D,EAC/D,KAAK,GAAG,IAAI,EACZ,OAAgC,EAChC,SAAkB,EAAA;IAElB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AACtE,CAAC;AAEK,SAAU,QAAQ,CACtB,IAA+D,EAC/D,KAAK,GAAG,IAAI,EACZ,OAAgC,EAChC,SAAkB,EAAA;AAElB,IAAA,OAAO,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AACpE;;MC1Ga,YAAY,CAAA;AAmBvB,IAAA,WAAA,CAAoB,SAAuB,EAAA;AAAvB,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAc;;AAjBlC,QAAA,IAAI,CAAA,IAAA,GAA8D,EAAE,CAAC;;AAIrE,QAAA,IAAS,CAAA,SAAA,GAAG,GAAG,CAAC;;AAOhB,QAAA,IAAK,CAAA,KAAA,GAAG,IAAI,CAAC;;AAGP,QAAA,IAAQ,CAAA,QAAA,GAAG,UAAU,CAAC;AACb,QAAA,IAAM,CAAA,MAAA,GAAG,QAAQ,CAAC;KAEK;;IAX/C,IACI,QAAQ,CAAC,CAAS,EAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;KACnB;IAUD,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,8BAA8B,CACvD,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAC9D,CAAC;KACH;;yGAzBU,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;6FAAZ,YAAY,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,WAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,SAAS;mBAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;mGAGzB,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBAEG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBAEG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBAGF,QAAQ,EAAA,CAAA;sBADX,KAAK;gBAKG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBACS,IAAI,EAAA,CAAA;sBAAlB,WAAW;gBAEG,QAAQ,EAAA,CAAA;sBAAtB,WAAW;gBACY,MAAM,EAAA,CAAA;sBAA7B,KAAK;;sBAAI,WAAW;;;MCfV,SAAS,CAAA;;sGAAT,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;uGAAT,SAAS,EAAA,YAAA,EAAA,CAHL,YAAY,CAAA,EAAA,OAAA,EAAA,CACjB,YAAY,CAAA,EAAA,CAAA,CAAA;uGAEX,SAAS,EAAA,CAAA,CAAA;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBAJrB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAC,YAAY,CAAC;oBAC5B,OAAO,EAAE,CAAC,YAAY,CAAC;iBACxB,CAAA;;;ACPD;;AAEG;;;;"}