@ctrl/ngx-csv 3.0.1 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,22 +1,12 @@
1
- <div align="center">
2
- <h1>ngx-csv</h1>
3
- <br>
4
- <a href="https://www.npmjs.com/package/@ctrl/ngx-csv">
5
- <img src="https://badge.fury.io/js/%40ctrl%2Fngx-csv.svg" alt="npm">
6
- </a>
7
- <a href="https://travis-ci.org/TypeCtrl/ngx-csv">
8
- <img src="https://travis-ci.org/TypeCtrl/ngx-csv.svg?branch=master" alt="travis">
9
- </a>
10
- <a href="https://codecov.io/github/typectrl/ngx-csv">
11
- <img src="https://img.shields.io/codecov/c/github/typectrl/ngx-csv.svg" alt="codecov">
12
- </a>
13
- <br>
14
- <br>
15
- </div>
1
+ # @ctrl/ngx-csv
2
+
3
+ [![npm](https://badgen.net/npm/v/@ctrl/ngx-csv)](https://www.npmjs.com/package/@ctrl/ngx-csv)
4
+ [![CircleCI](https://badgen.net/circleci/github/scttcper/ngx-csv)](https://circleci.com/gh/scttcper/ngx-csv)
5
+ [![coverage](https://badgen.net/codecov/c/github/scttcper/ngx-csv)](https://codecov.io/gh/scttcper/ngx-csv)
16
6
 
17
7
  > Easily generate a CSV download in the browser with Angular
18
8
 
19
- **Demo**: https://ngx-csv.netlify.com/
9
+ **Demo**: https://ngx-csv.vercel.app
20
10
 
21
11
  ### Install
22
12
 
@@ -28,10 +18,13 @@ npm install @ctrl/ngx-csv
28
18
 
29
19
  Latest version available for each version of Angular
30
20
 
31
- | ngx-trend | Angular |
32
- | --------- | ------- |
33
- | 2.1.1 | 8.x |
34
- | current | >= 9.x |
21
+ | ngx-csv | Angular |
22
+ | ------- | ---------- |
23
+ | 2.1.1 | 8.x |
24
+ | 3.0.1 | 9.x |
25
+ | 4.0.0 | 10.x |
26
+ | 5.0.0 | 12.x, 13.x |
27
+ | current | >= 14.x |
35
28
 
36
29
  ### Import
37
30
 
@@ -49,12 +42,12 @@ Add the csvLink directive to your `<a>` tag
49
42
 
50
43
  ### Input
51
44
 
52
- * **data**: The body of the csv
53
- * **headers**: Set the first line of the csv
54
- * **delimiter**: Set the seperator between values. Default `','`
55
- * **filename**: Set the filename of the csv. Default `data.csv`
56
- * **uFEFF**: Adds a Byte order mark to setup the csv as UTF-8. Default `true`
57
- * **target**: Element target. Default `\_blank
45
+ - **data**: The body of the csv
46
+ - **headers**: Set the first line of the csv
47
+ - **delimiter**: Set the seperator between values. Default `','`
48
+ - **filename**: Set the filename of the csv. Default `data.csv`
49
+ - **uFEFF**: Adds a Byte order mark to setup the csv as UTF-8. Default `true`
50
+ - **target**: Element target. Default `\_blank
58
51
 
59
52
  ### Accepted Data Formats
60
53
 
@@ -115,4 +108,4 @@ const data = [
115
108
 
116
109
  ### See Also
117
110
 
118
- * [react-csv](https://github.com/abdennour/react-csv)
111
+ - [react-csv](https://github.com/abdennour/react-csv)
@@ -1,6 +1,7 @@
1
1
  import { OnChanges } from '@angular/core';
2
2
  import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
3
3
  import { HeaderObj } from './util';
4
+ import * as i0 from "@angular/core";
4
5
  export declare class CsvDirective implements OnChanges {
5
6
  private sanitizer;
6
7
  /** the body of the csv */
@@ -20,7 +21,7 @@ export declare class CsvDirective implements OnChanges {
20
21
  download: string;
21
22
  target: string;
22
23
  constructor(sanitizer: DomSanitizer);
23
- onClick(): void;
24
- isIEBrowser(): boolean;
25
24
  ngOnChanges(): void;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<CsvDirective, never>;
26
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CsvDirective, "[csvLink]", never, { "data": "data"; "headers": "headers"; "delimiter": "delimiter"; "filename": "filename"; "uFEFF": "uFEFF"; "target": "target"; }, {}, never, never, false>;
26
27
  }
package/csv.module.d.ts CHANGED
@@ -1,2 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./csv.directive";
1
3
  export declare class CsvModule {
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<CsvModule, never>;
5
+ static ɵmod: i0.ɵɵNgModuleDeclaration<CsvModule, [typeof i1.CsvDirective], never, [typeof i1.CsvDirective]>;
6
+ static ɵinj: i0.ɵɵInjectorDeclaration<CsvModule>;
2
7
  }
@@ -0,0 +1,50 @@
1
+ import { Directive, HostBinding, Input } from '@angular/core';
2
+ import { buildURI } from './util';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/platform-browser";
5
+ export class CsvDirective {
6
+ constructor(sanitizer) {
7
+ this.sanitizer = sanitizer;
8
+ /** the body of the csv */
9
+ this.data = [];
10
+ /** Set the seperator between values */
11
+ this.delimiter = ',';
12
+ /** adds a Byte order mark to setup the csv as UTF-8 */
13
+ this.uFEFF = true;
14
+ /** filename */
15
+ this.download = 'data.csv';
16
+ this.target = '_blank';
17
+ }
18
+ /** Set the filename of the csv. Default is `data.csv` */
19
+ set filename(a) {
20
+ this.download = a;
21
+ }
22
+ ngOnChanges() {
23
+ this.href = this.sanitizer.bypassSecurityTrustResourceUrl(buildURI(this.data, this.uFEFF, this.headers, this.delimiter));
24
+ }
25
+ }
26
+ CsvDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvDirective, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Directive });
27
+ CsvDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.2", type: CsvDirective, selector: "[csvLink]", inputs: { data: "data", headers: "headers", delimiter: "delimiter", filename: "filename", uFEFF: "uFEFF", target: "target" }, host: { properties: { "href": "this.href", "download": "this.download", "target": "this.target" } }, usesOnChanges: true, ngImport: i0 });
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvDirective, decorators: [{
29
+ type: Directive,
30
+ args: [{ selector: '[csvLink]' }]
31
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { data: [{
32
+ type: Input
33
+ }], headers: [{
34
+ type: Input
35
+ }], delimiter: [{
36
+ type: Input
37
+ }], filename: [{
38
+ type: Input
39
+ }], uFEFF: [{
40
+ type: Input
41
+ }], href: [{
42
+ type: HostBinding
43
+ }], download: [{
44
+ type: HostBinding
45
+ }], target: [{
46
+ type: Input
47
+ }, {
48
+ type: HostBinding
49
+ }] } });
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY3N2LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFHekUsT0FBTyxFQUFFLFFBQVEsRUFBYSxNQUFNLFFBQVEsQ0FBQzs7O0FBRzdDLE1BQU0sT0FBTyxZQUFZO0lBbUJ2QixZQUFvQixTQUF1QjtRQUF2QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBbEIzQywwQkFBMEI7UUFDakIsU0FBSSxHQUE4RCxFQUFFLENBQUM7UUFHOUUsdUNBQXVDO1FBQzlCLGNBQVMsR0FBRyxHQUFHLENBQUM7UUFNekIsd0RBQXdEO1FBQy9DLFVBQUssR0FBRyxJQUFJLENBQUM7UUFFdEIsZUFBZTtRQUNBLGFBQVEsR0FBRyxVQUFVLENBQUM7UUFDYixXQUFNLEdBQUcsUUFBUSxDQUFDO0lBRUksQ0FBQztJQVovQyx5REFBeUQ7SUFDekQsSUFDSSxRQUFRLENBQUMsQ0FBUztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBVUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FDdkQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDOUQsQ0FBQztJQUNKLENBQUM7O3lHQXpCVSxZQUFZOzZGQUFaLFlBQVk7MkZBQVosWUFBWTtrQkFEeEIsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7bUdBR3pCLElBQUk7c0JBQVosS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFHRixRQUFRO3NCQURYLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUNTLElBQUk7c0JBQWxCLFdBQVc7Z0JBRUcsUUFBUTtzQkFBdEIsV0FBVztnQkFDWSxNQUFNO3NCQUE3QixLQUFLOztzQkFBSSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0QmluZGluZywgSW5wdXQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuaW1wb3J0IHsgYnVpbGRVUkksIEhlYWRlck9iaiB9IGZyb20gJy4vdXRpbCc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjc3ZMaW5rXScgfSlcbmV4cG9ydCBjbGFzcyBDc3ZEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKiogdGhlIGJvZHkgb2YgdGhlIGNzdiAqL1xuICBASW5wdXQoKSBkYXRhOiBzdHJpbmcgfCBzdHJpbmdbXVtdIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdIHwgYW55W10gPSBbXTtcbiAgLyoqIFNldCB0aGUgZmlyc3QgbGluZSBvZiB0aGUgY3N2ICovXG4gIEBJbnB1dCgpIGhlYWRlcnM/OiBzdHJpbmdbXSB8IEhlYWRlck9ialtdO1xuICAvKiogU2V0IHRoZSBzZXBlcmF0b3IgYmV0d2VlbiB2YWx1ZXMgKi9cbiAgQElucHV0KCkgZGVsaW1pdGVyID0gJywnO1xuICAvKiogU2V0IHRoZSBmaWxlbmFtZSBvZiB0aGUgY3N2LiBEZWZhdWx0IGlzIGBkYXRhLmNzdmAgKi9cbiAgQElucHV0KClcbiAgc2V0IGZpbGVuYW1lKGE6IHN0cmluZykge1xuICAgIHRoaXMuZG93bmxvYWQgPSBhO1xuICB9XG4gIC8qKiBhZGRzIGEgQnl0ZSBvcmRlciBtYXJrIHRvIHNldHVwIHRoZSBjc3YgYXMgVVRGLTggICovXG4gIEBJbnB1dCgpIHVGRUZGID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCkgaHJlZj86IFNhZmVSZXNvdXJjZVVybDtcbiAgLyoqIGZpbGVuYW1lICovXG4gIEBIb3N0QmluZGluZygpIGRvd25sb2FkID0gJ2RhdGEuY3N2JztcbiAgQElucHV0KCkgQEhvc3RCaW5kaW5nKCkgdGFyZ2V0ID0gJ19ibGFuayc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLmhyZWYgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXG4gICAgICBidWlsZFVSSSh0aGlzLmRhdGEsIHRoaXMudUZFRkYsIHRoaXMuaGVhZGVycywgdGhpcy5kZWxpbWl0ZXIpLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CsvDirective } from './csv.directive';
3
+ import * as i0 from "@angular/core";
4
+ export class CsvModule {
5
+ }
6
+ CsvModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
7
+ CsvModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.2", ngImport: i0, type: CsvModule, declarations: [CsvDirective], exports: [CsvDirective] });
8
+ CsvModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvModule });
9
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvModule, decorators: [{
10
+ type: NgModule,
11
+ args: [{
12
+ declarations: [CsvDirective],
13
+ exports: [CsvDirective],
14
+ }]
15
+ }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY3N2Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFNL0MsTUFBTSxPQUFPLFNBQVM7O3NHQUFULFNBQVM7dUdBQVQsU0FBUyxpQkFITCxZQUFZLGFBQ2pCLFlBQVk7dUdBRVgsU0FBUzsyRkFBVCxTQUFTO2tCQUpyQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDNUIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENzdkRpcmVjdGl2ZSB9IGZyb20gJy4vY3N2LmRpcmVjdGl2ZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW0NzdkRpcmVjdGl2ZV0sXG4gIGV4cG9ydHM6IFtDc3ZEaXJlY3RpdmVdLFxufSlcbmV4cG9ydCBjbGFzcyBDc3ZNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public_api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RybC1uZ3gtY3N2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jdHJsLW5neC1jc3YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export { CsvModule } from './csv.module';
2
+ export { CsvDirective } from './csv.directive';
3
+ export * from './util';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcHVibGljX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxjQUFjLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENzdk1vZHVsZSB9IGZyb20gJy4vY3N2Lm1vZHVsZSc7XG5leHBvcnQgeyBDc3ZEaXJlY3RpdmUgfSBmcm9tICcuL2Nzdi5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbiJdfQ==
@@ -0,0 +1,53 @@
1
+ export const isJsons = (array) => Array.isArray(array) &&
2
+ array.every(row => typeof row === 'object' && !(row instanceof Array));
3
+ export const isArrays = (array) => Array.isArray(array) && array.every(row => Array.isArray(row));
4
+ export function jsonsHeaders(array) {
5
+ return Array.from(new Set(array.map(item => Object.keys(item)).reduce((a, b) => [...a, ...b], [])));
6
+ }
7
+ export function jsons2arrays(jsons, headers) {
8
+ headers = headers || jsonsHeaders(jsons);
9
+ // allow headers to have custom labels, defaulting to having the header data key be the label
10
+ let headerLabels = headers;
11
+ let headerKeys = headers;
12
+ if (isJsons(headers)) {
13
+ headerLabels = headers.map(header => header.label);
14
+ headerKeys = headers.map(header => header.key);
15
+ }
16
+ const data = jsons.map(object => headerKeys.map(header => (header in object ? object[header] : '')));
17
+ return [headerLabels, ...data];
18
+ }
19
+ export const elementOrEmpty = (element) => element || element === 0 ? element : '';
20
+ export function joiner(data, delimiter = ',') {
21
+ return data
22
+ .map((row, index) => row.map((element) => '"' + elementOrEmpty(element) + '"').join(delimiter))
23
+ .join(`\n`);
24
+ }
25
+ export function arrays2csv(data, headers, delimiter) {
26
+ return joiner(headers ? [headers, ...data] : data, delimiter);
27
+ }
28
+ export function jsons2csv(data, headers, delimiter) {
29
+ return joiner(jsons2arrays(data, headers), delimiter);
30
+ }
31
+ export function string2csv(data, headers, delimiter) {
32
+ return headers ? `${headers.join(delimiter)}\n${data}` : data;
33
+ }
34
+ export function toCSV(data, headers, delimiter) {
35
+ if (isJsons(data)) {
36
+ return jsons2csv(data, headers, delimiter);
37
+ }
38
+ if (isArrays(data)) {
39
+ return arrays2csv(data, headers, delimiter);
40
+ }
41
+ if (typeof data === 'string') {
42
+ return string2csv(data, headers, delimiter);
43
+ }
44
+ throw new TypeError(`Data should be a "String", "Array of arrays" OR "Array of objects" `);
45
+ }
46
+ export function blob(data, uFEFF = true, headers, delimiter) {
47
+ const csv = toCSV(data, headers, delimiter);
48
+ return new Blob([uFEFF ? '\uFEFF' : '', csv], { type: 'text/csv' });
49
+ }
50
+ export function buildURI(data, uFEFF = true, headers, delimiter) {
51
+ return URL.createObjectURL(blob(data, uFEFF, headers, delimiter));
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUN0QyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFlO0lBQzFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FDZixJQUFJLEdBQUcsQ0FDTCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDeEUsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLEtBQWtDLEVBQ2xDLE9BQWdDO0lBRWhDLE9BQU8sR0FBRyxPQUFPLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXpDLDZGQUE2RjtJQUM3RixJQUFJLFlBQVksR0FBYSxPQUFtQixDQUFDO0lBQ2pELElB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LENBQ2xCLElBQStELEVBQy9ELEtBQUssR0FBRyxJQUFJLEVBQ1osT0FBZ0MsRUFDaEMsU0FBa0I7SUFFbEIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsSUFBK0QsRUFDL0QsS0FBSyxHQUFHLElBQUksRUFDWixPQUFnQyxFQUNoQyxTQUFrQjtJQUVsQixPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHByZWZlci1hcnJvdy9wcmVmZXItYXJyb3ctZnVuY3Rpb25zICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlck9iaiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgaXNKc29ucyA9IChhcnJheTogYW55W10pID0+XG4gIEFycmF5LmlzQXJyYXkoYXJyYXkpICYmXG4gIGFycmF5LmV2ZXJ5KHJvdyA9PiB0eXBlb2Ygcm93ID09PSAnb2JqZWN0JyAmJiAhKHJvdyBpbnN0YW5jZW9mIEFycmF5KSk7XG5cbmV4cG9ydCBjb25zdCBpc0FycmF5cyA9IChhcnJheTogYW55W10pID0+XG4gIEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5LmV2ZXJ5KHJvdyA9PiBBcnJheS5pc0FycmF5KHJvdykpO1xuXG5leHBvcnQgZnVuY3Rpb24ganNvbnNIZWFkZXJzKGFycmF5OiBvYmplY3RbXSkge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFxuICAgICAgYXJyYXkubWFwKGl0ZW0gPT4gT2JqZWN0LmtleXMoaXRlbSkpLnJlZHVjZSgoYSwgYikgPT4gWy4uLmEsIC4uLmJdLCBbXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpzb25zMmFycmF5cyhcbiAganNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4pIHtcbiAgaGVhZGVycyA9IGhlYWRlcnMgfHwganNvbnNIZWFkZXJzKGpzb25zKTtcblxuICAvLyBhbGxvdyBoZWFkZXJzIHRvIGhhdmUgY3VzdG9tIGxhYmVscywgZGVmYXVsdGluZyB0byBoYXZpbmcgdGhlIGhlYWRlciBkYXRhIGtleSBiZSB0aGUgbGFiZWxcbiAgbGV0IGhlYWRlckxhYmVsczogc3RyaW5nW10gPSBoZWFkZXJzIGFzIHN0cmluZ1tdO1xuICBsZXQgaGVhZGVyS2V5czogc3RyaW5nW10gPSBoZWFkZXJzIGFzIHN0cmluZ1tdO1xuICBpZiAoaXNKc29ucyhoZWFkZXJzKSkge1xuICAgIGhlYWRlckxhYmVscyA9IChoZWFkZXJzIGFzIEhlYWRlck9ialtdKS5tYXAoaGVhZGVyID0+IGhlYWRlci5sYWJlbCk7XG4gICAgaGVhZGVyS2V5cyA9IChoZWFkZXJzIGFzIEhlYWRlck9ialtdKS5tYXAoaGVhZGVyID0+IGhlYWRlci5rZXkpO1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IGpzb25zLm1hcChvYmplY3QgPT5cbiAgICBoZWFkZXJLZXlzLm1hcChoZWFkZXIgPT4gKGhlYWRlciBpbiBvYmplY3QgPyBvYmplY3RbaGVhZGVyXSA6ICcnKSksXG4gICk7XG4gIHJldHVybiBbaGVhZGVyTGFiZWxzLCAuLi5kYXRhXTtcbn1cblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRPckVtcHR5ID0gKGVsZW1lbnQ6IGFueSkgPT5cbiAgZWxlbWVudCB8fCBlbGVtZW50ID09PSAwID8gZWxlbWVudCA6ICcnO1xuXG5leHBvcnQgZnVuY3Rpb24gam9pbmVyKGRhdGE6IGFueSwgZGVsaW1pdGVyID0gJywnKSB7XG4gIHJldHVybiBkYXRhXG4gICAgLm1hcCgocm93OiBhbnksIGluZGV4OiBudW1iZXIpID0+XG4gICAgICByb3cubWFwKChlbGVtZW50OiBhbnkpID0+ICdcIicgKyBlbGVtZW50T3JFbXB0eShlbGVtZW50KSArICdcIicpLmpvaW4oZGVsaW1pdGVyKSxcbiAgICApXG4gICAgLmpvaW4oYFxcbmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlzMmNzdihcbiAgZGF0YTogc3RyaW5nW11bXSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICByZXR1cm4gam9pbmVyKGhlYWRlcnMgPyBbaGVhZGVycywgLi4uZGF0YV0gOiBkYXRhLCBkZWxpbWl0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvbnMyY3N2KFxuICBkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10sXG4gIGhlYWRlcnM/OiBzdHJpbmdbXSB8IEhlYWRlck9ialtdLFxuICBkZWxpbWl0ZXI/OiBzdHJpbmcsXG4pIHtcbiAgcmV0dXJuIGpvaW5lcihqc29uczJhcnJheXMoZGF0YSwgaGVhZGVycyksIGRlbGltaXRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcyY3N2KFxuICBkYXRhOiBzdHJpbmcsXG4gIGhlYWRlcnM/OiBzdHJpbmdbXSxcbiAgZGVsaW1pdGVyPzogc3RyaW5nLFxuKSB7XG4gIHJldHVybiBoZWFkZXJzID8gYCR7aGVhZGVycy5qb2luKGRlbGltaXRlcil9XFxuJHtkYXRhfWAgOiBkYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9DU1YoXG4gIGRhdGE6IHN0cmluZyB8IHN0cmluZ1tdW10gfCB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10gfCBhbnlbXSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICBpZiAoaXNKc29ucyhkYXRhIGFzIGFueSkpIHtcbiAgICByZXR1cm4ganNvbnMyY3N2KGRhdGEgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdLCBoZWFkZXJzLCBkZWxpbWl0ZXIpO1xuICB9XG4gIGlmIChpc0FycmF5cyhkYXRhIGFzIGFueSkpIHtcbiAgICByZXR1cm4gYXJyYXlzMmNzdihkYXRhIGFzIHN0cmluZ1tdW10sIGhlYWRlcnMsIGRlbGltaXRlcik7XG4gIH1cbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHJpbmcyY3N2KGRhdGEsIGhlYWRlcnMgYXMgc3RyaW5nW10sIGRlbGltaXRlcik7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBgRGF0YSBzaG91bGQgYmUgYSBcIlN0cmluZ1wiLCBcIkFycmF5IG9mIGFycmF5c1wiIE9SIFwiQXJyYXkgb2Ygb2JqZWN0c1wiIGAsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBibG9iKFxuICBkYXRhOiBzdHJpbmcgfCBzdHJpbmdbXVtdIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdIHwgYW55W10sXG4gIHVGRUZGID0gdHJ1ZSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICBjb25zdCBjc3YgPSB0b0NTVihkYXRhLCBoZWFkZXJzLCBkZWxpbWl0ZXIpO1xuICByZXR1cm4gbmV3IEJsb2IoW3VGRUZGID8gJ1xcdUZFRkYnIDogJycsIGNzdl0sIHsgdHlwZTogJ3RleHQvY3N2JyB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVVJJKFxuICBkYXRhOiBzdHJpbmcgfCBzdHJpbmdbXVtdIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdIHwgYW55W10sXG4gIHVGRUZGID0gdHJ1ZSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKGRhdGEsIHVGRUZGLCBoZWFkZXJzLCBkZWxpbWl0ZXIpKTtcbn1cbiJdfQ==
@@ -1,6 +1,6 @@
1
- import { __decorate } from 'tslib';
2
- import { Input, HostBinding, HostListener, Directive, NgModule } from '@angular/core';
3
- import { DomSanitizer } from '@angular/platform-browser';
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, Input, HostBinding, NgModule } from '@angular/core';
3
+ import * as i1 from '@angular/platform-browser';
4
4
 
5
5
  const isJsons = (array) => Array.isArray(array) &&
6
6
  array.every(row => typeof row === 'object' && !(row instanceof Array));
@@ -55,7 +55,7 @@ function buildURI(data, uFEFF = true, headers, delimiter) {
55
55
  return URL.createObjectURL(blob(data, uFEFF, headers, delimiter));
56
56
  }
57
57
 
58
- let CsvDirective = class CsvDirective {
58
+ class CsvDirective {
59
59
  constructor(sanitizer) {
60
60
  this.sanitizer = sanitizer;
61
61
  /** the body of the csv */
@@ -66,72 +66,57 @@ let CsvDirective = class CsvDirective {
66
66
  this.uFEFF = true;
67
67
  /** filename */
68
68
  this.download = 'data.csv';
69
- this.target = this.isIEBrowser() ? '' : '_blank';
69
+ this.target = '_blank';
70
70
  }
71
71
  /** Set the filename of the csv. Default is `data.csv` */
72
72
  set filename(a) {
73
73
  this.download = a;
74
74
  }
75
- onClick() {
76
- // IE handling
77
- if (this.isIEBrowser()) {
78
- const file = blob(this.data, this.uFEFF, this.headers, this.delimiter);
79
- window.navigator.msSaveBlob(file, this.download);
80
- }
81
- }
82
- isIEBrowser() {
83
- return !!window.navigator.msSaveOrOpenBlob;
84
- }
85
75
  ngOnChanges() {
86
76
  this.href = this.sanitizer.bypassSecurityTrustResourceUrl(buildURI(this.data, this.uFEFF, this.headers, this.delimiter));
87
77
  }
88
- };
89
- CsvDirective.ctorParameters = () => [
90
- { type: DomSanitizer }
91
- ];
92
- __decorate([
93
- Input()
94
- ], CsvDirective.prototype, "data", void 0);
95
- __decorate([
96
- Input()
97
- ], CsvDirective.prototype, "headers", void 0);
98
- __decorate([
99
- Input()
100
- ], CsvDirective.prototype, "delimiter", void 0);
101
- __decorate([
102
- Input()
103
- ], CsvDirective.prototype, "filename", null);
104
- __decorate([
105
- Input()
106
- ], CsvDirective.prototype, "uFEFF", void 0);
107
- __decorate([
108
- HostBinding()
109
- ], CsvDirective.prototype, "href", void 0);
110
- __decorate([
111
- HostBinding()
112
- ], CsvDirective.prototype, "download", void 0);
113
- __decorate([
114
- Input(), HostBinding()
115
- ], CsvDirective.prototype, "target", void 0);
116
- __decorate([
117
- HostListener('click')
118
- ], CsvDirective.prototype, "onClick", null);
119
- CsvDirective = __decorate([
120
- Directive({ selector: '[csvLink]' })
121
- ], CsvDirective);
78
+ }
79
+ CsvDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvDirective, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Directive });
80
+ CsvDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.2", type: CsvDirective, selector: "[csvLink]", inputs: { data: "data", headers: "headers", delimiter: "delimiter", filename: "filename", uFEFF: "uFEFF", target: "target" }, host: { properties: { "href": "this.href", "download": "this.download", "target": "this.target" } }, usesOnChanges: true, ngImport: i0 });
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvDirective, decorators: [{
82
+ type: Directive,
83
+ args: [{ selector: '[csvLink]' }]
84
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { data: [{
85
+ type: Input
86
+ }], headers: [{
87
+ type: Input
88
+ }], delimiter: [{
89
+ type: Input
90
+ }], filename: [{
91
+ type: Input
92
+ }], uFEFF: [{
93
+ type: Input
94
+ }], href: [{
95
+ type: HostBinding
96
+ }], download: [{
97
+ type: HostBinding
98
+ }], target: [{
99
+ type: Input
100
+ }, {
101
+ type: HostBinding
102
+ }] } });
122
103
 
123
- let CsvModule = class CsvModule {
124
- };
125
- CsvModule = __decorate([
126
- NgModule({
127
- declarations: [CsvDirective],
128
- exports: [CsvDirective],
129
- })
130
- ], CsvModule);
104
+ class CsvModule {
105
+ }
106
+ CsvModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
107
+ CsvModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.2", ngImport: i0, type: CsvModule, declarations: [CsvDirective], exports: [CsvDirective] });
108
+ CsvModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvModule });
109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvModule, decorators: [{
110
+ type: NgModule,
111
+ args: [{
112
+ declarations: [CsvDirective],
113
+ exports: [CsvDirective],
114
+ }]
115
+ }] });
131
116
 
132
117
  /**
133
118
  * Generated bundle index. Do not edit.
134
119
  */
135
120
 
136
121
  export { CsvDirective, CsvModule, arrays2csv, blob, buildURI, elementOrEmpty, isArrays, isJsons, joiner, jsons2arrays, jsons2csv, jsonsHeaders, string2csv, toCSV };
137
- //# sourceMappingURL=ctrl-ngx-csv.js.map
122
+ //# sourceMappingURL=ctrl-ngx-csv.mjs.map
@@ -0,0 +1 @@
1
+ {"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":"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"}
@@ -0,0 +1,122 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, Input, HostBinding, NgModule } from '@angular/core';
3
+ import * as i1 from '@angular/platform-browser';
4
+
5
+ const isJsons = (array) => Array.isArray(array) &&
6
+ array.every(row => typeof row === 'object' && !(row instanceof Array));
7
+ const isArrays = (array) => Array.isArray(array) && array.every(row => Array.isArray(row));
8
+ function jsonsHeaders(array) {
9
+ return Array.from(new Set(array.map(item => Object.keys(item)).reduce((a, b) => [...a, ...b], [])));
10
+ }
11
+ function jsons2arrays(jsons, headers) {
12
+ headers = headers || jsonsHeaders(jsons);
13
+ // allow headers to have custom labels, defaulting to having the header data key be the label
14
+ let headerLabels = headers;
15
+ let headerKeys = headers;
16
+ if (isJsons(headers)) {
17
+ headerLabels = headers.map(header => header.label);
18
+ headerKeys = headers.map(header => header.key);
19
+ }
20
+ const data = jsons.map(object => headerKeys.map(header => (header in object ? object[header] : '')));
21
+ return [headerLabels, ...data];
22
+ }
23
+ const elementOrEmpty = (element) => element || element === 0 ? element : '';
24
+ function joiner(data, delimiter = ',') {
25
+ return data
26
+ .map((row, index) => row.map((element) => '"' + elementOrEmpty(element) + '"').join(delimiter))
27
+ .join(`\n`);
28
+ }
29
+ function arrays2csv(data, headers, delimiter) {
30
+ return joiner(headers ? [headers, ...data] : data, delimiter);
31
+ }
32
+ function jsons2csv(data, headers, delimiter) {
33
+ return joiner(jsons2arrays(data, headers), delimiter);
34
+ }
35
+ function string2csv(data, headers, delimiter) {
36
+ return headers ? `${headers.join(delimiter)}\n${data}` : data;
37
+ }
38
+ function toCSV(data, headers, delimiter) {
39
+ if (isJsons(data)) {
40
+ return jsons2csv(data, headers, delimiter);
41
+ }
42
+ if (isArrays(data)) {
43
+ return arrays2csv(data, headers, delimiter);
44
+ }
45
+ if (typeof data === 'string') {
46
+ return string2csv(data, headers, delimiter);
47
+ }
48
+ throw new TypeError(`Data should be a "String", "Array of arrays" OR "Array of objects" `);
49
+ }
50
+ function blob(data, uFEFF = true, headers, delimiter) {
51
+ const csv = toCSV(data, headers, delimiter);
52
+ return new Blob([uFEFF ? '\uFEFF' : '', csv], { type: 'text/csv' });
53
+ }
54
+ function buildURI(data, uFEFF = true, headers, delimiter) {
55
+ return URL.createObjectURL(blob(data, uFEFF, headers, delimiter));
56
+ }
57
+
58
+ class CsvDirective {
59
+ constructor(sanitizer) {
60
+ this.sanitizer = sanitizer;
61
+ /** the body of the csv */
62
+ this.data = [];
63
+ /** Set the seperator between values */
64
+ this.delimiter = ',';
65
+ /** adds a Byte order mark to setup the csv as UTF-8 */
66
+ this.uFEFF = true;
67
+ /** filename */
68
+ this.download = 'data.csv';
69
+ this.target = '_blank';
70
+ }
71
+ /** Set the filename of the csv. Default is `data.csv` */
72
+ set filename(a) {
73
+ this.download = a;
74
+ }
75
+ ngOnChanges() {
76
+ this.href = this.sanitizer.bypassSecurityTrustResourceUrl(buildURI(this.data, this.uFEFF, this.headers, this.delimiter));
77
+ }
78
+ }
79
+ CsvDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvDirective, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Directive });
80
+ CsvDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.2", type: CsvDirective, selector: "[csvLink]", inputs: { data: "data", headers: "headers", delimiter: "delimiter", filename: "filename", uFEFF: "uFEFF", target: "target" }, host: { properties: { "href": "this.href", "download": "this.download", "target": "this.target" } }, usesOnChanges: true, ngImport: i0 });
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvDirective, decorators: [{
82
+ type: Directive,
83
+ args: [{ selector: '[csvLink]' }]
84
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { data: [{
85
+ type: Input
86
+ }], headers: [{
87
+ type: Input
88
+ }], delimiter: [{
89
+ type: Input
90
+ }], filename: [{
91
+ type: Input
92
+ }], uFEFF: [{
93
+ type: Input
94
+ }], href: [{
95
+ type: HostBinding
96
+ }], download: [{
97
+ type: HostBinding
98
+ }], target: [{
99
+ type: Input
100
+ }, {
101
+ type: HostBinding
102
+ }] } });
103
+
104
+ class CsvModule {
105
+ }
106
+ CsvModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
107
+ CsvModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.2", ngImport: i0, type: CsvModule, declarations: [CsvDirective], exports: [CsvDirective] });
108
+ CsvModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvModule });
109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: CsvModule, decorators: [{
110
+ type: NgModule,
111
+ args: [{
112
+ declarations: [CsvDirective],
113
+ exports: [CsvDirective],
114
+ }]
115
+ }] });
116
+
117
+ /**
118
+ * Generated bundle index. Do not edit.
119
+ */
120
+
121
+ export { CsvDirective, CsvModule, arrays2csv, blob, buildURI, elementOrEmpty, isArrays, isJsons, joiner, jsons2arrays, jsons2csv, jsonsHeaders, string2csv, toCSV };
122
+ //# sourceMappingURL=ctrl-ngx-csv.mjs.map
@@ -0,0 +1 @@
1
+ {"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":"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"}
@@ -1,4 +1,5 @@
1
1
  /**
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
+ /// <amd-module name="@ctrl/ngx-csv" />
4
5
  export * from './public_api';
package/package.json CHANGED
@@ -1,34 +1,43 @@
1
1
  {
2
- "$schema": "../../node_modules/ng-packagr/package.schema.json",
3
2
  "name": "@ctrl/ngx-csv",
4
3
  "description": "Easily generate a CSV download in the browser with Angular",
5
4
  "publishConfig": {
6
5
  "access": "public"
7
6
  },
8
- "version": "3.0.1",
7
+ "version": "6.0.0",
9
8
  "peerDependencies": {
10
- "@angular/core": ">=8.0.0",
11
- "@angular/platform-browser": ">=8.0.0",
12
- "tslib": "^1.10.0"
9
+ "@angular/core": ">=14.0.0-0"
13
10
  },
14
- "repository": "typectrl/ngx-csv",
15
- "homepage": "https://github.com/typectrl/ngx-csv",
11
+ "repository": "scttcper/ngx-csv",
12
+ "homepage": "https://ngx-csv.vercel.app",
16
13
  "license": "MIT",
17
- "bugs": "https://github.com/typectrl/ngx-csv/issues",
18
14
  "keywords": [
19
15
  "ngx",
20
16
  "angular",
21
17
  "angular-component",
22
18
  "csv"
23
19
  ],
24
- "main": "bundles/ctrl-ngx-csv.umd.js",
25
- "module": "fesm5/ctrl-ngx-csv.js",
26
- "es2015": "fesm2015/ctrl-ngx-csv.js",
27
- "esm5": "esm5/ctrl-ngx-csv.js",
28
- "esm2015": "esm2015/ctrl-ngx-csv.js",
29
- "fesm5": "fesm5/ctrl-ngx-csv.js",
30
- "fesm2015": "fesm2015/ctrl-ngx-csv.js",
31
- "typings": "ctrl-ngx-csv.d.ts",
32
- "metadata": "ctrl-ngx-csv.metadata.json",
33
- "sideEffects": false
20
+ "module": "fesm2015/ctrl-ngx-csv.mjs",
21
+ "es2020": "fesm2020/ctrl-ngx-csv.mjs",
22
+ "esm2020": "esm2020/ctrl-ngx-csv.mjs",
23
+ "fesm2020": "fesm2020/ctrl-ngx-csv.mjs",
24
+ "fesm2015": "fesm2015/ctrl-ngx-csv.mjs",
25
+ "typings": "index.d.ts",
26
+ "exports": {
27
+ "./package.json": {
28
+ "default": "./package.json"
29
+ },
30
+ ".": {
31
+ "types": "./index.d.ts",
32
+ "esm2020": "./esm2020/ctrl-ngx-csv.mjs",
33
+ "es2020": "./fesm2020/ctrl-ngx-csv.mjs",
34
+ "es2015": "./fesm2015/ctrl-ngx-csv.mjs",
35
+ "node": "./fesm2015/ctrl-ngx-csv.mjs",
36
+ "default": "./fesm2020/ctrl-ngx-csv.mjs"
37
+ }
38
+ },
39
+ "sideEffects": false,
40
+ "dependencies": {
41
+ "tslib": "^2.3.0"
42
+ }
34
43
  }